Text
                    КНИГА ПРАКТИЧЕСКИХ СОВЕТОВ ДЛЯ ПОЛЬЗОВАТЕЛЕЙ
И СИСТЕМНЫХ АДМИНИСТРАТОРОВ


LINUX СБОРНИК РЕЦЕПТОВ Карла Шредер Москва • Санкт-Петербург • Нижний Новгород • Воронеж Новосибирск • Ростов-на-Дону - Екатеринбург • Самара Киев • Харьков • Минск 2006
Карла Шредер Linux. Сборник рецептов Перевел с английского Е. Матвеев Заведующий редакцией А. Кривцов Руководитель проекта Л. Пасечник Технический редактор В. Демидова Литературный редактор А. Пасечник Художник Е. Дьяченко Корректор В. Листова Верстка Л. Родионова ББК 32.973-018.2 УДК 004.451 Шредер К. Ш86 Linux. Сборник рецептов. — СПб.: Питер, 2006. — 432 с: ил. ISBN 5-469-01188-7 Предлагаемое издание содержит уникальную коллекцию советов, инструментов и сценариев; вы найдете *ряд готовых отлаженных решений сложных проблем, с которыми сталкивается любой администратор, настраивающий Linux-сервер; эти решения пригодятся и при настройке небольших сетей, и при создании мощных распределенных хранилищ данных. Книга написана в уже ставшей популярной форме рецептов издательства O'Reilly в формате «Проблема-Решение-Обсуждение». Для опытных пользователей, программистов, системных администраторов, студентов вузов, аспирантов и преподавателей. © 2005 O'Reilly Media, Inc. © Перевод на русский язык, ЗАО Издательский дом «Питер», 2006 © Издание на русском языке, оформление, ЗАО Издательский дом «Питер», 2006 Права на издание получены по соглашению с O'Reilly Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственность за возможные ошибки, связанные с использованием книги. ISBN 5-469-01188-7 ISBN 0596006403 (англ.) Лицензия ИД №05784 от 07.09.01. Подписано в печать 15.12.05. Формат 70X100/16. Усл. п. л. 34.83. Тираж 3000 экз. Заказ№6920. ООО «Питер Принт». 194044, Санкт-Петербург. Б. Самлсониевскнй пр.. 29а. Налоговая льгота — общероссийский классификатор продукции ОК 005-93. том 2; 953005 — литература учебная. Отпечатано с готовых диапозитивов в ФГУП «Печатный двор» им. А. М. Горького Федерального агентства по печати и массовым коммуникациям. 197110, Санкт-Петербург, Ч кал о век ни пр.. 15.
Краткое содержание Предисловие 16 Глава 1. Документация 19 Глава 2. Установка и модификация программ в системах на базе RPM 31 Глава 3. Установка и сопровождение программного обеспечения в системах на базе Debian 49 Глава 4. Установка программ по исходным текстам 66 Глава 5. Идентификация оборудования 72 Глава б. Редактирование текстовых файлов в JOE и Vim 79 Глава 7. Запуск и завершение работы Linux 97 Глава 8. Управление пользователями и группами 110 Глава 9. Операции с файлами и разделами 137 Глава 10. Заплатки, настройка и обновление ядра 162 Глава 11. Запись CD и DVD 176 Глава 12. Системный загрузчик и альтернативная загрузка 193 Глава 13. Восстановление работоспособности на примере Knoppix 219 Глава 14. CUPS 230 Глава 15. Настройка видео и X Window 241 Глава 16. Архивация и восстановление 253 Глава 17. Удаленный доступ 274 Глава 18. Управление версиями 288 Глава 19. NTP 309 Глава 20. Почтовый сервер Postfix 320 Глава 21. Борьба со спамом и вредоносными программами 343
6 Краткое содержание Глава 22. Веб-сервер Apache 356 Глава 23. Samba 379 Глава 24. Разрешение имен 409 Приложение А. Поиск документации Linux , 426 Приложение Б. Информация обустройствах 428 Алфавитный указатель 429
Содержание Предисловие.. 16 Для кого написана эта книга 16 О чем рассказано в книге 17 Платформы 17 Благодарности 18 От издательства 18 Глава 1. Документация 19 1.1. Введение 19 1.2. Общие сведения о man-страницах 20 1.3. Поиск нужной man-страницы 22 1.4. Поиск потерянных man-страниц 23 1.5. Чтение man-страниц без программы просмотра 24 1.6. Настройка путей поиска man-страниц 24 1.7. Использование info-страниц 25 1.8. Печать man-страниц 26 1.9. Печать Info-страниц 27 1.10. Печать отдельных man- или Info-страниц 28 1.11. Поиск всей документации к программе 28 Глава 2. Установка и модификация программ в системах на базе RPM 31 2.1. Введение 31 2.2. Установка пакетов 32 2.3. Обновление пакетов 33 2.4. Удаление пакетов 34 2.5. Получение информации об установленных пакетах 35 2.6. Получение информации о пакетах, не установленных в системе 37 2.7. Поиск недавно установленных пакетов 37 2.8. Перестройка базы данных RPM 38 2.9. Отслеживание библиотек, построенных по исходным текстам, в системах на базе RPM 39 2.10. Решение проблем установки RPM 41 2.11. Сборка пакетов по исходным текстам 42
Содержание 2.12. Настройка параметров сборки SRPM 43 2.13. Установка Yum 44 2.14. Настройка Yum 45 2.15. Установка и обновление пакетов в Yum 46 2.16. Удаление пакетов в Yum 47 2.17. Получение информации об установленных пакетах в Yum 47 2.18. Сопровождение Yum 48 Глава 3. Установка и сопровождение программного обеспечения в системах на базе Debian 49 3.1. Введение 49 3.2. Поиск программ для Debian 50 3.3. Установка пакетов Debian с диска CD-ROM 51 3.4. Установка пакетов в системе на базе Debian 52 3.5. Удаление пакетов из системы Debian 53 3.6. Установка программ в Debian по исходным текстам 54 3.7. Обновление пакетов в Debian 55 3.8. Обновление системы Debian 55 3.9. Установка обновленной версии Debian 56 3.10. Создание смешанной системы Debian 57 3.11. Поиск программ, установленных в системе Debian 58 3.12. Операции с кэшем пакетов Debian 60 3.13. Разрешение конфликтов зависимостей в Debian 61 3.14. Создание локального архива Debian 62 3.15. Выбор пакетных зеркал для apt-proxy.conf 63 3.16. Включение существующего кэша пакетов в apt-proxy.conf 64 Глава 4. Установка программ по исходным текстам 66 4.1. Введение 66 4.2. Подготовка системы к компиляции программ по исходным текстам 66 4.3. Построение списка добавленных файлов для упрощения удаления программ 67 4.4. Установка программ по исходным текстам 68 4.5. Создание пакетов по исходным текстам с применением Checklnstall 70 Глава 5. Идентификация оборудования 72 5.1. Введение 72 5.2. Идентификация оборудования при помощи Ispci 73 5.3. Сбор информации об оборудовании программой dmesg 74 5.4. Получение текущей сводки оборудования с использованием /ргос 76 5.5. Просмотр разделов в программе fdisk 78 Глава 6. Редактирование текстовых файлов в JOE и Vim 79 6.1. Введение 79 6.2. Поиск команд JOE 81 6.3. Настройка JOE 82 6.4. Сохранение личной конфигурации JOE в отдельном файле 83 6.5. Копирование текста между файлами в JOE 83 6.6. Поиск и замена в JOE 84 6.7. Вертикальное выделение текста в JOE 85 6.8. Поиск и открытие файлов в JOE 86 6.9. Быстрое изучение Vim 87
6.10. Создание автотекста в Vim 88 6.11. Привязка команд к клавишам 89 6.12. Настройка Vim 90 6.13. Быстрое перемещение в Vim 91 6.14. Сеансы Vim 92 6.15. Назначение редактора по умолчанию 94 6.16. Определение параметров компиляции Vim 95 Глава 7. Запуск и завершение работы Linux 97 7.1. Введение 97 7.2. Смена уровня выполнения после загрузки 99 7.3. Смена уровня выполнения по умолчанию 100 7.4. Запуск и остановка X 101 7.5. Управление уровнями выполнения BDebian 102 7.6. Создание уровней выполнения с текстовым и графическим входом в Debian 102 7.7. Управление уровнями выполнения в Red Hat 104 7.8. Ручная настройка служб, запускаемых при загрузке 105 7.9. Ручная остановка и запуск служб 106 7.10. Выключение компьютера или перезагрузка Linux 107 7.11. Запретили ограничение доступа к Ctrl+Alt+ Delete 108 7.12. Автоматическое выключение компьютера 109 Глава 8. Управление пользователями и группами 110 8.1. Введение 110 8.2. Отделение обычных пользователей от системных 111 8.3. Определение кодов UID и GID 112 8.4. Создание учетной записи пользователя командой useradd 113 8.5. Создание учетной записи пользователя командой adduser 114 8.6. Изменение учетной записи пользователя 115 8.7. Удаление пользователя 117 8.8. Простое завершение процессов 118 8.9. Блокировка учетных записей 118 8.10. Управление паролями 119 8.11. Создание групп командой groupadd 120 8.12. Удаление групп командой groupdel 121 8.13. Создание системного пользователя 121 8.14. Создание системных групп командой addgroup 122 8.15. Изменение принадлежности к группам 123 8.16. Проверка целостности файлов паролей 123 8.17. Серийное добавление новых пользователей 124 8.18. Серийная замена паролей 129 8.19. Серийное включение пользователей в группы 130 8.20. Временное использование привилегий root 131 8.21. Временное предоставление привилегий root командой sudo 132 8.22. Дисковые квоты 134 Глава 9. Операции с файлами и разделами 137 9.1. Введение 137 9.2. Настройка разрешений в числовом формате chmod 142 9.3. Выполнение массовых операций командой chmod 143
10 Содержание 9.4. Настройка разрешений в символьном формате chmod 144 9.5. Назначение владельца файла командой chown 146 9.6. Выполнение массовых операций командой chown 146 9.7. Создание общих каталогов с использованием setgld и бита закрепления ... 147 9.8. Назначение разрешений по умолчанию с использованием маски umask . 149 9.9. Монтирование и демонтирование съемных дисков 150 9.10. Настройка монтирования файловых систем в/etc/fstab 151 9.11. Монтирование и демонтирование файловых сиаем на жестких дисках 153 9.12. Определение имен устройств для mount и fetab 154 9.13. Создание файлов и каталогов 156 9.14. Удаление файлов и каталогов 157 9.15. Копирование, перемещение и переименование файлов и каталогов 158 9.16. Создание дисковых разделов Linux командой fdisk 159 9.17. Создание файловой системы в новом разделе 161 Глава 10. Заплатки, настройка и обновление ядра 162 10.1. Введение 162 10.2. Добавление новых возможностей в ядро 2.4 164 10.3. Усечение типового ядра 2.4 166 10.4. Обновление до последней стабильной версии ядра 2.4 168 10.5. Построение ядра 2.6 169 10.6. Добавление новых возможностей в ядро 2.6 170 10.7. Добавление нового загружаемого модуля ядра 170 10.8. Установка заплаток ядра 171 10.9. Удаление заплатки ядра 172 10.10. Создание образа initrd 173 10.11. Создание загрузочного диска в Debian 174 10.12. Создание загрузочного диска в Red Hat 174 Глава 11. Запись CD и DVD 176 11.1. Введение 176 11.2. Определение адресов SCSI для записывающих дисководов CD и DVD... 179 11.3. Включение эмуляции SCSI для устройства записи CD и DVD с интерфейсом IDE/ATAPI 180 11.4. Создание компакт-диска с данными для распространения 181 11.5. Формирование файловых деревьев на компакт-дисках с данными 183 11.6. Копирование диска CD или DVD 184 11.7. Стирание диска CD-RW 185 11.8. Запись многосеансового компакт-диска сданными 186 11.9. Создание загрузочного компакт-диска 187 11.10. Разбиение больших файлов на несколько дисков 188 11.11. Запись дисков DVD с данными 189 11.12. Запись аудиодиска для стандартных проигрывателей 191 Глава 12. Системный загрузчик и альтернативная загрузка 193 12.1. Введение 193 12.2. Переход с LILO на GRUB 194 12.3. Установка GRUB без дискеты 196 12.4. Установка GRUB сценарием grub-install 197 12.5. Подготовка системы для альтернативной загрузки Linux 198 12.6. Установка дополнительных экземпляров Linux в системе с альтернативной загрузкой 199
12.7. Определение параметров зафузки в командной консоли GRUB 201 12.8. Настройка загрузочного раздела 203 12.9. Создание меню загрузки в GRUB 204 12.10. Настройка menu.lst 205 12.11. Добавление Windows 95/98/ME в систему Linux 206 12.12. Добавление Windows NT/2000/XP в систему с альтернативной зафузкои... 208 12.13. Восстановление GRUB в MBR с использованием диска Knoppix 209 12.14. Защита системных файлов паролем GRUB 210 12.15. Защита отдельных пунктов меню GRUB 211 12.16. Создание заставки GRUB 212 12.17. Загрузка Linux с использованием LILO 213 12.18. Альтернативная зафузка Linux с использованием LILO 214 12.19. Альтернативная зафузка Windows и Linux с использованием LILO 215 12.20. Создание загрузочной дискеты LILO 216 12.21. Защита LILO паролем 216 12.22. Создание резервной копии MBR 217 Глава 13. Восстановление работоспособности системы на примере Knoppix 219 13.1. Введение 219 13.2. Загрузка Knoppix 219 13.3. Создание загрузочной дискеты Knoppix 221 13.4. Сохранение конфигурации Knoppix на флэш-диске 221 13.5. Создание зашифрованного домашнего каталога Knoppix 222 13.6. Копирование файлов на другой PC с системой Linux 223 13.7. Копирование файлов в общий каталог Samba 224 13.8. Копирование файлов на диск CD-R/RW 225 13.9. Редактирование конфигурационных файлов в Knoppix 226 13.10. Установка программ из Knoppix 227 13.11. Восстановление потерянного пароля root 227 13.12. Установка Knoppix на жесткий диск 228 13.13. Запуск антивирусных программ на Windows PC 228 Глава 14. CUPS 230 14.1. Введение 230 14.2. Подключение принтера к автономному компьютеру с системой Linux.... 232 14.3. Обслуживание клиентов Linux 234 14.4. Совместный доступ к принтеру без разрешения имен 235 14.5. Обслуживание клиентов Windows без Samba 236 14.6. Совместный доступ к принтерам в смешанной сети с использованием Samba 237 14.7. Создание выделенного сервера печати CUPS 237 14.8. Распределенная печать с использованием классов 238 14.9. Ограничение доступа к принтерам и классам 239 14.10. Диагностика 240 Глава 15. Настройка видео и X Window 241 15.1. Введение 241 15.2. Одновременное использование X и консолей 243 15.3. Установка нового видеоадаптера 245 15.4. Редактирование файла XF86Config 246 15.5. Включение аппаратного ускорения BXFree86/DRI 247
12 Содержание 15.6. Диагностика проблем с ускорением трехмерной графики 248 15.7. Настройка startx 249 15.8. Смена экранного менеджера 250 15.9. Одновременный запуск разных оконных менеджеров 251 Глава 16. Архивация и восстановление 253 16.1. Введение 253 16.2. Применение rsync для локальной пересылки и синхронизации файлов . 254 16.3. Безопасная пересылка данных с применением ssh 256 16.4. Настройка сервера архивации rsync 257 16.5. Защита модулей rsync 258 16.6. Настройка анонимного общедоступного сервера rsync 260 16.7. Запуск демона rsync при загрузке системы 261 16.8. Настройка выбора файлов 262 16.9. Автоматизация архивации rsync на базе ssh 262 16.10. Ограничение загрузки канала при использовании rsync 263 16.11. Настройка путей к файлам в rsync 264 16.12. Установка rsync на клиентах Windows 264 16.13. Создание «сообщения дня» в rsync 265 16.14. Создание загрузочного компакт-диска в Mondo Rescue 266 16.15. Проверка архивов Mondo 269 16.16. Создание загрузочного диска DVD 269 16.17. Использование Mondo Rescue для клонирования систем Linux 270 16.18. Использование mindi-kemel 271 16.19. Восстановление системы с диска Mondo 272 16.20. Восстановление отдельных файлов с диска Mondo 272 Глава 17. Удаленный доступ 274 17.1. Введение 274 17.2. Настройка OpenSSH 275 17.3. Построение новых ключей хостов 277 17.4. Аутентификация с использованием открытых ключей 278 17.5. Использование нескольких пар ключей 280 17.6. Вход без пароля с использованием ssh-agent 280 17.7. Вход без пароля с использованием keychain 282 17.8. Беспарольный вход для заданий сгоп 283 17.9. Автоматическое завершение ssh-agent при выходе 283 17.10. Настройка приглашения Bash для ssh 284 17.11. Туннелирование X через SSH 284 17.12. Подключение с компьютера с системой Windows 285 17.13. Назначение разрешений для файлов ssh 287 Глава 18. Управление версиями 288 18.1. Введение 288 18.2. Построение локального репозитария RCS 289 18.3. Выборка старых версий файлов в RCS 291 18.4. Сравнение версий файла в RCS 293 18.5. Управление системными конфигурационными файлами в RCS 294
18.6. Использование CVS для создания однопользовательских локальных репозитариев 296 18.7. Включение новых файлов в репозитарий CVS 298 18.8. Удаление файлов из репозитария CVS 299 18.9. Создание общего репозитария CVS 300 18.10. Совместное использование репозитария группами пользователей 301 18.11. Обращение к удаленному репозитарию CVS 302 18.12. Обновление рабочих файлов bCVS 303 18.13. Выборка конкретных старых версий из CVS 304 18.14. Построение анонимного репозитария CVS 305 18.15. Настройка среды CVS 307 18.16. Вычисление объема репозитария CVS 308 Глава 19. NTP 309 19.1. Введение 309 19.2. Настройка локального сервера времени 310 19.3. Подключение к локальному серверу времени 311 19.4. Управление доступом 312 19.5. Выбор пула NTP 314 19.6. Подключение к серверу времени при непостоянном подключении 315 19.7. Настройка нескольких локальных серверов времени 316 19.8. Аутентификация с использованием ключей NTP 317 Глава 20. Почтовый сервер Postfix 320 20.1. Введение 320 20.2. Построение почтового сервера РОРЗ 321 20.3. Построение почтового сервера РОРЗ в Debian 324 20.4. Тестирование почтового сервера SMTP/POP3 326 20.5. Отправка интернет-почты 328 20.6. Прием интернет-почты 329 20.7. Установка Cyrus-SASL 329 20.8. Установка Cyrus-SASL в Debian 331 20.9. Настройка smtp-auth для аутентификации пользователей 332 20.10. Применение smtp-auth дпя аутентификации Postfix на другом сервере 334 20.11. Настройка полного доменного имени 335 20.12. Построение почтового сервера ШАР 336 20.13. Подключение пользователей 337 20.14. Общий доступ к папкам IMAP 338 20.15. Использование виртуальных доменов Postfix 340 20.16. Создание списка рассылки с применением couriermlm 341 Глава 21. Борьба со спамом и вредоносными программами 343 21.1. Введение 343 21.2. Первоочередные меры по защите от спама и вредоносных программ .... 344 21.3. Тестирование средств борьбы со спамом в Postfix 345 21.4. Настройка антиспамовых ограничений в Postfix 346 21.5. Создание белых списков 347 21.6. Использование черных списков DNS 348 21.7. Блокировка сообщений с вложениями 350
Содержание 21.8. Настройка Clam Anti-Virus на сервере Postfix 351 21.9. Настройка SpamAssassin в Postfix 354 Глава 22. Веб-сервер Apache 356 22.1. Введение 356 22.2. Установка Apache 2.0 по исходным текстам 358 22.3. Добавление новых модулей после установки 360 22.4. Настройка разрешений и принадлежности файлов Apache 361 22.5. Обращение к локальному руководству Apache 362 22.6. Создание простого веб-сервера 363 22.7. Перенаправление URL в новый каталог 363 22.8. Предоставление пользователям индивидуальных веб-каталогов 364 22.9. Запуск Apache при загрузке системы 365 22.10. Многодоменный хостинг в Apache 365 22.11. Ведение отдельных журналов для виртуальных хостов 367 22.12. Предотвращение доступа к веб-сайтам локальных сетей из Интернета ... 367 22.13. Парольная защита отдельных каталогов 368 22.14. Файл robots.txt 370 22.15. Блокировка нарушителей 371 22.16. Создание пользовательских страниц ошибок 372 22.17. Настройка стандартных страниц ошибок Apache 373 22.18. Вывод содержимого каталогов без усечения имен файлов 373 22.19. Использование Content Negotiation для предоставления страниц на разных языках 374 22.20. Использование эмблем 376 22.21. Просмотр журналов обращений Apache с использованием Webalizer 377 Глава 23. Samba 379 23.1. Введение 379 23.2. Построение простого автономного файлового сервера Samba для Windows 381 23.3. Построение одноранговой сети Windows/Linux 383 23.4. Включение общего доступа к файлам в Windows 384 23.5. Включение аутентификации на сервере Samba 385 23.6. Массовое преобразование системных пользователей 386 23.7. Подключение к Samba из Windows 95/98/ME 387 23.8. Шифрование паролей в Windows 387 23.9. Списки управления доступом (ACL) 388 23.10. Создание общедоступных сетевых каталогов 389 23.11. Работа с домашними каталогами пользователей в Samba 390 23.12. Построение главного контроллера домена 391 23.13. Подключение Windows 95/98/ME к домену Samba 393 23.14. Подключение клиентов Windows NT/2000 к домену Samba 394 23.15. Подключение клиентов Windows XP к домену Samba 395 23.16. Включение перемещаемых профилей 396 23.17. Подключение клиентов Linux к одноранговой сети или файловому серверу Samba 397
Содержание 15 23.18. Подключение клиентов Linux к рабочим группам Samba из командной строки 399 23.19. Подключение клиентов Linux к домену Samba из графического обозревателя 401 23.20. Подключение клиентов Linux к домену Samba из командной строки 402 23.21. Синхронизация паролей Samba и Linux 403 23.22. Общий доступ к принтерам Linux из системы Windows 403 23.23. Общий доступ к принтерам Windows из системы Linux 404 23.24. Запуск приложений Windows в Linux 405 Глава 24. Разрешение имен 409 24.1. Введение 409 24.2. Локальное разрешение имен с использованием файла hosts 411 24.3. Настройка сервера DHCP 412 24.4. Настройка клиентов dhcp 413 24.5. Включение статических хостов в dhcp 414 24.6. Создание общедоступного сервера DNS 415 24.7. Установка djbdns 417 24.8. Перемещение журналов tinydns и dnscache 418 24.9. Создание локального кэширующего сервера имен на базе djbdns 418 24.10. Настройка клиентов Linux и Windows для использования кэширующего сервера DNS 420 24.11. Создание общедоступного сервера DNS с использованием tinydns 421 24.12. Построение частного сервера DNS 423 24.13. Простое распределение нагрузки в tinydns 424 24.14. Синхронизация с другим сервером tinydns 425 Приложение А. Поиск документации Linux 426 Документация Linux в WWW 426 Веб-сайты Linux 426 Usenet 427 Google 427 Приложение Б. Информация обустройствах 428 Веб-сайты 428 Usenet 428 Алфавитный указатель 429
Предисловие Итак, вы принадлежите к относительно неопытных пользователей Linux. Вы установили Linux, вам удалось войти в систему, пошарить в Интернете, отправить и получить электронную почту.., а дальше что? Несмотря на успешное выполнение некоторых простейших задач, вы чувствуете себя словно пилот самолета, летящего на автопилоте. В вашем распоряжении масса замечательных возможностей (во всяком случае, так вам сказал ваш знакомый, большой знаток в области Linux), но как за них взяться? Что где находится и как работает? Что это за штуковина под названием grep, о которой так часто говорят? И как наладить работу Samba? И где находится #$%А документация? Мир Linux/Unix отлично документирован. Нет, я серьезно! Вы сможете найти ответ на любой вопрос; нужно только знать, где искать. Man-страницы, info-страницы, файлы README, документация в формате HTML, сами программы... Не нужно быть великим программистом, чтобы отыскать полезную информацию в исходных текстах, потому что все необходимые сведения часто содержатся в комментариях. Среди тысяч виртуальных сообществ Интернета всегда найдется одно (или несколько) для конкретной программы из Вселенной Linux. Почти у каждой программы, какой бы малой она ни была, существует собственный список рассылки. У каждого дистрибутива Linux имеются свои списки рассылки и форумы пользователей. Я уже не говорю о многочисленных книгах и журналах. Получается, что настоящая проблема с документацией Linux — не ее нехватка, а получение нужной информации без долгих и самоотверженных поисков. Для кого написана эта книга Книга предназначена для читателей, которые желают решать практические задачи. Конечно, понимать базовую теорию полезно, но если вам не удается добиться нужного результата, пользы от теории немного. По этой причине я постараюсь включать поменьше теоретических рассуждений и побольше практических советов с подробными, пошаговыми инструкциями. В книгу включены многочисленные ссылки на дополнительные источники информации. От читателя потребуется некоторый опыт работы в Linux. Быть знатоком не обязательно, но нужно по крайней мере уметь загружать систему и завершать ра-
Предисловие 17 боту с ней, запускать приложения, работать в WWW и ориентироваться в файловой системе. Читатель должен знать, как получить доступ к командной строке и использовать ее, и обладать навыками работы в графической среде. Он должен понимать, что Linux является полноценной многопользовательской системой и что в работе следует по возможности использовать непривилегированную учетную запись, переключаясь на привилегии root только в случае необходимости. Предполагается, что читатель является администратором отдельного компьютера или локальной сети и может получить привилегии root в случае необходимости. Может быть, вы стремитесь в полной мере управлять работой своего Linux- компьютера, или создать свой собственный почтовый или веб-сервер, или создать небольшую сеть. А может, вы — системный администратор Windows, которому неожиданно потребовалось подключить Windows-клиентов к серверам Linux... или включить серверы Linux в существующую сеть... или интегрировать компьютеры с Linux и Windows в одной смешанной сети. А может, вам вообще нет дела до Windows, и вы просто хотите освоить системное администрирование Linux. О чем рассказано в книге Для Linux существуют тысячи программных пакетов. Почти все они делают что- то полезное, поэтому заранее понятно, что рассмотреть все темы (или хотя бы их большинство) попросту невозможно. Решения о том, какой материал включить в книгу, а какой оставить за пределами рассмотрения, принимались в соответствии с моими представлениями о базовых навыках администрирования Linux (возможно, у вас эти представления будут другими). В книгу были включены программы, которые я считаю лучшими в своей категории: djbdns, GRUB, Apache 2, vim и Postfix, а также испытанные временем ветераны вроде LILO. В книге приводятся полезные сценарии для выполнения типовых операций: О массовое создание учетных записей; О массовое изменение паролей; О поиск всей установленной документации к программе; О поиск «бесхозных» библиотек в системах на базе RPM и их включение в базу данных RPM. В книгу не вошли настольные и вспомогательные приложения типа Open Office, К Mail, FireFox, Konqueror, Gimp, GnuCash и т. д. — книга посвящена построению инфраструктуры. Если вы освоите основные принципы администрирования и сопровождения Linux-системы, дальше можно будет двигаться куда угодно. Платформы В мире существуют тысячи дистрибутивов Linux. Свои дистрибутивы создают отдельные компании, кампусы и даже просто группы единомышленников. Тем не менее дистрибутивы делятся (пусть и не очень четко) на две большие категории: системы на базе RPM, представленные в книге Red Hat и Fedora, и системы на базе apt, представленные Debian. Семейство Debian бурно развивается и пополняется такими представителями, как Knoppix, Xandros, Libranet, Unbuntu и Linspire.
18 Предисловие Даже если ваш дистрибутив не принадлежит ни к одной из этих категорий (скажем, Slackware или Gentoo), основные принципы практически не изменяются. Ядро остается тем же; программы и утилиты остаются теми же; оконные менеджеры остаются теми же; принципиальные различия существуют только в способе установки программ. Впрочем, это не означает, что между дистрибутивами Linux нет других отличий. Одна из классических проблем — различия в местонахождении файлов в разных дистрибутивах. Привыкайте, эта проблема никуда не денется. В книге будет показано, как получить информацию о местонахождении конфигурационных, исполняемых файлов и документации для вашего конкретного дистрибутива. Благодарности Я благодарна редактору O'Reilly Майклу Лукидесу (Michael Loukides). Его хороший вкус, зоркий глаз, терпение и неумолимая настойчивость существенно улучшили эту книгу. Глупые компьютеры понимают все буквально и не прощают ошибок при вводе. Спасибо техническому рецензенту Дженн Весперман ( Jenn Vespermann) и ее вниманию к мелочам! Я бесконечно благодарна Аккане Пек (Akkana Peck), Дженн Весперманн, Полу Хайнлайну (Paul Heinlein) и Питеру Сэмюэльсону (Peter Samuelson), внесшим свой вклад в книгу. Сердечное спасибо всему сообществу Linuxchix, включая Дженн Весперманн (доброжелательный диктатор Linuxchix), Дэнсер Весперманн (Dancer Vespermann), Danamania, Колби (Colby), Evilpig, Элмут Беренс (Almut Behrens), гуру Mandrake Эндрю (Andrew), Hamster, Piglet, Вэл Хенсон (Val Hanson), Питера Энвина (Peter Anvin), Рика Роуза (Rik Rose), Девдаса Бхагата (Devdas Bhagat), Дэвида Норта (David North), Телзу Гвинн (Telsa Gwynne), Марию Блэкмор (Maria Blackmore), Мередид Лафф (Meredyd Luff), Кай Мактейн (Kai MacTane) и Эринн Кларк (Erinn Clark). Да здравствует Linuxchixl Наверняка я забыла о ком-нибудь, кто терпеливо сносил мои бесконечные приставания. Напомните о себе, и я внесу изменения во втором издании. От издательства Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! На веб-сайте издательства http://www.piter.com вы найдете подробную информацию о наших книгах.
Глава 1 Документация 1.1. Введение Документация к программам Linux существует в избытке — вопрос только в том, как ее найти. Не ищите стопки красивых, глянцевых печатных описаний: большинство Linux-программ не продается в блестящих коробках, а распространяется через Интернет. Существует и другая сложность: в соответствии с великими традициями Unix, многие задачи в Linux решаются совместной работой множества мелких специализированных программ, поэтому любой дистрибутив Linux состоит из огромного количества отдельных программ. Дистрибутивы общего назначения типа Mandrake или SuSE содержат тысячи программ, а в архивах Debian хранятся свыше 12 000 пакетов. Организация и сопровождение печатной библиотеки в таких условиях создали бы немало трудностей, но к счастью, все программы документированы. Какой бы вопрос у вас ни возник, на него всегда можно найти ответ. man и info: универсальные руководства Linux Практически у каждой программы, написанной для Linux, имеется своя man-страница. Как правило, man-страницы не предназначаются для освоения программы новичками. Они создаются для других целей: документирование синтаксиса команды, описание всех параметров и ключей, а также общедоступность. Даже если вы окажетесь на компьютере, полностью отрезанном от внешнего мира, в вашем распоряжении всегда будет информация из man-страниц. А поскольку man-страницы интегрируются с программами, которым они принадлежат, только установленные программы будут иметь man-страницы, причем версии этих страниц будут относиться именно к вашей системе. Info-страницы обычно содержат более подробную информацию. Включенные в них гиперссылки используются для перехода к различным узлам, или главам, документа, а также для создания перекрестных ссылок на другие info-страницы. Нередко info-страницы представляют собой переформатированные man-страницы. Но в некоторых случаях (прежде всего, в программах проекта GNU) info-страницы
20 Глава 1. Документация отличаются большей детализацией, в них присутствует учебный материал и подробные примеры. Другая документация В различных местах вашей системы также прячутся многочисленные файлы README, CHANGELOGS, RELEASE NOTES, COPYRIGHT, INSTALL, интегрированные справочные системы и документация в формате HTML. Да, в целом творится изрядная путаница. Не волнуйтесь, в этой главе вы научитесь быстро находить нужную информацию, а удобный сценарий Python облегчит процесс поиска. На многих веб-сайтах хранятся полные архивы man- и info-страниц. Они пригодятся вам в том случае, если нужная страница отсутствует в вашей системе или вы хотите прочитать ее без зафузки и установки новых программ. Вы быстро найдете их поиском в Google. Коммерческие дистрибутивы Linux — такие, как Red Hat, SuSE, Mandrake, Xandros и Linspire — содержат превосходные руководства пользователя. У каждого серьезного дистрибутива Linux имеется богатый выбор электронной документации. Полезную и справочную информацию также можно найти при помощи поисковых систем, в списках рассылки, конференциях Usenet и на всевозможных веб-сайтах, посвященных Linux. Графические оболочки справочных систем Существует несколько хороших графических программ для просмотра man- и info- страниц: О Konqueror — браузер и файловая оболочка KDE также содержит превосходную программу просмотра man- и info-страниц. Просто введите manrfoo или info:/foo в адресной строке. Konqueror позволяет легко напечатать нужную информацию и отобрать отдельные man- или info-страницы для печати; О Yelp — программа просмотра для Gnome; отображает man- и info-страницы, а также справочные документы Gnome. Поддерживает индексирование и поиск; О Pinfo — удобная консольная программа просмотра man- и info-страниц на базе ncurses. Поддерживает поиск по регулярным выражениям и возможность добавления новых документов. 1.2. Общие сведения о man-страницах Проблема Вы пытаетесь использовать какую-нибудь программу, но никак не можете заставить ее сделать то, что требуется. Итак, следуя стандартному совету «RTFM» (Read The Fine Man page), вы находите нужные страницы, читаете их... и ничего не можете понять.
1.2. Общие сведения о man-страницах 21 Решение Разберитесь в структуре man-страниц; изучите условные обозначения команд и их параметров, и вы поймете, что man-страницы на самом деле очень полезны. Комментарий С точки зрения Linux все man-страницы в системе являются частью единого руководства. Это руководство состоит из следующих разделов: 1 — исполняемые программы или команды оболочки; 2 — системные функции; 3 — библиотечные функции; 4 — специальные файлы (обычно находящиеся в /dev); 5 — форматы файлов и соглашения; 6 — игры; 7 — разное; 8 — команды системного администрирования; 9 - нестандартные функции ядра; п — новая документация, которая позднее может быть перемещена; 1 — локальная документация, специфическая для вашей системы. Каждая отдельная программа, утилита или функция представлена в этом руководстве отдельной страницей. Поиск страницы для программы или команды обычно сводится к вводу команды man foo, где foo — имя программы. Вероятно, вам также попадались нумерованные ссылки на man-страницы вида grep(l). Такая ссылка обозначает страницу man grep из раздела 1. Она вызывается следующим образом: $ man 1 grep Некоторые man-страницы входят в несколько секций. Команда man foo отобразит только первую из них. Для получения полного списка следует указать ключ -f: $ man -f man man (1) an interface to the online reference manuals man (7) macros to format man pages Каждая man-страница делится на секции. Имена секций бывают разными, но чаще всего встречаются следующие: NAME, SYNOPSIS, DESCRIPTION, OPTIONS, FILES, EXAMPLES, SEE ALSO, BUGS and AUTHOR. Описание синтаксиса команды находится в секции SYNOPSIS man-страницы и выглядит следующим образом: имя_комднды [необязательные ключи] обязательные^элементы При описании ключей команды используются следующие обозначения: О жирный шрифт — вводится точно так, как показано; О курсив — обозначает аргумент, заменяемый конкретным значением. В зависимости от используемой программы просмотра вместо курсива может использоваться подчеркивание текста или жирный шрифт; о [-abc] — все ключи в квадратных скобках являются необязательными и их можно комбинировать друг с другом;
22 Глава 1. Документация О [-а|-Ь|-с] — ключи, разделенные символом «|» (вертикальная черта), не могут комбинироваться друг с другом; О аргумент... — многоточие означает, что в данной позиции допускается перечисление нескольких аргументов. Элементы списка обычно разделяются пробелами, но иногда вместо них используются запятые; О [выражение]... — многоточие означает, что в данной позиции допускается перечисление нескольких выражений. Короткие ключи могут вводиться в двух форматах: -abc или -а -Ь -с Длинные ключи всегда перечисляются по отдельности и обозначаются двойными дефисами: --optionl --option2 --option3 Длинные ключи особенно полезны в сценариях; их содержательные имена помогают вспомнить, что делает сценарий. Большую часть объема man-страницы занимает список ключей. См. также man(l). 1.3. Поиск нужной man-страницы Проблема Нужно найти программу или утилиту для выполнения конкретной задачи (скажем, для подсчета слов в файле), но вы не знаете, где искать. Ведь если знаешь, где искать, то тогда и искать незачем, верно? Решение Проведите поиск по ключевым словам командой apropos или man -k. Например, чтобы найти команду для подсчета слов в файле, введите следующую строку: $ apropos count words или $ man -k count words american-english (5) grpconv (8) grpunconv (8) kmessedwords (1) lpasswd (1) pwconv (8) pwunconv (8) shadowconfig (8) wc (1) - a list of english words - convert to and from shadow passwords and groups. - convert to and from shadow passwords and groups. - a letter order game for КОЕ - add. change, or delete digest passwords. - convert to and from shadow passwords and groups. - convert to and from shadow passwords and groups. - toggle shadow passwords on and off - print the number of newlines. words, and bytes in files
1А Поиск потерянных man-страниц 23 Выбор команды неважен; apropos и man -k делают одно и то же. Список обширный, но, похоже, нам нужна программа wc. Не забывайте о ключе -f для вывода всех версий man-страницы: $ man -f manpath manpath (1) - determine search path for manual pages manpath (5) - format of the /etc/manpath.config file Комментарий Упомянутые команды выполняют поиск по ключевым словам в секциях DESCRIPTION man-страниц. Количество искомых слов может быть произвольным, но чем больше слов, тем больше результатов вы получите, потому что команда поочередно ищет каждое слово. См. также apropos(l), man(l). 1.4. Поиск потерянных man-страниц Проблема Вам не удается найти man-страницу для установленной программы, хотя уверены, что она должна находиться в системе. Решение Иногда база данных man-страниц повреждается из-за изменений, вносимых пользователями, или некорректной установки man-страниц. Для начала попробуйте провести поиск командой whereis -m: Swhereis -m cat cat:/usr/man/manl/cat.1.gz /usr/share/man/manl/cat.1.gz Страница обнаружена. Попробуйте прочитать ее командой man: $man /usr/man/manl/cat.l.gz Если не получится, попробуйте заново построить базу данных man командой mandb: # mandb Если и это не поможет, проверьте общесистемный поиск с использованием команд locate и grep: Slocate / cat. | egrep -w 'cat\.[l-9][a-zA-Z]*[.gz]?' Команда подойдет для любой man-страницы — достаточно заменить cat искомым именем. Если ни одно из этих решений не помогло добраться до нужной страницы, попробуйте воспользоваться сценарием finddoc из раздела 1.11. Если и сценарий не найдет страницу, значит, она отсутствует в вашей системе.
24 Глава 1. Документация См. также whereis(l), mandb(8). Утилита grep существует в нескольких разновидностях; за подробностями обращайтесь к grep(l). 1.5. Чтение man-страниц без программы просмотра Проблема Система, в которой вы работаете, была серьезно повреждена. Вы не можете прочитать man-страницу, потому что программа просмотра не работает. Решение Попробуйте прочитать man-страницу напрямую программами zcat и nroff: $ zcat /usr/man/manl/cat.l.gz |nroff -man | less Последнее средство — прочитайте низкоуровневый код страницы программой zless: $ zless /usr/man/manl/cat.l.gz Л" DO NOT MODIFY THIS FILE! It was generated by help2man 1.32. .TH CAT "Г "JULY 2003" "cat (coreutils) 5.0" "User Commands" .SH NAME cat \-concatenate files and print on the standard output .SH SYNOPSIS .B cat [\fI0PTI0N\fR] [\fIFILE\fR]... Выглядит некрасиво, но понять можно. Комментарий Nroff — «обертка» для форматирования man-страниц в groff. Groff—программа форматы рования документов, позволяющая генерировать документы разных форматов (HTML, .pdf, печатные копии, info-страницы и т. д.) на основе одного исходного файла. См. также mandb(8), locate(l), grep(l), nroff(l), groff(l), zless(l), zcat(l); раздел 1.6. 1.6. Настройка путей поиска man-страниц Проблема У вас постоянно возникают сложности с нахождением man-страниц. После применения средств, описанных в разделе 1.4, выясняется, что большинство отсутствующих страниц находятся в каталоге, о котором man, похоже, ничего не знает. Возможно, вновь установленная программа разместила свои man-страницы в ка-
17. Использование info-страниц 25 ком-то странном каталоге (скажем, /opt/man). А может, вы хотите разместить часть страниц в нестандартном каталоге. Как настроить man на поиск этих страниц? Решение Отредактируйте файл /etc/manpath.config. Допустим, в путь поиска нужно добавить каталог/opt/man. Включите его в /etc/manpath.config: # Поля, включаемые в каждый автоматически # сгенерированный путь MANPATH MANDATORY_MANPATH /usr/man MANDATORY_MANPATH /u s г/sha re/man MANDATORY_MANPATH /usr7XHR6/man MANDATORY_MANPATH /usr/local/man MANDATORY_MANPATH /opt/man Все, готово. Теперь man найдет man-страницы, находящиеся в новом каталоге. При создании нестандарного каталога man-страниц не забудьте создать подкаталоги разделов: $ Is /opt/man/local manl man2 man3 man4 тап5 тапб тап7 тап8 тап9 Включать все нумерованные подразделы не обязательно — достаточно разделов для тех man-страниц, которые будут там храниться. Если вы будете использовать подкаталоги (например, /opt/man и /opt/man/ local), укажите их именно в таком порядке: MANDATORY J1ANPATH /opt/man/1 оса! MANDATORY_MANPATH /opt/man Подкаталоги должны указываться перед родительскими каталогами, в противном случае программа просмотра man-страниц их проигнорирует. Комментарий Чтобы узнать текущий путь поиска man-страниц, выполните команду manpath без параметров: $ manpath /usr/local /man: /usr/share/man: /u$r7XUR6/man: /usr/man См. также manpath(l); manpath(5). 1.7. Использование info-страниц Проблема Вы решили поближе познакомиться с info-страницами и вызвали info tar (или любую другую info-страницу по своему выбору). Однако разобраться в ней не так- то просто. Как лучше всего освоить их?
26 Глава 1. Документация Решение Воспользуйтесь встроенным учебником info. Введите в командной строке строку info, нажмите h и выполните инструкции. Обучение занимает 15-30 минут, и это время будет потрачено с пользой. Комментарий Хотя некоторые пользователи считают, что механизм перемещения по info-страницам слишком усложнен, с info-страницами все же стоит познакомиться. Хотя работать с info-страницами сложнее, чем с man-страницами, (обычно) они проще для понимания. Освоившись с основными приемами перемещения, вы сможете очень быстро найти нужные сведения. Существует ряд удобных программ просмотра info-страниц, в том числе pinfo, Konqueror и Yelp. Pinfo работает в консольном режиме, а для Konqueror и Yelp необходима система X. Программа Konqueror особенно удобна для поиска и печати отдельных страниц. См. также info info. 1.8. Печать man-страниц Задача Требуется напечатать man-страницу в удобочитаемом формате. Вы попытались применить команду man foo | Ipr, но результат выглядит сомнительно: поля слишком малы, а все форматирование теряется. Решение С ключом -t man-страница форматируется специально для печати. Страница man finger хорошо подходит для экспериментов, потому что она состоит всего из двух листов: $ man -t finger | lpr Вывод на сетевой принтер: $ man -t finger | lpr -P printername Получение списка доступных принтеров: $ lpstat -p -d Возможно и другое решение. Следующая команда форматирует страницу в HTML и отправляет ее в браузер по вашему выбору: $ man -Hmozilla finger Далее остается лишь отдать команду печати в браузере. Проследите за тем, чтобы между -Н и именем браузера не было пробелов.
1.9. Печать info-страниц 27 Комментарий Во все основные дистрибутивы Linux входит поддержка CUPS (Common Unix Printing System). CUPS поддерживает команды как System V (lp), так и Беркли (Ipr). В настоящем разделе использованы команды Беркли. Вот их аналоги для System V: $ man *t finger | lp Вывод на сетевой принтер: $ man »t finger | lp -d printername См. также Man(l), lpr(l), lp(l); глава 14; CUPS Software Users Manual (http://localhost:631/ documentation.html). 1.9. Печать info-страниц Проблема Требуется напечатать несколько info-страниц, но, похоже, в info нет встроенной команды печати. Решение Воспользуйтесь Ipr: $ info finger | Ipr Однако в зависимости от настроек принтера в распечатке могут оказаться слишком маленькие поля или странные переносы строк. Отформатируйте выходные данные при помощи параметров Ipr: $ info finger | Ipr -о cpie12 -о page-left=54 -о page-rights -о page-topHH \ •о page-bottom-54 Числовые значение задаются в пунктах, то есть 1/72 дюйма. В представленном примере на странице создаются одинаковые поля по 3/4 дюйма. Комментарий Во все основные дистрибутивы Linux входит поддержка CUPS (Cc. чоп Unix Printing System). CUPS поддерживает команды как System V (1р)т ь i Беркли (Ipr). В настоящем разделе использованы команды Беркли; далее пр' щятся их аналоги для System V. Печать info-страницы: $ info finger | lp Печать info-страницы с параметрами форматирования lp: $ info finger | lp -о cpi-12 -о page-left-54 -о page-right«54 -о page-top-54 \ -о page-bottoms
28 Глава 1. Документация См. также info info, lpr(l), lp(l); глава 14; CUPS Software Users Manual (http://localhost:631/ documentation.html). 1.10. Печать отдельных man- или info-страниц Проблема Многие man- и info-документы весьма длинны — скажем, man bash занимает 33 печатных страницы. Требуется напечатать лишь часть описания. Как огранизовать выборочную печать страниц? Решение Экспортируйте man- или info-страницу в текстовый файл командой col. После этого вы сможете легко выбрать печатаемые страницы. Следующие команды показывают, как сделать это для страниц man bash или info bash: $ man bash | col -b > bash.txt $ info bash | col -b > bash.txt Комментарий Если просто ввести команду man bash > bash.txt, результат будет выглядеть убого. Команда col -b приводит распечатку в порядок, убирает из нее лишние переводы строк и символы Backspace. Это особенно важно для перевода man-страниц в текстовый формат, в man-страницах часто встречаются символы Backspace, которые затем отображаются в текстовых файлах в виде пустых квадратов или повторяющихся символов. См. также col(l). 1.11. Поиск всей документации к программе Проблема Требуется найти все файлы README и HOWTO, все журналы изменений, руководства, примеры и прочую документацию, прилагаемую к установленной программе. Решение Воспользуйтесь finddoc — замечательным сценарием Python, любезно предоставленным замечательной Акканой Пек.
1.11. Поиск всей документации к программе 29 Имя сценария может быть произвольным. Не забудьте разрешить его исполнение: $chmod +x finddoc В командной строке указывается только имя сценария и название программы, для которой ищется документация. Пример: $ ./finddoc grep /usr/share/doc/grep /usr/share/doc/grep-dctrl /usr/share/doc/grep-dctrl.changelog.gz Выходные данные фильтруются другими командами или направляются в файл: % ./finddoc | grep -i examples |lpr $ ./finddoc ) grep -i faq $ ./finddoc j grep -i examples > python-examples.txt Листинг 1.1. Программа finddoc #!/usr/bin/env python # Finddoc: Сценарий для поиска документации Linux-программ. # При создании собственной копии сценария обязательно сохраните # начапъные пробелы в том виде, в котором они приводятся в тексте. # потому что они необходимы для работы Python. # Поиск документации по заданным строкам, без учета регистра символов # и только по целым словам. Сценарий зависит от 'locate" # и предполагает, что база данных locate содержит актуальную информацию. # # Copyright 2003 by Akkana Peck. # Допускается использование, распространение или модификация программы # на условиях GPL. import sys. os. string, re # Имена файлов, которые мы будем считать относящимися к документации. # Редактируйте ло своему усмотрению. Следите за тем. чтобы # новые имена добавлялись только в нижнем регистре, docfilenames » [ \ "changelog". \ "readme". \ "install". \ "howto". \ "authors". \ "news". \ "todo". \ "config". \ "sample". \ "samples". \ "example", \ "examples". \ "геГ. \ "guide". \ "manual". \ "quickstart". \ л продолжение &
30 Глава 1. Документация Листинг 1.1 (продолжение) "thanks". \ "notes". \ "features". \ "faq". \ "acknowledgement". \ "bugs". \ "problems" \ ] def system_out (cmdstr) : retlist - [] fp = os.popen(cmdstr) while 1: s - fp.readlineO if not s : break retlist.append(s) fp.closeO return retlist # mainO for arg in sys.argv : #print string.splitCarg. " \t./") files - system_out("locate " + arg + " | grep -w " + arg): for path in files : #print path # Особый случай для файлов, в пути которых присутствуют слова # "man", "doc" или "info": if (string.find(path. "/man") >= 0) \ or (string.find(path, "/doc") >» 0) \ or (string.find(path. "/Info") >- 0) : print path. ) continue # Проверить, совпадает ли с каким-либо именем в файле: base - os.path.basename(path) for nam in docfilenames : if base — "" : continue # Для поиска по части слова # Поиск только по всему слову: # Make a regexp to search for nam as full-word only pat « "АИ + nam + "$" if (re.compile(nam).search(base. 1)) : print path, base - "" continue См. также locate(l), grep(l).
Глава 2 Установка и модификация программ в системах на базе RPM 2.1. Введение В наши дни установка дистрибутива Linux производится без особых проблем. Вставьте диск CD-ROM в дисковод, задайте несколько конфигурационных параметров и отправляйтесь пить чай, пока идет установка. Современные версии Linux превосходно распознают оборудование, быстро устанавливаются (обычно за 30 минут и менее) и требуют не более одной промежуточной перезагрузки. Компиляция системы по исходным текстам (старый подход) Сопровождение системы Linux также прошло большой путь. Благодаря пакетам и интеллектуальным средствам разрешения зависимостей своевременное обновление системы и исправление ошибок упростилось и стало порождать меньше ошибок. В наши дни молодежь получает все готовенькое. В доисторические времена не было дисководов CD-ROM — вместо широкополосного подключения приходилось использовать коробки дискет. Чтобы установить новую программу, нам, ветеранам, приходилось подолгу загружать архивы или копировать их с дискет, а затем компилировать их по исходным текстам. Зависимости? Все проблемы приходилось решать самим, без малейшей помощи со стороны новомодных утилит. Все проходило примерно так: # tar -xvf someprogram.tar # ./configure # make Вызов make завершался неудачно из-за неразрешенных зависимостей. Тогда приходилось загружать архив программы с необходимыми библиотеками, что на модеме со скоростью на 300 бод (такой, с резиновой присоской, крепится на телефоне) занимало около 6 часов. Я провела это время за работой в саду. Когда пересылка была закончена, я вернулась, распаковала новый архив и повторила попытку: # ./configure # make ppv He ^л£ EPS ''' . -^
32 Глава 2. Установка и модификация программ в системах на базе RPM Снова длинная цепочка сообщений об ошибках, указывающих на новые неразрешенные зависимости. Загружаем новый архив, снова работа в саду. К тому моменту, когда все было установлено и нормально работало, помидоры вырастали до размеров дыни. Хорошо, что в те времена мы были такими умными, что могли бы обойтись и без компьютеров. Почему возникали эти мучения с зависимостями? Потому что в Linux используются общие библиотеки, которые динамически подключаются на стадии выполнения. Многие программы, совершенно не связанные друг с другом, пользуются одними библиотеками; такая архитектура повышает скорость и эффективность системы. Программы расходуют меньше памяти и места на диске, становятся более компактными, что упрощает их распространение. Но по мере эволюции и усложнения системы Linux становилось все труднее справляться с построением системы по исходным текстам. Так программы стали оформляться в виде пакетов. В пакет входят откомпилированные библиотеки; сценарии, выполняемые до и после установки; файловые индексы; сценарии удаления и т. д. Каждый пакет знает все, что ему необходимо знать для разрешения своих зависимостей. Информация обо всех файлах, установленных из пакетов, хранится в системной базе данных пакетов. Средства разрешения зависимостей Впрочем, ситуация не столь безоблачна. Самой популярной системой управления пакетами для Linux является RPM (Red Hat Package Manager). RPM — мощная система; она осуществляет проверку зависимостей и версий, а также отслеживает все установленные пакеты в базах данных RPM. Но RPM не может произвести выборку дополнительных пакетов для разрешения зависимостей или управлять связями между пакетами. Оказавшись в тупике из-за проблем зависимости, RPM лишь сообщает, какие пакеты нужно установить; пользователю приходится самостоятельно искать пакеты и устанавливать их. При этом могут возникнуть новые конфликты зависимостей, и простая установка быстро выходит из-под контроля. Подобные ситуации называются «кошмаром RPM». Для систем на базе RPM было разработано несколько программ разрешения зависимостей, в том числе apt-rpm, urpmi, Yum и Ximian Red Carpet. В конкретных дистрибутивах имеются превосходные программы установки/разрешения зависимостей — скажем, up2date в Red Hat или YaST в SuSE. В этой главе рассматриваются основы RPM и программа Yum, которая изначально разрабатывалась для систем на базе RPM. Для многих пользователей Yum обеспечивает оптимальное сочетание богатства возможностей и простоты использования. 2.2. Установка пакетов Проблема Вы хотите знать, как устанавливать программные пакеты в Red Hat и других аналогичных системах.
2.3. Обновление пакетов 33 Решение Воспользуйтесь системой управления пакетами RPM. Команда установки в Red Hat имеет следующий синтаксис: # rpm -i пакет Например, следующая команда устанавливает графический редактор Tuxpaint. Ключ -v обеспечивает выдачу подробных сообщений, а ключ -h отображает индикатор хода установки в виде строки из символов #: # rpm -1vh tuxpa1nt-9.13-1.1386.rpm Preparing...#ЩД [ЮМ] Следующая команда проверяет установку без ее фактического выполнения: # rpm -ivh --test tuxpa1nt-9.l3-l.i386.rpm # Комментарий Самой распространенной проблемой с RPM является «кошмар RPM», то есть бесконечная цепочка неразрешенных зависимостей. Вот некоторые рекомендации по ее предотвращению: О не оставляйте неразрешенные зависимости. Они не исчезнут сами по себе, а лишь будут скрываться во тьме и расти со временем; О качество пакетов RPM не гарантировано. Любой желающий может слепить пакет и отправить его для распространения. По возможности старайтесь выбирать пакеты RPMt построенные специально для вашего дистрибутива и платформы. PLD (Polished Linux Distribution) строит качественные пакеты RPM для всех систем на базе х86; О когда потребуется построить программу по исходным текстам, используйте утилиту Checklnstall. Checklnstall генерирует пакеты для Red Hat, Debian и Slackware, поэтому вы получаете дистрибутив со всеми преимуществами непосредственной компиляции и системы управления пакетами (см. раздел 4.5). См. также rpm(8); RPM.org (http://www.rpm.org/); Maximum RPM (http://www.rpm.org/max-rpm/ index.html). 2.3. Обновление пакетов Проблема Вышла новая версия программы с новыми возможностями и исправлениями ошибок. Требуется обновить установленный пакет RPM.
34 Глава 2. Установка и модификация программ в системах на базе RPM Решение Воспользуйтесь флагом -U: #rpm -Uvh tuxpa1nt-9.13.-1.1386.rpm Чтобы предварительно протестировать команду, введите: #rpm -Uvh -test tuxpa1nt-9.l3.-l.i386.rpm Комментарий Вместо ключа -i (установка, install) может использоваться ключ -U (обновление, Upgrade). При этом может выполняться как обновление, так и установка пакета; команда работает в обоих случаях. Ключ -U заменяет старый пакет. Если вы хотите установить несколько версий одного пакета (скажем, дсс) или несколько разных ядер, не используйте ключ -U — только -i. См. также rpm(8); RPM.org (http://rpm.org); Maximum RPM (http://www.rpm.org/max_rmp/ index.html). 2.4. Удаление пакетов Проблема Некая программа вам надоела, и вы хотите ее удалить. А может, вы случайно установили ненужную программу. Итак, требуется удалить пакет RPM из системы. Решение Задача решается командой rmp -e: # грго -ev tuxpalnt Вводить полное имя пакета (например, tuxpaint-9.13.-l.i386.rpm) не обязательно; достаточно одной метки. Чтобы удалить сразу несколько программ, перечислите их, разделяя пробелами: # rpm -ev tuxpaint SDl_ttf SDL_ttf-devel SDLjmages Чтобы установка производилась без проверки зависимостей: # rpm -ev --nodeps tuxpalnt Предварительное тестирование командной строки перед выполнением осуществляется командой # rpm -ev --test tuxpalnt SDL_ttf SDLJitf-devel SDLjmages Комментарий Если RPM сообщает, что удалить пакет невозможно, потому что от него зависят другие пакеты, вам придется либо удалить остальные пакеты, либо оставить пакет в системе. В некоторых случаях (например, при замене Sendmail) зависимости приходится разрывать. Новая почтовая программа — Postfix, Exim или qmail —
2.5. Получение информации об установленных пакетах 35 разрешит зависимости Sendmail, но сначала Sendmai нужно удалить, а это неизбежно приведет к нарушению всех зависимостей. См. также rpm(8); Maximum RPM (http://www.rpm.org/max-rpm/index.html). 2.5. Получение информации об установленных пакетах Проблема Требуется узнать, какие пакеты установлены в системе, какие файлы входят в пакет или к какому пакету принадлежит тот или иной файл. Эта информация может понадобиться по разным причинам; скажем, вы хотите точно узнать, какая версия программы установлена в системе или к какому пакету принадлежит тот или иной файл. А может быть, какой-то файл был случайно изменен, и вы хотите знать, что именно вы сломали. Решение Воспользуйтесь информационными запросами RPM. Все запросы начинаются с rpm -q. Следующая команда проверяет по базе данных RPM, установлена ли программа: $ rpm -q tuxpaint tuxpaint-9.13-1 Для проведения поиска установленного пакета по его частичному имени без учета регистра символов используется команда: $ rpm -qa | grep -i kde lockdev-1.0.1-1.3 kdebase-3.1.4-6 kdeutils-3.1.4-1 kdegames-3.1.4-4 Вывод списка всех файлов установленного пакета: $ грга -ql kdegames /usr/bin/atlantik /usr/bin/kasteroids /usr/bin/katomic Вывод списка документации к приложению: $ rpm -qd kdegames | grep katonic /usr/share/doc/HTML/en/katomic/common /usr/share/doc/HTML/en/katoroic/index.docbook Вывод списка конфигурационных файлов пакета: $ rpm -qc openssh /etc/ssh/moduli
36 Глава 2. Установка и модификация программ в системах на базе RPM Вывод списка конфигурационных файлов системной команды: $ грш -qcf /usr/b1n/ssh /etc/ssh/ssh_conflg Вывод списка всех установленных пакетов: $ rmp -qa setup-2.5.27-1.1 tzdata-2003d-l bzip2-Hbs-l.0.2-10 Сохранение списка в файле с параллельным просмотром на экране: $ грш -qa | tee rpml1st.txt Определение того, к какому пакету принадлежит тот или иной файл: $ грш «qf /usr/bin/tuxkart tuxkart-0.2.0-3 Запросы RPM не обрабатывают символические ссылки и сообщают, что файл «не принадлежит ни к одному пакету». Чтобы найти файл, на который указывает символическая ссылка, воспользуйтесь командой $ namei -/tuxkart f: tuxkart 1 tuxkart -> /usr/games/tuxkart d / d usr d games - tuxkart Вывод информации о пакете: $ грш -qi kdegames Name :kdegames Relocations/usr Version :3.1.4 Vendor:Red Hat. Inc. Release :2 Build date: Mon 13 Oct 2003 Install date:Tue Nov 5.2003 Build host: daffy.perf.redhat.com Group : Amusements/Games Source RPM .-kdegames -3.1.4-2. src.rpm Size :16167441 License: GPL Signature :DSA/SHA1. Tue 28 Oct 2003 Key ID b446d04f2a6fd2 Packager :Red Hat. Inc. <http://bugzi11a.redhat.com/bugzi 11a> Summary :K Desktop Environment - Games Description : Included with this package are: kenolaba. kasteroids. kblackbox. kmajongg. kmines. konquest, kpoker. kreversi. ksame. kshisen. ksokoban. ksmiletris. ksnake. ksirtet. katomic. kjumpingcube. ktuberling Комментарий Для поиска документации к конкретному приложению также можно воспользоваться сценарием finddoc из раздела 1.11. См. также rpm(8); раздел 1.11; Maximum PRM (http://www.rpm.org/max-rpm/index.html).
2.7. Поиск недавно установленных пакетов 37 2.6 Получение информации о пакетах, не установленных в системе Проблема Требуется получить информацию о зависимостях нового пакета; узнать, какие файлы в него входят или присутствует ли в нем конкретный файл. Решение Для выполнения запросов к пакетам, не установленным в системе, в командную строку добавляется ключ -р. Следующая команда выводит список всех файлов документации: $ грш -qpd tuxpaint-9.13-1.1386.град /usr/share/doc/tuxpaint-9.13-l/AUTH0RS.txt /usr/share/doc/tuxpaint-9.13-l/CHANGES.txt /usr/share/doc/tuxpaint-9.13-l/C0PYIN6.txt Вывод списка всех файлов: $ грш -qpl tuxpa1nt-9.13-l.i386.rpm /etc/tuxpaint/tuxpaint.conf /usr/bin/tuxpaint Вывод списка зависимостей пакета: $ грш -qpR tuxpa1nt-9.13-1.1386.грш /bin/sh SDL >- 1.2.4 SDL_1mage Комментарий Любую информацию о конкретных пакетах можно получить до их загрузки из таких архивов RPM, как http://freshrpms.net, http://rpmfind.net или http:// rpm.pbone.net См. также rpm(8); Maximum PRM (http://www.rpm.org/max-rpm/index.html); FreshRPMs (http:// freshrpms.net/); rpmfind (http://rpmfnd.net); rpm.pbone (http://rpm. pbone.net). 2.7. Поиск недавно установленных пакетов Проблема Несколько дней назад вы установили несколько новых пакетов, но забыли, какие именно.
38 Глава 2. Установка и модификация программ в системах на базе RPM Решение Добавьте в командную строку ключ —last: # rpm -qa --last Команда выводит список установленных пакетов, начиная с тех, которые устанавливались последними. Комментарий Если список получится слишком длинным, передайте его less или head: rpm -qa — lastjhead. См. также rpm(8); Maximum PRM (http://www.rpm.org/max-rpm/index.html). 2.8. Перестройка базы данных RPM Проблема Похоже» база данных RPM в вашей системе повреждена или содержит устаревшую информацию, потому что она не отвечает на запросы о заведомо установленных RPM. А может быть, вы существенно переработали свою систему и хотите быть уверенными в том, что база данных RPM содержит актуальную информацию. Решение Попробуйте построить заново базу данных RPM с правами root: # rpm --rebullddb или построить ее заново: # rpm -«irvltdb Решение Необходимость в перестройке базы данных RPM возникает редко, но вреда эта операция не принесет. При любом внесении серьезных изменений в систему будет неплохо перестроить базу данных RPM. При сравнении размеров /var/lib/rpm/ packages до и после запуска rpm — rebuilddb иногда можно заметить некоторое уменьшение, поскольку в процессе перестройки из базы данных исключаются неиспользуемые части. См. также rpm(8); Maximum PRM (http://www.rpm.org/max-rpm/index.html).
2.9. Отслеживание библиотек в системах на базе RPM 39 2.9. Отслеживание библиотек, построенных по исходным текстам, в системах на базе RPM Проблема В одной системе должны использоваться как программы, построенные по исходным текстам, так и пакеты RPM. Но RPM ничего не знает о библиотеках, построенных по исходным текстам, и ошибочно выдает сообщения о неразрешенных зависимостях. Решение Воспользуйтесь сценарием rpm-orphan-find. Сценарий находит все библиотеки в вашей системе, а затем сравнивает результаты с содержимым базы данных RPM. Все «бесхозные» библиотеки объединяются в новый, виртуальный пакет .rpm. Пакет не содержит файлов, а только список обеспечиваемых зависимостей. Сценарий запускается как любой сценарий Bash: # chmod +x rpm-orphan-find # ./rpm-orphan-find После завершения работы сценария установите новый пакет, и прежде «бесхозные» библиотеки будут включены в базу данных RPM. Спасибо Полу Хайнлайну (Paul Heinlein) и Питеру Сэмюэльсону (Peter Samuel- son) за этот замечательный сценарий. Листинг 2.1. Программа rpm-orphan-find #!/bin/bash # rpm-orphan-find. сценарий для поиска # "бесхозных" библиотек в системах на базе RPM # и их преобразования в виртуальный пакет .rpm # Авторы - Пол Хайнлайн и Питер Сэмюзльсон ## Copyright 2003 ## Допускается использование, распространение или модификация # программы на условиях GPL. 0S-$(uname -s) LIBS-Vllb /usr/МЬ $(cat /etc/Id.so.confГ NAME-$(echo ${05}-base-l1bs | tr '[A-Z]' '[a-z]') VER-1.0: REL-1 TMPSPEO$(mktemp /tmp/${NAME}.spec.XXXXXX) exec 9>$TMPSPEC cat «__eof_ >&9 Summary: SOS Base Virtual Package Name: SNAME Version: $VER Release: SREL продолжение iy
40 Глава 2. Установка и модификация программ в системах на базе RPM Листинг 2.1 {продолжение) Group: System Environment/Base License: None ___eof__ found-O: orphan^O: echo "Scanning system libraries $№WE version SVER-$REL..." find $LIBS -type f \( -name '*.so.*' -o -name '*.so' \) | while read f do ((found**)) if ! rpm -qf $f >/dev/null 2>&1 then ((orphan**)) echo "Provides: $(basename $f)" >&9 fl echo -ne "Orphans found: $orphan/$found...\r" done echo ''; echo '' cat «_eof__ >&9 «description This is a virtual RPM package. It contains no actual files. It uses the 'Provides' token from RPM 3.x and later to list many of the sharedlibraries that are part of the base operating system and associated subsets for this SOS environment. «prep # nothing to do «build # nothing to do «install # nothing to do «clean # nothing to do «post # nothing to do «files __eof__ exec 9>&- rpmbuild -ba STMPSPEC; rm STMPSPEC См. также rpm(8), rpmbuild(8); Maximum PRM (http://www.rpm.org/max-rpm/index.html).
2,10. Решение проблем установки RPM 41 2.10. Решение проблем установки RPM Проблема Попытка установки пакета RPM завершается с сообщением «Error: Failed dependency». Добро пожаловать в «кошмар зависимостей»! Решение Соберите воедино все пакеты, необходимые для разрешения зависимостей, и установите их все сразу. Пример: # rpm -1vh tuxpaint-0.9.13-l.i386.rpm error: Failed dependencies SDLjmage is needed by tuxpaint-0.9.13-1 SDL_ttf is needed by tuxpaint-0.9.13-1 1ibSDLJmage-1.2.so.O is needed by tuxpaint-0.9.13-1 1ibSDL_ttf-2.0.so.O is needed by tuxpaint-0.9.13-1 # rpm -ivh tuxpaint-0.9.13-l.i386.rpm SDLjmage-1.2.3-4.1386. rpm SDLJtf-2.0.6- l.i386.rpm Программа установки сортирует их и устанавливает в правильном порядке. Что делать, если RPM жалуется на отсутствие файла или пакета, а вы абсолютно уверены в том, что он установлен? Возможно, база данных RPM содержит ошибки; попробуйте перестроить ее: # rpm --rebullddb Если это не помогло, переустановите якобы отсутствующий пакет с ключом —replacepkgs: # rpm -1vh --replacepkgs SDL_ttf-2.0.6-l.1386.rpm Если вы твердо уверены в том, что необходимые библиотеки существуют в вашей системе, попробуйте провести форсированную установку, не обращая внимания на ошибки: # rpm -1vh --force tuxpaint-2002.10.20-l.i386.rpm или откажитесь от проверки зависимостей: # rpm -ivh --nodeps tuxpaint-2002.l0.20-l.1386.rpm Если конфликт зависимостей так и не удалось разрешить, попробуйте установить новую программу и все ее зависимые пакеты из пакетов, сгенерированных по исходным текстам (см. раздел 2.11). Комментарий Где найти необходимые пакеты? Начните с домашней страницы той программы, которую вы пытаетесь переустановить. Обязательно прочтите всю имеющуюся документацию. Сейчас появилось множество разных дистрибутивов на базе RPM, поэтому постарайтесь раздобыть пакеты, построенные для вашей конкретной системы. Вот некоторые из крупнейших общедоступных архивов RPM: О FreshRPMs — http://freshrpms.net; О rpmfind — http://rpmfind.net; О rpm.phone — http://rpm.phone.net
42 Глава 2. Установка и модификация программ в системах на базе RPM См. также rpm(8); RPM.org (http://www.rpm.org/); Maximum PRM (http://www.rpm.org/max- rpm/index.html). 2.11. Сборка пакетов по исходным текстам Проблема Установить готовый пакет не удается из-за того, что он несовместим с вашей системой на двоичном уровне. А может, вы просто предпочитаете компилировать приложения в своей системе или хотите сначала отредактировать исходный код, а затем построить пакет. Решение Постройте новую программу из пакета RPM с исходными текстами (SRPM, Source RPM). Загрузите SRPM (в данном примере tuxpaint-2002.10.20-l.src.rpm) в каталог по вашему усмотрению. Проследите за тем, чтобы он подходил для вашей поставки Linux. Запустите программу установки пакета: # гря -ivh tuxpalnt-2002.10.20-1.src.rpm Команда помещает исходные тексты в каталог /usr/src/SOURCES, а файл spec — в каталог/usr/src/SPECS: # Is /usr/src/SOURCES tuxpaint-2002.09.29.tar.gz tuxpaint-Makefi1e.patch tuxpaint-stamps-2002.09.29.tar.gz tuxpaint.desktop tuxpaint-opt.patch $ Is /usr/src/SPECS tuxpaint.spec Далее постройте файл spec: # rpmbuild -bb tuxpaint.spec Новый пакет RPM создается в каталоге /usr/src/RPMS/i386: # Is /usr/src/RPMS/1386 tuxpaint-2002.10.20-1.1386.rpm Теперь у вас имеется новый пакет RPM с программой Tuxpaint, откомпилированный для вашей системы. Комментарий В вашей системе исходные тексты могут храниться в другом каталоге. В Fedora 1, как и в некоторых ранних версиях используется каталог /usr/src/redhat/RPMS/. В других поставках используется каталог/usr/src/RPM/RPMS. Разберитесь, и вы найдете нужный каталог. Построение пакетов по исходным текстам не избавляет от «кошмара RPM». Оно всего лишь гарантирует двоичную совместимость с системными библиоте-
2.12. Настройка параметров сборки SRPM 43 ками и оптимизацию RPM для архитектуры вашей системы. Соблюдение зависимостей придется обеспечивать вручную, а это далеко не так просто, как кажется. Обратите внимание: rpmbuild и rpm — два отдельных пакета. См. также rpmbuild(8), rpm(8); RPM.org (http://rpm.org/); Maximum PRM (http://www.rpm.org/ max-rpm/index.html). 2.12. Настройка параметров сборки SRPM Проблема В вашей системе действуют особые требования, из-за которых в приложениях должны присутствовать особые возможности, не используемые по умолчанию. По этой причине вы хотите контролировать параметры компиляции SRPM, чтобы обеспечить включение нужных возможностей в приложение. Решение Сначала загрузите и установите исходный пакет RPM: # грга -1vh samba-3.0.0-15.src.rpm Затем перейдите в каталог SPECS и откройте файл spec: # cd /usr/src/redhat/SPECS # vim samba.spec Найдите секцию с параметрами %configure: ^configure \ --with-acl-support \ --with-automount \ --with-fhs \ Добавьте или удалите параметры конфигурации, сохраните и закройте файл spec, а затем постройте пакет, как описано в разделе 2.11: # cd /usr/src/redhat/SPECS # rpmbuild -bb tuxpalnt.spec Комментарий Где найти список параметров? Перейдите в каталог SOURCES и распакуйте архив с исходными текстами: # cd /usr/src/redhat/SOURCES # tar xzvf samba-3.0.0.tar.bz2 Как упоминалось в разделе 2.11, в вашей системе может использоваться другой каталог исходных текстов.
44 Глава 2. Установка и модификация программ в системах на базе RPM Найдите в распакованном архиве сценарий configure и запустите его встроенную команду: # cd /usr/src/redhat/SWRCES/samba-3.Q.Q/source # ./configure --help 'configure' configure this package to adapt to many kinds of systems Optional Packages: with-PACKAGE[-ARG] use PACKAGE [ARG-yes] without-PACKAGE do not use PACKAGE with-fhs Use FHS-compliant paths with-privatecH>IR Where to put smbpasswd Настроив директиву %configure по своему усмотрению, сохраните и закройте файл. Создатели пакетов не могут удовлетворить потребности всех пользователей. Настройка SRPM позволит легко обеспечить именно тот набор параметров конфигурации, который нужен в вашем конкретном случае. В наше время настройка конфигурации SRPM чаще всего применяется для добавления или настройки поддержки аутентификации. Существует много разных внутренних модулей аутентификации (LDAP, MySQL, BerkeleyDB, PostgreSQL) и много разных аутентификационных протоколов. С точки зрения безопасности рекомендуется включать только те возможности, которые будут реально использоваться. См. также rpmbuild(8), rpm(8); RPM.org (http://www.rpm.org/); Maximum PRM (http://www.rpm.org/ max-rpm/index.html). 2.13. Установка yum Проблема Мне надоело постоянно попадать в «кошмар RPM». Работать должен компьютер, а не пользователь. Решение Воспользуйтесь yum (Yellow dog Updater Modified). Программа yum является стандартной для дистрибутива Fedora; в других системах ее придется устанавливать дополнительно: # rpm -1vh yum-2.0.4-l.noarch.rpm Затем загрузите ключи GPG, необходимые для загрузки из проекта Fedora: # rpm •-Import http://www.fedora.us/FEDORA-GPG-KEY Дополнительные ключи можно найти в каталогах загрузки, таких как http:// download.fedora.redhat.eom/pub/fedora/linux/core/2/i386/os/. Понадобятся ключи для всех архивов, на работу с которыми будет настроен yum. Включите следующую строку в файл /etc/yum.conf, чтобы проверка ключей осуществлялась автоматически: gpgcheck-1
2,14. Настройка yum 45 Теперь можно устанавливать новую программу: # yum install tuxpalnt Первая загрузка Yum займет около 30 минут, потому что она будет сопровождаться загрузкой списков пакетов: Gathering header information file(s) from server(s) Server: Fedora Linux / stable for Red hat Linux 9 (1386) Server: Red Hat Linux 9 0386) Server: Red Hat Linux 9 (1386) updates Finding updated packages Downloading needed headers getting /var/cache/yum/fedora-stable/headers/leafnode-0-1.9.43- 0.fdr.l.rh90.l386.hdr getting /var/cache/yum/fedora-stable/headers/libzvt-devel-O- 2.0.l-0.fdr.5.rh90.1386.hdr Dependencies resolved I will do the following: [instal1: tuxpaint-2002.10.20-1.i 386.rpm] Is this ok [y/NJ: Ответьте утвердительно, и на этом все будет закончено. Комментарий FreshRPMs — хороший источник качественных пакетов. Зеркала yum находятся по адресу http://ayo.freshrpms.net. Ваш пакет yum из FreshRPMs будет заранее настроен на использование архивов FreshRPMs. He забудьте установить ключ GPG: # rpm --import http://freshrpms.net/packages/RPM-6PG-KEY.txt Включение gpgcheck»l в файл yum.conf и импортирование ключей гарантирует автоматическую проверку сигнатур пакетов. Этот простой, удобный способ гарантирует, что устанавливаемые пакеты не подвергались злонамеренным модификациям или искажениям в процессе пересылки. См. также yum(8), yum.conf(5); домашняя страница yum (http://linux.duke.edu/projects/yum/); зеркала yum на сайте FreshRPMs (http://ayo.freshrpms.net). 2.14. Настройка yum Проблема Требуется сменить источник, из которого yum загружает программы. Решение Отредактируйте список источников загрузки в файле /etc/yum.conf. Допустим, вы хотите использовать некоторые зеркала Fedora по адресу http://www.fedora.us/wiki/ FedoraMirrorList:
46 Глава 2. Установка и модификация программ в системах на базе RPM University of Southern California. USA ftp://mi rrors.use.edu/pub/1i nux/fedora/ http://mi rrors.use.edu/pub/1inux/fedora/ Теперь отредактируйте файл /etc/yum.conf, используя стандартные записи в качестве образца: [base] name-Fedora Core Sreleasever - Sbasearch - Base baseurl=http://mirrors.kernel.org/fedora/core/$releasever/$basearch/os baseurl*http://mi rrors.use.edu/pub/1inux/fedora/$releasever/$basearch/os Комментарий Сетевой этикет предписывает по возможности пользоваться зеркалами, чтобы не перегружать главный сайт по адресу http://fedora.redhat.com. См. также yum(8), yum.conf(5); домашняя страница yum (http://linux.duke.edu/projects/yum/); зеркала yum на сайте FreshRPMs (http://ayo.freshrpms.net); Fedora Mirror List (http://www.fedora.us/wiki/FedoraMirrorList). 2.15. Установка и обновление пакетов в yum Проблема Требуется узнать, как устанавливать и обновлять пакеты и как выполнять обновление системы. Решение Сначала обновите список пакетов: # yum check-update Новые пакеты устанавливаются командой # уига -у install tuxkart Флаг -у включает режим автоматизированной установки (с положительными ответами на все вопросы). Чтобы обновить один пакет, воспользуйтесь командой # yum update gltron Обновление нескольких пакетов: # yum update gltron ktron tuxracer Обновление всех установленных пакетов: # yum update Поиск устанавливаемого пакета: # yum search quake Допустим, вам нужна конкретная библиотека, но вы не знаете, какой пакет предоставляет ее. Найдите ее с помощью yum:
2.17. Получение информации об установленных пакетах в yum 47 # yum provides 11bc6.l-l.so.2 Комментарий Одна из самых замечательных особенностей Yum состоит в том, что программа хорошо интегрируется с существующими системами. Yum читает готовую базу данных RPM и создает новый список пакетов, после чего ей можно пользоваться. См. также yum(8), yum.conf(5); домашняя страница yum (http://linux.duke.edu/projects/yum/); зеркала yum на сайте FreshRPMs (http://ayo.freshrpms.net); Fedora Mirror List (http://www.fedora.us/wiki/FedoraMirrorList). 2.16. Удаление пакетов в yum Проблема Требуется удалить некоторые пакеты из системы. Решение Yum позволяет решить и эту задачу: # yum remove gltron Одновременное удаление нескольких пакетов: # yum remove gltron ktron tuxkart xpoker Комментарий Yum также удаляет пакеты, которые перестали быть необходимыми. yum(8), yum.conf(S); домашняя страница yum (http://linux.duke.edu/projects/yum/). 2.17. Получение информации об установленных пакетах в yum Проблема Требуется узнать, какие пакеты установлены в системе, или получить информацию о конкретных пакетах. Решение Используйте команды запросов yum. Следующая команда выводит список всех установленных пакетов: # yum list installed
48 Глава 2. Установка и модификация программ в системах на базе RPM Поиск конкретных пакетов: # yum list installed | grep -i tux tuxracer i386 0.61-23 tuxracer 1386 0.2.0-3 Вывод информации о пакете: # yum Info tuxracer Отображение пакетов, для которых имеются обновления: #yum 11st updates Комментарий Ту же самую информацию можно получить посредством запросов RPM, но при помощи yum это делается чуть удобнее. См. также yum(8), yum.conf(5); домашняя страница yum (http://linux.duke.edu/projects/yum/). 2.18. Сопровождение yum Проблема Вы хотите избавиться от скопления загруженных пакетов в системе или позаботиться о том, чтобы Yum работал со свежими пакетами вместо кэшированных. Решение Воспользуйтесь параметром clean. Следующая команда удаляет все кэширован- ные пакеты: # yum clean packages Загрузка обновленных заголовков пакетов: # yum clean headers Удаление из системы старых, ненужных заголовков: # yum clean oldheaders Удаление кэшированных пакетов и старых заголовков с сохранением текущих заголовков: # yum clean all Комментарий Локальный кэш пакетов и заголовков рекомендуется периодически обновлять. Это предотвратит появление труднообъяснимых ошибок, а при установке и обновлении будут использоваться обновленные пакеты. См. также yum(8), yum.conf(5); домашняя страница yum (http://linux.duke.edu/projects/yum/).
Глава 3 Установка и сопровождение программного обеспечения в системах на базе Debian 3.1. Введение Дистрибутив Debian известен своей исключительной стабильностью и надежностью, а также замечательной системой управления пакетами/разрешения зависимостей apt Установка новых приложений осуществляется очень просто: # apt-get программа Выборка и установка библиотек, от которых зависит работа приложения, производятся автоматически. Apt — изощренная, интеллектуальная программа, а официальный архив программного обеспечения Debian поддерживает жесткие стандарты качества пакетов. Официальный программный архив Debian содержит более 12 000 программ; это больше, чем у любой другой платформы. Dpkg — аналог RPM для Debian, обладающий дополнительными возможностями; он также выполняет базовую настройку конфигурации. Например, при установке Postfix dpkg запрашивает кое-какую информацию о системе, устанавливает стартовые и конфигурационные файлы и инициализирует программу. Debian существует в трех разных версиях: стабильной, тестовой и нестабильной (также существует четвертая версия для искателей приключений — экспериментальная). Они обозначаются терминами Woody, Sarge и Sid. Версия Woody чрезвычайно консервативна. Пакеты допускаются в версию Woody только после обширной проверки зависимостей и исправления всех дефектов безопасности. Версии Sarge и Sid содержат новые пакеты, не прошедшие столь подробного тестирования. «Заплатки» безопасности быстро выпускаются для Woody и весьма нерегулярно — для Sarge и Sid. Какую версию использовать? Наиболее очевидный выбор — стабильная версия (Woody), надежная, как скала. Тем не менее за надежность приходится расплачиваться: программы в Woody на месяцы, а иногда и на годы отстают от даты официального выпуска. Woody идеально подходит для серверов. Для настольных систем и рабочих станций более актуальны тестовая версия (Sarge) и нестабильная версия (Sid). И несмотря на устрашающие названия («тестовая», «нестабильная»), они работают вполне нормально.
50 Глава 3, Установка и сопровождение в системах на базе Debian Кодовые обозначения выглядят симпатично, но не стоит использовать их в конфигурационных файлах. Нестабильной версии всегда будет соответствовать обозначение Sid, но Woody и Sarge не всегда будут связываться со стабильной и тестовой версиями — когда-нибудь текущая тестовая версия Sarge будет повышена до статуса стабильной, а текущая версия Woody уйдет на покой. При грамотном сопровождении система Debian постоянно обновляется без переустановки, поэтому не стоит нарушать ее работу использованием кодовых обозначений, которые со временем изменятся. Далее перечислены кодовые названия версий. Все они позаимствованы из фильма «История игрушек»: О Buzz — Базз Световой Год, космонавт (1.1); О Rex — тираннозавр Рекс (1.2); О Во -Бо Пип (1.3.x); О Hamm — Хэм, свинья-копилка (2.0); О Slink —собака Слинки (2.1); О Potato — мистер Картофельная Голова (2.2). А теперь версии 3.x: О Woody — ковбой (стабильная версия); О Sarge — командир армии зеленых солдатиков (тестовая версия); О Sid — испорченный мальчишка, ломающий игрушки (нестабильная версия). 3.2. Поиск программ для Debian Проблема Вам понадобились программы для системы Debian. В Сети можно найти многие гигабайты программного обеспечения — но где найти программы, упакованные для Debian? И как выбрать архив? Решение Пакеты Debian устанавливаются из официальных архивов пакетов Debian, неофициальных архивов и с дисков CD-ROM. Источники указываются в файле /etc/apt/sources.list, после чего система управления пакетами Debian используется для установки пакетов из источников. Списки адресов сайтов для загрузки программ: О официальное зеркало Debian — http://www.debian.org/mirror/; О неофициальные архивы APT — http://www.apt-get.org. Список поставщиков дисков CD-ROM по всему миру: О http://www.debian.org/CD/vendors/; Для поиска отдельных пакетов можно воспользоваться страницей поиска Debian: О http://www.debian.org/distrib/packages/.
3.3. Установка пакетов Debian с диска CD-ROM 51 Следующим шагом должно стать редактирование файла/etc/apt/sources.list и занесение в него выбранных источников. Комментарий При наличии нескольких источников apt-get всегда использует самую новую версию пакета. Список начинается с наиболее предпочтительных источников, поскольку apt-get обрабатывает список от начала к концу. Редактирование файла sources.list — абсолютно законный, простой способ управления установкой программ. Занесите в файл все записи, которые вы когда- либо планируете использовать, и закомментируйте строки, не задействованные в конкретной установке. В список sources.list рекомендуется включить официальные зеркала Debian, чтобы снять нагрузку с серверов Debian.org. Полный список официальных зеркал находится по адресу http://www.debian.org/mirror/. ВНИМАНИЕ Заплатки безопасности распространяются только с адреса http://www.debian.org/security/ и не копируются на зеркалах. См. также sources.list(5); официальный список зеркал Debian (http://www.debian.org/mirror/); страница поиска пакетов Debian (http://www.debian.org/distrib/packages). 3.3. Установка пакетов Debian с диска CD-ROM Проблема Требуется установить пакеты с компакт-диска. Процесс, описанный в предыдущем разделе, предполагает, что программы загружаются из архива. Как включить ссылку на CD-ROM в файл sources.list? Решение Измените файл /etc/apt/sources.list командой apt-cdrom; это единственный способ включения архивов на CD-ROM в sources.list Диск должен находиться в дисководе, но монтировать его не обязательно. Затем введите команду: # apt-cdrom add Using CO-ROM mount point /cdrom/ Unmounting CD-ROM Please insert a Disc in the drive and press enter Mounting CD-ROM Identifying.. [0eabc03dl0414e59dfal622326e20da7-2] Scanning Disc for index files.. Found 1 package indexes and 0 source indexes. This Disc is called: 'Libranet GNU/Linux 2.8.1 CD2* Reading Package Indexes...Done
52 Глава 3. Установка и сопровождение в системах на базе Debian Wrote 1271 records. Writing new source list Source List entries for this Disc are: deb cdrom:[Libranet GNU/Linux 2.8.1 C02]/ archive/ Repeat this process for the rest of the CDs 1n your set. Используйте ключ -d, чтобы добавить данные компакт-диска из другого дисковода: # apt-cdrom -d /cdroml add Идентификация диска: $ apt-cdrom ident Using CD-ROM mount point /cdrom/ Mounting CD-ROM Identifying.. [0eabc03dl0414e59dfal622326e20da7-2] Stored Label: 'Libranet GNU7L1nux 2.8.1 CD2' $ Комментарий apt-get всегда выбирает из всех доступных источников новейшие версии устанавливаемых пакетов. Мир Linux быстро развивается, поэтому самая свежая информация всегда находится в Интернете. Чтобы выполнить принудительную установку программы с компакт-диска, закомментируйте все остальные строки в файле sources.list. ПРИМЕЧАНИЕ Не забывайте выполнять команду apt-get update при каждом изменении файла sources.list. См. также apt-cdrom(8), apt-get(8); Debian on CD, архивы ISO (http://www.debian.org/CD/http-ftp/). 3.4. Установка пакетов в системе на базе Debian Проблема Все архивы программного обеспечения, компакт-диски и т. д. не принесут никакой пользы, если вы не умеете устанавливать программы. Итак, вы хотите знать, как установить новый пакет в Debian. Решение Воспользуйтесь командой apt-get install: # apt-get Install tuxkart Установка пакета с перезаписью файлов: # apt-get Install •-reinstall tuxkart
3.5. Удаление пакетов из системы Debian 53 Чтобы установить сразу несколько программ, перечислите их, разделяя пробелами: # apt-get install tuxkart gltron frozen-bubble tuxracer nethack galaga Загрузка программ без установки или распаковки: # apt-get -d Install tuxkart Чтобы протестировать команду перед выполнением, присоедините к строке ключ —dry-run: # apt-get Install tuxkart gltron frozen-bubble tuxracer nethack galaga --dry-run Комментарий Для определения имен пакетов используйте страницу поиска Debian по адресу http://www.debian.org/distrib/packages/. Имена пакетов Debian часто отличаются от своих аналогов из RPM. Например, программа CyrusSASL оформляется в пакет sasl-2.x.rpm, а в Debian она разбивается на несколько пакетов с именами libsasl-*. Не забудьте выполнить команду apt-get update после изменения/etc/apt/sources.list и периодически запускайте ее, чтобы получать обновленную информацию из архивов пакетов. apt-get загружает и устанавливает (а при необходимости и удаляет) все пакеты, необходимые для разрешения всех зависимостей. См. также apt-get(8); локальная документация (/usr/share/doc/Debian/apt-howto). 3.5. Удаление пакетов из системы Debian Проблема Требуется удалить пакет или несколько пакетов из системы Debian. Решение Воспользуйтесь командой apt-get remove: # apt-get remove tuxpaint Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED: tuxkart 0 upgraded. 0 newly installed. 1 to remove and 79 not updated. Need to get OB of archives. After unpacking 188 kB disk space will be freed. Do you want to continue? [Y/n] у (Reading database ... 141283 files and directories currently installed.) Removing tuxkart... #
54 Глава 3. Установка и сопровождение в системах на базе Debian Предварительное тестирование команды remove: # apt-get remove tuxpaint ••dry-run Удаление всех следов существования пакета, включая конфигурационные файлы: # apt-get --purge remove tuxpaint Чтобы удалить сразу несколько программ, перечислите их, разделяя пробелами: # apt-get remove tuxkart gltron frozen-bubble tuxracer nethack galaga См. также Apt-get(8); локальная документация (/usr/share/doc/Debian/apt-howto). 3.6. Установка программ в Debian по исходным текстам Проблема Требуется откомпилировать программу в системе (вместо установки двоичных файлов Debian). Возможно, вы хотите отредактировать код программы или запустить пакет из тестовой или нестабильной версии в стабильной (перекомпиляция обеспечивает построение правильных зависимостей). Решение Воспользуйтесь командой apt-get source и содействием dpkg. Для начала загрузите заголовки и библиотеки, от которых зависит устанавливаемая программа, в каталог, в котором будет строиться пакет: # cd /usr/src # apt-get build-dep tuxkart Загрузка и сборка пакета: # apt-get -b source tuxkart Установка пакета: # dpkg -i tuxkart.deb Комментарий Построение пакетов .deb по исходным текстам чаще всего выполняется с целью использования пакетов из тестовой или нестабильной версии в стабильной. Перекомпиляция настраивает зависимости для стабильной версии. Если потребуется установить программу, отсутствующую в архивах Debian, постройте .deb при помощи Checklnstall — утилиты, создающей пакеты RPM, .deb и Slackware (см. раздел 4.5). См. также apt-get(8), dpkg-source(l); локальная документация (/usr/share/doc/Debian/apt-howto); раздел 4.5.
3.8. Обновление системы Debian 55 3.7. Обновление пакетов в Debian Проблема Требуется обновить пакет в системе Debian, потому что новая версия обладает расширенными возможностями или в ней исправлены ошибки. Решение Воспользуйтесь командой apt-get install: # apt-get install gltron Reading Package Lists... Done Building Dependency Tree... Done The following packages will be upgraded: gltron 1 upgraded. 0 newly installed. 0 to remove and 78 not upgraded. Need to get 89.5kB of archives. After unpacking 266kB of additional disk space will be used. Get:l ftp://ftp.debian.org sid/main gltron 3.53 [89.5kB] Fetched 89.5kB in 5s (16.8kB/s) Preconfiguring packages... (Reading database... 141286 files and directories currently installed.) Preparing to replace adduser 3.52 (using .../archives/adduser_3.53_all.deb)... Unpacking replacement gltron... Setting up adduser (3.53)... # Обновление нескольких пакетов: # apt-get install tuxkart gltron frozen-bubble tuxracer nethack galaga Комментарий Команды обновления отдельных пакетов не существует. Команда apt-get install всегда устанавливает последнюю версию пакета. См. также apt-get(8); локальная документация (/usr/share/doc/Debian/apt-howto). 3.8. Обновление системы Debian Проблема Требуется обновить все пакеты в системе и заменить их новейшими версиями. Решение Убедитесь в том, что файл /etc/apt/soures.list содержит ссылки на нужные источники, а затем выполните команду apt-get upgrade.
56 Глава 3. Установка и сопровождение в системах на базе Debian Всегда начинайте с обновления списков пакетов: # apt-get update Следующая команда обновляет все установленные пакеты, но не удаляет пакеты для разрешения зависимостей: # apt-get -u upgrade Обновление всех установленных пакетов с удалением или установкой пакетов по мере необходимости для разрешения всех зависимостей: # apt-get -u dist-upgrade Флаг -и позволяет заранее просмотреть список всех изменений. Обновление может занять несколько часов, в зависимости от скорости подключения к Интернету и количества загружаемых пакетов. Комментарий Чтобы флаг -и применялся по умолчанию, отредактируйте (или создайте) файл /etc/apt/aptconf. // Всегда перечислять обновляемые пакеты // и запрашивать подтверждение у пользователя APT::Get:.Show-Upgraded "true": Перед каждым выполнением команды apt_get dist_upgrade сначала выполните команду apt-get upgrade, чтобы снизить вероятность ошибок при выполнении dist- upgrade. См. также apt-get(8); локальная документация (/usr/share/doc/Debian/apt-howto). 3.9. Установка обновленной версии Debian Проблема Требуется перейти на более новую версию Debian (например, с Woody на Sarge). Решение Прежде всего отредактируйте файл /etc/apt/sources.Hst, чтобы в нем содержались только записи Sarge. Затем выполните следующие команды: # apt-get update # apt-get -u upgrade # apt-get -u dist-upgrade Флаг -и позволяет сначала просмотреть список изменений. В зависимости от скорости подключения к Интернету и количества необходимых пакетов процедура может занять несколько часов.
3.10. Создание смешанной системы Debian 57 Комментарий В какой-то момент Sarge повышается до статуса стабильной версии, a Woody «уходит на покой». Когда это произойдет, обновите свою систему так, как описано в настоящем разделе. См. также apt-get(8); локальная документация (/usr/share/doc/Debian/apt-howto). 3.10. Создание смешанной системы Debian Проблема Требуется установить базовую систему в стабильной версии, а также некоторые программы из тестовой версии. Другими словами, вы хотите иметь абсолютно надежную базовую систему, но в некоторых программах вам необходимы дополнительные возможности, присутствующие только в более новых версиях. Решение Отредактируйте файл /etc/apt/sources.list так, чтобы в нем содержались ссылки на источники как для стабильной, так и тестовой версий (за информацией о файле sources.list обращайтесь к разделу 3.2. Затем отредактируйте/etc/apt/apt.conf и задайте версию по умолчанию (в нашем примере это стабильная версия). Затем при установке или обновлении пакетов нужная версия выбирается при помощи флага -t. Отредактированный (или созданный) файл /etc/apt/apt.conf должен выглядеть примерно так: // Версия системы по умолчанию. // Допустимые значения: woocty. sarge. sid // (или stable, testing, unstable) APT::0efault-Release "stable": Далее производится обновление списков пакетов: # apt-get update Сейчас по умолчанию используется стабильная версия, поэтому указывать ее при установке пакетов не обязательно. Следующая команда устанавливает Tuxkart из стабильной версии: # apt-get Install tuxkart Для установки пакета из тестовой версии (Sarge) воспользуйтесь ключом -t: # apt-get -t testing install tuxkart Чтобы гарантированно получить конкретную версию, укажите номер пакета: # apt-get install tuxkart-0.2.0-3
58 Глава 3. Установка и сопровождение в системах на базе Debian Комментарий Сопровождение смешанной системы требует осторожности, особенно если в качестве базовой версии используется Woody. По мере «старения» Woody могут возникнуть проблемы двоичной совместимости с Sarge/Sid. Различия между ключевыми системными файлами (такими как libc и дсс) могут стать настолько серьезными, что пакеты Sarge/Sid не будут устанавливаться в Woody. Если это произойдет, попробуйте построить пакеты по исходным текстам (см. раздел 3.6). См. также apt.conf(5), sources.list(5); страница поиска пакетов Debian (http://www.debian.org/ distrib/packages). 3.11. Поиск программ, установленных в системе Debian Проблема Требуется узнать, какие пакеты установлены в системе, к какому пакету относятся те или иные файлы и что находится в отдельных пакетах. Решение Воспользуйтесь средствами обработки запросов dpkg. Следующая команда выводит список всех установленных пакетов и направляет его в файл: $ dpkg -1 | tee dpkgllst Поиск всех пакетов, удовлетворяющих критерию поиска, и вывод информации об их состоянии: $ dpkg -I '♦gnome*' Desired-Unknown/Install/Remove/Purge/HoId | Status-Not/Installed/Config-files/Unpacked/Falled-config/Half-installed |/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase-bad) I|/ Name Version Description pn gnome <none> (no description available) un gnome-about <none> (no description available) ii gnome-applets 2.4.2-1 Various applets for GNOME 2 panel re gnome-b1n 1.4.2-18 Miscellaneous binaries used by GNOME Поиск установленных пакетов, удовлетворяющих критерию поиска: $ dpkg -1 | grep gnome Вывод списка файлов, входящих в пакет: $ dpkg -L gnome-applets /usr/share /usr/share/lintian
3.11. Поиск программ, установленных в системе Debian 59 /usr/share/l1ntian/overrides /usr/share/lintian/overrides/gnome-applets Следующая команда определяет, к какому пакету относится файл: $ dpkg -S boing.wav tuxkart-data: /usr/share/games/tuxkart/wavs/boing.wav Вывод полной информации о пакете: $ dpkg -s kpoker Package: kpoker Status: install ok installed Priority: optional Section: games Installed-Size: 428 Maintainer: Daniel Schepler <$chepler@debian.org> Source: kdegames Version: 4:3.1.5-1 Комментарий Таблица, выводимая командой dpkg -I, выглядит довольно загадочно, поэтому я приведу расшифровку. $ dpkg -1 gnome* Desired'Unknown/Install/Remove/Purge/Hold | Status-Not/Installed/Config-files/Unpacked/Failed-config/Half-installed |/ Err?-(none)/Hold/Reinst-required/X=both-problems (Status.Err: uppercase-bad) ||/ Name Version Description pn gnome <none> (no description available) un gnome-about <none> (no description available) ii gnome-applets 2.4.2-1 Various applets for GNOME 2 panel re gnome-bin 1.4.2-18 Miscellaneous binaries used by GNOME В строке pn gnome поднимитесь от буквы р наверх по «стрелке». Она приведет вас к строке Desired«Unknown/Install/Remove/Purge/Hold с расшифровками первого символа (Purge в данном случае). От следующего столбца, п, стрелка ведет к строке Status. По ней можно определить, что символ п означает Not/Installed. В третьем столбце отображается код ошибки. В нашем случае он пуст (и хорошо). Как указано в конце строки, любые символы верхнего регистра в столбцах Status и Err ни к чему хорошему не приведут. Получаем: пакет gnome когда-то был установлен в системе, но потом он был удален. Код un означает, что пакет никогда не устанавливался. Код и означает, что пакет установлен. Код гс означает, что пакет был установлен, а затем удален, но после него остались конфигурационные файлы. Состав этих файлов определяется легко: $ dpkg -L gnome-bin /etc/logcheck/ignore.d.server/gnome-bin /etc/1ogcheck/ignore.d.workstation/gnome-bin
60 Глава 3. Установка и сопровождение в системах на базе Debian См. также dpkg(8). 3.12. Операции с кэшем пакетов Debian Проблема Требуется обеспечить актуальность кэша пакетов и списков пакетов, чтобы программа apt работала правильно, без возникновения ложных проблем с зависимостями. Решение Воспользуйтесь программами apt и dpkg. Не забывайте выполнять команду apt-get update после модификации файла /etc/apt/sources.list, а также регулярно выполняйте ее, чтобы список пакетов оставался актуальным. Следующая команда выводит список загруженных, но не установленных пакетов: $ dpkg --yet-to-unpack Проверка нарушенных зависимостей: $ apt-get check Удаление кэшированных пакетов, которые стали ненужными: $ apt-cache autoclean Удаление всех кэшированных пакетов: $ apt-cache clean Вывод списка частично установленных пакетов: $ dpkg --audit Если вызов dpkg —audit возвращает какие-либо результаты, как в следующем случае: $ dpkg --audit vpw (no information available) для начала убедитесь в том, что возвращаемый пакет существует: $ dpkg -1 vpw Package 'vpw* is not installed and no info is available Если пакет существует, либо завершите установку, либо удалите ее. Если пакет не установлен, поищите соответствующую запись в /var/lib/dpkg/available и /var/ lib/dpkg/status и удалите ее. Комментарий Кэш пакетов запросто может занимать десятки, если не сотни мегабайт. Загляните в /var/cache/apt/archives и проверьте сами. Чтобы сэкономить место на диске, создайте локальный кэш пакетов в своей сети (см. раздел 3.14).
3.13. Разрешение конфликтов зависимостей в Debian 61 См. также dpkg(8), apt_cache(8), apt-get(8); локальная документация (/usr/share/doc/Debian/ apt-howto); The Debian Reference Manual (http://qref.sourceforge.net/). 3.13. Разрешение конфликтов зависимостей в Debian Проблема Программа не устанавливается из-за проблем с зависимостями, или команда apt-get dist-upgrade оставляет пакеты, которые нужно удалить. Решение Существует несколько команд, которые могут пригодиться для решения этой задачи; в этом разделе они перечисляются в том порядке, в котором их стоит попробовать. Допустим, проблемы возникли с пакетом libpam-modules, который не желает обновляться: # apt-get install libpam-modules The following packages have unmet dependencies: libpam-modules: Depends: 1ibdb3 (>=3.2.9-19.1) but 3.2.9-19 is to be installed E: Broken packages Если вы работаете в смешанной системе, для начала попробуйте указать версию: # apt-get Install -t stable libpam-modules Если это не помогает или система не является смешанной, попробуйте воспользоваться системой разрешения конфликтов Debian: # apt-get -f install Затем выполните команду: # dpkg --configure -a И снова повторите команду: # apt-get -f install Если будет получен следующий ответ, значит, попытка завершилась неудачей: Reading Package Lists... Done Building Dependency Tree... Done 0 upgraded. 0 newly installed, 0 to remove and 1 not upgraded. Теперь проверьте, что произойдет при удалении существующего пакета libpam- modules: # apt-get remove --dry-run libpam-modules Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED:
62 Глава 3. Установка и сопровождение в системах на базе Debian adduser adminmenu apache at base-config courier-imap courier-imap-ssl courier-pop courier-pop-ssl cron cupsys cupsys-driver-gimpprint diet-elements dict-foldoc dict- gcide diet-jargon dict-vera dict-wn dictd gdm2... WARNING: The following essential packages will be removed This should NOT be done unless you know exactly what you are doing! login libpam-modules (due to login) В данном случае исправление конфликтов зависимостей потребует едва ли не полной перестройки системы. Чаще проблемы ограничиваются несколькими пакетами. В этом случае начинайте удалять наименее важные из них, пока конфликты зависимостей не будут разрешены, а затем переустановите все пакеты, которые вам нужны. Если apt-get -u dist-upgrage отображает какие-либо задержанные (held) пакеты, от них лучше избавиться. Пакеты удерживаются из-за конфликтов зависимостей, которые не удается разрешить apt Попробуйте воспользоваться следующей командой для поиска и исправления конфликтов: # apt-get -о Debug::pkgProblemResolver»yes dist-upgrade Если исправить конфликты не удается, команда завершается с сообщением О upgraded. О newly installed. О to remove and 6 not upgraded. Удаляйте held-пакеты один за одним, каждый раз запуская dist-upgrade, пока не останется ни одного задержанного пакета. Затем установите заново все необходимые пакеты. Не забудьте использовать ключ —dry-run, чтобы заранее знать обо всех последствиях: # apt-get remove --dry-run Hbsdl-perl Комментарий В «монолитных» системах подобные конфликты версий встречаются редко. Пользователи смешанных систем сталкиваются с ними чаще. Чтобы предотвратить их, будьте чрезвычайно осмотрительны при выборе устанавливаемых программ — при первой установке Debian потратьте немного времени и выберите каждый необходимый пакет. См. также dpkg(8), apt-get(8); Debian User's List с архивами (http://lists.debian.org/debian-user/). 3.14. Создание локального архива Debian Проблема Требуется создать в локальной сети хранилище пакетов для общего пользователя. Локальный архив особенно полезен в том случае, если пользователи сети совместно используют низкоскоростное подключение к Интернету. Вместо того чтобы загружать файлы из Интернет-архивов, рабочие станции Debian загружают их из локального архива.
3.15. Выбор пакетных зеркал для apt-proxy.conf 63 Решение Воспользуйтесь программой apt-proxy: # apt-get proxy Apt-proxy запускается автоматически после установки. Теперь отредактируйте секцию add_backend/debian/ файла /etc/apt-proxy/apt- proxy .conf так, чтобы она содержала ссылки на географически близкие зеркала (список зеркал с пакетами находится по адресу http://www.debian.org/mirror/list). Затем отредактируйте файл /etc/apt/sources.list на клиентских компьютерах так, чтобы он содержал ссылку на сервер apt-proxy. По умолчанию используется порт 9999: deb http://ip-or-hostname:9999/main stable main contrib non-free deb http://ip-ог-hostname:9999/non-US stable/non-US main contrib non-free deb http://ip-or-hostname:9999/security stable/updates main contrib non-free Запустите apt-get update на клиентских машинах, и локальный архив начнет работать. Каждый раз, когда клиентский компьютер в локальной сети устанавливает программу, эта программа будет кэшироваться на сервере apt-proxy. Последующие запросы того же пакета будут обслуживаться из локального кэша. Комментарий Большинству параметров в файле /etc/apt-proxy/apt-proxy.conf, кроме источников пакетов, можно оставить значения по умолчанию. Исключение составляет частота «обновлений», определяющая периодичность загрузки списка пакетов. По умолчанию соответствующая секция выглядит так: # Максимальная частота обновлений (в минутах) # Высокие значения снижают нагрузку. BACKEND JREQ-240 Я обычно устанавливаю значение этого параметра равным 1440; ежедневной проверки вполне достаточно. Действительно важные события происходят не так часто. Проверку следует производить хотя бы раз в день главным образом для своевременной установки обновлений безопасности. См. также apt-proxy(8), apt-proxy.conf(5); официальный список зеркал Debian (http://www. debian.org/mirror/); домашняя страница apt-proxy (http://apt-proxy.sourceforge.net/). 3.15. Выбор пакетных зеркал для apt-proxy.conf Проблема Пакетные зеркала, содержащиеся по умолчанию в файле apt-proxy,conf, разбросаны по всему земному шару. Как выбрать те из них, которые вы хотите использовать? В идеальном варианте хотелось бы использовать зеркальные сайты, находящиеся поближе к вашему компьютеру.
64 Глава 3. Установка и сопровождение в системах на базе Debian Решение По умолчанию записи/etc/apt-proxy.apt-proxy.conf выглядят так: add backend /debian/ \ $APT_PROXY_CACHE/debian/ \ httpT//ftp.us.debi an.org/debi an/ \ http://ftp.de.deb1an.org/debian/ \ http://ftp.uk.debi an.org/debi an/ \ ♦ftp.us.debi an.org::debi an/ На сайте http://www.debian.org/mirror/list приведен текущий список зеркал Debian. Например, вот некоторые германские зеркала в mirror/list: DE Germany ftp.de.debi an.org /debi an/ /debi an/ ftp2.de.debi an.org /debi an/ /debi an/ ftp.tu-clausthal.de /pub/1inux/debian/ /pub/linux/debian/ debi an.uni-essen.de /debi an/ /debian/ Замените стандартные записи apt-proxy.conf своими, предваряя каждую запись префиксом http://: add_backend /debian/ \ $APT_PR0XY_CACHE/deb1an/ \ http://ftp.de.debian.org/debian/ \ http://ftp2.de.debian.org/debian/ \ http://ftp.tu-clausthal.de/pub/1inux/debian/ \ Файлы /etc/apt/sources.list на клиентских компьютерах изменять не нужно. Комментарий Команды ping и traceroute помогут определить, какие зеркала обладают минимальным временем отклика. Дело в том, что географическая близость еще не гарантирует быстрого отклика. Указание трех источников обеспечивает необходимую избыточность, apt-proxy опрашивает их по порядку: если первый источник не отвечает, опрашивается второй и т. д. См. также apt-proxy(8), apt-proxy.conf(5), apt-proxy-import(8); официальный список зеркал Debian (http://www.debian.org/mirror/); домашняя страница apt-proxy (http://apt-proxy.source- forge.net/). 3.16. Включение существующего кэша пакетов в apt-proxy.conf Проблема На сервере apt-proxy уже существует довольно большой кэш пакетов. Вы хотели бы, чтобы программа apt-proxy использовала его вместо того, чтобы загружать все пакеты заново.
3.16. Включение существующего кэша пакетов в apt-proxy.соnf 65 Решение Сначала запустите apt-get update по крайней мере на одном клиентском компьютере, чтобы инициализировать кэш. Затем на сервере выполните команду # apt-proxy-import -d /var/cache/apt/archives См. также apt-proxy(8), apt-proxy.conf(5), apt-proxy-import(8); официальный список зеркал Debian (http://www.debian.org/mirror/); домашняя страница apt-proxy (http://apt-proxy.source- forge.net/).
Глава 4 Установка программ по исходным текстам 4.1. Введение Несмотря на многочисленные системы управления пакетами и разрешения зависимостей, в некоторых случаях вариант с построением программы по исходным текстам оказывается предпочтительным. Например, нужная вам программа может не существовать в виде пакета, или вы хотите изменить состав ее встроенных функций, или оптимизировать ее для архитектуры своего процессора. Многие опытные администраторы рекомендуют строить программы, критические с точки зрения безопасности (например, ssh и все серверы), по исходным текстам. При построении программы по исходным текстам обязательно ознакомьтесь со всеми инструкциями. Хотя процедура configure-make-install стала относительно стандартной, существует множество исключений, зависящих от прихоти автора программы. Нередко в процессе построения необходимо указывать различные параметры конфигурации, и информацию о них можно найти только в документации. Если вы предпочитаете использовать пакеты, в вашем распоряжении все программы для самостоятельного построения пакетов RPM и .deb. Впрочем, на освоение этих программ потребуются немалые усилия. Существует третий вариант: Checklnstall — превосходная утилита, упрощающая построение пакетов RPM, Debian или Slackware по исходным текстам. 4.2. Подготовка системы к компиляции программ по исходным текстам Проблема Известно, что для компиляции программ из исходным текстов потребуется компилятор... и наверное, еще какие-нибудь утилиты. Но какие именно?
4.3. Построение списка добавленных файлов для упрощения удаления программ 67 Решение Необходимые программы делятся на две категории: О основные средства разработки, общие для всех систем Linux; О конкретные библиотеки или утилиты для компилируемых программ. Общие средства разработки Linux: О GNU coreutils — большой набор важнейших системных утилит: shellutils, fileutils и textutils. Полный список можно найти по адресу http://www.gnu.org/ software/coreutils/ (также можно воспользоваться командой info coreutils); О GNU binutils — утилиты для работы с двоичными файлами (http://www.gnu.org/ software/binutils); О gcc — коллекция компиляторов GNU, в том числе для языков С, C++, Objec- tive-C, Fortran, Java и Ada, а также библиотеки для этих языков; О GNU tar — утилита для создания архивов исходных текстов (как правило, имена файлов заканчиваются суффиксом/tar); О gunzip — утилита сжатия, часто используемая в сочетании с tar. Имена таких файлов заканчиваются суффиксом tar.gz; О bunzip2 — формат сжатия для упаковки и распаковки архивов; имена файлов заканчиваются суффиксом .bz2; О make — утилита для чтения параметров конфигурации и построения файлов программ. В документации к приложению должна содержаться вся информация, необходимая для его успешной сборки. Комментарий Большинство дистрибутивов Linux включает установку Core Development Tools или что-нибудь в этом роде, поэтому вам не придется отлавливать программы и устанавливать их по отдельности. Требования, специфические для конкретной программы, перечисляются в документации. Поищите в архиве с исходными текстами файлы README, INSTALL и другую документацию. Прочитайте все от начала и до конца. При запуске конфигурационный сценарий проверяет наличие в системе всех обязательных элементов. Если какой-либо из этих элементов отсутствует, сценарий завершается с кодом ошибки и сообщает, что необходимо сделать. 4.3. Построение списка добавленных файлов для упрощения удаления программ Проблема Требуется узнать, какие файлы устанавливаются в системе при построении программы по исходным текстам. Это позволит вам найти и удалить все перечисленные
68 Глава 4. Установка программ по исходным текстам файлы, когда надобность в них отпадет. Некоторые авторы программ предусмотрительно включают режим make uninstalL для «чистого» удаления программы, но многие этого не делают. Решение Стандартными средствами Linux сгенерируйте список всех файлов в системе перед установкой. Затем сгенерируйте аналогичный список после установки и сравните два списка командой diff. В результате вы получите список установленных файлов. В следующем примере используется программа JOE (Joe's Own Editor): # find / | grep -v -e Vproc/ -e A/tmp/ -e A/dev/ > joe>preinstall .list Откомпилируйте и установите новую программу, затем сгенерируйте список файлов после установки: # find / | grep -v -e Vproc/ -е */tmp/ -е */dev/ > joe>postinstall.list Затем создайте список установленных файлов, сравнив два списка командой diff: $ diff joe-preinstall.list joe-postinstall.list > joe-installed.list Комментарий Совместное использование find и grep позволяет исключить каталоги, не входящие в конечный список. Ключ grep -v включает подробный вывод. Параметр -еЛ означает «исключить следующий каталог». Мы исключаем каталоги /ргос и /tmp, потому что они содержат временные данные и постоянно меняются. Файлы в каталоге/dev находятся под управлением системы, поэтому их тоже можно исключить. Исключение каталогов также является важной мерой безопасности — при ручном удалении программ по списку diff содержимое каталогов /ргос, /tmp и /dev ни в коем случае не должно изменяться. См. также grep(l),find(l),diff(l). 4.4. Установка программ по исходным текстам Проблема Требуется построить программу по исходным текстам, но вам трудно разобраться в дебрях tar-архивов, Ьг2-архивов, make-файлов и т. д. Решение Распакуйте tar-архив. Запустите сценарий configure, затем make и install.
4.4. Установка программ по исходным текстам 69 Начните с каталога, в котором хранятся tar-архивы и каталоги с исходными текстами. В следующем примере используется программа JOE (Joe's Own Editor): # cd /usr/src/downloads # tar zxvf joe-2.9.8.tar.gz # cd joe-2.9.8 #ls # less README # less INFO # ./configure --help # ./configure «options, if needed> # make # make install | tee joe-makeinstall Последняя команда сохраняет выходные данные установки в текстовом файле joe-makeinstall. Некоторые программы архивируются утилитой bunzip2 вместо более традиционной утилиты gzip. Распаковка архивов .bz2 осуществляется так: # tar jxvf joe-2.9.8.tar.bz2 Удаление программ, построенных по исходным текстам, производится командой # make uninstall Такой способ работает только в том случае, если автор программы включил поддержку make uninstall. Если файлы приходится удалять вручную, сохраните вывод make install в текстовом файле. Другой способ — построение списка установленных файлов (см. раздел 4.3). Комментарий Описанная в этом разделе процедура считается стандартным способом удаления программ, построенных по исходным текстам. Тем не менее не все авторы программ следуют общепринятым правилам. Обязательно просмотрите всю документацию к программе. Прежде всего обратите внимание на параметры конфигурации. Некоторые программы (такие, как Apache) поддерживают десятки параметров компиляции. Для обеспечения безопасности откомпилируйте поддержку только тех возможностей, которые будут реально использоваться. Это особенно важно для серверов, доступ к которым осуществляется из непроверенных сетей (скажем, почтовых и веб-серверов). Аргументы в пользу компиляции программ по исходным текстам: О вы можете включить поддержку тех возможностей, которые вам необходимы; О оптимизация программ для конкретной архитектуры; О полный контроль над ходом установки. Впрочем, есть и недостатки: О возможные проблемы с обновлением и удалением; О до «кошмара зависимостей» рукой подать; О на компиляцию большой программы может потребоваться несколько часов.
70 Глава 4. Установка программ по исходным текстам Некоторые серверы должны строиться по исходным текстам. Например, вебсервер Apache строится по исходным текстам для обеспечения полной настройки и оптимизации. Что касается настольных систем, они слишком сложны и громоздки для самостоятельной компиляции. В таких случаях проще воспользоваться пакетными дистрибутивами Linux. См. также info tar, make(l), bzip2(l). 4.5. Создание пакетов по исходным текстам с применением Checklnstall Проблема Требуется построить пакет Slackware, Red Hat или Debian по исходным текстам, потому что приложение, которое вы хотите установить, не существует в виде нужного пакета. Вы почитали кое-какую документацию по построению пакетов, и эта задача выглядит очень сложной. Нет ли более простого пути? Решение Воспользуйтесь Checklnstall. Выполните следующие команды (в данном примере, как и в предыдущем, используется программа JOE в системе Debian): # mkdlr /doc-pak # tar zxvf joe-2.9.8.tar.gz # cd joe-2.9.8 # ./configure # make # checkinstall -0 Checklnstall заменяет make install, поэтому команда должна выполняться из корневого каталога дерева исходных текстов. Выполните инструкции, отображаемые в процессе работы. Программа строит и устанавливает .deb, в чем нетрудно убедиться: $ dpkg -1 | grep joe ii joe 2.9.801 joe's own editor, my fave Все, программа установлена и готова к работе. Копия пакета остается в каталоге исходных текстов. Следующая команда строит пакет Slackware: # checkinstall -S Построение пакета RPM: # checklnstall -R
4.5. Создание пакетов по исходным текстам с применением Checklnstall 71 Комментарий В каталоге doc-pak программа Checklnstall размещает файлы README и прочую документацию программы. Если не создать каталог doc-pak, Checklnstall спросит, хотите ли вы создать каталог документации по умолчанию. Если ответить отрицательно, пакет останется без документации. Checklnstall использует «родную» систему управления пакетами: RPM в Red Hat, installpkg в Slackware, .apt в Debian. Чтобы удалить пакет Checklnstall, воспользуйтесь программой управления пакетами своей системы. Checklnstall поддерживает любые сценарии установки. Пример: # checklnstall -D make 1nstall_packages # checklnstall -R make modulesjnstall # checklnstall -S install.sh # checklnstall -D setup He забудьте изучить файл README устанавливаемой программы, а также прочую прилагаемую документацию. Не все пакеты с исходными текстами следуют традиционной процедуре configure-make-make install. В отдельных случаях используются другие сценарии установки, как в приведенном выше примере. Checklnstall еще не позволяет создать пакет без его автоматической установки. Вероятно, эта возможность появится в будущих версиях. См. также Домашняя страница Checklnstall (http://ask-linux.com.mx/Hzto/checkinstall/news.php)
Глава 5 Идентификация оборудования 5.1. Введение В Linux имеются хорошие утилиты для получения подробной информации о внутренних устройствах компьютера. Даже если сесть за совершенно незнакомый компьютер, через считанные минуты вы получите полный список всех его компонентов. Такие утилиты не только избавляют вас от необходимости снимать кожух и копаться во «внутренностях» компьютера, но и помогают найти драйверы или узнать, поддерживается ли вообще данное устройство в Linux. Мы живем в дурацком Windows-центрическом мире: чтобы проверить, существуют ли для модема, сетевой или видеокарты драйверы Linux, обычно необходимо знать чипсет, использованный в устройстве. Количество чипсетов не так уж велико, но они делятся на множество торговых марок и моделей. Некоторые фирмы-производители меняют чипсеты, не изменяя номер модели, так что на номер модели рассчитывать не стоит. Зная чипсет, можно найти драйверы. Списки совместимости Большая часть оборудования PC неплохо поддерживается в Linux, поскольку доблестные программисты продолжают выдавать новые драйверы (порой с минимальной поддержкой со стороны фирм-производителей). Впрочем, к выбору оборудования следует подходить осторожно. Даже если устройство имеет драйверы для Linux, иногда для него не существует удобных вспомогательных программ или не поддерживается полный набор возможностей, доступных для пользователей Windows. Первым и наиболее надежным источником информации станет веб-сайт вашего дистрибутива Linux. На большинстве таких сайтов публикуются списки HCL (Hardware Compatibility Lists). Если для какой-то конкретной разновидности Linux такого сп иска не существует, возьм ите список из другого дистрибутива. Устройство, которое работает в одном дистрибутиве, должно работать во всех. Различаться будут только уровни прямой поддержки. Например, Mandrake и Linspire обеспечивают расширенную поддержку звуковых карт и видеоадаптеров. Другие дистрибутивы могут работать с теми же устройствами, но, возможно, вам придется найти и установить драйверы самостоятельно. Иногда для этого даже приходится компилиро-
5.2 Идентификация оборудования при помощи Ispci 73 вать модули ядра (что не вызывает ни малейших сложностей у настоящих асов Linux — так, мелкое неудобство). Таким образом, начните с источников информации по вашему дистрибутиву. Еще один способ быстро найти информацию по конкретному устройству — провести поиск в Google Groups вида debian linux riva tnt2 Как правило, вы сразу же получаете целый набор полезных ссылок. И наконец, стоит посетить веб-сайт произвол теля устройства. Иногда такие сайты преподносят приятный сюрприз — на них удается найти информацию по Linux. Чем плохи двоичные драйверы Некоторые производители оборудования ограничивают поддержку Linux двоичными драйверами. По возможности избегайте их. Двоичные драйверы откомпилированы для конкретной архитектуры и версии ядра. Программу так легко перекомпилировать, чтобы она правильно работала в вашей системе, что лишать такой возможности пользователей попросту глупо. Пакетные системы (такие, как Red Hat, SuSE и Debian) ограждают нас, конечных пользователей, от этих проблем, поскольку производители пакетов делают всю работу за нас; однако и им необходимы исходные тексты. Линус Торвальдс говорит: «...Я разрешаю модули, содержащие только двоичные файлы, но хочу, чтобы люди знали: предполагается, что такие модули работают только в одной версии ядра, для которой они были откомпилированы. Если они работают в других версиях, это не более чем приятная неожиданность». 5.2. Идентификация оборудования при помощи Ispci Проблема Вы оборудуете новую рабочую станцию или устанавливаете Linux на компьютер, работавший под управлением другой ОС. Вам хотелось бы знать, все ли компоненты — видеокарта, модем, Ethernet, звуковая карта — будут работать под Linux. Производители не могут (или не хотят) сказать, работают ли их продукты под Linux. Чтобы узнать, существуют ли для этих устройств драйверы Linux, нужно знать их чипсеты. Возможна и другая ситуация: вы хотите знать, какие компоненты установлены внутри компьютера. Но при этом вам не хочется браться за отвертку, снимать кожух и копаться внутри. Решение Воспользуйтесь программой Ispci: # /sbin/lspd # /sbln/lspci -v # /sbin/lspci -vv
74 Глава 5. Идентификация оборудования Следующая команда вьюодит сводку всех устройств, подключенных к шине PCI: $ /sbin/lspci 00:00.0 Host bridge: VIA Technologies. Inc. VT8363/8365 KT133/KM133] (rev 02) 00:01.0 PCI bridge: VIA Technologies. Inc. VT8363/8365 KT133/KM133 AGP] 00:06.0 Ethernet controller: Linksys Network Everywhere Fast Ethernet 10/100 model NC100 (rev 11) Флаги -v или -w используются для вывода более подробной информации: $ /sbin/lspd -v 0000:01.00.0 VGA compatible controller: 3Dfx Interactive. Inc. Voodoo 3 (rev 01) (prog- if 00 [VGA]) Subsystem: 3dfx Interactive. Inc.: Unknown device 1252 Flags: 66MHz. fast devsel. IRQ 10 Memory at d4000000 (32-bit. non-prefetchable) [size=32M] Если вы ищете драйверы, возьмите выходные данные Ispci (например, VT8363/ 8365 или 3Dfx Interactive, Inc. Voodoo 3 (rev 01)) и проведите по ним поиск в Google. Комментарий Программа Ispci получает часть данных от шипы PCI, а затем добавляет к ним дополнительную информацию из внутренней базы данных /usr/share/misc/pci.ids. Даже существует специальная команда для обновления этого файла: # update-pciIds Если к системе подключено устройство, не распознаваемое Ispci (скажем, очень старое и экзотическое устройство ISA), вам придется открыть корпус и посмотреть, что это такое. Также можно попробовать запустить dmesg (см. раздел 5.3). См. также lspci(8). 5.3. Сбор информации об оборудовании программой dmesg Проблема При всех своих достоинствах шина PCI — день вчерашний. Чаще требуется получить список всех устройств в системе, не только устройств РС1: это и устройства U SB, и устройства SCSI, конфигурация памяти и даже процессор. Решение Воспользуйтесь программой dmesg. Программа выводит список всего оборудования, обнаруженного ядром. Чтобы просмотреть весь вывод dmesg, введите команду $ dmesg | less
53. Сбор информации об оборудовании программой dmesg 75 Выходные данные dmesg также можно отфильтровать для поиска конкретных устройств. Так, следующая команда выводит список всех устройств PCI: $ dmesg | grep -1 usb Вывод списка устройств ISA: $ dmesg | grep -1 isa isapnp: Scanning for PnP cards... isapnp: SB audio device quirk - increasing port range isapnp: Card 'SupraExpress 56i Voice* Определение объема физической памяти в системе: $ dmesg | grep -i memory Memory: 256492/262080k available (1467k kernel code. 5204 reserved. 516k data. 96k init. OK highmem) Вывод списка устройств IDE, использующих подсистему эмуляции SCSI в ядре 2.4 и более старых версий: $ dmesg | grep -1 scsi Kernel command line: rooWdev/hda6 ro hdb-scsi hdc-scsi ide_setup: hdb-scsi ide_setup: hdc«scsi SCSI subsystem driver Revision: 1.00 hdb: attached ide-scsi driver hdc: attached ide-scsi driver scsio : SCSI host adapter emulation for IDE ATAPI devices А вот как выглядят «настоящие», не эмулированные устройства SCSI: $ dmesg | grep -1 scsi SCSI subsystem driver Revision: 1.00 scsiO: Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER. Rev. 6.2.8 <Adaptec aic7892 Ultral60 SCSI adapter> aic7892: Ultral60 Wide Channel A. SCSI Id=7. 32/253 SCBs ...Vendor: IBM-PSG Model:DPSS-336950M M Rev: S9HA Attached scsi disk sda at scsiO. channel 0. id 0. lun 0 (scsi0:A:0): 160.000MB/s transfers (80.000MHz DT. offset 63. 16bit) SCSI device sda: 71096640 512-byte hdwr sectors (36401 MB) Partition check: sda: sdal sda2 sda3 sda4 < sda5 sda6 > Далее показана информация о камере USB, подключенной к системе, включая ее местонахождение в файловой системе. Обычно информация об устройстве USB занимает десяток строк и более: $ dmesg | grep -1 usb usb.с: registered new driver ibmcam icmcam.c: IBM PC Camera USB camera found (model 2. rev. 0x030a) usbvideo.c: ibmcam on /dev/videoO: canvas=352x240 videosize=352x240 Вывод информации о последовательных портах: $ dmesg | grep -i tty ttySOO at 0x03f8 (irq = 4) is a 16550A Вывод информации о процессоре (или процессорах): $ dmesg | grep *i cpu Initializing CPU#0 CPU: LI I Cache: 64K (64 bytes/line). D cache 64K (64 bytes/line)
76 Глава 5. Идентификация оборудования CPU: L2 Cache: 64K (64 bytes/line) Intel machine check reporting enabled on CPU#0. CPU: After generic, caps: 0183f9ff clc7f9ff 00000000 00000000 CPU: Common caps: 0183f9ff Clc7f9ff 00000000 00000000 CPU: AMD Duron(tm) Processor stepping 01 Обратите внимание: при поиске возвращаются только те строки, в которых присутствует искомая подстрока. Часто дополнительная информация содержится в соседних строках и находится прямым просмотром файла: Initializing CPU#0 Detected 801.446 MHz processor. Комментарий Программа dmesg всегда выводит обновленную информацию даже при частой смене оборудования (например, при подключении и отключении устройств USB). См. также dmesg(8). 5.4. Получение текущей сводки оборудования с использованием /ргос Проблема Требуется отслеживать состояние работающей системы в реальном времени, получать информацию о физической памяти и процессоре, идентифицировать диски и т. д. Решение Прочитайте данные из виртуальной файловой системы /ргос. Для чтения данных из /ргос следует применять только cat и утилиты, предназначенные специально для этой цели (например, sysctl, Ispci, ps и top). Синтаксис cat остается неизменным: $ cat /proc/фдйл Выполняя с /ргос те же операции, что и с обычными файловыми системами, вы сможете легко найти нужную информацию. Информация об оборудовании хранится в каталогах с соответствующими именами: $ Is /ргос bus cmdline cpuinfo devices dma driver filesystems ide kcore kmsg ksyms loadavg meminfo misc modules mounts mtrr partitions pci scsi swaps sys tty Вывод информации о процессоре: $ cat /proc/cpuinfo processor : 0 vendor id : AuthenticAMD
5.4. Получение текущей сводки оборудования с использованием /ргос 77 сри family model model name stepping сри MHz 6 3 AMD Duron(tm) Processor 1 801.442 Вывод информации о физической и виртуальной памяти: $ cat /proc/meminfo total: used: free: shared: buffers: cached: Mem: 262746112 237740032 25006080 0 11575296 150138880 Swap: 534601728 81661952 452939776 MemTotal: 256588 kB MemFree: 24420 kB Вывод информации о жестком диске IDE: $ cat /proc/ide/v1a VIA BusMastering IDE Configuration Driver Version: 3.37 South Bridge: VIA vt82c686a Revision: ISA 0x22 IDE 0x10 Highest DMA rate: UDMA66 Вывод информации о геометрии диска (как физической, так и логической): $ cat /proc/ide/ideO/hda/geometry physical 39870/16/63 logical 2501/255/63 Идентификация диска: $ cat /proc/ide/1de0/hda/model IBM-DTLA-305220 Вывод информации об устройствах SCSI (обратите внимание: команда не различает устройства, подключенные к шине SCSI, и устройства IDE, использующие подсистему эмуляции SCSI; в данном случае речь идет о дисководах CD-ROM с интерфейсом IDE): $ cat /proc/scsl/scsi Attached devices: Host: scsiO Channel: 00 Id: 00 Lun: 00 Vendor: TOSHIBA Model: DVD-ROM SD-M1202 Rev:1020 Type: CD-ROM ANSI SCSI revision: 02 Host: scsiO Channel: 00 Id: 01 Lun: 00 Vendor: LITE-ON Model: LTR-24102B Rev:5S54 Type: CD-ROM ANSI SCSI revision: 02 Комментарий Как упоминалось выше, для чтения данных из /ргос следует использовать только cat и утилиты, предназначенные специально для этой цели. Программы постраничного вывода типа less или тоге выводят другие данные, потому что они читают /ргос заново с каждой страницей. Также не рекомендуется использовать текстовый редактор или любую программу с возможностью записи, чтобы не создавать риска повреждения системы.
78 Глава 5. Идентификация оборудования См. также ргос(5). 5.5. Просмотр разделов в программе fdisk Проблема Требуется просмотреть все разделы на жестком диске или дисках. Возможно, вы хотите знать, как распределено свободное место на диске, хотите «вернуть» старые разделы Windows, задействовать неиспользуемый раздел под виртуальную память или узнать номер /dev для раздела. Программа fdisk также выводит информацию о файловой системе раздела и объеме свободного пространства. Решение Воспользуйтесь программой fdisk. Вывод информации обо всех разделах на всех жестких дисках: # /sbin/fdisk -1 Disk /dev/hda: 20.5 6В. 2057674520 bytes 255 heads. 63 sectors/track. 2501 cylinders Units - cylinders of 16065 * 512 - 8225280 bytes Device Boot Start End Blocks Id System /dev/hdal * 1 893 7172991 7 HPFS/NTFS /dev/hda2 894 1033 1124550 с W95 FAT32 (LBA) /dev/hda4 1034 2501 11791710 f W95 Ext'd (LBA) /dev/hda5 2437 2501 522081 82 Linux swap /dev/hda6 1034 1670 5116639+ 83 Linux /dev/hda7 1671 2436 6152863+ 83 Linux Вывод таблицы разделов для отдельного диска: # /sbin/fdisk -1 /dev/hda Disk /dev/hda: 20.5 GB. 20576747520 bytesDisk /dev/hda: 20.5 GB. 20576747520 bytes 255 heads. 63 sectors/track. 2501 cylinders Units - cylinders of 16065 * 512 - 8225280 bytes Комментарий По выходным данным fdisk также можно узнать, какой тип файловой системы находится на любом разделе. В рассмотренном примере используются два разных типа файловых систем Windows (HPFS/NTFS, FAT32) и расширенный раздел Windows, в котором были построены файловые системы Linux и раздел виртуальной памяти. См. также fdisk(8).
Глава 6 Редактирование текстовых файлов в JOE и Vim 6.1. Введение Освоение текстового редактора — важный навык для каждого, кто хочет быть грамотным, достойным пользователем Linux. Проблема выбора редактора сама по себе интересна, так как в мире Linux существует много текстовых ASCII-редакторов. Это объясняется двумя причинами. Во-первых, создание текстового редактора является хорошим (и достаточно типовым) проектом для программиста-новичка; во-вторых, текстовый редактор — сугубо личный инструмент. Гуру Linux часто пишут или изменяют текстовые редакторы, руководствуясь своими капризами... то есть специфическими требованиями. Пользователи Linux частенько ввязываются в перепалки по поводу текстовых редакторов (особенно «Emacs против Vim»). Занятие веселое, но бессмысленное. Найдите тот редактор, который лучше всего подходит для ваших потребностей и темперамента. Красота Linux (и концепции свободно распространяемого программного обеспечения вообще) заключается в богатстве выбора пользователя. В этой главе мы рассмотрим JOE (Joe's Own Editor) и Vim, который является потомком vi. Почему не Emacs? Emacs — замечательная программа; большая, сложная, с бесконечными возможностями настройки и расширения. Это не простой текстовый редактор, а скорее интегрированная среда. В Emacs пользователи могут читать почту и конференции Usenet, писать программы, играть в игры, создавать собственные макросы и комбинации клавиш, имитировать оконные среды при отсутствии X Window и даже консультироваться с психиатром (М-х doctor). Emacs может сделать что угодно... если вы знаете, как этого добиться. Но для тех, кому нужно просто отредактировать текстовый файл, этого многовато. Emacs «весит» более 22 Мбайт, тогда как JOE и Vim помещаются на одной дискете, да еще остается свободное место. JOE и Vim хорошо подходят для повседневной работы по редактированию конфигурационных файлов. Конечно, они также могут использоваться для написания любых текстов — статей, веб-страниц, программ и т. д. Чем лучше вы печатаете, тем производительнее будет ваша работа. В идеальном случае руки не должны отрываться от клавиатуры, а глаза — от экрана.
80 Глава б. Редактирование текстовых файлов в ЗОЕ и Vim JOE является «однорежимным» редактором; иначе говоря, ввод команд и редактирование текста осуществляются на одном экране. Vim работает в двух режимах: нормальном/командном режиме и режиме вставки/редактирования. В нормальном режиме все вводимые данные интерпретируются как команды. В режиме вставки все интерпретируется как обычный текст. Это приводит в недоумение некоторых новичков, которые впервые берутся за Vim — ведь в программе нет анимирован- ного «помощника», который бы объяснил, что они должны переключаться между двумя режимами, и показал, как это делается. Vim — серьезный, мощный инструмент, но, как вы узнаете из этой главы, освоить его не так уж трудно. СОВЕТ Существует прекрасная бесплатная программа обучения навыкам печати для Linux, которая называется Gtypist (http://wvvw.gnu.org/software/gtypisVgtypist.html). Она обучает как раскладке Qwerty, так и раскладке Дворака и содержит учебные курсы на английском, чешском, русском, испанском, немецком, французском и норвежском языках. Как и большинство программ на базе ncurses, она лучше смотрится на текстовой консоли, чем в X. vi/Vim, универсальный редактор Vi (официально произносится «ви-ай», хотя я люблю говорить «ви» в рифму с «фи», чтобы позлить фанатов) — общедоступный текстовый редактор. В какой бы разновидности системы Linux вы ни работали, в вашем распоряжении всегда будет vi или один из его потомков. У vi существует множество клонов: Vim, elvis, vile, calvin, Vigor, viper, virus и т. д. Проекты такого рода появляются и исчезают, но Vim, elvis и vile широко используются и активно развиваются. Vim — самый популярный из всех потомков vi. При запуске vi во многих дистрибутивах Linux (таких, как Red Hat, Debian и Mandrake) запускается Vim. Программа поддерживает окна и цветовое выделение синтаксиса, содержит обширную электронную справку и документацию. Впрочем, даже если в вашем распоряжении окажется только древняя версия vi, навыки работы в Vim вам пригодятся. Редактор JOE: «пять в одном» Редактор JOE обладает целым рядом приятных особенностей. В частности, он работает в нескольких режимах и имеет собственную справочную систему. Вы можете запустить JOE и сходу взяться за работу, не заботясь о чтении документации. Конечно, это не лучший способ, но в крайнем случае он сработает. JOE поддерживает три режима эмуляции: О jstar (WordStar); О jpico (Pico); о jmacs (Emacs) и два собственных режима, JOE и RJOE. В ограниченном режиме RJOE («Restricted JOE») могут открываться только файлы, указанные в командной строке. После запуска редактора в режиме RJOE вы не сможете открыть новые файлы в редакторе или открыть новый сеанс командной оболочки. Таким образом, режим RJOE хорошо подходит для sudo-пользователей, поскольку он предотвраща-
6.2. Поиск команд JOE 81 ет выход в режим командной строки с привилегиями root. Все пять режимов работают из одного 200-килобайтного исполняемого файла. См. также joe(l), vi(l); Gtypist (http://www.gnu.org/software/gtypist/gtypisthtml). 6.2. Поиск команд JOE Проблема Как заставить JOE сделать что-нибудь полезное? Для этого необходим полный список команд JOE для всех его режимов. Притом справка нужна в электронном виде, чтобы ее можно было использовать во время работы. Решение Включите режим электронной справки, поддерживаемый во всех режимах JOE. Для запуска JOE в режиме справки воспользуйтесь командой $ joe -help Комментарий В Joe используется много трехклавишных команд. Каретка (А) обозначает клавишу Ctrl. Нажмите первые две клавиши вместе (например, Ctrl+K), затем отпустите их и нажмите третью клавишу. Далее перечислены базовые команды вызова справки: О JOEhRJOE: • ЛК Н . — включение/отключение режима вывода справки; • Esc. — перебор справочных экранов, Esc, — перебор в обратном направлении. О Jpico: • Л6 . — включение/отключение режима вывода справки; • Esc. — перебор справочных экранов, Esc, — перебор в обратном направлении. О Jmacs: • ЛХ Н . — включение/отключение режима вывода справки; • ЛХ. — перебор справочных экранов, ЛХ., — перебор в обратном направлении. О Jstar: • AJ H. — включение/отключение режима вывода справки; • Esc. — перебор справочных экранов, Esc, — перебор в обратном направлении. См. также joe(l).
82 Глава б. Редактирование текстовых файлов в JOE и Vim 6.3. Настройка ЗОЕ Проблема JOE поддерживает много режимов и параметров командной строки. Требуется настроить его конфигурацию по умолчанию, чтобы редактор запускался в нужном вам состоянии. Решение Создайте персональный файл .joerc с описанием нужной конфигурации и сохраните его в своем домашнем каталоге. Для начала загляните в /etc/joe, где хранятся файлы инициализации JOE по умолчанию: $ Is /etc/joe jmacsrc joerc jpicorc jstarrc rjoerc terminfo Воспользуемся файлом joerc для «обычного» JOE, который не пытается прикидываться кем-то другим. Скопируйте файл в свой домашний каталог и сделайте его скрытым, сохранив прежнее имя: $ joe -linums -help /etc/joe/joerc AK D Name of file to save (AC to abort): -/.joerc Could not make backup file. Save anyway (y.n.AC)? Y File -/.joerc saved «A» означает клавишу CtrL Регистр символов команд не имеет значения; К D — то же самое, что k d. Хотя .joerc позволяет управлять всеми аспектами работы JOE вплоть до мелочей, самые полезные параметры собраны в первых двух секциях. Например: -marking Текст между АК В и курсором выделяется (используется с -lightoff) -force Вставка завершающего перевода строки при сохранении файла -lightoff Снятие выделения после копирования или перемещения блока -exask AK X всегда запрашивает подтверждение имени файла Неактивные параметры начинаются с пробела или символа табуляции. Чтобы активировать параметр, удалите начальный пробел и убедитесь в том, что строка сдвинута до предела влево. Комментарий Одна из приятных особенностей JOE заключается в том, что программа работает с копией исходного файла. Оригинал сохраняется в виде резервной копии (впрочем, эта возможность тоже настраивается и ее можно отключить в .joerc). См. также joe(l); раздел 6.4.
6.5. Копирование текста между файлами в JOE 83 6.4. Сохранение личной конфигурации JOE в отдельном файле Проблема гс-файлы JOE весьма велики, и уследить за всеми изменениями нелегко. Как отделить ваши изменения от параметров, сохранивших прежние значения? Решение Сохраните изменения в отдельном файле, который в нашем примере будет называться .joercprefs. Загрузите этот файл, включив следующую строку в начало .joerc, в любую позицию до начала «первой секции». Обязательно включите начальное двоеточие и выровняйте директиву по левому краю: :include .joercprefs Комментарий Сохранение всех изменений в отдельном файле окажет вам неоценимую помощь. Учтите, что .joercprefs не замещает .joerc — параметры, явно включенные или отключенные в .joerc, сохраняют свое состояние, что бы ни говорилось в .joercprefs. Однако параметры .joerc, начинающиеся с пробела, игнорируются и потому могут включаться и отключаться в .joercprefs. См. также joe(l). 6.5. Копирование текста между файлами в JOE Проблема Хорошо, уговорили — собственный файл —/.joercprefs нужен. Но как создать файл без дубликатов или параметров, конфликтующих с исходным файлом -/.joerc? Решение Откройте в JOE два окна: для -/.joerc и для нового файла -/.joercprefs. Скопируйте нужные параметры из -/.joerc в -/.joercprefs. Сначала создайте резервную копию оригинала -/.joerc: $ ср -/.joerc -/.joerc.bak Откройте -/.joerc, затем откройте второе окно и присвойте имя новому файлу: $ joe -linums -help -/.joerc AK 0 AK E Name of file to edit (ЖС to abort): -/.joercprefs
84 Глава б. Редактирование текстовых файлов в JOE и Vim Переключение между окнами осуществляется командами АК Р и АК N. Иногда с поиском нужного окна возникают проблемы; команда АК I переключает режимы показа всех окон/скрытия неактивных окон. Пометка копируемых блоков текста производится командами АК В и АК К. Установите курсор в точке вставки и скопируйте текст клавишами АК С. Комментарий Файл ~/0оегс очень велик; возможно, вам будет удобнее отобразить только неактивные параметры. Чтобы отобрать их, воспользуйтесь командой фильтрации JOE: "К / $ grep ,A[space]]' Теперь вы сразу увидите неактивные команды и сможете скопировать те из них, которые хотите активировать, в файл -/.joercprefs. Вы также можете отобразить только активные параметры: $ grep ,A[A[:space:]]' Команда АК X сохраняет -/.joercprefs и завершает работу. Теперь изменения хранятся отдельно от основного файла, что упрощает их дальнейшее отслеживание и редактирование. См. также joe(l). 6.6. Поиск и замена в ЗОЕ Проблема Вы редактируете документ и находите особенно раздражающую ошибку, которая повторяется снова и снова. Какие возможности предлагает JOE для поиска и замены слов, текстовых строк и знаков препинания в документе? Решение Команда АК F обеспечит любые потребности в области поиска и замены. Для проведения нетривиального поиска применяются специальные служебные последовательности, называемые регулярными выражениями. Итак, введите команду АК F. Клавиши Т и I позволяют выбрать из списка предыдущий критерий поиска и замены. Комбинация AL продолжает поиск без применения замены. Допустим, вы хотите найти в документе все вхождения слова «nucular» и заменить их правильным написанием «nuclear». Вот как это делается: АК F Find (AC to abort): \<nucular\> (I)gnore (R)eplace (B)ackwards Bloc(K) NNNCC to abort): r Replace with (X to abort): nuclear Replace (Y)es (N)o (R)est (B)ackup (AC to abort)? г
6.7. Вертикальное выделение текста в JOE 85 Обратите внимание на последовательности \< и \>. Они указывают JOE, что поиск должен ограничиваться целыми словами. Без них JOE найдет все вхождения строки, далее находящиеся внутри других слов. Возможно, вместо замены написания вы предпочтете заключить неверное слово в кавычки: Replace with <AC to abort): "\&" Или еще более экзотический вариант: Replace with ГС to abort): "It's nuclear, not "\&" dammit!!" Поиск совпадения только в начале строки: \Anucular Поиск совпадения только в конце строки: nucular\$ Чтобы найти пропуски, нажмите «пробел» и символ табуляции в квадратных скобках: \[ ] Поиск любого из символов, указанного в квадратных скобках (для поиска без учета регистра символов): \[Nn]ucular См. также joe(l); раздел «The special search sequences» в электронной справке JOE. 6.7. Вертикальное выделение текста в JOE Проблема Вы долго строили таблицу, а теперь вам потребовалось поменять столбцы местами. Другими словами, требуется выделить вертикальный фрагмент текста — например, первое слово в нескольких строках, фрагменты текста в середине нескольких строк или столбец данных. Решение Воспользуйтесь режимом прямоугольного выделения. Режим включается командой АТ X. Выделите блок текста командами АК В и ЛК К, а затем выполните с ним нужную операцию. Комментарий Некоторые полезные команды, выполняемые с блоками текста: О АК В, АК К — пометка/снятие пометки с начала и конца блока; О АК М — перемещение блока в текущую позицию курсора; О АК С — копирование блока в текущую позицию курсора;
86 Глава 6. Редактирование текстовых файлов в JOE и Vim О АК Y — удаление блока текста; О АК — перемещение блока вправо; О АК — перемещение блока влево; О АКА — выравнивание текста по центру; О АК / — открытие окна командной строки для выполнения команды обработки текста. См. также joe(l); справочная система JOE. 6.8. Поиск и открытие файлов в JOE Проблема У вас много работы. Вам приходится редактировать множество файлов, выполнять огромное количество операций. Постоянно запускать и завершать JOE неудобно. Вы предпочитаете найти нужный файл и открыть его, не выходя из JOE. Решение Для поиска файлов в JOE используйте команды AKR и АКЕ. Эти команды либо открывают существующий файл, либо создают новый файл: АК Е Name of the file to edit (AC to abort): Имена существующих файлов расширяются клавишей Tab. В данном примере введите да, а затем два раза нажмите Tab. JOE автоматически вставляет звездочку при нажатии Tab, так что вводить этот символ не нужно. АК Е Name of the file to edit (AC to abort): .ga* .gaby/ .gaim/ .gaimrc .galeon/ Клавиша Enter осуществляет переход «вниз» по дереву файлов, a Backspace — «вверх», по направлению к корневому каталогу. Клавиша Tab выбирает файл. Следующая команда вставляет существующий файл в позиции курсора: АК R Name of the file to edit (ЖС to abort): Запомните команды управления окнами: О АК0 — открытие нового окна; О АК1 — отображение всех окон/скрытие неактивных окон; О АКР и AKN — перемещение между окнами. Комментарий Хотя JOE не обладает собственной поддержкой мыши, вы можете копировать и вставлять данные из других приложений мышью в сеансах X. Это функция тер-
6.9. Быстрое изучение Vim 87 минала, а не JOE. Используйте классический метод Unix: выделите текст мышью, а затем щелкните средней кнопкой мыши. Комбинации клавиш AV и X имеют другой смысл в JOE. См. также joe(l). 6.9. Быстрое изучение Vim Проблема Вы проделали изрядную домашнюю работу, возможно — прочитали раздел «Введение» к этой главе и решили использовать Vim. Итак, требуется как можно быстрее освоить Vim и притом с самого начала встать на правильный путь. Решение Запустите программу обучения Vim; для этого достаточно ввести vimtutor в командной строке. Через 30-60 минут вы будете управляться с программой, как бывалый профессионал. Это самый лучший и быстрый способ. Комментарий Возможно, из учебного курса вы узнаете все команды, которые вам когда-либо понадобятся. За дополнительной информацией о миллионах возможностей Vim обратитесь к превосходному руководству пользователя Брэма Муленаара (Bram Moolenaar), автора Vim. Руководство включено во внутреннюю справочную систему Vim, а также существует в нескольких электронных версиях по адресу http://vimdoc.sourceforge.net (HTML для поиска, PDF и HTML для печати). Чтобы вызвать руководство пользователя в Vim, введите команду :help Клавиши управления курсором используются для перебора оглавления, а комбинация ж] открывает главу. Вы также можете сразу перейти к конкретной теме: :help qulckref :help tutor :help usr_06.txt Поиск по критерию с выводом списка вариантов: :help vimrc Вместо Enter нажмите ж0. Результат будет выглядеть примерно так: :help vimrc vimrc vimrc-intro system-vimrc _gvimrc vimrc vimrc-filetype gvimrc :mkvimrc _vimrc vimrc-example.vim .gvimrc
88 Глава б. Редактирование текстовых файлов в ЗОЕ и Vim Выберите нужный вариант :help vimrc-example.vlm Если вы недавно работаете в Vim, для начала потренируйтесь с учебным курсом Vim. Следующие разделы посвящены настройке рабочей среды и управлению Vim. См. также vimtutor(l); страница документации vim.org (http://www.vim.org/docs.php); страница vimdoc на сайте SourceForge (http://vimdoc.sourceforge.net/). 6.10. Создание автотекста в Vim Проблема Вам приходится часто вводить повторяющиеся фрагменты текста: уведомления об авторских правах, комментарии к программному коду, подписи и т. д. Вам хотелось бы как-то оптимизировать процесс ввода. Решение Воспользуйтесь сокращениями Vim. Сокращения создаются в нормальном режиме: :ab th This 1s an example of a Vim abbreviation. Чтобы воспользоваться сокращением, переключитесь в режим вставки и введите символы th, за которыми следует пропуск (пробел, символ табуляции или возврат курсора). Просмотр списка всех сокращений: :ab Удаление сокращения: :unabbreviate th Удаление всех сокращений: :abclear Сокращения, как и все параметры конфигурации Vim, можно сохранять в файле -/•vim гс. Комментарий Сокращения могут использоваться для автоматического исправления орфографии (раздел 6.6) — просто определите свои стандартные ошибки в виде сокращений. Этот прием лучше всего подходит для исправления опечаток (например, teh вместо the). См. также Справочная система vim (:help map.txt); раздел 6.12.
6.11. Привязка команд к клавишам 89 6.11. Привязка команд к клавишам Проблема Некоторые команды Vim слишком длинны и сложны. Вы создали собственную коллекцию пользовательских команд и теперь хотели бы назначить комбинации клавиш для их вызова. Решение Команда тар связывает нажатия клавиш с произвольной командой или текстовой строкой в нормальном режиме; команда тар! определяет нажатия клавиш для режима вставки. Чтобы просмотреть текущие назначения, введите команду :тар или :тар! без параметров. ВНИМАНИЕ Будьте осторожны при создании собственных привязок — не используйте клавиши, с которыми в Vim уже связаны операции, поскольку команда тар выполнит ваше требование и заменит их, не сказав ни слова. Кстати говоря, по этой причине стоит сначала как следует освоить Vim, а уже потом приступать к экспериментам с привязкой. Новая привязка создается командой вида :map <F3> :runtime! syntax/2html.v1m Команда включает теги HTML в текущий документ в новом окне. Для ее активации будет использоваться клавиша F3. Удаление привязок осуществляется командой вида lunroap <F3> Имена клавиш Esc, <CR> и <F2>-<F12> приходится записывать в особом виде, потому что при простом нажатии клавиша выполнит ту команду, которай за ней закреплена. В следующем примере с клавишей F3 связывается команда, которая включает режим вставки, заключает слово между тегами HTM L и выходит из режима вставки, чтобы вы могли продолжить печать: :гоар <F3> i<BxEsc>ea</B><Esc>a Приведу несколько примеров привязок режима вставки для быстрого добавления тегов HTML. Они быстро работают, потому что выполняются без выхода из режима вставки. Маловероятно, чтобы такие комбинации запятых с буквами встретились в обычном тексте. :map! .ah <A href-""> :тар! .а </А> :тар! .b <B><Esc>ea</B><Esc>a :тар! .i <I><Esc>ea</IxEsc>a :тар! .1 <LI><Esc>ea</LI><Esc>a Комментарий Самыми безопасными для привязки являются клавиши F2-F12 и Shift+F2-F12. Но на практике они обычно быстро заканчиваются. Комбинации «запятая+буква»,
90 Глава 6. Редактирование текстовых файлов в JOE и Vim не встречающиеся в обычных текстах, позволяют создать столько привязок, сколько потребуется. Полная информация о встроенных привязках Vim выводится командой :help map-which-keys. Также можно запросить у Vim справку по конкретной клавише или комбинации: .•help CTRL-V .-help F5 rhelp /b Помните, что названия клавиш CTRL и F5 должны записываться; не нажимайте их на клавиатуре. См. также Справочная система vim (:help 2html.vim, rhelp key-mapping). 6.12. Настройка Vim Проблема При выходе из программы вся настройка теряется. Конечно, вам не хочется заново вводить все сокращения и привязки при запуске. Как настроить рабочую среду Vim с сохранением сокращений и нестандартных привязок? Решение Создайте файл -/.vimrc с нужными параметрами. Либо создайте файл заново, либо скопируйте и отредактируйте глобальный файл/etc/vim/vimrc. Что можно сохранить в файле -/.vimrc? Любые значения параметров Vim. Чтобы узнать имена всех параметров, введите команду :set all aleph=224 noarabic arabicshape noallowrevins noaltkeymap Затем посмотрите, что означает каждый параметр: :help noaltkeymap Следующая команда открывает информацию о параметрах в виде справочной страницы с гиперссылками: -.help options Комментарий Во время чтения документации Vim его гибкость и колоссальные возможности настройки производят огромный эффект. Начните с самого начала, как показано ниже, и не обращайте внимания на хитроумные возможности «для фанатов» до тех пор, пока они вам не потребуются.
6.13. Быстрое перемещение в Vim 91 В следующем примере файла ~/У)ттс продемонстрированы три важных возможности Vim: настройка параметров запуска, сокращений и клавиатурных привязок. Апостроф является признаком строки комментария. " Персональный файл vimrc. создан 4/22/2004 " и Отключение режима совместимости с vi и для использования всех возможностей Vim set nocompatible " 4 пробела на позицию табуляции set tabstop«4 " Расширенные возможности забоя set backspacedndent.eol.start " Выделение синтаксиса включено по умолчанию syntax on н Автоматическое определение типа фаШ " для выделения синтаксиса. filetype plugin Indent on Сокращения •I И И U II Н II И И И «I И «I И И II •• И II II И II II И И И И II II II II II II tl H II II II II II II II И II И И II :ab Qu Carl a Has Gone Fishing. Back Much Later :ab Co Copyright (c) 2004 Carla Schroder all rights reserved :ab Em carla0bratgrrl.com :ab Wb http://tuxcomputing.com " Добавление тегов HTML в режиме вставки :map! :map! :map! :map! :map! .ah <A href="n> .a </A> .b <B><Esc>ea</B><Esc>a .i <I><Esc>ea</I><Esc>a .1 <LI><Esc>ea</LIxEsc>a Все изменения, внесенные в -/• vimrc, вступают в силу при следующем запуске Vim. См. также vim(l); справочная система vim (:help vimrc, :help usr_05.txt, :help ab). 6.13. Быстрое перемещение в Vim Проблема Вы редактируете большой документ или несколько файлов одновременно, и вам приходится часто перемещаться туда-сюда между разными секциями. Но на перемещения уходит время, и вы постоянно сбиваетесь с текущей позиции. Решение Воспользуйтесь маркерами Vim для сохранения позиции курсора (по аналогии с книжными закладками).
92 Глава 6. Редактирование текстовых файлов в ЗОЕ и Vim Существуют 52 закладки: a-z и A-Z. В командном режиме установите курсор в нужную позицию и введите команду та Чтобы вернуться к маркеру, введите команду %а (Обратите внимание: апостроф обратный, а не прямой!) Маркеры нижнего регистра работают только в границах одного файла. Для перехода к другому файлу следует использовать маркеры верхнего регистра. Допустим, вы пометили позицию в файле configstuff.txt: п* Если теперь ввести команду % А в любом открытом файле или окне, Vim перейдет к отмеченной позиции configstuff.txt, открыв файл в случае необходимости. Маркеры верхнего регистра хранятся в файле -/•viminfo, поэтому они восстанавливаются в следующем сеансе. Нумерованные маркеры — удобная возможность Vim, которая не требует вмешательства с вашей стороны. В момент завершения работы Vim запоминает последнюю позицию курсора. При следующем запуске Vim можно вернуться к этой позиции командой См. также Справочная система vim (:help mark-motions, :help viminfo). 6.14. Сеансы Vim Проблема Вы работаете над большим проектом; работа прерывается на ночь. Хорошо бы сохранить все: параметры, привязки, открытые файлы, открытые окна, позицию и размер окон... словом, все, что обычно пропадает при завершении работы? Решение Нет проблем — создайте сеанс (session). Сеанс Vim сохраняет всю рабочую среду и восстанавливает ее в прежнем виде при следующем запуске сеанса. Достигнув точки, в которой вам хотелось бы сохранить свою рабочую среду, сохраните все открытые файлы, затем задайте имя сеанса: :wa11 rmksession myartlcle.vim В данном примере создается файл сеанса myarticle.vim. Чтобы вернуться к сохраненному сеансу, введите команду $ vim -S myartlcle.vim
6.14. Сеансы Vim 93 После работы в этом сеансе у вас есть два варианта. Либо сохраните все изменения под тем же именем: :mksession! myarticle.vlm либо организуйте доморощенный «контроль версии», сменив имя сеанса: :mksession myart1cle_rev2.vim Также возможно перейти к другому сеансу без завершения программы: iwall imksession! myart1cle_rev2.vim :source myarticle.vim У сеансов есть еще одно интересное применение: создайте идеальную рабочую среду и сохраните ее на будущее: $ vim :help AW w :vertical split /- Результат показан на рис. 6.1. *]i*lp. txt * fgi; via «rtf-bsc l.1. Laat change: ?GDi Sep 14 vth - Baln help file Have around: Use the cursor keys, ok "h" to go left, . "j" tc go dawnH "It" to go up, "1F to go right. Iclc-se this window: Use ■ :q*t;iLLet>" . Get out of via: ине " qa ккгииго" (careful, all changes are lost!», (Junp to a subject: Position the cursot on a teg bet»*en I Ln^t; | and hit u'TKL-l, Bith the muuse: "3set лючыг-** to enable the nonso (in xteru oj; GUIJ * I Double-click the left mouse button on a tug between lb««gl, jtatp bade; Тур* £'№i.-r or C^ftl-^ (repeat to go further bacJc). |Gtt specific help: It is poKsible to go directly to whatever you want help on, by giving an argument со the "rhelp" ccemand i-htiri* it is possible to further specify the context: к h 1 1 2 ■ esc 3 toe tflLytKsftrrJ short'eura F Sorted by пал* г .tar,- r Jiftpf .r*f'*itfrtSk# .«чЧс "* /h^ae/caria/ ../ .Abisuit.e/ .Liti-crity/ LactnbAt/ |-atiobg/ .1 J L kj^&^^M^^^i"^^^^^^ <-■■■ ■■ Рис. 6.1. Создание идеальной рабочей среды Увеличьте окно с деревом файлов и уменьшите окно справки, чтобы вам было удобно с ними работать. Команда *W w используется для переключения между окнами, а команда AW + (или -) — для изменения их размеров. Добившись идеального результата, сохраните конфигурацию командой :mksession 3pane.vim (рис. 6.2).
94 Глава 6. Редактирование текстовых файлов в ЗОЕ и Vim Sft«l'on Е« ^Vtew"efl6k3nen(t 'ДОВпр ' ^el^.tXL* foe V?.= vfcfii.^Hi *'-■ 1 Lfl^t change: ZQDI Sep 14 VIM - main help file Move abound: Uae the cursor keys, or -h* to go iett, "j" to 90 down. *fc* to go up 1 "1" to go right. Lu^ft tui^ wji.rtd.ow: Use "ici'.Lif^n^*. ^^^^ -J h 1 I !гада 7 foe keyboard shortcuts SWttHKl CfV ПОЛ? Abiauite/ Lin-city/ .Trash/ acrobat/ ...it- 1 be* aEtet^tep/ .aptitude/ avmV .hlackbcx/ .bluetiuh/ , designee/ .di*/ ,eoieifa/ .Chlpvele/ :. \^(Г$~№ё£ ^здш £^Re#.g^^^3teJi.NQ: & Рис. 6.2. Внесение изменений и сохранение сеанса Комментарий Файлы сеансов рекомендуется хранить в отдельном каталоге, чтобы их можно было легко найти при необходимости. См. также Справочная система vim (:help session, :help usr_08.txt). 6.15. Назначение редактора по умолчанию Проблема Некоторые программы (например, crontab и quota) используют редактор по умолчанию. Чаще всего им оказывается какое-нибудь убогое древнее страшилище, а вы стали поклонником Vim и JOE. Как назначить в качестве редактора по умолчанию ту программу, которая вам нравится? Решение Отредактируйте переменные окружения в файлах ~/«bashrc или ~/.bash_profile. Файл ~/»bashrc является предпочтительным, потому что он распространяется на
6.16. Определение параметров компиляции Vim 95 все экземпляры командного процессора, открытые во время сеанса. Содержимое файла ~/-bash_profile читается только во время входа в систему. Включите в ~/.bashrc следующие строки: EDITOR-vim VISUAL=SEDITOR export EDITOR VISUAL Разумеется, вы можете задать любой редактор по своему выбору. Обычно рекомендуется использовать консольные текстовые редакторы вроде JOE, Pico, Vim или Emacs. Также можно выбрать редактор X вроде Kwrite или GEdit, но учтите, что в некоторых ситуациях система X может быть недоступна, поэтому такой выбор подходит не всегда. Важно использовать обе переменные, VISUAL и EDITOR. Старое название VISUAL является пережитком прошлого, но некоторые программы по-прежнему используют его. Проследите за тем, чтобы файл -/.bashrc был включен в —/.bash_profile: # include .bashrc if it exists if [ -f -/.bashrc ]: then source -/.bashrc fi См. также bash(l). 6.16. Определение параметров компиляции Vim Проблема У вас возникли трудности с Vim. Похоже, некоторые возможности программы не были включены при компиляции. Как узнать, какие параметры использовались при компиляции Vim? Решение Запустите Vim и введите команду :version Команда выводит все параметры компиляции и местонахождение инициали- зационных файлов в системе. Комментарий Далее приводится упрощенный пример выходных данных :version. Знаком «+» помечены включенные возможности, а знаком «-» — отключенные. По этим данным можно легко определить, придется ли вам перекомпилировать Vim, чтобы использовать нужную возможность. :version VIM - Vi IMproved 6.2 (2003 Jun 1. compiled Apr 1 2004 23:39:33) Included patches: 1-298. 300-426
96 Глава 6. Редактирование текстовых файлов в ЗОЕ и Vim Compiled by Norbert Tretkowsky (nobse@debian.org) Big version with GTK2 GUI. Features included (+) or not (-): ♦arabic +autocmd +balloon_eval +browse «-+built1n_terms +byte_offset +cindent ♦clientserver -hanguljnput +iconv +insert_expand +jumplist system vimrc file: "SVIM/vimrc" user vimrc file: "SHOME/.vimrc" user exrc file: "SHOME/.exrc" system gvimrc file: "SVIM/gvimrc" user gvimrc file: HSHOME/.gvimrc" system menu file: "SVIMRUNTIME/menu.vim" fall-back for SVIM: 7usr/share/vimM Compilation: gcc -c -I. -Iproto -DHAVE+CONFIG_H -DFEAT GUI GTK -I/usr/include/gtk- 2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 См. также Справочная система vim (:help version).
Глава 7 Запуск и завершение работы Linux 7.1. Введение Существует множество способов запуска и остановки системы Linux. Также не стоит забывать о сценариях инициализации, управляющих запуском различных процессов, и о различных уровнях выполнения системы (runlevels), в каждом из которых может работать свой набор процессов. Выполните следующую команду: $ PS dXf} Найдите процесс с номером 1 (вывод сокращен, в вашей системе выходные данные команды будут содержать больше столбцов и строк): UID PID PPID STAT TTY TIME COMMAND О 1 О S ? 0:03 init Это init, предок всех процессов в системе Linux. Обратите внимание: идентификатор родительского процеса PPID (Parent Process JD) равен 0, потому что init является первым процессом, стартующим после запуска ядра. Процесс загрузки Linux проходит примерно так: 1. BIOS инициализирует оборудование и читает загрузочный сектор. 2. Главная загрузочная запись (MBR, Master Boot Record) запускает загрузчик операционной системы, который передает управление ядру. 3. Ядро инициализирует периферийные устройства, загружает драйверы, монтирует корневую файловую систему и вызывает /sbin/init. 4. Программа /sbin/init запускает все процессы пользовательского уровня. Она читает/etc/inittab и переходит к активизации дополнительных сценариев, указанных в /etc/inittab. 5. Дальнейшие действия зависят от дистрибутива. В Debian следующим выполняется сценарий /etc/inikd/rcS, который передает управление в каталог/etc/ rc*.d, указанный в /etc/inittab. По умолчанию Debian работает на уровне 2, поэтому выполняются все сценарии из каталога /etc/rc2.d (запуск в стиле SysV).
98 Глава 7. Запуск и завершение работы Linux В Red Hat следующим выполняется сценарий /etc/rc.d/rc.sysinit, а затем сценарии из каталога, соответствующего уровню выполнения (обычно/etc/rc3.d или /etc/rc5.d). Процедура запуска в Slackware ближе к процедуре запуска BS D: в системе имеется один каталог/etc/red, в котором находится сценарий init для каждого уровня выполнения. Впрочем, в ней также присутствуют некоторые аспекты SysV. В системах Red Hat и Debian каталоги /etc/rc\d содержат не стартовые сценарии, а символические ссылки на сценарии в /etc/init.d. Создание ссылок на основной каталог сценариев/etc/init.d предотвращает излишнее дублирование. Кроме того, имена ссылок определяют способ запуска служб. Для примера возьмем запись $ Is -go S20cupsys lrwxrwxrwx 1 16 Sep 9 17:51 S20cupsys -> . ./init.d/cupsys Префикс S20 означает, что служба cupsys должна запускаться с приоритетом 20. Чем ниже значение, тем выше приоритет. Запись K20cupsys означает, что служба должна быть «убита» (что поделаешь, мир Linux жесток). Этот простой механизм гарантирует, что службы запускаются и останавливаются так, как вам потребуется, и в правильном порядке. Уровни выполнения Стандартная схема уровней выполнения Linux: О 0 — остановка; О 1 — однопользовательский режим; О 2-5 — многопользовательский режим; О 6 — перезагрузка. Уровни выполнения в дистрибутивах Debian: О 0 —остановка; О 1 — однопользовательский режим; О 2-5 — многопользовательский режим; О 6 — перезагрузка. Уровни выполнения в дистрибутивах Red Hat: О 0 —остановка; о 1 — однопользовательский текстовый режим; О 2 — не используется (определяется пользователем); О 3 — многопользовательский текстовый режим; О 4 — не используется (определяется пользователем); О 5 — многопользовательский графический режим; О 6 — перезагрузка. Уровни выполнения в дистрибутивах Slackware: О 0 — остановка; О 1 — однопользовательский режим;
7.2. Смена уровня выполнения после загрузки 99 О 2 — не используется (то же, что 3); О 3 — многопользовательский текстовый режим; О 4 — многопользовательский графический режим; о 5 — не используется (то же, что 3); О 6 — перезагрузка. В других дистрибутивах могут существовать другие варианты. Уровни 7-9 теоретически существуют, но на практике не используются. Чтобы понять, что происходит на каждом уровне, достаточно прочитать каталоги rc*.d. 7.2. Смена уровня выполнения после загрузки Проблема Где-то в процессе установки системы Linux вы выбрали «загрузку в текстовом режиме» или «загрузку в графическом режиме». Возможно, вы не до конца понимали, что означают эти режимы — а может, понимали, но теперь вам нужен графический интерфейс вместо скучной текстовой консоли. А может, у вас возникли проблемы с графическим интерфейсом, и теперь вы хотите перейти на уровень с минимальным набором служб для диагностики. Решение Используйте init. Сначала проверьте текущий уровень выполнения: # /sbin/runlevel N 5 «N» означает, что уровень после загрузки не изменялся. Если бы это произошло, то в выходных данных отображался бы исходный уровень. Для смены уровня выполнения необходимо обладать правами root: # /sbin/init 3 Команда останавливает все службы уровня 5 и запускает службы уровня 3. Происходящее напоминает «частичную перезагрузку». Все пользователи принудительно выводятся из системы. При решении особо серьезных проблем иногда требуется переключиться на уровень 1: # /sbin/init 10 Команда останавливает X и переводит вас в командный процессор с правами root, с ограниченным набором служб и без X. В Red Hat после спуска на уровень 1 не нужно вводить пароль root, поэтому не предоставляйте доступ к init sudo-пользо- вателям. Комментарий В Red Hat, Fedora, Mandrake и Slackware смена уровня выполнения является одним из способов закрытия сеанса X, так как на уровне 3 загружается текстовая
100 Глава 7. Запуск и завершение работы Linux консоль. Тем не менее это весьма радикальный способ, поскольку он останавливает и перезапускает все службы и выводит из системы всех текущих пользователей. Зачем изменять уровень выполнения при помощи init? Возможны разные причины: О переход на уровень 1 для диагностики и восстановления; о остановка и перезапуск системы в ситуации, когда обычные способы не работают; О перезапуск всех служб или переход на другой набор служб. «Неправильные» причины: о переход от сеанса текстовой консоли к сеансу X. Однако команда init должна выполняться с правами root, а запускать сеанс X с правами root не рекомендуется: это небезопасно, а любые случайные ошибки могут нарушить работоспособность системы; О завершение сеанса X. Как будет показано в разделе 7.4, для перехода между сеансами X и консольными сеансами существуют другие, более правильные способы. Также можно воспользоваться командой telinit, которая представляет собой жесткую ссылку на init: $ Is -al /sbin/telinit lrwxrwxrwx 1 root root 4 Oct 31 07:51 /sb1n/telinit -> init См. также init(8); раздел 7.4. 7.3. Смена уровня выполнения по умолчанию Проблема Вас не устраивает уровень выполнения, в котором загружается система, и вы хотите сменить его. Предположим, вы хотите загрузиться в текстовом режиме вместо графического интерфейса. А может быть, вы настроили разные уровни выполнения на запуск разных наборов служб и после должного тестирования и настройки готовы выбрать уровень по умолчанию. Решение Откройте файл /etc/inittab и найдите следующую запись: # Уровень выполнения по умолчанию id:2:1nitdefau1t: Просто замените 2 другой цифрой (кроме 0 или 6). Если вы предпочитаете иметь свободу выбора на стадии загрузки, закомментируйте строку id:X:initdefault. Init предложит выбрать уровень выполнения во время загрузки.
7.4. Запуск и остановка X 101 Комментарий В Debian стандартные уровни выполнения 2-5 не отличаются друг от друга; они загружают либо текстовую консоль, либо графическую программу входа в систему в зависимости от того, что было выбрано во время установки. Уровень выполнения 2 используется в Debian по умолчанию. Изменение конфигурации уровней выполнения Debian рассматривается в разделе 7.5. См. также inittab(5); раздел 7.5. # 7.4. Запуск и остановка X Проблема Вам не нравится менять уровень выполнения только для завершения сеанса X — ведь это приводит к перезапуску всех служб и нарушению работы всех пользователей, вошедших в систему. Как лучше завершить сеанс X? Решение Существует несколько способов. Лучше всего настроить один уровень выполнения на загрузку текстовой консоли, а затем запустить X в нужный момент командой startx: $ startx После этого простой выход из сеанса X будет приводить к завершению X. Вы не будете выходить из Linux, только из X. Во многих дистрибутивах на уровне 3 загружается текстовая консоль. В Red Hat, Fedora, Mandrake и SuSE на уровне 5 загружается графическая программа входа в систему. В Slackware это делается на уровне 4. Возможно, пользователям Debian придется предпринять дополнительные действия, потому что в Debian уровни 2-5 идентичны. Настройка уровней выполнения в Debian рассматривается в разделе 7.6. Комментарий Другие способы завершения сеансов X лучше подходят для «зависания» X. Любой пользователь может ввести команду «xkill» нажатием клавиш Ctrl+Alt+ ♦Backspace. В графических программах входа в систему (xdm, kdm или gdm) пользователь root может прервать работу программы. Это автоматически прервет работу всех пользователей: # /etc/init.d/gdm stop См. также Раздел «Введение» настоящей главы; раздел 7.3; раздел 7.6.
102 Глава 7. Запуск и завершение работы Linux 7.5. Управление уровнями выполнения в Debian Проблема Требуется выбрать службы, запускающиеся при загрузке системы Debian, на каждом уровне выполнения. При установке новых служб (таких, как Apache, Exim или OpenSSH) Debian настраивает их на запуск при загрузке. Но пока тестирование еще не завершено, вы предпочитаете запускать и останавливать их вручную. А может быть, во время тестирования на разных уровнях должны стартовать разные службы. Решение Воспользуйтесь командой update-rc.d. В следующем примере на уровне 5 добавляется новая служба KDE Display Manager. Kdm — имя запускаемого файла в /etc/init.d. Список уровней выполнения должен завершаться точкой: # update-rc.d kdm start 99 5 . stop 01 0 1 2 3 4 б . Следующая команда удаляет службу на всех уровнях выполнения. Удаление не может быть избирательным; удаляется либо всех, либо ничего. # update-rc.d -f kdm remove Изменение уровня выполнения для существующей службы производится в два этапа: сначала удалите службу, а затем добавьте ее на нужных уровнях. Обязательно создайте записи для всех служб на всех уровнях, как для запуска, так и для остановки. Комментарий Помните, что update-rc.d работает с именами сценариев в/etc/init.d. Для тестирования команд update-rc.d используется ключ -п: # update-rc.d -f -n kdm remove При необходимости можно удалить сценарии из initd при помощи ключа remove: # update-rc.d --purge kdm remove Но обычно лучше оставить их на случай, если они понадобятся в будущем. См. также update-rc.d(8). 7.6. Создание уровней выполнения с текстовым и графическим входом в Debian Проблема В Debian загружается графическая программа входа в систему. Вы хотите, чтобы на уровне 3 загружалась текстовая консоль, а на уровне 5 — графическая программа.
7.6, Создание уровней выполнения с текстовым и графическим входом в Debian 103 Решение Сначала узнайте, какой экранный менеджер используется в вашей системе, после чего вы добавьте или удалите его на соответствующих уровнях. Проверка выполняется так: $ ps ax | grep dm 537 ? S 0:00 /usr/bin/kdm 544 ? S< 0:10 /usr/XHR6/b1n/X :0 -dpi 100 -nolisten tcp vt7 -auth /var/ lib/kdm/A:0-PbCldj В системе работает kdm, экранный менеджер К. Сначала удалите его на всех уровнях: # update-red -f kdm remove update-rc.d: /etc/in1t.d/kdm exists during red purge (continuing) Removing any system startup links for /etc/init.d/kdm ... /etc/rcO.d/KOlkdm /etc/rcl.d/KQlkdm /etc/rc2.d/S99kdm /etc/rc3.d/S99kdm /etc/rc4.d/S99kdm /etc/rc5.d/S99kdm /etc/rc6.d/K01kdm Обеспечьте запуск kdm на 5 уровне и его остановку на остальных уровнях: # update-rc.d kdm start 99 5 . stop 01 1 2 3 4 6 . Adding system startup for /etc/init.d/kdm ... /etc/rcO.d/KOlkdm -> . ./init.d/kdm /etc/rcl.d/K01kdm -> ../init.d/kdm /etc/rc2.d/K01kdm -> ../init.d/kdm /etc/rc3.d/K01kdm -> ../init.d/kdm /etc/rc4.d/K01kdm -> ../init.d/kdm /etc/rc5.d/K01kdm -> ../init.d/kdm /etc/rc6.d/S99kdm -> ../init.d/kdm Очень важно, чтобы для каждого уровня существовала запись, которая бы явно запускала или останавливала каждую службу. Приоритет всегда состоит из двух цифр; 99 — наименьший приоритет. Наконец, отредактируйте файл /etc/inittab так, чтобы выбранный уровень использовался по умолчанию: # Уровень выполнения по умолчанию id:3:initdefault: Новый уровень вступает в силу после перезагрузки. Если закомментировать эту строку, вам будет предложено выбрать уровень выполнения во время загрузки. Комментарий В Gnome используется экранный менеджер gdm, в X — xdm, а в KDE — kdm. Довольно часто встречаются системы, в которых установлены все три программы. Xdm обладает минимальной функциональностью; в сущности, программа всего лишь предоставляет графическое окно входа. И kdm, и gdm поддерживают ряд дополнительных возможностей входа и завершения работы, включая меню для выбора оконного менеджера.
104 Глава 7. Запуск и завершение работы Linux См. также Update-rc.d(8); раздел 7.3; справочное руководство Debian (http://qref.sourceforge.net); раздел «Введение» настоящей главы. 7.7. Управление уровнями выполнения в Red Hat Проблема Если не потратить некоторое время на настройку конфигурации, Red Hat/Fedora обычно запускает множество всевозможных служб при загрузке. Если вы пошли по простому пути, вероятно, у вас в системе работает немало служб, которые бы вы предпочли закрыть. А может, вы предпочитаете запускать разные службы на разных уровнях выполнения с целью тестирования и настройки. Решение Воспользуйтесь программой chkconfig. Пример настройки ssh: # chkconfig -level 2345 ssh on # chkconfig •-level 016 ssh off Вы должны выполнить обе операции — определить, на каких уровнях служба должна запускаться и на каких уровнях она работать не должна. «On» означает запуск, a «off» — отключение службы. Добавление новой службы на всех уровнях выполнения: # chkconfig --add ssh Удаление службы на всех уровнях выполнения: # chkconfig •-del ssh Со службами xinetd дело обстоит несколько иначе, но для управления ими также используется chkconfig: # chkconfig ktalk on # chkconfig rsync off Службы xinetd либо работают, либо нет; они не различаются по уровням. Вывод информации о состоянии всех служб на всех уровнях, включая службы xinetd: # cnkconfig --list anacron 0:off l:off 2:on 3:on 4:on 5:on 6:off syslog 0:off l:off 2:on 3:on 4:on 5:on 6:off cups Oroff l:off 2:on 3:on 4:on 5:on 6:off apmd Oroff l:off 2:on 3:on 4:on 5:on 6:off xinetd based services: chargen-udp off rsync: off sgi-fam: on Вывод информации об отдельной службе: # chkconfig --list syslog syslog 0:off l:off 2:on 3:on 4:on 5:on 6:off
7.8. Ручная настройка служб; запускаемых при загрузке 105 Комментарий Утилита chkconfig берет начальный приоритет и уровень выполнения из стартового сценария программы. Например, в файле /etc/rc.d/init.d/cups присутствует следующий фрагмент: # Информация Linux chkconfig # chkconfig 2345 90 10 Он означает, что chkconfig запускается на уровнях 2, 3,4 и 5, с приоритетом 90 для запуска и приоритетом 10 для остановки. Конечно, вы можете изменить эти параметры по своему усмотрению. Либо отредактируйте исходный сценарий из init.d, либо просто переименуйте ссылки: # mv /etc/rc.d/rc3.d/S90cups /etc/rc.d/rc3.d/S45cups См. также chkconfig(8); The Red Hat Customization Guide (http://www.redhat.com/docs/manuals/ linux/). 7.8. Ручная настройка служб, запускаемых при загрузке Проблема Требуется вручную настроить службы, запускаемые при загрузке системы. Возможно, вам не нравятся средства, входящие в ваш дистрибутив Linux, или вы работаете в минимальной системе, не содержащей вспомогательных программ, или считаете, что использование хитроумных средств вроде update-rc.d для управления уровнями выполнения не оправдано. Решение Создайте ссылки в каталогах /rc*.d командой In. Удалите ссылки для тех служб, которые не будут использоваться. Например, ссылка для запуска CUPS на уровне 3 создается так: # In -s /etc/rc.d/1nit.d/cups /etc/rc.d/rc3.d/S90cups Повторите для каждого уровня выполнения. Не забудьте создать ссылки для отключения службы: # In -s /etc/rc.d/init.d/cups /etc/rc.d/rcO.d/KOlcups Приоритет задается в интервале 1-99. Наличие процессов с одинаковыми приоритетами не создает проблем; на практике чаще всего встречается приоритет 20. Обычно приоритеты не столь важны, но некоторые функции (например, фильтрация пакетов и ведение журналов) должны обладать приоритетами 1—10 для раннего запуска и 80 и выше для позднего завершения. Также обратите внимание на последовательность запуска. Например, поддержка сети должна запускаться раньше служб, зависящих от работы сети.
106 Глава 7. Запуск и завершение работы Linux Комментарий Этот способ настройки чуть более трудоемок, но ничего страшного не происходит — вы просто создаете «мягкие» ссылки. Помните, что для каждой запускаемой службы также необходимо создать записи, которые будут останавливать ее на всех уровнях выполнения, на которых она не должна работать. Кроме того, некоторые службы на уровнях 0, 1 и 6 «убивать» не следует, поскольку это важные системные службы, создаваемые Linux. Сохраните информацию о таких службах, прежде чем вносить какие-либо изменения: $ Is /etc/rcO.d /etc/rcl.d /etc/rc6.d > orig1nal-runlevels.txt На уровнях 2-5 можно делать все, что угодно, но будьте внимательны и не испортите другие уровни. См. также 1п(1). 7.9. Ручная остановка и запуск служб Проблема Требуется запустить, остановить или перезапустить службу, но вам не хотелось бы делать эти изменения постоянными. Может быть, произошел сбой в работе сети, или «умер» веб-сервер, или вы изменили конфигурационный файл службы и хотите перезапустить ее, чтобы изменения вступили в силу. А может, вы тестируете новую службу и хотите запускать ее только тогда, когда потребуется. Решение Запустите стартовый сценарий программы в im't.d с соответствующими параметрами. Найдите сценарий, прочитайте его и просмотрите состав поддерживаемых параметров. Например, на практике часто выполняется операция перезапуска сетевой поддержки. В файле/etc/init.d/networking присутствует следующая команда: echo "Usage: /etc/init.d/networking {start|stop|restart|force-reload}" Подобная строка присутствует в каждом сценарии init. Нужную информацию также можно получить, запустив сценарий без аргументов: # /etc/1nit.d/network1ng Usage: /etc/init.d/networking {start)stop|restart|force-reload} Таким образом, остановка службы поддержки сети осуществляется командой # /etc/1nit.d/networking stop Комментарий Для любой программы, имеющей стартовый сценарий, рекомендуется использовать сценарий вместо запуска двоичного файла программы, потому что в сцена-
7.10. Выключение компьютера или перезагрузка Linux 107 рии реализована обработка ошибок и проверка файлов, а также все необходимые условные проверки. 7.10. Выключение компьютера или перезагрузка Linux Проблема Только посмотрите, сколько существует способов выключения и перезагрузки: shutdown, halt, init 0, poweroff, Ctrl+Alt+Delete... Каким из них лучше пользоваться? Решение Выбор не столь существенен; используйте тот способ, который вам больше подходит. Следующие команды выключения могут использоваться только привилегированным пользователем root: # shutdown -h now или # poweroff или #halt Выключение через шесть минут: # shutdown -h +6 Команда shutdown рассылает оповещения всем подключенным пользователям. Вы можете указать собственный текст: # shutdown -h +6 "Time to stop working and start partying." Консольные пользователи увидят следующее сообщение: Broadcast message from root (pts/6) Wed Aug 14 13:51:24 2003 Time to stop working and start partying. The system is going DOWN for system halt on 6 minutes! Чтобы отменить выключение компьютера, выполните следующую команду с правами root: # shutdown -с Перезагрузка выполняется командой # shutdown -r now или # reboot или нажатием Ctrl+Alt+Delete. Любой пользователь может перезагрузить компьютер, если только не отключить данную возможность в /etc/inittab (в разделе 7.11 рассказано, как запретить перезагрузку или предоставить разрешение конкретным пользователям).
108 Глава 7. Запуск и завершение работы Linux Комментарий Помните, что процесс выключения всегда должен быть контролируемым. Всем компьютерам, в том числе и машинам с системой Linux, приходится проделать немалый объем работы, чтобы питание можно было безопасно выключить. Система должна завершить работу служб, демонтировать файловые системы и сбросить буферы на диск. Команды shutdown, poweroff и halt выполняются только привилегированным пользователем root. Ограничение выглядит довольно глупо, потому что у любого оконного менеджера и среды настольной системы имеется собственное меню выключения, а любой пользователь, находящийся поблизости от компьютера, может нажать кнопку питания. Но такова жизнь, и с этим приходится смириться. Возможный выход — предоставить ограниченные привилегии для выполнения команд выключения командой sudo. Другое решение основано на создании специальной группы пользователей, которым разрешено выключение. См. также shutdown(8), poweroff(8); раздел 8.20; раздел 8.21. 7.11. Запрет или ограничение доступа к Ctrl+Alt+Delete Проблема Всем известно, что комбинация клавиш Ctrl+Alt+Delete перезагружает компьютер. Но хотите ли вы этого? С точки зрения безопасности машина становится уязвимой во время перезагрузки, тогда как перезагрузка может быть выполнена любым пользователем, имеющим доступ к клавиатуре. Исходя из этих соображений, возможно, вы предпочтете либо полностью запретить перезагрузку компьютера клавишами Ctrl+Alt+Delete, либо ограничить ее некоторыми пользователями. Решение Чтобы полностью запретить перезагрузку по Ctrl+Alt+Delete, закомментируйте следующую строку в /etc/imttab: # са:12345:Ctrlaltdel:/sbin/shutdown -tl -г now Чтобы разрешить ее отдельным пользователям, включите в командную строку ключ -а: ca:12345:ctrlaltdel:/sbin/shutdown -tl -a -r now Затем перечислите пользователей, которым разрешено выполнять перезагрузку, в файле /etc/shutdown.allow. Комментарий Если файл /etc/shutdown.allow не существует, создайте его.
7.12. Автоматическое выключение компьютера 109 См. также shutdown(8). 7.12. Автоматическое выключение компьютера Проблема Пользователи по беспечности забывают выключать свои компьютеры на ночь. А может быть, вы думаете, что ваш компьютер должен выключаться ночью сам по себе, чтобы вы могли просто уйти по своим делам и не беспокоиться о нем. Решение Благодаря сгоп задача решается элементарно просто. Включите следующий фрагмент в /etc/crontab, чтобы компьютер автоматически выключался каждую ночь в 23:00: # m h dom mon dow user command 00 23 * * * root /sbin/shutdown -h now Комментарий Файл /etc/crontab идеально подходит для планировки простых заданий. Обратите внимание: в файле имеется поле имени, поэтому любой пользователь может создавать в нем свои записи. Тем не менее редактирование файла/etc/crontab разрешается только пользователю root. Другой способ основан на использовании команды crontab: # crontab -u root -e Команда открывает файл crontab для пользователя root; отредактируйте и сохраните его. Не пытайтесь задать имя файла — в процессе редактирования файл является временным, а его имя автоматически задается crontab при сохранении. Файл сохраняется в каталоге /var/spool/cron/crontabs. См. также cron(8), crontab(l), crontab(S).
Глава 8 Управление пользователями и группами 8.1. Введение В системе Linux как «живым» пользователям, так и системным процессам назначаются учетные записи (accounts), необходимые для управления привилегиями и правилами доступа. Запомните два важнейших принципа безопасности Linux. 1. Всегда используйте минимальный уровень привилегий, необходимый для выполнения работы. 2. Используйте сильные пароли. Соблюдение этих двух принципов избавит вас от многочисленных огорчений и неудач. В Linux входит набор утилит для выполнения операций с пользователями и группами: useradd, groupadd, userdel, groupdel, usermod, groupmod, passwd, chfn и chsh. Они входят в семейство «Shadow Suite», разработанное Джулианом Фрэнсисом Хо (Julianne Frances Haugh) для улучшения защиты паролей и упрощения операций управления учетными записями. Когда-то все файлы приходилось редактировать по отдельности, а шифрованные пароли хранились в файле /etc/passwd. Но поскольку файл /etc/passwd должен оставаться доступным для чтения, хранение паролей в нем, пусть даже в зашифрованном виде, чревато потенциальными неприятностями. Скопировав этот файл, любой желающий теоретически сможет вычислить пароли. Перемещение зашифрованных паролей в файл /etc/shadow, доступный только для привилегированного пользователя root, создает полезный дополнительный уровень защиты. Команда useradd по-разному работает в разных системах. Традиционно она включала всех новых пользователей в одну группу users(lOO). Все домашние каталоги становились общедоступными, потому что все пользователи принадлежали к одной группе. В Red Hat эта схема была заменена схемой «User Privacy Group». Команда useradd в Red Hat создает для каждого нового пользователя приватную группу, идентификатор которой (GID) совпадает с идентификатором пользователя (UID). Разумеется, разные пользователи обладают разными потребностями; некоторые из них могут предпочесть, чтобы их каталоги были открытыми. Фун-
8,2, Отделение обычных пользователей от системных 111 даменталъный принцип безопасности гласит: «сначала все запретить, потом разрешать по мере необходимости». Adduser и addgroup, сценарные Perl-обертки для команд useradd и groupadd, появились относительно недавно. Эти сценарии полностью руководят вашими действиями при создании нового пользователя. Они очень удобны для создания отдельных учетных записей, но не для серийных (batch) операций (разве что если вы самостоятельно внесете изменения в сценарии adduser и addgroup). В разделе 8.17 приведен сценарий для серийного создания новых пользователей и изменения паролей. 8.2. Отделение обычных пользователей от системных Проблема В любой системе Linux, наряду с учетными записями обычных пользователей, существуют системные учетные записи (root, uucp, daemon и т. д.). В файле /etc/ passwd эти две категории не отделяются друг от друга. Как отделить учетные записи «живых» пользователей от системных учетных записей? Решение Воспользуйтесь схемой нумерации идентификаторов пользователей в Linux (UID) и возможностью сортировки по полям или столбцам в awk. Пример для системы на базе Debian или Slackware: $ awk -F: '$3 > 999 { print $0}' /etc/passwd nobody:x:65534:65534:nobody:/nonexi stent:/bi n/sh carl a:x:1000:1000::/home/carl a:/bin/bash foober:x:1001:1001::/home/test:/bi n/fal se bitchkat:x:1002:1002::/home/test2/:bin/bash col by:x:1003:1003::/home/test3:/bi n/bash Отображение подмножества записей: $ awk -F: Ч$3 >- 1000) && ($3 <- 1005) { print $0}' /etc/passwd Для систем Red Hat и SuSE: $ awk -F: '$3 > 499 { print $0}' /etc/passwd Алфавитная сортировка результата: $ awk -F: '$3 > 499 { print $0}' /etc/passwd | sort Описанный прием особенно удобен тогда, когда схему нумерации UID в группах удается спроектировать заранее. Например: О Trainers 1000-1100; О Coaches 1101-1200; О Players 1200-2000. Если вы будете придерживаться подобной схемы, в вашем распоряжении появится простой инструмент для сортировки пользователей и их последующего разбиения на группы.
112 Глава 8. Управление пользователями и группами Комментарий Схемы нумерации (вроде представленного ранее примера «Trainers/Coaches/ Players») хорошо подходят для небольшой и относительно статичной пользовательской базы. В больших организациях с частыми изменениями они приносят больше вреда, чем пользы. В таких ситуациях лучше направить усилия на правильное распределение пользователей по группам и своевременное внесение изменений. Как всегда, между дистрибутивами существуют мелкие, но любопытные различия. Коды UID и GID во всех версиях Linux лежат в интервале от 0 до 65534. Debian: о 0-99 — системные учетные записи; О 100-999 — установленные пользователем программы и демоны (Postfix, Fetch- mail, gdm, dictd и т. д.); О 1000-29999 — учетные записи обычных пользователей; О 30000-65533 — согласно документации Debian, коды зарезервированы, но при желании вы можете их использовать; О 65534 — пользователь nobody, учетная запись без прав и разрешений. Red Hat: О 0-499 — коды зарезервированы для системного использования; О 500-60000 — обычные пользователи; О 65534 — пользователь nobody, учетная запись без прав и разрешений. В других дистрибутивах используются аналогичные схемы нумерации. Экспериментируйте с диапазонами, зарезервированными для учетных записей обычных пользователей, но не трогайте системные диапазоны. См. также awk(l); раздел 8.17; Debian Policy Manual, глава 9.2.2 (http://www.debian.org/doc/ debian-policy/); Red Hat Linux Reference Pocket Guide (http://www.redhat.com/docs/ manuals/linux/). 8.3. Определение кодов UID и GID Проблема Требуется быстро узнать код UID пользователя и выяснить, к каким группам он принадлежит. Решение Воспользуйтесь командой id: $ id carla uid=1000(carla) gid-lOOO(carla)
8.4. Создание учетной записи пользователя командой useradd 113 groups-l000(carld).20(dia1out).24(cdrom).25(noppy).29(audio),30(dip),44(v1deo). 105(windows).432(usb).1001(cdrecording) Комментарий Ключи команды id: О -и — вывод только кодов U1D; О -д — вывод только кодов GID; о -gn — вывод имени первичной группы пользователя вместо GID. См. также id(i). 8.4. Создание учетной записи пользователя командой useradd Проблема Требуется добавить новых пользователей в систему Linux. Решение Воспользуйтесь командой useradd -m для создания имени пользователя, его домашнего каталога и других переменных окружения; затем назначьте пароль командой passwd -е. До создания пароля учетная запись остается неактивной. Далее приводится простейший вариант вызова. С флагом -т команда создает домашний каталог и копирует в него файлы из /etc/skel: # useradd -m имя_попьзователя Как правило, в команду также включается полное имя пользователя с флагом -с (Comment, то есть «комментарий»). Поставьте четыре запятые после имени пользователя, чтобы остальные поля комментария (рабочий телефон и т. д.) остались пустыми. # useradd -m -с Grace Hopper,,., ghopper Имя пользователя должно быть уникальным. Теперь выполните команду passwd -е. Флаг -е означает, что пароль становится недействительным после первого входа, что заставляет пользователя сменить его: # passwd -е ghopper Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Окружение пользователя формируется на основании стандартного содержимого/etc/default/useradd и/etc/skel. Конфигурация useradd по умолчанию отображается командой # useradd -D
114 Глава 8. Управление пользователями и группами Любые значения по умолчанию могут переопределяться в командной строке — например, UID и командный процессор: # useradd -u 1500 -s tcsh ghopper Также существует возможность расширения стандартной конфигурации — например, включить пользователя в дополнительные группы: # useradd -G users.cdrecord.dialout ghopper Комментарий Useradd, в отличие от своего родственника adduser, прекрасно работает в сценариях (например, в сценарии mass_useradd из раздела 8.17). Поля комментария также известны под названием данных GECOS. Данные GECOS состоят из пяти полей, разделенных запятыми. Если вы собираетесь использовать поле комментария, включите все четыре запятые, даже если значения соответствующих атрибутов не указываются. В долгосрочной перспективе это окупится, особенно при выполнении серийных операций и при поиске. Традиционно в данные GECOS входит полное имя, номер комнаты, рабочий телефон, домашний телефон и прочее (произвольная информация). Полное имя используется многими внешними программами — в частности, почтовыми серверами, однако другие поля можно использовать так, как вы сочтете нужным. Например, они позволяют организовать произвольное деление пользователей на группы и их сортировку (см. раздел 8.19). GECOS — пыльный пережиток прошлого, оставшийся с очень древних времен; сокращение означает «General Electric Compliant Operating System». За полной информацией обращайтесь к Файлу жаргона. См. также useradd(8); Файл жаргона (http://www.catb.org/-esr/jargon/). 8.5. Создание учетной записи пользователя командой adduser Проблема Вы предпочитаете использовать adduser вместо useradd, потому что эта команда помогает ввести все данные конфигурации нового пользователя — пароль, данные GECOS и т. д. Решение Введите команду adduser имя пользователя и введите запрашиваемые данные: # adduser anitab Adding user anitab... Adding new group anitab (1008). Adding new user anitab (1008) with group anitab.
8.6. Изменение учетной записи пользователя 115 Creating new home directory /home/anitab. Copying files from /etc/skel Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for anitab Enter the new value, or press ENTER for the default Full name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct [y/n] у В командной строке adduser можно указать код UID, переопределяя значение по умолчанию: # adduser --uid 1500 anitab Стандартная конфигурация adduser задается в файле/etc/adduser.conf. Комментарий Полное имя является единственным важным атрибутом информации о пользователе. Оно необходимо любой внешней программе, работающей с /etc/passwd, — например, почтовому серверу. И хотите — верьте, хотите — нет, но в большинстве версий Linux по-прежнему продолжает существовать finger: $ finger anitab Login: anitab Name: Directory: /home/anitab Shell: /bin/bash On since Sun May 30 08:46 (PDT) on ttyl 10 hours 55 minutes idle (messages off) No mail. No plan. Phone 555-5555 Office Fooo Другие поля могут содержать произвольную информацию. В частности, они могут использоваться для хранения заметок или группировки. Пользователь может сменить свой номер комнаты и рабочий телефон командой chfn, но изменить полное имя и поле «прочее» ему не удастся. См. также adduser(8), adduser.conf(5), finger(l). 8.6. Изменение учетной записи пользователя Проблема Требуется внести изменения в существующую учетную запись — например, сменить имя пользователя или UID, обновить данные GECOS или домашний каталог.
116 Глава 8. Управление пользователями и группами Решение Воспользуйтесь командами usermod и chfn. Изменять можно любые атрибуты, включая имя пользователя и код UID. Чтобы сменить имя, сначала укажите новое имя, а затем старое: # usermod -I aborg anitab Следующая команда изменяет UID (в следующем примере исходное значение 1050 меняется на 1200) без изменения имени пользователя. Сначала указывается новый код UID, затем имя: # usermod -u 1200 anitab Принадлежность пользователя к группам не изменяется. Все файлы в домашнем каталоге пользователя автоматически обновляются новым кодом UID. Тем не менее вам придется вручную найти и изменить все файлы за пределами домашнего каталога (crontab, почтовые каталоги, временные файлы /tmp и файлы в общих каталогах). Для поиска файлов можно воспользоваться командой find с указанием исходного кода U1D, если вы хотите просмотреть список файлов перед внесением изменений: # find / -u1d 1050 /usr/src/include/1ber.h /usr/src/include/1dap.h /usr/src/include/ldbm.h Смена владельца файлов осуществляется командой chown: # chown 1200 /usr/scr/1nclude/1ber.h Последовательная смена владельца для каждого файла — занятие довольно утомительное. Команды chown и find могут выполнить эту работу за вас: # find / -uid 1050 -exec chown -v 1200 {} \: changed owner of •/usr/src/include/lber.h' to 1200 changed owner of 7usr/src/include/ldap.h' to 1200 changed owner of 7usr/src/inc^ude/1dbm.h, to 1200 Следующая команда перемещает домашний каталог пользователя со всем содержимым. Если новый каталог не существует, он автоматически создается. Сначала указывается новый каталог, а затем имя пользователя. Обязательно используйте флаги -d и -т: # usermod -d /serverl/home/aborg/ -m aborg Изменение данных GECOS: # chfn aborg Пользователь может передать при вызове chfn данные GECOS по своему усмотрению. Исключение составляют два поля: полное имя и «прочее». Содержимое этих полей может редактироваться только суперпользователем. Комментарий Постарайтесь обойтись без изменения имени пользователя и кода UID, поскольку такое изменение будет иметь общесистемные последствия. Если изменение все же неизбежно, не забудьте отыскать все файлы, принадлежащие пользователю, смените имя в домашнем каталоге пользователя и обновите данные о принадлежности к группам.
8.7. Удаление пользователя 117 Если заменить ключ -exec на -ok, команда find будет запрашивать подтверждение каждого изменения: # find / -uid 1050 -ok chown -v 1200 {} V. Трудно переоценить удобство такого применения find. Ключ -exec или -ok приказывает find выполнить следующую команду. Последовательность {} заменяется именем текущего файла. Точка с запятой указывает, где завершается команда chown, а символ \ «экранирует» точку с запятой, чтобы она не была обработана командным процессором. См. также usermod(8), chfn(l); Файл жаргона (http://www.catb.org/-esr/jargon/). 8.7. Удаление пользователя Проблема Требуется удалить из системы учетную запись пользователя и найти все файлы, принадлежащие этому пользователю. Решение Учетная запись удаляется командой userdel. Поиск файлов» принадлежащих пользователю, осуществляется командой find. Удаление учетной записи: # userdel aborg Чтобы команда userdel сработала, пользователь не может находиться в системе, и под его именем не должны быть запущены процессы. Команда userdel удаляет данные пользователя из всех системных файлов (/ etc/passwd, /etc/shadow, /etc/group), но не трогает файлы, принадлежащие этому пользователю. Чтобы удалить домашний каталог пользователя и почтовый ящик, добавьте флаг -г: # userdel -г aborg Другие файлы (такие, как crontab и файлы данных вне домашнего каталога) приходится искать отдельно: # find / -uid 1200 Комментарий Правила удаления учетной записи — дело тонкое. Если вы работаете в своей домашней системе, делайте, что хотите. В коммерческих системах заранее изучите политику своей компании. Всегда полезно сначала заблокировать учетную запись работника и создать резервную копию принадлежащих ему файлов. См. также userdel(8), find(l); раздел 8.9.
118 Глава 8. Управление пользователями и группами 8.8. Простое завершение процессов Проблема Требуется удалить учетную запись пользователя из системы, но команда userdel сообщает, что в системе выполняются некоторые процессы удаляемого пользователя. Вам хотелось бы найти и остановить все процессы этого пользователя одной командой. Решение Воспользуйтесь программой slay: # slay foober slay: -KILL is kicking foober's butt! slay: Whoa. I have the power supreme. Программа slay находит и уничтожает все процессы указанного пользователя, благодаря чему вам не приходится искать и завершать их самостоятельно. Комментарий Традиционный метод поиска процессов, принадлежащих пользователю, основан на использовании команды ps: $ ps U 1007 или $ ps U foober 3936 ? S 0:00 xchat 3987 ? S 0:00 /usr/lib/galeon-bin 4209 ? S 0:00 kdeinit: kio_file file /tmp/ksocket-carla/ klauncherkF21rc.slave- После этого процессы приходится убивать по одному: # МП 3936 # kill 3987 # kill 4209 См. также slay(l), kill(l). 8.9. Блокировка учетных записей Проблема Требуется заблокировать учетную запись и временно запретить пользователю вход в систему, но без удаления учетной записи. Решение Чтобы временно деактивировать учетную запись, заблокируйте пароль пользователя ключом -I (lock):
8.10. Управление паролями 119 # passwd -1 aborg, Password changed. Следующая команда снимает блокировку с учетной записи: # passwd -u aborg Комментарий Еще один способ заблокировать учетную запись — вставить восклицательный знак в начало поля пароля в файле /etc/shadow: foobar:! $l$wiDlQr34$mitGZA76MSYCY04AHIYl: 12466:0:99999:7:: : Также можно заменить х в поле пароля в файле /etc/passwd звездочкой (*): foober:*:1025:1025:Foober Smith... -./home/foober:/bin/bash Наконец, можно лишить пользователя доступа к командному процессору: # usermod -s /bin/false foober И все же лучше всего придерживаться варианта с passwd -l и -и. См. также passwd(l), passwd(5). 8.10. Управление паролями Проблема Требуется сбросить пароль, установить срок его действия или ограничить количество неудачных попыток входа. Сброс решает вечную проблему забытого пароля. Многие администраторы Linux считают, что срок действия пароля нужно ограничивать, поскольку это заставляет пользователей периодически менять пароль. Решение Операции назначения и настройки паролей осуществляются командой passwd. Сброс или изменение пароля: # passwd aborg Пользователь также может сменить свой пароль: aborg$server04:~$ passwd Следующая команда ограничивает срок действия пароля aborg шестью месяцами, с выдачей предупреждения за пять дней: # passwd -х 180 -w 5 -1 1 aborg Чтобы просмотреть пароли пользователя, воспользуйтесь командой # passwd S option aborg P 02/18/2004 0 10 5 1 Комментарий Пароль может содержать цифры, буквы и знаки препинания, при этом они чувствительны к регистру символов. Пробелы и функциональные клавиши не
120 Глава 8. Управление пользователями и группами допускаются. Рекомендуется использовать сильные пароли, то есть не выбирать в качестве пароля имена, слова из словаря, дни рождения или адреса. Пароли рекомендуется записывать и хранить в надежном месте. К сожалению, многие пользователи выбирают слабые, легко угадываемые пароли или хранят их в небезопасных местах (например, на записке, прикрепленной к монитору). Пароли Linux не восстанавливаются. При потере пароля следует обратиться к суперпользователю для получения нового пароля. См. также passwd(l), passwd(5). 8.11. Создание групп командой groupadd Проблема Требуется создать новую пользовательскую или системную группу. Все устанавливаемые программы-серверы должны иметь свои учетные записи пользователей и групп. Решение Воспользуйтесь командой groupadd. Команда создает новую группу по системным значениям, настроенным в /etc/ default/useradd и /etc/skel/: # groupadd newgroup Системная группа создается с ключом -г: # groupadd -r newgroup Ключ -г является специфическим для Red Hat. Если в вашей версии groupadd он не поддерживается, укажите следующий доступный номер системной группы: # groupadd -g 127 newgroup Следующий доступный номер группы можно узнать из файла /etc/group. Комментарий Рекомендуется использовать логачески последовательную схему нумерации групп. С точки зрения Linux это несущественно, но зато такая схема избавит вас от многих хлопот. В Red Hat номера системных групп лежат в диапазоне 0-499, а в Debian — в диапазоне 100-999. За дополнительной информацией о схемах нумерации обращайтесь к разделу «Комментарии» в разделе 8.2. См. также groupadd(8).
8.13. Создание системного пользователя 121 8.12. Удаление групп командой groupdel Проблема Требуется удалить группу или группы, но при этом проследить за тем, чтобы в системе не осталось «бесхозных» файлов или пользователей. Решение Сначала, если потребуется, переназначьте номера групп редактированием файла /etc/group. Просто скопируйте данные пользователей и вставьте их в другую группу. Затем удалите группу командой groupdel, после чего воспользуйтесь командами find и chgrp для поиска и передачи права владения файлами другой группе. Удаление группы: # groupdel имя^группы Удаление группы считается хлопотной операцией, потому что не существует утилит для автоматического переноса/удаления файлов или пользователей, входящих в группу. Вам придется самостоятельно найти их и изменить коды GID вручную: # find / -gid 750 /usr/src/include/lber.h /usr/src/include/ldap.h /usr/src/include/ldbm.h Изменения можно вносить последовательно: # chgrp 800 /usr/src/1nclude/lber.h А можно выполнить замену одновременно посредством совместного использования find и chgrp: # find / -g1d 750 -exec chgrp -v 800 {} \: См. также groupdel(8), find(l), chgrp(l); раздел 8.6. 8.13. Создание системного пользователя Проблема Вы хотите знать, как создать системного пользователя для таких программ, как Postfix, Apache или Squid. Для таких программ рекомендуется создать собственные учетные записи пользователей вместо того, чтобы на скорую руку «свалить» их на универсального пользователя nobody. Решение Задача может быть решена как командой adduser, так и useradd. С adduser это делается примерно так: # adduser -system --no-create-home --group squid Adding system user squid...
122 Глава 8. Управление пользователями и группами Adding new group squid (109). Adding new user squid (109) with group squid Not creating home directory Проверьте результат: # cat /etc/passwd | grep squid squid:x:109:109::/home/squid:/bin/false Хотя подстрока /home/squid присутствует, домашний каталог не создается. А вот как то же самое делается в useradd: # useradd -d /dev/null -g squid -s /bin/false squid Комментарий Многие демоны и процессы, которым необходима системная учетная запись, по умолчанию используют nobody, но все больше приложений требует создания собственной уникальной учетной записи. Старайтесь использовать уникальную учетную запись там, где это возможно, потому что это повышает уровень безопасности системы. Учетная запись nobody чаще всего становится объектом хакерских атак, поэтому собирать разнообразные процессы и демонов в единую цель для атаки не стоит. См. также adduser(8), adduser.conf(5), useradd(8). 8.14. Создание системных групп командой addgroup Проблема Требуется создать несколько новых системных групп с использованием сценария addgroup. Решение Создание системных групп сценарием addgroup происходит следующим образом: # addgroup ••system группа В командной строке можно передать код GID, переопределяя значение по умолчанию. Не забудьте придерживаться схемы нумерации групп, принятой в вашем дистрибутиве Linux (или в вашей организации): # addgroup --system --gid 300 группа См. также addgroup(8); раздел 8.11.
8.16. Проверка целостности файлов паролей 123 8.15. Изменение принадлежности к группам Проблема Требуется включить пользователей в некоторую группу или исключить их из этой группы. Решение Отредактируйте файл /etc/groups вручную. Просто скопируйте и вставьте записи; это самый быстрый способ. Комментарий Для решения задачи также можно воспользоваться командами adduser и usermod, но будьте осторожны: adduser позволяет за один вызов включить пользователя только в одну группу, а команда usermod, позволяющая перечислить несколько групп, стирает прежние данные о принадлежности пользователя к группам. См. также adduser(8), usermod(8). 8.16. Проверка целостности файлов паролей Проблема Файлы паролей (/etc/group, /etc/passwd, /etc/shadow и /etc/gshadow) интенсивно используются в процессе администрирования, и вам нужно какое-нибудь средство для проверки правильности их синтаксиса. Было бы неприятно узнать о допущенной ошибке (например, о том, что вы забыли назначить кому-то пароль) после того, как ваша система будет взломана! Решение Файлы /etc/passwd и /etc/shadow проверяются командой pwck, а файлы /etc/group и /etc/gshadow — командой grpck: #pwck # grpck Если команда завершается без выдачи сообщений, значит, ошибки не обнаружены. В противном случае команда выводит перечень ошибок. Ошибки нужно будет исправить, иначе работа программы завершится. Чтобы ограничиться просмотром всех ошибок, запустите программу в режиме «только чтения»: # pwck -г # grpck -г
124 Глава 8. Управление пользователями и группами Комментарий Программа pwck проверяет логическую целостность файлов /etc/passwd и /etc/ shadow. Она последовательно анализирует записи и проверяет, что каждая запись содержит: О правильное количество полей; О уникальное имя пользователя; О действительные идентификаторы пользователя и группы; О действительную первичную группу; О действительный домашний каталог; О действительный командный процессор. Pwck сообщает обо всех записях, не имеющих пароля. Мне очень нравится формулировка в man-странице: «Проверки правильности количества полей и уникальности имени пользователя являются фатальными». Нечего сказать, хорошая реклама! Но не волнуйтесь — вы в полной безопасности, и вызов pwck ничему не повредит. Когда pwck обнаруживает ошибку, вы можете либо удалить учетную запись, либо проигнорировать ее. Во втором случае pwck прекращает работу и не проверяет новые строки (за одним исключением: обнаружив повторяющееся имя, программа продолжит проверку даже в том случае, если вы не удалите учетную запись). Программа grpck анализирует файлы /etc/group и /etc/gshadow и проверяет, что каждая запись содержит: О правильное количество полей; О уникальное имя группы; О действительный список членов и администраторов. См. также pwck(8), grpck(8). 8.17. Серийное добавление новых пользователей Проблема Требуется добавить сразу несколько учетных записей (вместо того, чтобы вводить их по одной). Решение Воспользуйтесь сценарием massjjseradd. Это сценарий командного процессора, поэтому он должен работать практически везде. Вам также понадобится сценарий
8.17. Серийное добавление новых пользователей 125 mass__passwd (листинг 8.2). Сохраните эти два сценария в одном каталоге. Также следует установить утилиту pwgen, генерирующую пароли. Создайте список имен и паролей в формате: имя_пользователя: имя фамилия Также можно добавить дополнительные данные GECOS: dawns:0awn Marie Schroder.. 123-4567.trainers Затем запустите сценарий mass_useradd (листинг 8.1). Сценарий создает записи в /etc/passwd, /etc/group и /etc/shadow, домашние каталоги, персональные группы и пароли, которые становятся недействительными после первого использования. Следующая команда приказывает mass_useradd использовать список новых пользователей из файла newusers с заменой/созданием выходного файла newlogins.txt sh mass_useradd < newusers > newlogins.txt Присоединение новых имен и паролей к файлу newlogins.txt: sh mass_useradd < newusers » newlogins.txt Помимо выходного файла, который представляет собой обычный список, mass_passwd создает для каждого пользователя отдельный файл с инструкциями. Инструкции распечатываются и раздаются пользователям. Эти файлы, а также файл журнала хранятся в домашнем каталоге пользователя, запустившего сценарий (обычно root): # Is /root/masspasswds dawns.passwd.txt nikitah.passwd.txt mass_passwd.log rubst.passwd.txt Комментарий В сценариях используются стандартные средства Shadow Suite, поэтому они легко настраиваются посредством регулировки параметров утилит, задействованных в их работе. Файл выходных данных выглядит так: dawns shabaefi 1002 nikitah gohbinga 1003 rubst ahtoohaa 1004 В файл /etc/passwd добавляются записи вида dawns:x:1002:1002:Dawn Mari Schroder..123-4567.trainers:/home/dawns:/bin/bash nikitah:x:1003:1003:Nikita Horse..123-4567.equine:/home/nikitah:/bin/bash rubst:x:1004:1004:Rubs The Cat,101..234-5678,.test:/home/rubst:/bin/bash Листинг 8.1. Программа mass.useradd #!/bin/sh # # Использование: # # sh massjjseradd < inputfile » new-passwords.txt # PATH-/usr/loca1/sbin.7usr/sbin:/sbin:/usr/loca1/bin:/usr/b1n:/bin:$PATH # Чтение строки входных данных. # Формат входного файла: продолжение &
126 Глава 8. Управление пользователями и группами Листинг 8.1 (продолжение) # имя_пользователя : имя фамилия # Чтобы в качестве разделителя использовалась запятая, замените # 1FS=":$IFS" на IFS-".$IFS" while IF$=":$IFS" read username realname; do # Сначала удаляем пустые строки и комментарии case "Susername" in " | \#*) continue :: esac # Чтение /etc/passwd и /etc/group и вычисление # следующих свободных значений UIO and GID. # Программа начинает с {id=1000}. измените для своей системы id-$({ getent passwd; getent group; ) | cut -f3 -d: | sort -un | awk 'BEGIN { id=1000 } $1 — id { id++ } $1 > id { print id; exit }*) # Добавление новых пользователей в /etc/group и /etc/passwd. # Создание домашних каталогов командой chmod 700 # Все параметры groupadd. useradd и chmod # можно изменить в соответствии со спецификой системы. groupadd -g $id $username useradd -m -c "Srealname" -g Susername -u Sid Susername chmod 700 /home/$username # Назначение пароля. Для этой цели вызывается другой сценарий # massjpasswd. который может использоваться независимо. # Сценарий mass_passwd выводит имя пользователя, пароль # и идентификатор пользователя. $(dirname $0)/lmass_passwd -M Susername done Листинг 8.2. Программа mass_passwd #!/bin/sh # Каталог для сохранения файлов "username.passwd.txt" # Если каталог не существует, он будет создан. text_file_dir«$HOME/massj)asswds 1og_file=mass_passwd.log # Минимальный идентификатор для "обычных" пользователей min_uid»1000 # Длина генерируемых паролей passjen«8 # Срок действия паролей (в днях) pass_expire-90 ## При желании отредактируйте текст между двумя строками -.
8.17. Серийное добавление новых пользователей 127 echo " echo " echo и echo " echo " echo и exit 0 -g -a -V -n # Получение имени программы (скорее всего, "mass passwd") prog-${0##*/} usage О { echo "usage: $prog [-v] [-n] username ..." Sprog C-v] [-n] [-g] groupname ..." Sprog [-v] [-n] [-a]" change passwords of everyone in a group" change everyone's password" verbose" don't do it. just simulate (implies -v)" short_usage О { echo >&2 "usage: $prog C-v] [-g] [-a] name..." echo >&2 " Sprog -h for help" exit 1 } # echo something, but only if in verbose mode vecho О { test -n "Sverbose" && echo "$@" } # Построение случайного пароля. # # Если программа pwgen доступна, используем ее •- она для этого # предназначена и хорошо работает. # # Если программа недоступна, читаем /dev/urandom и отфильтровываем все # символы, не являющиеся алфавитно-цифровыми, пока количество символов # не окажется достаточным для пароля. Символы в "tr -d" определяют # ASCII-коды (в восьмеричной записи) диапазонов удаляемых символов. # # Подобное использование /dev/urandom крайне неэффективно. # но это несущественно, randompass О { pwgen Spass len 1 2>&- || tr -d '[\000-\057][\072-\100][\133Л140][\173Л377]' < /dev/urandom | dd bseSpass_len count-1 2>&- } # Функция интерпретирует режим (пользователи / группы / серийная замена) # и возвращает список имен пользователей get_users О { if [ -n "Salljnode" ]: then getent passwd | awk -F: '{if ($3 >- '$min_uid') {print $1}}' return fi if [ -z "$group_mode" ]: then echo "$<<>" return fi while [ -n "SI" ]: do продолжение #
128 Глава 8. Управление пользователями и группами Листинг 8.2 (продолжение) g_ente$(getent group "$Г 2>&0 if [ -z "$g_ent" ]: then echo >&2 "warning: $1: group not found" continue fi members-${g ent##*:} gid-${g_entl:*} g1d-${gid##*:} echo "Smembers" | tr V ' ' getent passwd | awk -F: '{if ($4 « '$gid') { print $1 } }* shift done } # Основной код groupjoode-; verbose-: all mode=: simulate»: eol-: while [ -z "$еоГ ]: do case "$Г in -g) group_modeel: shift :: -v) verbose-1; shift :: -a) alljnode-1: shift :: -n) simulate-true: verbose=l: shift :: -M) mass_out-l: shift :: # we're called from massjjseradd -h | -? | --help) usage ;: --) eol-1: shift :: -*) short usage :: *) eol-1 7: esac done # Настройка безопасного окружения и каталога для текстовых файлов. # предназначенных для вывода на печать. PATH-/usr/sbin:/usr/bin:$PATH umask 077 mkdir -p $text_file_dir cd $text_file_dir processed-0 for u in $<get_users "$@"): do vecho -n "generating password for $u..." pass-S(randompass) echo "$u:$pass" | eval $s1mulate chpasswd vecho -n "." eval Ssimulate chage -M $pass_expire -d 2003-01-01 $u vecho -n V rm -f Su.passwd.txt echo > Su.passwd.txt "\ Login name: $u Password: Spass Please log in and change your password: the system should prompt you to do this when you log in. You can change your
8.18. Серийная замена паролей 129 password at any time with the 'passwd' command. Choose a strong password - everyday words, birthdays, names of people or animals, all these are too easy to guess. Also. DO NOT give your password to anyone, ever. The IT staff will never ask you for your password, and neither should anyone else. You will be held responsible for all activity done via your account. printf » $log_file "$(date) *-12s SsWn" $u $pass vecho "$pass" if [ -n "$massj)ut" ]: then uid-$(getent passwd $u | cut -f3 -d:) echo -e "$u\\t$pass\\t$uid" fi processed=S(expr Sprocessed + 1) done if [ Sprocessed -gt 0 ]: then test -z "$mass_out" && echo >&2 "$processed password(s) reset - see $text_file_dir/$1og_file" else echo >&2 "no users specified - see 'Sprog -h* for help" fi См. также bash(l), pwgen(l); домашняя страница программы pwgen (http://sourceforge.net/ projects/pwgen/). 8.18. Серийная замена паролей Проблема Вам хотелось бы иметь возможность периодически изменять большое количество паролей; возможно, эта процедура является частью вашей политики безопасности. А может быть, система безопасности была взломана, и вы хотите сменить пароли самостоятельно, не полагаясь на пользователей. Решение Воспользуйтесь сценарием mass_passwd из раздела 8.17. Сценарий позволяет задать состав пользователей тремя разными способами: # massj>asswd пользователь! пользователь? _ # massj>asswd -g группа группа» # masspasswd -a В первом случае передается список имей пользователей, разделенных пробелами. Во втором случае изменяются пароли пользователей, входящих в указанные группы. В третьем случае изменяются все пароли из /etc/passwd.
130 Глава 8. Управление пользователями и группами Сценарий mass_passwd генерирует для каждого пользователя отдельный файл с указанием новых паролей и инструкциями, которые вы сочтете нужным вюпочить. Это позволяет легко распечатать отдельную инструкцию для каждого пользователя. Комментарий Ключ -п тестирует команду без ее фактического выполнения: # ./mass_passwd -v -g -n usergroup generating password for dawns teivuphu generating password for nikitah kohfahsh 2 password(s) reset - see /root/mass_passwd/mass_passwd.log Пароли остаются прежними; выполнение команды в этом режиме всего лишь проверяет параметры перед внесением изменений. См. также Раздел 8.17. 8.19. Серийное включение пользователей в группы Проблема Требуется добавить большое количество пользователей в группу. Решение Вставьте список имен прямо в файл /etc/group. Далее описан быстрый способ построения списка пользователей для вставки в /etc/group. Он основан на схеме нумерации U1D, позволяющей легко отсортировать нужную группу пользователей. Для примера воспользуемся схемой «Trainers/ Coaches/Players», описанной в разделе 8.2. Добавим в группу Trainers несколько новых членов: $ awk -F: '($3 >- 1050) && ($3 <- 1060) { print $1}' /etc/passwd | tr ЧгГ V bcool.bk1nd.frnow.kthxbye.oknodo Теперь скопируйте и вставьте список в /etc/group. А если в вашей системе нет аккуратной, четкой схемы нумерации UID? Воспользуйтесь данными GECOS. Выберите одного из полей для хранения метки. Поле «прочее» лучше всего подходит для этой цели, поскольку пользователи не могут изменять его по своему усмотрению. Оно находится в данных GECOS — пяти полей, разделенных запятыми. Данные GECOS выглядят примерно так: bcool:х:1300:1300:Bob Cool....trainer:/home/bklnd:/bin/bash bkind:x:1055:1055:Bev Kind trainer:/home/bkind:/bin/bash После добавления меток выборка пользователей легко производится при помощи grep и awk: $ cat /etc/passwd | grep trainer | awk -F: '{ print $1}' | tr '\n' V bkind.bcool.
8.20. Временное использование привилегий root 131 См. также passwd(5), awk(l). 8.20. Временное использование привилегий root Проблема Будучи добропорядочным пользователем Linux, вы понимаете, как важно использовать минимальные привилегии, необходимые для выполнения работы. Вы знаете, что суперпользователь root всемогущ, и поэтому работаете в качестве root только тогда, когда это абсолютно необходимо. Как временно переключиться на учетную запись root? Решение Когда потребуется выполнить какую-нибудь административную операцию, воспользуйтесь командой su (Switch User): carlaftnndbag:~$ su Password: rootlwi ndbag:/home/ca rla# Затем вернитесь к своей «основной личности»: rootGwindbag:/home/carlа# exit exit car1a@windbag:~$ Переключение на root с восстановлением конфигурации окружения и командного процессора root: carla&*indbag:~$ su - Password: root$windbag:/home/caг 1а-# Переход на другой командный интерпретатор: % su - •-shell-tosh Password: Доступные командные процессоры перечислены в/etc/shells. Комментарий Команда su позволяет переключиться на любую учетную запись, пароль которой вам известен. Дефис после su существенно влияет на результат выполнения команды. Без дефиса команда сохраняет старую системную конфигурацию и переменные окружения — командный процессор, редактор по умолчанию, пути и umask. См. также su(l).
132 Глава 8. Управление пользователями и группами 8.21. Временное предоставление привилегий root командой sudo Проблема Требуется поручить некоторые операции администрирования системы другим пользователям или создать дополнительный уровень безопасности для ваших административных потребностей, но это нужно сделать так, чтобы мощь привилегий root использовалась в ограниченном объеме, не раскрывая пароль root. Решение Воспользуйтесь sudo — командой, которая предоставляет ограниченные права root конкретным пользователям для решения конкретных задач и регистрирует их действия без сообщения пароля root. Допустим, имеется пользователь jhaugh, которому вы хотите предоставить полные права root. Поскольку пользователи sudo имеют собственные пароли, пароль root остается защищенным. Отредактируйте файл /etc/sudoers командой visudo — файл открывается в редакторе по умолчанию. # visudo # Файл sudoers # # Этот файл ДОЛЖЕН редактироваться командой 'visudo' # с правами root. # За дополнительной информацией о записи в файл # sudoers обращайтесь к man-странице. # # Спецификация псевдонимов хостов # Спецификация псевдонимов пользователей # Спецификация псевдонимов команд # Спецификация привилегий пользователей root ALL=(ALL) ALL Для начала создайте псевдоним хоста: Host_Alias LOCALHOST- local host В секции «Спецификация привилегий пользователей» («User privilege specification») добавляются отдельные пользователи: jhaugh ALL=(ALL) ALL Эта строка предоставляет jhaugh привилегии root для выполнения любых операций в системе и на подключенных компьютерах. Допустим, вы хотите предоставить другому пользователю tgwynne привилегии root только на локальном компьютере. Включите следующую запись: tgwynne LOCALHOST - ALL А пользователю msmith разрешается только выключение локального компьютера: msmith L0CALH0ST=/sb1n/shutdown, /sbin/halt
8.21. Временное предоставление привилегий root командой sudo 133 Предоставление группам обычных пользователей права выключения своих компьютеров: # Спецификация псевдонимов хостов Host_Alias L0CALH0ST = local host # Спецификация псевдонимов пользователей User_A")ias USERS = tgwynne. msmith. jnaugh. \ abyron. jwinters # Спецификация псевдонимов команд Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown, /usr/sbin/halt. \ /usr/sbin/reboot. /usr/sbin/poweroff # Спецификация привилегий пользователей USERS LOCALHOST = SHUTDOWN Вызов команды sudo выглядит так: $ sudo /usr/sbin/halt Команда запрашивает у пользователей их пароли, после чего завершается. Чтобы узнать, выполнение каких команд им разрешено, пользователи могут выполнить следующую команду: $ sudo -1 User jhaugh may run the following commands on this host: (ALL) ALL Команда sudo фиксирует ошибки в системном журнале и передает сообщение root: $ sudo /usr/sbin/halt carl a 1$ not in the sudoers file. This incident will be reported. Вы можете определять группы серверов и предоставлять пользователям привилегии для группы: # Спецификация псевдонимов хостов Host_Alias FILESERVERS - hostl. host2. host3 # Спецификация псевдонимов пользователей UserjMias FILESERVERADMINS - jhaugh. abyron. jwinters # Спецификация псевдонимов команд Cmnd_Alias FILEUTILS'- /bin/chgrp, /bin/chmod. \ /bin/chown. /bin/cp. /bin/dd. /bin/df. \ /bin/dir. /bin/dircolors. /bin/du. /bin/install. \ /bin/In. /bin/Is. /btn/mkdir. /bin/mkinfo. \ /bin/mknod. /bin/mv. /bin/rm. /bin/rmdir. \ /bin/shred, /bin/touch, /bin/vdir sync # Спецификация привилегий пользователей FILESERVAOMIN FILESERVERS - FILEUTILS Комментарий Команда sudo также может применяться для запуска пользователями сценариев (например, сценариев архивации). Будьте очень осторожны со сценариями, а также с командами, предоставляющими доступ к командному процессору или запускающими
134 Глава 8. Управление пользователями и группами текстовые редакторы, так как с их помощью пользователи могут выйти за пределы своих привилегий. Попробуйте ограничить sudo-пользователей RJOE — ограниченным редактором, который не позволяет запустить командный процессор, но лучше с самого начала хорошенько продумать механизм предоставления прав root. См. также su(l), sudo(8), sudoers(5); главная страница sudo (http://www.courtesan.com/sudo/). 8.22. Дисковые квоты Проблема Требуется ограничить объем дискового пространства, которое может быть занято пользователем. Во многих системах встречаются нарушители, забивающие свои диски коллекциями МРЗ-файлов и телесериалами. Решение Воспользуйтесь пакетом Linux Disk Quota. Пакет содержит ряд компонентов, в том числе quota, edquota, quotacheck и repquota. Сначала отредактируйте файл /etc/fstab и выберите разделы, для которых будут установлены квоты. Квоты могут устанавливаться как для отдельных пользователей (usrquota), так и для групп (grpquota). Оба вида квот могут действовать одновременно: /dev/hda6 / ext3 defaults 0 1 /dev/hda7 /home ext3 defaults.usrquota.grpquota 0 1 Перемонтируйте файловую систему: # mount -о remount /home Сценарий Quota init запускает программу quotacheck, которая анализирует систему, создает базу данных использования дискового пространства и создает файлы квот. Затем назначьте квоты пользователям. При этом файл конфигурации открывается в редакторе по умолчанию: # edquota -u vhenson Disk quotas for user vhenson (uid 1550): Filesystem blocks soft hard inodes soft hard /dev/hda7 550466 0 0 47466 0 0 Мягкое ограничение (soft limits) предоставляет нарушителю отсрочку с выдачей предупреждений. Жесткое ограничение (hard limits) вступает в силу немедленно. Чтобы задать ограничение, просто отредактируйте файл: # edquota -u vhenson Disk quotas for user vhenson (uid 1550): Filesystem blocks soft hard inodes soft hard /dev/hda7 550466 650000 700000 47466 0 0 Блоки всегда имеют размер 1024 байта, поэтому 650 000 блоков составляют около 665 Мбайт.
8.22. Дисковые квоты 135 Сохраните и закройте файл. Убедитесь в том, что квота вступила в силу: # quota vhenson Disk quotas for user vhenson (uid 1550): 650000 700000 Назначение квот группам осуществляется следующим образом: # edquota -g engineers Если жадный пользователь использует всю групповую квоту, значит, группе не повезло — другим ничего не остается. Следующая команда вызывает редактор по умолчанию для назначения отсрочки для мягких ограничений во всей файловой системе: # edquota -t Grace period before encforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/hda3 7days 7days Один из пользователей может использоваться в качестве «прототипа» для определения квот нового пользователя: # edquota -p vhenson dnorth или сразу нескольких новых пользователей: # edquota -p vhenson *awk -F: '$3 > 999 {print $1}' /etc/passvwf Также можно перечислить сразу нескольких пользователей: # edquota -p vhenson dnorth jvesperman sanvin Несомненно, вы захотите следить за использованием квот. Следующая команда выводит общесистемный отчет о текущем расходовании дискового пространства: # repquota -a Чтобы ограничиться конкретной файловой системой, используйте команду: # repquota /home Комментарий Включите следующую строку в сценарий mass_useradd, после строки chmod, чтобы квота пользователя vhenson автоматически применялась для всех новых пользователей: /usr/sbin/edquota -p vhenson Susername Команду add user можно настроить на автоматическое назначение квот для новых пользователей. Отредактируйте файл adduser.conf: QU0TAU5ER-"vhenson" А теперь плохие новости: Quota сейчас находится в переходной фазе. Код Quota в ядрах версий 2.2 и 2.4 устарел и не подходит для современных версий Quota. Если в ваш дистрибутив включена «заплатка» ядра — считайте, вам повезло. Впрочем, вы сможете быть полностью уверены в этом лишь после того, как установите и настроите Quota и назначите квоту пользователю. Если дистрибутив не содержит готовые к запуску версии Quota, вероятно, вам придется устанавливать целую серию «заплаток» ядра. Подробные инструкции приведены в документе «Quota mini-HOWTO».
136 Глава 8. Управление пользователями и группами На момент написания книги надежная реализация ReiserFS с поддержкой Quota существовала только в SuSE. «Заплатки» ReiserFS для других дистрибутивов можно загрузить с домашней страницы ReiserFS no адресу http://www.namesys.com. К счастью, ядро 2.6 полностью поддерживает Quota. После решения проблем с ядром вашим следующим шагом должна стать установка новейшей версии Quota. Лучше всего найти RPM для вашей системы (пользователи Debian используют apt-get install quota), в этом случае в вашем распоряжении появятся настроенные и готовые к использованию сценарии init. Если вы предпочитаете настраивать сценарии init самостоятельно, обращайтесь к инструкциям в документе «Quota mini-HOWTO». См. также man(l) quota, man(8) edquota, man(8) quotacheck, man(8) repquota; сценарий mass_useradd (раздел 8.17); Quota mini-HOWTO (http://www.tldp.org/HOWTO/Quota.html); домашняя страница проекта Quota (http://sourceforge.net/projects/linuxquota/); домашняя страница ReiserFS (http://www.namesys.com).
Глава 9 Операции с файлами и разделами 9.1. Введение Хорошее понимание основных принципов работы файловых систем абсолютно необходимо для понимания того, как работает Linux. В системе все объекты интерпретируются как файлы — файлы данных, разделы, каналы (pipes), сокеты и устройства. Каталог также представляет собой файл, содержащий информацию о других файлах. Спецификация иерархии файловых систем (FHS, Filesystem Hierarchy Standard) была разработана как «добровольный стандарт», соблюдаемый в большинстве версий Linux. Далее перечислены обязательные элементы корневой файловой системы Linux: / — корневой каталог; /bin — важнейшие системные команды; /boot — файлы статического загрузчика; /dev — файлы устройств; /etc — системные конфигурационные файлы, специфические для хоста; /lib — общие библиотеки, необходимые для работы локальной системы; /mnt — временные точки монтировки; /opt — дополнительные программные пакеты (в Linux используются мало); /ргос — текущая информация о конфигурации и состоянии ядра; /sbin — команды администрирования системы; /tmp — временные файлы (в нормальных системах они уничтожаются между перезапусками); /usr — общие файлы, данные только для чтения и двоичные файлы; /var — файлы переменного размера (такие, как почтовые ящики и журналы). Следующие каталоги считаются необязательными, потому что они могут находиться в любом месте сети, тогда как обязательные каталоги должны присутствовать для нормальной работы компьютера: /home — личные файлы пользователя; /root — личные файлы суперпользователя.
138 Глава 9. Операции с файлами и разделами Те, кого действительно заинтересует эта тема, найдут дополнительную информацию в спецификации FHS. Вот лишь некоторые обстоятельства, которые должны учитывать пользователи Linux: О каталоги /tmp и /var могут размещаться в отдельных разделах с целью повышения безопасности. Если вследствие каких-то сбоев начнется неконтролируемое заполнение этих каталогов, они будут изолированы от остальных компонентов системы; О каталог /home может находиться в собственном разделе или на выделенном сервере для упрощения создания резервных копий и защиты данных при обновлении системы. В этом случае содержимое /home останется нетронутым даже после полного уничтожения и переустановки системы Linux; 0 хранение всех конфигурационных файлов в /etc и /home упрощает создание резервных копий. Вы можете ограничиться архивацией только содержимого /etc и /home, а остальные компоненты восстановить с установочных дисков системы. Но это будет означать, что при восстановлении будут потеряны обновления программ — учтите это обстоятельство при разработке чрезвычайных планов. Типы файлов Linux Помните, что в Linux любой объект интерпретируется как файл. Файлы Linux делятся на семь типов, перечисленных в табл. 9.1. Таблица 9.1. Типы файлов Признак типа Тип файла Обычный файл d Каталог 1 Ссылка с Символьное устройство s Сокет р Именованный канал b Блочное устройство Признак типа выводится в самом начале записи в списке файлов: # Is -1 /dev/initctl prw 1 root root 0 Jan 12 00:00 /dev/initctl # Is -1 /tmp/.ICE-unix/551 srwx 1 carl a carl a 0 Jan 12 09:00 /tmp/.ICE-unix/551 Тип файлов может указываться в командной строке find: # find / -type p # find / -type s Если поиск занимает слишком много времени, работу команды можно прервать клавишами Ctrl+C.
9.1. Введение 139 Атрибуты файлов Также стоит обратить внимание на атрибуты файла — например, сценария sortusers: # Is -1 sortusers -rwxr-xr-x 1 meredydd programmers 3783 Jan 7 13:29 sortusers Строка -rwxr-xr-x 1 meredydd programmers сообщает программисту много полезных сведений: О первый символ — является признаком обычного файла. Этот атрибут не может изменяться пользователем. Поэтому признаку Linux определяет тип файла, поэтому с точки зрения системы расширение является лишним. Расширения нужны только для пользователей и приложений; О подстрока rwx задает разрешения владельца файла; О первая подстрока r-х задает разрешения владельца группы; О вторая подстрока r-х задает разрешения для «всего мира», то есть для каждого, кто имеет доступ к файлу; О 1 — количество жестких ссылок на файл. У каждого файла имеется как минимум одна ссылка из родительского каталога; О в подстроке meredydd programmers содержится владелец файла и группа, которой принадлежит файл. Разрешения и права владения могут изменяться командами chmod, chgrp и chown; команда chmod изменяет разрешения, а команды chown и chgrp меняют права владения. Запись rwx на первый взгляд выглядит странно, но в действительности это мнемоника: rwxeRead, Write, eXecute. В этом формате задаются разрешения для владельца, группы и всех остальных. Таким образом, в примере sortusers пользователю meredydd разрешается чтение, запись и исполнение файла. Члены группы и прочие могут только читать и исполнять файл. Хотя отредактировать файл может только сам пользователь meredydd, ничто не мешает членам группы и другим пользователям скопировать его содержимое. Файл является сценарием командного процессора, для него приходится задавать как права чтения, так и права исполнения, потому что командному процессору требуется прочитать файл. Двоичные файлы читаются непосредственно ядром без участия командного процессора, поэтому для них право чтения не обязательно. Определения типов файлов Далее типы файлов Linux будут представлены чуть более подробно. О Обычные файлы — обычные текстовые файлы, файлы данных или двоичные исполняемые файлы. О Каталоги — списки файлов. О Символьные и блочные устройства — файлы, которые могут рассматриваться как промежуточные точки между ядром и драйверами устройств — например, /dev/hda (жесткий диск IDE), /dev/ttySl (модем для последовательного порта) и т. д. Они используются ядром для перенаправления запросов к различным устройствам системы.
140 Глава 9. Операции с файлами и разделами О Локальные сокеты — связи между локальными процессами. Локальные соке- ты отображаются как файлы, но запись и чтение в них возможны лишь со стороны процессов, напрямую задействованных в передаче данных. О Именованные каналы — также используются для локальных межпроцессных коммуникаций. Крайне маловероятно, чтобы пользователю Linux когда-либо пришлось иметь дело с сокетами или каналами; они используются исключительно системными функциями. О Ссылки — ссылки представляют огромный интерес для пользователей Linux. Они делятся на два типа: жесткие и мягкие. Ссылка представляет собой указатель на файл. Жесткая ссылка в действительности может рассматриваться как другое имя файла, поскольку она указывает на конкретный i-узел (inode). Все жесткие ссылки, указывающие на файл, наследуют все атрибуты этого файла — разрешения, владельца и т. д. Команда rm удаляет жесткие ссылки, но файл остается на диске до тех нор, пока не будут уничтожены все жесткие ссылки на него, и файл не будет освобожден всеми процессами. Жесткие ссылки не могут выходить за пределы файловой системы, поэтому вам не удастся создать жесткую ссылку на сетевой диск. Мягкие ссылки связываются с именем файла; они могут указывать на любой файл, находящийся где угодно. В системе даже могут существовать «висячие» мягкие ссылки; они появляются после удаления файлов, на которые они указывают, или их переименования. Внутреннее строение файловой системы Приведу еще ряд полезных определений, относящихся к файловым системам. Логический блок — минимальная единица хранения информации (в байтах), которая может выделяться файловой системой. Один файл может состоять из нескольких блоков. Логический том — раздел диска, диск или том, состоящий из нескольких дисков или разделов, — любая единица хранения данных, воспринимаемая как единое, обособленное пространство. Внутренняя фрагментация — неиспользуемые места, возникающие, когда файл или его часть заполняет блок лишь частично. Например, если размер блока равен 4 Кбайт, а файл занимает 1 Кбайт, то 3 Кбайт теряются. Внешняя фрагментация — фрагментация, возникающая в том случае, если блоки, относящиеся к одному файлу, не занимают смежную область, а рассеиваются по всему диску. Экстент — смежные блоки, принадлежащие одному файлу. Файловая система воспринимает экстент как единое целое, что повышает эффективность отслеживания больших файлов. В+-деревья — сначала появились b-деревья (сбалансированные деревья). После усовершенствования они превратились в Ь+-деревья. Эти удобные структуры данных, позаимствованные из теории индексирования баз данных, заметно ускоряют поиск и перебор в структурах данных. Файловые системы, использующие эту концепцию, могут быстро просканировать дерево каталогов, сначала выбрать нужный каталог, а затем просканировать его содержимое. Файловая система Ext2 выполняет последовательный поиск, который работает медленнее.
9.1. Введение 141 Метаданные — термин, объединяющий все данные, которые описывают или управляют внутренними структурами данных. К этой категории относится вся информация о файле, кроме его непосредственного содержимого: дата и время, владелец, группа, разрешения, размер, ссылки, время модификации, время доступа, местонахождение на диске, расширенные атрибуты и т. д. 1-узел — большая часть метаданных файла содержится в i-узле, или индексном узле. Каждому файлу ставится в соответствие уникальный номер i-узла. Журнальные файловые системы Старая добрая файловая система Ext2 постепенно дряхлеет. Она уже не поспевает за пользователями, которым нужны терабайты дискового пространства, и не обеспечивает быстрого восстановления в случае сбоев. Для большинства пользователей, у которых объем данных измеряется гигабайтами и менее, важнейшими причинами для перехода на журнальную файловую систему являются быстрое восстановление и целостность данных. Файловые системы Linux асинхронны. Они не записывают метаданные прямо на диск, а накапливают данные в кэше записи в памяти и осуществляют запись периодически, в моменты низкой загрузки процессора. Такая схема повышает общее быстродействие системы, но сбой питания или системы может привести к потере метаданных. Если это произойдет, при активации драйвера файловой системы во время перезапуска и при выполнении программы fsck (FileSystem Consistency checK) будут обнаружены несоответствия. Поскольку Ext2 хранит несколько экземпляров метаданных, обычно ей удается восстановить нормальное состояние системы. Но у такого подхода есть недостаток — время восстановления. Fsck проверяет абсолютно все биты метаданных. На это может потребоваться от нескольких минут до получаса и более для больших файловых систем. Журнальным файловым системам столь долгая проверка не нужна, потому что они ведут журналы изменений. Таким образом, проверяются только изменившиеся файлы, а не вся файловая система. В распоряжении пользователей Linux имеется немало замечательных журнальных файловых систем, в том числе Ext3, ReiserFS, XFS и JFS. Ext3 — журнальная система на базе Ext2. Системы ReiserFS, XFS и JFS способны работать с файловыми системами, объем которых на 64-разрядмых платформах измеряется экза- байтами. К сожалению, пользователи ia32 ограничены обычными терабайтами. Какую файловую систему выбрать? Не существует однозначно лучшего варианта; все они хороши по-своему. Далее приводится краткая сводка основных достоинств и недостатков. Ext3 — система отличается простотой и удобством. Она прекрасно устанавливается поверх Ext2, поэтому вам не придется строить систему с самого начала. Система является расширением Ext2, поэтому она использует тот же пакет файловых утилит, e2fsprogs. Принципиальное отличие Ext3 от других файловых систем заключается в том, что она использует фиксированное количество i-узлов, тогда как в других системах узлы создаются динамически. Кроме того, Ext3 поддерживает ведение журналов данных, а не только метаданных. Впрочем, за это приходится расплачиваться более низкой производительностью и дополнительными расходами дискового пространства. Ext3 работает в любой архитектуре, поддерживаемой системой Linux.
142 Глава 9. Операции с файлами и разделами ReiserFS — система особенно хорошо подходит для систем с большим количеством мелких файлов (например, почтовых серверов, использующих формат maildir, или серверов новостей). ReiserFS обеспечивает высокоэффективное хранение файлов; остаточные биты файлов упаковываются в листовые узлы b-дерева, что предотвращает напрасное расходование дискового пространства. Система отлично масштабируется и так же хорошо справляется с большими файлами. ReiserFS работает в любой архитектуре, поддерживаемой системой Linux. JFS — вклад IBM в Большое Соревнование Файловых Систем Linux; система портироваиа из AIX и OS/2 Warp. Она поддерживает многопроцессорные системы, списки управления доступом (ACL) и даже — представьте! — динамическое изменение размеров. Просто перемонтируйте файловую систему JFS с новым размером, и ничего больше делать не придется (правда, таким образом можно только увеличить тома, но не уменьшить его). XFS — разработка SGI, портированная из IRIX. XFS мыслит масштабно — заявлено, что она способна работать с файловыми системами объемами до 9 экза- байт. Ее сильной стороной является обработка очень больших файлов (скажем, гигантских баз данных). У XFS имеется одна превосходная функция, называемая отложенным распределением. Система откладывает запись на диск и выбор блока для записи, чтобы выбрать наибольшее возможное количество смежных блоков. Если в системе используется большое количество временных файлов с коротким сроком жизни, XFS может вообще никогда не выделить блоки иод эти файлы. XFS обладает интегрированной поддержкой дисковых квот, ACL, архивации и восстановления. См. также JFS (http://www-124.ibm.com/jfs/); XFS (http://oss.cgi.com/projects/xfs/); ReiserFS (http://www.namesys.com); Ext2/3 (http://e2fsprogs.sourceforge.net/ext2.html); File- system Hierarchy Standard (http://www.pathname.com/fhs/). 9.2. Настройка разрешений в числовом формате chmod Проблема Требуется контролировать доступ к файлу. Допустим, вы хотите удержать секретный рецепт соуса подальше от посторонних, или у вас имеется конфиденциальная информация, нуждающаяся в защите. А может (что более вероятно), потребовалось разрешить исполнение некоторого файла, В любом случае потребуется задать разрешения для файлов, но сначала нужно разобраться, как вычисляются числовые коды разрешений. Решение Воспользуйтесь командой chmod (CHange MODe). Смена разрешений может выполняться только суперпользователем (root) и владельцем файла.
9.3. Выполнение массовых операций командой chmod 143 Например, следующая команда предоставляет владельцу файла доступ для чтения и записи к файлу /archive/datafile. Ни один другой пользователь, кроме root, вообще не сможет обратиться к этому файлу: $ chmod -v 600 /archive/datafile mode of '/archive/datafile* changed to 0600 (rw ) В следующем примере владелец файла /shared/list разрешает его чтение всем желающим, но изменения в файл могут вноситься только владельцем файла и root: $ chmod -v 644 /shared/list mode of '/archive/datafile' changed to 0644 (rw-r--r--) Чтобы сценарий можно было запустить, в атрибутах файла необходимо установить бит исполнения. Следующая команда разрешает редактирование сценария только пользователю, а чтение и исполнение — всем желающим: $ chmod 755 /shared/somescript У каталогов бит исполнения всегда должен быть установлен, иначе они не будут работать: $ chmod 755 /shared Назначение разрешений каталогу со всем содержимым, включая подкаталоги, производится с ключом -R. Ключ -v включает режим подробного вывода, чтобы вы видели, какие действия выполняет команда: $ chmod -R -v 755 /shared Комментарий Файловые разрешения вычисляются по табл. 9.2. Просуммируйте нужные значения для каждого типа пользователей, а затем перечислите их в порядке следования в таблице: владелец, группа, прочие. Специальные биты рассматриваются в разделе 9.7. Таблица 9.2. Вычисление файловых разрешений Специальные биты setuid 4 setuid 2 setuid 1 Разрешение Чтение Запись исполнение Владелец 4 2 1 Группа 4 2 1 Прочие 4 2 1 См. также info chmod. 9.3. Выполнение массовых операций командой chmod Проблема Требуется задать разрешения для всех файлов в каталоге или для группы файлов.
144 Глава 9. Операции с файлами и разделами Решение Команда chmod поддерживает операции со списками файлов. Для построения списков можно воспользоваться командой find или метасимволами командного процессора. Следующая команда делает несколько файлов доступными только для чтения для всех пользователей: $ chmod 444 file.txt file2.txt file3.txt Чтобы сделать все файлы текущего каталога доступными для чтения/записи для владельца и группы, но без изменения разрешений самого каталога, воспользуйтесь командой: $ find . -type f -exec chmod -v 660 {} \: Назначение разрешений для каталога и всего содержимого, включая подкаталоги: $ chmod -R -v 755 /shared В следующем примере чтение/запись всех файлов с расширением .txt в текущем каталоге разрешается владельцу, а всем остальным разрешается только чтение: $ chmod -v 644 *.txt Изменение всех файлов текущего каталога, начинающихся с определенного префикса: % chmod -v 644 apt* См. также info chmod. 9.4. Настройка разрешений в символьном формате chmod Проблема Требуется установить некоторые биты разрешений, сохранив значения остальных битов. Числовые форматы chmod позволяют задавать только все биты разрешений одновременно. Решение Самым распространенным применением символических обозначений chmod является добавление бита исполнения в атрибуты файла без изменения остальных разрешений: $ chmod +x сцендрий По умолчанию используется режим а (АН), поэтому данный пример разрешит исполнение сценария всем пользователям. Следующая команда устанавливает бит исполнения только для владельца файла:
9.4. Настройка разрешений в символьном формате chmod 145 $ chmod u+x сценарий Также существует возможность сброса отдельных битов. Следующая команда лишает группу и прочих пользователей права исполнения: $ chmod go-x сценарий Быстрая установка бита setgid для каталога с целью создания общего каталога. Все файлы, созданные в этом каталоге, будут принадлежать той же группе, что и сам каталог: $ chmod +s /общий-каталог Сброс всех разрешений для группы и прочих пользователей: $chmod go* сценарий Следующая команда предоставляет группе те же разрешения, которыми обладает владелец файла: $chmod g=u сценарий Комментарий Символическая запись chmod порой бывает довольно сложной. Следующий пример стирает все существующие разрешения и приводит их в исходное состояние: $ chmod -v ae.u-rwx.g=srx.o*r сценарий То же самое можно сделать командой chmod 754. Символическая форма записи также называется мнемонической: or — чтение (Read); О w — запись (Write); О х — исполнение (Execute); О X — файл должен уже обладать разрешениям исполнения или быть каталогом; О s —назначение идентификатора пользователя или группы при исполнении — опасно! Не используйте с исполняемыми файлами (по крайней мере, если вы не до конца представляете, что делаете); О t — бит закрепления; Ой- владелец файла; Од — группа, которой принадлежит файл; О о — прочие пользователи; О + — добавление новых разрешений к действующим; О = — замена действующих разрешений; О сброс разрешений. См. также info chmod; раздел 9.7.
146 Глава 9. Операции с файлами и разделами 9.5. Назначение владельца файла командой chown Проблема Требуется сменить владельца файла или каталога. Возможно, вы скопировали какой-нибудь файл в другой каталог, но не можете отредактировать его без смены владельца. Многие проблемы в Linux возникают из-за неправильно заданных разрешений или права принадлежности. В таких случаях сообщения вида «Permission denied» и «File is read-only» появляются там, где их быть не должно. Решение Воспользуйтесь командой chown и смените владельца и/или группу, которой принадлежит файл: # chown пользователь файл # chown пользователь:группа файл # chown :группа файл Пример: $ chown -v carlasishare 1ndex.txt changed ownership of 'index.txt' to carlasrshare $ chown -v :share toc.txt changed ownership of 'toc.txt' to :share Комментарий Рядовые пользователи могут только вносить изменения в принадлежащие им файлы и не могут передать право владения файлом другому пользователю. Тем не менее пользователи могут изменять принадлежность к группам (при условии, что они принадлежат как к исходной, так и к итоговой группе). См. также info chown. 9.6. Выполнение массовых операций командой chown Проблема Требуется сменить владельца каталога и его содержимого, или только содержимого, или файлов из списка, или передать право владения файла от одного кода UID к другому. Решение Команда chown позволяет выполнять некоторые массовые операции. Также можно воспользоваться командой find или метасимволами командного процессора.
9.7 Создание общих каталогов с использованием setgid и бита закрепления 147 Чтобы сменить владельца сразу для нескольких файлов, передайте список файлов, разделенный пробелами: # chown carlas file.txt fi1e2.txt file3.txt Список файлов также можно задать при помощи метасимволов командного процессора: # chown carlas *.txt Следующая команда передает все файлы пользователя другому пользователю: # chown -R -v --from vain piglet /shared/scripts To же самое можно сделать при помощи команды find: # find /-user valh -exec chown -v piglet {} \; Команда find также дает возможность находить файлы по коду UID, что не может сделать chown: # find / -uid 1050 -exec chown -v 1200 {} \; Смена владельца каталога со всеми подкаталогами и файлами, с подробным выводом: # chown -R -v piglet /shared/scripts: changed ownership of 'scripts/backups.tgz' to piglet changed ownership of *scripts/fake-spec-rpm' to piglet В команде можно использовать как имя пользователя, так и UID. Если учетная запись пользователя была удалена и в системе остались «бесхозные» файлы, то для их поиска придется использовать UID. См. также info chown; раздел 8.6. 9.7. Создание общих каталогов с использованием setgid и бита закрепления Проблема Пользователям нужен общий каталог для обмена файлами. Вы хотите, чтобы все общие файлы принадлежали одной группе. Решение Воспользуйтесь битом setgid для автоматического назначения файлов принадлежности к общей группе. Вот как это делается в восьмеричной записи: # chmod -v 2775 /общий-каталог Также можно использовать символическую запись: # chmod -v +s /общий-каталог
148 Глава 9. Операции с файлами и разделами Учтите, что флаг +s устанавливает оба бита, setgid и setuid, что может создать угрозу для безопасности, если в этом каталоге хранятся исполняемые файлы или сценарии. Команда chmod 2775 устанавливает только бит setgid. ВНИМАНИЕ Бит setuid пробивает большую брешь в системе безопасности. Не используйте его для исполняемых файлов. Программы, использующие его (например, /usr/bin/passwd), содержат внутренние меры защиты для предотвращения эскалации привилегий и других нарушений. Если в системе имеются сценарии, которые должны запускаться пользователями, создайте для этой цели специальную группу. Установите статический бит (sticky bit), чтобы файл не мог быть удален никем, кроме владельца: # chmod -ft fобщий_катапог или # chmod 3775 /общий_натапог Комментарий Все файлы, создаваемые в каталоге, принадлежат той же группе, что и сам каталог. Все файлы, скопированные в каталог, сохраняют принадлежность исходной группе. Чтобы разные пользователи могли работать с одним каталогом, они должны принадлежать к одной группе. Разрешения файлов, создаваемых в каталоге, определяются масками umask владельцев. Каталог/tmp является классическим примером каталога, использующего статический бит: # stat /tmp Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) Каталог/tmp должен быть общедоступным для чтения и записи, но мы не хотим, чтобы пользователи или процессы удаляли чужие временные файлы. Проблема решается при помощи статического бита. Бит setuid позволяет пользователям выполнить команду с такими же разрешениями, как у владельца файла. Именно так рядовые пользователи могут изменять свои пароли, хотя запись в файл /etc/passwd разрешена только суперпользователю root: $ stat /usr/bin/passwd File: */usr/bin/passwd' Size: 26584 Blocks: 56 10 Block: 4096 regular file Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Комментарий У статических битов есть еще одно применение. Давным-давно установка этого бита для исполняемого файла приводила к тому, что файл оставался в памяти после завершения его выполнения. В доисторическую эпоху Unix с примитивным управлением памятью и слабосильным оборудованием это ускоряло запуск программ. В наши дни об этом можно не думать. См. также info chmod; раздел 9.2.
9.8. Назначение разрешений по умолчанию с использованием маски umask 149 9.8. Назначение разрешений по умолчанию с использованием маски umask Проблема Файлы создаются с некоторым стандартным набором разрешений по умолчанию. Как задать эти разрешения? Решение Разрешения по умолчанию определяются маской umask. Чтобы узнать текущее состояние маски, введите команду: $ umask 0022 или $ umask -S u-rwx.g-rx.o-rx Чтобы временно назначить новую маску до конца текущего сеанса, введите команду $ umask 0002 Долгосрочное изменение маски umask обеспечивается включением строки umask- хххх в файл -/.bashrc. Часто используемые значения umask перечислены в табл. 9.3. Таблица 9.3. Часто используемые значения umask Umask 0002 0022 0007 0077 Пользователь Все Все Все Все Группа Все Чтение и исполнение Все Нет Прочие Чтение и исполнение Чтение и исполнение Нет Нет Комментарий В табл. 9.4 показано, как составить маску umask для любой комбинации разрешений. Таблица 9.4. Все значения umask Umask Разрешения файлов Разрешения каталогов 7 6 5 4 3 2 1 0 Нет Нет Запись Запись Чтение Чтение Чтение и запись Чтение и запись Нет Исполнение Запись Запись и исполнение Чтение Чтение и исполнение Чтение и запись Чтение—запись—исполнение
150 Глава 9. Операции с файлами и разделами Когда программа (например, текстовый редактор или компилятор) создает файл, она жестко кодируется на задание файловых разрешений 0666 или 0777. Если программа знает, что создаваемый файл является исполняемым, она устанавливает разрешения 0777. На практике чаще всего используется значение 0666; именно поэтому для сценариев приходится выполнять команду chmod +х. Как правило, ни 0666, ни 0777 не являются идеально подходящими, поэтому маска umask исключает ненужные биты. Например, с назначением маски umask 0002 обычным файлам будут назначаться разрешения 0664, а исполняемым — 0775. 9.9. Монтирование и демонтирование съемных дисков Проблема Как вставлять и удалять съемные диски — дискеты, компакт-диски или флэш- диски с интерфейсом USB? Решение Используйте команды mount и umount. Пример монтирования дисковода CD-ROM: # mount -г -t iso9660 /dev/scdO /cdrom Ключ -г означает доступ только для чтения; ключ -t определяет тип файловой системы. Строка /dev/scdO определяет имя, назначаемое устройству ядром, /cdrom — каталог, в котором монтируется устройство. Он должен присутствовать в системе перед монтированием диска. Тип файловой системы определяется командой file: $ file • < /dev/scdO /dev/stdin: ISO 9660 CD-ROM filesystem data 'Datal При монтировании диска CD-ROM ключ -г можно не указывать. Команда выдаст предупреждение, но диск смонтирует: # mount «t iso9660 /dev/scdO /cdrom mount: block device /dev/scdO is write-protected, mounting read-only Следующая команда монтирует дискету для чтения/записи: # mount -w /dev/fdO /floppy Следующая команда монтирует флэш-диск с интерфейсом USB. Ключ noatime должен использоваться для перезаписываемых носителей с ограниченным количеством операций перезаписи (таких, как CD/DVD-RW или флэш-диски): # mount -w -о noatime /dev/sdal /memstick Смонтированное устройство демонтируется командой # umount /memstick Возможно, вы получите ответ вида # umount /memstick umount: /memstick: device is busy
9.10. Настройка монтирования файловых систем в /etc/fstab 151 Это означает, что приложение (командный иитепретатор, файловый менеджер) читает данные из файловой системы. Дополнительная информация выводится командой Isof (LiSt Open Files): $ lsof /memstick COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME gs 938 dawnm 128r DIR 2.0 1024 12 /memstick/may-04.pdf bash 938 dawnm 129r DIR 2.0 1024 24 /memstick Далее можно либо закрыть приложения, либо убить их одной командой: # МП -9 Msof -t /memstick* Команда mount может выполняться только суперпользователем root. Чтобы другие пользователи могли монтировать съемные диски, необходимо отредактировать /etc/fstab (см. следующий раздел). Комментарий Ошибка umount «Device is busy» чаще всего возникает из-за наличия открытого окна терминала, в котором смонтированное устройство является текущим рабочим каталогом: carl a&ri ndbag: / f 1 орру$ Очень важно, чтобы диск был демонтирован перед отключением. Это позволяет системе завершить операции записи и обеспечить корректное отключение. В более новых версиях Linux указывать тип файловой системы не обязательно, поскольку команда mount автоматически распознает типы файловых систем. См. также mount(8); раздел 9.10. 9.10. Настройка монтирования файловых систем в /etc/fstab Проблема Пользователям нужно записывать данные на компакт-диски, работать с флэш- дисками и другими съемными устройствами. Давать им привилегии root только для монтирования этих устройство нельзя, но только суперпользователь root может использовать команды mount, описанные в разделе 9.9. Также требуется выбрать файловые системы, автоматически монтируемые при загрузке системы. Решение Добавьте в файл /etc/fstab записи с определением точек монтирования и разрешений доступа. В следующем примере показан пример/etc/fstab с разделом Linux, двумя разделами Windows и съемными носителями:
154 Глава 9. Операции с файлами и разделами # /sbin/fdisk -1 Oisk /dev/hda: 20.5 GB. 20576747520 bytes 255 heads. 63 sectors/track. 2501 cylinders Units - cylinders of 16065 * 512 - 8225280 bytes Device Boot Start End Blocks Id System /dev/hdal /dev/hda2 /dev/hda3 /dev/hda5 /dev/hda6 /dev/hda7 * 1 894 1034 2437 1034 1671 893 1033 2501 2501 1670 2436 7172991 1124550 11791710 522081 5116639* 6152863+ 7 с f 82 83 83 HPFS/NTFS W95 FAT32 (LBA) W95 Ext'd (LBA) Linux swap Linux Linux Команда df (Disk Free) покажет, какие разделы уже смонтированы и какие точки подключения при этом используются: $ df Filesystem lK-blocks Used Available Use* Mounted on /dev/hda6 5116472 1494584 3621888 30* / /dev/hda7 6152668 4011652 2141016 66* /home Команда df также может использоваться для отображения информации об одном смонтированном разделе. Ключ -h выводит числовые значения в более удобном формате: $ df -h /dev/hdc6 Filesystem Size Used Avail Use* Mounted on /dev/hdc6 4.9G 1.4G 3.5G 29* /home Раздел Windows NTFS /dev/hdal монтируется так: # rokdir -m 755 /win2k # mount -t ntfs -r /dev/hdal /win2k ВНИМАНИЕ Поддержка записи в NTFS находится на экспериментальной стадии. Разрешая ее, вы рискуете своими данными в разделе NTFS, поэтому в команде mount присутствует ключ -г. Для организации общего доступа к файлам NTFS используйте Samba. Демонтирование тома осуществляется командой # umount /w1n2k См. также mount(8), The NTFS FAQ (http:/linux-ntfs.sourceforge.net/info/ntfs.html). 9.12. Определение имен устройств для mount и fstab Проблема Требуется смонтировать дисковое устройство: жесткий диск с интерфейсом IDE или SCSI, CD, DVD, флэш-диск USB или Zip-диск. Но вы не знаете, какое имя устройства следует использовать — где его найти?
9.12. Определение имен устройств для mount и fstab 155 Решение Воспользуйтесь командами dmesg и fdisk. Команда dmesg находит имена устройств, а команда fdisk отображает нумерацию разделов на жестких дисках. Возможно, вам также поможет официальный список имен /dev по адресу http://www.lanana.org/ docs/device-list/devices.txt (если в вашей системе установлены исходные тексты ядра, возможно, файл devices.txt находится в каталоге /usr/src/). Следующая команда ищет информацию CD-устройств в выходных данных dmesg: $ dmesg | grep -1 cd hdc: ATAPI CDROM. ATAPI CD/OVO-ROM DRIVE hdc: ATAPI 40X CD-ROM DRIVE. 128K cache. UDMA (33) Быстрый поиск в devices.txt дает следующий результат: Second IDE hard disk/CD-ROM interface 0 - /dev/hdc Master: whole disk (or CD-ROM) He обращайте внимания на 0»; имя устройства — /dev/hdc. А вот как выглядят дисководы CD/DVD, использующие подсистему IDE/ SCSI: $ dmesg | grep И cd hdb: TOSHIBA OVO-ROM SO-M1202. ATAPI CO/OVD-ROM drive hdc: LITE-ON LTR-24102B. ATAPI CD/DVD-ROM drive ide-cd: ignoring drive hdb ide-cd: ignoring drive hdc Type: CD-ROM ANSI SCSI revision: 02 Type: CD-ROM ANSI SCSI revision: 02 Attached scsi CD-ROM srO at scsiO. channel 0. id 0. lun 0 Attached scsi CD-ROM srl at scsiO. channel 0. id 1, lun 0 scdO: scsi3-mmc drive: 32x/32x cd-rw xa/form2 cdda tray Uniform CD-ROM driver Revision: 3.12 scdl: scsi3-mmc drive: 131x/40x writer cd/rw xa/form2 cdda tray Итак, устройствам соответствуют имена /dev/scdO и /dev/scdl. Для жестких дисков приходится указывать конкретные разделы, поскольку каждый раздел является самостоятельным блочным устройством. Команда fdisk -I выводит информацию обо всех разделах на всех обнаруженных жестких дисках: # /sbin/fdisk -1 Disk /dev/hda: 20.5 GB. 20576747520 bytes 255 heads. 63 sectors/track, 2501 cylinders Units - cylinders of 16065 * 512 - 8225280 bytes Device Boot Start End Blocks Id System /dev/hdal /dev/hda2 /dev/hda4 /dev/hda5 /dev/hda6 /dev/hda7 * 1 894 1034 2437 1034 1671 893 1033 2501 2501 1670 2436 7172991 1124550 11791710 522081 5116639+ 6152863+ 7 с f 82 83 83 HPFS/NTFS W95 FAT32 (L8A) W95 Ext'd (LBA) Linux swap Linux Linux Скопируйте имя устройства из столбца Device. А вот как команда fdisk отображает устройства USB: Disk /dev/sda: 65 MV. 65536000 bytes 8 heads. 32 sectors/track. 500 cylinders
156 Глава 9. Операции с файлами и разделами Units - cylinders of 256 * 512 - 131072 bytes Device Boot Start End Blocks Id System /dev/sdal * 1 499 63586 6 FAT16 Комментарий Каждому запоминающему устройству соответствует блочное устройство в каталоге /dev. Имена устройств определяются способом физического подключения. Примеры: О /dev/hda — первичное устройство па IDE0 (весь диск); О /dev/hdb — вторичное устройство на IDE0 (весь диск); О /dev/fdO — флоппи-дисковод на контроллере 0, устройство 0; О /dev/fdl — флоппи-дисковод на контроллере 0, устройство 1; о /dev/sda — первый диск SCSI (весь диск); О /dev/sdb — второй диск SCSI (весь диск). Имена запоминающих устройств в Linux формируются по следующей схеме: О /dev/fd* — флоппи-дисководы; О /dev/hd* — дисководы IDE; О /dev/sd* — дисководы SCSI; О /dev/sd* — запоминающие устройства USB; О /dev/hd* - дисководы CD/DVD-ROM с интерфейсом IDE/ATAPI; О /dev/sd* - дисководы CD/DVD-R/RW с интерфейсом 1DE/ATAPI; О /dev/sd*, /dev/hd* или /dev/XXXx4 — Zip-дисководы. Устройствам IDE и USB, использующим подсистему эмуляции SCSI, иногда присваиваются имена/dev/sr*, которые представляют собой символические ссылки на/dev/sd*. Если в вашей системе установлены исходные тексты ядра, поищите определения имен /dev в файле devices.txt. См. также Глава 5; официальный список имен /dev (http://www.lanana.org/docs/device-list/ devices.txt или файл devices.txt в каталоге /usr/src/* вашей системы). 9.13. Создание файлов и каталогов Проблема Требуется упорядочить файлы, разместив их в каталогах. Но откуда берутся каталоги? И если на то пошло, как создать файл?
9.14. Удаление файлов и каталогов 157 Решение Воспользуйтесь командами mkdir и touch. Команда mkdir создает каталоги. Создание нового подкаталога в текущем каталоге: $ mkdir photos Следующая команда создает новый каталог верхнего уровня (эта операция разрешена только суперпользователю): # mkdir /localjrins При создании каталога можно указать разрешения: # mkdir -m 755 /shared Чтобы создать подкаталог и все его родительские каталоги, используйте ключ -р: $ mkdir -р photos/scanned/jpgs/thumbs Большинство файлов создается программами (текстовыми и графическими редакторами, компиляторами и т. д.). Пустой файл также можно создать командой touch: $ touch newfile.txt Комментарий Команда touch обычно используется в сценариях для создания новых файлов, а также для заполнения каталогов файлами с целью тестирования. См. также mkdir(l), touch(l). 9.14. Удаление файлов и каталогов Проблема Ваша система переполнена файлами и каталогами. Как удалить те из них, которые вам больше не нужны? Решение Используйте команду rm (ReMove) — но будьте внимательны! Команда rm удаляет файлы и каталоги без предупреждения. Удаление одного файла с расширенным выводом: $ rm -v game-stats.txt removed 'game-stats.txt' Удаление с запросом подтверждения: $ rm -vi dpkgllst rm: remove regular file 'dpkgl1st'?y removed 'dpkglist' Ключ -г (Recursive) обеспечивает удаление каталога со всеми файлами и подкаталогами: $ rm -rvi /home/games/stats/baseball
158 Глава 9. Операции с файлами и разделами Команда удаляет каталог/baseball вместе со всем содержимым. Для удаления групп файлов можно использовать метасимволы командного процессора: $ гга -v *.txt removed 'file4.txt' removed 'file5.txt' removed 'file6.txt' removed Tile7.txt' Или: $ rm -v file* ВНИМАНИЕ Ключ -f (Force) обеспечивает принудительное выполнение команды. Это очень опасно! Команда ничего не сообщает пользователю, а просто удаляет все на своем пути. Комментарий Команда rm -rf / стирает всю корневую файловую систему. Некоторые личности предлагают новичкам выполнить ее, считая это забавной шуткой. Хотя обычно говорят «rm удаляет файлы», в действительности команда не удаляет файлы, а только отсоединяет их от i-узлов. Файл по-настоящему удаляется лишь после удаления всех жестких ссылок, указывающих на него, и перезаписи данных на диске. Рядовые пользователи могут удалять командой rm любые файлы в любых подкаталогах, доступных для них, но с каталогами дело обстоит иначе: команда rm удаляет только каталоги, принадлежащие данному пользователю. Команда touch на самом деле предназначена для изменения временных пометок файла. Ее применение для создания новых файлов может рассматриваться как неожиданный побочный эффект. Для удаления каталогов также существует команда rmdir. Эта команда отказывается удалять каталоги, содержащие какие-либо данные. На первых порах это помогает, но со временем начинает раздражать; многие программы создают файлы, не отображаемые в нормальных списках (имена файлов, начинающиеся с точки, обычно игнорируются; чтобы включить их в вывод, следует выполнить команду Is -а). Соответственно, при попытке выполнения rmdir команда скажет, что в каталоге еще остались файлы. Вероятно, со временем вы перейдете на команду rm -r. См. также touch(l),rm(l). 9.15. Копирование, перемещение и переименование файлов и каталогов Проблема В системе существуют каталоги и файлы. Как перенести файл в другой каталог? Как сменить имя файла? И как создать его копию?
9.16. Создание дисковых разделов Linux командой fdisk 159 Решение Воспользуйтесь командами ср и mv. Следующая команда копирует два файла из текущего рабочего каталога в каталог —/images2: $ ср -v navbar.gif redheart.gif ~/1mages2 'navbar.gif -> '/home/terri/images2/navbar.gif' 'redheart.gif -> 7home/terri/images2/redheart.gif При перезаписи файлов можно воспользоваться ключом -Ь для создания резервных копий старых файлов в приемном каталоге: $ ср -bv icon-zip.g1f main.gif ~/data2 'icon-zip.gif -> '/home/terri/data2/icon-zip.gif' (backup: 7home/terri/data2/icon- zip.gif) 'main.gif -> 7home/terri/data2/niain.gif (backup: 7home/terri/data2/main.gif-') Для сохранения полного пути к файлу используется ключ —parents: $ ср -v •-parents -/homes/images/kitchen.jpg -/data2 'home/terri/homes/images/ki tchen.jpg' -> 'home/terri/data2/homes/images/ki tchen.jpg' Ключ -s создает мягкие ссылки на файлы вместо копирования: $ ср -s navbar.gif redheart.gif ~/images2 Ключ -г копирует каталог со всеми подкаталогами: $ ср -rv -/homes/images/ /shared/archives Операции перемещения и переименования осуществляются командой mv. Следующая команда перемещает два файла в другой каталог: $ mv -v about.gif arrow.gif -/data2 'about.gif -> Vhome/terri/data/about.gif 'arrow.gif -> '/home/terri/data/arrow.gif Пример переименования файла: % mv -v downloads.gif email.gif 'downloads.gif -> 'email.gif Комментарий В графических файловых оболочках (таких, как Nautilus, Konqueror, Midnight Commander, Gentoo File Manager, gmc и Rox Filer) операции переименования и копирования обычно выполняются быстрее и проще. См. также mv(l),cp(l). 9.16. Создание дисковых разделов Linux командой fdisk Проблема Требуется разбить на разделы новый жесткий диск или создать раздел на базе свободного пространства на существующем жестком диске.
160 Глава 9. Операции с файлами и разделами Решение Первый способ: загрузите систему с диска Knoppix и воспользуйтесь QTParted — замечательным графическим приложением, которое создает, удаляет, перемещает и изменяет размеры разделов без уничтожения данных. Программа даже позволяет изменять размеры разделов NTFS. Также можно воспользоваться программой fdisk. Пример создания первичного раздела: # fdisk /dev/hda The number of cylinders for this disk is set to 2501. There is nothing wrong with that, but this 1s larger than 1024. and could in certain setups cause problems with: 1) software that runs at boot time (e.g.. old versions of LILO) 2) booting and partitioning software from other OSs (e.g.. DOS FDISK, OS/2 FDISK) Command (m for help): n Command action 1 logical (5 or over) p primary partition (1-4) P Partition number (1-4): 3 First cylinder (511-1232, default 511): 511 Last cylinder or +size +sizeM or +sizeK (511-1232. defaultl232): +3000M Command (m for help): w The partition table has been altered! Calling ioctlO to re-read the partition table Syncing disks # Вот и все. Изменения можно отменить вплоть до того момента, когда нажатие w запишет новую таблицу разделов на диск. Клавиша m выводит меню команд, а клавиша q завершает работу программы. Чтобы сохранить какие-либо данные в новом разделе, необходимо перезагрузить компьютер и разместить в разделе файловую систему (см. следующий раздел). Комментарий Команда Linux fdisk предназначена только для создания томов Linux. Для томов Windows следует использовать команду fdisk из MS-DOS. Далее приводится список часто используемых команд fdisk: От — вывод справки; О р — отображение текущей таблицы разделов; О d — удаление раздела; О п — создание нового раздела; О w — запись таблицы разделов на диск; О I — отображение списка типов файловых систем; О q — завершение работы fdisk без внесения каких-либо изменений.
9.17. Создание файловой системы в новом разделе 161 См. также fdisk(8). 9.17. Создание файловой системы в новом разделе Проблема На диске был создан новый раздел. Но пользоваться им еще нельзя; сам по себе раздел — не более чем фрагмент дискового пространства. Как разместить на нем файловую систему? Решение Воспользуйтесь командой той файловой системы, которую вы собираетесь использовать. Ext2 # mke2fs /dev/hda3 Ext3 # mke2fs -j /dev/hda3 ReiserFS # mkreiserfs /dev/hda3 JFS #mkfs.jfs/dev/hda3 XFS #mkfs.xfs/dev/hda3 Комментарий Команда mke2fs предназначена для создания файловых систем Ext2/3. Она является частью пакета e2fsprogs, загружаемого с сайта http://e2fsprogs.sourceforge.net. Команда mkreiserfs входит в поставку ReiserFS и является частью reiserfsprogs. Ее можно загрузить по адресу http://www.namesys.com. Команда mkfs.jfs входит в семейство jfsutils (http://www-124.ibm.com/jfs/). Команда mkfs.xfs входит в семейство xfsprogs (http://oss.sgi.com/project/xfs). См. также Раздел «Введение» настоящей главы; JFS (http://www-124.ibm.com/jfs/); XFS (http:// oss.sgi.com/project/xfs); ReiserFS (http://www.namesys.com/); Ext2/3 (http:// e2fsprogs.sourceforge.net/ext2.html).
Глава 10 Заплатки, настройка и обновление ядра 10.1. Введение Установка заплаток, настройка и обновления ядра Linux — весьма полезные операции, и ничего страшного в них нет. Они принадлежат к числу немногочисленных операций администрирования, требующих перезагрузки, и это обстоятельство может огорчить администраторов, гордящихся длительным временем непрерывной работы. В остальном эта процедура ничем не хуже, чем установка заплаток или обновление любых других программ. Вам потребуются исходные тексты ядра и дсс, компилятор GNU С. Исходные тексты ядра можно получить из двух источников: иа сайте вашего дистрибутива Linux или по адресу http://kernel.org. Разные дистрибутивы Linux в разной степени модифицируют ядро. Red Hat, SuSE и Mandrake вносят значительные изменения, Debian и Slackware ограничиваются минимальными модификациями. Установка «эталонного» ядра с сайта http://kernel.org может привести к нарушению работы дистрибутивов, использующих модифицированное ядро, поэтому лучше использовать исходные тексты ядра для вашего дистрибутива (в главах 2 и 3 рассказано, где достать и как установить программное обеспечение Linux, а в разделе А.2 описан процесс сборки). Как и в большинстве программ Linux, при установке заплатки вы не модифицируете существующее ядро. Заплатка применяется к исходным текстам, но которым затем строится новый двоичный файл, поэтому в итоге вы получаете два ядра. Это хорошо, потому что у вас остается исходное ядро на тот случай, если новое ядро не загрузится. Вы можете установить несколько различных ядер и протестировать последние версии в разных конфигурациях. Основные причины для модификации ядра: О оптимизация ядра для конкретного оборудования; О использование новых возможностей; О исключение ненужных функций; О тестирование новых функций; О обновление системы.
10.1. Введение 163 Настройка нового ядра Настройка конфигурации является не только самым длительным, но и самым важным этапом сборки нового ядра. На этом этапе вы решаете, какое оборудование, файловые системы, функции энергосбережения и т. д. будут поддерживаться ядром. В вашем распоряжении более сотни разных параметров и для каждого нужно принять три потенциальных решения: нужно ли включать данную возможность, и если нужно — оформить ли ее в виде загружаемого модуля или статически откомпилировать в ядро? Как правило, если возможно построить модуль, следует выбрать именно этот вариант. Модули экономят память, поскольку память для них выделяется лишь в случае их фактического использования. Кроме того, обновить или установить отдельный модуль проще, чем перестраивать все ядро. Программа конфигурации ядра содержит справку почти по каждому параметру. В справке говорится, можно ли оформить некоторую функцию в виде модуля или ее необходимо встроить в базовое ядро. Здесь вы найдете информацию о том, для чего нужна каждая функция, и рекомендации на случай, если вы не уверены, следует ли включать соответствующий режим. Если справки нет и вы не знаете, что делать — включайте. В худшем случае вы получите более громоздкое ядро с неиспользуемыми возможностями. Программа конфигурации ядра не позволит реализовать в виде модуля те функции, которые должны быть частью базового ядра. У этого правила есть лишь одно важное исключение: драйвер дискового устройства, содержащего корневую файловую систему. Вообще говоря, этот драйвер должен быть встроен в базовое ядро, чтобы система могла загрузиться, иначе возникает «порочный круг»: драйверы необходимы для загрузки корневой файловой системы, но файловая система не может загрузиться, потому что драйверы находятся в ней. Если драйверы не встраиваются в ядро, вам придется создать образ initrd. Initrd создает исходный виртуальный диск, который загружает драйверы дисковых устройств, что позволяет загрузить систему. Бытует распространенное заблуждение, будто система с загружаемыми модулями работает медленнее, чем монолитное ядро. На самом деле обращение к функциям сводится к простой передаче управления по адресу памяти, так что никаких различий в скорости не существует. Для настройки ядра 2.4 используется программа menuconfig, а для настройки ядра 2.6 — либо menuconfig, либо xconfig. Программа menuconfig создана на базе ncurses, так что вам не понадобится X. Если поддержка ncurses не установлена, либо установите ее, либо используйте исходную программу настройки ядра config, но это просто ужасно. Процесс затягивается на целую вечность, и если вы допустите хотя бы одну ошибку, все придется начинать заново. Программа xconfig была полностью переработана для ядра 2.6. Она чрезвычайно эффективна и удобна, а по каждому параметру пользователь может получить содержательную справку. Для ее запуска вам понадобится Qt, qt-devel, gtt и X. Ha рис. 10.1 показан пользовательский интерфейс xconfig во всей красе. Дерево сборки ядра содержит объемистую документацию; загляните в каталог linux-$VERSIOn/Documentation. В каталоге linux-$VERSION/README содержатся важные указания по поводу установки, а в каталоге linux-$VERSION/Documentation/ Changes — важная информация о версиях дсс и других используемых программах.
164 Глава 10. Заплатки, настройка и обновление ядра Cade л пишу level opttivit Gtrwni wiup 1 • -BCQitfgitff tiandxd barrel r*a<un?5 (Jd Lortabla module вдрл! Ргеспмг evci end Геантеэ ■ F-'wrrwwe-onwn г.мкг mwugcificnt optiam (ACPI aphj ACPt (А4ЛКС4 СоШфлОэт «nd Po*e ; д£м (Aibranctd Pihktf мтаэететч) Bit 1 CPU Frt^Jtncy uiftng (PC*. РОЮ*. E*A. MCA, KAJ PCi ндеид Suwon OtvKtDmtfl QtfttflC ОЛ* Option* lAtmnry 1 «hnoia jy DntH (M10] I mfMpffl Mtpgfl НННИПШ SCSI Otwe ujpport I-OM CO-ROW flrswi ДОЭТЯ, not OEf. ■ r*jtod*w& lupportf RAID and LVU> ' i- ийи ырт a«vic# подал. IEEE 1ЭН4 iFtrertrsi luppun i:o dt wf support CJАпатит PidrO import - -aifDAjinrf Jitaj >uu.sy«i^n 4upp":a ■■ ИАТЛАТАРЛИГМЙи. lUppwt - DEnn*icea OE'MFwi/ru onwiiiforniiapeflioppy jucport ! Р|(ЛЧ| Id* DGEdlTUPmiOrVHHttl'W Пе^ПГ<J On IDE d.r**S □ Si#PPorr fur SATA(a*pr««ad: connirtswtnJibflia sat a driven {NEW] □Uitojg <>t^ orjy jarftfff an priory interact . _: .: BUVrtiUlll-r -BPCUCACt Ш 1 QlDCUK C&ATAF1 CPROM Jt*P0ft ftincuk C**tAf4 TAPE luppvT ^ЕВДНИЕНТАО ■ QtKUM ЮЕАТАР1 FLOPPY WWXt BSCSiemulfl DOE TMkftt VC«t J Lncludi IDE/AT A-2 DISK tupport [BLK_0Ev_C£D'$*> тги «m -iiLHj'ii t utiirtctd in.pwt ген mfmall/CE пега лт ir you hav* aw^nAMLUOE очи, anotfieie is no *pet«i плаопю uk Lfw old мол in dn»-tr ml* id tay v V you гцгл> in SCSI-amy nystrm уаи сап iiy N Пега to ramp* tm drw ц i rnodJeL cnop« м here (M Do rwi tomriii* fill <l№*f si a module J your root rue syrtaro 1 (the uns ыпЬмгьпц tn« о*«саду ц ц i.iciied ашгщВЕ dn,k iTuniure wyif Рис. 10.1. Пользовательский интерфейс xconflg 10.2. Добавление новых возможностей в ядро 2.4 Проблема Требуется включить в ядро 2.4 новые возможности — например, поддержку нового оборудования, новых файловых возможностей или сетевых функций. Допустим, вы купили жесткий диск с интерфейсом USB для архивации данных, а раньше в системе USB-устройства не использовались. Как узнать, поддерживает ли система USB? И если не поддерживает — как добавить поддержку? Решение Загрузите свежие исходные тексты ядра и откомпилируйте ядро с использованием существующего файла .config, добавив в него новые возможности. Предварительно сделайте следующее: О убедитесь в том, что на диске имеется не менее 500 Мбайт свободного пространства для процесса сборки; о распечатайте выходные данные dmesg, Iscpi, cat/proc/cpuinfo и Isusb (за дополнительной информацией обращайтесь к главе 5); О создайте резервную копию всех данных и держите под рукой загрузочный диск аварийного восстановления; О найдите файл .config ядра.
10,2. Добавление новых возможностей в ядро 2.4 165 Чтобы добавить новые возможности в существующее ядро, загрузите новые исходные тексты той же версии ядра. Версия ядра выводится командой uname: $ uname -г 2.4.22 Распакуйте новые исходные тексты ядра в подкаталог, находящийся в вашем домашнем каталоге, — например, ~/src: $ tar xvjf Hnux-2.4.22.tar.bz2 Отредактируйте make-файл нового ядра (~/src/linux-2.4.22/Makefile) и присвойте новое значение параметру EXTRAVERSI0N — например, EXTRAVERSION«-new- kernel. Выполните следующие команды из каталога /~/src/linux-2.4.22: $ make шгргорег Скопируйте файл .config в каталог /~/src/linux-2.4.22. Переходите к настройке нового ядра. Программа конфигурации задаст многочисленные вопросы; на этом этапе выбираются новые возможности: $ make oldconfig Выполните следующие команды: $ make dep $ make bzImage $ make modules # su # make modulesJnstall # cp -/src/linux-2.4.22/arch/i386/boot/bzImage /boot/vmlinuz-2.4.22-new-kemel # cp ~/src/linux-2.4.22/System.map /boot/System.map-2.4.22-new-kernel Наконец, чтобы использовать новое ядро, включите его в загрузчик и перезагрузите компьютер. В GRUB соответствующая запись выглядит примерно так: title Kernel 2.4.22. new kernel root (hdO.O) kernel /boot/vmlinuz-2.4.22-new-kernel rooWdev/hdal ro Пользователи LILO делают следующее: image«=boot/vmlinuz-2.4.22-new-kernel label=Kernel 2.4.22. new kernel rooWdev/hdal read-only И не забудьте перезапустить LILO, чтобы новая конфигурация была записана в загрузочную запись: # /sbin/lilo Сохраните копию нового файла .config в каталоге за пределами дерева сборки, чтобы файл не был случайно удален или заменен. Присвойте ему новое, содержательное имя: $ cp ~/src/linux-2.4.22/.config -/kernel-configs/.conf1g-2.4.22-jan-04 Если вы убедились в том, что новое ядро работает нормально, можно удалить старое ядро, его каталог/ИЬ/тос1и1е5/$\/ЕР510М, дерево сборки и записи загрузчика (а если не хотите, оставьте их в системе).
166 Глава 10. Заплатки, настройка и обновление ядра Комментарий В документации часто рекомендуется разместить исходные тексты ядра и дерево сборки в каталоге /usr/src/linux, но делать этого не следует. В файле README ядра прямо сказано: «НЕ ИСПОЛЬЗУЙТЕ область /usr/src/linux! Она содержит (обычно неполный) набор заголовков, используемых библиотечными заголовками ядра. Заголовки должны соответствовать библиотеке и не зависеть от текущей версии ядра». Также не стоит злоупотреблять правами root и использовать каталог, требующий доступа root. Ядро может строиться где угодно, даже на полностью изолированном компьютере. Поиск файла .config Если ранее вы строили ядро в своей системе, файл .config будет находиться на верхнем уровне старого дерева сборки. Если сборка ядра не выполнялась, поищите в каталоге /boot, куда этот файл помешается большинством дистрибутивов. Файл в каталоге /usr/src/linux, скорее всего, является обобщенным и бесполезным для вашей конкретной конфигурации. Если в системе нет файла .config, перейдите к разделу 10.3, потому что вам придется настраивать конфигурацию ядра «с нуля». Команда make oldconfig будет работать, но она использует конфигурацию по умолчанию из дерева сборки, совершенно не соответствующую вашей системе. Команда make oldconfig сообщает, какой файл она использует: $ make oldconfig # Using defaults found in arch/i386/defconfig Этот файл вам не подходит! В выходных данных должно быть сказано: # Using defaults found in .config Прервите выполнение команды клавишами Ctrl-»-С и начните заново. См. также Раздел «Введение» настоящей главы; электронная справка в программе настройки ядра. 10.3. Усечение типового ядра 2.4 Проблема Требуется переделать ядро, входящее в ваш дистрибутив, и убрать из пего все лишние драйверы, а также избавиться от поддержки ненужного оборудования и функций. Решение Загрузите новые исходные тексты той же версии ядра, откомпилируйте новое ядро и настройте его конфигурацию «с нуля». Версия ядра выводится командой uname: $ uname -г 2.4.22
10.3. Усечение типового ядра 2.4 167 Предварительно сделайте следующее: О убедитесь в том, что на диске имеется не менее 500 Мбайт свободного пространства для процесса сборки; О распечатайте выходные данные dmesg, Iscpi, cat/proc/cpirinfo и Isusb (за дополнительной информацией обращайтесь к главе 5); О создайте резервную копию всех данных и держите под рукой загрузочный диск аварийного восстановления. Распакуйте новые исходные тексты ядра в подкаталог, находящийся в домашнем каталоге, — например, ~/src: $ tar cvjf linux-2.4.22.tar.bz2 Отредактируйте make-файл нового ядра (-/src/linux-2.4.22/Makefile) и присвойте новое значение параметру EXTRAVERSI0N — например, EXTRAVERSION«-slim-kerneL Выполните следующие команды из каталога /-/src/linux-2.4.22: $ make mrproper $ make menuconfig $ make dep $ make bzlmage $ make modules $ su $ make modulesjinstall # cp ~/src/linux-2.4.22/arch/i386/boot/bzImage /boot/vml1nuz-2.4.22-new-kernel # cp -7src/limix-2.4.22/System.map /boot/System.map-2.4.22-new-kernel В процессе настройки ядра следует помнить, что вы начинаете «с пустого места», поэтому необходимо включить каждую используемую функцию. Также проследите за тем, чтобы ненужные функции не включались. Некоторые базовые возможности, которые вам наверняка понадобятся: О поддержка загружаемых модулей, встроенная в ядро; О поддержка двоичных форматов a.out, ELF и MISC (в меню General Setup); О поддержка всех загрузочных устройств (дисков IDE, CD-ROM, флоппи-дисководов, дисков SCSI и USB), встроенпая в ядро. Если не включать эти функции или оформить их в виде модулей, для загрузки системе понадобится ramdisk (образ initrd). После завершения настройки включите новое ядро в загрузчик, перезагрузите компьютер и радуйтесь жизни. Не забудьте скопировать новый файл .config в каталог, находящийся за пределами дерева сборки, чтобы защитить его от случайного удаления или замены. Комментарий Описанная процедура настраивает новое ядро «с нуля». Команда make oldconfig не подходит, потому что она не изменяет старую конфигурацию, а позволяет только добавить в нее новые возможности. Типичное базовое ядро занимает около 1-3 Мбайт (в сжатом виде). Некоторые администраторы предпочитают усекать свое ядро до абсолютного минимума. На сервере, особенно доступном из Интернета, по соображениям безопасности стоит использовать как можно более компактное ядро. Впрочем, па настольных
168 Глава 10. Заплатки, настройка и обновление ядра системах и рабочих станциях небольшая избыточность не столь существенна и может быть даже удобной для внесения будущих изменений. См. также Раздел «Введение» настоящей главы; электронная справка в программе настройки ядра; раздел 10.2. 10.4. Обновление до последней стабильной версии ядра 2.4 Проблема Вы слышали, что к ядру вышло много обновлений и заплаток. Вам хотелось бы обновить старое ядро до последней стабильной версии (например, с 2.4.22 на 2.4.25), потому что это самый быстрый способ установки всех обновлений и заплаток. Решение Создайте резервную копию всех данных и держите под рукой диск аварийного восстановления. Распечатайте выходные данные dmesg, Iscpi, cat/proc/cpuinfo и Isusb. Распакуйте новые исходные тексты ядра в подкаталог, находящийся в домашнем каталоге, — например, ~/src: $ tar xvjf linux-2.4.25.tar.bz2 Отредактируйте make-файл нового ядра (-/src/linux-2.4.25/Makefile) и присвойте новое значение параметру EXTRAVERSI0N — например, EXTRAVERSION«-new- kernel. Выполните следующие команды из каталога /~/src/Linux-2,4.25: $ make mrproper Чтобы использовать существующий файл .config, скопируйте его в ~/$rc/linux-2.4.25 и продолжайте выполнять приведенные инструкции. В противном случае вернитесь к разделу 10.3. Выполните следующие команды: $ make oldconfig $ make dep $ make bzlmage $ make modules $ su # make modules_install # cp ~/src/linux-2.4.25/arch/i386/boot/bzImage /boot/vmlinuz-2.4.25-new-kernel # cp ~/src/1inux-2.4.25/System,map /boot/System.map-2.4.25-new-kernel Включите новое ядро в загрузчик и перезагрузите компьютер.
10.5, Построение ядра 2.6 169 Комментарий На сайтах http://lwn.net и http://kernetlrap.org публикуется самая свежая информация о новостях, изменениях, усовершенствованиях и проблемах и области ядра Linux. См. также Раздел «Введение» настоящей главы; электронная справка в программе настройки ядра; раздел 10.2. 10.5. Построение ядра 2.6 Проблема Вы хотите опробовать ядро 2.6, но для этого нужно знать новые команды сборки, отличающиеся от команд ядра 2Л. Решение В данном примере будет использоваться ядро версии 2.6.3. Создайте резервную копию всех данных и держите под рукой загрузочный диск аварийного восстановления. Распечатайте выходные данные dmesg, Iscpi, cat/proc/cpuinfo и Isusb. Загрузите и распакуйте новые исходные тексты ядра в подкаталог, находящийся в домашнем каталоге, — например, ~/src- Перейдите в каталог верхнего уровня нового дерева исходных текстов (~/src/linux-2,6.3). Отредактируйте make-файл нового ядра (-/src/Linux-2.6.3/Makefile) и присвойте новое значение параметру EXTRAVERSI0N — например, EXTRAVERSION=-test. Выполните следующие команды: $ make mrproper % make xconfig $ make $ su # make modules install # cp -/src/linux-2.6.3/arch/i386/boot/bzImage /boot/vmlinuz-2.6.3-test # cp ~/src/linux-2.6.3/System.map /boot/System.map-2.6.3-test Сохраните копию нового файла .config в каталоге за пределами дерева сборки. Включите новое ядро в загрузчик и перезагрузите компьютер. Комментарий Для запуска xconfig вам понадобится Qt, qt-devel и X. Также можно использовать программу menuconfig. Команда make без параметров заменяет make dep, make bzlmage и make modules.
170 Глава 10. Заплатки, настройка и обновление ядра См. также Раздел «Введение» настоящей главы; электронная справка в программе настройки ядра; раздел 10.2. 10.6. Добавление новых возможностей в ядро 2.6 Проблема Требуется добавить новые возможности в ядро 2.6. Решение Выполните инструкции из раздела 10.5, но вместо xconfig используйте old- config: $ make mrproper Скопируйте существующий файл .config в каталог/~/$гс/1лпих-2.6.3. Выполните следующие команды: $ make oldconfig $ make $ su # make modules install # cp -/src/Hnux-2.6.3/arch/i386/boot/bzImage /boot/vmlinuz-2.6.3-test # cp ~/src/11nux-2.4.22/System.map /boot/System.map-2.4.22-test Включите новое ядро в загрузчик и перезагрузите компьютер. Комментарий Не пытайтесь использовать старый файл .config от версии 2.4 — ядра сильно различаются, и у вас будет много проблем. Команда make без параметров заменяет make dep, make bzlmage и make modules. См. также Документация в дереве сборки ядра; раздел «Введение» настоящей главы; раздел 10.2. 10.7. Добавление нового загружаемого модуля ядра Проблема В системе было установлено новое оборудование (сетевая и/ш звуковая карта, устройство USB). Требуется установить новый модуль ядра (драйвер) для этого устройства.
10.8. Установка заплаток ядра 171 Решение В ядрах 2.4 и 2.6 используется одна п та же процедура. Перейдите в каталог с деревом сборки (например, ~/src/linux-2.4.25). Вам потребуется актуальный файл .config; скопируйте его на верхний уровень дерева сборки и выполните следующую команду: # make oldconfig В процессе настройки конфигурации найдите нужный драйвер и выберите его оформление в виде модуля (например, модуль tulip является универсальным драйвером для многих карт Ethernet). Затем выполните команды: $ make dep $ make modules # make modulesinstall # depmod -av Загрузите модуль командой modprobe: # modprobe tulip Процесс не требует перезагрузки системы. Комментарий Если использовать oldconfig почему-либо не удастся, используйте make menuconfig. Правда, это займет больше времени, и вам придется следить за тем, чтобы не упустить что-нибудь важное. При установке сторонних модулей, не входящих в дерево ядра, следует руководствоваться инструкциями производителя. Стандартная процедура включает зафузку исходных текстов, сборку модуля и его загрузку командой modprobe. Некоторые производители (например, nVidia) включают сценарий, который делает все за вас. Как правило, дистрибутивы проверяют оборудование при загрузке и автоматически загружают нужные модули. Если этого не происходит, вам придется внести изменения в стартовые файлы. В Red Hat и SuSE модуль включается в файл /etc/ modules.conf, в Debian используется файл /etc/modules, а в Slackware — файл rc.modules. Еще более простой способ — включить в ядро поддержку kmod, автоматического загрузчика модулей. В большинстве дистрибутивов она включается по умолчанию. В программах настройки конфигурации ядра для этой цели используется пункт «Automatic kernel module loading» (ядро 2.6) или «Kernel module loader» (2.4) в категории «Loadable module support». He используйте программу kerneld; начш тя с ядра 2.2, вместо нее используется kmod. См. также Раздел «Введение» настоящей главы; раздел 10.2. 10.8. Установка заплаток ядра Проблема Требуется установить заплатку ядра, чтобы добавить поддержку новых возможностей, исправить ошибку, протестировать новые функции и т. д.
172 Глава 10. Заплатки, настройка и обновление ядра Решение Загрузите заплатку и примените ее к исходным текстам ядра. Затем откомпилируйте и постройте новое ядро. В нашем примере ядро 2.6.3 будет обновлено до версии 2.6.4. Заплатка должна находиться в каталоге второго уровня дерева сборки: $ Is -7src linux-2.6.3 patclv2.6.4.bz2 Перейдите в каталог верхнего уровня дерева сборки, распакуйте и примените заплатку: $ cd linux-2.6.3 $ bzip2 -de ../patch-2.6.4.bz2 | patch -s -pi Ключ —dry-run позволяет протестировать команду: % bzip2 -de ../patch-2.6.4.bz2 | patch -s -pi •-dry-run Настройте конфигурацию и проведите сборку ядра. В дерево сборки предусмотрительно включен сценарий/scripts/patch-kernel для применения заплаток. Этот сценарий особенно полезен при установке нескольких заплаток, поскольку он автоматически применяет их в нужном порядке. Выполните в каталоге верхнего уровня команду $ scripts/patch-kernel Заплатки должны применяться по очереди, и все они должны находиться в системе. Например, для использования заплатки patch-2.6.5-rc6 вам также понадобятся первые пять заплаток в серии (rcl-rc5). Комментарий Заплатки ядра существуют в нескольких разновидностях. Заплатки re (Release Candidates) находятся в одном таге от включения в стабильное ядро, а кандидаты pre (Pre- Release) — в двух шагах. Если вам не терпится использовать новую возможность, но вы не хотите ждать новой стабильной версии, устанавливайте заплатки гс и pre. Официальные версии ядра на сайте Kernel.org хорошо протестированы и готовы к эксплуатации. Версии с четными номерами являются стабильными, а версии с нечетными номерами находятся в процессе разработки. Ядро Linux активно поддерживается вплоть до версии 2.0, а в архивах можно найти все версии ядра до первых версий Linux. См. также patch(l); Kernel Newbies (http://kernelnewbies.org); Kernel.org (http://kernel.org). 10.9. Удаление заплатки ядра Проблема Вы установили заплатку ядра, но теперь хотите избавиться от нее. Возможно, ядро стало работать нестабильно, а может, вы допустили ошибку и хотите начать все заново.
10.10. Создание образа initrd 173 Решение Воспользуйтесь той же командой, которая применялась для распаковки заплатки, и добавьте в нее ключ -R: $ bzip2 -de ../patch-2.6.4.bz2 | patch -s -pi -R См. также patch(l); kernel Newbies (http://kernelnewbies,org); kernel.org (http://kernel.org). 10.10. Создание образа initrd Проблема В системе используются диски SCSI. Из-за разнообразия драйверов SCSI вы хотите, чтобы драйверы загружались в виде модулей. В этом случае диски или контроллеры можно будет менять без повторной сборки ядра, а вам не хотелось бы отягощать ядро включением всех возможных драйверов. Но как перезагрузить систему без встраивания драйвера SCSI в базовое ядро? Решение Постройте образ initrd (виртуальный диск) командой mkinitrd после сборки ядра. Затем включите в загрузчик запись для загрузки образа. В ядрах 2.4 и 2.6 команда mkinitrd выполняется после команды make mo- dulesjnstall: # mkinitrd -o /boot/initrd-2.4.25-new.kernel.img Команда строит образ и устанавливает его в каталог /boot; остается лишь создать записи в загрузчике. В GRUB: title Kernel 2.4.25. new kernel root (hdO.O) kernel /boot/bzImage-2.4.25-new-kernel rooWdev/hdal ro initrd /boot/initrd-2.4.25-new-kernel.1mg Пользователи LILO делают следующее: image=/boot/bzImage-2.4.22-new-kernel initrde/boot/initrd-2.4.25-new-kernel.img label=Kernel 2.4.22. new kernel rooWdev/hdal read-only He забудьте выполнить /sbin/lilo, чтобы активировать изменения. Комментарий Обязательно прочитайте тап-страннцу mkinitrd, поскольку состав параметров может зависеть от дистрибутива. Ничто не мешает вам встроить драйвер SCSI в базовое ядро; использование initrd не является обязательным.
174 Глава 10. Заплатки, настройка и обновление ядра Как правило, в дистрибутивах Linux используется initrd, чтобы типовое ядро могло загружаться в большинстве систем без встраивания всех возможных драйверов. См. также mkinitrd(8). 10.11. Создание загрузочного диска в Debian Проблема Вы забыли создать загрузочную дискету при установке системы Linux и хотите создать ее сейчас. Вы умеете создавать загрузочные дискеты для GRUB или LILO, а также знаете, что вы можете бесплатно загрузить и записать диск Knoppix. Но все, что вам нужно, — это обычная загрузочная дискета для системы Debian. Решение Вам потребуется утилита mkboot и чистая дискета. По умолчанию загрузочный диск создается с использованием vmlinuz и текущего корневого раздела: $ mkboot Создание загрузочного диска с указанием ядра: $ mkboot vml1nuz-2.4.2l Также можно указать другой корневой раздел и ядро: $ mkboot /dev/hda2 vmlinuz-2.4.21 Если флоппи-дисковод имеет нестандартное расположение, укажите его с ключом -d: $ mkboot -d /dev/fdl Комментарий Программа mkboot входит в пакет debianutils. Не забудьте защитить дискету от записи, сдвинув вверх небольшую защелку. Всегда проверяйте загрузочные диски, прежде чем откладывать их для хранения. Диск должен храниться вместе с той системой, для которой он был создан. См. также mkboot(8). 10.12. Создание загрузочного диска в Red Hat Проблема Вы забыли создать загрузочную дискету при установке системы Linux и хотите создать ее сейчас. Вы умеете создавать загрузочные дискеты для GRUB или LILO,
10.12. Создание загрузочного диска в Red Hat 175 а также знаете, что вы можете бесплатно загрузить и записать диск Knoppix. Но все, что вам нужно, — это обычная загрузочная дискета для системы Red Hat/Fedora. Решение Вам потребуется утилита mkbootdisk и чистая дискета. Создание загрузочного диска с указанием ядра: $ mkbootdisk vralinuz-2.6.5-1.358 По умолчанию команда mkbootdisk не выводит данных. Ключ -verbose включает режим расширенного вывода: $ mkbootdisk •-verbose vmlinuz-2.6.5-1.358 Если имя флоппи-дисковода отлично от/dev/fdO, укажите его в командной строке mkbootdisk: $ mkbootdisk --device /dev/fdl vmlinuz-2.6.5-1.358 Комментарий He забудьте защитить дискету от записи, сдвинув вверх небольшую защелку. Всегда проверяйте загрузочные диски, прежде чем откладывать их для хранения. Диск должен храниться вместе с той системой, для которой он был создан. См. также mkbootdisk(8).
Глава 11 Запись CD и DVD 11.1. Введение Для системы Linux написано немало программ создания и записи CD/DVD. В настоящее время эта область стремительно развивается, и стандарты CD/D VD еще находятся в хаотическом состоянии. Существует несколько конкурирующих несовместимых стандартов, и на горизонте маячат новые стандарты — крупные компании все стремятся создать «волшебный диск», который можно было бы воспроизводить, но нельзя скопировать. Однако в настоящей главе наше внимание будет сосредоточено не на этой волнующей истории, а на базовых приемах записи дисков CD и DVD с данными. Вам потребуются пакеты cdrtools и dvd+rw-tools. Для простого создания дисков используйте КЗЬ — графический интерфейс для cdrtools, cdrdao, mkisofs, growisofs и других утилит командной строки. КЗЬ упрощает подготовку дисков и предоставление пользователям привилегий root, необходимых для работы cdrecord и cdrdao. Программа логична и проста в работе; лично я считаю ее лучшим средством записи CD/DVD на всех платформах. Конечно, в мире Linux существует много других альтернатив, в том числе GCombust, X-CD-Roast и Gnome Toaster. Все эти программы просты в использовании, поэтому в настоящей главе будут использоваться средства командной строки. Хорошее владение ими также упростит работу с графическими программами, потому что вы будете понимать их команды и экзотическую терминологию. Главное новшество ядра 2.6 заключается в том, что для дисков CD/DVD больше не требуется эмуляция SCSI. Вместо того чтобы определять адреса шины SCSI командой cdrecord scanbus, просто укажите имя устройства: # cdrecord devWdev/hdc <но»аицы> ВНИМАНИЕ Если вы обновили ядро 2.4 до ядра 2.6, а для работы с дисководами CD/DVD ранее использовался интерфейс IDE-SCSI, проследите за тем, чтобы записи IDE-SCSI были удалены из загрузчика. В противном случае загрузка будет сопровождаться странными ошибками.
ll.l. Введение 177 Форматы и стандарты Далее перечислены основные аппаратные стандарты. О CD-R — записываемый компакт-диск; также встречается термин WORM (Write Once, Read Many). Диски CD-R универсальны и должны читаться в любом дисководе CD-ROM. О CD-RW — перезаписываемый компакт-диск, или WMRM (Write Many, Read Many). Диски CD-RW читаются всеми современными дисководами. О CD-ROM — Compact Disc Read-Only Memory. Коммерческие диски производятся штамповкой, а не записываются лазерным лучом, поэтому запись на них невозможна. О Mount Rainier ReWrite — электроника, необходимая дисководу для поддержки UDF. О DVD-Video — стандарт коммерческих видеодисков, воспроизводимый на всех устройствах DVD. О DVD-R и DVD+R — формат WORM; воспроизводится всеми проигрывателями DVD. DVD-R существует в двух разных несовместимых типах дисков: DVD-R(A) и DVD-R(G). Диски А не могут использоваться в устройствах записи G, и наоборот. О DVD-RAM — перезаписываемые диски, предназначенные для хранения данных. Теоретически один диск способен выдержать до 100 000 операции перезаписи. Диск также может использоваться для записи и воспроизведения фильмов на PC, но, скорее всего, обычный проигрыватель DVD не сможет прочитать диск в формате DVD-RAM. О DVD-R/RW — формат, разработанный для записи фильмов и поддерживаемый DVD Forum (http://www.dvdforum.com). О DVD+R/RW — конкурирующий стандарт, несовместимый с DVD-R/RW и поддерживаемый DVD+RW Alliance (http://www.dvdrw.com). Только DVD+R/ RW поддерживает UDF. Дисководы DVD нового поколения поддерживают все форматы. Автономные проигрыватели DVD все еще участвуют в войне стандартов между форматами DVD+ и DVD-. Стандарты файловых систем CD и DVD. О El Torito — спецификация формата загружаемого диска. О UDF (Universal Disk Format) — стандарт файловой системы с иыкрементиой записью пакетов. Позволяет переносить файлы прямо на диск, как на дискету 3,5". Предполагалось, что в ядре Linux 2.6 будет реализована полноценная поддержка UDF, но этого не произошло. О 1SO-9660 — старьга стандарт с поддержкой имен файлов в формате 8.3 (из доисторической эпохи MS-DOS, когда имена файлов содержали до 8 символов и файл имел расширение из 3 символов).
178 Глава 11. Запись CD и DVD О Rock Ridge — расширение ISO-9660 с поддержкой длинных имен и символических ссылок в стиле Unix. Сохраняет все атрибуты файла, в том числе владельца и разрешения. При чтении дисков в системе Windows файловые атрибуты Unix не отображаются. О Joliet — расширение ISO-9660 компании Microsoft. Позволяет использовать в именах файлов символы Юиикода, а также поддерживает длинные имена. Кроме того, создает усеченные имена файлов с целью совместимости с MS- DOS (странные имена вида FILENA~1.TXT). Имена файлов содержат до 64 символов, могут включать пробелы и читаются на компьютерах с системой Windows 95 и выше, а также на компьютерах Macintosh с расширением Joliet Volume Access. На Mac не читаются имена файлов Joliet длиной более 31 символа. Документация по стандартам CD: О Yellow Book — физический формат компакт-дисков с данными; О Orange Book — физический формат записываемых компакт-дисков с поддержкой многосеансовой записи; О Red Book — стандарт CD Audio, описывающий физические свойства диска и кодировку оцифрованного звука. Если вас интересуют технические подробности, перечисленные книги можно приобрести на сайте http://www.licensing.pholips.com. Важные термины из области записи дисков: О сеанс — сегмент диска, записанный за один раз и содержащий файлы данных или музыкальные дорожки. Диск может содержать несколько сеансов; О дорожка — программная область компакт-диска делится на дорожки; каждая дорожка может содержать данные только одного диска. Диск (даже DVD) может содержать не более 99 дорожек; О многосеансовая запись — позволяет постепенно добавлять файлы на диск (вместо того, чтобы записывать их все за один раз). Чтобы диск мог быть прочитан, его необходимо «закрыть», то есть зафиксировать, однако в этом случае добавить на него новые файлы уже не удастся; О SAO (Session-At-Once) — один полный сеанс: вводная запись (lead-in), программа и выводная запись (lead-out) на диске CD-R или CD-RW, записанная одной непрерывной операцией; О DAO (Disk-At-Once) — запись всего компакт-диска за один проход, или сеанс. Процесс записи должен завершиться без перебоев, и добавить к нему новые сеансы невозможно. Это самый надежный способ записи звуковых дорожек; О ТАО (Track-At-Once) — возможность выполнения записи за несколько проходов. Максимальное количество дорожек на диске равно 99. Дополнительная информация о DVD приведена в DVD FAQno адресу http:// www.dvddemystified.com/dvdfaq.html. Дополнительная информация о CD приведена в CD Recordable FAQ по адресу http://www.cdrfaq.org.
11.2. Определение адресов SCSI для записывающих дисководов CD и DVD 179 11.2. Определение адресов SCSI для записывающих дисководов CD и DVD Проблема В вашей системе используется ядро 2.4. Чтобы записать диск CD или DVD, необходимо знать адрес шины SCSI (параметр dev=) для вашего устройства записи. Решение Команда cdrecord -scanbus вернет необходимую информацию. Конфшурация отдельной системы с CD/DVD-ROM и устройством записи CD может выглядеть так: $ cdrecord -scanbus Cdrecord 1.10 (1686-pc-linux-gnu) Copyright (C) 1995-2001 Jrg Schilling Linux sg driver version: 3.1.24 Using libscg version 'schily-O.S' scsibusO: 0.0.0 0) 'TOSHIBA' 'DVD-ROM SD-M1202*. '1020' Removable CD-ROM 0.1.0 1) 'LITE-ON ' 'LTR-24102B ' '5S54' Removable CD-ROM 0.2.0 2) * 0.3.0 3) * 0.4,0 4) * 0.5.0 5) * 0.6.0 6) * 0.7.0 7) * Устройства записи DVD выглядят так: 1.2.0 2) 'PIONEER ' 'DVD-ROM OVO-303 ' '1.09' Removable CD-ROM Первые три числа задают шину SCSI, код устройства и код LUN (Logical Unit Number) соответственно. Четвертое число снова повторяет код устройства. В параметре cdrecord нужно передать три первых числа в следующем формате: dev-0.1.0 Комментарий Для выполнения команды cdrecord необходимы привилегии root. Чаще всего для того, чтобы пользователи могли использовать cdrecord, в системе создается группа cdrecord. В документации иногда встречается запись вида dev=1.0 Начальный 0 для нулевой шины SCSI часто не указывается. И все же проще ввести лишнюю цифру и не оставить ни малейшей неоднозначности. В ядре 2.6 отдельно задавать код устройства не нужно. В командной строке достаточно передать имя /dev: $ cdrecord dev/dev/hdc <команды> См. также cdrecord(l).
180 Глава 11. Запись CD и DVD 11.3. Включение эмуляции SCSI для устройства записи CD и DVD с интерфейсом IDE/ATAPI Проблема Программа записи CD (будь то cdrecord или графическая программа вроде X-CD- Roast или КЗЬ) сообщает, что она ие может найти в системе устройство записи. А может быть, программа видит дисковод CD-R/RW, но не воспринимает дисковод CD-ROM, и из-за этого вы ие можете копировать диски напрямую. Решение Убедитесь в том, что система эмуляции IDE-SCSI включена, а дисководы настроены для ее использования. Это относится только к ядру Linux 2.4, поскольку в ядре 2.6 дисководы IDE/ATAPI поддерживаются напрямую, с использованием стандартных обозначений /dev/hd*. Сначала убедитесь в том, что в системе доступен драйвер псевдоустройства ide-scsi: $ locate ide-scs1.o /1ib/modu1es/2.4.21/kernel/drivers/scsi/ide-scsi.o Затем отредактируйте два текстовых файла: /etc/modules.conf и конфигурационный файл загрузчика (пользователям Debian следует обращаться к подразделу «Комментарий», так как в этой системе используются другие файлы). Сначала определите имена дисковых устройств в своей системе: $ dmesg | grep ,Ahd,:' hda: IBM-DTLA-305020. ATA DISK drive hdb: TOSHIBA DVD-ROM SD-M1202. ATAPI CD/DVD-ROM drive hdc: LITE-ON LTR-24102B. ATAPI CD/DVD-ROM drive Имена нужных устройств — hdb и hdc. Включите следующие строки в файл /etc/modules.conf: alias scsijiostadapter ide-scsi options ide-cd ignore«"hdb hdc" alias scdO srjnod pre-install sg modprobe ide-scsi рге-install sr-mod modprobe ide-scsi рге-install ide-scsi modprobe ide-sd Затем пользователи L1LO добавляют следующий фрагмент в конец файла Hlo.conf, используя обозначения hd* для своих устройств: append="hdb=ide-scsi" append-"hdc=ide-scsi" Пользователи GRUB включают следующий фрагмент в файл /etc/grub.conf, в конец строки kernel, используя обозначения hd* для своих устройств: hdb=scsi hdc=scsi Полная строка должна выглядеть так: kernel /boot/vmlinuz-2.4.21 rooWdev/hdal ro hdb=scsi hdc=scsi
11.4. Создание компакт-диска с данными для распространения 181 Перезагрузите систему и убедитесь в том, что модуль ide-scsi загружен: # lsmod | grep 1de-scsi ide-scsi 9456 1 scsijrod 55124 2 [ide-scsi sr_mod] Теперь команда cdrecord -scanbus должна выводить имена устройств SCSI для всех дисководов, настроенных на использование IDE-SCSI. Обратите внимание: имена устройств изменились, поэтому при монтировании дисков вместо имен/dev/hd* будут использоваться имена/dev/scd*. Вероятно, стоит обновить файл /etc/fstab новыми именами /dev. Комментарий В Debian данные конфигурации модулей хранятся в файлах /etc/modules и /etc/ modutils/idecd_opts. Включите в/etc/modules строку ide-scsi Затем включите в/etc/modutils/idecd_opts строку options ide-cd ignore="hdb hdc Для ядра 2.6 никакие особые действия не нужны, достаточно указать в командной строке имя /dev: $ cdrecord dev«/dev/hdc <комзнды> См. также grub(8), lilo(8). 11.4. Создание компакт-диска с данными для распространения Проблема Требуется записать компакт-диске данными, который бы читался в Linux и Windows. Диск может содержать текстовые файлы, документы, программы или графические изображения. Решение Воспользуйтесь командами mkisofs, mount и cdrecord. Сначала упакуйте все файлы в единый файл .iso командой mkisofs, затем смонтируйте .iso для проверки правильности файловой системы. Затем запишите данные па диск командой cdrecord. В нашем примере файл .iso называется data.iso, компакт-диску присвоено имя data_disk, а все файлы копируются из каталога /disk_data. Точка монтирования для .iso — /test-iso. Выполните следующие команды: # mkisofs -J -r -v -V datadisk -о data, iso /diskdata # mkdir /test-1 so # mount -t 1so9660 -o ro.loop data.iso /test-1 so
182 Глава 11. Запись CD и DVD # Is /test-iso # umount /test-iso # cdrecord -v eject dev-0.1.0 data.iso Комментарий В представленном решении все команды выполняются пользователем root. Это сделано для простоты, потому что команды mount, mkisofs и cdrecord требуют привилегий root. Чтобы пользователи могли выполнять команду mount, используйте sudo. Для выполнения команд mkisofs и cdrecord создайте группу cdrecord. Назначьте ее владельцем mkisofs и cdrecord и включите пользователей в группу cdrecord. Помните, что в ядре 2.6 эмуляция IDE-SCSI не нужна, поэтому в командной строке cdrecord можно просто указать имя /dev: # cdrecord dev»/dev/hdc <команды> В этих нескольких командах выполняется довольно большая работа. Команда mkisofs берет все файлы и упаковывает их в один большой файл .iso. Если вам когда-либо доводилось загружать дистрибутив Linux для записи на компакт-диск, он был упакован в виде файла .iso. Это часто создаст проблемы для новичков, которые не понимают, почему они получили один гигантский файл вместо дерева каталогов с файлами Linux. Рассмотрим командную строку mkisofs более подробно: # mkisofs -J -r -v -V datadisk -о data, iso /diskdata Ключи: О -J — использование схемы имей Joliet для совместимости с Windows; О -г — использование схемы имен Rock Ridge для совместимости с Unix/Linux. Все файлы доступны для чтения для всех пользователей; О -v — расширенный вывод; О -V data_disk — определение идентификатора тома (data_disk). Это то самое имя диска, которое отображается в Проводнике Windows и в команде file - </dev/ scd* (о том, как определить имена/dev, рассказано в разделе 9.12); О -о data.iso /disk.data — имя нового образа .iso и файлы, выбранные для упаковки в .iso (в данном случае все содержимое /disk_data). Обратите внимание: корневой каталог/disk-data не копируется, только его содержимое. Монтирование .iso перед записью диска является простейшей страховкой. Если вы видите все свои файлы — можно переходить к записи. Если нет, значит, при формировании файла .iso была допущена ошибка и его придется построить заново. Проверка .iso осуществляется так: # mkdir /test-iso # mount -t iso9660 -о го.loop data.iso /test-iso Откройте каталог /test-iso и проверьте свои файлы. Параметры команды mount: О -t iso9660 — тип файловой системы. Компакт-диски с данными всегда относятся к типу iso9660 (кроме udf, по в этом случае вам не придется создавать образ .iso);
11,5, Формирование файловых деревьев на компакт-дисках с данными 183 о -о гоДоор data.iso — параметры монтирования data.iso: доступ только для чтения, с использованием файловой системы, внедренной в файл; О /test-iso — каталог, созданный как точка монтирования. После завершения проверки .iso можно записать файл на диск. # cdrecord -v -eject dev-0.1,0 data.iso Параметры команды: О -v — расширенный вывод; О -eject — извлечение диска после записи (не обязательно); О -dev«0,l,0 — адрес SCSI устройства записи компакт-дисков; О data.iso — имя файла .iso, который содержит файлы, записываемые на диск. Команда cdrecord по умолчанию записывает данные на максимальной скорости, поддерживаемой устройством и диском. При возникновении ошибок попробуйте снизить скорость записи: # cdrecord -v -eject speeds dev-O.l.O data.iso Современные записывающие устройства поддерживают высокую скорость записи (20Х и выше), но многие диски CD-R/CD-RW ограничиваются гораздо более низкими скоростями. Как правило, команда cdrecord автоматически подбирает оптимальную скорость записи. См. также cdrecord(l), mount(8), mkisofs(8); раздел 9.12; раздел 11.2. 11.5. Формирование файловых деревьев на компакт-дисках с данными Проблема При выборе каталогов, записываемых на компакт-диск, команда mkisofs отбрасывает корневые каталоги и сохраняет только файлы и подкаталоги. Но вам хотелось бы сохранить существующие файловые деревья (или создать новые). Решение Включите параметр -graft-points в вызов mkisofs. В следующем примере сохраняется существующая структура каталогов scripts и finances: $ Is finances scripts $ mkisofs -г -J -v -o cdlmgl.iso -graft-points scripts/-scripts finance/=finances Результат легко проверить — достаточно смонтировать образ и просмотреть структуру каталогов командой tree -d: $ sudo mount -t iso9660 -o ro.loop cdimgl.iso /mnt /iso $ tree -d /mnt/iso
184 Глава 11. Запись CD и DVD mnt |-- finances *-- scripts Допустим, вы хотите переместить эти два каталога в каталог /files/archive/june на компакт-диске. Прежде всего проследите за тем, чтобы каталог/files/archive/ June присутствовал на жестком диске. Затем выполните команду: $ mklsofs -г -J -v -о cdimgl.lso -graft-points \ files/archive/june/finances/=finances files/archive/june/scripts/=scripts Как и в предыдущем случае, результат проверяется монтированием: $ tree -dL 4 /mnt/iso mnt '-- files '-- archive '-- June |-- finances '-- scripts См. также Tree(l), mkisofs(8). 11.6. Копирование диска CD или DVD Проблема Требуется создать копию диска CD или DVD, содержащего данные, аудио- и видеоинформацию и т. д. Решение Чтобы напрямую скопировать содержимое исходного диска на записываемый диск, выполните следующую команду: $ cdrecord -v dev-O.l.O -isosize /dev/scdO Способ быстрый, но рискованный, потому что любой перебой в потоке данных приведет к порче всей копии. Лучше сначала кэшировать оригинал на жестком диске. В следующем примере сначала проводится проверка записи: $ dd iWdev/scdO oWtmp/diskfile.iso $ cdrecord dev=0.1,0 fs^m -v -eject -dummy /tmp/diskfile.lso Чтобы записать данные на диск, удалите ключ -dummy. Решение Как говорилось выше, ядро 2.6 не нуждается в эмуляции IDE-SCSI — просто используйте имя /dev: # cdrecord dev=/dev/hdc <команды> Не забудьте, что объем созданного временного файла равен объему копируемого диска.
11.7. Стирание диска CD-RW 185 Команда dd производит побайтовое копирование файла. Ее параметры: О if - входной файл (источник); О /dev/scdO — имя устройства (см. раздел 11.3). Монтирование диска не обязательно; О of — выходной файл (приемник); О /tmp/diskfile.iso — временная копия исходного файла на жестком диске. Присвойте ей любое имя по своему усмотрению, но сохраните расширение .iso. Параметры cdrecord остаются теми же, что и в разделе 11.4, но к ним добавляются два новых параметра: О fs«8m — размер циклического буфера: чем больше, тем лучше... до определенной степени. Помните, что перебои приводят к фатальным последствиям; параметр fs=8m создает буфер, объем которого достаточен для продолжения записи даже в том случае, если пересылка данных по каким-то причинам замедлится. Если 8 Мбайт недостаточно, вероятно, вам стоит подумать о модернизации своего компьютера. С другой стороны, значение больше 8 Мбайт не обязательно лучше, потому что операционная система может тратить время на перезагрузку таблиц MMU (Memory Management Unit). Значение но умолчанию равно 4 Мбайт. О -dummy — замечательная функция тестового прогона перед записью на диск. Дисковод выполняет все операции с выключенным лазером, что дает пользователю возможность обнаружить ошибки до того, как они будут перенесены на диск. См. также cdrecord(l), dd(l); раздел 11.4. 11.7. Стирание диска CD-RW Проблема Требуется стереть содержимое перезаписываемого диска, чтобы подготовить его к записи нового материала. Решение Воспользуйтесь параметром blank команды cdrecord. Значение blank=fast стирает только оглавление диска (ТОС), область памяти программы (РМА) и pregap: $ cdrecord -v blank~fast dev-0.1.0 Более полное стирание производится с параметром all: $ cdrecord -v blank-all dev«0.1.0 He рассчитывайте, что стирание полностью уничтожит информацию; при желании данные все равно удастся восстановить. Параметр blank=fast прекрасно подходит для повседневного использования, а работает намного быстрее — и к тому же продлевает жизнь диска CD-RW.
186 Глава 11. Запись CD и DVD Последний сеанс миогосеансового диска стирается командой $ cdrecord b1ank«session А в маловероятном случае, если ваш диск поддерживает стирание на уровне дорожек, вы можете стирать дорожки точно так же, как сеансы, начиная с последней: $ cdrecord blank-track Комментарий Стирание на уровне дорожек не поддерживается большинством дисководов. Стирание дорожек или сеансов в произвольной последовательности также невозможно — необходимо начать с конца и постепенно продвигаться к началу. Если при использовании какого-либо значения параметра blank будет получено сообщение об ошибке, попробуйте добавить ключ -force: $ cdrecord blank-track -force Но скорее всего, диск был поврежден и его лучше выбросить. Чтобы получить список всех режимов стирания, выполните команду $ cdrecord blank-help Помните, что CD-RW имеет ограниченный цикл жизни, а количество операций перезаписи не бесконечно. Точное значение зависит от производителя и качества диска, но диск должен выдержать как минимум 100 операций перезаписи, прежде чем он станет ненадежным. См. также Cdrecord(l). 11.8. Запись многосеансового компакт-диска с данными Проблема Требуется постепенно добавлять файлы на диск (в отличие от одноразовой записи). Команда cdrecord закрывает (фиксирует) диск, и добавить на него дополнительные файлы уже не удастся. Как обойти это ограничение? Решение Процесс состоит из двух шагов. Обе команды, cdrecord и mkisofs, поддерживают специальные параметры для создания многосеансовых дисков. При первоначальной записи файлов на CD создайте файл -iso обычным способом, а затем включите в командную строку cdrecord ключ -multi: $ cdrecord -v eject dev«0.1.0 -multi first-image.iso Затем создайте дополнительные образы .iso при помощи ключей -С и -М: $ mkisofs -о second-image.iso -J -г -V Session2 -С 'cdrecord dev«0.1.0 -msinfo* \ •M 0.1.0 /path-to-new-files
11.9. Создание загрузочного компакт-диска 187 Затем запишите новый файл .iso на диск, снова используя ключ -multi: % cdrecord -v -eject dev=0.1.0 -multi second-image.iso Операцию можно повторять сколько угодно раз. Добравшись до последнего сеанса, опустите ключ -multi. Диск необходимо закрыть и зафиксировать, в противном случае он не будет читаться большинством дисководов. Другой способ закрыть диск без записи дополнительного сеанса основан на использовании ключа -fix: $ cdrecord -v -fix -eject dev^O.l.O Комментарий Компакт-диски записываются по сеансам. В каждом сеансе задействовано определенное количество секторов диска. На одиосеаисовом диске присутствует вводная запись, одно оглавление, данные и выводная запись, присутствие которой фиксирует диск и не позволяет записать на него что-либо еще. Команда mkisofs позволяет связать несколько сеансов на многосеансовом диске. Для этого нужно знать номера начального и конечного секторов каждого сеанса. Рассмотрим параметры команды: % mkisofs -о second-image.iso -J -г -V Session? -С %cdrecord dev=*0.1,0 -msinftf \ ♦M 0.1.0 /path-to-new-files О -о second-image.iso — имя нового файла .iso (выбирается произвольно); О -J — схема имен Joliet для совместимости с Windows (не обязательно); О -г— схема имен Rock Ridge для совместимости с Unix/Linux, с открытием общего доступа к файлам для чтения. Параметр обязателен для создания мио- госеансовых дисков; О -С к cdrecord dev=0,l,0 -msinftT — ключ -С существует под несколькими именами: CD+, CDExtra, last_sess_start next_sess_start. Он указывает mkisofs на конечную точку последнего сеанса и начальную точку следующего сеанса. Обратные апострофы приказывают командному процессору найти и использовать значения автоматически. Их также можно сгенерировать вручную: cdrecord dev^O.l.O -msinfo 12968.20172 О -М 0Д,0 — параметр -М должен использоваться с -С. Он определяет адрес шипы SCSI устройства записи CD; О /путь_к_1Ювъш__файлам — список файлов (или каталог), включаемых в новый файл .iso. См. также cdrecord(l), mkisofs(8). 11.9. Создание загрузочного компакт-диска Проблема Требуется записать загрузочный компакт-диск.
188 Глава 11. Запись CD и DVD Решение Образ загрузочной информации включается в файл .iso командой mkisofs. Если загрузочный образ находится на дискете, сначала создайте каталог boot/ в файловом дереве, записываемом па диск, и скопируйте его туда: $ dd ifWdev/fdO of—/ cd- files /boot/ boot, img bse10k count-144 Или скопируйте его из другого каталога на жестком диске: $ ср boot.img -/cd-files/boot/boot/img Затем упакуйте .iso: $ mkisofs -г -b boot/boot.img -c boot/boot.catalog -o bootable-cd.iso -/cd-files Запишите диск командой cdrecord, как это обычно делается. Вы получаете загрузочный диск. Комментарий mkisofs использует спецификацию El Torito для создания загрузочного образа, который «обманывает» PC и заставляет его думать, что он видит загрузочную дискету. См. также mkisofs(8). 11.10. Разбиение больших файлов на несколько дисков Проблема Вы работаете с очень большим файлом — скажем, архивом .tar или огромным графическим изображением. Файл требуется сохранить на компакт-диске, но его объем превышает объем одного диска. Решение Разбейте файл утилитой split, а затем преобразуйте новые файлы в образы .iso и запишите их па диски. Сборка исходного файла осуществляется командой cat. Допустим, имеется 2-гигабайтный архив tar с именем big-backup. В следующем примере он разбивается на 650-мегабайтные фрагменты. Емкость компакт-диска составляет 700 Мбайт, но нужно оставить место для служебных данных: $ split -b 650m big-backup.tar.gz creating file 'xaa' creating file *xab' creating file 'xac' Каждый файл теперь занимает около 682 Мбайт. Преобразуйте каждый файл в образ .iso: $ for i in xa*: do echo -e "$i": mkisofs -o $i.iso $i; done
11.11. Запись дисков DVD с данными 189 После завершения обработки команда Is выведет следующий результат: $ Is хаа xaa.iso xab xab.iso хае хае.iso Теперь запишите каждый файл .iso на отдельный компакт-диск: % cdrecord -v -eject dev-0.1.0 xaa.iso $ cdrecord -v -eject dev=*0.1.0 xab.iso $ cdrecord -v -eject dev^O.l.O xac.iso Чтобы восстановить разбитый архив, скопируйте файлы .iso с компакт-диска на жесткий диск и воспользуйтесь командой cat: $ cat хаа xab xac > big-backup.tar.gz Или последовательно присоединяйте содержимое каждого компакт-диска к архиву на жестком диске без предварительного копирования: $ cat /cdrom/xaa > big-backup.tar.gz $ cat /cdrom/xab » big-backup.tar.gz $ cat /cdrom/xac » big-backup.tar.gz Собранному файлу можно присвоить любое имя. Главное — сохранить расширение tar.gz. После этого архив можно распаковать: $ tar xzvf big-backup.tar.gz Комментарий Описанный способ хорошо подходит для проведения архивации «на скорую руку» или перемещения большого количества файлов, но не используйте его для регулярной архивации. Если хотя бы один фрагмент будет испорчен, восстановить данные будет довольно трудно (особенно из сжатых файлов). О проведении масштабной архивации рассказано в главе 16. См. также split(l), tar(l), cat(l); глава 16. 11.11. Запись дисков DVD с данными Проблема Требуется записать на DVD данные — резервную копию системы, коллекцию графики или установочные диски Linux — из образов .iso. Решение Используйте утилиту growisofs из пакета dvd+rw-tools. Но прежде чем что-нибудь делать, убедитесь в том, что для устройства записи DVD не включена поддержка supermount/automount, поскольку это приведет к порче диска. Копирование файлов с жесткого диска на DVD осуществляется за одну операцию: # growisofs -Z <имя устройства> <команды mkisofs> <файлы>
190 Глава 11. Запись CD и DVD Пример: # grwisofs «Z dev-1,2.0 -dvd-compat -udf -R -J -v /home/carla Ha DVD легко скопировать дополнительные файлы. Всегда указывайте ключ -Z для первой группы файлов, записываемых на DVD, а затем используйте ключ -М для дополнительных файлов: # growisofs -Z dev-1,2.0 -dvd-compat -udf -R -J -v /etc # growisofs -M dev«1.2.0 -dvd-compat -udf -R -J -v /shared/projectfiles # growisofs -M dev-1.2.0 -dvd-compat -udf *R -J -v /var/www/publicsite Закрывать и фиксировать диск отдельной командой не обязательно. Комментарий В последнее время появляется все больше дистрибутивов Linux в виде файлов .iso, размеры которых предназначены для записи на DVD, и это вполне естественно — некоторые дистрибутивы занимают 8 и более компакт-дисков. Команда growisofs заменяет cdrecord и обеспечивает интерфейс к mkisofs, так что вы сможете использовать знакомые параметры mkisofs с двумя исключениями: О не используйте параметр -о для указания выходного файла» потому что growisofs пишет непосредственно на DVD; О не используйте параметр -С, так как growisofs определяет начальную и конечную точки дорожек самостоятельно. Ключ -dvd-compat обеспечивает совместимость с большинством существующих дисководов DVD. Ключ -udf добавляет ограниченную поддержку UDF. Па момент написания книги пакетная запись еще не была надежно реализована в ядре Linux. В принципе ее можно исключить, хотя ее включение «на всякий случай» обойдется всего в несколько битов метаданных. Утилиты dvd+rw-tools существуют в виде пакетов RPM, пакетов Debian и в формате .tar. В архиве .tar также имеется файл spec на тот случай, если вам захочется создать собственный пакет RPM. Форматировать новые диски DVD-RW не обязательно, потому что, начиная с версии 5.10, growisofs делает это автоматически при добавлении файлов на DVD. Чтобы узнать номер версии, выполните команду S growisofs •-version Программа supermount должна обеспечивать возможность вставки и извлечения дисков (например, дискет) без ввода команд mount и unmount. Она появилась в Red Hat, SuSE и других дистрибутивах, где обычно включается по умолчанию. Чтобы временно отключить supermount, выполните команду # /usr/sbin/supermount -1 disable Повторное включение производится с параметром -i enable. К сожалению, supermount работает не очень надежно, поэтому, возможно, ее лучше отключить вообще. Для этого удалите записи supermount и /etc/fstab. Если вы предпочитаете перестраховаться, удалите пакет magicdev: # rpm -q magicdev
11.12. Запись аудиодиска для стандартных проигрывателей 191 В Debian это делается командой # apt-get remove magic-dev См. также Домашняя страница dvd+rw-tools (http://fly.chalmers.se/~appro/linux/DVD+RW). 11.12. Запись аудиодиска для стандартных проигрывателей Проблема Требуется узнать, как записать аудиодиск для воспроизведения в бытовом проигрывателе (скажем, в машине). Также нужно уметь преобразовывать различные аудиоформаты (скажем, ogg-vorbis, mp3f .wav и .cdr), поскольку они не воспроизводятся на стандартных проигрывателях компакт-дисков, только на компьютерах. Решение Используйте sox, normalize и cdrecord, а также «болванки», предназначенные для записи аудио. На первом этапе программа sox преобразует звуковые файлы в формат .cdr, после чего формат .cdr преобразуется в формат .wav. Затем ключ -audio команды cdrecord преобразует файлы .wav в формат CD-DA (Compact Disk Digital Audio), поддерживаемый стандартными проигрывателями. $ sox soundfile filename.cdr % sox filename.cdr filename.wav $ cdrecord -v nofix -eject dev=0,1.0 -audio -pad filename.wav Ключ -pad гарантирует правильное заполнение секторов диска, a -nofix оставляет диск открытым для добавления новых дорожек. Чтобы закрыть и зафиксировать диск, выполните следующую команду: $ cdrecord -v -fix -eject dev^O.l.O Преобразовывать файлы один за другим утомительно. Следующая команда Bash преобразует группу файлов .одд в формат .cdr: $ for i in *.одд; do echo $i: sox $i ${iU.ogg}.cdr -. echo ${i**.ogg}.cdr: done Замените одд расширениями тех файлов, которые требуется преобразовать. Если коллекция дорожек собирается из разных источников, воспользуйтесь утилитой normalize и уравняйте громкость звука с ключом -m (Mixed mode): s normalize -m /soundfiles/*.wav Выбор дорожек для записи может осуществляться разными способами. Следующая команда записывает все дорожки в формате .wav в каталог /home/songs в определенном порядке: сначала цифры, затем алфавитные символы в верхнем регистре, затем алфавитные символы в нижнем регистре: $ cdrecord -v -nofix -eject dev=0.1.0 -audio -pad /home/songs/*.wav
192 Глава 11. Запись CD и DVD Или перейдите в каталог /songs и перечислите отдельные песни: $ cdrecord -v -nofix -eject dev-0.1.0 -audio -pad songl.wav song3.wav song7.wav Обязательно используйте диски CD-R, рассчитанные на воспроизведение в бытовых проигрывателях. Комментарий Новые версии sox вроде бы должны поддерживать формат .трЗ, но на практике это не всегда так. Выполните команду sox -h и посмотрите, какие форматы поддерживает команда. Если ваша конкретная версия sox не поддерживает .трЗ, используйте mpgl23 и sox: % mpgl23 -b 10000 -s filename.mp3 | sox -t raw -г 44100 -s -w -c 2 -filename.wav Параметры: О -b 10000 — размер буфера в бантах; О -s — перенаправление результата в стандартный вывод (вместо попытки воспроизведения файла); О sox -t raw -г 44100 -s -w -с 2 — описание формата .cdr с явным указанием спецификаций. Диск не может содержать более 99 дорожек. Впрочем, чтобы на одном диске поместилось 99 песен, эти песни должны быть совсем короткими. Если музыкальные файлы уже хранятся в формате .wav, вероятно, вам не придется преобразовывать их. Тем не менее не все файлы .wav имеют правильную структуру для записи на диск; в таких случаях команда cdrecord остановится и выдаст сообщение об ошибке. Преобразуйте неправильный файл .wav в .cdr при помощи sox, а затем снова преобразуйте .cdr в .wav. Форматы .wav и .flac обеспечивают наивысшее качество из всех форматов цифрового аудио. Всегда начинайте с них, если существует такая возможность, а потом преобразуйте их в другие форматы по мере необходимости. Чаще всего это делается для экономии места, поскольку файлы .wav и .flac очень велики. Файл .ogg обычно занимает около 1/10 объема файла .wav. Ogg Vorbis — открытая и не защищенная патентами технология кодирования аудиоинформации. Она не связана с лицензионными отчислениями или другими ограничениями, присущими запатентованным, закрытым форматам типа МРЗ. Формат .одд обеспечивает хорошее качество звука при сжатии данных с потерями. Под «потерями» имеется в виду, что часть информации пропадает для уменьшения размера файла. МРЗ — другой качественный формат сжатия с потерями. Это запатентованный, закрытый формат, поэтому его использование ограничено, код закрыт, а исполнители и распространители должны платить лицензионные отчисления. Ком- иания «Thomson and Fraunhofer», которой принадлежат права на формат МРЗ, включают в него поддержку DRM (Digital Rights Management, а проще говоря, ограничение копирования). См. также cdrecord(l), sox(l), normalize(l).
Глава 12 Системный загрузчик и альтернативная загрузка 12.1. Введение В системе Linux существует два отличных загрузчика, GRUB (GRand Unified Bootloader) и LILO (Linux LOader). GRUB новее LILO и обладает большим и возможностями. Оба загрузчика отличаются гибкостью и большим потенциалом настройки; кроме того, они способны реализовывать сложные сценарии настройки — такие, как альтернативная загрузка нескольких операционных систем или ядер Linux или передача параметров ядру во время загрузки. Если вы все еще используете LILO, возможно, настало время подумать о переходе на GRUB. Хотя загрузчики в целом похожи друг на друга, GRUB обладает рядом дополнительных возможностей, которые выводят его на первое место: О командная консоль GRUB позволяет находить загрузочные образы, ядра и корневые файловые системы; О GRU В хранит загрузочную информацию в файловой системе, а не в главной загрузочной записи (MBR); О GRUB читает файловые системы и исполняемые файлы ядра, не заставляя пользователя ограничиваться геометрией диска; О и что самое лучшее, загрузчик GRUB абсолютно независим от операционной системы. Если установить GRUB в отдельный загрузочный раздел, вы сможете удалять и переустанавливать операционные системы по своему усмотрению, и вам не придется каждый раз заново устанавливать загрузчик. И GRUB, и LILO позволяют загружать операционные системы, не входящие в семейство Linux (например, Windows, OS/2, BSD Unix и т. д.). Для операционных систем, которые они не могут загружать напрямую (таких, как Windows), GRUB и LI LO применяют цепную загрузку, то есть передают управление собственному загрузчику Windows. Главная загрузочная запись занимает первые 512 байт первого сектора первого раздела диска. В ней находится таблица разделов и первичный загрузчик — небольшая программа, хранящаяся в первых 446 байтах МBR, которая передает
194 Глава 12. Системный загрузчик и альтернативная загрузка управление вторичному загрузчику, хранящемуся в каталоге /boot. Остальные 66 байт MBR занимает таблица разделов. Linux позволяет создать на диске IDE до 63 разделов: 3 первичных раздела и 4 раздел, содержащий до 60 логических разделов в одном расширенном разделе. Диски SCSI ограничиваются 15 разделами: 3 первичных и 12 логических в одном расширенном разделе. 12.2. Переход с LILO на GRUB Проблема Вы ознакомились с преимуществами GRUB, описанными в предыдущем разделе. Сейчас вы используете L1LO, но хотите перейти на GRUB, причем так, чтобы не переделывать всю систему. Решение Переход на GRUB не нарушает работоспособности системы. Прежде всего установите GRUB или обновите программу до последней версии. Номер версии определяется командой $ grub --version grub (GNU GRUB 0.94) Затем выполните ряд подготовительных действий: 1. Распечатайте таблицу разделов (fdisk -I | Ipr). 2. Распечатайте файл lilo.conf. 3. Создайте резервную копию данных и держите под рукой диск аварийного восстановления (загрузочную дискету LILO или диск Knoppix). 4. Оставьте установку LILO на случай, если вы захотите вернуться к ней. Затем выполните следующие действия: 1. Создайте загрузочную дискету GRUB. 2. Установите GRUB в MBR. 3. Загрузите систему. 4. Отредактируйте конфигурационный файл GRUB, menu.1st. Чтобы создать загрузочную дискету, найдите каталог/grub/i386. Его «официальное» местонахождение — /urs/lib/grub/i386-pc, но в Red Hat используется каталог/usr/share/grub/i386-pc. В других дистрибутивах также могут существовать различия. Скопируйте файлы stagel и stage2 на дискету командой dd: $ dd if-stagel of«/dev/fd0 bs-512 count-1 1+0 records in 1+0 records out 512 bytes transferred in 0.550740 seconds (930 bytes/sec) $ dd if-stage2 of»/dev/fd0 bs-512 seek-l 209+1 records in
12.2. Переход с ULO на GRUB 195 209+1 records out 107250 bytes transferred in 6.889581 seconds (15567 bytes/sec) Загрузите систему с дискеты. Теперь необходимо найти корневое устройство, то есть раздел с загрузочными файлами GRUB первой и второй стадии загрузки: grub> find /boot/grub/stagel (hdO.O) Задайте корневое устройство: grub> root (hdO.O) Обратите внимание: в GRUB используется собственная схема нумерации разделов. Запись hdO,0 соответствует/dev/hdal (см. подраздел «Комментарий»). Теперь установите GRUB в MBR (первый сектор первого диска): grub> setup (hdO) Пора завершить загрузку. Снова задайте корневое устройство: grub> root (hdO.O) Введите путь к ядру и корневой файловой системе. Данные берутся из файла lilo.conf. Обязательно присоедините ключ го, чтобы ядро и корневая файловая система монтировались только для чтения: grub> kernel /boot/vmlinuz-2.4.21 root«/dev/hdal го He путайте root в строке kernel с корневым устройством. Root в строке kernel идентифицирует корневую файловую систему» тогда как корневым устройством называется раздел, содержащий каталог/boot. Вероятно, теперь стоит создать меню загрузки GRUB. За подробностями обращайтесь к рецепту 12.9. Комментарий Всегда проверяйте диски аварийного восстановления перед тем, как их использовать. GRUB использует собственную схему нумерации разделов; отсчет начинается с 0, а не с 1. Диски IDE и SCSI обозначаются hd, а флоппи-дисководы обозначаются fd. Таблица разделов Linux: О 1-4 — первичные разделы; О 5 и выше — расширенные разделы. В GRUB она принимает следующий вид: О 0-3 — первичные разделы; О 4 и выше — расширенные разделы Дополнительные диски обозначаются hdl, hd2 и т. д. Таким образом, hd0,3 — то же самое, что /dev/hda4, a hdl,5 соответствует /dev/hdb6. См. также Раздел «Введение» настоящей главы; раздел 12.7; раздел 12.9; The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub.
196 Глава 12. Системный загрузчик и альтернативная загрузка 12.3. Установка GRUB без дискеты Проблема Требуется установить GRUB, но в вашей системе нет флоппи-дисковода. А может, дисковод есть, но вы не можете найти пи одной рабочей дискеты. Решение Воспользуйтесь командной консолью GRUB. Прежде всего установите GRUB или обновите программу до последней версии. Номер версии определяется командой $ grub •-version grub (GNU GRUB 0.94) Затем выполните ряд подготовительных действий: 1. Распечатайте таблицу разделов (fdisk -I | Ipr). 2. Распечатайте файл lilo.conf. 3. Создайте резервную копию данных и держите под рукой диск аварийного восстановления (загрузочную дискету LILO или диск Knoppix). 1. Оставьте установку LILO па случай, если вы захотите вернуться к ней. Затем запустите консоль GRUB: # grub Probing devices to guess BIOS drivers. This may take a long time. GNU GRUB version 0.94 (640K lower / 3072 upper memory) [ Minimal BASH-like line editing is supported. For the first word. TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename. ] grub> Найдите загрузчик stagel: grub> find /boot/grub/stagel (hdO.O) Затем выполните три команды: grub> root (hdO.O) grub> setup (hdO) grub> quit Перезагрузите систему; вас приветствует командная консоль GRUB. В разделах 12.7 и 12.9 рассказано о том, как создать меню загрузки GRUB. Комментарий При выполнении трех команд, о которых говорилось ранее, происходит следующее: grub> root (hdC^O) Назначение корневого устройства grub> setup (hdO) Установка GRUB в MBR grut» quit Выход из GRUB
12.4. Установка GRUB сценарием grub-install 197 См. также Раздел 12.7; раздел 12.9; The Grub Manual (http://www.gnu.org/software/manual/ grub.html); info grub. 12.4. Установка GRUB сценарием grub-install Проблема Рецепт из раздела 12.3 не работает в вашей системе Debian, Gentoo или другой системе, потому что файлы GRUB устанавливаются в/usr/lib/grub. Л может быть, вы хотите использовать более простой способ установки GRUB без использования дискет. Решение Воспользуйтесь встроенным сценарием установки GRUB grub-install. Прежде всего установите GRUB или обновите программу до последней версии. Номер версии определяется командой % grub --version grub (GNU GRUB 0.94) Затем запустите сценарий grub-instalL Если для/boot используется собственный раздел, укажите его: # grub-install ♦•root-directory/boot /dev/hda В противном случае достаточно имени устройства: # grub-install /dev/hda Затем выполните команду # update-grub Команда создает новый файл menu.lst При перезагрузке появится меню GRU В, и система загрузится, как обычно. Комментарий Вероятно, update-grub не создаст полный файл menu.lst в системе с альтернативной загрузкой, но по крайней мере вы сможете загрузить операционную систему Linux. После этого в menu.lst можно будет добавить записи других операционных систем. См. также grub-install(8); info grub; The Grub Manual (http://www.gnu.org/software/manual/ grub.html).
198 Глава 12. Системный загрузчик и альтернативная загрузка Первичный Первичный Первичный Расширенный 100 Мбайт 2500 Мбайт 3000 Мбайт 256 Мбайт 14144 Мбайт /boot / /home /swap 12.5. Подготовка системы для альтернативной загрузки Linux Проблема Вы собираетесь организовать альтернативную загрузку нескольких разных дистрибутивов Linux и хотите подготовить к ней свою систему. При этом вы собираетесь использовать автономный раздел /boot и общие разделы /home и /swap. Решение Многие дистрибутивы Linux позволяют настраивать разделы во время установки. Создавайте новые разделы только в том случае, если они необходимы, и оставляйте свободной место для других установок. Для примера рассмотрим «чистую» установку Fedora на диске IDE объемом 20 Гбайт со следующей схемой разбиения: /dev/hdal /dev/hda2 /dev/hda3 /dev/hda4 /dev/hda5 Свободно Процедура выглядит так: 1. Загрузите первый установочный компакт-диск. Выберите клавиатуру, мышь и монитор. Когда появится окно Disk Partitioning Setup, выберите Manually partition with Disk Druid. На экране появляется графическое изображение жесткого диска. 2. Удалите все существующие разделы. Для этого поочередно выделите их и щелкните на кнопке Delete. 3. Затем выделите Free Space и щелкните на кнопке New. Точка монтирования — /boot. Выберите файловую систему Ext2 и введите размер раздела. Минимум, который Fedora примет для /boot, составляет 100 Мбайт. 4. Снова выделите Free Space и щелкните на кнопке New. Точка монтирования — /. Выберите файловую систему Ext3 и введите размер раздела 2500 Мбайт. Щелкните на кнопке ОК. 5. Снова выделите Free Space и щелкните на кнопке New. Точка монтирования — /home. Выберите файловую систему Ext3 и введите размер раздела 3000 Мбайт. Щелкните на кнопке ОК. 6. Снова выделите Free Space и щелкните на кнопке New. Прокрутите список filesystem options и найдите в нем строку swap. Точка монтирования отсутствует; задайте размер 256 Мбайт. Щелкните на кнопке ОК. 7. На этой стадии еще можно вернуться и внести изменения, потому что новая таблица разделов еще не была записана на диске. Завершив настройку, запишите таблицу на диск кнопкой 0К в главном меню Disk Druid.
12,6. Установка экземпляров Linux в системе с альтернативной загрузкой 199 Продолжайте установку. Проследите за тем, чтобы был установлен именно загрузчик GRUB, а не LI LO. Другие экземпляры Li nux будут использовать те же разделы /home и /swap. Вы можете установить сколько угодно экземпляров Linux, пока не кончится свободное место на диске или не будут использованы все доступные разделы. Комментарий В большинстве современных дистрибутивов Linux GRUB устанавливается по умолчанию. Проследите за тем, чтобы ваши дистрибутивы не установили LILO. QTParted — превосходная графическая утилита для создания, удаления, перемещения и изменения размеров дисковых разделов. Программа QTParted включена в Knoppix, поэтому при желании вы можете настроить разделы перед установкой Linux. Изменения также можно внести после установки, даже если раздел уже содержит данные. Разумеется, сначала необходимо создать резервную копию всех данных. QTParted хорошо справляется со своей работой, но изменение таблицы разделов чревато неприятностями. Размещение /swap в автономном разделе повышает быстродействие системы; кроме того, такой раздел может использоваться совместно разными системами при альтернативной загрузке. Выделение /home в автономный раздел позволит вам использовать содержимое в разных экземплярах Linux, а также проводить установку и удаление систем без восстановления данных из архива. Linux позволяет создать на диске IDE до 63 разделов: 3 первичных раздела и 4 раздел, содержащий до 60 логических разделов в одном расширенном разделе. Диски SCSI ограничиваются 15 разделами: 3 первичных и 12 логических в одном расширенном разделе. См. также fdisk(8); глава 13; домашняя страница QTParted (http://qtparted.sourceforge.net). 12.6. Установка дополнительных экземпляров Linux в системе с альтернативной загрузкой Проблема На компьютере создан новый загрузочный раздел и установлен первый экземпляр Linux. Все готово к добавлению новых экземпляров. Решение Установите дополнительные экземпляры Linux в логические разделы. Затем для каждого экземпляра системы создается запись в меню загрузки GRUB. Сначала подготовьте систему по инструкциям, приведенным в разделе 12.5. Загрузите установочный компакт-диск второго экземпляра Linux (в нашем примере вторым экземпляром будет дистрибутив Libranet Debian). В меню определения
200 Глава 12. Системный загрузчик и альтернативная загрузка дисковых разделов выберите пункт Partition & Layout drives. На экране появляется меню с информацией о существующих разделах. Выделите Free и щелкните на кнопке New. Введите размер раздела 2500 Мбайт (точка монтирования — /). Выберите тип файловой системы и проследите за тем, чтобы флажок Initialize? был установлен. Это будет раздел /dev/hda6. Выделите раздел /dev/hda3 и щелкните на кнопке Modify. Выберите точку монтирования/home и файловую систему Ext3, но не устанавливайте флажок Initialize?. На этой стадии вы можете либо вернуться и внести изменения в разделы, либо записать новую таблицу разделов на диск. При выборе команды Write появляется предупреждение: «ALL EXISTING DATA ON THESE PARTITIONS WILL BE DESTROYED» со списком разделов, которые будут отформатированы («инициализированы»). В списке должен присутствовать только раздел /. Продолжайте установку. Когда дойдет до меню установки загрузчика, не перезаписывайте MBR. На вопрос «Do you want Linux to handle booting your system?» ответьте отрицательно. Мы хотим, чтобы загрузочные файлы устанавливались в первый сектор загрузочного раздела, то есть /dev/hda6. Когда Libranet потребует перезагрузить систему, вызовите командную консоль GRUB и загрузите Libranet вручную: grub> root (hdO.O) grub> kernel /boot/vmlinuz-2.4.21 rooWdev/hda6 ro grub> boot (определение параметров загрузки в GRUB рассматривается в разделе 12.7). Когда система начнет нормально работать, отредактируйте файл menu.lst и включите новую систему в меню загрузки GRUB (см. раздел 12.9). Запишите информацию разделов, созданных в процессе установки; это поможет вам в редактировании menu.lst. Комментарий Программа установки Libranet автоматически находит существующие разделы виртуальной памяти, поэтому выбирать их во время установки не нужно. Вы можете отредактировать файл menu.lst в любом из новых экземпляров Linux. Просто смонтируйте загрузочный раздел: # mkdir /bootpartltion # mount /dev/hdal /bootpartition # vim /bootpartition/boot/grub/menu.lst В этом проявляются некоторые преимущества использования загрузочного раздела — вы всегда знаете, где он находится, а его содержимое надежно изолировано от корневых файловых систем. Вероятно, разбиение диска на разделы является самой важной частью построения системы с альтернативной загрузкой. На физическом жестком диске могут существовать только четыре первичных раздела, поэтому старайтесь по возможности использовать логические разделы; в противном случае разделы быстро кончатся. См. также The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub.
127. Определение параметров загрузки в командной консоли GRUB 201 12.7. Определение параметров загрузки в командной консоли GRUB Проблема Местонахождение ядер Linux и корневых устройств вам неизвестно, по эта информация необходима для загрузки системы. Решение Воспользуйтесь средствами GRUB для поиска корневых устройств и образов ядер. Загрузите командную консоль GRUB нажатием клавиши «с» во время запуска GRUB. Чтобы найти корневое устройство (раздел, содержащий /boot), введите строку root (hdO и нажимайте клавишу Tab до тех пор, пока на экране не появится информация о разделах: grub> root (hdO.<tab> Possible partitions are; Partition num: 0. Filesystem type is ext2fs. partition type 0x83 Partition num: 1. Filesystem type is ext2fs. partition type 0x83 Если вы не уверены в том, какой именно раздел вам нужен, опробуйте их поочередно, это не повредит. Начните с (hc№,0): grub> root (hdO.O) Filesystem type is ext2fs. partition type 0x83 Затем попробуйте найти образ ядра. Введите /boot/vmlinuz и нажмите клавишу Tab. Если найти образ/boot/linuz не удалось, GRUB сообщит вам об этом: grub> kernel /boot/vmlinuz<tab> Error 15: File not found В этом случае назначьте корневым устройством другой раздел и проведите поиск образа ядра на нем: grub> root (hdO.l) Filesystem type is ext2fs. partition type 0x83 grub> kernel /boot/vmlinuz<tab> possible files are: vmlinuz vmlinuz-2.4.21 Ядро найдено. Введите путь к ядру и корневой файловой системе: grub> kernel /boot/vmlinuz-2.4.21 го root-/dev/hda2 Помните, что нумерация разделов в GRUB начинается с 0, поэтому hdO,l=/ dev/hda2. Следующие два используются только в системах, при загрузке которых используется ramdisk. Сначала найдите initrd: grub> find /boot/init<tab> grub> find /boot/initrd-2.4.22-l.img Загрузите образ initrd: grub> initrd /boot/initrd-2.4.22-l.img
202 Глава 12, Системный загрузчик и альтернативная загрузка Теперь можно переходить к загрузке: grub> boot Система запускается стандартным образом. Комментарий Если вы не уверены в том, что в системе использовались стандартные схемы выбора имен ядра, запросите у GRUB все содержимое/boot. Введите строку kernel/ boot и нажмите клавишу Tab: grub> kernel /boot/<tab> System.map System.map-2.4.21 System.rnap-2.6.3 boot grub config-2.4.21 config-2.6.3 splash.xpm.gz vmlinuz vmlinuz-2.4.21 kernel-of-truth-2.6.3 Похоже, мы обнаружили ядро 2.6 со странным именем kemel-of-truth-2.6.3. Несмотря на глупое имя, оно может работать точно так же, как его родственники с более вменяемыми именами. Автоматическое расширение имен клавишей Tab позволяет легко проводить поиск в целых файловых системах. Эта возможность особенно полезна для исследования незнакомых систем, потому что вы можете начать с корня: grub> root (hd0.6) grub> find/<tab> Possible files are bin dev etc lib mnt opt tmp sys var usr boot home proc sbin root cdrom floppy initrd Однако это открывает большую брешь в системе безопасности, так как любой пользователь, имеющий доступ к консоли GRUB, сможет прочитать любой файл в системе командой cat: grub> cat /root/secretpersona1stuff.txt grub> cat /etc/shadow В разделе 12.14 рассказано, как закрыть эту брешь посредством парольной защиты GRUB. Команда GRUB находит корневые устройства и ядра независимо от того, где они находятся. Допустим, в системе установлены два жестких диска IDE. На втором диске корневая файловая система Linux установлена в каталоге/dev/hdb5. Загрузка производится следующим образом: grub> root (hdl.4) grub> kernel /boot/vmlinuz-2.4.21 ro root-/dev/hdb5 grub> boot В незнакомой системе можно поручить GRUB поиск всех установленных жестких дисков: grub> root (hd <tab> Possible disks are: hdO hdl См. также The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub.
12.8. Настройка загрузочного раздела 203 12.8. Настройка загрузочного раздела Проблема Вы используете загрузочный раздел вместо каталога /boot корневой файловой системы и не уверены в правильности путей к файловым системам. Решение Чтобы узнать, в каких разделах находятся файловые системы, воспользуйтесь командой df. Перед этим проследите за тем, чтобы все проверяемые разделы были смонтированы. Сначала необходимо убедиться в том, что файловые системы установлены в правильных разделах, при помощи команды df: $ df -h Filesystem Size Used Available Use* Mounted on /dev/hda2 2.5G 1.5G 1G 60* / /dev/hdal 100M 30M 70M 30* /boot Чтобы убедиться в правильности файлового дерева загрузочного раздела, запросите содержимое /boot/boot: $ Is /boot System.map-2.4.21 boot grub config splash.xpm.gz vmlinuz vmlinuz-2.4.21 Некоторые дистрибутивы (скажем, Debian) создают мягкую ссылку /boot на родительский каталог: $ cd /boot $ Is -al boot lrwxrwxrwx 1 root root 1 Apr 16 08:50 /boot/boot -> . Вы можете оставить все как есть и не создавать новый каталог/boot, хотя ссылка создаст зацикливание в файловом дереве. Это еще один способ обеспечить присутствие каталога /boot в загрузочном разделе. Комментарий Запутались? Помните, что и имя раздела не является именем каталога, потому что раздел — не каталог, а точке монтирования можно присвоить любое имя. GRUB ничего не знает о точках монтирования — загрузчик читает файловые системы до того, как они будут смонтированы. Таким образом, если в загрузочном разделе не существует каталога/boot, GRUB не увидит /boot/grub, а только /grub. Хотя наличие каталога /boot не является строго обязательным, соблюдение этих правил существенно упростит вашу жизнь. См. также The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub.
204 Глава 12. Системный загрузчик и альтернативная загрузка 12.9. Создание меню загрузки в GRUB Проблема Конечно, искать корневые устройства и ядро в командной консоли GRU В весьма увлекательно, и все же вы бы предпочли сохранить параметры загрузки в конфигурационном файле и использовать меню загрузки при запуске системы. В этом меню задаются параметры по умолчанию, а также содержится список всех установленных операционных систем. Решение Включите загрузочные записи в конфигурационный файл GRUB, /boot/grub/ menu.1st (в Red Hat используется файл grub.conf с мягкой ссылкой menu.1st). Загрузочная запись GRUB называется строфой (stanza). Ее базовая конфигурация выглядит так: title Fedora l core root (hdO.O) kernel /boot/vmlinuz-2.4.22-1 rooWdev/hdal ro initrd /boot/initrd-2.4.22-l.img Название (title) выбирается произвольно, а его присутствие обязательно — оно сообщает GRUB, где начинается каждая строфа, а также определяет содержимое пункта меню загрузки. Две другие строки содержат информацию, которая вводилась в командной строке GRUB. Использовать команду boot в menu.1st не нужно. В меню можно включить сколько угодно операционных систем; каждая система представляется отдельной строфой вроде приведенной ранее. Проследите за тем, чтобы строка kernel указывала на правильный раздел и образ ядра. В одном корневом разделе часто размещаются несколько загружаемых ядер, и все загрузочные конфигурации часто используют один и тот же загрузочный раздел (более того, это даже рекомендуется). Комментарий Запомните, что корневое устройство, заданное строкой root (hdO.O) определяет местонахождение каталога/boot, а в обозначении hdO,0 используется собственная система пумерации разделов GRUB. В строке kernel /boot/vmlinuz-2.4.22-1 root=/dev/hda2 го параметр root определяет корневую файловую систему с использованием dev-имени ядра. См. также The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub.
12.10. Настройка menu.lst 205 12.10. Настройка menu.lst Проблема Требуется изменить внешний вид меню GRUB и задать значения таких параметров, как тайм-аут и пункт по умолчанию. Решение Внесите изменения в файл /boot/grub/menu.1st (в некоторых системах используется grub.conf). Содержимое файла делится на две секции: глобальные параметры и загрузочные записи (строфы). Цвета, тайм-аут и пункт меню по умолчанию определяются в секции глобальных параметров. Далее приводится пример полного файла menu.lst с глобальными параметрами: # Файл конфигурации GRUB для пользователя windbag, создан 22-10-2003 # Глобальные параметры # Пункт по умолчанию default О # Тайм-аут в секундах timeout 5 t Цвета color cyan/blue white/blue # Отображение заставки splashimage (hdO.0)/boot/splash.xpm.gz foreground bbbbbb background 000000 # Меню загрузки # Пункт по умолчанию title Libranet GNU/Unux. kernel 2.4.21 root (hdO.O) kernel /boot/vmlinuz-2.4.21 rooWdev/hdal ro hdb=scsi hdc=scsi ## Новое тестовое ядро 2.6 title Libranet GNU/Linux. kernel 2.6.3-testl root (hdO.O) kernel /boot/bzImage-2.6.3-test 1 rooWdev/hdal ro # Red Hat 9 title Red Hat 9 root (hd0.4) kernel /boot/vmlinuz-2.4.22-1 root=/dev/hda5 ro initrd /boot/initrd-2.4.22-l.img
206 Глава 12. Системный загрузчик и альтернативная загрузка Комментарий Определения глобальных параметров конфигурации: О default 0 — определение загрузочной строфы по умолчанию. Строфы нумеруются последовательно, начиная с 0, поэтому обозначение default 0 соответствует первой строфе; О timeout 5 — промежуток времени, по истечении которого загружается запись по умолчанию; О color cyan/blue white/blue — цветовая схема загрузочного меню GRUB. Первая часть (cyan/blue) определяет цвет текста и фона, а вторая (white/blue) — цвета выделенных строк текста. Список цветов приведен в руководстве GRUB и в описании info grub; О spUshimage(hdO,0)/boot/splash.xpm.gz; foreground bbbbbb; background 000000 — заставку, входящую в ваш дистрибутив, можно заменить любым изображением по вашему выбору (см. раздел 12.16). Параметр splashimage задает путь к изображению. Также необходимо задать цвет текста и фона для отображения шрифтов с использованием стандартных шестиадцатеричных цветовых кодов HTML. Параметру default также можно присвоить значение saved. При использовании default saved также необходимо включить в загрузочные строфы строку savedefault: title Libranet GNU/Linux, kernel 2.4.21 root (hdO.O) kernel /boot/vmlinuz-2.4.21 root=/dev/hdal savedefault В этом случае последняя строфа, использованная при загрузке, по умолчанию будет использоваться при следующей загрузке. Во многих дистрибутивах строка savedefault включается в загрузочные строфы, но параметр default saved отсутствует, поэтому механизм не работает. См. также The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub; раздел 12.6. 12.11. Добавление Windows 95/98/ME в систему Linux Проблема Требуется организовать на одном компьютере альтернативную загрузку Linux и Windows 95/98/ME. Допустим, вы работаете с приложениями на обеих платформах или администрируете небольшую тестовую сеть и хотите установить как можно больше разных операционных систем, чтобы использовать разные комбинации операционных систем без использования множества компьютеров. А может быть, вы уже пытались установить Windows 95/98/ME в системе Linux, но у вас ничего не получилось — программа установки заявила, что не может
12.11. Добавление Windows 95/98/ME в систему Linux 207 отформатировать диск С: (и хорошо, а то бы она стерла установленные экземпляры Linux). Вы не хотите использовать эмуляторы типа VMWare, позволяющие работать с двумя системами одновременно без перезагрузки, потому что они стоят слишком дорого или ваше оборудование не справится с такой нагрузкой. Решение Известно несколько хитроумных приемов для добавления Windows 95/98/ME в систему Linux. Вам придется скрыть разделы и восстановить GRUB в записи MBR после установки Windows, потому что Windows заменяет системный загрузчик. Для установки Windows 95/98/ME необходимо заранее подготовить первичный раздел. К сожалению, GRUB не поддерживает загрузку с CD-ROM, поэтому вам потребуется загрузочная дискета Windows. Если у вас еще нет такой дискеты, создайте ее в Windows. Установка Windows 95/98/ME в раздел /dev/hda4 производится так. 1. Загрузите командную консоль GRUB. 2. Вставьте загрузочную дискету Windows. 3. Скройте все существующие разделы в командной строке GRUB: grub> hide(hdO.O) grub> hide(hdO.l) grub> hide(hd0,2) 4. Загрузите Windows с дискеты: grub> chainloader (fdO) +1 grub> boot He забудьте включить поддержку CD-ROM в загрузочную дискету. 5. Создайте первичный раздел DOS для установки Windows, используя команду MS-DOS fdisk. Когда создание разделов будет завершено и вы вернетесь к приглашению А:\>, вставьте компакт-диск Windows и запустите программу установки: А:\> D: D:\> setup 6. Windows заменяет MBR, но это лишь упростит последующие перезагрузки. После того, как система будет установлена, восстановите GRUB в MBR. Загрузитесь с дискеты GRUB и выполните следующие команды: grub> root (hdO.O) grub> setup (hdO) 7. Извлеките дискету GRUB и перезагрузите компьютер. На экране снова появляется меню GRUB. Загрузите Linux и отредактируйте menu.1st: title Windows 98 on /dev/hda4 hide (hdO.O) hide (hdO.l) hide (hd0.2) unhide (hd0.3) rootnoverify(hd0.3) makeactive chainloader +1
208 Глава 12. Системный загрузчик и альтернативная загрузка Комментарий Последние три параметра строки стоит рассмотреть подробнее: О rootnotverify — не пытаться читать или монтировать раздел; О makeactive — установить флаг загрузочного раздела (необходимо для Windows); О chainloader +1 — ссылка на загрузчик операционных систем, не поддерживаемых GRUB напрямую (Windows относится к их числу). Существует более простой способ организации совместной работы Windows 95/98/МЕ с Linux: сначала установите Windows 95/98/МЕ, а затем добавьте Linux. В этом случае программа установки автоматически запишет GRUB в MBR и создаст запись для Windows в меню GRUB. См. также Microsoft Knowledge Base Article 217210: «How to Multiple Boot Windows XP, Windows 2000, Windows NT, Windows 95, Windows 98, Windows ME, and MS- DOS»; раздел 9.16; The Grub Manual (http://www.gnu.org/software/manual/grub.html). 12.12. Добавление Windows NT/2000/XP в систему с альтернативной загрузкой Проблема Требуется организовать на одном компьютере альтернативную загрузку Linux и Windows NT/2000/XP. Допустим, вы работаете с приложениями на обеих платформах или администрируете небольшую тестовую сеть и хотите установить как можно больше разных операционных систем, чтобы использовать разные комбинации операционных систем без использования множества компьютеров. Вы не хотите использовать эмуляторы типа VMWare, позволяющие работать с двумя системами одновременно без перезагрузки, потому что они стоят слишком дорого, или ваше оборудование не справится с такой нагрузкой... и надеетесь, что хлопот будет меньше, чем при установке Windows 95/98/МЕ. Решение С Windows NT/2000/XP дело обстоит намного проще. Программа установки ведет себя более разумно — она позволяет вам выбрать существующий или создать новый раздел. Систему даже можно установить на компьютере с уже установленным экземпляром Linux (при условии, что на диске имеется достаточно свободного места и неиспользованный первичный раздел). Запишите содержимое таблицы разделов и отметьте, что установлено в каждом разделе. Windows не распознает разделы Linux, а только выводит их размеры, поэтому наличие записанной информации поможет лучше разобраться в происходящем.
12.13. Восстановление GRUB в MBR с использованием диска Knoppix 209 Загрузочная дискета на этот раз не понадобится; загрузите систему с компакт- диска. После того как система будет установлена, восстановите GRUB в MBR — загрузите компьютер с дискеты GRUB и выполните следующие команды: grub> root (hdO.O) grub> setup (hdO) grub> reboot Извлеките дискету GRUB и перезагрузите компьютер. На экране снова появляется меню GRUB. Загрузите Linux и создайте в menu.1st запись для Windows: title Windows XP on /dev/hda4 rootnoverify(hd0.3) makeactive chainloader +1 Скрывать разделы от Windows NT/2000/XP не нужно. Комментарий Если потребуется организовать альтернативную загрузку нескольких версий Windows, начните с самой старой и устанавливайте их по порядку, вплоть до самой новой. При этом вы можете установить только один экземпляр Windows 95/98/ ME, потому что эти системы, в отличие от Windows NT/2000/XP, не поддерживают альтернативную загрузку. Для всех версий Windows можно использовать один первичный раздел, разделив его на несколько логических разделов. Для создания разделов и их форматирования следует использовать программу установки Windows NT/2000/XP; не используйте программу Linux fdisk. См. также Microsoft Knowledge Base Article 217210: «How to Multiple Boot Windows XP, Windows 2000, Windows NT, Windows 95, Windows 98, Windows ME, and MS- DOS»; The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub; раздел 12.13. 12.13. Восстановление GRUB в MBR с использованием диска Knoppix Проблема При установке Windows на компьютере с альтернативной загрузкой Linux/Windows содержимое MBR (главной загрузочной записи) было заменено, а меню GRUB заменилось меню загрузки Windows, поэтому вы не можете загрузить Linux. В документации GRUB сказано, как восстановить GRUB в MBR, но описанная процедура предполагает использование дискеты, а на вашем компьютере нет флоппи-дисковода. Как восстановить GRUB в MBR в подобной ситуации?
210 Глава 12. Системный загрузчик и альтернативная загрузка Решение Воспользуйтесь компакт-диском Knoppix. Загрузите систему и откройте окно командного процессора. Переключитесь на учетную запись root командой su и запустите консоль GRUB. Выполните следующие три команды: grub> root (hdO.O) grub> setup (hdO) grub> quit После перезагрузки появляется меню GRUB. Комментарий Флоппи-дисководы постепенно исчезают с компьютеров, особенно с портативных. Даже в ноутбуках, заменяющих настольные компьютеры, вместо флоппи- дисковода часто устанавливается комбинированный дисковод CD-ROM/DVD- ROM/CD-R/RW. См. также Домашняя страница Knoppix (http://www.knopper.net); The Grub Manual (http:// www.gnu.org/software/manual/grub.html); info grub. 12.14. Защита системных файлов паролем GRUB Проблема Вы не хотите, чтобы пользователи могли работать с командной консолью GRUB, потому что они получат доступ ко всем системным файлам независимо от разрешений и привилегий. Решение Задайте пароль в menu.1st, чтобы ограничить использование командной консоли GRUB. Сначала в Bash сгенерируйте хешнрованный пароль командой grub-md5-crypt: # grub«md5-crypt Password: Retype password: $l$RiAfJO$QTuAlS/BGqlkYHQADZejsl Вставьте зашифрованный пароль в секцию глобальных параметров menu.1st перед загрузочными строфами: password --md5 $l$R1AfJ0$QTuA1S/BGqlkYHQADZejsl Также можно использовать простой текстовый пароль: password bigsecretpassword
12.15. Защита отдельных пунктов меню GRUB 211 Конечно, этот вариант менее надежен. Если вы используете простой текстовый пароль, ограничьте доступ к файлу и разрешите его только root: # chmod 600 menu.1st Когда во время загрузки системы появится меню GRUB, нажмите клавишу р, чтобы ввести пароль и получить доступ к командной консоли. Пользователи, не знающие пароля, смогут только выбрать один из пунктов меню загрузки; командная консоль GRUB останется для них недоступной. Комментарий Разрешения на доступ к файлам являются атрибутами файловой системы. GRUB работает вне файловых систем, поэтому каждый, кто имеет доступ к командной консоли GRUB, сможет прочитать любой файл в системе. Даже если вы потеряете пароль GRUB, это еще не катастрофа. Загрузите систему с диска аварийного восстановления и отредактируйте файл menu.1st. В этом проявляется старый принцип безопасности в Unix: «При наличии физического доступа к компьютеру с ним можно делать все, что угодно*. См. также The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub. 12.15. Защита отдельных пунктов меню GRUB Проблема Меню GRUB состоит из нескольких пунктов. Вы не хотите, чтобы каждый пользователь мог выбрать любой пункт; некоторые пункты меню должны оставаться недоступными для пользователей. Решение Установите пароль GRUB (см. раздел 12.14), азатем включите команду 1оскв menu.1st title Libranet GNU/Linux, kernel 2.4.21. single user mode lock root (hdO.O) kernel /boot/vmlinuz-2.4.21 root-/dev/hdal ro single GRUB читает menu.1st последовательно, поэтому все строки после lock становятся недоступными для пользователей, не знающих пароля. При попытке загрузить заблокированный пункт меню будет выдано следующее сообщение об ошибке: Error 32: Must be authenticated Желательно сообщить пользователям, к каким командам меню ограничен доступ: Libranet GNU/Linux. kernel 2.4.21. single user mode. AUTHENTICATION REQUIRED
212 Глава 12. Системный загрузчик и альтернативная загрузка Комментарий Пароли GRUB и строка lock особенно полезны на общих рабочих станциях — например, в учебных залах, лабораториях и на рабочих местах. Тем не менее любой пользователь, обладающий физическим доступом к компьютеру, сможет использовать загрузочный диск аварийного восстановления и получить неограниченный доступ. Чтобы этого не произошло, можно запретить использование аварийных дисков в программе настройки BIOS, но не забывайте, сколько существует различных загрузочных устройств: дискеты, компакт-диски, устройства USB, Jaz/ Zip, Ethernet Wake-on-LAN, SuperDisk... и наверное, это еще не все. Завершив настройку, установите пароль на вход в BIOS. См. также The Grub Manual (http://www.gnu.org/software/manual/grub.html); info grub. 12.16. Создание заставки GRUB Проблема Вам надоела стандартная заставка GRUB из вашего дистрибутива Linux и вы хотите заменить ее другим изображением, созданным вами. Решение Заставку GRUB можно создать на базе любого графического файла. Преобразуйте изображение к определенному формату и размеру, а затем включите в menu.1st ссылку на созданный файл. Графические заставки GRUB должны удовлетворять следующим требованиям: О тип файла — xpm.gz; О размеры — 640 х 480; О 14 цветов. Начните с создания изображения размером не менее 640x480 в любом графическом формате. Остальное делается программами ImageMagick и gzip. В следующем примере мы преобразуем файл .jpg: $ convert -depth 14 -resize 640x480 image.jpg newiroage.xpm && gzip newimage.xpm Переместите новый файл newimage.xpm.gz. Откройте файл menu.1st и добавьте (или измените) строку с определением заставки: # Отображение заставки splashimage (hdO.5)/boot/newimage.xpm.gz Комментарий Семейство ImageMagick состоит из нескольких утилит командной строки: animate composite
12.17. Загрузка Linux с использованием LILO 213 conjure convert display identify import mogrify montage Отдельной команды imagemagick не существует. За подробностями обращайтесь к imagemagick(l). Попробуйте провести поиск в Google по словам «grub splashimage». Вы найдете всевозможные галереи графических изображений, а также рекомендации и полезные приемы по их созданию. См. также imagemagick(l), gzip(l), info grub; The Grub Manual (http://www.gnu.org/software/ manual/grub.html). 12.17. Загрузка Linux с использованием LILO Проблема Вы используете загрузчик LILO и хотите знать, как настроить его для загрузки системы Linux. Решение Сгенерируйте базовый файл Uloconf командой liloconfig. Отредактируйте файл, включите в него комментарии, названия и любые дополнительные параметры по вашему усмотрению. Убедитесь в том, что вы загрузили новейшую версию LILO. Как обычно, создайте резервную копию данных и держите под рукой загрузочный диск. Выполните команду: # /sbin/lilo -V LILO version 22.4 1 После установки/обновления запустите liloconfig. Программа задает много вопросов и предлагает выполнить многочисленные инструкции. Допустим, корневая файловая система находится и разделе/dev/hda3. Ответьте положительно на четыре вопроса: Install a partition boot record to boot Linux from /dev/hda3? Use LBA32 for addressing big disks using new BIOS features? Install a master boot record on /dev/hda? Make /6ev/hda3 the active partition? Запустите lilo, чтобы записать изменения в MBR: # /sMn/Шо -v Перезагрузите компьютер. Вероятно, файл /etc/lilo.conf стоит отредактировать, потому что он содержит минимальный набор записей.
214 Глава 12. Системный загрузчик и альтернативная загрузка Комментарий Команда liloconfig хорошо подходит для создания базового файла lilo.conf; после этого файл проще и удобнее редактировать вручную. При каждом изменении /etc/lilo.conf необходимо запускать LILO, чтобы внести изменения в MBR: # /sbin/lilo -v Параметр -v определяет уровень детализации вывода, а его значения лежат в интервале от 1 до 5: # /sbin/lilo -v5 См. также lilo(8), lilo.conf(5);/usr/doc/lilon.4H/usr/share/doc/lilo; «The Large Disk Howto» на tldp.org. 12.18. Альтернативная загрузка Linux с использованием LILO Проблема Требуется установить несколько экземпляров Linux на одном компьютере с использованием загрузчика L1L0. Решение Первый установленный экземпляр Linux является «основным». Сохраните его, чтобы обеспечить работу LILO. Проследите за тем, чтобы корневая файловая система, содержащая каталог /boot, находилась в первичном разделе, в противном случае LILO работать не будет. Запишите местонахождение раздела, в котором будет устанавливаться корневая файловая система следующего экземпляра Linux. Если вы также знаете точное имя ядра и образа initrd (если он используется), вы можете немного опередить события. Оставаясь в основном экземпляре Linux, создайте запись lilo.conf для второго экземпляра: # Red Hat 9 image«/boot/vm1inuz-2.4.22-l initrd=/bcot/initrd-2.4.22-l.img 1abel="Red Hat 9" root=/dev/hda6 read-only Запишите изменения в MBR: # /sbin/Ulo -v Переходите к установке второго экземпляра. Присутствие записи в меню загрузки LILO ускорит перезагрузки, необходимые для завершения установки. Когда программа установки перейдет к установке загрузчика, обязательно выберите вариант «install to the first sector of the root partition» (возможно, в вашей программе установки формулировка будет выглядеть несколько иначе). Не перезаписывайте MBR.
12.19. Альтернативная загрузка Windows и Linux с использованием LILO 215 Если точные имена ядра и образа initrd неизвестны, вам придется узнать их в основном экземпляре Linux. Переходите к установке второго экземпляра Linux. Когда дело дойдет до первой перезагрузки, вы снова окажетесь в основном экземпляре Linux. Смонтируйте файловую систему второго экземпляра Linux и прочитайте содержимое каталога/boot: # mount /dev/hda6 /mnt/tmp # cd /mnt/tmp # Is boot System.map initrd-2.4.22-l.img System.map-2.4.22-1 vmlinuz vmlinuz-2.4.22.1 Имена ядра и образа initrd известны. Создайте запись в lilo.conf, перезапустите /sbin/Hlo и перезагрузите компьютер. Теперь вы можете выбрать новую версию Linux в меню загрузчика и завершить установку программы. См. также lilo(8), lilo.conf(5); /usr/doc/lilo или /usr/share/doc/Ulo. 12.19. Альтернативная загрузка Windows и Linux с использованием LILO Проблема Требуется организовать альтернативную загрузку Linux и Windows (или нескольких экземпляров каждой из систем). Решение Самый простой способ — установить все версии Windows, которые должны работать в системе. Всегда устанавливайте их по порядку, начиная с самой старой. Сохраните четвертый первичный раздел для Linux. В системе может быть установлен только один экземпляр Windows 95/98/ME, потому что эти системы не поддерживают альтернативную загрузку. Windows NT/ 2000/ХР поддерживают альтернативную загрузку и создают записи для каждого установленного экземпляра в загрузчике Windows. Установите Linux в последнюю очередь. Сделайте четвертый первичный раздел расширенным и создайте логический раздел для Linux. Во время установки Linux установите LILO в MBR, a LILO автоматически создаст запись для Windows. # Стабильное ядро 2.4 image-/boot/vmlinuz-2.4.21 label«"Libranet-hd3" root-/dev/hda5 read-only # Windows other = /dev/hdal labels"Windowses" table - /dev/hda
216 Глава 12. Системный загрузчик и альтернативная загрузка Для Windows достаточно одной записи, потому что LILO передает управление загрузочному меню Windows. Комментарий Когда в системе установлено несколько версий Windows, загрузчик Windows всегда относится к первой из них. Таким образом, если в /dev/hdal установлена система Windows 95, а в /dev/hda2 — Windows 2000, в LILO все равно включается ссылка на/dev/hdal. См. также Hlo(8), lilo.conf(5); /usr/doc/h'lo или /usr/share/doc/luo; Microsoft Knowledge Base Article 217210: «How to Multiple Boot Windows XP, Windows 2000, Windows NT, Windows 95, Windows 98, Windows ME, and MS-DOS». 12.20. Создание загрузочной дискеты LILO Проблема Требуется создать загрузочную дискету LILO на случай, если возникнут проблемы. Решение Воспользуйтесь встроенной функцией создания загрузочных дискет: # cd /usr/lib/lilo # make -f Makefile.floppy He забудьте защитить дискету от записи. Комментарий В мире Linux существует огромное количество всевозможных загрузочных дисков. Если вам удастся загрузить систему, вы сможете исправить любые ошибки. Обязательно проверьте установочные диски своего дистрибутива, потому что на них часто имеются средства аварийного восстановления, приспособленные для вашего дистрибутива, в том числе и утилиты для переустановки загрузчика. См. также lilo(8), lilo.conf(S); /usr/doc/h'lo или/usr/share/doc/lilo. 12.21. Защита LILO паролем Проблема Вы не хотите, чтобы пользователи испортили тщательно настроенную конфигурацию загрузчика. Также стоит сделать так, чтобы они не могли использовать
12.22. Создание резервной копии MBR 217 возможности LILO по получению доступа root без пароля, что легко делается вводом команды linux single или Hnux 1nit=/bin/sh в приглашении LILO. Решение Ограничьте доступ к lilo.conf и разрешите его только суперпользователю root: # chmod 600 lilo.conf Затем защитите LILO паролем. Внесите в секцию глобальных параметров lilo.conf следующие записи: password'"" restricted Перезапустите LILO, чтобы изменения вступили в силу: # /sbin/lilo В ответ на запрос введите пароль root. Программа создает файл /etc/lilo.conf .shs с паролем, доступным только для root. Теперь при перезагрузке системы LILO будет запрашивать пароль у каждого, кто попытается ввести команду linux single или linux init=/bin/sh. Комментарий Для обеспечения дополнительной безопасности на стадии загрузки заблокируйте все внешние загрузочные устройства в программе настройки BIOS и установите пароль на вход в BIOS. Решение не идеально, но по крайней мере, рядовые пользователи не смогут испортить вашу работу. См. также lilo(8), lilo.conf(5); /usr/doc/lilo или /usr/share/doc/lilo,. 12.22. Создание резервной копии MBR Проблема Требуется создать резервную копию главной загрузочной записи. Но какая польза от резервной копии, если вы не знаете, как ее восстанавливать? Решение Запишите резервную копию MBR на дискету. Смонтируйте диск, а затем воспользуйтесь командой dd: # dd 1Wdev/hda of»/floppy/mbr bs=%12 count«l
218 Глава 12. Системный загрузчик и альтернативная загрузка Восстановление производится следующим образом: # dd 1f-/floppy/mbr of-/dev/hda bs=612 count-1 Имя файла с резервной копией может быть произвольным: например, имя /mbr-serverOl указывает, какому компьютеру принадлежит копия. На одной дискете можно сохранить несколько резервных копий MBR: # 1$ /floppy lost+found mbr-serverOl mbr-workstat1on04 mbr-hostl5 Если дискету нужно предварительно отформатировать, сделайте это: $ mke2fs /dev/fdO Команда создает диск, отформатированный для Linux с файловой системой Ext2. Комментарий Команда dd выполняет побайтовое копирование. Поддержка файловых систем ей не нужна, поэтому она может использоваться для копирования блочных устройств (например, /dev/hda). Если в вашей системе отсутствует флоппи-дисковод, испорченную запись М BR можно восстановить при помощи диска Knoppix (см. раздел 12.13). См. также dd(l), mke2fs(8); раздел 12.13.
Глава 13 Восстановление работоспособности системы на примере Knoppix 13.1. Введение Крайне неприятно, когда ваш компьютер вдруг отказывается загружаться. Knoppix, полноценный дистрибутив Linux на базе Debian на загрузочном компакт-диске, является первоклассным средством восстановления. В вашем распоряжении оказываются свыше 2 Гбайт утилит и драйверов Linux, сжатых в один 700-мегабайтный компакт-диск. Knoppix прекрасно справляется с идентификацией оборудования, поддерживает все основные файловые системы, автоматически находит существующие разделы, создает точки монтирования и ищет сервер DHCP. Для ручной настройки сети имеется удобная утилита netcardconfig. По простоте использования Knoppix не имеет себе равных. Достаточно вставить диск, загрузить систему — и все работает. Knoppix можно установить в виде 700-мегабайтного файла .iso или приобрести компакт-диск (последнее удобно для пользователей с медленным или дорогим подключением к Интернету). У Knoppix появилось целое сообщество пользователей. На сайте Knoppix.net можно найти большое количество специализированных проектов, вдохновленных Knoppix, а также информации о создании собственных загружаемых компакт-дисков. 13.2. Загрузка Knoppix Проблема Требуется настроить процесс загрузки Knoppix. Для начала нужно разобраться, какие изменения можно внести в него. Решение Чтобы получить список всех параметров загрузки, нажмите F2 при выводе приглашения.
220 Глава 13. Восстановление работоспособности системы на примере Knoppix В принципе можно просто вставить диск Knoppix в дисковод и предоставить ему загрузиться самостоятельно, но в вашем распоряжении имеются многочисленные параметры загрузки. По умолчанию используется немецкая раскладка клавиатуры; вероятно, вы предпочтете сменить ее с учетом своего локального контекста: knoppix lang^ru По умолчанию Knoppix загружает рабочий стол KDE. Выбор другой программы осуществляется командой knoppix desktop-icewm Загрузка в консольном режиме без запуска X: knoppix 2 Процесс загрузки можно немного ускорить, отключив идентификацию отсутствующего оборудования: knoppix nopcmcia nosesi Загрузка с минимальной идентификацией оборудования: failsafe В одной строке можно объединить несколько параметров: knoppix lang-ru desktopHcewm nopcmcia noscsi Комментарий Для загрузки Knoppix в консольной версии потребуется около 20 Мбайт памяти, а для удовлетворительной работы сеанса X необходимо не менее 96 Мбайт. Для запуска KDE желательно иметь 256 Мбайт памяти. Knoppix найдет и использует раздел виртуальной памяти на жестком диске, если он существует. Если вам не понравится, как прошла загрузка Knoppix, или вы хотите опробовать другой режим, вам не придется возиться с корректным завершением работы — просто выключите питание и начните заново. Проблемы с Knoppix Запуск программ с компакт-диска сопряжен со специфическими проблемами, особенно на ноутбуках. Системы управления питанием нередко нарушают работу сеанса Knoppix: при выходе из спящего режима Knoppix перестает реагировать на команды. Попробуйте отключить систему управления энергопотребления или нажмите кнопку питания и начните заново. Иногда Knoppix «зависает» во время загрузки в процессе запуска KDE (или любого сеанса X). Переключитесь на первую виртуальную консоль (Ctrl+Alt+Fl) и проверьте список системных сообщений; так можно определить источник проблем. Например, Knoppix может зависнуть при идентификации устройств SCSI. В таком случае перезагрузите компьютер и отключите идентификацию SCSI: knoppix noscsi См. также Документация на компакт-диске Knoppix; Knoppix.net (http://www.knoppix.net); домашняя страница Клауса Кноппера (http://www.knopper.net).
13.4. Сохранение конфигурации Knoppix на флэш-диске 221 13.3. Создание загрузочной дискеты Knoppix Проблема Система не загружается с компакт-диска, но вам все равно хочется использовать Knoppix. Как создать загрузочную дискету Knoppix? Решение На диске Knoppix имеется загрузочный образ, готовый к копированию на дискеты. Загрузите и смонтируйте компакт-диск Knoppix на любом компьютере с Linux, вставьте чистую дискету и выполните команду # dd if-/cdrom/KN0PPIX/boot.1mg of«/dev/fdO bs-1440k Загрузочную дискету также можно создать в Windows. Откройте окно DOS, затем откройте каталог KNOPPIX на компакт-диске: с:> d: d:> cd \KN0PPIX Затем создайте дискету: d:> mkfloppy.bat Загрузите систему с дискеты, вставьте диск Knoppix, когда вам будет предложено это сделать, и приступайте к работе. Комментарий Включение пакетного файла DOS для создания загрузочной дискеты Knoppix стоит отметить особо — это еще один полезный инструмент в вашем арсенале аварийного восстановления системы. См. также Документация на компакт-диске Knoppix; Knoppix.net (http://www.knoppix.net); домашняя страница Клауса Кноппера, создателя Knoppix (http://www.knopper,net). 13.4. Сохранение конфигурации Knoppix на флэш-диске Проблема Хорошо бы сохранить конфигурацию Knoppix (параметры сети и рабочего стола и т. д.). чтобы вам не приходилось каждый раз начинать заново. Решение Для этой цели идеально подойдет флэш-диск с интерфейсом USB. Загрузите Knoppix с вставленным флэш-диском. Откройте меню Knoppix и выберите команду
222 Глава 13. Восстановление работоспособности системы на примере Knoppix Configuration ► Save Knoppix Configuration. Выберите для сохранения устройство /dev/sdal. Во время загрузки Knoppix убедитесь в том, что флэш-диск вставлен в разъем USB, и введите следующую команду: knoppix myconfig-/dev/sdal Также можно приказать Knoppix обнаружить сохраненную конфигурацию автоматически: knoppix myconfig-scan Комментарий Флэш-диски USB объемом 256 и 512 Мбайт стали до смешного дешевыми. Носите с собой такое устройство и диск Knoppix, и вы сможете работать почти где угодно. См. также Документация на компакт-диске Knoppix; Knoppix.net (http://www.knoppix.net); домашняя страница Клауса Кноппсра (http://www.knopper.net). 13.5. Создание зашифрованного домашнего каталога Knoppix Проблема Вам хотелось бы запускать Knoppix с компакт-диска, потому что его содержимое не может быть заражено вирусами и трояиами. Но при этом возникает проблема: где хранить личную информацию, электронную почту и другие персональные данные? Требуется создать защищенный домашний каталог для хранения электронной почты и других файлов данных. Решение Выполните команду Knoppix ► Configure ► Create, чтобы создать домашний каталог Knoppix на жестком диске или съемном носителе (скажем, флэш-диске USB, карте памяти или Zip-диске). Команда создает файл с именем knoppix.img. Когда программа спросит, нужно ли применять шифрование AES при создании каталога, ответьте положительно. Каталог шифруется с 256-разрядным ключом, а вам будет предложено ввести пароль длиной не менее 20 символов. Используйте хорошо запоминающуюся фразу (например, «thisismylongpassword»), потому что вам придется вводить ее при каждой загрузке системы. Чтобы загрузить Knoppix с использованием зашифрованного каталога /home, вставьте съемный носитель и введите команду boot: knoppix home^/dev/sdal Если ранее вы сохранили рабочую конфигурацию Knoppix, укажите и ее: boot: knoppix home-/dev/sdal (nyconfio^/dev/sdal
13.6. Копирование файлов на другой PC с системой Linux 223 Новый каталог/home появляется в Knoppix в виде/home/knoppix и автоматически монтируется при загрузке. Если зашифрованный каталог /home хранится в существующем разделе Linux на жестком диске, монтируется весь раздел. Комментарий По умолчанию объем каталога /home/knoppix составляет 30 Мбайт. Увеличьте его до нужных размеров. См. также Документация на компакт-диске Knoppix; Knoppix.net (http://www.knoppix.net); домашняя страница Клауса Кноппера (http://www.knopper.net). 13.6. Копирование файлов на другой PC с системой Linux Проблема Требуется скопировать файлы с проблемного PC на другой компьютер в сети. Например, компьютер «умирает» или странно ведет себя, н вы хотите создать резервную копию нужных файлов. Решение Загрузите Knoppix. Проблемный PC должен быть подключен к локальной сети; если в сети имеется сервер DHCP, Knoppix свяжется с ним автоматически. Чтобы настроить статический IP-адрес, запустите утилиту netcardconfig в консольном режиме или выполните команду Knoppix ► Network/Internet На компьютере-приемнике должен быть настроен сервер SSII (см. подраздел «Комментарий»). Сначала смонтируйте файловую систему, содержащую копируемые файлы. Knoppix создает/etc/fstab, помещает все точки монтирования в каталог/mnt и создает на рабочем столе значки для всех файловых систем. Самый простой способ смонтировать файловую систему — щелкнуть на значке рабочего стола. Также можно заглянуть в /etc/fstab и использовать командную строку. Сначала получите привилегии root (пароль не мужем): knoppix@tty0[knopp1x]$ su root@ttypO[knoppix]# mount /mnt/hda5 Затем выполните команду scp (Secure Copy): # scp -rp /mnt/hda5/home/kmartin l92.l68.l.5:/home/kmart1n/tmp На экране появляется предупреждение: Could not create directory Vhojne/kmartin/.ssh'. The authenticity of host '192.168.1.5 (192.168.1.5)' can't be established. RSA key fingerprint is a2Mc6:77:2e:63:b2:ed:90:b2:9b:bc:e7:d4:22:ba Are you sure you want to continue connecting? (yes/no)?
224 Глава 13. Восстановление работоспособности системы на примере Knoppix Подтвердите подключение. Вам будет предложено ввести пароль root для сервера SSH. Введите пароль, и файлы будут скопированы. То же самое можно сделать в качестве обычного пользователя, для собственной учетной записи пользователя. Создайте нового пользователя в приглашении Knoppix: root@ttypO[knoppix]# useradd kmartin Пароль назначать не нужно — вам потребуется только пароль пользователя для сервера SSH. Теперь пользователь kmartin может копировать файлы в свою учетную запись на сервер SSH. Только суперпользователь root может копировать файлы в учетные записи других пользователей. Комментарий Ключ -г команды scp осуществляет рекурсивное копирование каталогов. Ключ -р сохраняет разрешения. А вот как настроить сервер SSH «на скорую руку»: установите OpenSSH на компьютере с системой Linux, на который вы собираетесь копировать файлы. Если программа уже установлена, обновите ее до последней версии, чтобы включить новейшие заплатки системы безопасности. Затем выполните команду # /etc/init.d/ssh start Компьютер готов к приему файлов. Если вы собираетесь постоянно использовать SSH для удаленного администрирования, не останавливайтесь на этом и проделайте еще ряд действий по защите подключения. Дополнительная информация об использовании SSH приведена в главе 17. Так как Knoppix работает в памяти, сохранить данные хостов и ключи SSH не удастся, поэтому вы будете каждый раз получать одни и те же предупреждения. Если вы собираетесь часто копировать файлы командой scp, обратитесь к разделу 13.5. См. также scp(l), ssh(l); раздел 13.5. 13.7. Копирование файлов в общий каталог Samba Проблема Требуется скопировать файлы с Linux PC на Windows PC по локальной сети с использованием Knoppix. Решение Предварительно необходимо установить и настроить Samba (см. главу 23). Переключитесь на привилегии root: knoppix@ttypO[knoppix]$ su root@ttypO[knoppi x]#
13.8. Копирование файлов на диск CD-R/RW 225 Создайте локальный каталог для монтирования сетевого общего каталога. Смонтируйте удаленный каталог: root$ttypO[knoppix]# rokdir /mnt/samba root@ttypO[knoppix]# mount -t smbfs -о \ ui d»knopp1x.workgroup-1ocal.usernarae-hel1x.password-tehsecuar \ //windbag/1an_$hare/mnt/samba Используйте соответствующие имена рабочей группы и пользователя, пароль, имя хоста и общего каталога. Если в Windows 95/98/ME в настройках общего доступа к файлам не был указан пароль, используйте имя пользователя guest, а поле пароля оставьте пустым. Теперь вы можете открыть окна Konqueror для копирования файлов или воспользоваться командой ср: root@ttyp0[knopp1x]# cp -av /home/helix /mnt/samba Комментарий Если вы предпочитаете графический интерфейс, существуют и другие варианты. Если имя хоста и общего каталога известны, введите их на панели адреса Konqueror: smb://HOST/SHARE В Knoppix также входит программа LinNeighborhood для обзора сети. Она запускается командой Internet ► LinNeighborhood. См. также The Official Samba-3 Howto and Reference Guide for Samba 3.x (http://samba.org/); глава 23. 13.8. Копирование файлов на диск CD-R/RW Проблема На компьютере установлен записывающий CD-дисковод. Требуется записать файлы на диск CD-R/RW. Решение Проще всего воспользоваться КЗЬ. Запустите Knoppix и выполните команду System ► КЗЬ Setup. КЗЬ автоматически обнаруживает CD-дисководы; проверьте результаты на этапе 3 мастера настройки. На этапе 6 включите всех пользователей, отличных от root, которым разрешено использование КЗЬ (помните, что пользователей нужно создать заранее). Завершив настройку, закройте мастера и запустите программу System ► КЗЬ. Выберите команду File ► New Project. Перетащите нужные файлы мышью pi щелкните на кнопке Burn.
226 Глава 13, Восстановление работоспособности системы на примере Knoppix Комментарий КЗЬ — замечательный интерфейс записи CD/DVD, один из лучших инструментов на всех платформах. Программа логично устроена и скрывает все технические подробности записи от пользователя, избавляя его от необходимости перебирать мношчисленные окна или разбираться в технических терм инах «Joliet», «Rock Ridge» или «El Torito». См. также Глава 11; домашняя страница КЗЬ (http://www.k3b.org/). 13.9. Редактирование конфигурационных файлов в Knoppix Проблема Кто-то (может быть, и вы) слегка «подправил» содержимое конфигурационного файла, и система перестала загружаться. Нужно вернуть ее в рабочее состояние. Но как отредактировать файл на компьютере, который не загружается? Решение Knoppix позволяет открыть и отредактировать любой файл на компьютере. Загрузите диск Knoppix с оболочкой KDE. Щелкните правой кнопкой мыши на значке файловой системы, выберите Mount, а затем выберите Change read/write mode. Получите права root, перейдите в каталог с редактируемым файлом и откройте файл в редакторе по своему усмотрению: knoppixl&ttypO [knoppix]! su root@ttypO[knoppix]# cd /mnt/hda3/etc root<attypO[etc]# kate inlttab & Переходите к редактированию файла. Комментарий В Knoppix входит ряд других оконных менеджеров: larswm, IceWM, XFce, Window- maker, Fluxbox и TWM, но только KDE включает меню Knoppix и создает на рабочем столе значки для всех разделов. Эти операции» как и все остальные операции Linux, могут выполняться из консоли. Например, монтирование файловой системы чтения/записи выполнится следующей командой: root@ttypO[knoppix]# mount -о rw /mnt/hda3 Открытие файла для редактирования: rootPttypO[knoppix]# vim /mnt/hda3/etc/inittab См. также mount(8); раздел 9.11.
13.11. Восстановление потерянного пароля root 227 13.10. Установка программ из Knoppix Проблема Требуется запустить apt-get, apt-rpm, up2date или другую утилиту обновления, которая должна запускаться из своей корневой файловой системы. Решение Knoppix позволяет переключиться на корневую файловую систему, находящуюся на жестком диске, командой chroot root^ttypO[knoppix]# mount -о rw /mnt/hda6 rootGttypO[knoppix]# chroot /mnt/hda6 root@Knoppix:/ Вместо каталога /mnt в Knoppix вы оказываетесь в файловой системе на жестком диске так, словно система была загружена непосредственно из нее. Далее можно выполнить любую команду так, словно система была загружена обычным образом — в том числе и команду apt-get. Комментарий В обычном сеансе Knoppix все файловые системы на жестком диске монтируются в каталоге/mnt, но после выполнения chroot файлы Knoppix становятся невидимыми. См. также chroot(8). 13.11. Восстановление потерянного пароля root Проблема Какая неприятность... Вы потеряли пароль root. Решение Ничего страшного — запустите Knoppix и откройте консоль root, емонтируйте файловую систему, содержащую файл /etc/shadow, и разрешите доступ для записи (см. раздел 9.10). Откройте файл /etc/shadow в своем любимом редакторе, найдите запись root: root:$l$7nMNZYciIE.U6ftxnAZU0rk29qvYpk0:12460:0:99999:7::: Удалите хеш-код пароля между первыми двоеточиями: root::12460:0:99999:7::: Теперь при запуске системы и входе в нее под именем root вам не придется вводить пароль.
228 Глава 13. Восстановление работоспособности системы на примере Knoppix Комментарий Не забудьте поскорее назначить новый пароль root. Это еще одно проявление принципа «При наличии физического доступа к компьютеру с ним можно делать все, что угодно». В главе 12 приведены некоторые рекомендации по защите процесса загрузки. См. также Shadow(5); разделы 12.14,12.15 и 12.21. 13.12. Установка Knoppix на жесткий диск Проблема Вам нравится Knoppix и вы хотите установить его на жесткий диск, как «настоящую» версию Linux. Решение Загрузите Knoppix и откройте консоль root. Введите команду knoppix-installer и выполните дальнейшие инструкции. Когда установка будет завершена, на жестком диске появится вполне современная система на базе Debian. Комментарий Установка Knoppix мало чем отличается от любой другой установки Linux. Ознакомьтесь с документацией по своей версии Knoppix, потому что до версии 3.2 сценарий установки назывался knx-hdinstall, а в версии 3.3 он был переименован в knoppix-installer. Возможно, в будущем он снова изменится — мир Linux не стоит на месте. См. также The Knoppix Wiki (http://www.knoppix.net/docs/). 13.13. Запуск антивирусных программ на Windows PC Проблема Нужен быстрый, недорогой способ проведения антивирусного сканирования в Windows без привязки к операционной системе. Вы знаете, что установочные диски коммерческих антивирусных продуктов (например, от Symantec и McAfee) способны проводить сканирование перед установкой программы, но базы данных на таких дисках быстро устаревают.
13.13. Запуск антивирусных программ на Windows PC 229 Решение Достаньте копию Knoppix 3.4 или более новую версию. Также потребуется подключение к Интернету для загрузки обновленных баз данных с определениями вирусов. В разделах Windows с файловой системой FAT16/32 можно провести как сканирование, так и сканирование с обезвреживанием вирусов. В файловых системах NTFS возможно только сканирование, поскольку поддержка записи в разделы NTFS в Linux все еще недостаточно надежна. Загрузите Knoppix, выполните команду KNOPPIX ► Utilities ► Install Software. На экране появляется перечень пакетов, доступных для установки; выберите f-prot. После того как программа f-prot будет установлена, выберите команду KNOPPIX ► Extra Software ► f-prot. Выберите в меню f-prot пункт 4, Online Update. Когда обновления вирусных баз данных будут успешно загружены, выберите разделы или каталоги для сканирования. Knoppix автоматически монтирует все разделы вашей системы, поэтому вы можете легко выбрать разделы для проверки. Чтобы ограничиться только сканированием, щелкните на кнопке Scan — и займитесь чем-нибудь другим, потому что это потребует немалого времени. После завершения на экране выводится отчет с результатами сканирования. Чтобы провести сканирование с обезвреживанием вирусов, запустите f-prot в режиме командной строки (вместо графического меню). Убедитесь в том, что раздел смонтирован для чтения/записи; просто щелкните правой кнопкой мыши на значке диска, находящемся на рабочем столе Knoppix, и выберите команду Actions ► Change read/write mode. Введите в командном процессоре следующую команду (укажите раздел, подлежащий сканированию): $ f -prot -dlslnf -list /mnt/hdal Ключ -list выводит информацию о ходе сканирования, а ключ -disinf включает режим обезвреживания вирусов. Комментарий У такого решения имеется ряд преимуществ: О вы работаете в заведомо чистой операционной системе — а поскольку диск защищен от записи, ее невозможно испортить; О загрузка Knoppix требует перезапуска компьютера, поэтому все резидентные вирусы, находящиеся в памяти, будут уничтожены; О Knoppix распространяется бесплатно, поэтому никто не мешает вам записать несколько дисков и проводить сканирование сразу на множестве компьютеров. См. также Knoppix.net (http://www.knoppix.net); домашняя страница f-prot (http://www.f-prot.com).
Глава 14 CUPS 14.1. Введение Система CUPS (Common Unix Printing System) — современная подсистема печати для Linux и Unix, заменяющая древние протоколы построчной печати Unix, CUPS работает в Unix, Linux, Mac OS и Mac OS X, а также обслуживает клиентов на практически любых платформах, включая Windows. CUPS идет в ногу со временем и поддерживает лазерные и струйные принтеры, а также матричные и другие старые модели принтеров. CUPS существует в двух версиях: бесплатной версии GPL, которая по умолчанию используется в большинстве серьезных дистрибутивов Linux, и в коммерческой версии. Коммерческая версия обеспечивает техническую поддержку, более широкий ассортимент драйверов и более удобный управляющий интерфейс. Драйверы принтеров CUPS состоят из одного или нескольких фильтров, упакованных в формате PPD (PostScript Printer Description). Все принтеры в CUPS — даже не поддерживающие PostScript — должны иметь файл PPD с описанием принтеров, специфических команд и фильтров. Фильтры занимают центральное место в CUPS. Они преобразуют задания печати в формат, понятный для принтера (PDF, HP-PCL, растровый формат и т. д.), а также передают команды для выполнения таких операций, как выбор страницы и сортировка. Файлы PPD являются текстовыми — если вас интересует, как они выглядят, посмотрите в каталоге/usr/share/cups/model/. Файлы PPD установленных принтеров хранятся в каталоге/etc/cups/ppd. Поиск драйверов В комплект поставки CUPS входят универсальные файлы PPD для 9- и 24-игольчатых матричных принтеров Epson, принтеров Epson Stylus и Color Stylus Photo, LaserJet и HP DeskJet и даже экзотических устройств печати этикеток Dymo. Они работают на сотнях моделей принтеров, но в некоторых случаях не поддерживают полный набор функций конкретного принтера вроде двусторонней печати, чистки головок или выбора лотка.
14.1. Введение 231 Если производитель вашего принтера не предоставляет драйвер для Linux, существуют четыре хороших ресурса: О Foomatic (http://linuxprinting.org); О Gimp-Print (http://gimp-print.sourceforge.net); О сайт коммерческой версии CUPS (http://www.easysw.com/cups/); О драйверы PostScript для Windows. Foomatic — бесплатный проект, объединяющий все распространенные системы печати Linux (CUPS, LPRng, LPD, GNUlpr, PPR, PDQ, CPS). Проект Gimp-Print изначально был задуман как модуль печати для Gimp, но позднее его рамки были расширены до общей поддержки печати в Linux. Драйверы Gimp-Print отличаются высочайшим качеством. Если для вашего цветного принтера существует такой драйвер, скорее всего, этот выбор окажется оптимальным. Перед тем как приобретать принтер, обязательно сверьтесь со списком совместимости оборудования вашего дистрибутива Linux или с базой данных принтеров linuxprinting.org. Gimp-Print и Foomatic существуют в виде пакетов, которые можно установить в системе (если они не были включены в дистрибутив). Установка гарантирует полноту набора драйверов и наличие всех обязательных подсистем. На странице http://www.cups.org/testppd.php можно проверить файл PPD. Проверка сводится к поиску синтаксических ошибок в файлах PPD — как правило, такие ошибки легко исправляются (опечатки или неверные команды). Сетевые принтеры Существует четыре основных способа организации совместного доступа к принтерам в сети: О совместное использование принтеров, подключенных к компьютерам пользователей; О создание выделенного сервера печати Linux; О приобретение сетевых принтеров (таких, как принтеры серии HP JetDi- rect); О приобретение аппаратных серверов печати (например, Linksys EPSX3), позволяющих напрямую подключить любой принтер к локальной сети. В этой главе рассматриваются первые два способа. Два других слишком разнообразны, а количество вариантов слишком велико. Приведу некоторые рекомендации, которые стоит учитывать при выборе. О Использование компьютера с системой Linux в качестве сервера печати обеспечивает максимальную гибкость и полноту настройки. о Сетевые принтеры, содержащие встроенное сетевое оборудование, обычно дорого стоят. О Сетевые принтеры обычно предназначаются для интенсивной загрузки. О Аппаратный сервер печати позволяет организовать сетевой доступ к любому принтеру.
232 Глава 14. CUPS Сетевые принтеры и аппаратные серверы печати расходуют меньше энергии и занимают меньше места, чем компьютер, используемый в качестве выделенного сервера печати. Тем не менее при покупке следует внимательно изучить вопрос поддержки в Linux, потому что некоторые устройства комплектуются только управляющими программами для Windows. Все, что управляется через веб-интерфейс, должно работать нормально. 14.2. Подключение принтера к автономному компьютеру с системой Linux Проблема Требуется подключить принтер к компьютеру с системой Linux. Решение Если принтер подключается к порту USB, он должен быть подключен (с подачей питания) во время загрузки системы. Сначала убедитесь в том, что в системе работает демон CUPS: $ lpstat -t scheduler is running Oftfa^H? p**tfn*tton: Рис 14.1. Страница конфигурации CUPS
14.2. Подключение принтера к автономному компьютеру с системой Linux 233 Если демон не работает, то команда выдаст следующее сообщение: lpstat: Unable to connect to server: Connection refused В этом случае запустите демона CUPS: # /etc/init.d/cupsys start В Red Hat и Fedora используются следующие команды: # /sbin/servlce cups restart Проще всего новые принтеры устанавливаются при помощи веб-интерфсйса CUPS. Введите следующий адрес в любом браузере: http://local host:631 Вам потребуется пароль root. Перейдите на вкладку Printers и щелкните на ссылке Add printer, открывающей меню Admin. Здесь следует ввести три значения: Name: hp6L Location: room-202 Description: bw-laser Тщательно выбирайте имя — его изменение вызовет проблемы в работе CUPS. Имя принтера будет использоваться на нескольких следующих страницах конфигурации. На рис. 14.1 показано, как должна выглядеть страница конфигурации CUPS. Комментарий Если вы предпочитаете командную строку, конфигурацию принтера можно задать следующей длинной командой: # Ipadmin -p hp6L -L room-202 -D bw-laser -E -v parallel:/dev/lpO \ -m HP-LaserJet_6-hpijs.ppd Параметры: О -р — имя принтера; О -L — местонахождение принтера; О -D — описание принтера; О -Б — перевод принтера в режим готовности к приему заданий; О -v — назначение URI; О -т — выбор драйвера (файл PPD). Обратите внимание: каталог жестко фиксируется; при попытке использовать путь вида/и$г/$Ьаге/сир5/тос1е1/1а5ег)е^ррс1 будет выдано сообщение об ошибке. Используйте имя PPD и проследите за тем, чтобы файл находился в каталоге/usr/share/cups/model/. Если в системе установлены пакеты Gimp-Print и Foomatic (а если не установлены, их стоит установить), вы найдете дополнительные файлы PPD в каталогах /usr/share/cups/model/gimp-print и /usr/share/cups/model/foomatic. Они хранятся в сжатом виде: HP-LaserJet_6-hp1js.ppd.gz Содержимое файлов необходимо распаковать и переместить в каталог /usr/ share/cups/model: # gunzlp HP-LaserJet_6-hp1js.pp.gz && rav HP-LaserJet_6-hp1js.ppd \ /usr/share/cups/model/
234 Глава 14. CUPS При установке принтера через веб-интерфейс CUPS распаковывать и перемещать файлы PPD не обязательно. См. также Раздел «Введение» настоящей главы; CUPS Software Administrators Manual (http:// localhost:631/documentation.html). 14.3. Обслуживание клиентов Linux Проблема Требуется организовать совместный доступ к принтеру, подключенному к компьютеру с системой Linux, с других Linux-клиентов локальной сети. Решение Сначала убедитесь в том, что на всех компьютерах с подключенными принтерами установлена система CUPS. Эти компьютеры должны иметь статические IP-адреса, а в системе должен работать механизм разрешения имен (/etc/hosts или локальный сервер DNS). Затем на компьютерах с подключенными принтерами отредактируйте файл /etc/cupsd.conf. Следующий пример cupsd.conf показывает, как открыть доступ к принтерам из локальной подсети. Вы можете использовать пример в том виде, в котором он представлен, используя свои сетевые параметры: LogLevel info Port 631 <Location /> Order Deny,AT low Deny from All Allow From 127.0.0.1 </Location> Перезапустите cupsd после правки cupsd.conf: # /etc/init.d/cupsys restart В Red Hat и Fedora следует использовать команду # /sb1n/serv1ce cups restart Напечатайте тестовую страницу. Если вы получите печально известную ошибку «Client-error-not-found», остановите и перезапустите принтер из веб-интерфейса CUPS. Принтеры CUPS автоматически рассылают информацию о себе по сети. Убедитесь в том, что порт TCP с номером 631 не заблокирован ни на сервере, ни на клиентских компьютерах. Откройте веб-интерфейс CUPS (http://localhosf.631) на любом клиентском компьютере с системой Linux; все принтеры CUPS должны автоматически отображаться на странице Printers. Теперь попробуйте напечатать тестовую страницу и выполнить печать из приложений.
14.4. Совместный доступ к принтеру без разрешения имен 235 Комментарий Если в системе имеется пример файла cupsd.conf, пусть его размеры вас не пугают. Скорее всего, большинство из его директив вам никогда не понадобятся; возьмите его за образец и создайте свой новый файл cupsd.conf «с нуля». Директивы cupsd.conf описаны в документе «CUPS Software Administrators Manual» (http://localhost:631/documentation.html). См. также Раздел «Printing System Management» документа CUPS Software Administrators Manual (http://localhost:631/documentation.html). 14.4. Совместный доступ к принтеру без разрешения имен Проблема Вы не создали файл /hosts и не запустили локальный сервер DNS в своей сети, потому что особой необходимости в разрешении имен нет — компьютеры сети находятся за брандмауэром NAT для совместного использования подключения к Интернету и ничего большего им, в сущности, не требуется. Как организовать совместный доступ к принтеру в таких условиях? Решение Назначьте серверу печати статический IP-адрес. Включите директиву ServerName в файл /etc/cupsd.conf: ServerName 192.168.1.5 Перезапустите cupsd. В Debian используйте команду # /etc/init.d/cupsys restart В Red Hat и Fedora команда выглядит так: # /sb1n/serv1ce cups restart На клиентских компьютерах ничего делать не нужно — просто подождите несколько секунд, пока CUPS разошлет информацию о принтере. Комментарий По умолчанию CUPS использует имя хоста в качестве имени сервера. Если в сети не используется никакая разновидность разрешения имен, клиентские компьютеры не увидят принтеры CUPS. Проблема решается указанием IP-адреса в директиве ServerName. У такого решения есть побочный эффект: возможно, вам не удастся напечатать тестовую страницу с сервера. Вместо этого вы увидите окно, показанное на рис. 14.2. Тем не менее печать из приложений на сервере и на клиентских компьютерах будет производиться нормально.
236 Глава 14. CUPS дшяБХг^-—' .... .: ^ Щ;*1адп, fl^ty ^1 эг 16В ' s fi^^W^nnfr-t^i-^fr [■ Ш лиЬ Unknown f""'" Ш.^«одыдодн wJih I] Unknown ■o _ ., . _k _V-.^.<1 '11Ц ШЩ ^^^^^^* Рис. 14.2. Страница с сообщением об отсутствии CUPS Если вам не нужно настраивать сетевую файловую систему (такую, как NFS или Samba) или использовать DNS, такого решения будет вполне достаточно, даже если другие администраторы будут смеяться над вами. Главное правило безопасности гласит: «Не запускай то, без чего можешь обойтись». См. также CUPS Software Administrators Manual (http://localhost:631/documentation.html). 14.5. Обслуживание клиентов Windows без Samba Проблема Требуется подключать клиентов Windows к серверу печати Linux, но вам не хотелось бы настраивать Samba только для организации совместного доступа к принтерам. Решение CUPS справится с этой задачей без Samba. Потребуется установочный компакт- диск Windows или диск с драйверами принтера, а на клиентских компьютерах Windows должна быть установлена служба печати Интернета — аналог IPP (Internet Printing Protocol) в Linux. Пользователи Windows 95/98 могут загрузить по адресу http://www.microsoft.com/windows98/downloads/ файл с именем wpnpins.exe. В Windows ME программная поддержка службы печати Интернета находится в папке Add-on на установочном компакт-диске. В Windows 2000/XP откройте приложение Сетевые подключения, выполните команду Дополнительно ► Дополнительные сетевые компоненты и выберите в категории Другие службы доступа к файлам и принтерам в сети строку Службы печати для Unix. Запустите мастера установки принтера. Выберите Сетевой принтер и введите URI-адрес принтера, состоящий из IP-адреса или имени сервера, номера порта и суффикса / printers/<имя_принтера>. Каталога/printers не существует; это всего лишь условное обозначение, используемое CUPS. При первом подключении к серверу CUPS система Windows устанавливает свои локальные драйверы принтера и печатает свою тестовую страницу (вместо тестовой страницы CUPS). Возможно, вам потребуется компакт-диск Windows или диск с драйверами.
14.7. Создание выделенного сервера печати CUPS 237 Комментарий Если в локальной сети работает механизм разрешения имен, вместо IP-адреса можно использовать имя сервера: http://windbag:631/printers/hp6L См. также Раздел «Введение» настоящей главы. 14.6. Совместный доступ к принтерам в смешанной сети с использованием Samba Проблема В локальной сети принтеры установлены на компьютерах с системами Linux и Windows. Требуется обеспечить доступ к ним для клиентов обоих типов (Linux и Windows). Решение Чтобы это стало возможным, вам потребуются Samba и CUPS. Обращайтесь к разделам 23.22 и 23.23. См. также The Official Samba-3 Howto and Reference Guide (http://samba.org). 14.7 Создание выделенного сервера печати CUPS Проблема Совместный доступ к принтерам, подключенным к компьютерам, работает нормально, но он создает лишнюю нагрузку на компьютеры. Кроме того, компьютер, к которому подключен принтер, должен постоянно работать. Требуется создать выделенный сервер печати для упрощения централизованного управления принтерами. Решение Из простейшего PC с процессором Pentium и несколькими подключенными принтерами выйдет отличный сервер печати. Существует два способа подключения нескольких принтеров к одному компьютеру: О установка дополнительных карт LPT/PCI для подключения принтеров с параллельным портом; О установка концентраторов USB для подключения принтеров USB.
238 Глава 14. CUPS Установите на сервере печати минимальную версию Linux с CUPS. Установите все пакеты и драйверы Foomatic и Gimp-Prin (они доступны как в виде RPM, так и в архивах Debian). После этого остается лишь установить принтеры и настроить CUPS. В первых четырех разделах этой главы описана процедура установки принтеров и организация совместного доступа к принтерам со стороны клиентов Windows и Linux. Комментарий Выделенный сервер печати обладает рядом преимуществ: все принтеры находятся в одном месте, расходные материалы удобно хранить поблизости от него, а пользователи не зависят от того, что кто-то другой хочет воспользоваться их принтерами. А если на сервере печати используются Linux и CUPS, вам не придется устанавливать Samba для организации совместного доступа со стороны клиентов Windows. См. также Раздел «Printing System Management» документа CUPS Software Administrators Manual (http://localhost:631/documentation.html). 14.8. Распределенная печать с использованием классов Проблема Одна из групп пользователей выводит на печать большое количество материалов. Необходимо предоставить в ее распоряжение целую группу принтеров, но обойтись без хлопот с отдельными очередями печати. Решение Воспользуйтесь классами — фактически они создают одну очередь печати, состоящую из нескольких принтеров. На странице Admin веб-интерфейса CUPS щелкните на ссылке Add Class и выберите из списка принтеры, входящие в класс. Теперь пользователи могут направлять задания печати в класс вместо конкретного принтера; задание будет обработано первым свободным принтером. В меню выполняются операции добавления и исключения принтеров и даже создания подклассов. Операции с классами также могут выполняться в командной строке. Создание класса с включением принтеров: # Ipadmin -p printerl -p printer2 -р printer3 -с art-dept Включение нового принтера в класс: # Ipadmin -p printer4 -с art-dept Удаление принтера из класса (ключ -г): # Ipadmin -р printer4 -г art-dept
14.9. Ограничение доступа к принтерам и классам 239 Удаление всего класса: # Ipadmin -x art-dept Комментарий Разумеется, не стоит объединять в один класс принтеры, расположенные далеко друг от друга, — эти принтеры должны находиться в одной комнате. Использование классов создает некоторые проблемы, потому что пользователь не знает, на каком именно принтере было выведено его задание. С другой стороны, если на принтере произойдет сбой и он станет недоступным, задание все равно будет успешно выведено без вмешательства пользователя. Кроме того, классы отлично подходят для печати в больших объемах, так как нагрузка автоматически перераспределяется на свободные принтеры. См. также Раздел «Printing System Management» документа CUPS Software Administrators Manual (http://localhost:631/documentation.html). 14.9. Ограничение доступа к принтерам и классам Проблема Требуется запретить некоторым пользователям доступ к отдельным принтерам. Скажем, вы не хотите, чтобы пользователи печатали свои семейные фотографии на дорогом цветном лазерном принтере. Решение Воспользуйтесь командой Ipadmin: # Ipadmin -p hp6L -u allow:carla.jenn,dancer Ограничения также могут устанавливаться для классов: # Ipadmin -p art-dept -u allow:carla.jenn.dancer Также возможно ограничение доступа со стороны отдельных пользователей: # Ipadmin -p hp6L -u denyidaryl.larry.otherlarry Комментарий Не пытайтесь редактировать файлы classes.conf и printers.conf напрямую; изменения будут потеряны. Используйте команду Ipadmin. См. также Раздел «Managing Printers» документа CUPS Software Administrators Manual (http://localhost:631/documentation.htmt).
240 Глава 14. CUPS 14.10. Диагностика Проблема Печать (и особенно сетевая печать) обычно считается самым сложным и беспокойным аспектом системного администрирования. Какие существуют средства диагностики и исправления ошибок? Решение Начните с файла /var/log/cups/error_log. По умолчанию в cupsd.conf выставлен уровень детализации LogLevel info, при котором в журнале фиксируются ошибки и обычные операции. Если параметр LogLevel info не обеспечивает достаточно подробной информации, воспользуйтесь более высокими уровнями debug и debug2. Многие проблемы с печатью решаются переходом на другой драйвер. Если тестовая страница не печатается, попробуйте напечатать другой документ. Конечно, ошибки с печатью тестовых страниц говорят о наличии каких-то неполадок, но если основной документ будет успешно напечатан, то без тестовой страницы как-нибудь можно обойтись. Что касается сетевой печати, убедитесь в правильности подключений. Проверьте связь утилитой ping как по IP-адресу, так и по имени хоста. Попробуйте вручную подключиться к общему каталогу Samba; попробуйте провести печать с компьютера, к которому подключен принтер. Проверьте файл PPD принтера на странице http://www.cups.org/testppd.php; возможно, он содержит синтаксические ошибки. Если вам не удается самостоятельно определить причину проблем, отправьте содержимое журнала и описание выполняемых действий на форум соответствующей тематики. Приведу список наиболее полезных форумов: О http://printing.kde.org — форум специализируется на печати в KDE, но при этом содержит подробную информацию по многим аспектам печати в CUPS; О http://gimp-print.sourceforge.net/p_Mailing_Lists.php3 — информация о драйверах Gimp-Print; о http://www.linuxprinting.org/forums.cgi — форумы, посвященные принтерам HP, Epson, Alps, а также моделям других производителей; О http://www.cups.org/newsgroups.php — конференции, посвященные CUPS. И как всегда, прежде чем отправлять запрос, проведите поиск в архивах. Нет ничего нового под солнцем. См. также The Troubleshooting-CUPS-and-Asking-for-Help Howto (http://www.cups.org/cups- help.html).
Глава 15 Настройка видео и X Window 15.1. Введение X Window System является основой фафического интерфейса Windows. Все оконные менеджеры и графические среды — XFce, Enlightenment, KDE, Gnome и т. д. — работают на базе X. X Window System — воистину удивительная система. Вы можете работать в графической среде, одновременно открывать текстовые консоли и легко переключаться между ними. Функции X Window System не ограничиваются графическим выводом; система также является сетевым протоколом. Через нее даже можно подключаться к удаленным системам (см. главу 17). Хотя X Window System всегда считалась стандартом графики Linux, в последнее время растет число сторонников новой оконной системы X.org. Это ответвление проекта XFree86™, которое внезапно завоевало популярность, когда в XFree86 версии 4.4 были приняты лицензионные изменения, потенциально несовместимые с GPL. Fedora и Mandrake первыми перешли на X.org. Возможно, к моменту, когда вы будете читать эту книгу, все остальные последуют их примеру. А может быть, в этой области будет царить неразбериха, и появится еще одно различие между дистрибутивами на беду неосведомленным. Чтобы узнать номер версии XFree86 для вашей системы, введите команду $ XFree86 -version То же самое для X.org: $ X.org -version Система X.org в настоящее время очень близка по функциональности к XFree86; различаются в основном имена и местонахождение конфигурационных файлов. Вероятно, со временем появятся и более существенные различия. С X Window System связано немало запутанных терминов и неудобных сокращений. Приведу несколько определений: О XFree86 Project, Inc. — организация, выпускающая XFree86, свободно распространяемую реализацию X Window System с открытыми текстами; О XFree86 4.x — текущая версия XFree86 для Linux; ш !И#2^?& .wArk-^jL зЗЯаА iw\ ?^Ш)М' ШшШж
242 Глава 15. Настройка видео и X Window О X Window System — исходная оконная среда с сетевой поддержкой для Unix; О XI1 — одиннадцатая версия X Window System; О XI1 R6 — спецификация X Window System; О X.Org Foundation — ответвление XFree86 Project. Чтобы не усложнять себе жизнь, будем просто называть ее «X». Оборудование Любой видеоадаптер работает в Linux; даже самая экзотическая карта сможет работать в универсальном режиме VGA (640x480, 16 цветов). В большинстве основных дистрибутивов Linux имеются хорошие средства конфигурации видеосистемы, которые идентифицируют оборудование и автоматически находят драйверы. Крайне маловероятно, чтобы вам когда-либо пришлось редактировать X86Config (разве что для включения аппаратного ускорения или для настройки многоэкранного вывода). Многие видеоадаптеры комплектуются драйверами для Linux и обеспечивают хорошую скорость выполнения 2Б-операций. Таким образом, для повседневных задач (электронная почта, веб, электронные таблицы, набор текстов и т. д.) подойдет практически любой адаптер. С аппаратными ЗБ-ускорителями потребуется чуть больше усилий, но для компьютерных игр, систем автоматизированного проектирования или трехмерного моделирования аппаратное ускорение абсолютно необходимо. Современные видеокарты превосходят по мощности компьютеры недавнего прошлого: высокопроизводительная модель имеет 256 Мбайт памяти, 256-разрядную шину, графический процессор с частотой 256 МГц, а нередко и собственный охлаждающий вентилятор. Производительность видеокарты ограничивается типом слота, в который она вставляется. Карты PCI работают медленнее всего. Разъем AGP работает гораздо быстрее и присутствует на всех современных платах. Существует несколько разновидностей AGP: О AGP1.0: • IX - 266 Мбайт/с; • 2Х - 533 Мбайт/с. О AGP2.0: • IX = 266 Мбайт/с; • 2Х - 533 Мбайт/с; • 4Х = 1,066 Гбайт/с. О AGP3.0: • IX-266 Мбайт/с; • 2Х = 533 Мбайт/с; • 4Х = 1,066 Гбайт/с; • 8Х = 2 Гбайт/с.
15.2. Одновременное использование X и консолей 243 Стандарты AGP обладают прямой и обратной совместимостью; новые карты можно устанавливать на старых материнских платах, и наоборот. Тем не менее установка новой, высокопроизводительной карты на старой плате означает, что вы не получите всего быстродействия, за которое заплатили. Драйверы Для обеспечения аппаратного ускорения графики в Linux можно воспользоваться DRI (Direct Rendering Infrastructure) и видеокартой, поддерживаемой в Linux. В XFree 86 имеется встроенная поддержка DRI. В настоящее время поддержка XFree86/DRI имеется для следующих чипсетов: 3dfx, Gamma, Intel i8x0, Matrox, ATI Rage, ATI Radeon, Mach64 и Sis300. Обновленную информацию о поддерживаемых чипсетах можно найти на сайтах http://xfree.org и http:// dri.sourceforge.net. Другой способ основан на использовании драйверов, предоставленных производителем. Например, nVidia поставляет собственные драйверы и модули ядра, распространяемые только в двоичном виде; в настоящее время это единственный способ обеспечения аппаратного ускорения для адаптеров nVidia. Для работы в 20-режиме без ускорения можно воспользоваться драйвером nv с открытыми текстами. Некоторые карты ATI и Matrox полностью поддерживаются драйверами с открытыми текстами, в других случаях для полноценной работы карты требуются двоичные драйверы. Как обычно, информацию стоит поискать перед покупкой. 15.2. Одновременное использование X и консолей Проблема Требуется одновременно работать как с консольными сеансами, так и с сеансами X. Решение Чтобы переключиться на сеанс X с одной из консолей, достаточно нажать Ctrl+Alt+Fn, где Fn — F1-F6. Переключение между консолями осуществляется клавишами Alt+Fn, а возврат в X — клавишами Alt+F7. Первый сеанс X всегда обозначается :0. Чтобы открыть второй сеанс X, введите следующую команду в консоли: $ startx •• :1 Проследите за тем, чтобы двойной дефис — был окружен пробелами. Только что созданный сеанс X связывается с клавишей F8. Не входите в два сеанса X под одним именем, это может привести к странным и весьма неприятным конфликтам. При запуске X из консоли выводятся всевозможные диагностические и служебные сообщения. KDE отличается особенной «разговорчивостью». Большинство сообщений не содержит полезной информации, но иногда сообщения могут пригодиться для диагностики.
244 Глава 15. Настройка видео и X Window Комментарий Как правило, дистрибутивы Linux устанавливаются с семью виртуальными консолями. Загляните в файл /etc/inittab: 1:2345:respawn:/sbin/getty 38400 ttyl 2:23:respawn:/sMn/getty 38400 tty2 3:23:respawn:/sbin/getty 38400 tty3 4:23:respawn:/sbin/getty 38400 tty4 5:23:respawn.7sbin/getty 38400 tty5 6:23:respawn:/sbin/getty 38400 tty6 Сеанс X по умолчанию чаще всего связывается с консолью tty7. Исключение составляет система Knoppix, использующая только пять виртуальных терминалов. Что делать с таким количеством консолей? Проявите творческие способности. Войдите в систему под разными именами. Переключитесь на другую консоль, чтобы исправить допущенную ошибку. Наконец, просто наслаждайтесь сознанием гибкости и широты возможностей Linux. Getty и tty Названия getty и tty, как и многие термины Linux, унаследованы от Unix. Getty означает «get tty», a «tty» — это телетайп. Таким образом, с точки зрения Linux ваш новый монитор с высоким разрешением и миллионами цветов, со встроенными звуковыми разъемами и портами FireWire является обычным телетайпом. Программа getty управляет входом в систему по последовательному подключению. Она открывает последовательное устройство (текстовый терминал, виртуальный терминал или модем) и ожидает подключения. Программа выводит приглашение, а затем, после ввода имени пользователя, передает управление программе login. Существует много разновидностей getty: mgetty, mingetty, ugetty, agetty, getty- ps, fbgetty и т. д. Mingetty — минимальная версия getty, рассчитанная только на виртуальные консоли и не работающая с модемами. Вероятно, лучшей модемной версией getty является mgetty. Как определить, какая версия getty используется в вашей системе? $ ps ах | grep getty 456 tty2 S 0:00 /sbin/getty 38400 tty2 457 tty3 S 0:00 /sbin/getty 38400 tty3 458 tty4 S 0:00 /sbin/getty 38400 tty4 459 tty5 S 0:00 /sbin/getty 38400 tty5 460 tty6 S 0:00 /sbin/getty 38400 tty6 Tty — это программа. Попробуйте запустить ее в консоли: $ tty /dev/tty3 Теперь в терминале X: $ tty /dev/pts/2 Tty сообщает, в каком виртуальном терминале вы находитесь («виртуальном», потому что старые терминалы не имели собственных вычислительных мощностей — они всего лишь предоставляли интерфейс к большим ЭВМ).
15.3. Установка нового видеоадаптера 245 Имена tty* обозначают виртуальные консоли: ttyl, tty2 и т. д. Хотя в большинстве систем Linux используется 7 виртуальных консолей, теоретически их количество может достигать 63. Сокращение pts означает «псевдотерминал». Речь идет о терминалах X вроде xterm, gnome-terminal, wterm, powershell и Konsole. См. также tty(l), tty(4), pts(4), console(4), getty(8), mingetty(8), mgetty(8). 15.3. Установка нового видеоадаптера Проблема В системе устанавливается второй видеоадаптер (а может быть, заменяется старый видеоадаптер). Как настроить его и привести в рабочее состояние? Решение Лучше всего воспользоваться графической программой настройки конфигурации, входящей в дистрибутив. В SuSE это SaX, в Red Наг — redhat-config-xfree, в Fedora — system-config-xfree, а в Mandrake — XFdrake. Второй способ заключается в ручном редактировании XF86Config и изменении только тех частей, которые относятся к новому адаптеру. Редактирование XF86Config рассматривается в следующем разделе. Комментарий Возможно, вам также пригодятся следующие утилиты X: О XFree96 -configure; О /usr/XHR6/bin/xf86config; О /usr/sbin/ddcprobe. Все они должны запускаться суперпользователем root. XFree86 -configure проверяет оборудование и автоматически генерирует новый файл XF86Config. Файл предусмотрительно сохраняется отдельно, без замены исходного файла XF86Config, чтобы его можно было сначала протестировать. Программа xf86config требует ввести информацию о мыши, клавиатуре, видеоадаптере и мониторе. Она задает столько вопросов, что в конце концов вы начинаете выходить из себя. Программа /usr/sbin/ddcprobe собирает необходимую информацию о видеокарте. Программа также может опросить монитор, но, скорее всего, делать это не будет, так что держите под рукой документацию по монитору. Если новая конфигурация не работает, проверьте файл /var/log/Xfree86.0.log и посмотрите, с чем возникли проблемы. Если вам не удается выйти из «зависшего» сеанса X, нажмите клавиши Ctrl+Alt+Backspace.
246 Глава 15, Настройка видео и X Window См. также Документация XFree86 (http://www.xfree86.org/resources.html). 15.4. Редактирование файла XF86Config Проблема В системе был установлен новый видеоадаптер» и вы предпочитаете внести изменения в конфигурацию вручную. Возможно, утилита из вашего дистрибутива не делает того, что нужно, или вы просто предпочитаете отредактировать текстовый файл. Решение Конфигурация X хранится в файле XF86Config, который может находиться в разных местах: О /etc/Xll/XF86Config-4; О /etc/XF86Config; О /usr/XllR6/etc/Xll/XF86Config-4; О /usr/XllR6/etc/Xll/XF86Config. Установка нового драйвера сводится к изменению в одной секции. В следующем примере адаптер Voodoo 3 заменяется картой nVidia. Просто измените параметры Driver и Identifier (закомментируйте старые строки и введите новые значения): Section "Device" # Identifier H3dfx" # Driver "tdfx" Identifier "nVidia" Driver "nv" EndSection Значение параметра Identifier задается произвольно, а параметр Driver должен содержать фактическое имя драйвера. Список имен находится по адресу http:// www.xfree86.org/resources.html. Комментарий Если вы предпочитаете драйверы от производителя оборудования, загрузите их и выполните инструкции по установке. См. также Документация XFree86 (http://www.xfree86.org/resources.html).
15,5. Включение аппаратного ускорения в XFree86/DRI 247 15.5. Включение аппаратного ускорения в XFree86/DRI Проблема Вы хотите поиграть в Tux Racer, TuxKart или Quake 3, заняться трехмерным моделированием или другой работой, требующей интенсивного обсчета трехмерных объектов. Видеокарта обладает соответствующими функциями, вы установили драйверы, но включить аппаратное ускорение все равно не удается. Решение Для правильной работы аппаратного ускорения трехмерной графики необходим поддерживаемый видеоадаптер и изменения в файле XF86Config, обеспечивающие загрузку модулей ядра. Сначала проверьте, работает ли расширение DR1: S glxinfo | grep rendering Xlib: extension "XFree86-DRr missing on display ".0.0" direct rendering: no Если расширение на работает, включите в XF86Config следующие строки: Section "Module" Load "dri" Load "glx" EndSection Section "driH Mode 0666 EndSection Сохраните изменения и перезапустите X. Проверьте новую конфигурацию, запустив glxgears, Tux Racer, TuxKart или любую другую игру, требующую аппаратного ускорения. Как правило, редактирование XF86Config решает проблему. Если этого не произошло, воспользуйтесь рекомендациями по диагностике, приведенными в следующем разделе. Комментарий Помните, что местонахождение файла XF86Config зависит от дистрибутива. Начиная с версии 4.0, XFree86 включает встроенную поддержку DRI и библиотек Mesa, поэтому устанавливать дополнительные пакеты не придется. Проверка версии осуществляется командой $ ХРгееЗб -version Если окажется, что в вашей системе используется XFree86 3.x, проведите обновление. Не стоит пытаться включать DRI и Mesa в версии 3.
248 Глава 15. Настройка видео и X Window См. также XF86Config(7); The DRI User Guide (http://xfree.org/); страница Resources на сайте http://xfree.org/. 15.6. Диагностика проблем с ускорением трехмерной графики Проблема Вы сделали все, о чем говорилось в разделе 15.5, но аппаратное ускорение так и не заработало. Решение Начните с начала и убедитесь в том, что в системе выполняются все необходимые условия. Поддерживается ли ваша видеокарта? В разделе «Введение» настоящей главы перечислены поддерживаемые модели. На сайтах http://xfree.org/ и http:// dri.sourceforge.net можно найти обновленную информацию. Загружаются ли модули драйверов? Проверьте командой Ismod: $ Ismod Module Size Used by Not tainted tdfx 30432 17 agpgart 37312 0 (unused) Tdfx — драйвер 3dfx Voodoo3, программа agpgart необходима для работы подсистемы AGP. Если модуль драйвера или agpgart отсутствует в результатах Ismod, загляните в каталог/lib/modules и проверьте, существуют ли эти модули: /1 i b/modul es/2.4.21/kemel /dri vers/char/agp/agpgart. 0 /lib/modules/2.4.21/kernel/driver$/char/drm/tdfx.O Если какая-либо из этих программ отсутствует, вам придется собрать и загрузить ее (см. раздел 10.7). После этого перезапустите X. Работает ли подсистема dri? Если каталог/proc/dri/O существует, значит, работает: $ Is /proc/dri/0 bufs clients mem name queues vm vma Если подсистема DRI не работает, возможно, ее поддержка не была включена в ядре. Проверьте файл конфигурации ядра и найдите в нем фрагмент # Конфигурация оборудования CONFIGJ)RM-y # Драйверы DRM 4.1 CONFIG_DRMJTDFX=m Если параметр CONFIG_DRM=y отсутствует, ядро придется построить заново. Если модуль DRM для вашей видеокарты отсутствует, постройте и загрузите его без повторной сборки ядра.
15.7. Настройка startx 249 В отличие от других модулей ядра, все эти модули загружаются сервером X. Убедитесь в том, что они указаны в секции Modules файла XF86Config. Не забывайте о файле /var/log/XFree86.0.log. Поищите сообщения об ошибках и убедитесь в том, что все модули, перечисленные в секции Modules файла XF86Config, загружены в память. Если все попытки оказываются тщетными, обратитесь к страницам «Getting Help, Resources, and Community Lists» на сайте http://xfree.org. Комментарий Если вы используете драйверы, предоставленные производителем видеоадаптера, обратитесь к нему за поддержкой. Проверьте документацию, убедитесь в том, что вы используете правильный драйвер, и поищите информацию на веб-сайте производителя. См. также The DRI User Guide (http://xfree.org/); страница Resources на сайте http://xfree.org/. 15.7. Настройка startx Проблема Вы предпочитаете загружать систему в консольном режиме и вводить команду startx, когда потребуется начать сеанс X. Но для этого нужно выяснить, как настроить startx на запуск фафической среды или оконного менеджера по вашему выбору. Решение Отредактируйте файл .xinintrc в домашнем каталоге. Следующая директива запускает Gnome: exec gnome-session В файл можно включить список всех оконных менеджеров: exec gnome-session #ехес startkde #ехес Icewra #ехес icewm-experimental #ехес afterstep #exec enlightenment #exec blackbox Такой список позволяет легко сменить оконный менеджер по умолчанию, сняв комментарий с другой строки. Комментарий Gnome, KDE и XFce должны запускаться своими стартовыми сценариями (gnome- session, startkde и startxfce), а не исполняемыми файлами.
250 Глава 15. Настройка видео и X Window Если файл ~/-х1™*гс отсутствует, startx ищет глобальный файл .xinitrc, находящийся где-то в /etc (возможно, /etc/Xll/xinit/.xinitrc). Местонахождение файлов X Window зависит от дистрибутива Linux. См. также startx(lx). 15.8. Смена экранного менеджера Проблема Вам не нравится экранный менеджер и вы хотите заменить его другим. Возможно, ваш дистрибутив установил программу xdm, обладающую минимальными возможностями, а вам хотелось бы опробовать экранный менеджер с расширенными функциями — такой, как gdm или kdm. А может, у вас возникли проблемы (скажем, «зависание» при выходе из системы) и вы надеетесь, что смена управляющей программы поможет решить их. Решение Три основных экранных менеджера — xdm (X Display Manager), gdm (Gnome Display Manager) и kdm (KDE Display Manager). Чтобы узнать, какой из них используется в вашей системе, воспользуйтесь командой ps: $ ps ax | дгер dm 3796 ? S 0.00 /usr/bin/kdm -nodaemon В большинстве дистрибутивов присутствует файл /etc/Xll/default-display-manager, содержащий единственную строку: /usr/bin/kdm Введите имя другой программы с указанием полного пути: /usr/bin/gdm или /usr/bin/xdm В Red Hat и Fedora это делается несколько иначе. Отредактируйте /etc/sys- config/desktop и включите следующую строку: DISPUYMANAGER«"GNOME" ("KDE" или "XDM"). He пытайтесь указывать путь к исполняемому файлу, это не сработает. Комментарий Xdm может рассматриваться как графическая замена для команды login. Для работы этой программы достаточно только X Window System (тогда как для gdm и kdm требуются Gnome и KDE соответственно).
15.9. Одновременный запуск разных оконных менеджеров 251 Gdm и kdm делают то же самое, что xdm, а также позволяют выключить или перезапустить систему, выбрать другой оконный менеджер, настроить экран входа и снабдить его своим рисунком или логотипом. В Red Hat и Fedora для запуска экранного менеджера используется сценарии /etc/Xll/prefdm, вызываемый из /etc/inittab. Сценарий /etc/Xll/prefdm читает имя экранного менеджера по умолчанию из файла/etc/sysconfig/desktop. См. также Глава 7; The xdm and XTerminal mini-howto (http://www.tldp.org/HOWTO/XDM/xterm); домашняя страница gdm (http://freshmeat.net/projects/gdm); описание kdm (http:// docs.kde.org/en/3.2/kdebase/kdm). 15.9. Одновременный запуск разных оконных менеджеров Проблема В вашей системе установлены замечательные оконные менеджеры и графические среды — KDE, Gnome, Enlightenment, Fluxbox, XFce и т. д. Вам хотелось бы запускать их одновременно. Конечно, можно запустить отдельные сеансы X или выйти из X и запустить другой оконный менеджер, но нельзя ли запустить их одновременно? Решение Xnest позволяет запускать дополнительные сеансы X из текущих сеансов. Откройте командный процессор в любом сеансе X (допустим, вы работаете в IceWM) и запустите Xnest: $ Xnest -ас :1 Вы увидите пустой экран с курсором X. Запустите оконный менеджер (предположим, WindowMaker): $ wmaker -display :1 Теперь в командном процессоре IceWM введите $ Xnest ас :2 Некоторые оконные менеджеры или графические среды (скажем, G г не) должны запускаться из xterm в окне Xnest. Сначала запустите xterm: $ xterm -display :2 Затем запустите Gnome из xterm: % gnome-session Из любого доступного терминала в любом из оком можно запустить новый сеанс Xnest: $ Xnest ас :3
252 Глава 15. Настройка видео и X Window Пример одновременного запуска Gnome с IceWM и KDE показан на рис. 15.1. Рис. 15.1. Gnome Комментарий Нумерация сеансов X начинается с 0, поэтому сеанс X по умолчанию всегда обозначается :0. Параметр -ас в командной строке Xnest определяет номер сеанса для нового экрана. Он также блокирует контроль доступа, в противном случае X не позволит открывать приложения. Xnest использует те же параметры, что и команда X — см. xserver(lx). Когда в системе одновременно работают несколько оконных менеджеров, то при попытке запуска очередного менеджера может появиться сообщение об ошибке: $ gnome-session gnome-session: you're already running a session manager Ничего страшного — найдите его и «убейте»: $ echo SSESSION_MANAGER local/windbag:/tmp/.ICE-unix/2774 $ rm /tmp/.ICE-unix/2774 Теперь Gnome запустится нормально. См. также Xnest(l), xserver(l); оконные менеджеры для X (http://www.plig.org/xwinman).
Глава 16 Архивация и восстановление 16.1. Введение Архивация принадлежит к числу основных операций администрирования. На практике эта работа часто оказывается утомительной и неудобной. В настоящей главе будет рассказано, как организовать надежную и простую архивацию (и что не менее важно, простое восстановление) с применением rsync и Mondo Rescue. Программа rsync отличается исключительно высокой эффективностью. Она передает информацию только об изменениях в файлах и может выполнять сжатие «на ходу». Ее сильной стороной является синхронизация файловых деревьев. Благодаря этим особенностям rsync отлично подходит для обновления и создания зеркальных копий веб-сайтов, деревьев CVS и других больших, сложных деревьев. Существует два варианта использования rsync: с применением ssh для аутентификации входа и с запуском в виде демона для создания общедоступных архивов. При использовании ssh пользователь должен иметь учетную запись на каждом компьютере, с которым он собирается работать через rsync. Mondo Rescue — отличная утилита для создания загружаемых дисков восстановления системы. Она позволяет создать «моментальный снимок» текущей конфигурации системы и воссоздать ее простой загрузкой с компакт-диска или DVD. При этом будут автоматически воссозданы все заплатки и обновления, а также вся конфигурация. Восстановите данные с сервера rsync, и система за рекордно короткое время будет возвращена в рабочее состояние. Mondo также может применяться для полной архивации системы. В течение долгого времени в области архивации господствовали стримеры, потому что они обеспечивали максимум емкости при минимуме затрат. Но запись на ленту выполняется слишком медленно, а восстановление — итого медленнее. Конечно, при повременной оплате это не так уж плохо, но у лент есть и другие недостатки: О емкость современных жестких дисков существенно превышает емкость ленты, поэтому вам либо придется использовать дорогостоящий автоматический загрузчик, либо возиться со сменой лент; О в области восстановления файлов пользователь зависит от системного администратора;
254 Глава 16. Архивация и восстановление О восстановление «на пустом месте» происходит достаточно сложно: сначала необходимо установить файловую систему, затем драйверы стримеров и только потом можно переходить к восстановлению; О даже если одной ленты хватает для хранения полной резервной копии, ленты все равно нужно менять и где-то хранить. У лент есть одно явное преимущество: долговечность. Компакт-диски, DVD и жесткие диски не подходят для долгосрочного хранения архивов. По моей оценке, записанные в домашних условиях диски CD/DVD обычно выдерживают не более двух лет. Лента при аккуратном хранении выдержит лет 20. Долговечность является главным недостатком всех цифровых носителей. Даже если сохранится сам носитель (лента, DVD и т. д.), нет гарантии, что останутся средства для ее чтения. Оборудование постоянно изменяется, как и файловые форматы. Сможете ли вы прочитать дискету 5,25й? Файлы WordStar? VisiCalc? Даже самый старый файл в формате ASCII легко читается, но что делать с закрытыми двоичными форматами типа .ppt или .pst? Если фирма-производитель прекратит их поддержку или перестанет существовать, вам не повезло. Таким образом, лучшее, на что мы можем рассчитывать, — это краткосрочная архивация и восстановление, и rsync с Mondo Rescue отлично подходят для этой цели. Программа rsync быстра, компактна и полностью автоматизирована; вам не придется помнить о необходимости менять диски или ленты, а восстановление проходит легко и быстро. Вы даже можете создать архивы, доступные для пользователей, чтобы они не приставали к вам с просьбой восстановить тот или иной файл. Как насчет архивации самого сервера архивации? Никаких проблем. Создание удаленного зеркала rsync для архивации архивов считается одним из стандартных приемов. В настоящее время выбор съемных носителей широк как никогда: съемные жесткие диски IDE, переносные диски с интерфейсом USB/FireWire и флэш-диски. Короче говоря, в вашем распоряжении имеется масса превосходных вариантов для планирования схем архивации и восстановления. 16.2. Применение rsync для локальной пересылки и синхронизации файлов Проблема Требуется организовать синхронизацию файловых деревьев на рабочей станции. Ваша рабочая станция используется для создания веб-каталогов, графических галерей и других сложных файловых структур. В рабочем каталоге файлы редактируются, а затем копируются в другой каталог для загрузки. Вы хотите использовать какое-нибудь более быстрое и интеллектуальное средство, чем команда ср, которая работает слишком медленно и не следит за тем, какие файлы нужно копировать, а какие — нет.
16.2. Применение rsync для локальной пересылки и синхронизации файлов 255 Решение Организуйте синхронизацию файлов при помощи программы rsync. Для ускорения программа копирует только изменившиеся файлы и отслеживает изменения внутри файлов и деревьев. Обязательно установите последнюю версию rsync со всеми исправлениями и заплатками безопасности. Вам нужна версия 2.6 и выше: $ rsync --version rsync version 2.6.6 protocol version 26 Следующая команда копирует каталог веб-файлов в каталог, содержимое которого позднее будет переслано на веб-сервер: $ rsync -av --stats /home/pearlbear/webs ~/web_upload building file list...done Number of files: 254 Number of files transferred: 235 Total file size: 8923014 bytes Total transferred file size: 8923014 bytes Literal data: 8923014 bytes Matched data: 0 bytes File list size: 6490 Total bytes written 8939848 Total bytes read: 3780 Результат копирования проверяется командой $ Is ~/web_upload webs ВНИМАНИЕ Здесь есть небольшая тонкость: /home/pearlbear/images копирует содержимое /images и сам каталог. Если добавить завершающую косую черту (/home/pearlbear/images/), будет скопировано только содержимое каталога /images, но не сам каталог. Завершающая косая черта важна только в исходном каталоге, а в приемном каталоге она игнорируется. Если в каталоге /home/pearlbear/webs появятся новые файлы или в какие-то из существующих файлов будут внесены изменения, просто выполните ту же команду заново. Rsync синхронизирует только изменения. Для копирования можно выбрать несколько исходных каталогов: $ rsync -ev --stats /home/pearlbear/webs /home/pearlbear/webJmages -/webjjpload Комментарий Если из исходного каталога были удалены какие-либо файлы, rsync не будет автоматически удалять их из синхронизированного каталога. Чтобы файлы были удалены, включите в командную строку ключ —delete: $ rsync -av --delete /home/pearlbear/webs ~/web_upload Ключи -av означают соответственно архивацию (Archive) с сохранением файловых разрешений и владельцев и расширенный вывод (Verbose).
256 Глава 16. Архивация и восстановление Будьте внимательны с ключом —delete. Если из архива rsync будет случайно удален нужный файл, восстановить его уже не удастся. Также следите за правильностью путей, потому что в случае ошибки ключ —delete спокойно удалит целый каталог или файловое дерево. Программа rsync отлично подходит для синхронизации локальных архивов. Если вы занимаетесь веб-дизайном, работаете над программным проектом, собираете файлы для записи на компакт-диск или выполняете операции с любой крупной коллекцией файлов, доверьте rsync отслеживание и синхронизацию всех изменений — это сэкономит вам немало времени. См. также Ksync(l). 16.3. Безопасная пересылка данных с применением ssh Проблема Требуется использовать rsync для копирования файлов на другой компьютер по локальной сети или Интернету, с защитой пересылаемых данных посредством шифрования и аутентификации. Решение Используйте rsync на базе ssh. Для этого на всех хостах должна работать программа ssh. Укажите исходный и приемный каталог и включите в командную строку параметр -е ssh. Следующая команда пересылает файлы по локальной сети в учетную запись Ijl на удаленном компьютере с именем stinkpad: ljl@compak:~$ rsync -av -e ssh stationery stinkpad:test ljlGstinkpad's password: building file 11st... done stationery/ stationery/1jl- return-address•smal 1 .sxw stationery/1jl- hoiiday-1abel.sxw stat1onery/ljl•return-address-MV-small.sxw wrote 25984 bytes read 68 bytes 7443.43 bytes/sec total size is 25666 speedup is 0.99 Будьте внимательны с путями. Параметр stinkpadrtest загружает каталог stationery и все его содержимое в каталог/home/ljl/test на хосте stinkpad. Если каталог /test не существует, rsync создаст его: ljlGstinkpad's password: building file list... done created directory test Чтобы загрузить данные в каталог, находящийся за пределами вашего домашнего каталога, потребуются разрешения, достаточные для создания нового ката-
16.4. Настройка сервера архивации rsync 257 лога программой rsync (или это должен быть существующий каталог, в который вам разрешена запись). Чтобы каталог задавался по отношению к корневой файловой системе, а не к домашнему каталогу, поставьте перед ним символ /: $ rsync -av -e ssh stationery stinkpad:/shared_uploads Чтобы загрузка файлов производилась по Интернету, укажите свое имя пользователя в удаленной системе и полное доменное имя: $ rsync -av -е ssh stationery 1jl@stinkpad.test.net:/shared_uploads Синтаксис копирования файлов с удаленного хоста выглядит несколько иначе. Следующая команда копирует каталог/scripts и его содержимое с удаленного хоста в локальный каталог /downloads: $ rsync -av -e ssh ljK3stinkpad.test.net:/shared_uploads/scripts -/downloads/ Комментарий И аутентификация, и пересылка шифруются, поэтому механизм rsync хорошо подходит для пересылки конфиденциальной информации. Единственное неудобство заключается в том, что пользователи должны иметь учетные записи на всех компьютерах, на которых они будут сохранять или загружать файлы, что создает дополнительные хлопоты с настройкой. Центральный сервер с общими каталогами хорошо подходит для управления сложными сценариями совместного доступа к файлам. Для управления доступом используется стандартный инструментарий Linux — разрешения файлов и каталогов, группы. См. также rsync(l). 16.4. Настройка сервера архивации rsync Проблема Вы хотите, чтобы пользователи могли архивировать свои данные. Тем не менее раздавать пользователям учетные записи только для этой цели было бы нелогично. Вам хотелось бы упростить совместный доступ к файлам, но также без предоставления лишних учетных записей. Решение Создайте централизованный сервер, на котором rsync будет работать в режиме демона. Пользователям не понадобятся учетные записи для входа на этот сервер, а безопасность будет обеспечиваться собственными средствами rsync. Программа rsync должна быть установлена на всех компьютерах. Сначала на сервере rsync отредактируйте или создайте файл /etc/rsyncd.conf, чтобы создать модуль rsync с определением архива: # Глобальные параметры log file - /var/log/rsyncd.log
258 Глава 16. Архивация и восстановление # Модули [backupjlirl] path - /backups comment - server1 archive list » yes read only - no Проверьте, что каталог /backups существует. Затем запустите rsync на сервере в режиме демона: # rsync --daemon Теперь вы можете копировать файлы с удаленного компьютера на сервер. В следующем примере удаленный PC будет называться «workstation», а сервер rsync — «serverl». Начните с проверки доступности сервера rsync: sue@workstation:~$ rsync serverl:: backupjlirl serverl archive Следующая команда копирует каталог/spreadsheets в модуль backup_dirl: sue@workstation:-$ rsync -av spreadsheets serverl::backup_dirl building file list... done spreadsheets/aug_03 spreadsheets/sept_03 spreadsheets/oct_03 wrote 126399 bytes read 104 bytes 1522.0 bytes/sec total size is 130228 speedup is 0.94 Просмотрите загруженные файлы: suel&rorkstation:~$ rsync serverl: :backup__dirl drwx 192 2003/02/12 spreadsheets • rw-r--w-- 21560 2003/09/17 augJ3 -rw-r.-w-- 21560 2003/10/14 sept 03 -rw-r--w-- 21560 2003/11/10 oct_03 Комментарий Представленная конфигурация абсолютно работоспособна, но не слишком хорошо защищена. Модуль backup_dirl доступен для всех пользователей rsync. Файлы передаются в незащищенном виде, поэтому такой способ не следует использовать для пересылки конфиденциальных данных. В rsync имеются встроенные средства аутентификации и контроля доступа, позволяющие реализовать несложную схему защиты. О том, как это сделать, рассказано в разделе 16.5. См. также rsync(l), rsyncd.conf(5); домашняя страница rsync (http://rsync.samba.org). 16.5. Защита модулей rsync Проблема Вы последовали рекомендациям из раздела 16.4. В самом деле, было бы удобно предоставить пользователям возможность самостоятельной загрузки своих файлов
16.5. Защита модулей rsync 259 с сервера архивации или поручить обновление веб- и FTP-серверов кому-то еще. Но доступ к файлам открыт для всех пользователей rsync — как организовать защиту модулей? Решение Rsync содержит простые средства аутентификации и контроля доступа. Чтобы активизировать их, следует создать новый файл с парами «имя/пароль» и включить директивы «auth users» и «secrets file» в/etc/rsyncd.conf. Сначала создайте на сервере rsync файл паролей и присвойте ему разрешения chmod 600: # Пользователи rsync для serverl # Файл создан 2/7/2004 sue:sekkrit Теперь отредактируйте /etc/rsyncd.comf. Выделите пользователю Sue собственный модуль и заблокируйте доступ к нему всем, кроме Sue: # Глобальные параметры log file - /var/log/rsyncd.log # Модули [sue_backup] path « /backups/sue comment - Sue's private archive 11st - yes read only - no auth users - sue secrets file « /etc/rsync/rsync-users Чтобы обратиться к модулю, пользователь должен указать перед именем сервера свое имя rsync: sue@workstation:-$ rsync sue@serverl::sue_backup Password: drwx 192 2003/02/12 spreadsheets •rw-r-r-- 21560 2003/09/17 augJ3 •rw-r--r-. 21560 2003/10/14 sept_03 -rw-r--r-- 21560 2003/11/10 octJ)3 Теперь пользователь сможет архивировать и восстанавливать файлы так же, как раньше — при условии, что он помнит свое имя rsync. He забудьте двойное двоеточие (::), используемое при подключении к серверу rsync. Комментарий Пары «имя/пароль» назначаются произвольно и не имеют отношения к системной учетной записи. Это позволяет легко и быстро создавать и изменять модули, а также добавлять и исключать пользователей. Для повышения уровня безопасности добавьте следующие директивы в rsyncd.conf: О strict modes=yes — файл паролей не будет проверяться rsync, если он доступен для чтения кому-либо, кроме демона rsync, и пользователь не получит доступа. По умолчанию используется режим yes, поэтому включать эту строку не обязательно (разве что как напоминание). Если вы не хотите использовать жесткую проверку, включите директиву strict modes = false;
262 Глава 16. Архивация и восстановление См. также Глава 7. 16.8. Настройка выбора файлов Проблема Некоторые файлы (например, .tmp и .bak) нужно исключить из архивации. А возможно, вы, наоборот, хотите задать список включаемых файлов. Решение Поместите списки в файлы и укажите их в параметрах rsync — exdude-from и — in- clude-from. Файлы могут содержать перечни включаемых/исключаемых файлов, регулярные выражения или их комбинацию: *.tmp *.temp *.bak /etc/skel /etc/local Затем включите параметры -exclude-from и --indude-from в командную строку rsync: $ rsync -ae ssh /home /etc • -exclude-fromWexclude-list backup.test.net:/home-etc Комментарий Лучше ограничиться либо включением, либо исключением файлов. Присутствие обоих параметров создает путаницу. См. также Rsync(l). 16.9. Автоматизация архивации rsync на базе ssh Проблема Требуется автоматизировать процесс архивации rsync на базе ssh. Решение Напишите сценарий, создайте задание сгоп и настройте keychain для аутентификации на удаленных хостах (использование keychain рассматривается в разделе 17.7). Далее приводится простой сценарий для архивации /home и /etc пользовате-
16,10. Ограничение загрузки канала при использовании rsync 263 лем backupadmin, созданным специально для этой цели. Вторая строка сценария приказывает сгоп использовать keychain для удаленной аутентификации: #!/bin/bash source /home/backupadm1n/.keycha1n/$H0STNAME -sh rsync -av -e ssh --delete --force /home /etc stinkpad:home-etc-backup После того как вы настроите выбор файлов и протестируете сценарий, создайте задание сгоп для запуска сценария. В следующем примере задание стартует каждый вечер в 22:00: # crontab -е О 22 * * * /usr/local/bin/rsyncbackup.sh Комментарий В документации часто предлагается создавать ключи с пустыми паролями, чтобы пересылку ssh можно было планировать в сгоп. Это делать опасно, потому что каждый, кто получит доступ к вашему приватному ключу, сможет воспользоваться им в своих целях. Keychain выполняет аутентификацию за вас, чтобы вы могли защитить свои приватные ключи паролем. У keychain есть только один недостаток: программа не переживает перезагрузку, поэтому пароль (или пароли) приходится вводить заново при запуске системы. Но в конце концов, это повышает уровень безопасности — ведь вы же не хотите, чтобы после перезагрузки компьютера любой желающий получил беспрепятственный доступ к вашим удаленным хостам. См. также Ssh(l), rsync(l); раздел 16.8; раздел 17.7; страница Examples на сайте http://samba. anu.edu.au/rsync. 16.10. Ограничение загрузки канала при использовании rsync Проблема Rsync может в мгновение ока парализовать работу канала связи; только представьте, как архивация нескольких гигабайт аудиофайлов отразится на работе загруженной сети. Нельзя ли ограничить загрузку канала без полноценного отслеживания трафика? Решение Используйте параметр — bwlimit: $ rsync -a —bwlimit-256 rsync.test.net::testnetftp/ /frp/mirror Комментарий Значение —bwlimit задается в килобайтах в секунду; учтите этот факт при вычислении используемого значения. Помните, что в большинстве сетей скорость передачи данных измеряется в килобитах в секунду.
266 Глава 16. Архивация и восстановление Комментарий Никто не заставляет вас ограничиваться скучными текстовыми сообщениями. На рис. 16.1 показан пример псевдографического сообщения. fcarlaSwindbag : ~$ гвуг.с windbaij: I* / / / К II /1 / / _ \/ / / _ у _ '_ \/ _ \ t _/■ \ I I/ и / _j / /_/ /_/ / / /; / г _/ ////// |__л_л / л j\ /_/ / / /j\ / \_7^ / < j i i / / 7 / / -j / / f t l t / л_, / / / /\ / / ( j I hope you еп^ьу УРЦК visit. 1С you encounter *ny d itticultiea, pleea» contact раупслбцInDte3t.net ! ■ t O-O / о \ (1 1) hone иу Home Ac*a dir stiaued dir*c,tot."y Ш&-- Рис. 16.1. «Сообщение дня» в формате ASCIl-арта Для создания таких сообщений можно воспользоваться ASCII-генератором FIGlets (http://www.figlet.org). См. также rsync(l), rsyncd.conf(5). 16.14. Создание загрузочного компакт-диска в Mondo Rescue Проблема Требуется простое средство для создания образа системы. Вам нужен идеальный дубликат с сохранением конфигурации, всех заплаток и обновлений, чтобы систему можно было легко восстановить «с нуля», перенести на другой жесткий диск или создать несколько идентичных установок. Пользовательские данные ежедневно архивируются, поэтому достаточно сохранить системные и конфигурационные файлы.
16» 14. Создание загрузочного компакт-диска в Mondo Rescue 267 Решение Воспользуйтесь Mondo Rescue для создания пользовательского загрузочного компакт-диска. Проследите за тем, чтобы на жестком диске было достаточно места для хранения временного образа (700 Мбайт на каждый диск). Не запускайте другие программы (игры, почтовые клиенты, редакторы и т. д.) во время работы Mondo. Введите с правами root команду mondoarchive в командной строке. Mondo подумает минуту-другую, а затем откроет окно, показанное на рис. 16.2. Рис. 16.2. Mondo Выберите носитель информации. В нашем примере будет использоваться дисковод CD-RW по адресу SCSI 0,1,0. В следующем окне программа спросит, поддерживает ли ваш дисковод технологию «Burn-Proof» (yes). Затем выберите уровень сжатия (Maximum), укажите скорость записи (4) и SCSI-адрес дисковода (0,1,0). Затем программа спрашивает, какие файлы нужно архивировать. Выберите/ или всю корневую файловую систему, потому что в следующем вопросе вам будет предложено выбрать исключаемые файлы. Файлы /tmp и /ргос исключаются автоматически. Также исключите /home и другие каталоги данных (общие каталоги, почтовые накопители и журналы). Далее Mondo спрашивает, нужно ли проверить архивы после их создания (yes), и уверены ли вы в том, что в вашей системе используется нормальное, стандартное ядро Linux (при использовании старого ядра Debian отвечайте по — дополнительная информация приведена в подразделе «Комментарий»). Наконец, программа попросит ввести имя устройства. Если в системе используется ядро 2.4, введите имя SCSI (/dev/scdn). Для ядра 2.6 используйте имя /dev/ hdn. Архивация может занять пару часов. Впрочем, отходить от компьютера не стоит, потому что в конце потребуется ваше участие.
268 Глава 16, Архивация и восстановление Комментарий Если вы запустили Mondo из консоли и экран погас от отсутствия активности пользователя, нажмите клавишу Alt. Для получения адреса SCSI вашего дисковода используется команда cdrecord - -scanbus. В системах с ядром 2.4 его можно найти в /etc/fstab или в выходных данных dmesg. «Нормальным» считается ядро, включающее следующие компоненты: О поддержка loo pfs; О поддержка CD-ROM; О поддержка ISO9660; О поддержка initrd ramdisk (встроенная); О поддержка файловых систем в виртуальной памяти (встроенная); О поддержка флоппи-дисководов (встроенная); о поддержка файловой системы Ext2 (встроенная); О поддержка носителя, на который записывается архив; О эмуляция SCSI в ядре 2.4. Большинство стандартных ядер новее версии 2.4.7 подходят под этот критерий. Старые версии Debian плохо поддерживались Mondo, но начиная с ядра 2.4.17, ядра Debian должны содержать все обязательные компоненты. Если ваше ядро не может использоваться для загрузки компакт-диска Mondo, воспользуйтесь аварийным ядром mindi-kemel (см. раздел 16.18). Ядро mindi-kernel используется только для загрузки компакт-диска аварийного восстановления, оно не заменяет системное ядро. У Mondo есть свои представления о том, как должен быть настроен загрузчик GRUB. Возможно, пользователям GRU В придется создать следующую мягкую ссылку: # In -s /boot/grub/menu.lst /etc/grub.conf Mondo настаивает на присутствии этой ссылки и отказывается проводить архивацию без нее, так что лучше не спорить. Mondo распространяется в форме исходных текстов, пакетах Debian и RPM. Вам потребуются следующие пакеты: О Mondo; О Mindi; О Afio; О Newt; О Lzop; О Syslinux; О Cdrecord; О Mkisofs. См. также Mondoarchive(l); локальная документация Mondo (/usr/share/doc/mondo/html/ 1.6x-howto); форумы пользователей Mondo (http://forum.mondorescue.org).
16.16. Создание загрузочного диска DVD 269 16.15. Проверка архивов Mondo Проблема Вам хотелось бы убедиться в целостности архива Mondo. Всегда лучше делать это заранее; было бы крайне неприятно узнать о повреждении архива в тот момент, когда вы пытаетесь восстановить систему. Решение Воспользуйтесь командой Mondo compare. Загрузите диск Mondo в той системе, в которой он был создан. Введите в приглашении: # compare На выполнение команды потребуется некоторое время, зависящее от размера архива. После ее завершения просмотрите протокол изменений в файле /tmp/ changed.txt. Изменения должны ограничиваться файлами журналов, почтой, /etc/ mtab и другими часто изменяемыми файлами. В статических системных файлах (таких, как исполняемые файлы в /bin,/sbin, /usr/bin и/usr/sbin), а также в статических файлах конфигурации в /etc/ быть не должно. Комментарий Всегда проверяйте резервную копию системы! После выполнения команды compare попробуйте восстановить несколько файлов с диска Mondo. Если у вас имеется свободный компьютер с той же аппаратной конфигурацией, проведите на нем полное восстановление (самый надежный способ). См. также mondoarchive(l); локальная документация Mondo (/usr/share/doc/mondo/hml/16.x- howto); форумы пользователей Mondo (http://forum.mondorescue.org). 16.16. Создание загрузочного диска DVD Проблема Вы предпочитаете записать резервную копию системы на один диск DVD вместо нескольких компакт-дисков. Решение Запустите Mondo Rescue из командной строки и создайте файл .iso. Затем запишите файл .iso на DVD. Помимо компонентов Mondo Rescue, перечисленных в подразделе «Комментарий» раздела 16.14, вам потребуются пакеты dvd+rw-tools и cdrtools.
270 Глава 16. Архивация и восстановление Первая команда создает файл .iso, а вторая копирует его на DVD: # mondoarchive -OVmf -5 -S /tmp/scratch -T /tmp/mondo -E "/home /shared /var/www" \ -1 -f /tmp/iso # growisofs -dvd-compat -Z /dev/scdO=/tmp/iso Комментарий В принципе задача может быть решена и в графическом интерфейсе Mondo — на первом экране выберите режим Backup to Hard Disk. Командная строка позволяет лучше контролировать происходящее; например, вы можете отключить создание загрузочных дискет и запретить автоматическое выдвижение лотка. Параметры командной строки mondoarchive: О -0 — создание архива; О -V — проверка архива; О -т — запрет автоматического выдвижения лотка (используется для автоматизированной архивации и на портативных компьютерах, которые обычно не имеют самозадвигающихся лотков); О -F — не выдавать запрос на создание загрузочных дискет; О -5 — уровень сжатия. Допустимые значения лежат в интервале 0-9, где 0 соответствует отсутствию сжатия, а 9 — максимальной степени сжатия. По умолчанию используется значение 3; О -S — местонахождение рабочего каталога, в котором строятся образы перед архивацией; о -Т — каталог для хранения других временных файлов; О -Е — перечень каталогов, исключаемых из архива. Съемные тома, /tmp и /ргос исключаются автоматически; О -i — создание образов .iso; О -d — каталог, в котором хранится итоговый файл .iso. По умолчанию используется каталог /root/images/mondo. См. также mondoarchive(l), growisofs(l); локальная документация Mondo (/usr/share/doc/mondo/ hml/16.x-howto); форумы пользователей Mondo (http://forum.mondorescue.org). 16.17. Использование Mondo Rescue для клонирования систем Linux Проблема Имеется несколько идентичных компьютеров; на них требуется установить идентичные конфигурации Linux. Звучит просто, но на практике задача установки
16.18. Использование mindi-kernel 271 одинаковых конфигураций на двух и более компьютерах оказывается неприятной и чреватой ошибками. Решение Сначала создайте одну установку Linux и настройте ее по своему усмотрению. Затем создайте при помощи Mondo диск CD или DVD для своей настроенной системы и используйте его для новых установок. Загрузите диск Mondo на другом компьютере и выберите режим Nuke. Mondo стирает установленную систему и создает точную копию настроенного экземпляра Linux. Комментарий Mondo экономит время при дублировании конкретной конфигурации сервера или подготовке нескольких идентичных рабочих станций. Не забудьте отредактировать сетевые параметры (имена хостов и статические IP-адреса) и создать необходимые учетные записи пользователей. См. также mondoarchive(l); локальная документация Mondo (/usr/share/doc/mondo/hml/16.x- howto); форумы пользователей Mondo (http://forum.mondorescue.org). 16.18. Использование mindi-kernel Проблема В ядре Linux отсутствуют некоторые элементы, необходимые Mondo для создания загрузочных дисков аварийного восстановления. Вы узнали об этом, когда попытка загрузки с диска Mondo завершилась с ошибкой «VFS: Unable to mount root fs». Что делать дальше? Как создать работоспособный диск? Решение Воспользуйтесь ядром mindi-kernel для создания загрузочного диска Mondo. Mindi-kernel — надежное (failsafe) ядро 2.4.7, предоставленное авторами Mondo. Если вы используете графический интерфейс Mondo, программа спросит, хотите ли вы использовать mindi-kernel. Ответьте положительно. В командной строке использование mindi-kernel включается параметром -к: -к FAILSAFE Комментарий Возможно, пользователям Debian придется установить mindi-kernel отдельно. Ядро mindi-kernel не заменяет системное ядро, а только обеспечивает создание загружаемого диска аварийного восстановления.
272 Глава 16. Архивация и восстановление См. также mondoarchive(l); локальная документация Mondo (/usr/share/doc/mondo/hml/16.x- howto); форумы пользователей Mondo (http://forum.mondorescue.org). 16.19. Восстановление системы с диска Mondo Проблема Требуется провести полное восстановление системы. Возможно, система получила непоправимые повреждения, или вы хотите снести существующую установку и восстановить ее в предыдущем, заведомо работоспособном состоянии. Решение Чтобы построить систему заново, загрузитесь с диска Mondo и введите в командной строке команду nuke. Команда полностью уничтожает существующую систему и восстанавливает ее в состоянии, сохраненном на диске. Комментарий Программа Mondo может сохранять всю систему, включая файлы данных или только корневую файловую систему. На практике Mondo обычно используется для сохранения корневой файловой системы на загрузочном компакт-диске, а данные архивируются отдельно при помощи сервера rsync. См. также mondoarchive(l); локальная документация Mondo (/usr/share/doc/mondo/hmt/16.- x-howto); форумы пользователей Mondo (http://forum.mondorescue.org). 16.20. Восстановление отдельных файлов с диска Mondo Проблема Требуется восстановить несколько файлов. Вы не собираетесь уничтожать существующую систему и начинать все заново. Решение Загрузите систему с диска mondo и выберите интерактивный режим.
16.20. Восстановление отдельных файлов с диска Mondo 273 Введите в командной строке команду interactive. Mondo спрашивает, какие разделы следует смонтировать. Выберите нужные вам разделы, а затем ответьте на несколько вопросов: Do you want to partition your devices? no Do you want to format them? no Do you want to restore everything? no Do you want to restore something? yes Which path do you want to restore? /etc/rsync Select your restore path: /etc/rsync Mondo даст возможность напрямую загрузить систему с диска после восстановления файлов, но обычно проще извлечь диск Mondo и перезагрузить систему. Комментарий Возможно, файлы стоит восстановить в каталоге по умолчанию (/mnt/RESTORE) и просмотреть их перед тем, как копировать в итоговый каталог. См. также mondoarchive(l); локальная документация Mondo (/usr/share/doc/mondo/hml/16.x- howto); форумы пользователей Mondo (http://forum.mondorescue.org).
Глава 17 Удаленный доступ 17.1. Введение Удаленный доступ по праву считается одной из самых замечательных возможностей Linux. Существует много способов организации удаленного доступа. В незащищенных сетях не следует полагаться на старые механизмы telnet или X, поскольку информация учетной записи и данные пересылаются в виде простого текста. Оптимальным выбором станет OpenSSH (Secure SHell) — семейство из нескольких программ защищенной пересылки данных: scp (Secure CoPy), ssh (Secure SHell) и sftp (Secure File Transfer Protocol). Программа ssh является основным инструментом удаленного администрирования; с ее помощью можно подключиться к удаленному компьютеру и работать с ним так, словно вы физически работаете за этим компьютером. Информация учетных записей и данные шифруются. Кроме того, ssh обнаруживает модификацию пакетов во время пересылки. Злоумышленники могут сколько угодно перехватывать пакеты и вносить в них изменения — они этим ничего не добьются. В действительности SSH не является командным процессором (shell); это протокол. Существует две несовместимые версии этого протокола, SSH-1 и SSH-2. OpenSSH поддерживает обе версии. В этой главе рассматривается версия SSH-2, так как в работе следует использовать более современную версию OpenSSH. ПРИМЕЧАНИЕ Терминология SSH может сбить с толку непосвященных. SSH (прописными буквами) — название протокола, тогда как ssh, scp и т. д. (арочными буквами) — программы, использующие SSH. OpenSSH — реализация SSH, используемая в этой главе. Работать с SSH несложно. Если ранее вам доводилось пользоваться rsh, rlogin или гср, синтаксис командной строки почти не изменился. На всех компьютерах, к которым должен предоставляться удаленный доступ, должен работать демон OpenSSH sshd, а на всех удаленных компьютерах потребуются учетные записи. Входить можно под любой учетной записью; главное, чтобы вы знали имя и пароль. OpenSSH проводит аутентификацию с использованием пар из открытого и закрытого ключа. Закрытые ключи тщательно охраняются и никогда, ни при каких
17.2. Настройка OpenSSH 275 условиях не передаются другим пользователям. Всегда используйте сильные пароли для шифрования и защиты закрытых ключей. По-настоящему сильный пароль состоит из нескольких слов и содержит буквы и цифры типа «t4is is mai 733t s3kkrit p4ssphr4se». Как обычно, следует выдерживать баланс между надежностью и удобством, потому что пароль придется часто вводить. Открытые ключи передаются удаленным клиентам и серверам SSH. Например, при использовании аутентификации с ключом хоста открытый ключ сервера хранится на клиентских компьютерах, которым разрешен доступ к серверу. Все сеансы SSH начинаются с аутентификации. После того как открытый ключ удаленного хоста будет скопирован в локальный каталог ~/.ssh, вы сможете подключиться к удаленному хосту в качестве любого пользователя, используя данные его учетной записи. Если вы хотите, чтобы при аутентификации использовались ключи SSH (вместо учетных данных пользователя), сгенерируйте собственную пару из открытого и закрытого ключа и скопируйте открытый ключ на все удаленные хосты, к которым вы собираетесь подключаться. Чтобы схема заработала, достаточно выполнить пару дополнительных шагов, описанных в этой главе. Такой вид аутентификации называется аутентификацией с открытым ключом. Если вы собираетесь подключаться к многим удаленным компьютерам, управление входными данными начинает создавать проблемы. Использование одного и того же открытого ключа и пароля создает потенциальную угрозу для безопасности системы, но и запомнить слишком много имен и паролей тоже нелегко. OpenSSH решает эту проблему за счет использования аутентификации с открытым ключом, программ ssh-agent и keychain, позволяющих проводить защищенную аутентификацию без пароля. 17.2. Настройка OpenSSH Проблема Вы хотите установить связь между локальной рабочей станцией и удаленным компьютером. Подключение должно быть защищенным; информация не должна стать доступной для злоумышленников (их не видно, но они существуют — даже если вы не страдаете паранойей). Итак, требуется настроить OpenSSH. Решение Установите OpenSSH на обоих компьютерах. Чтобы удаленный хост принимал подключения, на нем должен работать демон sshd. Скопируйте открытый ключ удаленного хоста в файл ~/\ssh/known_hosts на локальном компьютере — и можете приступать к работе. Запуск sshd в большинстве систем на базе грт осуществляется следующим образом: # /etc/init.d/sshd start # /etc/init.d/sshd stop
276 Глава 17. Удаленный доступ В Debian демон запускается несколько иначе: # /etc/init.d/ssh start # /etc/init.d/ssh stop Всегда проверяйте имена файлов init, они могут изменяться в зависимости от дистрибутива. Копирование открытого ключа удаленного хоста в локальный файл ~/.ss\\/ known_hosts сводится к простой попытке подключения к удаленному хосту: carla@windbag carla$ ssh stinkpad The authenticity of host 'stinkpad (192.168.1.100)' can't be established. RSA key fingerprint is a2:c6:70:3e:73:00:b3:ed:90:bl:9a:bc:e7:d5:32:ba. Are you sure you want to continue connecting (yes/no)? Ответьте yes, и на экране появится сообщение: Warning: Permanently added 'stinkpad.192.168.1.100' (RSA) to the list of known hosts. carla&stinkpad's password: Linux stinkpad 2.4.21 #1 Sun Aug 3 20:15:59 PDT 2003 1686 GNU/Linux Libranet GNU/Linux Last Login: Sat June 3 22:16:24 2004 from :0.0 carla@stinkpad:~$ Подключившись к удаленному компьютеру, вы сможете работать с ним точно так же, как если бы вы сидели за ним (о том, как запустить удаленный сеанс X, рассказано в разделе 17.11). Чтобы закрыть сеанс удаленного подключения, введите команду exit. Комментарий Простая команда ssh <xocm> создает подключение к другому хосту локальной сети с использованием данных текущей учетной записи. Чтобы подключиться с данными другого пользователя, укажите параметр -L carla@windbag ~% ssh -1 wilmaf stinkpad При подключении SSH по Интернету следует указывать полное доменное имя: carla@windbag ~$ ssh stinkpad.test.net Установление исходного подключения и копирование ключа RSA с хоста является самой рискованной частью создания SSH. Если злоумышленнику удастся вмешаться в работу сервера имен, он может перехватить сеанс SSH и похитить данные вашей учетной записи. Впрочем, риск относительно невелик, и перед первым подключением можно проверить IP-адрес удаленного хоста. Чтобы закрыть эту брешь в системе безопасности, заранее вручную скопируйте открытый ключ хоста в локальный файл ~/-ssh/known_hosts. При этом файл придется слегка подредактировать; далее приводятся примеры. Ключи хостов хранятся в каталоге /etc/ssh и используются для проверки «личности» удаленного хоста. Для подключения пользователю потребуется только копия открытого ключа в его файле ~/'ssh/known Jwsts и учетная запись, под которой осуществляется вход в систему. В некоторых дистрибутивах Linux при установке OpenSSH создаются две пары ключей, RSA и DSA: $ Is /etc/ssh ssh_host_dsa_key ssh_host_dsa_key.pub
17.3. Построение новых ключей хостов 277 ssh_host_rsaJcey ssh_host_rsa_key. pub Если система не создает ключи или вы захотите изменить их, обратитесь к рецепту 17.3 — в нем рассказано, как сгенерировать новые ключи хостов. Открытый ключ RSA выглядит примерно так: $ cat ssh__host_rsa_key.pub ssh-rsa AAAAB3NzaClyc2EAAAABIwAMIEA5pSqNmtqRzK2JaLr8qkI(HlnBDLI2JRJ6gRBnMg9gwK3S8xX nMUHIsu8wh5Sloe18hs47x2I9cpNpxHfjlvX)WwqP6lVyel0fD+y+WIz0UgzUXN5IrqYZ70EdQ4Xn ++Лlkn»FG6Ll6KySb0700XonlC09rNx1sHL5QC0q1l+qM- root&rindbag Сам ключ должен быть одной длинной, неразрывной строкой — он не должен содержать внутренних разрывов. Скопируйте его на съемный диск, перенесите в локальный файл -V-s^/known_hosts и измените следующим образом: windbag.test.net.192.168.1.6 ssh-rsa AAAAB3NzaClyc2EAAAABIwAAAIEASpSqNratqRzK2JaLr8qkIQ41nBDLI2JRJ6gRBrtwg9gwK3S8xX nMUHIsu8wh5Sloei8hs47x2I9cpNpxHfjl^ ++л ikmFG6Ll 6KySb0700Xonl CG9rNxi sHL5QC0qi 1+qM- Имя хоста н IP-адрес добавляются в начало строки, а завершающее имя хоста удаляется. Открытые ключи доступны для всех, но закрытые ключи должны читаться только владельцем ключа. См. также ssh(l). 17.3. Построение новых ключей хостов Проблема Вы заглянули в каталог/etc/ssh, но не нашли там файлов с ключами: дистрибутив Linux не сгенерировал их при установке OpenSSH. А может быть, вы просто хотите сгенерировать новые ключи самостоятельно. Решение Сгенерируйте новую пару ключей программой ssh-keygen. Программа должна запускаться с правами root и с указанием имени новой пары ключей. Всегда задавайте контрольную фразу (пароль): # ssh-keygen -t rsa -f /etc/ssh/s$h_host_rsa_key Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your Identification has been saved in /etc/ssh/sshJiost_rsa_key. Your public key has been saved in /etc/ssh/sshjiostjrsajcey.pub. The key fingerprint 1s: 6c:24:75:54:d3:21:17:c9:ll:db:41:dd:95:3f:d0:ac rootMndbag
278 Глава 17. Удаленный доступ В приведенном примере используются имена ключей по умолчанию, но вы можете назвать их как угодно. При использовании других имен не забудьте включить их в файл /etc/ssh/sshd_config: HostKey /etc/ssh/ssh_host_rsaJcey Закомментируйте или удалите записи несуществующих ключей. Комментарий О выборе сильных паролей говорилось в разделе «Введение» настоящей главы. После того как OpenSSH заработает, и открытые ключи будут распространены среди пользователей, не стоит изменять закрытые ключи без особо веских причин, потому что вам придется распространять открытые ключи заново. Если пользователь попытается подключиться со старым открытым ключом, он получит следующее сообщение: G WARNING: HOST IDENTIFICATION HAS CHANGED! $ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Are you sure you want to continue connecting? (yes/no) Проинструктируйте пользователей, чтобы они всегда отвечали по и ставили вас в известность о происходящем. См. также ssh(l), ssh_keygen(l). 17.4. Аутентификация с использованием открытых ключей Проблема Требуется проводить аутентификацию сеансов SSH с применением ключей (вместо системных учетных записей). Это позволит вам использовать пароль SSH вместо данных учетной записи, что повышает уровень защиты этих данных. Кроме того, одна пара ключей (открытый и закрытый) может использоваться для произвольного количества удаленных хостов. Решение В следующем примере пользователь Valorie хочет подключиться с компьютера saturn к компьютеру jupiter. Для этого он должен сгенерировать Hajupiter новую, персональную пару ключей утилитой sshjceygen, а затем передать копию своего нового открытого ключа на saturn. Следующая команда генерирует новую пару ключей RSA, защищенную паролем: valorie@jupiter:~$ ssh-keygen -t rsa Generating public/private rsa key pair.
17.4. Аутентификация с использованием открытых ключей 279 Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/valorie/.ssh/1d_rsa. Your public key has been saved in /home/valorie/.ssh/idrsa.pub. The key fingerprint is: 79:lf:a5:5f:5f:17:e5:a8:bc:02:50:8c:3a:le:el:dl valorieGjupiter Далее пользователь Valorie копирует новый ключ idjrsa.pub в свою учетную запись на компьютере saturn. Поскольку данные в файл authorized_keys на saturn заносятся впервые, для копирования можно воспользоваться командой scp: valorie©jupiter:~$ scp -7.ssh/idjrsa.pub valor1e@saturn:.ssh/authorized_keys Теперь при входе на saturn пользователю Valorie будет предложено ввести пароль закрытого ключа SSH)K va1orie(&jupiter:~$ ssh saturn Enter passphrase for key 'home/valor1e/.ssh/id_rsa': Linux saturn 2.4.21 #1 Sun Aug 3 20:15:59 PDT 2003 1686 GNU/Linux Libranet GNU/Linux va")orie@saturn:-$ Сеанс завершается командой exit Комментарий OpenSSH использует ключи RSA и DSA. Оба вида ключей поддерживают SSH2, поэтому неважно, какой из них будет выбран. По умолчанию используются RSA. Копирование ключа в файл authorized_keys на удаленном компьютере также может осуществляться простым копированием/вставкой. Откройте нормальный сеанс SSH: $ ssh va1orie@saturn Password: Затем запустите текстовый редактор на обоих концах подключения и выполните копирование/вставку. Это можно проделать для любой учетной записи на доступном сервере SSH. Одной пары ключей должно быть достаточно; открытый ключ можно скопировать на любое количество хостов и использовать один и тот же пароль на всех хостах. Следите за тем, с каким компьютером вы работаете! Легко ввести команду, полагая, что вы находитесь на локальном хосте, тогда как на самом деле вы подключены к удаленному компьютеру. Защищайте ключи! Открытые ключи должны быть общедоступными для чтения, но запись в них должна разрешаться только владельцу (режим 644). Закрытые ключи должны быть недоступны по чтению/записи для всех, кроме их владельца (режим 600). Никогда, ни при каких условиях не передавайте закрытые ключи другим пользователям. Помните, что некоторые текстовые редакторы автоматически создают резервные копии файлов. Либо отключите этот режим, либо немедленно удаляйте резервные копии ключей и других конфиденциальных файлов SSH. См. также ssh(l).
280 Глава 17. Удаленный доступ 17.5. Использование нескольких пар ключей Проблема Требуется сгенерировать отдельные ключи для обращения к разным хостам или разным типам учетных записей. Например, вы хотите, чтобы один ключ SSH применялся для администрирования сервера FTP, а другой — для обращения к вашим личным учетным записям. Решение Утилита ssh_keygen позволяет задать парам ключей любые имена по вашему усмотрению. К имени открытого ключа автоматически присоединяется суффикс .pub. Всегда указывайте пароль! akkana@windbag:$ ssh-keygen -t rsa -f /home/akkana/.ssh/ftp_key Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/akkana/.ssh/ftpkey. Your public key has been saved in /home/akkana/.ssh/ftpkey.pub. The key fingerprint is: 95:d2:12:55:66:ba:ec:a8:5c:40:4b:le:03:2b:6c:ea akkanaft/indbag akkana(&indbag:~$ При создании пары ключей с пользовательскими именами имя закрытого ключа вводится в файле ~/.ssh/ssh_config. Если файл не существует, создайте его и введите строку вида IdentityFile ~/.ssh/ftp_key Комментарий В каталоге/etc/ssh должна находиться копия стандартного файла ssh_config. При внесении изменений проще всего добавить новые параметры в конец файла. Файл ssh_config предназначен для хранения как данных конфигурации конкретного пользователя, так и клиентских настроек общесистемного уровня. Копия файла в домашнем каталоге пользователя задает параметры, относящиеся к конкретному пользователю. См. также ssh(l), ssh_config(5). 17.6. Вход без пароля с использованием ssh-agent Проблема Вводить пароли утомительно, особенно если они состоят из нескольких слов. Требуется использовать OpenSSH для открытия подключений без ввода пароля (но при этом сохранить защиту подключения).
17.6. Вход без пароля с использованием ssh-agent 281 Решение Начните с настройки открытого и закрытого ключей (см. раздел 17.3), а затем воспользуйтесь ssh-agent. Эта программа обрабатывает запросы на аутентификацию при подключении к различным системам через SSH. Пароль вводится только один раз, в начале сеанса SSH; после выхода из сеанса его придется вводить заново. Ssh-agent не позволит запланировать пересылку данных через SSH из сгоп — о том, как это делается, рассказано в разделе 17.8. Прежде всего запустите ssh-agent с указанием используемого командного процессора: $ ssh-agent bash После появления стандартного приглашения запустите утилиту ssh-add, которая загружает все ключи из каталога ~/.ssh: $ ssh-add Enter passphrase for /horoe/jenn/.ssh/id_rsa: Identity added: /horoe/jenn/.ssh/idjrsa (/home/jenn/.ssh/idrsa) Enter passphrase for /home/jenn/.ssh/apachekey: Identity added: /home/jenn/.ssh/id_rsa (/home/jenn/.ssh/apachekey) В дальнейшем вы сможете войти на любой хост SSH без ввода пароля: jenn@windbag:$ ssh powerpc Linux powerpc 2.4.21 #1 Sun Aug 3 20:15:59 PDT 2003 1686 GNU/Linux Libranet GNU/Linux Last Login: Web Feb 7 18:28:20 2004 from windbag.test.net jem#powerpc:-$ Чтобы завершить работу ssh-agent, просто выйдите из командного процессора ssh-agent: $ exit Комментарий Поскольку пароли и ключи ассоциируются с конкретным процессом Bash, при выходе из командного процессора ssh-agent они пропадают. Если запустить второй командный процессор для запуска другой копии ssh-agent, пароль придется вводить заново, даже если первый процесс остается активным. Чтобы узнать, какие ключи использует ssh-agent, введите команду $ ssh-add -1 1024 65:91:77:71:24:66:46:ea:cb:00:fe:83:ad:b8:4a:34 /home/jenn/.ssh/id_rsa (RSA) 1024 da:f7:27:6a:37:4e:a5:bb:ld:00:c7:a8:e9:fe:23:d8 /home/jenn/.ssh/apachejcey (RSA) Чтобы команда сработала, необходимо вернуться к локальному командному процессору ssh-agent и не быть подключенным к удаленному хосту. При подключении работой терминала управляет удаленный хост, и вы получите сообщение об ошибке «Could not open a connection to your authentication agent». Команда ssh-add позволяет загружать конкретные ключи: $ ssh-add /home/jenn/adminkeys/id_rsaJittp и удалять ключи из активного сеанса ssh-agent (при этом ключ не удаляется из системы): $ ssh-add -d /home/jenn/.ssh/id_dsa Identity removed: /home/jenn/.ssh/idjisa (/home/jenn/.ssh/id_dsa.pub)
282 Глава 17. Удаленный доступ Следующая команда удаляет все ключи: $ ssh-add -О All identities removed. См. также Ssh(l), ssh-add(l), ssh-agent(l). 17.7. Вход без пароля с использованием keychain Проблема Программа ssh-agent неплоха, но пользователю приходится вводить пароль при каждом открытии нового командного процессора. С выходом вся введенная информация теряется. Кроме того, ssh-agent не позволяет использовать беспарольную пересылку данных SSH с сгоп. Решение Используйте программу keychain, которая сохраняет пароли SSH на общесистемном уровне вплоть до перезагрузки. Keychain также работает совместно с сгоп. Загрузите и установите keychain из обычных источников в формате RPM, .deb или в виде исходных текстов. Затем отредактируйте локальный файл ~/bash_profile и добавьте следующие строки: keychain id dsa . -/.keychain/$HOSTNAME-sh Укажите фактическое имя закрытого ключа: idjrsa, my_own_groovyJ<ey и т. д. Обратите внимание на начальную точку во второй строке; она приказывает Bash прочитать файл, имя которого указано в этой строке. Вот и все. Теперь после входа на локальную рабочую станцию на экране появится запрос на ввод пароля от keychain. В дальнейшем keychain будет обеспечивать аутентификацию вплоть до перезагрузки системы. Комментарий В файле можно указать столько ключей, сколько вы собираетесь использовать: keychain id_d$a apachejcey ftpkey Для каждого ключа при входе в систему необходимо ввести пароль. Программа keychain будет обеспечивать аутентификацию в течение всего времени работы системы, даже при выходе и повторном входе пользователя в систему. После перезапуска системы пароли придется ввести заново. См. также ssh(l), ssh-add(l), ssh-agent(l), keychain(l).
17,9. Автоматическое завершение ssh-agent при выходе 283 17.8. Беспарольный вход для заданий сгоп Проблема Требуется запланировать архивацию или пересылку файлов через SSH с использованием сгоп. Как приказать сгоп использовать keychain для аутентификации на удаленных хостах? Решение Включите в сценарий сгоп ту же строку, которая использовалась в .bash_profile. Следующий простой сценарий архивирует домашний каталог пользователя при помощи rsync: #!/b1n/bash source /home/saz/.keychain/$HOSTNAME-sh rsync -a -e ssh •-delete --force rsync.test.net::home/saz/ /backups/saz Оформите его как задание сгоп, и архивация будет выполняться автоматически вплоть до следующей перезагрузки. См. также ssh(l), keychain(l); глава 16. 17.9. Автоматическое завершение ssh-agent при выходе Проблема Все существующие процессы ssh-agent должны автоматически «убиваться» при выходе из системы (для повышения безопасности). Решение Включите следующую запись в файл ~/-bash_logout: kill SSSH_AGENT_PID Комментарий Не делайте этого для программы keychain — ведь keychain использч. я прежде всего для того, чтобы при повторном входе в систему пользователю приходилось заново вводить пароли. Если на вашем компьютере нет файла ~/.bash_logout, создайте его. Возьмите за образец общесистемный файл /etc/skel/.bashJ.ogout. См. также bash(l),ssh-agent(l).
284 Глава 17. Удаленный доступ 17.10. Настройка приглашения Bash для ssh Проблема При подключении через SSH внешний вид приглашения изменяется, и в нем отображается имя удаленного хоста. Но черно-белое приглашение выглядит убого, а вам хочется иметь собственное многоцветное приглашение, которые бы вдобавок указывало на наличие активного подключения SSH. Решение Настройте приглашение Bash на удаленном компьютере. В следующем примере приглашение выводится красным цветом и к нему добавляется суффикс ssh. Включите следующий фрагмент в файл -./bashrc удаленной учетной записи, которая будет использоваться для подключения: 1f -n "$SSH_CLIENT ]; then text-* ssh" f1 export PSl-'NCNeLOiairoXlVu^htXwS^ex^SXCXeCrnV] • Теперь при подключении приглашение будет выглядеть так (и отображаться красным цветом): carla@server06:~ssh $ Красным будет только приглашение; прочий текст выводится обычным цветом. Комментарий Настройка приглашения Bash могла бы стать темой для отдельной книги. Вы можете легко изменить представленный пример по своему усмотрению. Вы не обязаны использовать суффикс «ssh» или называть переменную «text». Код [\е[0;31т\] определяет цвет текста. Настройка основана на проверке переменной среды SSH_CUENT. Если переменная определена, Bash понимает, что вместо стандартного приглашения следует использовать специальное приглашение SSH. См. также bash(l); The Bash Prompt Howto (http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/ index.html). 17.11. Туннелирование Х через SSH Проблема Вам хотелось бы работать с удаленными сеансами X, но вы знаете, что они совершенно не защищены. Из-за этого данные X требуется пересылать через SSH.
17.12. Подключение с компьютера с системой Windows 285 Решение Настройте и запустите SSH так, как было описано в предыдущих разделах, затем включите пересылку X на сервере SSH в файле/etc/ssh/sshd-config. Укажите ключ -X при запуске сеанса SSH. В файл /etc/ssh/sshd-config на сервере SSH включается строка XllForwarding yes При подключении к серверу используется ключ -X: $ ssh -X saturn.test.net Следующая команда проверяет, что пересылка X работает: $ echo SDISPLAY local host:10.0 Если пересылка не работает, команда вернет пустую строку. А любую программу X, установленную на сервере, можно запустить так, словно она является локальной. Комментарий Запуск удаленных сеансов X через SSH проще и надежнее, чем запуск «обычных» сеансов X без SSH, в которых защита данных вообще отсутствует. Тем не менее некоторый риск все же присутствует» Используйте этот способ для подключения только к доверенным хостам, потому что любопытный администратор может легко перехватить нажатия клавиш или входные данные или даже подключиться к вашему локальному рабочему столу и продолжить исследования. Проследите за тем, чтобы для локального файла -/«^authority был установлен режим 600; по крайней мере вы будете избавлены от любопытства со стороны непривилегированных пользователей удаленного хоста. Убедитесь, что следующие записи присутствуют в локальном файле/etc/ssh/ ssh_config и во всех файлах ~/ssh/ssh_config вашей системы: Host * ForwardXll no ForwardAgent no В зависимости от физического расстояния от удаленного сервера и скорости канала возможны задержки с реакцией на нажатия клавиш или перемещения мыши. См. также ssh(l). 17.12. Подключение с компьютера с системой Windows Проблема SSH в Linux — отличная штука, но вы хотите подключиться к Linux PC из системы Windows. Можно ли использовать OpenSSH на компьютере с системой Windows?
286 Глава 17. Удаленный доступ Решение Это можно сделать несколькими способами. Мы рассмотрим два из них: Cygwin и PuTTY. В разделе 16.12 подробно описан процесс установки и запуска пакета Cygwin, создающего на компьютере Windows Linux-среду. Вы сможете запустить OpenSSH из Windows точно так же, как в системе Linux (как в качестве сервера, так и в качестве клиента). Более того, возможен даже запуск сеанса X через SSH. PuTTY — бесплатный клиент SSH для Windows. Программа не содержит серверный компонент. Работать с PuTTY предельно просто — загрузите и установите программу, запустите ее двойным щелчком, введите имя хоста, к которому нужно подключиться, и щелкните на кнопке Open. На рис. 17.1 изображено главное окно PuTTY. ; ■ Hozi Name [oi IP addei$3> ■; ,j]$tinkpuc| Рл^осЫ; Г RW Г rehet £# n#|*e of f* Rlogrr fPadcfrtt**-. ■ •■■■■ ]22 \lfM Load save 6r deJete г ■- ■■ f< - -1 n пД- 'Г' Default Setting; Close window on exit 0' Always Г N*v ; [: f..:Орвгг^: . I :j Cancel ..■! Рис. 17.1. PuTTY Комментарий Если ваши потребности ограничиваются простым клиентом SSH, используйте PuTTY — это самый простой и быстрый вариант. Файл putty.exe легко помещается на дискету для проведения «мобильных сеансов SSH». См. также Домашняя страница PuTTY (http://www.chiark.greenend.org.uk/-sgtatham/putty/ download.html); Cygwin (http://www.cygwin.com).
17.13. Назначение разрешений для файлов ssh 287 17.13. Назначение разрешений для файлов ssh Проблема Файлам и ключам SSH должны быть назначены правильные, самые безопасные разрешения доступа. Решение Для пользовательских учетных записей в каталоге ~/.ssh назначаются следующие разрешения: -/.ssh 700 ~/.ssh/id_dsa и другие закрытые ключи 400 ~/.ssh/id_dsa.pub и другие открытые ключи 644 ~/.ssh/ssh_config 644 ~/.ssh/known_hosts 644 ~/.ssh/authorizedJrosts 644 Разрешения для содержимого каталога /etc/ssh: /etc/ssh 755 /etc/ssh/s$hd_config 644 /etc/ssh/s$h_config 644 /etc/ssh/ssh_host_dsa_key и другие закрытые ключи 400 /etc/ssh/ssh_host_dsa_key.pub и другие открытые ключи 644 /etc/ssh/moduli 644 См. также ssh(l),ssh(8).
Глава 18 Управление версиями 18.1. Введение Для чего нужны системы управления версиями? Они позволяют эффективно отслеживать изменения в документах и хранить полную историю проекта. Даже спустя несколько месяцев вы можете легко вернуться к предыдущей конфигурации системы, состоянию программного блока или версии рукописи. Системы управления версиями полезны при работе с разными видами данных: исходными текстами программ, двоичными файлами, конфигурационными файлами, сценариями, статьями и книгами, индексами, складскими базами данных — словом, с любыми текстовыми документами. Поскольку система управления версиями отслеживает все вносимые изменения, вы можете легко вернуться к любой точке жизненного цикла определенного проекта. Система управления версиями выполнит всю работу — она не зависит от добросовестности пользователей, создающих и сохраняющих копии разных версий документа. Системы управления версиями помогают организовать совместную работу групп над общим проектом. Например, проект можно разбить на несколько ветвей, которые позднее будут объединены. Также возможно объединение нескольких версий файла, хотя следует помнить, что программа не понимает смысл содержимого файла и не способна разумно разрешать конфликты — она знает лишь то, что файлы различаются, поэтому объединение иногда требует человеческого участия. Существует немало бесплатных программ управления версий. Приведу список самых распространенных: О RCS (Revision Control System); О CVS (Concurrent Versions System); О Subversion; О GNU Arch; О Monotone. Некоторые коммерческие продукты: о BitKeeper; О Visual SourceSafe;
18.2. Построение локального репозитария RCS 289 О ОрепСМ; О CMSynergy; О Perforce; О ClearCase. Программы RCS и CVS существуют уже давно и получили самое широкое распространение. Они просты в настройке и использовании, а их давнее использование обеспечило тестирование в жестких условиях. Subversion, SNU Arch и Monotone обладают возможностями, отсутствующими в CVS: созданием распределенных репозитариев (в отличие от модели CVS с центральным сервером) и атомарными операциями закрепления изменений. При атомарном закреплении все изменения происходят одновременно. Изменения, вносимые пользователем в репозитарий, применяются как единое целое и становятся видимыми для других пользователей только после завершения. CVS вносит изменения на уровне отдельных файлов, поэтому если закрепление будет прервано из-за сбоя сети, оно будет внесено только частично. Несмотря на всю полезность атомарного режима, Subversion, GNU Arch и Monotone все же нельзя назвать зрелыми продуктами. GNU Arch и Subversion трудны в установке и настройке и не так легко осваиваются. В Monotone используется другая, весьма интересная архитектура — принципиальное отличие заключается в том, что файлы передаются по внедренному сегевому протоколу netsync вместо HTTP, NNTP или SMTP. Тем самым ликвидируются многие сложные этапы настройки, а каждая установка Monotone может выполнять функции как клиента, так и сервера. Дальновидный администратор может установить некоторые из этих продуктов на тестовых компьютерах, следить за их разработкой и постепенно привыкать к ним, потому что эти программы будут использоваться для управления версиями в будущем. BitKeeper — один из самых популярных коммерческих продуктов. В частности, он используется при разработке ядра Linux. Разработчики BitKeeper предлагают как 30-дневную пробную версию, так и усеченную бесплатную версию для личного использования. Несмотря на большое количество альтернатив, в этой главе основное внимание уделяется RCS и CVS, самым зрелым и широко используемым системам управления версиями. RCS является прикладной частью (backend) CVS, что упрощает освоение обеих программ. RCS идеально подходит для одного пользователя с простыми потребностями; CVS хорошо подойдет как для одного пользователя, так и для группы пользователей, работающих над сложными проектами. 18.2. Построение локального репозитария RCS Проблема Вы боитесь, что когда-нибудь отредактируете какой-нибудь файл, в системе что- нибудь сломается, а вы не будете помнить, как отменить изменения. Таким образом, вы хотите создать простой, локальный репозитарий для отслеживания изменений в программах, конфигурационных файлах, сценариях и других документах для
290 Глава 18. Управление версиями одного пользователя. Доступ к сети или многопользовательская поддержка не обязательны — нужна простая система для вашего личного пользования. Решение Установите RCS (Revision Control System) из пакетов RPM, .deb или исходных текстов, а затем создайте собственный репозитарий RCS. Сначала создайте рабочий каталог, затем подкаталог RCS: $ mkdir projecthome $ cd projecthome $ mkdir RCS Убедитесь в том, что в рабочем каталоге (projecthome) имеются файлы для экспериментов. Занесение файла в репозитарий выполняется следующей командой: terri@workstationl:-/projecthome* ci -u cupsd.conf RCS/cupsd.conf.v <•• cupsd.conf enter description, terminated with single *.* or end of file: NOT: This is NOT a log message! » LAN printer server, for windows and Unux. no samba », initial revision: 1.1 done Чтобы отредактировать файл, извлеките его из репозитария и откройте в своем любимом текстовом редакторе: terri@workstationl:~/projecthome$ со -1 cupsd.conf RCS/cupsd.conf.v ••> cupsd.conf revision 1.1 (locked) done terri@workstationl:-/projecthome$ kate cupsd.conf & После завершения редактирования сохраните и закройте файл, а затем занесите его в репозитарий так, как показано выше. Добавьте в журнал комментарий с описанием изменений: $ ci -u cupsd.conf RCS/cupsd.conf.v <•• cupsd.conf new revision: 1.2: previous revision: 1.1 enter log message, terminated with single '.' or end of file: » added administrative controls to prevent users from making changes to the server ». done Комментарий В простой системе управления версиями используются два каталога: в рабочем каталоге хранятся рабочие копии документов, а каталог RCS выполняет функции репозитария. Файлы в репозитарий снабжаются суффиксом ,v: $ Is RCS cupsd.conf.v В файле хранится информация о различных версиях отслеживаемого файла: $ less cupsd.conf.v head 1.3: access:
18.3. Выборка старых версий файлов в RCS 291 symbols; locks: strict; consent Ш 3: 1.3 date 2004.06.15.03.33.46: author terri; state Exp; branches: next 1.2; 1.2 date 2004.06.13.30.47; author terri; state Exp: branches: next 1.1: 1.1 date 2004.06.12.03.27.01: author terri: state Exp; branches: next ; desc PLAN printer server, for windows and Unux. no samba Помните, что файлы в рабочем каталоге представляют временные версии. Когда файл достигнет состояния, которое бы вы хотели зафиксировать, занесите его в ре- позитарий. Основные команды RCS: О ci -u — занести файл в репозитарий и снять блокировку; О со -I — извлечь файл из репозитария и заблокировать. Флаг -и при занесении файла в репозитарий защищает копию в рабочем каталоге. Файл в рабочем каталоге становится доступным только для чтения, что предотвращает случайные изменения и напоминает, что для редактирования файл необходимо извлечь из репозитария. Установление блокировки означает, что файл в любой момент времени может быть извлечен и отредактирован только одним человеком, поэтому RCS не подходит для проектов с большим количеством участников. Тем не менее система отлично подходит для малых проектов и отдельных пользователей и к тому же легко осваивается. См. также rcsintro(l), ci(l), co(l); домашняя страница RCS (http://www.cs.purdue.edu/homes/ trinkle/RCS). 18.3. Выборка старых версий файлов в RCS Проблема Беда все-таки произошла: вы изменили рецепт секретного соуса, ошиблись и не можете восстановить его в исходном виде. Но вы использовали RCS, и в репозитарий хранится несколько версий файла. Требуется вывести список всех версий, протокол изменений и даты последней модификации. Определив, какая версия вам нужна, извлеките старую версию из репозитария.
292 Глава 18. Управление версиями Решение В репозитарии накопилось несколько версий файла. Чтобы просмотреть весь протокол изменений по конкретному файлу, воспользуйтесь командой rlog: $ rlog cupsd.conf RCS file: RCS/cupsd.conf,v Working file: cupsd.conf head: 1.2 branch: locks:strict access list: symbolic names: keyword substitution: kv total revision: 2: selected revisions: 2 description: LAN printer server, for windows and Hnux. no samba revision 1.3 date: 2004/07/31 03:33:46: author: terri: state: Exp: lines: +1 -1 corrected error in Allow directive revision 1.2 date: 2004/07/27 05:29:27: author: terri: state: Exp: lines: +2 -0 added administrative controls to prevent users from making changes to the server revision 1.1 date: 2004/07/27 05:19:25; author: terri: state: Exp: Initial revision Вероятно, вы уже поняли, почему так важно писать содержательные комментарии. Для извлечения конкретной версии документа следует указать ее номер: $ со -1 -г1.1 cupsd.conf ВНИМАНИЕ Извлечение файла из репозитария приводит к стиранию рабочей копии файла (projecthome/ cupsd.conf в данном примере). Чтобы этого не произошло, начните с занесения рабочей копии в репозитарии RCS. Чтобы быстро вывести файл без его извлечения и открытия в редакторе, используйте ключ -р: $ со -р -rl.5 cupsd.conf Комментарий Если репозитарии содержит несколько версий файла и при извлечении не указывался номер версии, по умолчанию будет извлечена самая последняя версия. Вы можете просмотреть свои файлы в каталоге RCS и даже открыть их в текстовом редакторе, чтобы узнать, что с ними делает RCS. Даже если в репозитарии будет сохранено несколько десятков версий одного файла, вся история изменений все равно будет представлена одним файлом. RCS изменяет только содержимое одного файла и не создает отдельных копий для каждого изменения.
18.4. Сравнение версий файла в RCS 293 RCS избавляет вас от лишних хлопот. Вам не нужно тратить усилия и вспоминать, что происходило с файлом, потому что RCS отслеживает все изменения за вас. См. также rcsintro(l), ci(l), co(l), rlog(l); домашняя страница RCS (http://www.cs.purdue.edu/ homes/trinkle/RCS). 18.4. Сравнение версий файла в RCS Проблема Текущая версия конфигурационного файла работает не так, как вы хотели, или текстовый документ не содержит нужных данных. Вы уверены, что со старой версией все было в порядке. Таким образом, нужно сравнить новую версию со старыми версиями и узнать, в какой момент вы сбились с пути. Решение Воспользуйтесь командой rcsdiff. Команда сравнивает две версии файла: $ rcsdiff -rl.l -rl.2 cupsd.conf Проследите, чтобы после ключей -г не было пробелов. Следующая команда сравнивает рабочий файл с указанной версией: $ rcsdiff -rl.2 cupsd.conf Сравнение текущего рабочего файла с последней версией: $ rcsdiff cupsd.conf Используйте эту команду для просмотра внесенных изменений после редактирования файла, но до его занесения в репозитарий. Комментарий Если выходные данные rcsdiff окажутся слишком длинными, направьте их в файл для удобства просмотра: $ rcsdiff -rl.l -rl.2 cupsd.conf > cupsdiff.txt Пример вывода rcsdiff: $ rcsdiff -rl.l -rl.3 cupsd.conf RCS file: RCS/cupsd.conf.v retrieving revision 1.1 retrieving revision 1.3 dlff -rl.l -rl.3 9c9.17 < BrowseAddress 192.168.1.255 \ No newline at end offile > BrowseAddress 192.168.1.255 >
294 Глава 18. Управление версиями > <Location /admin> > AuthType Basic > AuthClass System > Allow From 127.0.0.1 > Order Deny.Allow > Deny From All > </Location> Сверху указано, какие версии файлов сравниваются. < — префикс строки, уникальной для первого файла. > — префикс строки, уникальной для второго файла. \ — префикс комментариев от RCS. См. также rcsdiff(l); домашняя страница RCS (http://www.cs.purdue.edu/homes/trinkle/RCS). 18.5. Управление системными конфигурационными файлами в RCS Проблема Требуется сохранять все версии системных конфигурационных файлов, чтобы легко вернуться к более ранней конфигурации. Решение Возникает соблазн скопировать все содержимое /etc в репозитарий RCS, но это не нужно и расточительно. Заархивируйте /etc обычным способом, а затем используйте RCS для сохранения только изменяемых файлов. Начните с занесения в репозитарий всех файлов, которые вы собираетесь редактировать. Извлекайте их, чтобы вносить изменения, а затем возвращайте обратно после завершения правки. После занесения в репозитарий скопируйте рабочий файл на его положенное место в /etc. После этого у вас появится полная история изменений всех конфигурационных файлов, подвергавшихся правке. Комментарий В следующем примере создается репозитарий RCS для двух программ Amavisd- new и Clam Anti-Virus. Каждая программа имеет собственный подкаталог в репозитарий. Все команды должны выполняться с правами root. # mkdir /rcs_configs # cd /rcs_configs # mkdir -p amavis/RCS # mkdir -c clamav/RCS # cd /amavis # cp /etc/amavis/amavisd.conf amavisd.conf
18.5. Управление системными конфигурационными файлами в RCS 295 # ci -1 amavisd.conf RCS/amavisd.conf,v <•• amavisd.conf enter description, terminated with single V or end of file: NOTE: This 1s NOT the log message! » original amavis config. used with clamav and postfix » initial revision: 1.1 done # со -1 amavisd.conf # vim amavisd.conf Внесите изменения, сохраните и закройте файл, а затем снова занесите его в репозитарий: # ci -u amavisd.conf Скопируйте свой рабочий файл в /etc: # ср amavisd.conf /etc/amavisd/amavisd.conf Исходная копия и первая измененная версия надежно сохранены, и все готово к сохранению других версий. Вместо того чтобы создавать подкаталоги для каждой программы, все данные можно хранить в одном каталоге. Вы сами выбираете способ организации файлов. При использовании RCS легко запутаться и заблокировать файлы при занесении в репозитарий (вместо извлечения) или извлечь файл и забыть занести его обратно. Если вы допустите подобную ошибку, то при следующей попытке извлечения файла будет получено следующее сообщение: # со -1 amavisd.conf RCS/amavisd.conf,v ••> amavisd.conf со: RCS/amavisd.conf.v: multiple revisions locked by carla: please specify one При указании конкретной версии вы все равно получите предупреждение: # со -1 -П.4 amavisd.conf RCS/aroavisd.conf.v --> amavisd.conf revision 1.4 (locked) writable amavisd.conf exists: remove it? [ny](n): у со: RCS/amavisd.conf.v: warning: You now have 2 locks, done Самый простой выход заключается в том, чтобы открыть файл RCS (в данном примере RCS/amavisd.conf,v) и отредактировать его напрямую. Для этого сначала нужно разрешить запись в файл: # chmod 644 amavisd.conf,v Затем отредактируйте заголовок. Найдите следующий фрагмент: head 1.4: access: symbols: locks carl a:1.1 carla:1.2; strict: comment @$ @; Удалите блокировки из секции locks. Фрагмент должен выглядеть так: head 1.4: access: symbols;
296 Глава 18. Управление версиями locks;strict: comment @$ @: Сохраните и закройте файл. Не забудьте вернуть его в режим «только для чтения»: # chmod 444 amavisd.conf.v См. также rcsintro(l), ci(l), со(1); домашняя страница RCS (http://www.cs.purdue.edu/homes/ trinkle/RCS). 18.6. Использование CVS для создания однопользовательских локальных репозитариев Проблема Вы бы предпочли создать свой личный, локальный репозитарий на базе CVS, потому что вы собираетесь использовать CVS в крупном проекте и хотите привыкнуть к этой системе. А может быть, ваш личный репозитарий становится слишком сложным, и вы хотите использовать дополнительные возможности CVS, включая поддержку более сложной структуры каталогов и возможность одновременного извлечения нескольких файлов или целых каталогов. Решение CVS легко масштабируется от хранения персональных данных до больших проектов. Процесс установки прост. Пакеты (как RPM, так и .deb) называются «cvs»; если вы предпочитаете собрать программу по исходным текстам, загрузите их с сайта https://www.cvshome.org/. После установки CVS создайте свой личный репозитарий следующими командами: $ mkdir -/cvsroot $ chmod -R 700 -/cvsroot $ cvs -d -/cvsroot init Теперь выберите каталог с файлами, которые должны храниться в репозитарий. Перейдите в этот каталог и импортируйте его в репозитарий: $ cd /scripts $ cvs -d -/cvsroot import scripts jenns_configs versionl N scripts/useradd.txt N scripts/postfix_ube.txt N scripts/logparse.pl No conflicts created by this Import В процессе импорта запускается текстовый редактор но умолчанию со следующим текстом: CVS: CVS: Enter log. Lines beginning with 'CVS:' are removed automatically
18.6, Использование CVS для создания однопользовательских репозитариев 297 CVS: CVS: Введите описание проекта. Описание должно быть достаточно подробным, чтобы даже через полгода вы вспомнили, о чем идет речь. Чтобы извлечь файл для редактирования, необходимо сначала создать рабочий каталог, находящийся за пределами каталога с релозитарием CVS. Перейдите в рабочий каталог и извлеките файл: $ mkdir -/sandbox $ cd -/sandbox $ cvs -d -/cvsroot checkout scripts/postfix_ube.txt cvs checkout: Updating scripts U scripts/postfixjjbe.txt При извлечении файлов из репозитария CVS в рабочем каталоге создается локальный рабочий каталог, в котором выполняется вся непосредственная работа (так называемая «песочница»). При извлечении файлов из CVS в «песочнице» создается набор административных файлов CVS. Всегда работайте в «песочнице»; никогда не входите в репозитарий CVS для непосредственного редактирования файлов. Имя «песочницы» выбирается произвольно. В нашем примере извлеченный файл находится в каталоге scripts, который и является «песочницей». Перейдите в этот каталог, чтобы отредактировать файл: $ cd scripts $ vim postfix_ube.txt Завершив редактирование файла, сохраните его обычным способом и верните в репозитарий CVS подкомандой commit: $ cvs commit cvs commit: Examining . /honte/jenn/cvsroot/scripts/postfix_ube.txt.v <-- postfix_ube.txt new revision: 1,2: previous revision: 1.1 Как и ранее, при этом запускается редактор по умолчанию, в котором вводится запись журнала с описанием изменений. Если вы находитесь в «песочнице» (-/sandbox/scripts в нашем примере), при выполнении операций извлечения и занесения файлов имя репозитария можно не указывать. Комментарий Синтаксис команд CVS: cvs [глобальныепаранетры] команда [ключиконанды] [аргументыкоманды] Не жалейте времени на ввод записей журнала — вы еще не раз похвалите себя за это во время работы над проектом CVS. Имя корневого каталога CVS выбирается произвольно. Аргументы jenns_config и version JL определяют метку поставщика и номер версии соответственно. Возможно, вам эти аргументы не понадобятся, но они нужны для нормальной работы CVS. Метка поставщика обычно указывает, от кого были получены исходные файлы, а второй аргумент задает начальный номер версии проекта.
298 Глава 18. Управление версиями Один каталог со всеми файлами и подкаталогами называется проектом. Каждый проект должен храниться в отдельном каталоге, даже если он состоит из одного файла. Из репозитария можно извлекать отдельные файлы, группы файлов и целые каталоги: $ cvs checkout scripts/postfix_ube.txt $ cvs checkout scripts/postfix_ube.txt scripts/logparse.pl $ cvs checkout scripts В отличие от RCS при извлечении файлов в СVS не устанавливается блокировка, предотвращающая одновременный доступ к ним со стороны других пользователей. См. также Локальная документация (/usr/share/doc/cvs/htmMnfo/cvsJL.html); домашняя страница CVS (https://www.cvshome.org/). 18.7. Включение новых файлов в репозитарий CVS Проблема Вы создали новый файл. Теперь его нужно поместить в репозитарий CVS. Решение Выполните следующие команды из рабочего каталога («песочницы»). В данном примере новый файл называется newfile и располагается в «песочнице»: $ cvs update cvs update: Updating . ? newfile $ cvs add newfile cvs -d /home/jenn/cvsroot add newfile cvs add: scheduling file 'newfile' for addition cvs add: use *cvs commit' to add this file permanently $ cvs commit -m 'simple Ethereal filter for monitoring HTTPS traffic' newfile /home/jenn/cvsroot/scripts/newfile.v <•• newfile initial revision: 1.1 Комментарий При выполнении команды update вопросительным знаком отмечаются файлы, которые еще не были занесены в репозитарий CVS. Команда update синхронизирует изменения по направлению из репозитария в «песочницу» (а не наоборот!). Чтобы просмотреть список изменений без модификации «песочницы», используйте команду status: $ cvs status Команда commit -m показывает, как создать запись в журнале для одного файла из командной строки, без запуска текстового редактора.
18.8. Удаление файлов из репозитария CVS 299 Когда файл перейдет в такое состояние, которое вы захотите сохранить, занесите его в репозитарий. Не оставляйте файл лежать в «песочнице». В начале работы следует прежде всего обновить локальные копии командой update. Даже если вы являетесь единственным пользователем репозитария, «песочницу» все равно стоит синхронизировать с репозитарием, а в многопользовательских репозитариях синхронизация особенно важна — мелкие конфликты разрешаются гораздо проще, чем крупные, а при синхронизации конфликты возникают реже. См. также А. 18 update — Bring work tree in sync with repository (/usr/share/doc/cvs/html-info/ cvs_16.html); домашняя страница CVS (https://www.cvshome.org). 18.8. Удаление файлов из репозитария CVS Проблема Требуется удалить некоторые файлы из репозитария CVS. Решение Удалите файлы из «песочницы», затем выполните команду cvs remove: $ rm badfile $ cvs remove badfile cvs remove: scheduling 'badfile' for removal cvs remove: use 'cvs'commit' to remove this file permanently При следующем выполнении команды commit файл будет перемещен в специальный подкаталог с именем Attic. Тем самым сохраняется полная история всех операций с файлами и обеспечивается возможность восстановления файла, если позднее вы измените свое решение. Удаление файла из «песочницы» и репозитария можно выполнить одной командой: $ cvs remove -f badfile Комментарий Вы не сможете удалить каталоги так, как удаляются файлы. Ключ -Р в командах update и checkout предотвращает копирование пустых каталогов в «песочницу». Как правило, этот режим включается по умолчанию в ~/cvsrc (см. раздел 18.15). CVS никогда ничего не удаляет полностью. Более того, программа и не должна этого делать. Главной целью системы управления версиями является поддержание полной истории проекта. См. также Раздел 18.15; домашняя страница CVS (https://www.cvshome.org).
300 Глава 18. Управление версиями 18.9. Создание общего репозитария CVS Проблема CVS хорошо подходит для отслеживания персональных файлов, но в реальном мире над проектами обычно одновременно работает много людей. Как создать ре- позитарий CVS, совместно используемый группой пользователей? Решение Сначала создайте владельца и группу, которым будет принадлежать репозитарий. Затем создайте сам репозитарий: # groupadd cvsusers # useradd -g cvsusers -u 105 cvs # mkdir /cvsroot # chown -R cvs /cvsroot # chmod -R 770 /cvsroot # cvs -d /cvsroot init # chgrp cvsusers /cvsroot # chmod g+s /cvsroot Чтобы предоставить пользователям доступ к репозитарию, включите их в группу cvsusers. Любой пользователь из группы cvsusers сможет импортировать проект в репозитарий. В следующем примере в репозитарий включается проект techbook: $ cd /techbook $ cvs -d /cvsroot import techbook cupsjwvrto versionjl Владельцами нового проекта является пользователь, который его импортировал, и группа cvsusers: $ stat /cvsroot/techbook File: 'techbook' Size: 136 Blocks: 1 10 Block: 4096 directory Device: 306h/774d Inode: 69624 Links: 2 Access: (2775/drwxrwsr-x) Uid: ( 1000/ carla) Gid: (1005/cvsusers) Комментарий Команды, приведенные в предыдущем подразделе, должны выполняться на сервере CVS. О работе с временным каталогом рассказано в разделе 18.11. Очень важно соблюдать приведенную последовательность команд для правильного назначения полномочий. Команда cvs init создает набор административных файлов с собственными разрешениями, которые не следует изменять (вы можете просмотреть их в подкаталоге CVSROOT). При создании системного пользователя (демона) не забудьте назначить соответствующий код UID (см. раздел 8.2).
18.10. Совместное использование репозитария группами пользователей 301 Задайте всем пользователям маску umask равную 007, чтобы устранить какой- либо внешний доступ к файлам в репозитарий CVS. Для этого достаточно включить следующую строку в файл -/«bashrc каждого пользователя: umask 007 Установка бита закрепления ограничивает возможность переименования или удаления файла и позволяет выполнять эти операции только владельцу, группе или суперпользователю. См. также Локальная документация (/usr/share/doc/cvs/html-info/cvs-2.html); домашняя страница CVS (https://www.cvshome.org). 18.10. Совместное использование репозитария группами пользователей Проблема Имеется несколько рабочих групп, каждой из которых нужен собственный репозитарий CVS. Вы хотите разместить эти репозитарий внутри одного главного репозитария, чтобы упростить архивацию и административные операции. Требуется настроить файловые разрешения таким образом, чтобы пользователи не могли работать с чужими репозитариями. Решение Последуйте рекомендациям из раздела 18.9 и создайте новый подкаталог для каждого отдельного репозитария. Задайте разрешения владельца и группы для отдельных репозитариев: # cd /3dgame # cvs -d /cvsroot import 3dgame best_game_ever version_l # chown gamersigamegroup /cvsroot/3dgame Комментарий Для каждого проекта можно создать отдельный репозитарий или же разместить все в одном корневом репозитарий CVS. Единый корневой репозитарий CVS упрощает архивацию, а наличие нескольких отдельных репозитариев упрощает настройку разрешений. См. также Раздел 18.15; домашняя страница CVS (https://www.cvshome.org).
302 Глава 18. Управление версиями 18.11. Обращение к удаленному репозитарию CVS Проблема Сервер CVS настроен и готов к работе. Как защитить удаленный доступ к нему со стороны пользователей? Решение Используйте OpenSSH — самый простой и защищенный метод доступа к репозита- риям CVS как по локальной сети, так и по Интернету. Если правильно настроить OpenSSH с самого начала, то для обеспечения всего удаленного доступа будет достаточно одного подключения и метода аутентификации (настройка OpenSSH рассматривается в главе 17). Подключение через SSH настраивается следующим образом: 1. Установите и настройте OpenSSH на всех хостах (на сервере CVS и на всех хостах, которые к нему будут подключаться). 2. Запустите OpenSSH на сервере CVS в режиме демона. 3. Убедитесь в том, что у всех пользователей имеются учетные записи на сервере CVS. 4. Настройте ключи и протестируйте подключения SSH к серверу. 5. На компьютерах пользователей включите следующую строку в файлы -/.cvsrc (при необходимости создайте эти файлы): CVS_RSH SSH Допустим, удаленный сервер CVS находится на хосте cvs.project.net Подключение к репозитарию из родительского каталога локальной «песочницы» осуществляется так: $ cvs -d :ext:jenn@cvs.project.net:/cvsroot checkout scripts jenn@cvs.project.net's password: Если сервер CVS находится в локальной сети, достаточно указать имя или IP-адрес хоста: $ cvs -d :ext:jenn@cvs:/cvsroot checkout scripts Комментарий OpenSSH поддерживает разные способы подключения к удаленным хостам. Вы можете использовать учетные записи или (что проще) проводить аутентификацию при помощи парных ключей (открытого и закрытого). Программа keychain обеспечит удобную и безопасную аутентификацию с использованием ключей, так что вам не придется вводить пароль (см. раздел 17.7). OpenSSH шифрует весь обмен данными — как при подключении, так и при пересылке данных. Механизм подключения легко реализуется, а использование одного механизма для доступа как к локальной сети, так и к Интернету упрощает администрирование сервера CVS.
18.12. Обновление рабочих файлов в CVS 303 См. также Раздел 17.7; домашняя страница CVS (https://www.cvshome.org). 18.12. Обновление рабочих файлов в CVS Проблема Вы работаете над общим проектом и хотите быть уверены в том, что первое извлечение файлов из репозитария обновляет все содержимое «песочницы» с учетом изменений, внесенных другими пользователями. Решение В начале дня выполните из «песочницы» команду update с ключом -n (Not really): $ cvs -n update -dP cvs update: Updating cvs update: Updating CVSROOT cvs update: Updating project M project/oldfHe ? project/oldf Пе Команда показывает, какие файлы различаются, и выводит информацию о состоянии каждого файла. Чтобы синхронизировать «песочницу» с репозитарием, выполните команду заново без ключа -п. Команда выполнит слияние (или попытается выполнить) двух наборов файлов. Для получения расширенной информации выполните следующую команду: $ cvs diff Команда выводит построчную информацию об изменениях. Комментарий Регулярное выполнение команды update обеспечивает синхронизацию локальных рабочих копий с копиями из репозитария. Если вас раздражают изменения со стороны других пользователей (что является ие недостатком CVS, а следствием плохого управления проектом), вы можете всегда сначала просмотреть их. Помните: когда в ходе редактирования файл достигает состояния, которое бы вам хотелось сохранить, занесите его в репозитарий. Не оставляйте его лежать в «песочнице» — система CVS существует как раз для того, чтобы хранить многие версии одного файла. Возможные состояния фарша: U — файл был успешно обновлен; А — файл был добавлен, но изменения не были закреплены; R — файл был удален, но изменения не были закреплены; М — файл в репозитарий отличался от копии в «песочнице», и изменения были успешно объединены; С — между копией в репозитарий и копией в «песочнице» существует конфликт, требующий вмешательства со стороны пользователя;
304 Глава 18. Управление версиями ? — файл находится в рабочем каталоге, но отсутствует в репозитарии, и CVS не знает, что с ним делать. Обычно это происходит при создании нового файла, еще не включенного в CVS. См. также Раздел 18.7; домашняя страница CVS (http://www.cvshome.org); раздел 18.8. 18.13. Выборка конкретных старых версий из CVS Проблема Требуется извлечь из репозитария конкретную старую версию файла: конфигурационный сценарий, к которому вы бы хотели вернуться, прежнюю версию программы и т. д. Решение Выполните из «песочницы» команду cvs log, чтобы получить список всех доступных версий файла. Затем восстановите нужную версию командой $ cvs update -г 1.1 newerfile U newerfile Команда загружает статическую, неизменяемую версию файла. Статическая метка (sticky tag) отображается в результатах команды cvs status; именно она помечает файл как статический и фиксирует его определенной версией: $ cvs status newerfile File: newerfile Status: Up-to-date Working revision: 1.1 Sun Aug 1 07:47:17 2003 Repository Revision: 1.1 /home/foober/cvsroot/project/newerfile.v Sticky tag: 1.1 Sticky Oate: (none) Sticky Options: -kkv На этой стадии файл может использоваться для различных целей: для сравнения, копирования фрагментов и т. д. Не пытаетесь редактировать его напрямую, поскольку это нарушит историю изменений. Если вы создадите копию прежней версии, из нее необходимо удалить статическую метку. Откройте копию в текстовом редакторе и измените «Sticky Tag: 1.1» на «Sticky Tag:(none)». После завершения правки закрепите изменения обычным способом: $ cvs commit См. также Домашняя страница CVS (http://www.cvshome.org).
18.14. Построение анонимного репозитария CVS 305 18.14. Построение анонимного репозитария CVS Проблема Требуется создать общедоступный репозитарий CVS, чтобы любой желающий мог загрузить хранящуюся в нем информацию, но при этом анонимным пользователям должен быть разрешен доступ только к подкаталогам, но не к вышестоящим каталогам; также им должно быть разрешено только чтение оглавления каталога и файлов в нем, но не запись. Решение Настройте CVS Pserver. Вам понадобится cvsd, рабочий сервер CVS и OpenSSH на сервере CVS в режиме демона. Программа cvsd — дополнение для запуска CVS в режиме Pserver — существует в тестовой версии для Debian, а также в виде tar-архива с исходными текстами. На момент написания книги единственные доступные пакеты RPM были слишком старыми (версия .6-2). Раздел написан для версии 1.0.2, так что если вам не удастся найти более новый пакет RPM, постройте программу по исходным текстам. Исходные тексты (а также файлы .deb) можно загрузить с домашней страницы cvsd (http://tiefighter.et.tude.nl/-arthur/cvsd). Установка по исходным текстам: $ ./configure --prefix=/usr --sysconfdir«/etc $ make # make install Создайте пользователя и группу cvsd: # groupadd cvsd # useradd -d /cvs/home -s /bin/false -c "cvs pserver daemon" -g cvsd -u 110 cvsd Затем создайте корневой каталог репозитария и «песочницу»1 (подкаталог пустого каталога): # mkdir /cvs # cd /cvs # cvsd-buildroot /cvs Назначьте их владельцами пользователя и группу cvsd и задайте разрешения: # chown -R cvsdicvsd /cvs # chmod 775 /cvs Инициализируйте новый репозитарий cvsd: # cvs -d /cvs/home init Внесите в /etc/cvsd/cvsd.conf следующие изменения: О UID-cvsd; О GID-cvsd; 1 chroot jail. — Примеч. ред.
306 Глава 18. Управление версиями О Umask-027; О RootJail — корневой каталог репозитария CVS (в нашем примере/cvs); О отредактируйте одну из записей Repos так, чтобы в ней был указан новый корневой каталог вашего репозитария (/home). Откройте анонимный доступ к репозитарию. Создайте с правами root каталог- песочницу» и выполните команду checkout для каталога CVSR00T: # mkdir /sandbox # cd /sandbox # cvs -d /cvs/home checkout CVSROOT # cd CVSROOT Создайте файл CVSROOT/readers и включите в него пользователя guest (создайте в файле отдельную строку, состоящую из слова «guest»). Проследите за тем, чтобы файл завершался парой пустых строк. Затем занесите файл в репозитарий командами add и update: # cvs -d /cvs/home update # cvs -d /cvs/home add readers # cd /sandbox # cvs -d /cvs/home commit -m 'pserver guest access* CVSROOT/readers Наконец, назначьте пользователю guest пустой пароль: # cvsd-passwd /cvs/home guest He создавайте пароль; просто нажимайте Enter, пока запрос не исчезнет. Теперь запустите cvsd и подключитесь как обычный пользователь: # /etc/init.d/cvsd start $ cvs -d:pserver:guest:@loca1host:/home login Logging in to :pserver:guestGIoca!host:2401/home Если после guest следует двоеточие, команда не будет запрашивать пустой пароль. Помните, что вместо/cvs/home следует указывать/home. Комментарий Для правильного назначения разрешений очень важно выполнить все действия в указанном порядке. Cvsd должна принадлежать файловая система внутри /cvs, но не каталог CVSROOT. Новый общедоступный репозитарий заполняется обычным способом. Включите в группу cvsd авторизованных пользователей, которые могут импортировать файлы проекта локально или через SSH. Не используйте CVS Pserver ни для каких целей, кроме анонимного общего доступа, и никогда не разрешайте заносить файлы в репозитарий через Pserver. Аутентификация проводится на уровне простого текста. Чтобы полностью исключить запись через Pserver, создайте пустой файл CVSROOT/writers. См. также Файлы Readme и FAQ в архиве исходных текстов; домашняя страница cvsd (http://tiefighter.et.tude.nl/~arthur/cvsd); домашняя страница CVS (https:// www.cvshome.org).
18.15. Настройка среды CVS 307 18.15. Настройка среды CVS Проблема Требуется изменить параметры рабочей среды CVS: редактор по умолчанию, пути к файлам, репозитарий по умолчанию, некоторые параметры командной строки. Короче говоря, вы хотите настроить рабочую среду так, чтобы вам было приятно работать. Решение Создайте файл .cvsrc и сохраните его в домашнем каталоге. Каждый пользователь может сделать это, чтобы настроить рабочую среду CVS. В следующем примере задаются базовые параметры по умолчанию: cvs -Т /tmp cvs -d /cvsroot cvs -e nano update -dP checkout -P cvs -z3 dlff -c Настройка совершенно не затрагивает сервер CVS и относится только к клиентской стороне. Комментарий В документации CVS часто предлагается задать переменные среды CVS в системном профиле (например, в -/.bashrc). Вариант с файлом ~/'cvsrc обычно предпочтительнее, потому что он лучше переносится и проще настраивается. Файл -/.cvsrc, если он присутствует в системе, переопределяет все переменные окружения, заданные в -/.bashrc. Смысл приведенного фрагмента -/.cvsxc. О cvs -T /tmp — назначение временного каталога; О cvs -d /cvsroot — путь к репозитарию по умолчанию, чтобы вам не приходилось вводить команду cvs -d <cvsserver>. Экономит немного времени при импортировании новых проектов; после инициализации новой «песочницы» задавать репозитарий все равно не нужно; О cvs -e nano — редактор по умолчанию; О update -dP — новые каталоги заносятся в репозитарий только в том случае, если они не являются пустыми; О checkout -Р — пустые каталоги не заносятся в репозитарий; О cvs -z3 — выбор уровня сжатия; допустимые значения — от 1 до 9. Учтите, что более высокий уровень сжатия повышает нагрузку на сервер CVS и может вызвать нарекания со стороны администратора сервера; О diff -с — контекстное форматирование выходных данных diff (упрощает чтение).
308 Глава 18. Управление версиями См. также cvs(l); локальная документация (/usr/share/doc/cvs/htmHnfo/cvs_16.html и /usr/ share/doc/cvs/html-info/cvs_19.html). 18.16. Вычисление объема репозитария CVS Проблема Требуется узнать, сколько дискового пространства выделить для репозитария CVS для его размещения в специальном разделе. Решение Простое эмпирическое правило: объем выделяемой области должен в 10 раз превосходить предполагаемый окончательный объем файлов проекта. Если над проектом работает большое количество пользователей, дисковое пространство расходуется очень быстро. Впрочем, самое надежное правило — «чем больше, тем лучше». Репозитарий лучше всего разместить в файловой системе, уже изолированной в собственном разделе (например, /var или /home). Это упростит архивацию и изолирует репозитарий от корневой файловой системы, что вообще желательно для файлов данных. Вы также можете создать каталог верхнего уровня в специальном разделе (например, /cvsroot) для упрощения поиска.
Глава 19 NTP 19.1. Введение Точный отсчет времени на отдельном компьютере или в локальной сети важен по многим причинам: он обеспечивает точную пометку времени в журналах и базах данных, а также обеспечивает запуск пакетных заданий и других автоматизированных процессов в нужный момент. Что еще важнее, поддержание точного времени позволяет синхронизировать работу всех серверов и рабочих станций. Linux содержит великое множество утилит для работы с датой и временем: htpdate, hwclock.sh, date, 822-date, tzselect, tzsetup, vcstime, uptime, zdump, ddate, rdate, ctime и т. д. Раньше приходилось запускать hwclock.sh, rdate или ntpdate во время загрузки системы или оформлять их запуск в задания сгоп для периодического обновления. С появлением NTP (Network Time Protocol) все это стало лишним. Более того, все утилиты, настроенные на автоматический запуск (из файлов rc*.d или сгоп), лучше отключить и поручить все наблюдение за временем ntp... С одним исключением: для больших корректировок по-прежнему хорошо подходит ntpdate. Если системное время сбилось на 20 или 30 минут, то для его исправления ntp понадобится несколько часов или даже дней, тогда как ntpdate исправит ситуацию мгновенно. Команда ntpd -g вроде бы должна заменить ntpdate, но она плохо работает для смещений более часа. Если системное время отличается от истинного на несколько часов, в документации ntp рекомендуется внести изменения вручную. Если вас это устраивает — хорошо; но в этой главе будет показано, как поручить всю работу компьютерам. В Linux протокол NTP реализован в виде демона ntpd. В сущности, система работает по принципу «настроил и забыл»: вы один раз настраиваете и запускаете ntpd, а в будущем только периодически проверяете правильность системного времени. По правилам сетевого этикета один хост локальной сети синхронизируется с группой внешних серверов времени, а затем обслуживает всю локальную сеть. При такой схеме снимается лишняя нагрузка на общедоступные серверы времени, а хосты локальной сети синхронизируются друг с другом.
310 Глава 19. NTP Когда-то администратору приходилось выбирать общедоступные серверы времени из списка http://www.eecis.udeLedu/-mills/ntp/servers.html. Тем не менее из- за злоупотреблений и несоблюдения политики доступа был создан сайт http:// pool.ntp.org для автоматического распределения нагрузки на серверы. 19.2. Настройка локального сервера времени Проблема Требуется создать локальный сервер времени. Он синхронизируется с общедоступным сервером времени, а клиенты локальной сети связываются с локальным компьютером для выполнения синхронизации. Компьютер, выполняющий функции локального сервера времени, постоянно подключен к Интернету. Решение Сначала установите или обновите поддержку NTP на компьютере, который будет выполнять функции сервера времени для вашей локальной сети. Заодно стоит установить ntpdate. Затем остановите демона ntpd, если он работает в системе: # /etc/lnit.d/ntpd stop В Debian следует использовать команду # /etc/init.d/ntp-server stop Включите следующий фрагмент в файл /etc/ntp.conf и создайте служебные файлы, если они еще не существуют; их владельцем должен быть root (chmod 644): #/etc/ntp.conf drift file /etc/ntp. drift logfile /var/log/ntp.log server pool.ntp.org server pool.ntp.org server pool.ntp.org Произведите начальную корректировку времени командой ntupdate: # ntpdate pool.ntp.org Затем запустите ntpd: # /etc/init.d/ntpd start В Debian следует использовать команду # /etc/init.d/ntp-server start Команда ntpq выводит информацию о том, к каким серверам производится подключение: # ntpq -р remote refid st t when poll reach delay offset jitter +clock.fmt.he.ne .GPS. 1 u 37 64 377 105.562 26.771 2.539 ♦dewley.lib.ci.ph reaper.twc.weat 2 u 25 64 377 398.666 -30.285 51.555 *clock.sjc.he.ne .CDMA. 1 u 21 64 377 98.269 15.298 4.000
19.3. Подключение к локальному серверу времени 311 Будьте терпеливы: список серверов появится лишь через несколько минут, а до выполнения первой корректировки пройдет до 30 минут. Префиксы * и + означают, что подключения были выполнены успешно и в настоящее время происходит синхронизация. ВНИМАНИЕ Если в системе работают базы данных, проконсультируйтесь с администраторами баз данных перед внесением серьезных изменений в системное время. Масштабные, непредвиденные изменения обычно плохо отражаются на работе баз данных. Возможно, будет лучше ограничиться запуском демона ntpd и предоставить ему вносить изменения в обычном пошаговом режиме. Комментарий Проследите за тем, чтобы устанавливаемый пакет RPM назывался ntp, а не xntp. Пользователям Debian понадобятся пакеты ntp-simple, ntp-doc и ntp-server. Демон ntpd вносит небольшие| пошаговые изменения в течение некоторого времени. В обычных условиях регулировка системного времени займет часы и даже дни, в зависимости от величины отклонения. Если системное время отличается от истинного более чем на 60 минут, то для внесения начальных изменений быстрее всего воспользоваться ntpdate. Если в системе работает ntpd, ntpdate не запустится. Ответственные за сопровождение на сайте ntp.org пытаются объявить программу ntpdate устаревшей. Они утверждают, что команда «мгновенного обновления» ntpd -g делает то же самое. К сожалению, при отклонениях свыше 60 минут эта команда работает ничуть не быстрее, чем ntpd, поэтому программа ntpdate остается актуальной. Трехкратное повторение одной записи (server pool.ntp.org) в файле ntp.conf означает трехкратное обращение к пулу DNS, чтобы у вас не было проблем с временной недоступностью серверов. Сайт pool.ntp.org обеспечивает циклическую смену DNS серверов времени, участвующих в проекте. В разделе 19.5 рассказано о других пулах NTP и о том, как обеспечить максимальное быстродействие. См. также Локальная документация (/usr/share/doc/htp-doc/html) или документация в Интернете (http://www.ntp.org/documentation.html); домашняя страница проекта ntp.org (http://www.pool.ntp.org); веб-сайт ntp.org (http://www.ntp.org/); архивы группы Usenet comp.protocols.time.ntp. 19.3. Подключение к локальному серверу времени Проблема Вам надоело видеть разное время на каждом компьютере сети и вы создали локальный сервер времени — но как организовать подключение к нему клиентов?
312 Глава 19. NTP Решение Установите или обновите ntp на клиентских компьютерах. Остановите демона ntpd, если он работает в системе: # /etc/init.d/ntpd stop В Debian следует использовать команду # /etc/init.d/ntp-server stop Отредактируйте файл /etc/ntp.conf и включите в него ссылку на локальный сервер времени: #/etc/ntp.conf driftfile /etc/ntp.drift logfile /var/log/ntp.logfriftfile # Имена хостов или IP-адреса server 192.168.1.101 Также можно включить резервную запись на случай временной недоступности сервера имен: # Stratum 10 означает низкий приоритет server 127.127.1.0 fudge 127.127.1.0 stratum 10 Ntp будет пытаться поддерживать время на основании старых данных до тех пор, пока сервер снова не станет доступным. Теперь запустите ntpdate с указанием локального сервера: # ntpdate 192.168.1.101 Запустите ntpd: # /etc/init.d/ntpd start В Debian используется команда # /etc/init.d/ntp-server start Комментарий На клиентах Windows следует использовать бесплатного клиента SNTP (Simple Network Time Protocol) Automachron. Программа работает во всех версиях Windows и легко настраивается. Ее можно загрузить по адресу http://www.oneguycoding.com/ automachron. См. также Раздел 19.4; локальная документация (/usr/share/doc/htp-doc/html) или документация в Интернете (http://www.ntp.org/documentation.html); домашняя страница ntp.org (http://pool.ntp.org); архивы группы Usenet comp.protocols.time.ntp. 19.4. Управление доступом Проблема Нужно проследить за тем, чтобы локальные клиенты выполняли функции только клиентов, но не серверов ntp. Они должны пользоваться только услугами службы времени и только от указанных серверов.
19.4. Управление доступом 313 Решение Включите правила управления доступом в /etc/ntp.conf или создайте пару правил iptables на брандмауэре клиента. Чтобы использовать механизм управления доступом ntp, включите следующие строки в/etc/ntp.conf: # Политика доступа по умолчанию # Запретить весь трафик ntp, который не был специально разрешен restrict default ignore restrict 192.168.1.101 # Локальный хост является доверенный restrict 127.0.0.0 mask 255.0.0.0 Не забудьте перезапустить ntpd после внесения изменений в ntp.conf. Другой вариант — настройка правил брандмауэра iptables. Если на клиентском компьютере работает iptables, добавьте следующие правила: iptables -A INPUT -р udp --dport 123 «m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p udp --dport 123 -j REJECT Первое правило принимает все ответы на отправленные пакеты ntp, а второе отклоняет все остальные пакеты. Таким образом, попытка подключения со стороны другого хоста будет заблокирована, а ответы на запросы клиента будут успешно обработаны. Комментарий Некоторые из параметров конфигурации ntp.conf: О peer [хост или IP]— указанный хост опрашивается в симметричном активном режиме, то есть хосты синхронизируются друг по другу. Параметр никогда не используется для общедоступных серверов времени; О server [хост или IP] — указанный сервер опрашивается в клиентском режиме (синхронизация выполняется только на клиентском компьютере); О restrict — определение ограничений для конкретных хостов с переопределением значений по умолчанию; О ignore — игнорирование всех пакетов ntp; О nomodify — запрет изменения конфигурации на стадии выполнения. Запросы, возвращающие информацию, разрешены; О пореег — запрет одноранговой синхронизации. Это означает, что синхронизация обеспечивается только серверами, указанными в директиве server, а другие хосты не могут использовать этот компьютер как сервер времени; О notrap — запрет на перехват управляющих сообщений режима 6 (фактически запрет remote logging); О noquery — игнорирование всех информационных запросов NTP режимов 6 и 7. Управление доступом используется, прежде всего, для того, чтобы клиенты не брали на себя функции серверов, а также для поддержания порядка в сети.
314 Глава 19. NTP См. также Локальная документация (/usr/share/doc/htp-doc/html) или документация в Интернете (http://www.ntp.org/documentation,html); домашняя страница проекта pooLntp.org (http://www.pool.ntp.org); веб-сайт ntp.org (http://www.ntp.org/); архивы группы Usenet comp.protocols.time.ntp. 19.5. Выбор пула NTP Проблема Похоже, при подключении к глобальному пулу NTP возникает риск использования слишком удаленных серверов, что снижает точность синхронизации. Требуется узнать, какие еще существуют пулы NTP. Решение Пулы NTP делятся на три класса: о Глобальный пул: • pool.ntp.org. О Региональные пулы: • europe.pool.ntp.org; • north-america.pool.ntp.org; • oceania.pool.ntp.org; • asia.pool.ntp.org. О Пулы стран • us.pool.ntp.org; • de.pool.ntp.org; • fr.pool.ntp.org. Единого списка пулов для стран еще не существует. Чтобы узнать, существует ли такой пул для вашей страны, воспользуйтесь командой ping: $ ping ru.pool.ntp.org PING ru.pool.ntp.org (195.230.70.112): 56 data bytes 64 bytes from 195.230.70.112: 1cmp_seq»0 ttl-49 time-240.8 ms Список кодов стран приведен на странице http://www.iana.org/cctld/cctld-whois.htm. Как правило, пул следует использовать только в том случае, если он содержит не менее трех серверов. Количество серверов проверяется командой % dig ru.pool.ntp.org Команда ping также позволяет составить представление о скорости отклика. Затем несколько раз выполните команду traceroute, обращая внимание на количество хопов и возникающие тайм-ауты.
19.6. Подключение к серверу времени при непостоянном подключении 315 Комментарий Пулы NTP хороши тем, что они выполняют всю работу за вас. Стоит один раз настроить систему и возиться с ней в будущем уже не придется. Если вы располагаете хорошим постоянным подключением к Интернету и хотите стать частью пула, обращайтесь за подробностями по адресу http://www.pool.ntp.org. Чем больше серверов времени входит в пул, тем меньше нагрузка на каждый отдельный сервер. См. также Локальная документация (/usr/share/doc/htp-doc/html) или документация в Интернете (http://www.ntp.org/documentation.html); домашняя страница проекта pool.ntp.org (http://www.pool.ntp.org); веб-сайт ntp.org (http://www.ntp.org/); архивы группы Usenet comp.protocols.time.ntp. 19.6. Подключение к серверу времени при непостоянном подключении Проблема У вас нет постоянного подключения к Интернету — возможно, вы продолжаете пользоваться модемным подключением, взяли ноутбук в поездку и т. д. Как провести синхронизацию по серверу NTP? Решение Установите ntp и ntpdate. Остановите демона ntpd, если он работает в настоящий момент. Откройте файл /etc/ntp.conf и создайте служебные файлы, если они не существуют (владелец — root, разрешения 644): #/etc/ntp.conf driftfUe /etc/ntp.drift logfile /var/log/ntp.log server pool.ntp.org server pool.ntp.org server pool.ntp.org Пользователи Debian (или любой системы, в которой сценарии PPi размещаются в каталоге /etc/ppp/ip-up.d/) могут скопировать следующий сп» чг.рий: #!/b1n/bash # Сценарий ntp с модемный подключением для Debian /usr/sbin/ntupdate pool.ntp.org if [ -х /etc/init.d/ntp-server ]; then /etc/1nit.d/ntp-server restart fi Владельцем сценария должен быть root (chmod 744). Сценарий будет выполняться при каждом запуске РРР.
316 Глава 19. NTP В Red Hat и Fedora отредактируйте или создайте сценарий /etc/ppp/ip-up.local, включив в него следующие строки: #!/bin/bash # В Rad Hat и Fedora добавьте следующий фрагмент # в /etc/ppp/ip-up.local /usr/sbin/ntupdate pool.ntp.org if [ -х /etc/init.d/ntpd ]: then /etc/init.d/ntpd restart fi Ntupdate скорректирует время в первую минуту или две после подключения. Затем демон ntp продолжит работу в фоновом режиме: И Feb 11:38:18 ntupdate[6796]: adjust time server 163.1.87.28 offset -0.01803 sec ntpdate is updating the time Starting NTP server: ntpd. Если сервер удаленного доступа обслуживает локальную сеть Ethernet, настройте клиентские компьютеры так, как описано в разделе 19.3. Решение Сценарии легко адаптируются для компьютеров, подключающихся к частной сети с локальным сервером времени. В сценарии РРР свяжите вызов ntupdate с локальным сервером и включите ссылку на локальный сервер в/etc/ntp.conf. См. также Раздел 19.4; документация подистрибутиву; локальная документация (/usr/share/doc/ htp-doc/html) или документация в Интернете (http://www.ntp.org/documentation.html); домашняя страница проекта pool.ntp.org (http://www.pool.ntp.org); веб-сайт ntp.org (http://www.ntp.org/); архивы группы Usenet comp.protocols.time.ntp. 19.7. Настройка нескольких локальных серверов времени Проблема Локальный сервер времени перегружен, поэтому в сети необходимо установить дополнительные серверы. Дополнительные серверы должны всегда синхронизироваться друг с другом. Решение В следующем примере два внутренних сервера, serverl и server2, синхронизируются с us.pool.ntp.org и друг с другом: # /etc/ntp.conf для serverl drlftfile /etc/ntp.drift
19»8. Аутентификация с использованием ключей NTP 317 logfile /var/log/ntp.log # Политика доступа по умолчанию # Запретить весь трафик ntp, который не был специально разрешен restrict default ignore # Список серверов ntp server pool.ntp.org server pool.ntp.org server pool.ntp.org peer serverZ # Разрешить синхронизацию с другим сервером # Запретить изменения конфигурации во время выполнения # Запретить remote logging restrict server2 nomodify notrap # Локальный хост не ограничивается restrict 127.0.0.0 mask 255.0.0.0 Файл /etc/ntp.conf для сервера server2 выглядит идентично, но ссылки на server2 заменяются ссылками на serverl. Настройте клиентов в локальной сети так, как описано в разделе 23.2: # Файл /etc/ntp.conf для клиентов driftfile /etc/ntp.drift logfile /var/log/ntp.log server serverl server server2 Комментарий Вы можете создать сколько угодно дополнительных серверов; даже рабочие станции могут синхронизироваться друг но другу. Ради собственного спокойствия сохраняйте конфигурацию как можно более простой. Не пытайтесь использовать одноранговую синхронизацию с общедоступными серверами времени! У них нет причин доверять вашим серверам и незачем попусту раздражать системных администраторов. См. также Документация по дистрибутиву; локальная документация (/usr/share/doc/htp-doc/ html) или документация в Интернете (http://www.ntp.org/documentation.html); вебсайт ntp.org (http://www.ntp.org/); архивы группы Usenet comp.protocols.time.ntp. 19.8. Аутентификация с использованием ключей NTP Проблема Требуется организовать некоторую разновидность аутентификации на локальных серверах. Случаи использования уязвимостей NTP злоумышленников встречаются
318 Глава 19. NTP редко, но вам хотелось бы каким-то образом убедиться в том, что клиенты и серверы — именно те, за кого они себя выдают. Решение Воспользуйтесь встроенной в ntp схемой аутентификации ntpkeys. Начните с настройки сервера (в нашем примере serverl): # /etc/ntp.conf crypto pw seekitword keysdir /etc/ntp/keys Пароли хранятся в текстовом виде, поэтому для файла ntp.conf необходимо установить права chmod 600. Создайте ключ на сервере serverl: # ntp-keygen -T -I -р seekrltword Скопируйте сгенерированный файл ntpkey_IFFpat_serverl.4558615255 в файлы /etc/ntp всех клиентов serverl (временная пометка будет выглядеть иначе). Ключ является секретным, поэтому пересылка должна быть защищена. Вполне подойдет обычная дискета (не забудьте надежно сохранить ее после завершения копирования). Переходите к настройке клиентов. Для начала создайте две символьные ссылки на новый ключ: # In -s ntpkey_ IFFpat__serverl.4558615255 ntpkey_iff__serverl # In -s ntpkey_ IFFpat__serverl.4558615255 ntpkey_iff_c1ientl Отредактируйте запись сервера в файле /etc/ntp.conf клиента, добавив в нее ключевое слово autokey: server serverl autokey Перезапустите ntpd на всех компьютерах-участниках и займитесь другими делами. Чтобы новая схема аутентификации синхронизировалась и заработала, клиентам и серверам понадобится некоторое время. Через час или два все будет нормально. Комментарий Ключи ntpjceygen: О -Т — сгенерировать доверенный сертификат; О -I — применение схемы идентификации IFF с заменой существующих файлов ключей; О -р — назначение пароля. Для использования аутентификации на общедоступных серверах времени необходимо: 1. Найти общедоступные серверы, поддерживающие аутентификацию. 2. Включить в ntp.conf данные конкретных серверов (вместо пулов ntp). Текущий список общедоступных серверов времени находится по адресу http:// www.eecis.udeLedu/~mi4Ls/ntp/servers.html.
19.8. Аутентификация с использованием ключей NTP 319 На практике вероятность использования слабостей ntp невелика. Даже если сервер злоумышленника выдаст себя за общедоступный сервер времени и начнет передавать неверное время, вы отчасти защищены: ntp вносит небольшие изменения, а при синхронизации используется целый пул серверов, поэтому любые ошибки (намеренные или случайные) быстро исправляются. См. также Раздел «Ntp-keygen — Generate Public and Private Keys» описания NTP в локальной документации (/usr/share/doc/htp-doc/html) или в Интернете (http://www.ntp.org/ documentation.html); веб-сайт ntp.org (http://www.ntp.org/); архивы группы Usenet comp.protocols.time.ntp.
Глава 20 Почтовый сервер Postfix 20.1. Введение В мире Linux существует много превосходных программ для работы с почтой. Четырьмя лучшими почтовыми агентами (MTAt Mail Transfer Agent) считаются Sendmail, Exim, qmail и Postfix. Настоящая глава посвящена Postfix. Как и многие почтовые агенты поколения, следующего после Sendmail, программа Postfix изначально проектировалась с расчетом на надежность и безопасность. Она отлично масштабируется от одного пользователя, желающего лучше управлять своей личной перепиской, до потребностей крупнейших поставщиков почтовых услуг. Для начала разберемся с терминологией. О МТА — почтовый агент (Mail Transfer Agent), то есть почтовая программа, пересылающая электронную почту между серверами. Почтовый агент должен поддерживать SMTP. О SMTP — протокол пересылки почты (Simple Mail Transfer Protocol), используемый при пересылке сообщений между почтовыми серверами. О MUA — пользовательский агент (Mail User Agent), также называемый «почтовым клиентом», то есть программа для создания, отправки и получения электронной почты. Примеры MUA— Mutt, Pine, Kmail, Evolution и Balsa. MUA может принимать почту из локального каталога или с удаленного почтового сервера с использованием POP и ШАР. О MDA — агент доставки (Mail Delivery Agent), посредник между МТА и MUA. Популярные MDA — Procmail и Fetchmail. Присутствие MDA не является обязательным; MDA всего лишь обеспечивает такие дополнительные возможности, как фильтрация, сортировка и автоответ. О POP — почтовый протокол (Post Office Protocol), используемый для пересылки сообщений с сервера в почтовый ящик пользователя. Сервер POP прост в настройке и не требует высокопроизводительного оборудования. О IM АР — почтовый протокол (Interactive Message Access Protocol). Сервер IM АР требует больших объемов оперативной памяти и дискового пространства.
20,2, Построение почтового сервера РОРЗ 321 О TLS — (Transport Layer Security) результат эволюции SSL (Secure Sockets Layer). Обеспечивает шифрование транспорта для подключений с аутентификацией SASL. О SASL — (Simple Authentication and Security Layer) механизм аутентификации пользователей. SASL обеспечивает аутентификацию, a TLS обеспечивает шифрование передачи аутентификационных данных. Официальные порты различных почтовых протоколов: О tcp/25-SMTP; О tcp/110-РОРЗ; О tcp/995 - РОРЗ через SSL; О tcp/143-ШАР; О tcp/993 - ШАР через SSL. Существуют разные подходы к построению почтового сервера в Linux. Многие администраторы выбирают модульный подход и строят сервер из набора специализированных компонентов (именно этот вариант будет рассматриваться в настоящей главе). Другой подход основан на использовании пакета Courier, объединяющего МТА, РОРЗ, ШАР и менеджер списков рассылки. Наконец, вы можете приобрести дистрибутив, в котором все компоненты собраны воедино (скажем, SuSE OpenExchange). 20.2. Построение почтового сервера РОРЗ Проблема Требуется настроить почтовый сервер РОРЗ — ничего особенного, базовый сервер пересылки интернет-почты для одного домена, с поддержкой TLS/SSL для защиты подключений. Решение Потребуются следующие компоненты: О Postfix; О Courier-IMAP (поддержка как РОРЗ, так и ШАР); О OpenSSL; О демон famd (File Alteration Monitor Daemon). ПРИМЕЧАНИЕ Инструкции для Debian приведены в разделе 20.3. Начните с установки или обновления OpenSSL и famd. Затем удалите все установленные почтовые агенты и серверы POP/ШАР. Начните с поиска Sendmail, поскольку эта программа часто устанавливается по умолчанию. Не бойтесь разрывать зависимости, они будут обслуживаться Postfix.
322 Глава 20. Почтовый сервер Postfix Остановите все процессы, принадлежащие старому почтовому агенту: $ ps ах | grep sendmail root 10204 0.0 0.7 5296 1980 ? S 19:27 0:00 sendmail:accepti $ su # kill 10204 Установите Postfix. Если программа строится по исходным текстам, не забудьте включить поддержку SASL (см. файл SASL_README в tar-архиве). После установки Postfix создайте резервную копию /etc/postfix/main.cf: # ср /etc/postfix/main.cf /etc/postfix/main.cf-old Сотрите все содержимое оригинала и скопируйте следующий фрагмент. Используйте пути и имена хостов/доменов, относящиеся к вашей системе. command_d1rectory e /usr/sbin ma11_owner - postfix default_privs - nobody # Доменное имя mydomain « tuxcomputing.com # Полное имя хоста rayhostnarae - windbag.tuxcofflputing.com myorigin e Imydomain aliasjnaps - hash:/etc/aliases aliasjiatabase - hash:/etc/aliases inetjnterface e all mydestination - Smyhostname, local host.Smydomain $mydomain mynetworks_style - subnet home mailbox » Malldir/ mail_spoo1_directory = /var/mail mtpdj>anner « Smyhostname ESMTP Imailjname mailbox_size_limit ш О recipient_delimiter - + Определите псевдонимы для root и postmaster в /etc/aliases: # Описание формата • см. man 5 aliases root:fooberGtest.net postmaster-.root Создайте базу данных псевдонимов: # newaliases и запустите встроенную программу проверки синтаксиса: # postfix check В некоторых дистрибутивах Postfix запускается автоматически после установки. Ручной запуск Postfix производится командой # postfix start Если Postfix уже работает, перезапустите программу: # postfix reload postfix/postfix-script: refreshing the Postfix mail system Убедитесь в том, что Postfix работает в системе: S ps as | grep postfix 26342 ? Ss 0:00 /usr/lib/postfix/master
20.2. Построение почтового сервера РОРЗ 323 Убедитесь в том, что работает демон SMTP: $ telnet local host 25 Trying 127.0.0.1... Connected to local host.local domain. Escape character 1s ,A]\ 220 windbag.test.net ESMTP Postfix (L1branet/GNU) EHLO windbag.test.net 250-w1ndbag.test.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XVERP 250 8BITMIME A] telnet> quit Connection closed. Теперь установите Courier-IMAP. Если устанавливаются пакеты RPM, вам потребуются courier-imap-common и courier-imap-рорЗ. При сборке из исходных текстов прочитайте файл 00README.N0W.0R.SUFFER. После установки сгенерируйте сертификат РОРЗ TLS/SSL. Сначала отредактируйте файл /etc/courier/pop3d.cnf (подставьте свои данные): [ reqjjn ] С - US ST-NM L«A1buquerque (Hnall server OUeAutomatica11y-generated P0P3 SSL key CN-W1ndbag emai 1 Address-postmasterGtuxcomput 1 ng. com Сгенерируйте ключ: # mkpop3dcert Generating a 1024 bit RSA private key writing new private key to 7usr/11b/cour1er/pop3d.pem' 1024 semi-random bytes loaded Generating DH parameters. 512 bit long safe prime, generator 2 В некоторых дистрибутивах Courier запускается автоматически после установки. Используйте следующие команды для ручного запуска Courier в случае необходимости: # /etc/init.d/courier-pop3d start # /etc/init.d/courier-pop3d-ssl start Проверьте имена файлов, так как они могут зависеть от дистрибутива. Теперь в вашем распоряжении имеется полностью рабочий почтовый сервер РОРЗ. Комментарий Некоторые дистрибутивы Linux вносят изменения в Postfix и Courier, так что обязательно проверьте правильность путей и имен файлов.
324 Глава 20. Почтовый сервер Postfix Если вы привыкли, что почта ставится в общую очередь в /var/spool, в Courier дело обстоит немного иначе. Почтовая очередь создается в домашнем каталоге каждого пользователя: # Is /home/foober Desktop Maildir # Is /home/foober/Maildir courlerimapkeywords courierimapuiddb cur tmp courierimapsubscribed cour1eripop3ds1zelist new Новая почта находится в /Maildir/new до тех пор, пока она не будет загружена пользователем. Соответствующий параметр задается в Postfix, в каталоге main.cf: homejnallbox - Maildir/ Почтовый сервер РОРЗ может работать на любом старом компьютере с процессором Pentium и даже 486. Под почтовый сервер рекомендуется выделить отдельный компьютер — так как сервер доступен для небезопасных сетей, все, что находится на этом компьютере, также в той или иной степени подвержено риску. Сгенерированный для Courier сертификат SSL является «самоподписаным» (self-signed); это означает, что никакая «доверенная» третья сторона не ручается за подлинность сертификата. Для большинства пользователей этого вполне достаточно. Если вы полагаете, что вам нужен полноценный, коммерческий сертификат SSL от такого поставщика, как VeriSign или Thawte, учтите: это будет стоит несколько сот долларов в год. Также попробуйте обратиться к поставщику услуг Интернета или веб-хостинга — возможно, они предлагают дешевые совместные сертификаты. См. также Раздел 20.3; локальная документация Courier (/usr/share/doc/courier-doc); Postfix Basic Configuration (/usr/share/doc/postfix/html/basic.html); домашняя страница Courier-IMAP (http://www.inter7.com/couriermap.html); домашняя страница Postfix (http://www.postfix.org). 20.3. Построение почтового сервера РОРЗ в Debian Проблема Требуется наладить работу сервера РОРЗ Postfix/Courier в Debian. Решение В Debian большая часть процесса настройки сервера автоматизирована. Установите или обновите famd, OpenSSL и Postfix: # apt-get install famd openssl postfix postfix-doc postfix-tls Debian производит базовую настройку конфигурации Postfix и запускает программу. Создайте резервную копию /etc/postfix/main.cf: # ср /etc/postfix/main.cf /etc/postfix/main.cf-old
20.3. Построение почтового сервера РОРЗ в Debian 325 Сотрите все содержимое оригинала и скопируйте следующий фрагмент. Используйте пути и имена хостов/доменов, относящиеся к вашей системе. commandjiirectory - /usr/sbin mail_owner = postfix defaultj>rivs e nobody # Доменное иня mydomain e tuxcomputing.com # Полное иня хоста myhostname = windbag.tuxcomputing.com myorigin « $mydomain aliasjnaps - hash: /etc/aliases aliasdatabase ■ hash:/etc/aliases inet_interface » all mydestination e $myhostname. localhost.Smydomain $mydomain mynetworksstyle - subnet homejnailbox - Maildir/ mail_spool directory - /var/mail mtpd_banner * Smyhostname ESMTP Smailname mailbox_sizeJirait - 0 reciplentjtelimiter ■ + Определите псевдонимы для root и postmaster в /etc/aliases: # Описание формата • си. man 5 aliases root:fooberGtest.net postmaster:root Создайте базу данных псевдонимов: # newaliases и запустите встроенную программу проверки синтаксиса: # postfix check Перезапустите Postfix: # postfix reload postfix/postfix-script: refreshing the Postfix mail system Теперь установите Courier: # apt-get install courier-authdaemon courier-base courier-doc courier-pop courier-pop- ssl courier-ssl Debian автоматически генерирует ключи и запускает демонов Courier. Тем не менее вы должны отредактировать/etc/courier/pop3d.cnf и вручную сгенерировать новый сертификат с обновленными данными. В разделе 20.2 описано, как это сделать. Комментарий Команда postfix reload — самый быстрый способ активации изменений в main.cf, который создает меньше всего проблем. Используйте эту команду, когда система находится под нагрузкой и вы не хотите прерывать ее работу. Всегда посещайте страницу поиска пакетов Debian http://packages.debian.org. В Debian используется собственная схема выбора имен пакетов, а пакеты разбиваются на более мелкие компоненты.
326 Глава 20. Почтовый сервер Postfix См. также Раздел 20.2; страница поиска пакетов Debian (http://packages.debian.org); Postfix Basic Configuration (/usr/share/doc/postfix/html/basic.html); локальная документация Courier (/usr/share/doc/courier-doc); раздел 20.4. 20.4. Тестирование почтового сервера SMTP/POP3 Проблема Требуется убедиться в том, что различные компоненты сервера успешно работают. Решение В этом вам помогут программы telnet и openssl s__client. Работа сервера SMTP проверяется при помощи telnet: $ telnet local host 25 Trying 127.0.0.1... Connected to local host.local domain. Escape character is ,A]'. 220 windbag.test.net ESMTP Postfix (Libranet/GNU) ehlo windbag 250•windbag.test.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XVERP 250 6BITNIME mail from: foober@test.net 250 OK rcpt to: carla@test.net 250 OK data 354 End data with <CRxLF>.<RxLF> Date: Jan 15. 2004 From: foober Reply-to: foober@test.net Message-Id: six Subject: telnet test Hi Carla. Did you get this? 250 OK: queued as 6069F2290C quit 221 Bye Connection closed by foreign host.
20.4. Тестирование почтового сервера SMTP/POP3 327 Программа telnet также используется для проверки простой, незашифрованной пересылки РОРЗ: $ telnet local host 110 Trying 127.0.0.1... Connected to local host.localdomain. Escape character is ,A]\ +OK Hello there. user carla +OK Password required. pass sekritword ♦OK logged in. stat +OK 2 1275 list +OK P0P3 clients that break here, they violate STD53. 1 638 2 637 retr l +OK 638 octets follow. Return-Path: <stinkpad@test.net> X-Original-To: carl attest.net Received: from 192.168.1.100 (unknown [192.168.1.100]) by w1ndbag.test.net (Postfix) with ESMTP id 409E722884 for <carlattest.net>; Thu. 15 Jan 2004 15:29:54 -0700 (POT) From: stinkpad <stinkpad@test.net> To: carla@test.net Subject: telnet etst Date: Thu. 15 Jan 2004 15:29:50 -0700 User-Agent: KMail/1.5.4 MIME-Version: 1.0 Content-Type: text/plain; charset-"us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id:<200401151529.50714.stinkpadGtest.net> Hi Carla. Did you get this? quit +OK Bye-bye. Connection closed by foreign host. Для тестирования поддержки TLS/SSL используется программа openssl s_client: $ openssl s_client -connect local host:995 CONNECTED(00000003) depth-0 /C4)S/ST-NM/l-Albuquerque/0-Courier Mail Server/OU-Automaticall у-generated P0P3 SSL key/CN*windbag/emailAddress-postmaster@test.net verify error:num-18:self signed certificate
328 Глава 20. Почтовый сервер Postfix +0К Hello there. user carla +0K Password required. pass sekritword +0K logged in. Дальше все делается так же, как в обычном сеансе РОРЗ. Проверка клиентских подключений осуществляется по имени хоста или по IP- адресу: $ telnet windbag 25 $ telnet 192.168.1.5 110 $ openssl s_client -connect windbag:995 Комментарий Некоторые распространенные команды РОРЗ: О list — список сообщений (с количеством байт в каждом сообщении); О top msg lines — вывод заголовка сообщения msg с отображением lines строк. Например, команда top 3 5 выводит заголовок сообщения 3 с первыми 5 строками тела сообщения; О retr msg — отображение сообщения с заданным номером (например, retr 2); О dele n — удаление сообщения с номером п\ О rset — восстановление сообщений, помеченных для удаления; О quit — уничтожение сообщений, помеченных для удаления, и завершение сеанса. См. также RFC 1939 с полным списком команд POP; раздел «Введение» настоящей главы; telnet(l). 20.5. Отправка интернет-почты Проблема Как настроить Postfix на отправку интернет-почты? Сервер настроен, но почта почему-то не отправляется. Решение Задача решается сложнее, чем раньше — и все из-за спамеров. Если ваш поставщик услуг Интернета не требует аутентификации SMTP, вы можете пересылать исходящую почту через его сервер SMTP. Включите директиву relayhost в файл /etc/postfix/m ai n. cf: relayhost - isp.smtpserver.com Используйте сервер SMTP, указанный в данных, полученных от поставщика услуг Интернета. Если поставщик требует аутентификации SMTP — см. раздел 20.7.
20.7. Установка Cyrus-SASL 329 См. также Раздел 20.7; описание Postfix (/usr/share/doc/postfix/html/index.html). 20.6. Прием интернет-почты Проблема Почтовый сервер готов к работе — но как заставить его принимать интернет-почту? Решение Вам потребуются статический IP-адрес, зарегистрированное доменное имя и записи DNS, связывающие окружающий мир с почтовым сервером. В конфигурации DNS должна присутствовать запись А для сервера IP и запись MX для почтового сервера. Вот как выглядят записи BIND: $0RIGIN tuxcomputing.com windbag A 10.11.12.23 mx 10 windbag За дополнительной информацией о DNS обращайтесь к главе 24. Комментарий Существует много вариантов обеспечения сервиса DNS. Это может сделать ваш поставщик услуг Интернета, или независимая служба DNS вроде Dyndns.org, или регистратор доменного имени. Вы также можете запустить свой собственный общедоступный сервер DNS. См. также Глава 24; описание Postfix (/usr/share/doc/postfix/html/index.html). 20.7. Установка Cyrus-SASL Проблема Требуется включить на почтовом сервере поддержку Cyrus-SASL. Решение Пользователям RPM-систем потребуются следующие пакеты: О cyrus-sasl-2.x; о cyrus-sasl-plain-2.x. ПРИМЕЧАНИЕ Информация для пользователей Debian приводится в разделе 20.8.
330 Глава 20. Почтовый сервер Postfix Прежде чем устанавливать Cyrus-SASL, убедитесь в том, что ваша версия Postfix поддерживает SASL и TLS. Для этого выполните команду Idd для исполняемого файла smtpd. Вас интересуют записи libsasl2, libssl и libcrypto: $ Idd /usr/lib/postfix/smtpd libssl.so.0.9.7 -> /usr/lib/i686/onov/libssl.so.0.9.7 (ox4006f000) libcrypto.so.0.9.7 -> /usr/Hb/1686/croov/libcrypto.so.0.9.7 (ox4009e000) libsasl2.so.2 -> /usr/lib/libsasl.so.2 (ox4018f000) Если Postfix компонуется с этими библиотеками, значит, можно переходить к установке Cyrus-SASL. Если нет, у вас есть два варианта: О постройте Postfix по исходным текстам. Ознакомьтесь с файлами README и SASL_README. Обязательно установите Cyrus-SASL заранее, до компиляции Postfix; О замените Postfix обновленным пакетом RPM, в котором вся необходимая поддержка будет встроена. После установки Postfix и Cyrus-SASL запустите saslauthd: # /etc/i nit.<j/sasl authd start Включите следующий фрагмент в main.cf: sratpd-sasl_auth_enable * yes smtpd_sasl2_auth_enable - yes smtpd_sasl_security_options ■ noanonymous broken_sasT_auth_clients - yes smtpd_saslJfocal_domain - Imyhostname srotpd-recipient_restrictions « permit_sasl authenticated permi tjnynetworks reject_unauth_destination и активируйте изменения: # postfix reload Затем убедитесь в том, что Postfix видит новые библиотеки SASL: $ telnet local host 25 Trying 127.0.0.1... Connected to local host.local domain. Escape character is '*]'. 220 windbag.test.net ESMTP Postfix (Libranet/GNU) EHLO windbag.test.net 250-windbag.test.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH-LOGIN PLAIN 250-XVERP 250-8BITMIME Нас интересуют только строки STARTTLS и AUTH. Теперь можно переходить к следующему шагу, описанному в разделе 20.9.
20.8. Установка Cyrus-SASL в Debian 331 Комментарий Файл main.cf содержит свыше сотни параметров конфигурации. Не надо пугаться; никто не заставляет вас использовать все параметры. Используйте тот минимум, который необходим для выполнения вашей работы. Многочисленные примеры конфигураций содержатся в архиве/usr/share/doc/postfix/examples/sample-smtpd.cf.gz. Запись smtpd jrecipient_restrictions может содержать несколько аргументов, разделенных запятыми. Все аргументы находятся в одной строке или разбиваются на несколько строк. Каждая дополнительная строка должна начинаться с пробела (или табуляции). См. также Описание параметров main.cf в/usr/share/doc/postfix/examples/; описание параметров аутентификации в/use/share/doc/postfix/examples/sample-auth.cf.gz; описание Postfix (/usr/share/doc/postfix/html/index.html). 20.8. Установка Cyrus-SASL в Debian Проблема Требуется установить поддержку Cyrus-SASL в Debian. Решение Начните с установки SASL: # apt-get Install 1ibsasl2 sasl2-bin libsasl2-modules Внесите в /etc/default/saslauthd следующие изменения: START^yes MECHANISMS«"panf Включите следующий фрагмент в main.cf: smtpd_sasl__auth_enable - yes smtpd_sasl2_auth_enable « yes smtpd_$asl_secur1ty_options - noanonymous broken_sasl_auth_clients - yes smtpd_sasl_local_domain - $mydoma1n smtpd_recip1ent_restrictions • permit_sasl_authenticated permi tjnynetworks re jectunaut hdest i nat 1 on и активируйте изменения: # postfix reload Затем убедитесь в том, что Postfix видит новые библиотеки SASL: $ telnet local host 25 Trying 127.0.0.1... Connected to local host.localdomain.
332 Глава 20, Почтовый сервер Postfix Escape character is ,A]\ 220 windbag.test.net ESMTP Postfix (Libranet/GNU) EHLO windbag.test.net 250-windbag.test.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH-LOGIN PLAIN 250-XVERP 250-8BITMIME Нас интересуют только строки STARTTLS и AUTH. Теперь можно переходить к следующему шагу, описанному в разделе 20.9. См. также Описание параметров main.cf в/usr/share/doc/postfix/examples/; описание параметров аутентификации в/use/share/doc/postfix/examples/sample-auth.cf.gz; описание Postfix (/usr/share/doc/postfix/html/index.html). 20.9. Настройка smtp-auth для аутентификации пользователей Проблема Вы хотите организовать аутентификацию пользователей (особенно удаленных) на сервере Postfix, чтобы сервер не использовался для несанкционированных пересылок. Решение Потребуются следующие компоненты: о Cyrus-SASL2; О OpenSSL; О программа Postfix, откомпилированная с поддержкой Cyrus-SASL; О ключи и сертификат сервера. Если поддержка Cyrus-SASL не установлена, обратитесь к разделу 20.7. Когда поддержка SASL будет установлена и успешно заработает, переходите к созданию сертификата сервера SSL. Найдите каталог/ssl/misc и войдите в него: # cd /usr/lib/ssl/misc # Is CA.pl cjinfo cjiarne derchop CA.sh cjiash cissuer demoCA Ключи генерируются сценарием CA.pl (возможно, в каталоге также будет присутствовать сценарий CA.sh — «обертка» для CA.pl, немного расширяющая его функциональность). Выберите один из сценариев и создайте его резервную копию: # ср CA.sh CA.sh-old
20,9. Настройка smtp-auth для аутентификации пользователей 333 Отредактируйте сценарий и вставьте ключ -nodes всюду, где имеется строка $REQ: •newcert) # Создание сертификата $REQ -new -nodes -x509 -keyout newreq.pem -out newreq.pem SDAYS •newreq) # Создание запроса сертификата $REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS RET-*? else echo "Making CA certificate..." $REQ -new -nodes -x509 -keyout ${CATOP}/private/$CAKEY \ -out ${CATOP}/$CACERT $DAYS Мы отказываемся от создания пароля, чтобы его не приходилось вводить при каждом перезапуске сервера, и автоматическая перезагрузка не прервалась бы из-за ожидания ввода пароля. Вы можете пропустить этот этап и использовать пароль; естественно, применение пароля повышает безопасность. Сгенерируйте новый сертификат: # ./CA.sh -newca # ./CA.sh -newreq # ./CA.sh -sign В результате будут сгенерированы файлы newreq.pem, newcert.pem и demoCA/ cacert.pem. Скопируйте их в каталог/etc/postfix: # ср newcert.pem /etc/postfix/ # cp newreq.pem /etc/postfix/ # cp demoCA/cacert.pern /etc/postfix/ Включите следующий фрагмент в /etc/postfix/main.cf: smtpd_use_tls - yes smtpd_t1s_auth_only « yes smtpd~tls"key_file - /etc/postfix/newreq.pem smtpdtls cert__f1le - /etc/postfix/newcert.pem smtpd_tls~CAfiTe - /etc/postfix/cacert.pern smtpd_tls_loglevel - 3 smtpd_tls_received_header - yes smtpd_tls_sessionj:ache_timeout e 3600s tls_random_source - dev:/dev/urandom Активируйте изменения: # postfix reload и протестируйте сервер: $ telnet local host 25 Trying 127.0.0.1... Connected to local host.localdomain. Escaoe character is 'A1' 220 windbag.test.net ESMTP Postfix (Libranet/GNU) EHL0 windbag.test.net 250•windbag.test.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARnLS
334 Глава 20. Почтовый сервер Postfix 250-AUTH LOGIN PLAIN 250.AUTH-L0GIN PLAIN 250-XVERP 250-8BITMIME STARTTLS S: 220 Ready to start TLS Остается лишь настроить почтовых клиентов пользователей. Многие почтовые клиенты позволяют сохранить имя и пароль, поэтому пользователям остается лишь щелкнуть на кнопке отправки почты. Комментарий Установки Postfix почти не зависят от формата пакетов и дистрибутивов Linux, и все же полезно лишний раз проверить все пути в файле /etc/postfix/main.cf. См. также Описание параметров main.cf в/usr/share/doc/postfix/examples/; описание параметров аутентификации в /use/share/doc/postfix/examples/sample-auth.cf.gz. 20.10. Применение smtp-auth для аутентификации Postfix на другом сервере Проблема Требуется организовать пересылку почты с сервера SMTP вашего поставщика услуг Интернета, но для этого необходимы имя и пароль. В вашей системе механизм smtp-auth уже настроен и работает для пользователей. Решение Создайте или отредактируйте файл /etc/postfix/sasLpasswd и сохраните в нем имя и пароль: mall.tuxcomputing.com car1a:sekritword Ограничьте доступ к файлу: # chown root:root /etc/postfix/sa$1j>asswd && chmod 600 /etc/postf1x/sas!_passwd Преобразуйте в хешированный формат DB: # postmap hash:/etc/postfix/sasl_passwd В результате будет создан файл /etc/postfix/sasLpasswd.db. Добавьте в /etc/postfix/main.cf еще одну строку: smtp_saslj>a$swordjnaps - hash:/etc/postf1x/sasl_passwd и активируйте изменения: # postfix reload
20.11. Настройка полного доменного имени 335 Комментарий Файл /etc/postfix/sasl_passwd может содержать несколько записей для разных хостов: шаП .tuxcoraputing.com carla:sekritword smtp.goodeats.com carl a:sekri tword mail.saddles.net horselady:secritword См. также Описание параметров main.cf в/usr/share/doc/postfix/examples/; описание параметров аутентификации в /use/share/doc/postfix/examples/sample-auth.cf.gz; раздел 20.7; раздел 20.9. 20.11. Настройка полного доменного имени Проблема Как настроить полное доменное имя в вашей системе? Вы знаете, что для этого нужно отредактировать несколько файлов, но не совсем уверены, какие это файлы и что в них нужно сохранить. Решение В большинстве разновидностей Linux необходимо отредактировать файлы /etc/ hostname и/etc/hosts. В файле/etc/hostname задается только имя хоста: windbag В файле /etc/hosts задается доменное имя: 127.0.0.1 local host.localdomain local host 192.168.1.5 windbag.test.net windbag В Red Hat и Fedora вместо /etc/hostname редактируется файл /etc/sysconfig/ network: HOSTNAME-windbag Проверка конфигурации производится так: $ hostname windbag $ hostname --fqdn windbag.test.net $ dnsdomainname test.net Чтобы изменения вступили в силу, систему необходимо перезагрузить. Комментарий Содержимое файлов /etc/sysconfig/network и /etc/hostname читается во время загрузки.
336 Глава 20. Почтовый сервер Postfix Вы можете изменить доменное имя в любой момент. Чтобы изменения вступили в силу, достаточно перезагрузить сетевую подсистему. В Debian для этого используется команда # /etc/init.d/networking restart В Red Hat и Fedora команда выглядит так: # /etc/init.d/network restart Тем не менее такое решение нельзя считать абсолютно надежным, потому что некоторые приложения не обновляются перезапуском сетевой подсистемы. Полная перезагрузка надежнее. См. также hosts(5), hostname(l). 20.12. Построение почтового сервера IMAP Проблема Пользователи вашей сети часто перемещаются. Они хотят иметь возможность подключиться к своему почтовому серверу оттуда, где они находятся в данный момент, просмотреть всю свою почту и при этом не беспокоиться о том, что их почта разбросана по разным компьютерам. Решение Одно из возможных решений — создание сервера ШАР. Если вы используете систему на базе RPM (скажем, Fedora) и выполнили рекомендации из раздела 20.2, в вашей системе будет установлен сервер ШАР. Пользователи Debian (см. раздел 20.3) должны установить два дополнительных пакета: # apt_get install courier-imap courier-imap-ssl Сгенерируйте ключ TSL/SSL и запустите сервер: # mkimapdcert # /etc/init.d/courier-imap start # /etc/init.d/courier-imap-ssl start Проверьте имена файлов по сценариям init, поскольку они могут изменяться в зависимости от дистрибутива Linux. Теперь у вас имеется работоспособный сервер ШАР. О подключении пользователей рассказано в разделе 20.13. ВНИМАНИЕ В системе должен работать демон famd, обеспечивающий постоянное обновление каталогов Maildir. Демон famd является стандартным для большинства систем Linux; чтобы проверить, работает ли он в системе, выполните команду ps ax | grep famd.
20.13. Подключение пользователей 337 Комментарий Для реализации этого решения потребуется более мощный компьютер, чем древний Pentium из раздела 20.2. Сервер ШАР требует больших вычислительных мощностей и дискового пространства, чем сервер РОРЗ. Разумеется, этот компьютер не должен использоваться для других целей — он должен быть выделен исключительно под выполнение функций сервера IMАР. Аппаратные требования зависят от нагрузки» поэтому привести точные рекомендации трудно. В общем случае компьютер с процессором lt5 ГГц, 256 Мбайт памяти и 30-гигабайтным жестким диском способен обслуживать 100 пользователей. Обращайте внимание на дисковое пространство, обычно этот ресурс оказывается наиболее критичным. См. также Локальная документация Courier (/usr/share/doc/courier-doc/htmldoc/imapd.html); полный список команд IMAP в RFC 3501; раздел 20.13. 20.13. Подключение пользователей Проблема Итак, сервер заработал — как пользователи должны подключаться к нему? Решение Настройте параметры сервера в почтовых клиентах. Конкретный состав меню зависит от специфики клиента, но во всех клиентах вводятся одни и те же данные: О имя; О пароль; О имя или IP-адрес сервера; О режим шифрования (или его отсутствие); О номер порта на сервере. На рис. 20.1 показано меню настройки Balsa Mail. Многие почтовые клиенты для Linux автоматически распознают шифрование и настраивают порт. Комментарий В Linux существует множество хороших почтовых клиентов: Mutt, Pine, Kmail, Balsa, Mozilla Mail, Evolution, Sylpheed и др. Mozilla Mail хорошо подходит для смешанных сетей, так как программа работает в Linux, Windows и Mac OS X.
338 Глава 20. Почтовый сервер Postfix См. также Mozilla (http://mozilla.org); Thunderbird (http://www.mozilla.org/projects/thunderbird); Kmail (http://kmail.kde.org); Mutt (http://www.mutt.org); Evolution (http:// www.novell.com/products/evolution); Balsa (http://www.newton.cx/balsa); Pine (http:// www.washington.edu/pine); Sylpheed (http://sylpheed-claws.sourceforge.net). j Spelling j-M Modify delete Mai! servers\Add;&ss.Books . M-: Remote Mailbox Servers Type Maiibo&Nerne Ш ■- -.' /■•;;r'":.::'; /'■■■'■'-::-:-" '■•■■ Local Moil :"[/hcmeycarla/Mailcjir Outgoing, Mail ;; ;;Refn6te;SMTP-Sp(yer . User '";~ Pass Phrase Use TLS ■ Ce rtifl с ate Pass "Phrase Srowse,,.i mail .tuxcom p utj n g ,c о m | carle Щ ©Help #£K:';'']'■■* Supply I X Close | _■■■■—,-._■ —--- - „ h „ ,, —p--.-......,..,..-,.—,.-^-,^^ ,,.,■,■„,,,,■,„,.,■„,,,,,,.,,,,,, ,,,,, _,,,_,— Рис. 20.1. Конфигурация Balsa Mail 20.14. Общий доступ к папкам IMAP Проблема Требуется создать общие палки на сервере ШАР, а также предоставить пользователям возможность создавать собственные общие папки.
20.14. Общий доступ к папкам IMAP 339 Решение Используйте команду Courier maildirmake. Сначала создайте общий каталоге ключом -S: # maildirmake -S /var/mai1/sysadmins Затем создайте общую папку (да, это обычный каталог Linux, но в Courier используется термин «папка») с ключом -s. Ключ write разрешает чтение/запись всем желающим: # maildirmake -s write -f reports /var/mail/sysadmins Также можно создать другую папку, доступную только для чтения: # maildirmake -s read -f policies /var/mail/sysadmins Обратите внимание: команда maildirmake создает скрытые каталоги: # Is -a /var/mail/sysadmins . .. .reports .policies cur new tmp Разрешения могут задаваться на уровне отдельных папок, как и в случае с любыми каталогами Linux (в разделе 9.7 рассказано, как настроить разрешения для общих каталогов). Чтобы убрать общую папку, просто удалите ее. Пользователи также могут предоставлять общий доступ к своим папкам. Их общие папки находятся в их домашних каталогах: $ maildirmake --add images=/var/maiVsysadmins $H0ME/Maildir Для отмены общего доступа к каталогу используется ключ —del: $ maildirmake --del images SHOME/Maildir Комментарий Если вам потребуется полноценный сервер коллективного доступа к файлам/электронной почте1, его можно собрать из отдельных компонентов (бесплатных и публикуемых с открытыми текстами). Также существует целый ряд готовых пакетов для рабочих групп — как свободно распространяемых, так и коммерческих. Приведу лишь небольшую подборку: О PHP GroupWare (http://www.phpgroupware.org); О OpenGroupware (http://www.opengroupware.org); О The Kolab Project (http://kolab.org); о SuSE OpenExchange (http://www.suse.com); О SKYRiX Groupware (http://www.skyrix.com); о Novell Linux (http://www.novell.com/linux). См. также maildirmake(l). 1 Groupware/email server. - Примеч. ред.
340 Глава 20. Почтовый сервер Postfix 20.15. Использование виртуальных доменов Postfix Проблема Сервер Postfix должен обслуживать сразу несколько доменов. А может быть, вы хотите отделить системные учетные записи Linux от почтовых учетных записей. Другими словами, вы хотите иметь возможность раздавать пользователям почтовые учетные записи, не создавая для них учетные записи Linux на почтовом сервере. Чем меньше системных учетных записей, тем безопаснее система. Решение Воспользуйтесь виртуальными Заменами Postfix. Это позволит вам создавать виртуальные почтовые ящики без создания системных учетных записей пользователей. Затем введите данные пользователей в файле userdb в Courier (для POP или 1М АР). Сначала включите следующий фрагмент в /etc/postfix/main.cf (подставьте свои имена доменов и каталогов): v1rtual_ma1lbox_domains - tuxcomput1ng.com test.net foober.com virtual mallbox_base e /var/mail/vhosts virtualjnailbox maps « hash:/etc/postfix/vma11 box virtual jninimum_u1d • 1000 virtual_uidjnaps » static:5000 virtualgidjnaps - static:5000 virtual_al1asjnaps = hash:/etc/postfix/virtual Создайте или отредактируйте файл /etc/postfix/vmailbox. В этом файле указываются пары из имен пользователей и их локальных каталогов для хранения почты, которые в данном примере находятся в каталоге/var/mail/vhosts: akkana@tuxcomput1ng.com tuxcomputing.com/akkana/ dancer@tuxcomputi ng.com tuxcomputi ng.com/dancer/ telsa@test.net test.net/telsa/ telsa.gwynne@test.net test.net/telsa/ val.henson@foober.com foober.com/valh/ # Для слана и вирусов @foober.com foober.com/catchall Преобразуйте файл в таблицу поиска Postfix: # postmap /etc/postfix/vmailbox На следующем этапе создаются почтовые учетные записи пользователей. Это делается не в Postfix, а в Courier. Создайте или отредактируйте файл /etc/courier/ userdb, используя следующий формат (обязательно включите символ табуляции после имени и задайте уникальную комбинацию UID/GID): tel sa uid»H00g1dell001 home-/var/ma1l /vhosts/tel sa | shel WMn/bash 11mapww»| pop3pw» В строке не должно быть пробелов. Теперь наступает самая нудная часть: для каждого нового пользователя необходимо сгенерировать новый пароль командой userdbpw. В следующем примере пароль создается с применением хеширования MD5: $ userdbpw -md5 Password:
20.16, Создание списка рассылки с применением couriermlm 341 Reenter password: $l$G41nVriv$G2WaLKidkoVIE2DxMxHBxl Скопируйте полученный код в /etc/courier/userdb: telsa uid-1100gid-11001 home~/var/mai 1 /vhosts/tel sa | shel 1 =/bin/bash | imapww=$l$G 4lnVriv$GzWaLK1dkoVIE2DxMxHBxl|pop3pw-$l$G4lnVriv$GzWaLKidkoVIE2DxMxHBxl He забудьте записать пары «имя/пароль»! Когда все будет готово, остановите authdaemond и преобразуйте/etc/courieruserdb в хешироватшую базу данных: # /etc/init.d/courier-authdaemon stop # makeuserdb Настройте Courier так, чтобы при аутентификации наряду с системными паролями использовался файл /etc/courier/userdb. Для этого в файл /etc/courier/ authdaemonrc включается строка authmodulelistes"authuserdb" "authpam" Наконец, перезапустите authdaemonrc: # /etc/init.d/courier-authdaemon start Теперь пользователи MoiyT изменить конфигурацию своих почтовых клиентов, а ваша работа закончена. Комментарий Если количество доменов велико, перечислите их в текстовом файле (по одному домену на строку) и включите в директиву virtual_maUbox_domains имя этого файла: virtualjnallboxdomains - /etc/postfix/virtual domains 20.16. Создание списка рассылки с применением couriermlm Проблема Требуется создать списки рассылки на сервере Postfix/Courier. Решение Вам потребуются программы couriermlm (Courier Mailing List Manager), dot-courier и cron. Пользователь может создать список в любом катан ore, в который ему разрешена запись. Возможно, каталоги списков для пользователей стоит создать за пределами их домашних каталогов — например, в /var. Создание каталога для нового списка рассылки выполняется следующей командой: $ couriermlm create /var/lists/phpjist ADDRESS=php@test.net Команда создает каталог, содержащий множество шаблонов и подкаталогов: $ Is -xa phpjist adnrinrequest.tmpl archive bounces commands confsubj.tmpl digestsubj.tmpl
342 Глава 20. Почтовый сервер Postfix fetch.tmpl fetchsubj.tmpl headeradd help.tmpl i dxheader2htm1.tmpl 1dxheaderhtml.tmpl idxheadertxt.tmpl idxsubject.tmpl Прочитайте следующие файлы шаблонов и отредактируйте их по мере необходимости: О help.html — сообщение, отправляемое Courier в ответ на запрос помощи; О sub.tmpl — подписка проводится в два этапа и требует подтверждения. Шаблон sub.tmpl содержит первый ответ на запрос о подписке; О headeradd — дополнительные почтовые заголовки, которые должны присутствовать в сообщениях списка; О headerdel — удаляемые почтовые заголовки. Если вы ведете общедоступный список рассылки и не хотите предоставлять личные адреса подписчиков спамерам, используйте headerdel в сочетании с headeradd: # headerdel Reply-To: From: # headeradd Reply-To:php@test.net From:php@test.net Настройте /etc/crontab: # m h dom mon dow user command Gmidnight allce couriermlm daily /var/l1sts/php_!1st ^hourly alice couriermlm hourly /var/lists/phpjist Напоследок создайте несколько файлов dot-courier для отправки административных сообщений нужному пользователю. Эти файлы должны находиться в домашнем каталоге администратора списка. В нашем примере список php@test.net администрируется пользователем valorie. Сначала valorie создает /home/valorie/ .courier-php, в котором хранится информация о местонахождении списка: /usr/bin/couriermlm msg /var/lists/phpjist Далее следует файл /home/valorie/.courier-php-owner: valorie@test.net И файл /home/valorie/-courier-php-default: /usr/bin/couriermlm ctlmsg /var/lists/phpjist Комментарий Пользователи списка используют следующие команды в формате список-коман- Оа@домеп: php-help@test.net php-subscri be@test.net php-unsubscri beGtest.net Файлы dot-courier обеспечивают пересылку запросов нужному пользователю. См. также courier(8), dot-dourier(5).
Глава 21 Борьба со спамом и вредоносными программами 21.1. Введение Даже самые замечательные человеческие изобретения не защищены от идиотов, которые обращают его во вред окружающим. Общим термином вредоносные программы (malware) обозначаются вирусы, тро- яны, черви, вредные фрагменты исполняемого кода на веб-страницах и прочая гадость, способная заразить систему из почтового клиента или браузера. В настоящее время это означает в первую очередь Outlook, Outlook Express и Internet Explorer. Удаление этих программ из системы Windows заметно повышает ее безопасность. В настоящей главе рассматриваются средства борьбы со спамом и вирусами для вашего сервера Postfix: Clam Anti-Virus, SpamAssassin, черные списки DNS и белые списки. Проследите за тем, чтобы каждый продукт использовался в своей новейшей версии — особенно Postfix, который должен иметь версию 2.0 и выше. Существуют три способа ограничения входящей почты. 1. Ограничения SMTPD. 2. Проверка заголовков/тела сообщений. 3. Фильтры содержимого. Чем дальше вы заходите по этой цепочке, тем больше нагрузка на сервер. Существуют пределы того, что можно эффективно сделать на каждом уровне. Потратьте немного времени, настройте защитные механизмы своей системы и добейтесь того, чтобы они работали так, как требуется. Основная стратегия выглядит так: О защита пропускной способности канала; О защита почтового сервера от перегрузки; О защита прокси-серверов и почтовых серверов от использования для пересылки спама; О защита системы от превращения в источник заражения.
344 Глава 21. Борьба со спамом и вредоносными программами Последняя составляющая — самая важная. Никого не волнует, что творится в вашей системе, лишь бы она не распространяла заразу в Интернете. Чтобы сократить уровень «мусора» в почтовых ящиках до разумных пределов, приходится прикладывать несообразно много усилий. Но если в сети работают хосты Windows, делать это все равно придется. Нужно ли делать все это, если в сети нет хостов Windows? Наверное, без Clam Anti-Virus можно обойтись, хотя если программа будет работать, это никому не повредит. Не стоит полагать, будто система Linux защищена от атак, хотя атаки вирусов, распространяемых с электронной почтой, крайне маловероятны. Атаки в Linux обычно производятся с «черного хода»: нападающий должен найти способ получения доступа к системе, а затем получить достаточно привилегий для причинения вреда. По умол чанию в Linux используется открытие сообщений в режиме документа, так что даже если почтовый клиент будет ассоциировать типы файлов с приложениями, активировать исполняемый код прямо из сообщения все равно не удастся. Но даже если рядовой пользователь постарается активировать вредное вложение, сохранив его в каталоге, выполнив команду chmod +x и запустив его, для нанесения сколько-нибудь значительного вреда ему все равно потребуются привилегии root. Более того, даже если почтовый вирус Linux сможет установиться в системе и распространиться для заражения других хостов, эпидемия быстро угаснет. Просто такой вирус не найдет радушного приема (в отличие от вирусов Windows). И все же осторожность не бывает лишней. Как обычно, очень важно соблюдать основные правила безопасности: О используйте минимальный уровень привилегий, необходимый для выполнения операции. Не используйте привилегии root всуе; О помните об эффективности сильных паролей; О держите sudo под контролем; О будьте осторожны с правами владения и разрешениями. См. также Virus Library (http://www.viruslibrary.com); Security Focus (http://www.securityfocus. com); The SANS (SysAdmin, Audit, Network, Security) Institute (http://www.sans.org). 21.2. Первоочередные меры по защите от спама и вредоносных программ Проблема Вы администрируете смешанную локальную сеть с клиентами Windows, Linux, а возможно, и другими платформами. Вас в большей степени беспокоят компьютеры с системой Windows. Как бы вам ни хотелось запереть их в «карантин» и заблокировать доступ к сети, чтобы защитить остальные компьютеры, это невозможно. Как защитить локальную сеть от заражения?
21.3. Тестирование средств борьбы со спамом в Postfix 345 Решение Начните с компьютеров Windows. Удалите: О Outlook; О Outlook Express; О Internet Explorer. Замените их бесплатными почтовыми клиентами (Eudora, Pegasus, Mozilla Mail, Netscape Mail, Opera Mail) и браузерами (Opera, Mozilla, Netscape, Firefox). Основные цели атак вредоносных программ устранены, теперь можно действовать дальше. Комментарий Заблокировать Outlook/Outlook Express/Internet Explorer теоретически возможно, но по моему мнению, это слишком рискованно. Если все, что вам нужно, — это почтовый клиент и веб-браузер, существует множество первоклассных альтернатив. IE уступает другим браузерам по функциональности, так что вы даже не получаете компенсации за возросший риск. Если вы хотите выбрать единый браузер или почтовый клиент, долго искать не придется. Mozilla обладает полноценной функциональностью, работает в Windows, OS X, Linux, OS/2, Solaris, HPUX, AIX и на многих других платформах. См. также Глава 20; Securing Outlook, Part One: Initial Configuration (http://www.securi- tyfocus.com/infocus/1648); Securing Outlook, Part Two: Many Choices to Make (http://www.securityfocus.com/infocus/1652). 21.3. Тестирование средств борьбы со спамом в Postfix Проблема Вам хотелось бы по возможности блокировать лишний трафик на уровне SMTP, чтобы снизить нагрузку на сервер. Для этого необходимо протестировать новые средства борьбы со спамом в Postfix, но вас беспокоит возможность потери нужных сообщений. Решение В Postfix существует два режима отключения «рикошета» сообщений при тестировании: глобальный и конфигурационный. Чтобы запретить отказы глобально, включите следующую строку в /etc/postfix/main.cf: soft_bounce - yes
346 Глава 21. Борьба со спамом и вредоносными программами Чтобы уточнить настройку для отдельных конфигурационных параметров, используйте квалификатор warn Jf_reject: smtpd_recipient_restrictions s reject_i rival id_hostnarae. re ject _non_f qdn hostname. warni f_re ject re ject_non_fqdnsender, Следите за журналами — Postfix заносит предупреждение в журнал, но доставляет сообщение. После внесения изменений в main.cf всегда выполняйте команду postfix reload. Комментарий Чтение журналов Postfix входит в обязанности администраторов почтовых систем, особенно на стадии тестирования. Подавление нежелательного трафика на уровне SMTP эффективно, но не защищено от ошибок, поскольку в мире существует немало некорректно работающих или неверно настроенных почтовых серверов. Нельзя исключать вероятность того, что будет отвергнута нужная почта, так что внимательно следите за происходящими событиями. Приведу простое, легко адаптируемое регулярное выражение для поиска конкретных сообщений: # едгер Чreject|warning|error|fatal|panic):' /var/log/maillog См. также RFC 2821; файл Postfix SMTPD_ACCESS_README; access(5). 21.4. Настройка антиспамовых ограничений в Postfix Проблема Требуется блокировать как можно больше спама на уровне SMTP, чтобы снизить нагрузку на сервер. Решение Включите следующие директивы (полиостью или частично) в файл /etc/postfix/ main.cf: smtpd_helo_required e yes disable_vrfy_command « yes smtpd_recip1ent_rest Met ions - reject_inva11d_hostname. reject_non_fqdri hostname, reject_non_fqdn_sender. re jectjrcnf qdnreci pi ent. reject_unknown_sender jiomaln. reject jjnknown_recipi entjiomai n.
21.5. Создание белых списков 347 reject_unauth_pipelining, permi tjnynetworks. perml t j-maut hdest 1 nat i on После внесения изменений в main.cf всегда выполняйте команду postfix reload. Последние три строки безопасны, поэтому они используются всегда. Но остальные директивы не являются обязательными. Они отклоняют не только спам, но и почту с неправильно настроенных серверов, которые попадаются чаще, чем хотелось бы. Смысл всех директив объясняется в документе «Postfix Configuration — UCE Controls» (http://www.postfix.org/uce.html). Комментарий Представленные директивы поддерживаются в Postfix версии 2.0 и выше; в версии 1.x используется другой синтаксис. Очень важно обновить Postfix до последней стабильной версии, чтобы в программу были включены все обновления безопасности и производительности. См. также RFC 2821; раздел 21.3; «Postfix Configuration — UCE Controls» (http://www.postfix.org/ uce.html); файл Postfix SMTPD_ACCESS_README; access(5). 21.5. Создание белых списков Проблема Вы беспокоитесь, что из-за настройки всевозможных почтовых фильтров и антивирусных сканеров будет потеряна нужная почта. Как гарантировать прохождение желательных сообщений? Решение В Postfix эта задача решается при помощи файлов тар и директивы smtpd_sender_ restriction в файле/etc/postfix/main.cf. Перечислите нужные адреса в простом текстовом файле, по одному адресу на строку: myf г iend@raypal.com ОК myotherfriend@thatp1ace.com ОК mychum@techies.net ОК В данном примере текстовому файлу было присвоено имя /etc/postfix/whitelist. Теперь преобразуйте его в индексированную базу данных: # postmap /etc/postfix/whitelist Включите следующую строку в /etc/postfix/main.cf: smtpd senderrestrictions - check_sender_address hash:/etc/postfix/whitelist
348 Глава 21. Борьба со спамом и вредоносными программами Postfix поддерживает три формата базы данных. Чтобы узнать, какой тип используется в вашей системе, выполните команду $ postconf | grep databasej.ype default_database_type e hash Комментарий Файлы баз данных Postfix хранятся в одном из трех форматов: hash, btree или dbm. Файлы hash и btree имеют расширение .db. Базы данных dbm состоят из двух файлов, .рад и .dir. Обычно по умолчанию в Linux используется формат hash. Определение «белых списков» адресов должно стать первым шагом при настройке любой фильтрации почты. Тем самым вы гарантируете, что почта от нужных вам людей или доменов не будет ошибочно отвергнута. Формат белого списка основан на файле /etc/postfix/access. Директива check. sender_access сравнивает содержимое белого списка с командой MAIL FROM во время транзакции SMTP (конечно, команда может быть сфальсифицирована, но проверка все равно полезная). В следующем примере продемонстрированы три формата выбора адресов: О вся почта от одного пользователя по одному адресу: myfriend@mypal.com; О вся почта от одного домена: wanteddomain.com; О вся почта от домена, включая субдомены (обратите внимание на начальную точку): .wanteddomain.com; О вся почта от одного пользователя из любого домена: mychum@. OK означает, что сообщение должно быть принято. См. также RFC 2821; раздел 21.3; файл Postfix SMTPD_ACCESS_README; access(5). 21.6. Использование черных списков DNS Проблема Такое впечатление, что вся почта, получаемая от некоторого поставщика (и даже целой страны), не содержит ничего, кроме спама. В системе настроены белые списки, i i вы хотите избавиться от «мусора», потратив как можно меньше системных ресурсов. Решение В Postfix это делается просто. Включите черный список DNS (DNSRBL, DNS Black Hole List) в файл main.cf, в директиву smtpd_reripient_restrictions: smtpdrecipientrestrictions e reject_rbl_cli ent rel ays.ordb.org. rejectrbl _client 1ist.dsbl.org. reject_rbl_c!1ent sbl.spamhaus.org,
21.6. Использование черных списков DNS 349 Эти записи должны быть последними в директиве smtpd_recipient_restrictions, если в ней имеются другие записи. Список smtpd_recipient_restrictions обрабатывается последовательно, поэтому белые списки и другие проверки должны выполняться в первую очередь, чтобы нужная почта заведомо дошла до получателей. Комментарий Выбор DNSRBL — процесс, которому стоит уделить немного времени. Прочитайте описания политик и почитайте пользовательские форумы. Каждая сдужба руководствуется своими критериями включения и исключения нарушителей. Open Relay Database (http://www.ordb.org) надежна; Spamhaus и Spamcop консервативны; SPEWS (Spam Prevention Early Warning System) — самая жесткая и неумолимая. Существует много других ресурсов подобной направленности; начните поиски с этих трех, а в остальном вам поможет Google. He надейтесь заблокировать весь спам при помощи списков блокировки, это всего лишь один из инструментов в вашем арсенале. Преимуществом DNSRBL следует считать то, что отклонение трафика на уровне SMTP создает наименьшую нагрузку на сервер. Потоки спама нарушали работу многих серверов и даже использовались как DoS-атаки (Denial-of-Service). Раннее отклонение сохраняет пропускную способность канала и системные ресурсы. С другой стороны, эта мера радикальная — вы можете потерять нужную почту. В общих чертах списки DNSRBL работают по следующему принципу. В зависимости от критериев, установленных создателями DNSRBL, отдельные IP-адреса или целые сетевые блоки включаются в список блокировки. Идея заключается не только в блокировке спамерского трафика, потому что отфильтровать только спам на уровне IP невозможно (более того, это невозможно сделать на любом уровне). Спамеры покупают целые блоки IP-адресов, а затем переключаются между блоками. DNSRBL преследует две цели: заблокировать ненужный трафик и оказать давление на поставщиков, заставляя их избавиться от спамеров. Списки блокировки эффективно работают в обоих отношениях. Если бы не они, ситуация со спамом была бы еще хуже, чем сейчас. К сожалению, эффективность DNSRBL снижается широким распространением компьютеров с незащищенной системой Windows. В распоряжении спамеров появляется огромный, распределенный пул посредников рассылки, что усложняет блокировку спама на любом уровне. Если в вашей организации ожидается поступление сторонней почты (например, если на веб-сайте опубликованы контактные данные для потенциальных клиентов), не используйте списки блокировки. В таких ситуациях лучше прибегнуть к услугам SpamAssassin (см. разделы 21.9 и 21.10). Спамеры и поставщики сетевых услуг, пострадавшие от DNSRBL, поднимают шум, называют это нарушением свободы слова и несут прочую чушь. Тем не менее на своем сервере вы устанавливаете правила, и они не имеют права нарушать границы ваших владений. См. также Файл Postfix SMTPD JVCCESS_README и access(5); The Spamhaus Project (http:// www.spamhaus.org); SPEWS (http://spews.org); Spamcop (http://www.spamcop.net); Open Relay Database (http://www.ordb.org).
350 Глава 21. Борьба со спамом и вредоносными программами 21.7. Блокировка сообщений с вложениями Проблема Требуется заблокировать сообщения с некоторыми видами вложений на уровне SMTP. Решение Используйте следующее регулярное выражение: # Одна неразрывная строка /f1lename-\H?(.*)\.(bat|cmd|com|dot|exe|hta|scr|p1f|vbe|vbs)\"?$/ REJECT keep your malware off my network # Одна неразрывная строка r\s*Content-(Disposition|Type).*name\s**\s*,,?(.+\ .(asd|hlp|ocx[reg|bat[cCho]m[cmd|exe|vxcl|p1f|scr|hta|jse?|sh[mbs]|vb[esx]|ws [fh]|))"?\s*$/ REJECT Attachments that contain or end in "$3" are prohibited on this server. "12" 1$ the name of the rejected file Поместите этот фрагмент в файл и назовите ero/etc/postfix/mime_header_checks. Затем включите в main.cf следующую директиву: mime_header_checks - regexp:/etc/postf1x/mime_header_checks Не забудьте выполнить команду postfix reload после изменения maiLcf. Отредактируйте список типов файлов, исходя из своих потребностей. В приведенном примере не включены форматы файлов Microsoft Office .xls, .xlk, .doc, .wdb, .wri, .wrs, .ppt и т.д.; возможно, вы захотите добавить некоторые из них. Комментарий Чтобы заблокировать все сообщения с вложениями, достаточно одного регулярного выражения: /filename-V7 REJECT all messages with attachments are rejected Помните, что при этом также будут заблокированы сообщения VCard, сообщения с вложенными подписями GPG, сообщения HTML с вложенной графикой, а также сообщения Outlook/Outlook Express в формате MS-TNEF (впрочем, этот формат бесполезен для тех, кто не работает с Outlook/Outlook Express, поскольку он является закрытым). Почему в списке перечислены только типы файлов М icrosoft? Это ваше личное дело — укажите любые файлы, которые сочтете нужным. Хотя вряд ли кто- нибудь станет спорить с тем, что по части теплого, радушного отношения к вредоносным профаммам, полученным по электронной почте, у Windows нет равных. См. также Файл Postfix SMTPD_ACCESS_README и access(5); «Unsafe File List» в Microsoft Knowledge Base Article 291369.
21.8. Настройка Clam Anti-Virus на сервере Postfix 351 21.8. Настройка Clam Anti-Virus на сервере Postfix Проблема Требуется установить иа почтовом сервере Postfix хорошую антивирусную программу, которая бы автоматически сканировала всю входящую почту и блокировала зараженные сообщения. Решение Используйте Clam Anti-Virus и Amavisd-new на сервере Postfix. Amavisd-new — «обертка» Perl, выполняющая функции посредника для управления потоком сообщения между Clam AV и Postfix. Сама по себе программа Clam AV не может напрямую сканировать входящие сообщения. Обратите внимание: это решение принципиально отличается от предыдущих, в которых описывалась настройка аитиспамовых ограничений и белых списков в Postfix. В данном случае работу будет выполнять Amavisd-new, а не Postfix. Пользователям систем на базе RPM понадобятся пакеты clamav и amavisd-new, а пользователям Debian — пакеты amavisd-new, clamav, clamav-base, clamav-daemon и clamav-freshclam. Прежде чем вносить какие-либо изменения, создайте резервную копию конфигурационных файлов. Затем переходите к настройке Amavisd-new. Создайте файл /var/log/amavis.log; назначьте его владельцем пользователя и группу amavis, которые должны быть созданы системой управления пакетами. Отредактируйте файл/etc/amavis/amavisd.conf. В секции 1 присвойте значения переменным $mydomain и $myhostname и раскомментируйте следующие строки: Sforwardjnethod - 'smtp:127.0.0.1:10025': # Для пересылки проверенной почты $notifyjnethod e $forward_method; # Для отправки оповещений Отключите карантинную блокировку вирусов в секции 4, потому что сообщения, зараженные вирусами, будут отвергаться на уровне SMTP. Нет смысла сохранять их, ведь подавляющее большинство таких сообщений генерируется автоматически и имеет поддельные обратные адреса. SQUARANTINEOIR = undef: $virus_quarantine_to e undef: Также в секции 4 отключите автоматическое оповещение отправителя. Как правило, обратный адрес является фиктивным; бессмысленно посылать по нему сообщения «Эй, вы отправили мне вирус!» Следующая директива отвергает зараженные сообщения без каких-либо оповещений: $final_virus_destiny - DJISCARD: # (По унолчанию D_B0UNCE) Теперь найдите секцию 7 и раскомментируйте подсекцию Clam AV. Закомментируйте все вирусные сканеры, не используемые в вашей системе: Ш http://www.clamav.net/ ['Clam Antivirus-clamd'. \&ask_daemon. [TONTSCAN {}\n\ "/var/run/clamav/clamd.ctl"].
352 Глава 21. Борьба со спамом и вредоносными программами qr/\bOK$.qr/\bFOUND$/. qr/\*?: (?!Infected archive)(.*) F0UND$/ ]. Остановите Amavisd-new и проверьте конфигурацию встроенным отладчиком: # /etc/init.d/amavis stop # amavis debug Команда выводит сводное описание конфигурации; вас интересуют только сообщения об ошибках. Теперь снова запустите Amavisd-new, подключитесь через telnet и убедитесь в том, что Amavisd-new работает: # /etc/init.d/amavis start $ telnet 127.0.0.1 10024 Trying 127.0.01... Connected to 127.0.0.1 Escape character 1s ,A]' 270 [127.0.0.1] ESMTP amavisd-new service ready Amavisd-new работает, выходите из telnet: A] telnet> quit Connection closed. Теперь настройте Postfix для использования программы Amavisd-new, которая теперь будет выполнять функции прокси-сервера SMTP. Включите следующий фрагмент в конец файла /etc/postfix/master.cf: smtp-amavis unix • • n • 2 smtp -o smtp_data_donejtimeoute1200 •o disable_dns_lookups«yes 127.0.0.1:10025 inet n - n • - smtpd •o content_filter* -o receive_override__options=no_unknown_recipient_checks.no_header_body_checks -o locaWecipientjnaps^ •o relay_/ecipient_maps- -o smtpdrestrictionclasses» •o smtpdclientrestrictions- -o smtpd_helo_restrictions« •o smtpdsenderrestrlctions* •o smtpd_recipient_restrictionsepermit_mynetworks.reject -o mynetworks-127.0.0.0/8 •o smtpd_authorized_xforward hosts=127.0.0.0/8 •o strict_rfc821_envelopeseyes Включите следующую строку в /etc/postfix/main.cf: content_filter = smtp-amavis:[127.0.0.1]:10024 Перезапустите Postfix: # /etc/init.d/postfix stop # /etc/init.d/postfix start Назначьте пол ьзователя amavis владельцем Clam AV, иначе программа работать не будет. Сначала откройте файлы /etc/clamav/clamav.conf и /etc/amavis/amavisd.conf и убедитесь в том, что amavisd.conf содержит ссылку на файл LocalSocket # /etc/clamav/clamav.conf LocalSocket /var/run/clamav/clamd.ctl # /etc/amavis/amavisd.conf ## http://www.clamav.net/
21.8. Настройка Clam Anti-Virus на сервере Postfix 353 ['Clam Antivirus-clamcT. \&ask_daemon,["CONTSCAN {}\n\ Vvar/run/clamav/clamd.ctr]. qr/\bOK$/. qr/\bF0UND$/. qr/A.*?: (?!Infected ArchiveM.*) FOUNDS/ ]. Теперь пользователь amavis назначается владельцем всех каталогов, используемых Clam AV. В нашем примере это каталоги: О /var/log/clamav (файл clamav.log); о /var/run/clamav (файл clamd.pid); О /var/lib/clamav (каталог базы данных). Пример: # chown -R amavis:amavis /var/log/clamav/ Будьте внимательны! Изменяйте только те каталоги, которые принадлежат исключительно Clam AV; все файлы в общих каталогах должны настраиваться по отдельности. Теперь откройте /etc/clamav/freshclam.conf и проделайте то же самое с каталогами, перечисленными в этом файле. Наконец, найдите файлы, принадлежащие Clam AV, в каталоге/etc/logrotate.d/. Например: о /etc/logrotate.d/clamav-daemon; о /etc/logrotate.d/clamav-freshclam. Имена файлов могут быть другими. Найдите в каждом файле строку create 640 clamav adm и приведите ее к виду create 640 clamav amavis Сохраните изменения и перезапустите как clamd, так и freshclam. В Debian это делается командами # /etc/init.d/clamav-daemon reload # /etc/init.d/freshclam reload В Red Hat и Fedora соответствующие команды выглядят так: # /etc/init.d/clamd reload # /etc/init.d/freshclam reload Комментарий Установка из пакетов (вместо сборки по исходным текстам) сэкономит вам массу времени. Если вы обязательно должны компилировать программу самостоятельно, прочитайте всю документацию. Всех пользователей, каталоги и сценарии init вам придется создавать вручную. Два основных компонента Clam AV — clamd, демон сканирования, и freshclam, модуль автоматической подгрузки обновлений баз данных вирусов. Их настройка задается в файлах /etc/clamav/clamav.conf и /etc/clamav/freshclam.conf соответственно. См. также Файл Postfix FILTER_README; локальная документация Amavisd-new (/usr/ share/doc/amavisd-new,amavisd-new(8)H/usr/share/doc/amavisd-new.README.postfix);
354 Глава 21. Борьба со спамом и вредоносными программами локальная документация Clam AV (/usr/share/doc/clamav); Clam Anti-Vims (http:// www.clamav.net); Amavisd-new (http://www.ijs.si/software/amavisd). 21.9. Настройка SpamAssassin в Postfix Проблема Блокировка спама на уровне SMTP полезна и эффективна, но ее возможности офаничены. Требуется использовать программу, которая бы уничтожала спам, не требуя постоянного наблюдения и настройки. Программа должна интегрироваться в существующую конфигурацию Postfix/Amavisd-new/Clam AV. Решение SpamAssassin — именно то, что вам нужно. Поскольку SpamAssassin будет устанавливаться в системе с программой Amavisd-new, выполняющей функции прокси-сервера SMTP, вы устанавливаете SpamAssassin, а затем настраиваете параметры в/etc/amavis/amavisd.conf. Файл /etc/SpamAssassin/locaLcf не понадобится. Установите SpamAssassin и переходите к редактированию/etc/amavis/amavisd.conf. В секции 1 закомментируйте строку @bypas$_spamj:hecks_acl - qw( . ); В секции 4 указывается, как Amavis-d следует поступать с сообщениями, помеченными как спам. Следующий параметр доставляет их получателям: $final_$pam_de$t1ny = D_PASS: # (по умолчанию 0_REJECT) Значение DJISCARD уничтожает такие сообщения на сервере без оповещения отправителя: $final_$pam_dest1ny - DJDISCARD: # (По умолчанию D_REJECT) В разделе 7 задается конфигурация SpamAssassin: $sa_tag_level_deflt - -999: $sa_tag2Jevel_deflt «5.0: $sa_killjeveljlem « -999: # Строка, включаемая в начало заголовка Subject, если сообщение # превышает уровень tag2 $sa_spara_subject_tag - '***SPAM*** '; Наконец, владельцем файлов SpamAssassin должен быть пользователь amavis: # chown -R amavis:amavis /usr/share/spamassassin Комментарий Вы сами решаете, как поступить со спамом — уничтожить его на сервере или переслать пользователям. Если разрешить доставку, пользователи смогут легко настроить фильтры в своих почтовых клиентах по строке ***SPAM*** и направить спам туда, куда сочтут нужным. Третий вариант — отвергнуть спам и отправить уведомление 5хх о недоставленном сообщении: $final_spamjlestiny « 0_REJECT
21.9. Настройка SpamAssassin в Postfix 355 В принципе такое поведение считается правильным для почтового агента, но я не понимаю, зачем тратить пропускную способность канала на сообщения SMTP с фальшивыми адресами только для соблюдения протокола. Четвертый и однозначно худший вариант — возврат сообщения. Поскольку подавляющее большинство спамеров использует фальшивые обратные адреса, а ничтожное меньшинство с «честными» обратными адресами попросту проигнорирует ваши сообщения, не стоит тратить ресурсы канала и захламлять Интернет. См. также The SpamAssassin Wiki (http://wiki.apache.org/spamassassin/FrontPage); локальная документация Amavisd-new (/usr/share/doc/amavisd-new, amavisd-new(8) и /usr/ share/doc/amavisd-new.README.postfix).
Глава 22 Веб-сервер Apache 22.1. Введение В этой главе рассматривается Apache версии 2.0. Самый распространенный сервер HTTP в мире — Apache 1.3 — надежен, безопасен и исключительно хорошо документирован... настолько хорошо, что я не стану пересказывать общеизвестные факты. Apache 2.0 существенно усовершенствован по сравнению с 1.3; новая версия содержит многочисленные изменения и улучшения, а также лете настраивается. Если вы планируете создать веб-сайт, прежде всего необходимо решить, в какой операционной системе он будет работать. Apache работает в Windows, Unix, OS/2 и даже в BeOS. Поскольку книга посвящена Linux, логично предположить, что вы будете использовать Apache для Linux. С остальными решениями дело обстоит сложнее. О Какую версию Apache использовать — 1.3 или 2.x? О Как устанавливать программу — в виде пакетов или строить по исходным текстам? О Организовывать хостинг самостоятельно или использовать услуги поставщика? Apache 1.3 или Apache 2.x? Оба варианта хороши, так что принять решение будет нелегко. Apache 1.3 надежен, как скала, хорошо поддерживается и отлично документирован. Программа обладает бесконечными возможностями расширения и настройки за счет установки дополнительных модулей. Поговорка «Лучшее — враг хорошего» остается актуальной, особенно в компьютерных отраслях. С другой стороны, Apache 2 заметно отличается от Apache 1.3 по архитектуре. Apache 2 работает быстрее, эффективнее и гораздо лучше масштабируется. Правда, модули 1.3 не работают в 2.0 без перекомпиляции, а в некоторых случаях — без написания заново. К счастью, программа существует уже достаточно давно, и для нее существует множество полезных модулей, готовых к работе. В будущем ситуация
22.1. Введение 357 будет только улучшаться, поскольку усилия разработчиков будут в большей степени направляться на версию 2.0. На момент написания книги серьезные проблемы оставались только с модулем РНР. Разработчики РНР предупреждают, что РНР не следует использовать с Apache 2.0 в условиях коммерческой эксплуатации систем, но возможно, когда вы будете читать эту книгу, работа над РНР 5 уже будет закончена. Если вы собираетесь ограничиться только статическими страницами, РНР не понадобится, но если вы намерены генерировать динамический контент и строить веб-приложения — РНР станет хорошей альтернативой для Perl, поскольку этот сценарный язык был разработан специально для веб-программирования. За информацией обращайтесь на сайт http://us3.php.net. Исходные тексты или пакеты? Установка из пакета выполняется быстрее, но в вашем распоряжении будут лишь те возможности, которые счел нужным вам предоставить автор пакета. Однако этот вариант нельзя назвать самым простым — в разных дистрибутивах используются разные имена файлов и пакетов. Чтобы разобраться в документации Apache, вам придется вычислить все различия. Установка по исходным текстам требует чуть больших усилий: вы должны вручную создать стартовый сценарий, создать владельца и группу Apache, а также задать все параметры компиляции, включая местонахождение файлов. За это вы сможете точно определить конфигурацию сервера. Кроме того, при использовании Apache 2.0 вам уже не придется перекомпилировать двоичный файл для того, чтобы добавить или удалить модуль. К числу новых возможностей версии 2 принадлежат объекты DSO (Dynamic Shared Objects), которые являются аналогами загружаемых модулей ядра. Просто добавьте или удалите нужные модули, не трогая двоичного файла httpd. Самостоятельный хостинг или услуги? Существует несколько вариантов организации хостинга. Во-первых, можно создать веб-сервер на физическом компьютере (скажем, находящемся у вас дома или в офисе). Преимуществами этого варианта являются удобство и полный контроль — если что-то пойдет не так, вы сможете немедленно исправить ситуацию. С другой стороны, вам также придется решать все проблемы с сопровождением, безопасностью и обслуживанием. А если подключение к Интернету перестанет работать, вам придется лично обращаться к вышестоящему поставщику. Впрочем, главным недостатком все же является высокая стоимость скоростных каналов. Другой вариант — использование коммерческих услуг веб-хостинга. За ежемесячную плату в вашем распоряжении оказываются ресурсы (дисковое пространство, пропускная способность канала и функциональность) общего сервера. Такой вариант может оказаться вполне приличным, если найти качественного поставщика. Как правило, коммерческий хостинг включает массу функций: FTP, MySQL, РНР, CGI, Perl, POP/ШАР, SpamAssassin и т. д. Не ищите самый дешевый вариант — в общем случае вы получаете ровно то, за что заплатили. Не верьте утверждениям о «неограниченной пропускной способности» и прочей чуши.
358 Глава 22. Веб-сервер Apache Третий вариант — аренда оборудования и подключения в коммерческом вычислительном центре с самостоятельной установкой и сопровождением программного обеспечения. Это позволит сэкономить на канале, поскольку вы будете использовать общую линию. Хороший центр обеспечивает бесперебойное электропитание, резервные интернет-каналы и хорошую физическую безопасность. Специалисты следят за использованием канала и серверов и не прощают «пожирания ресурсов» и других злоупотреблений. Помните: чем больше вы хотите, тем дороже это будет стоить — бесплатный сыр бывает только в мышеловке. К предложениям из разряда «слишком хорошо, чтобы быть правдой» стоит относиться с подозрением. 22.2. Установка Apache 2.0 по исходным текстам Проблема Требуется установить Apache 2.0 по исходным текстам, чтобы сервер был настроен именно так, как вам нужно. Для этого необходимо знать параметры configure и состав доступных модулей. Также вам хотелось бы использовать объекты DSO (Dynamic Shared Objects), чтобы модули можно было добавлять и удалять без перекомпиляции двоичного файла httpd. Решение Установка Apache 2.0 выполняется в стандартной последовательности configure- make-make install. Из-за большого количества параметров компиляции вам придется потратить немного времени на выбор тех возможностей, которые вам нужны. Также необходимо знать, какие значения используются по умолчанию. В следующем примере представлена типичная установка. Для начала загрузите и распакуйте tar-архив Apache (на момент написания книги последней стабильной версией была версия 2.0.50). Постройте список всех файлов в системе: # find / | grep -v -e Vproc/ -e A/tmp/ -e */dev/ > apache2-preinstal1.list Также можно сгенерировать аналогичный список после установки программы, чтобы сравнить два списка командой diff и определить состав установленных файлов. Перейдите в каталог, в который был распакован архив, и выведите описания всех параметров конфигурации: # ./configure —help | less По умолчанию все файлы размещаются в/usr/local/apache2. В нашей конфигурации будет использовано несколько стандартных каталогов, а стандартный набор модулей будет слегка изменен: # ./configure --prefixe/etc/httpd \ --exec-prefix-/usr \ --bindir-/usr/bin \
22.2. Установка Apache 2.0 по исходным текстам 359 --$bindir=/usr/sbin \ --mandir-/usr/share/man \ --sysconfdir»/etc/httpd/conf \ -Hncludedir-/usr/include/httpd \ --1ibexecdi r=/usr/l1b/httpd/modules \ --datadir«/var/www/ \ --with-mpm-prefork \ --enable-mods-shared="rewrite" \ --disable-cgi Запустите make и make install: # make # make install Сгенерируйте новый список файлов после установки: # find / | grep -v -е A/proc/ -e *7tmp/ -е A/dev/ > apache2-post1nstall .list Запустите Apache: # apachectl start Откройте веб-страницу по умолчанию; для этого в браузере вводится адрес http://localhost. Примерный вид страницы показан на рис. 22.1. " $:Q -fcj;t#it ti%*t&j№№mi&ipim - кюветы- |li«ai3iM'£ai( iteir Qo' uaofcrtiatte In'bii"Eett.-f^a' ^indu* ti*J|> fegu-Q Q ?>* <:. .;: ^й^Чь^;^..:.■... ■.»■■ С рр^ьанй^^^"^^0"'"05"" - . . s*i£j If you can see ttiis. it means that Га tnscatetjcn of the Арвспе wee sarvy software on friie system was successful Vou may tow add content to this directory and raptaea thts ряда Seeing this instead of the website you expected? 7 ."is page is here be causa the s»te administrator -.as changed tne cci»figuraiicn о Г this wat> Server Please contact the pareon raiponelbla for miJntilnJnfl thia tarvtr with queitloni. I he Apache Software Houndfltion, which wrote the web server »№мете this site a*nimstrBtof is using, has nothing to do wHi maintaining mis site and cannot паф resolve configuration issues The Apache заалпвгКаФдл has bean included with irts tHlnbuB on You ere free to use the image below on an Apache-pDweratf web server Tftanivs Гот vising Ара:he: PAOH E: Рис. 22.1. Веб-страница Apache по умолчанию Комментарий Если вы не добавляете DSO на стадии конфигурации, но хотите включить поддержку DSO для добавления модулей в будущем, включите следующую строку в ./configure: ••enable-so Никаких отрицательных последствий от этого не будет, не считая дополнительных расходов дискового пространства для построения всех доступных модулей во время установки. В дальнейшем добавление и удаление модулей сводится
360 Глава 22. Веб-сервер Apache к редактированию httpd.conf и перезапуску Apache (см. следующий раздел). Чтобы построить все модули на стадии компиляции, укажите следующий параметр: ••enable•mods-sharecHall Для Apache существует множество модулей в формате RPM и .deb, поэтому при желании модули можно установить из пакетов. При этом возникает серьезная проблема: авторы пакетов используют разные имена файлов и руководствуются собственными представлениями о том, где должны находиться файлы Apache. Если ваш дистрибутив Linux содержит хорошую документацию (как, скажем, Red Hat и SuSE), ничего страшного не произойдет. Но при отсутствии нормальной локализованной документации вам предстоит потратить немало времени, пытаясь отыскать нужные файлы. См. также Глава 4; полное описание параметров конфигурации (http://httpd.apache.org/ docs-2.0/programs/configure.html). 22.3. Добавление новых модулей после установки Проблема В конфигурацию сервера Apache была включена поддержка DSO; теперь вы хотите добавить дополнительные модули (как модули Apache, так и сторонние). Решение Допустим, вы изменили свое решение и захотели добавить поддержку mod__cgi для запуска сценариев. Так как поддержка DSO была включена во время установки (см. предыдущий раздел), это делается легко. Для встроенных модулей Apache команда должна выполняться с верхнего уровня дерева сборки Apache, с установкой модуля в каталог libexecdir, заданный при установке: # ./configure --prefixe/usr71ib/httpd/modules/ --enable-cgi-shared # make install Включите следующую директиву в httpd.conf: LoadModule rewritejnodule /usr/lib/httpd/modules/mod_cg1.so Перезапустите Apache, и все заработает. Добавление сторонних модулей может производиться двумя способами. Если вы сохранили дерево сборки Apache, используйте синтаксис # ./configure --add-module»iroduleJ:ype:/mod_foo.c --enable-foo=shared # make install Или воспользуйтесь утилитой apxs для построения стороннего модуля за пределами дерева сборки: # apxs -с пкхМчю.с # apxs -1 -a -n foo mod^foo.la
22.4. Настройка разрешений и принадлежности файлов Apache 361 К сожалению, на практике не все так просто. Многие сторонние модули Apache обладают специализированными параметрами конфигурации и установки. Обязательно проверьте инструкции к модулю. Чтобы удалить модуль, достаточно закомментировать запись в httpd.conf и перезапустить Apache. Комментарий Утилита ApacheToolbox упрощает операции с модулями. Ее можно загрузить по адресу http://www.apachetoolbox.com. См. также Раздел 22.5; http://localhost/manual/dso.html; http://localhost/manual/mod/; документация Apache 2fi (http://httpd.apache.0rg/docs-2.0). 22.4. Настройка разрешений и принадлежности файлов Apache Проблема Требуется задать файловые разрешения для установки Apache. Решение Сначала убедитесь в том, что двоичный файл httpd принадлежит только root, защищен от записи и не может читаться непривилегированными пользователями: # chown root:root /usr/sbin/httpd # chmod 511 /usr/sbin/httpd Затем создайте непривилегированного пользователя специально для httpd: # useradd -с "httpd owner" -d /dev/null -s /bin/false -u httpd Откройте файл /etc/httpd/conf/httpdxonf и настройте httpd на запуск с правами этого пользователя (секция 2): User httpd Затем создайте уникального пользователя и группу, которым будут принадлежать каталоги веб-страниц (в следующем примере web): # groupadd -g 60 web # useradd -с "Web Server" -d /var/www/ -g web -s /bin/false -u web # chown -R webrweb /var/www/http # chmod -R 755 /var/www/http He забудьте включить в группу web пользователей, которым разрешено редактирование веб-страниц. Перезапустите Apache: # apachectl restart
362 Глава 22. Веб-сервер Apache Комментарий Двоичный файл httpd принадлежит root, но работает с разрешениями root столько времени, сколько необходимо для запуска производных процессов, запускаемых с правами пользователя с минимальными привилегиями. Httpd вообще не работает с сетью; вся работа выполняется производными процессами. По умолчанию используется учетная запись nobody, но делать этого не стоит — она используется слишком часто и является излюбленным объектом для атак. Никогда не используйте существующие системные учетные записи; всегда создавайте для демонов и серверов уникальных пользователей. При помощи разрешений файловой системы Linux можно управлять тем, кому из пользователей будет разрешен доступ к подкаталогам и файлам веб-страниц. Apache — надежно защищенное приложение. Как правило, для атак чаще всего используются слабости операционной системы, а также дефекты, связанные с добавлением сценариев на стороне сервера, добавлением веб-форм и генерированием динамического контента в PHP, Perl, Python и т. д. См. также http://httpd.apache/org/docs-2.0/misc/security_tips.html. 22.5. Обращение к локальному руководству Apache Проблема Разработчики Apache хорошо потрудились над документацией; руководство находится по адресу http://httpd.apache.Org/docs-2.0/. Но, конечно, было бы неплохо иметь локальную копию. Решение При построении Apache по исходным текстам руководство устанавливается в каталог —datadir. Если настройка производилась в соответствии с разделом 22.2, это будет каталог/var/www/http/manuaL Вы можете читать страницы в этом каталоге, но гиперссылки работать не будут. Более удобный способ — запустить Apache и читать документацию в браузере; откройте браузер и введите адрес http://localhost/manual. Комментарий Если сервер Apache устанавливался из пакетов, вам потребуется отдельный пакет документации. В Debian он называется apache2-doc. Пользователям RPM потребуются пакеты apache2-manual или httpd-manual. См. также http://httpd.apache.org/docs-2.0/.
22.7. Перенаправление URL в новый каталог 363 22.6. Создание простого веб-сервера Проблема Требуется построить простой общедоступный веб-сервер для одного домена. Сервер ограничивается поставкой статических страниц HTML. Решение После установки Apache 2.0 убедитесь в том, что местонахождение каталога вебсайта в httpdxonf задано верно и указанный каталог существует: DocumentRoot /var/www/bratgrrl Скопируйте веб-страницы в каталог DocumentRoot (в данном примере/var/www/ bratgrrl) и запустите Apache: # apachectl start Настройте DNS и включите ссылку на свой веб-сервер. Комментарий Для создания общедоступного веб-сервера потребуется зарегистрированное доменное имя и статический IP-адрес. Хосты локальной сети обращаются к веб-сайту по IP-адресу или имени хоста: hrttp: //windbag http://192.168.1.5 Это хороший способ проверки подключения и предварительного просмотра веб-страниц. Если сервер Apache устанавливался из пакетов, поищите стартовый сценарий в /etc/init.d. Скорее всего, это будет один из следующих файлов: # /etc/init.d/apache2 # /etc/init.d/httpd # /etc/1nit.d/httpd2 Убедитесь в том, что из сценария вызывается apachectl, а не двоичный файл httpd. Разработчики Apache рекомендуют запускать и останавливать Apache только сценарием apachectl. См. также Глава 24; http://httpd.apache.org/docs-2«0/mod/core.html#documentroot; http://localhost/ manual/mod/core.html.en#documentroot. 22.7. Перенаправление URL в новый каталог Проблема Вы капитально переработали структуру своего веб-сайта. Раньше он представлял собой хаотичное нагромождение файлов, поэтому вы создали его заново. Но ссылки
364 Глава 22. Веб-сервер Apache изменились, а все закладки, созданные посетителями сайта, остались прежними. А заодно все ссылки на сайт в интернет-статьях и поисковых системах тоже стали бесполезными. Можно ли с этим что-нибудь сделать? Решение Включите директивы Rewrite в файл httpd.conf. Пример перенаправления URL: RewriteEngine on RewriteRule Volddir/(.*)$ /newdir/$l Правило означает, что обращения к http://www.bratgiTl.com/olddir/ и всем файлам и каталогам, находящимся в olddir/, будут перенаправляться в http://www.bratgrrl.com/ newdir/. Комментарий Приведенное базовое правило Rewrite решает одну из самых распространенных задач, связанных с перенаправлением. Как видите, перемещение целых каталогов реализуется достаточно просто. Если перемещается большое количество отдельных файлов, вам придется написать много правил. См. также The URL Rewriting Guide (http://localhost/manual/misc/rewriteguide.html). 22.8. Предоставление пользователям индивидуальных веб-каталогов Проблема Требуется предоставить пользователям индивидуальные веб-каталоги, к которым посетители сайта могут обращаться в формате www.domain.com/-user. Это самый простой и быстрый способ создания пользовательских общедоступных веб-страниц, который обходится без хлопот с DNS и виртуальными хостами. Решение Создайте каталог пользователей users в /var/www (или другом каталоге, где хранятся файлы вашего сайта). Создайте для каждого пользователя собственный подкаталог (например, /var/www/users/peters). Поместите копию любого файла index.html в /peters для тестирования. Внесите в httpd.conf следующую запись: USerDIr /var/www/users Перезапустите Apache и попробуйте ввести следующий адрес в браузере: http:/Лocalhost/~peters/ В браузере должна появиться тестовая страница.
22.10. Многодоменный хостинг в Apache 365 Комментарий Не забудьте назначить разрешения для каждого пользовательского каталога, чтобы доступ к нему предоставлялся только законным пользователям. Назначьте владельцем пользователя и его группу; задайте разрешения 755, потому что вебстраницы должны быть общедоступными для чтения. См. также http://localhost/manual/howto/public_html.htmL 22.9. Запуск Apache при загрузке системы Проблема Ввести команду apachectl start не так уж трудно, и все же вы предпочитаете, чтобы Apache запускался автоматически при загрузке системы. Apache устанавливался по исходным текстам — где находится сценарий init? Решение Apachectl — это и есть сценарий init. Скопируйте его в/etc/init.d или создайте мягкую ссылку, а затем включите его на тех уровнях выполнения, на которых он должен запускаться (о настройке уровней выполнения рассказано в главе 7). Комментарий Пользователи Debian могут воспользоваться шаблоном /etc/init.d/skeleton для создания стартового сценария любой службы или демона. См. также http://localhost/manual/invoking.html. 22.10. Многодоменный хостинг в Apache Проблема Один сервер Apache должен обслуживать несколько доменов с общим IP-адресом. Вы уже зарегистрировали все доменные имена, и для каждого домена настроена информация DNS. Решение Воспользуйтесь директивой Apache VirtualHost, обеспечивающей поддержку виртуальных хостов. Следующий файл httpd.conf настроен на обслуживание двух доменов:
366 Глава 22. Веб-сервер Apache NameVirtualHost *:80 <VirtualHost *.80> ServerName www.tuxcomput1ng.com ServerAlias tuxcomputing.com *.tuxcomput1ng.com DocumentRoot /var/www/tuxcomputing ServerAdmin adminPtuxcomput1ng.com </VirtualHost> <V1rtualHost *.80> ServerName www.bratgrrl.com ServerAlias bratgrrl.com *.bratgrrl.com DocumentRoot /var/www/bratgrrl ServerAdmin admin@bratgrrl.com </VirtualHost> Для каждого домена создается отдельный корневой каталог, в котором хранятся файлы сайта. Это позволит вам легко создавать субдомены (скажем, web- mail.bratgrrl.com и wacko.games.tuxcomputing.com). Однако не стоит надеяться, что все заработает само собой — для всех доменов и субдоменов придется создать записи DNS типа А. ПРИМЕЧАНИЕ После того как вы начнете использовать виртуальные хосты, для каждого домена необходимо создать директиву VirtualHost. Директивы VirtualHost замещают глобальные директивы из httpd.conf. В них могут использоваться почти все директивы httpd.conf, что позволяет настроить каждый виртуальный хост так, как вы сочтете нужным. Комментарий Определение виртуальных хостов является самым простым механизмом обслуживания нескольких доменов одним сервером Apache. Настройка записей А для большого количества субдоменов может быть делом утомительным, и все же это лучше, чем использовать доменные групповые обозначения (wildcards), при которых на ваши серверы будет поступать весь трафик, включающий доменное имя. Например: randomstuff.bratgrrl.com real!у.wei rd.randomstuff.bratgrrl.com Спамеры злоупотребляют доменными групповыми обозначениями, так что будьте осторожны и настраивайте в записях DNS только точные доменные имена. В директивах VirtualHost доменные групповые обозначения приемлемы, потому что трафик будет поступать только по именам, явно определенным в DNS. См. также http://localhost/manual/vhosts/name-based.html.
22.12. Предотвращение доступа к веб-сайтам локальных сетей из Интернета 367 22.11. Ведение отдельных журналов для виртуальных хостов Проблема Виртуальные хосты сильно загружены, и разобраться в общем файле журнала становится трудно. Как назначить каждому виртуальному хосту собственный журнал? Решение Измените записи httpd.conf всех виртуальных хостов и задайте для них отдельные файлы журналов: <VirtualHost *:80> ServerName www.tuxcomputing.com ServerAlias tuxcomputing.com *.tuxcoraput1ng.com DocumentRoot /var/www/tuxcomputing ErrorLog /var/www/tuxcomput1ng/logs error Jog AccessLog /var/www/tuxcomputing/logs accessjog combined ServerAdmin admin@tuxcomputi ng.com </VirtualHost> Обратите внимание: для журнала обращений (AccessLog) указан специальный формат combined. Файл httpd.conf содержит четыре готовых директивы LogFormat: LogFormat "*h *1 *u Xt VXrV *>s *b \"*{Referer}ir \"*{UserAgent}1\"" combined LogFormat "*h X} *u Xt \"*r\"*>s *b" common LogFormat "*{Referer}i -> *U" referer LogFormat "*{User-agent}Г agent Если эти форматы вам не подходят, вы легко можете определить собственный формат. Полное описание переменных приведено в документе http://localhost/ manual/mod/mod _log_config.html. См. также http://localhost/manual/mod/mod_log_config.html. 22.12. Предотвращение доступа к веб-сайтам локальных сетей из Интернета Проблема В вашей локальной сети создан персональный веб-сайт для хранения календарей, документов и т. д. А может быть, ваша компания решила построить для каждого отдела веб-сайт, который должен быть изолирован от внешнего мира. Хотя
368 Глава 22. Веб-сервер Apache локальная сеть хорошо защищена, нужна полная уверенность в том, что никакой доступ к веб-сайтам из-за пределов локальной сети в принципе невозможен. Решение Желаемой цели можно добиться двумя способами в зависимости от типа веб-сайта. Решение для виртуальных хостов или автономных веб-сайтов Apache приводится в этом разделе. Для сайтов типа UserDir (см. раздел 22.8) обращайтесь к разделу 22.13. Чтобы доступ к сайту ограничивался рамками локальной сети, подсети или некоторыми доменными именами, следует задать простые правила фильтрации по IP-адресам: <V1rtualHost *.80> ServerName www.bratgrrl.com ServerAHas bratgrrl.com *.bratgrrl.com DocumentRoot /var/www/bratgrrl ServerAdmln adm1n@bratgrrl.com order deny, allow allow from 192.168.1. deny all </VirtualHost> или по доменным именам: allow from ore1lly.net Комментарий Во многих организациях используются «внутренние» веб-сайты, не предназначенные для посторонних. Даже если в сети установлены тщательно настроенные брандмауэры, стоит потратить пару минут на определение правил доступа; тем самым вы обеспечите дополнительную страховку. Страницы UserDir с URL вида oreilly.net/~carla защищаются на уровне каталогов, а не доменных имен (см. следующий раздел). См. также Раздел 22.13. 22.13. Парольная защита отдельных каталогов Проблема Требуется ограничить доступ не ко всему домену, а лишь к некоторым страницам конкретного каталога. Допустим, имеется веб-страница UserDir (см. раздел 22.12), которую необходимо защитить, потому что хранящиеся в ней рабочие документы не должны быть доступны для любопытных коллег. Страница должна быть доступна только для вас или для других доверенных пользователей — как это сделать?
22.13. Парольная защита отдельных каталогов 369 Решение В Apache предусмотрены простые методы аутентификации пользователей для работы с каталогами: Basic и Digest. Это весьма упрощенная форма безопасности; не применяйте ее для страниц, содержащих особо важную информацию, или на любых веб-сайтах, имеющих отношение к коммерции или информации о клиентах. Аутентификация Basic и Digest хорошо подходит для локальной сети, когда вы всего лишь хотите оградить любопытных коллег от того, что их не касается. В режиме Basic пароли пересылаются в виде простого текста и тривиально перехватываются, поэтому в этом рецепте используется режим Digest с применением хеширования MD5. Настройка аутентификации пользователей для каталогов состоит из двух этапов: создания секции <Directory> в файле httpd.conf и создания файла паролей утилитой htpassword. Допустим, вы хотите хранить свои списки контактов, расписания и т. д. по адресу http://oreilly.net/-michael. При этом информация будет храниться в реальном каталоге /var/www/users/michael. Сначала создайте запись <Directory> в httpd.conf: <Directory /var/www/users/michael> AuthType Digest AuthName "Michael's Protected Files" AuthUserFile /etc/httpd/htpasswd/passwords Require user michael </Directory> Затем создается файл паролей: $ htpasswd -с /etc/httpd/htpasswd/passwords michael New password: Re-type new password: Adding password for user michael Ключ -с является признаком создания нового файла. Теперь только пользователь Michael (а также каждый, кто знает пароль Michael) сможет открыть каталог http://oreilly.net/-michaeL Комментарий Обратите особое внимание на директиву AuthName. Все каталоги с одинаковым значением AuthName не требуют повторной аутентификации после первого входа. Это экономит время, но также создает уязвимость в системе безопасности, поэтому будьте внимательны с выбором этого атрибута. Что делать, если у вас нет доступа к httpd.conf, но вы не хотите постоянно приставать к администратору Apache с напоминаниями об обновлениях и изменениях? Пусть администратор настроит для вас возможность использования файлов .htaccess, и вы сможете управлять доступом самостоятельно. Файл .htaccess предназначен для настройки доступа к каталогам (а не к доменам). Администратор должен внести следующую запись в httpd.conf (в этом примере всем пользователям /var/www/users разрешается использование файлов .htaccess): <Directory /var/www/users> Al1owOverri de AuthConfi g </Directory>
370 Глава 22. Веб-сервер Apache Не забудьте перезапустить Apache после изменения httpd.conf. В дальнейшем пользователь Michael может создать файл .htaccess с директивами, приведенными в подразделе «Решение». Файл должен находиться в каталоге верхнего уровня (в нашем примере /var/www/users/michael). Аутентификация Digest обладает дополнительным преимуществом: она дает лишний повод избавиться от браузера Internet Explorer, в котором она не поддерживается для URL с использованием строк запросов вида http://catsearch.atomz.com/search/catsearch/?sp-a«spl000a5a9&sp•f-ISO•8859•l&sp• t-cat_search&sp- q-apache&searcto-Go Статические URL (вида http://linux.oreilly.com) обычно нормально работают в IE, так что с простыми, статическими страницами эта проблема не возникает. Впрочем, IE в любом случае представляет большую угрозу для безопасности системы и не поддерживает многие веб-стандарты, но если вам нужна еще одна причина избавиться от этой программы, то она у вас есть. Если вы хотите выбрать единый браузер для смешанной сети, то Mozilla отлично поддерживает аутентификацию Digest, работает па множестве разных платформ, соответствует стандартам W3C и обладает массой полезных возможностей, отсутствующих в IE: вкладки, осмысленные cookie, подавление всплывающих окон, управление паролями и т. д. См. также Authehtication, Authorization and Access Control (http://localhost/manual/howto/ auth.html); Apache SSL/TLS Encryption (http://localhost/manual/ssl); домашняя страница W3C (http://www.w3.org). 22.14. Файл robots.txt Проблема Поисковые системы находят сайты, индексируют их и помогают найти их своим посетителям. Но некоторые из них начинают раздражать вас слишком частыми посещениями ботов, поэтому вы хотите избавиться от них. Кроме того, на сайте имеются каталоги и страницы, которые не должны индексироваться. Решение Создайте файл с ограничениями robots.txt и поместите его в корневой каталог вебсайта. Файл robots.txt выглядит примерно так: # Страницы, индексирование которых # не разрешается ботам User-agent: * Disallow: /error/ Disallow: /users/ Disallow: /cgi-bin/ Disallow: /*.doc$ Disallow: /tmp/ # Перечисление ботов, который # запрещается доступ к сайту
22.15. Блокировка нарушителей 371 User-agent: BadBot/ Disallow: / User-agent: VeryBadBot/ Disallow: / Комментарий В файле robots.txt используются директивы User-agent и Disallow. Данные пользовательских агентов можно найти в журналах. Например: "GET /robots.txt HTTP/1.1" иhttp://www.whois.se/" "SurveyBot/2.3 (Whois Source)*4 "GET /foo.htm HTTP/1.0" "Googlebot/2.1 (+http://www.googlebot.com/bot.html)" "GET /foo HTTP/1.0" "•" "msnbot/0.11 (+http://search.msn.com/msnbot.htm)" Если вы захотите включить этих ботов в список, записи будут выглядеть так: User-agent: SurveyBot/ Disallow: /cgi-bin/ User-agent: msnbot/ Disallow: / Следите за журналами. Если кто-то создает вам слишком много проблем, в следующем разделе будет рассказано, как полностью оградить нарушителя от вашего сайта при помощи встроенных правил доступа Apache. См. также http://www.robotstxt.org; http://www.robotstxt.org/wc/active/html/index.html. 22.15. Блокировка нарушителей Проблема Вам надоедают боты поисковых систем, анализаторы сайтов или другие нарушители, которые попусту забивают ваш канал. Как заблокировать им доступ к сайту? Решение Воспользуйтесь средствами управления доступом Apache в httpd.conf. Следующий метод позволяет заблокировать доступ для конкретных IP-адресов или хостов: Order allow.deny Allow from all Deny from 12.34.56.78 # Этот нарушитель создает ссылки на нашу графику Deny from *.booger.baddoma1n.net # Надоедливый бот поисковой системы foo.com Deny from search.foo.com Комментарий Просмотр журналов часто приносит неприятные сюрпризы. Просто удивительно, сколько трафика поглощают боты поисковых систем или пользователи,
372 Глава 22. Веб-сервер Apache загружающие весь сайт программой wget или ее аналогом. Многие боты игнорируют файл robots.txt и обрабатывают сайты так, как им вздумается. Автоматизированные программы сбора данных — дело хорошее, но слишком многие пользователи выпускают их в Интернет, совершенно не задумываясь о последствиях. В разделе 22.21 рассказано об использовании Webalizer — утилиты, упрощающей анализ журналов и выявление нарушителей. См. также http://localhost/manual/howto/auth.html. 22.16. Создание пользовательских страниц ошибок Проблема При переходе по несуществующей ссылке пользователь получает холодную, бездушную страницу ошибки 404 Apache: «Not found The requested URL/foo was not found on this server. Apache/2.0.50(Unix) Server at http.bratgrrl.com Port 80» Но вы бы предпочли, чтобы страница ошибки соответствовала стилю оформления вашего веб-сайта, была дружелюбной и информативной. Решение Создайте собственную страницу (в нашем примере 404-custom.html) и включите в файл httpd.conf директиву ErrorDocument со ссылкой на эту страницу: ErrorDocument 404 /error/404-custom.html По умолчанию страницы ошибок хранятся в каталоге /error. Комментарий Не изменяйте стандартную страницу ошибки, входящую в поставку Apache (чтобы найти стандартные страницы ошибок, загляните в каталог DocumentRoot; в примерах настоящей главы они хранятся в каталоге/var/www/error). Вообще говоря, вы можете немного подправить стандартную страницу (см. следующий раздел), но лучше создать ее заново, поскольку стандартные страницы интернационализированы. И даже если вы не собираетесь использовать их прямо сейчас, возможно, их стоит сохранить просто на всякий случай. Apache может использовать интернационализированные страницы для автоматической доставки сообщений об ошибках на языке посетителей сайта при помощи Content Negotiation (см. раздел 22.19). Вместо выдачи страницы ошибки в файле httpd.conf можно задать простое сообщение: ErrorDocument 403 "Nobody here, you go away now"
22.18. Вывод содержимого каталогов без усечения имен файлов 373 См. также http://localhost.manual/mod/core.html.en#errordocumentcTpaHHU. 22.17. Настройка стандартных страниц ошибок Apache Проблема Вы хотите использовать стандартные страницы ошибок Apache в сочетании с Content Negotiation (см. раздел 22.19), чтобы сообщения об ошибках выдавались на языке посетителей сайта. Но эти страницы слишком лаконичны и неприглядны — нельзя ли как-то украсить их, не нарушая кода страницы? Решение Разработчики Apache позаботились обо всем. В примерах настоящей главы стандартные страницы ошибок хранятся в каталоге /var/www/error. Открыв этот каталог, вы обнаружите в нем подкаталог/include с тремя файлами: bottom.html, spacer.html и top.html. В файлы bottom.html и spacer.html можно включить любой текст, графику, ссылки и вообще все, что вы пожелаете. Комментарий В настройке страниц ошибок проявляется забота о посетителях сайта; на видоизмененных страницах можно вывести полезную информацию. Но если вы намерены полностью переработать страницы ошибок, лучше создать свои собственные страницы заново (см. предыдущий раздел). См. также http://localhost/manual/content-negotiation.html. 22.18. Вывод содержимого каталогов без усечения имен файлов Проблема Некоторые страницы сайта выводят списки файлов, которые пользователь может загрузить в браузере. Apache выводит содержимое каталогов с усечением имен файлов: Parent Directory 27-Jul-2004 09:39 1ibpam-smbpass_3.0.5..> 27-Jul-2004 09:17 298k 1i bsmbcli ent-devJ.0..> 27•Jul•2004 09:17 581k I1bsmbclient_3.0.5-1..> 27-Jul-2004 09:17 467k Как организовать отображение полных имен файлов?
374 Глава 22. Веб-сервер Apache Решение Найдите в файле httpd.conf следующий фрагмент: # IndexOptions: Управление внешним видом страниц с листингами # каталогов, сгенерированными сервером IndexOptions Fancylndexing VersionSort и добавьте директиву NameWidth: IndexOptions Fancylndexing VersionSort NameWidth21* Звездочка означает расширение по максимальной длине файла. Также можно задать лимит в 40 символов или около того, чтобы листинг нормально читался, даже если в нем попадется файл с очень длинным именем. IndexOptions Fancylndexing VersionSort NaraeWidth^O Комментарий Параметр также может задаваться для отдельных виртуальных хостов. Директивы VirtualHost переопределяют глобальные директивы. См. также http://localhost/manual/mod/mod_autoindex.htmL 22.19. Использование Content Negotiation для предоставления страниц на разных языках Проблема Посетители вашего веб-сайта говорят на разных языках. Требуется, чтобы Apache автоматически распознавал язык каждого посетителя и выдавал страницы на соответствующем языке. Решение В Apache имеется все необходимое для выполнения этой работы на стороне сервера. Предоставьте страницы, переведенные на поддерживаемые языки, а затем настройте файл карты типов со ссылками на разные страницы. Этот файл должен иметь расширение .var. На стороне клиента посетитель должен настроить браузер на определенный язык. Стандартная индексная страница Apache дает хорошее представление о работе этого механизма (см. рис. 22.1 в разделе 22.2). Найдите каталог htdocs — он содержит все разновидности стандартного файла index.html: /var/www/index. html. са /var/www/index.html.cz.1so8859-2 /var/www/index.html.de /var/www/index.html.dk /var/www/i ndex.html.ее
22.19. Использование Content Negotiation для предоставления на разных языках 375 /var/www/1ndex.html.el /var/www/index.html.en /var/www/index.html.es /var/www/1ndex.html.et /var/www/1ndex. html.fг Теперь откройте файл /var/www/index.html.var: URI: index.html.ca Content-language: ca Content-type: text/html URI: index.html.cz.i$08859-2 Content-language: cs Content-type: text/html:charset=IS0-8859-2 URI: index.html.de Content-language: de Content-type: text/html Как видите, задается только путь к файлу, директива Content-language с указанием языка и директива Content-type:text/html для каждого файла. Последняя запись файла используется по умолчанию, если механизм Content Negotiation не сработал. Она должна указывать на страницу, которая содержит ссылки на индексные страницы на разных языках: URI:fallback.html Content-type: text/html Остается убедиться в том, что следующая строка httpd.conf раскомментирована (как это должно быть по умолчанию): AddHandler type-map .var Комментарий Хотя Content Negotiation официально является частью стандарта НТТР/1.1, этот механизм еще не получил всеобщего признания. Не все браузеры поддерживают его, и не все пользователи настраивают свои браузеры должным образом. Кроме того, Content Negotiation замедляет обработку запросов. На рис. 22.2 показана страница настройки языковых предпочтений в Mozilla. Когда такой пользователь посещает многоязыковой веб-сайт, ему будут автоматически предоставлены страницы на французском языке. Apache видит в заголовках HTTP следующую информацию: Accept-Language: fr: q-1.0. en; q-0.5 Если французских страниц нет, Apache выдает второй вариант — английские страницы. Если все попытки согласования контента оказываются неудачными, посетитель получает ошибку 406: Not Acceptable An appropriate representation of the requested resource /foo/index.html could not be found on this server. Available variants: index-en.html index-fi.html Конечно, вы можете создать собственную страницу ошибки 406 (см. раздел 22.16).
376 Глава 22. Веб-сервер Apache ^&ьд$\у,., :: Р Appearance ^Mavigabor г History ■ -<ш<эк : Helper Applications Smart Qrowsing Internee search ■Tabued Browsing Download? P Composer P Privacy & Security p Advanced Ltrnguacjes :-триаде $ for web над web pages are Vj^ehrn la'ng j-3'jec for dtspteyiricj Language in order of p: > Character Encod шш J I Рис. 22.2. Настройка языковых предпочтений в Mozilla См. также RFC 2616; http://localhost/manual/content-negotiation.html. 22.20. Использование эмблем Проблема На многих веб-сайтах используются эмблемы (favicons) — например, на сайте http:// www.freebsd.org это маленький чертик, который отображается в адресной строке браузера посетителя и в списке закладок. Вы хотите создать эмблему и для своего сайта. Решение Для этого необходимо создать изображение favicon.ico в точно выдержанном формате (это должен быть настоящий файл .ко, а не переименованный файл .jpg) и включить некоторые записи в httpd.conf и заголовки веб-страниц. Эмблема должна иметь размеры 16x16 пикселов, содержать 16 цветов (4-битовая цветовая глубина) и называться favicon.ico. Вам потребуется графический редактор, умеющий создавать файлы .ico, — например, Gimp, Babygimp или Kiconedit. Редактор Kiconedit особенно прост и удобен в использовании, хотя для его использования потребуется базовая установка KDE. Создав файл favicon.ico, сохраните его в корневом каталоге Datadir, который в примерах настоящей главы соответствует /var/www/. Включите в httpd.conf следующую запись: AddType image/x-icon .ico
22.21. Просмотр журналов обращений Apache с использованием Webalizer 377 Затем добавьте следующие строки в заголовки веб-страниц: <link rel -Icon href-Vfavicon.ico" type»"image/x-icon"> <Hnk rel «"shortcut Icon" href»"/favicon. 1co" type*" image/x-i con "> Первая строка обеспечивает отображение эмблемы рядом с URL вашего сайта в браузере посетителя, а вторая — отображение эмблемы в списках закладок. Комментарий Если вы не увлекаетесь созданием собственных эмблем, проведите поиск в Google по словам «favicon clip art» или «favicon gallery». Вы найдете множество готовых эмблем и сможете выбрать из них нужную. Если сервер обслуживает несколько виртуальных хостов, каждый из них может иметь собственную эмблему. Для этого следует включить строку AddType image/ x-icon в каждую директиву VirtualHost. См. также Kiconedit (http://wl.1358.telia.eom/-ul35800018/prog.html#KIC0NEDIT); The Gimp (http://www.gimp.org); Babygimp (http://babygimp.sourceforge.net). 22.21. Просмотр журналов обращений Apache с использованием Webalizer Проблема Просмотр access_log — занятие не из приятных. Журнал огромен, состоит из простого текста, и от его просмотра голова идет кругом. Нет ли какой-нибудь удобной графической программы просмотра и анализа журналов, с цветами и графиками? Решение Программа Webalizer автоматически генерирует страницы HTML с гиперссылочными цветными графиками, построенными по данным access_log. Загрузите и установите Webalizer обычным способом; программа распространяется в виде пакетов и исходных текстов. После завершения установки проверьте ее следующей командой: # webalizer /etc/httpd/logs/accessjog Webalizer V2.01-10 (Linux 2.4.21) locale: С Using logfile /etc/httpd/logs/accessjog (elf) Creating output in /var/www/webalizer Hostname for reports is 'windbag* Reading history file... /var/www/webalizer/ webalizer.hist Reading previous run data... webalizer.current Saving current run data... [08/08/2004 15:31:06] Generating report for August 2004 Generating summary report Saving history information... 107 records (97 ignored) in 0.15 seconds
378 Глава 22. Веб-сервер Apache Введите адрес /var/www/webalizer/index.html в браузере. Примерный вид страницы показан на рис. 22.3. ^ft№*ftft№trf*f **irt4ft*e - ШП* ШШ'Л(«(1ПИ14 •{.nfaftton E=W ylft» £■■> uer,bmarti!i 1<цгЦ* ^trkvjb tfrnda* Ияц- ^IS*^*»^*»^ <i«#:';I.: ^.rf^^^Tuu-/*."'^*" ■ oi,j;,it i-diiiUL^J:- »n-j..j "14 Gentnattd DyW.tfcjitlMtVltUftlLiAl С иттму &У Month :*;':...: v ■ : WftiwMjfTiijn* ' r;.' "::>' .'■: ■;vu,l, |Ш.:мш| *-*и :^(.нш 2993] ; J. SS| Щ 57 ;..; м -Э **r ?$■ ;«> Рис. 22.3. Просмотр журнала обращений с использованием Webalizer На рисунке показаны данные всего за несколько дней для веб-сайта, созданного специально для демонстрации материала данной главы. По мере накопления статистики вы сможете просматривать графики практически любых показателей, сохраняемых в журнале, по месяцам, дням и часам. Убедитесь в том, что в файле /etc/webalizer.com правильно заданы пути к файлам: LogFUe /etc/httpd/logs/access! og OutputDir /var/www/webalizer HistoryNarae /var/www/webalizer/webalizer.hi st Чтобы сгенерировать обновленную страницу Webalizer, введите команду # webalizer Комментарий Данные, передаваемые Webalizer, определяются директивой LogFormat в httpd.conf. LogFormat H*h *1 *u tt \"*r\" *>s *b \"*{Referer}1\" \"*{UserAgent}1\"" combined CustomLog logs/access Jog combined Если в журнале отсутствует нужная информация, проверьте директивы LogFormat Webalizer также содержит простые фильтры для настройки отображаемой статистики; поищите в файле /etc/webalizer.conf. См. также http://localhost/manual/mod/mod Jog_config.html; webalizer(l).
Глава 23 Samba 23.1. Введение Samba обеспечивает общий доступ к файлам и принтерам, аутентификацию в локальных сетях Windows и подключения компьютеров Windows к сетям Linux/ Unix. Samba функционирует примерно так же, как контроллер домена Windows NT, если вы предпочитаете доменную модель локальной сети, или как обычная одноранговая сеть Windows, в которой хосты напрямую используют файлы и принтеры друг друга. Кроме того, Samba хорошо справляется с функциями автономного файлового сервера или сервера печати в составе домена или рабочей группы. Хосты Linux могут быть задействованы во всех перечисленных сценариях: одноранговая сеть, домен или централизованный файловый сервер. С совместным доступом к принтерам дело обстоит чуть сложнее, но комбинация CUPS+Samba существенно упрощает эту задачу. Сервер Samba работает во всех разновидностях Unix и в Mac OS X. Любая платформа с поддержкой протокола CIFS/SMB (Common Internet System/Server Message Block) — такая, как VMS, Amiga OS и NetWare — может стать клиентом Samba. На момент написания книги новейшей версией Samba была версия 3.x. Если вы все еще используете версию 2.x, вам определенно стоит обновить ее. Внешне версия 3.x ничем не отличается от 2.x; она поддерживает те же параметры конфигурации и точно так же устанавливается, но ее внутренняя реализация была заметно усовершенствована. У Samba есть еще одно полезное применение, о котором обычно почти не упоминают: общий доступ к файлам между хостами Linux. Для организации общего доступа к файлам в Unix традиционно использовался механизм NFS (Network File System). В принципе его можно использовать и сейчас, но Samba отличается большей защищенностью, простотой в установке и эксплуатации, а также гибкостью — пользователи могут обновлять общие каталоги, входить и выходить из системы, и это не помешает работе Samba. Samba обладает бесчисленными параметрами конфигурации. Впрочем, залогом успешной работы Samba является простота. Начните с минимальной конфигурации и добавляйте только те параметры, которые вам действительно необходимы.
380 Глава 23. Samba Да, в мире полно знатоков Samba, которые обожают хвастаться своими «навороченными» конфигурациями. Вы может делать то же самое, если вам это покажется интересным. Но если вы просто хотите организовать работу надежного, стабильного сервера, излишне сложные конфигурации не понадобятся. Samba 3 обладает рядом преимуществ перед Samba 2. Вот лишь некоторые из преимуществ Samba 3: О улучшенное быстродействие, особенно с ядром Linux 2.6; О интеграция с Active Directory; О поддержка Юникода. Samba 3 не сможет заменить Active Directory; эта система не обладает всеми возможностями управления пользователями, сетью и ресурсами, существующими в AD. Тем не менее Samba хорошо справляется с функциями файлового сервера в домене Active Directory и управляется точно так же, как все остальные участники Active Directory- В AD используется аутентификация на базе Kerberos, поэтому вам потребуется хорошее понимание Kerberos. Поддержка Юникода также важна, потому что пользователи могут сохранять документы на языках, выходящих за рамки кодировки ASCII, и присваивать файлам имена на своем языке (русском, иврите, арабском и т. д.). Системные требования Для работы Samba не нужен самый современный и мощный процессор. С другой стороны, желательно иметь побольше оперативной памяти и быстрый жесткий диск. Затраты на покупку оборудования зависят от того, сколько пользователей будут пользоваться услугами сервера, какой объем дискового пространства необходим для хранения файлов и насколько критична непрерывная работа системы. Для небольшой локальной сети (скажем, 50 пользователей или менее) компьютер со старым Pentium 300, 256 Мбайт ОЗУ и трехдисковым массивом IDE RAID 5 сможет нормально выполнять функции централизованного сервера файлов/печати. При использовании RAID 5 полосовая запись обеспечивает скорость, а контроль четности — целостность данных. Конечно, если вы не ограничены в средствах, всегда можно купить высокопроизводительный массив SCSI. Linux хорошо поддерживает SCSI, вы получите более высокую производительность и срок службы. Производительность сервера Samba проще всего проверяется командой ping. Если время отклика превышает 100 миллисекунд, значит, ваш сервер перегружен. Краткая история протоколов Все началось в старую эпоху IBM и Sytem с системы NetBIOS (Network Basic Input Output System), обеспечивающей интерфейс между приложениями и сетевым оборудованием. Затем компания Microsoft адаптировала NetBIOS для организации общего доступа к файлам по локальной сети; так был создан прямой предок CIFS/SMB. Сначала использовался термин CIFS, затем SMB. Позже компания IBM внесла дополнительные усовершенствования и разработала протокол NetBEUI (NetBIOS Enhanced User Interface), обеспечивающий передачу пакетов в сетях Ethernet и Token Ring. Вспомните, что в то время еще никто не знал, что Ethernet будет править бал, поэтому разрабатывались и тести-
23.2. Построение простого автономного файлового сервера Samba для Windows 381 ровались различные сетевые протоколы. Связка из NetBIOS и TCP/IP оказалась особенно эффективной: NetBIOS обеспечивает транспорт пакетов, а TCP/IP — их маршрутизацию (то есть возможность их пересылки в глобальных сетях). Попутно компания Microsoft добавила поддержку аутентификации пользователей и оповещений, чтобы подключенные хосты могли сообщать о своем присутствии друг другу. Возможно, оповещения по принципу «Привет, я здесь!» — не самое элегантное решение, но зато практичное. Компьютерный фольклор утверждает, что в начале 1990-х годов Эндрю Триджеллу (Andrew Tridgell), основному автору Samba, потребовалось связать в сеть его собственные компьютеры с системами DOS и Unix. He удовлетворившись существующими средствами, он изобрел Samba. Остальное было делом времени. 23.2. Построение простого автономного файлового сервера Samba для Windows Проблема Требуется организовать надежный общий доступ к файлам в сети Windows без приобретения серверной лицензии Windows и приобретения нового оборудования. Механизм разрешения имен, TCP/IP и клиенты сетей Microsoft установлены и работают, любой хост может опросить (ping) любой другой хост по имени или IP-адресу. Вы не хотите возиться с паролями, разрешениями и прочими ужасами. Нужен простой, общедоступный, анонимный файловый сервер для хранения и выборки файлов пользователями. Решение Установите Samba на компьютере с системой Linux, которому будет отведена функция файлового сервера. Затем создайте на сервере Samba общие каталоги. Клиенты Windows должны входить в одну рабочую группу (в данной главе она будет называться «workgroup»). На клиентах Windows должна быть установлена поддержка TCP/IP и протокол клиента сетей Microsoft. Если вы предпочитаете устанавливать Samba по исходным текстам, то общий архив samba-latest.tar.gz можно будет загрузить по адресу http://www.samba.org. Пользователям RPM для построения сервера потребуются пакеты samba, samba- client и samba-doc, а пользователям Debian — пакеты samba, samba-common, smbclient и samba-doc. После установки создайте на компьютере Samba каталог для хранения общих файлов и заполните его файлами для тестирования: # mkdir -m 777 /sharedstuff Затем настройте Samba для анонимного доступа. Создайте резервную копию исходного файла/etc/samba/smb.conf и замените его содержимое следующим фрагментом: [global] workgroup - workgroup
382 Глава 23. Samba netbios name » windbag server string - anonymous Ian file server security - share browseable - yes hosts allow - 192.168.1. [sharel] path - /sharedstuff comment - testfiles readonly e No guest ok - Yes Подставьте название своей рабочей группы и адрес подсети. Имя netbios выбирается произвольно и имеет длину до 15 символов; именно эта строка отображается в окне Сетевое окружение. Имя share должно содержать не более 12 символов. Сохраните и закройте smb.conf. Проверьте файл на наличие синтаксических ошибок командой $ testparm Перезапустите Samba командой # /etc/init.d/samba restart В Red Hat или Fedora используйте команду # /etc/imt.d/smb restart Теперь нужно проверить, работает ли созданная конфигурация. Выполните на сервере Samba следующую команду для вывода общих каталогов. В ответ на запрос пароля нажмите клавишу Enter, потому что пароль не задан: $ smbclient -L windbag Password: Domain-CWORKGROUP] 0S-[Unix] Server-[Saraba 3.0.5-Debian] Sharename Type Comment sharel Disk testfiles IPCS IPC IPC Service (anonymous Ian file server) ADMINS IPC IPC Service (anonymous Ian file server) Domain»[Workgroup] 0S"[Unix] Server«[Samba 3.0.5-Debian] Server Comment WINDBAG anonymous Ian file server Workgroup Master WORKGROUP WINDBAG Доступные общие каталоги перечислены под заголовком Sharename. IPC$ и ADMINS — административные протоколы общего доступа, а не каталоги. Если сервер Samba подключен к локальной сети, другие хосты также будут перечислены в категории Server. Откройте окно Сетевое окружение на компьютере с системой Windows; пользователи Windows увидят ресурсы workgroup, windbag и sharel на компьютере windbag. Теперь они могут легко загрузить или сохранить файлы в общем каталоге.
23.3. Построение одноранговой сети Windows/Linux 383 Комментарий Samba потребуется несколько минут, чтобы разослать информацию о себе по сети. Если при первой попытке окно Сетевое окружение окажется пустым, подождите пару минут. Представленная конфигурация небезопасна. Директива hosts allow ограничивает доступ локальной подсетью, что отчасти защищает от вредоносных внешних влияний. Но файлы общего каталога открыты для всех желающих; кто угодно сможет прочитать, изменить и удалить их. Впрочем, многие пользователи считают эту конфигурацию удобной. Общий каталог можно сделать доступным только для чтения, чтобы пользователи могли открывать документы, но не сохранять их. Для этого в smb.conf включается директива read only = yes или writeable = по (на ваше усмотрение). Директивы настройки общих каталогов заменяют глобальные директивы, и обе категории директив заменяют конфигурацию но умолчанию, описанную в smb.conf(5). Имена общих каталогов, заключенные в квадратные скобки, содержат не более 12 символов, включая пробелы. Более длинные имена вызовут ошибки в Windows 95/98/Ме и Linux. Имена [global], [homes] и [printers] зарезервированы и имеют специальное значение. В остальном имена каталогов выбираются произвольно. См. также smb.conf(5). 23.3. Построение одноранговой сети Windows/ Linux Проблема Анонимный файловый сервер удобен, но еще удобнее одноранговая сеть, в которой пользователи могут обмениваться файлами друг с другом напрямую. Вы хотите, чтобы пользователи Windows и Linux могли делать это без паролей и прочих затруднений. Решение На хостах Linux достаточно установить серверные и клиентские компоненты Samba, а затем настроить общие каталоги, как описано в разделе 23.2. На хостах Windows необходимо включить общий доступ к файлам, а затем настроить общие каталоги. Пользователи Windows NT/2000 должны активизировать «гостевые» учетные записи, чтобы предоставить внешним пользователям доступ к своим каталогам. Пользователи Windows XP включают общий доступ, запуская мастера настройки сети. Все компьютеры должны принадлежать к одной рабочей группе (workgroup в примерах данной главы). Далее на компьютере с системой Windows открывается окно Сетевое окружение, в котором производится поиск всех общих ресурсов в локальной сети.
384 Глава 23. Samba Подключение в одноранговых сетях Samba с компьютеров Linux описано в разделах 23.17 и 23.18. Комментарий Не устанавливайте NetBEUI или поддержку сетей Novell (IPX/SPX), если вы не уверены в том, что это абсолютно необходимо. Установка этих протоколов снизит производительность системы. При загрузке компьютеру необходимо несколько минут, чтобы разослать информацию о своих ресурсах. Будьте терпеливы. См. также Разделы 23.2, 23.4, 23.17 и 23.18. 23.4. Включение общего доступа к файлам в Windows Проблема Требуется настроить общий доступ к файлам на компьютерах с системой Windows, чтобы другие пользователи локальной сети могли получить доступ к вашим общим файлам. Решение В системе Windows XP общий доступ к файлам по умолчанию отключен. Чтобы включить его, запустите приложение панели управления Сетевые подключения и выберите Мастер новых подключений. На экране появляется диалоговое окно мастера новых подключений. Следуя инструкциям мастера, установите переключатель Установить домашнюю сеть или сеть для малого офиса, введите имя рабочей группы и включите общий доступ к файлам. Чтобы организовать общий доступ к файлам, проще всего скопировать их в каталог Documents and Settings\AU Users\06iune документы. Комментарий Пользователи, выросшие в веселые времени Windows 95, часто находят систему ограничений NT/2000/XP слишком жесткой и неудобной. Им не хватает простой возможности открыть общий доступ ко всему диску. На самом деле в NT/2000/ ХР такая возможность сохранилась; просто нужно немного потрудиться. Откройте Проводник Windows, щелкните правой кнопкой мыши на диске, к которому предоставляется общий доступ. Выберите команду Общий доступ и безопасность. Установите флажок Открыть общий доступ к этой папке и введите комментарий в поле Общий ресурс. Этот комментарий будет отображаться в окне Сетевое окружение и в обозревателях сети Linux, поэтому постарайтесь сделать его содержательным.
23.5. Включение аутентификации на сервере Samba 385 Конечно, открывать общий доступ ко всему диску крайне небезопасно, но если кому-то захочется это сделать — пожалуйста. См. также Разделы 23.17 и 23.28; Microsoft Knowledge Base Article 307874. 23.5. Включение аутентификации на сервере Samba Проблема Вам не нравятся либеральные, незащищенные методы организации общего доступа к файлам, описанные в предыдущих разделах. Вы предпочитаете создать централизованный файловый сервер с общими каталогами и управлять доступом пользователей к этим каталогам. Решение Прежде всего следует отредактировать smb.conf, включить безопасность уровня пользователей и потребовать шифрования паролей (обе возможности включены в 3.0 по умолчанию, но всегда лучше четко выразить свои намерения). После этого пользователи Samba создаются утилитой smbpasswd. Пользователи Samba также должны иметь системные учетные записи Linux на сервере (их следует создать заранее). Учетные записи Samba необходимы как пользователям Windows, так и пользователям Linux. В следующем примере приводится измененный вариант конфигурации из раздела 23.2: [global] workgroup ж workgroup netbios name e windbag server string - Ian file server security ■ user encrypt passwords - yes browseable hosts allow - 192.168.1. [sharel] path * /sharedstuff comment e test files read only - No Перезапустите Samba после редактирования smb.conf. Теперь создаются пользователи Samba, и им назначаются пароли: # smbpasswd -a andrew New SMB password: Retype new SMB password: Added user andrew.
386 Глава 23. Samba ВНИМАНИЕ Пользователи, создаваемые командой smbpasswd, должны иметь системные учетные записи на сервере Samba. Если данные отсутствуют в /etc/passwd, вы получите следующее сообщение об ошибке: Failed to initialize SAM_ACCOUNT for user <foo>. Failed to modify password entry for user <foo> Комментарий Неудобная схема с двумя базами данных паролей объясняется различиями между паролями Unix и Windows и спецификой управления файловыми разрешениями на этих платформах. Команда smpaswwd прокладывает мост между этими сильно различающимися платформами. В следующем разделе будет показано, как преобразовать/etc/passwd в/etc/samba/smbpasswd командой mksmbpasswd. См. также Smb.conf(5), smbpasswd(5), smbpasswd(8). 23.6. Массовое преобразование системных пользователей Проблема Вам совершенно не хочется вручную создавать учетные записи Samba для всех пользователей, как описано в предыдущем разделе. Можно ли автоматизировать процесс преобразования? Решение Да, до определенной степени. В поставку Samba включен сценарий mksmbpasswd, который преобразует все записи /etc/passwd в формат smbpasswd и копирует их в/etc/samba/smbpasswd. Сценарий не копирует пароли (он не может это сделать, потому что они зашифрованы и хранятся в/etc/shadow), поэтому пароли придется задавать по отдельности. Новые учетные записи остаются заблокированными до тех пор, пока не будут созданы пароли. Сначала создайте копию /etc/passwd: # ср /etc/passwd /etc/passwd-old Отредактируйте/etc/passwd-old и удалите все учетные записи, которые не должны использовать сервер Samba. He нужно создавать для них учетные записи Samba, это лишь создаст потенциальную угрозу для безопасности. Преобразуйте учетные записи в /etc/samba/smbpasswd: # cat /etc/passwd-old | /usr/sbin/mksmbpasswd > /etc/samba/smbpasswd Новые учетные записи Samba активируются командой smbpasswd: # smbpasswd henna New SMB password: Retype new SMB password:
23.8. Шифрование паролей в Windows 387 Комментарий Обычно mksmbpasswd рекомендуется запускать только один раз, для проведения первого преобразования. Если внимательно отредактировать рабочую копию/etc/ passwd-old, избегая повторений, можно использовать mksmbpasswd для присоединения дополнительных пользователей: # cat /etc/passwd-old | /usr/sbin/mksmpasswd » /etc/samba/smbpasswd См. также mksmbpasswd(8), smbpasswd(5), smbpasswd(8). 23.7. Подключение к Samba из Windows 95/98/ME Проблема Windows 95/98/ME не позволяет передать Samba имя пользователя — только пароль, поэтому вы не сможете зарегистрироваться под другим именем. Как передать Samba имя и пароль? Решение Windows 95/98/ME передает Samba имя пользователя Windows. Вам не удастся передать Samba имя, отличное от того, которое использовалось для входа в Windows. Простейшее обходное решение заключается в создании новой учетной записи Windows с таким же именем, как у пользователя Samba, и входом в Windows под этой учетной записью. Эту операцию можно проделывать даже при подключении с разных компьютеров, но тем самым вы создадите большую брешь в системе безопасности: Windows «любезно» кэширует пароль Samba, чтобы вам не приходилось вводить его заново... а также всем, кто работает на этом компьютере. См. также Раздел 23.9. 23.8. Шифрование паролей в Windows Проблема Вы знаете, что по умолчанию Samba использует шифрованные пароли. Однако некоторые версии Windows поддерживают только текстовые, незашифрованные пароли. В Samba должны использоваться либо шифрованные, либо текстовые пароли; их одновременное использование невозможно. Какие пароли поддерживаются разными версиями Windows и какой вариант лучше выбрать?
388 Глава 23. Samba Решение Следующие версии Windows поддерживают только текстовые, нешифрованные пароли: Windows 95 (до OSR2); Windows NT 3.x; Windows NT4 (до SP3). К счастью, для Windows 95 существует специальная «заплатка». Обращайтесь к статье Microsoft Knowledge Base с номером 165403; вам нужен файл Vrdupd.exe. В современных системах NT4 используется обновление SP6, так что проблемы остаются только у пользователей Windows NT 3.x. Если эта проблема действительно так важна, настройте Samba на поддержку текстовых паролей. Для этого необходимо разрешить использование текстовых паролей на всех клиентах Windows, кроме NT3, посредством установки специальных исправлений реестра. Правка реестра Windows всегда опасна, к тому же она может нарушить работу других приложений, зависящих от шифрования паролей. Мой вам совет: не делайте этого. Но если подобная операция неизбежна (скажем, в вашем распоряжении только локальная сеть с рабочими станциями NT3), отредактируйте файл smb.conf и включите в него директиву encrypt passwords = no. Далее загляните в каталог /usr/share/doc/samba-doc/registry; вы найдете в нем полный набор готовых заплаток реестра. См. также Microsoft Knowledge Base Article 256986. 23.9. Списки управления доступом (ACL) Проблема Требуется ограничить доступ пользователей к конкретному сетевому каталогу Samba (по имени пользователя или группы). Решение Включите директиву valid users в smb.conf: [sharel] path « /sharedstuff comment « testfiles read only - No valid users e andrew foober dana Группы Unix обозначаются префиксом «+»: valid users e +sambausers Группы должны существовать на сервере, в /etc/group. Это обычные группы Linux, а не какие-то специальные группы Samba.
23.10. Создание общедоступных сетевых каталогов 389 Вы также можете исключать отдельных пользователей или группы директивой invalid users: invalid users - root +wheel +bannedusers He забудьте перезапустить Samba после изменения smb.conf. Комментарий При отсутствии групп NIS (Network Information Services) используйте знак «+», чтобы в поиске использовались только группы Unix. Префикс @ (например, @bannedusers) означает, что сервер Samba должен сначала провести поиск в базе данных NIS, а затем в данных Unix. Чтобы использовать только группы NIS, используйте префикс & (&bannedusers). См. также smb.conf(5). 23.10. Создание общедоступных сетевых каталогов Проблема Имеется несколько рабочих групп или отделов, для которых требуется организовать общий доступ к файлам. Вы хотите создать для них общие каталоги Samba. Решение Создайте общие каталоги и воспользуйтесь средствами управления доступом Samba: [qa-group] comment - qa group's shared files path « /var/share/qagroup valid users - helix patti devdas Gqausers browseable - yes writable - yes Комментарий Пользователи, имеющие доступ к общему каталогу, могут свободно сохранять и загружать документы. Если запретить обзор общих каталогов директивой browseable « по, чтобы они были видны только для своих пользователей. Особо конфиденциальные документы не следует хранить в общих каталогах Samba; лучше воспользуйтесь OpenSSH и rsync на базе ssh (см. главы 16 и 17). См. также smb.conf(5).
390 Глава 23. Samba 23.11. Работа с домашними каталогами пользователей в Samba Проблема Вы хотите, чтобы пользователи могли просматривать свои домашние каталоги на серверах Samba. Так они смогут всегда обратиться к своим персональным файлам независимо от того, с какого компьютера выполнен вход. Решение Включите следующий фрагмент в файл smb.conf: [homes] comment = User's Home Directories valid users - *S browseable ■ No read only » No Пользователи Linux могут подключаться к своим домашним каталогам командой smbclient: $ smbclient //windbag/homes -U <пользователь> <пароль> Итак, пользователь Andrew с паролем bigsecret подключается к своему домашнему каталогу следующей командой: $ smbclient //windbag/homes -U andrew bigsecret Далее команда smbmount монтирует общий каталог, и файлы становятся доступными (см. раздел 23.18). Smb4k и LinNeighborhood (см. раздел 23.17) — отличные графические программы Linux для работы с домашними каталогами. Пользователи Windows должны найти сервер в окне Сетевое окружение, а затем подключиться к нему обычным способом. Комментарий Поскольку общие каталога homes исключены из обзора (browseable « No), они не будут отображаться в программах просмотра сети вплоть до подключения к серверу. После подключения отображается только ваш домашний каталог, а каталоги других пользователей остаются скрытыми. Директива valid users = %S означает, что все пользователи Samba могут получить доступ к своим домашним каталогам. Если вы предпочитаете установить ограничения, воспользуйтесь стандартными средствами управления доступом: valid users ■ andres dana Helen helix valid users e +sambagroup invalid users ■ daryl larry +badusers См. также smb.conf(5).
23.12, Построение главного контроллера домена 391 23.12. Построение главного контроллера домена Проблема Требуется настроить в Samba главный контроллер домена для локальной сети. Решение Контроллер домена ведет центральную базу данных паролей, чтобы после входа пользователь имел доступ ко всем ресурсам домена без необходимости повторной аутентификации при обращении к общим файлам или принтерам домена. Централизованная настройка общих файлов и принтеров на сервере Samba упрощает управление доступом. В отличие от одноранговых сетей, системный администратор может в полной мере контролировать доступ к сетевым каталогам. ВНИМАНИЕ Windows XP Home Edition не поддерживает подключения к доменам — ни к доменам Windows, ни к доменам Samba. Windows NT 3.x не поддерживает шифрование паролей, поэтому клиенты NT 3.x не могут подключаться к обычным доменам Samba. На роль доменных клиентов лучше всего подходят Windows 2000 и XP Pro. Процесс настройки состоит из пяти этапов. 1. Установка Samba. 2. Настройка smb.conf. 3. Создание учетных записей пользователей и компьютеров. 4. Создание каталогов. 5. Запуск и подключение клиентов с целью тестирования. С установкой Samba проблем быть не должно. Установка может осуществляться из пакетов или по исходным текстам (в зависимости от ваших личных предпочтений). Далее приводится минимальный файл smb.conf для нового контроллера домена, с настройкой аутентификации и доступа к домашним каталогам пользователей. Совместный доступ к файлам и принтерам в нем не настраивается. Имя рабочей группы становится новым именем домена: [global] workgroup - hoi stein netbios name = windbag server string - Samba PDC domain master - yes os level e 64 preferred master - yes local master - yes domain logons - yes logon script - netlogon.bat security - user encrypt passwords « yes log file e /var/log/samba/log log level - 2
392 Глава 23. Samba max log size e 50 hosts allow « 192.168.1. [netlogon] comment - Network Logon Service path - /var/samba/netlogon guest ok « Yes browseable e No [homes] comment * User's Home Directories valid users e *S browseable « No writeable - Yes Сохраните и закройте smb.conf, затем проверьте синтаксические ошибки testparm: # testparm Перезапустите Samba. Затем создайте административные группы, используя системные номера групп: # groupadd -g 112 sadmins # groupadd -g 113 machines Создайте каталог netlogon: # mkdir -m 0775 /var/samba/netlogon t chown root.sadmins /var/samba/netlogon Для каждого компьютера в новом домене Samba необходимо создать учетную запись. Начните с создания учетных записей Linux для каждого PC на сервере Samba. Суффикс $ доллара является признаком «доверенной» учетной записи компьютера: # useradd -g machines -d /dev/null -с "stinkpad" -s /bin/false stinkpad* # passwd -1 stinkpadS Затем добавьте все учетные записи в базу данных паролей Samba. Знак $ перед именем компьютера при этом не указывается: # smbpasswd -a -m stinkpad Added user stinkpadS. Для начала создайте учетную запись root на сервере Samba командой smbpasswd. Она потребуется вам каждый раз, когда к домену будет присоединяться новый компьютер с системой Windows NT/2000/XP, потому что первый вход в домен должен производиться пользователем Samba root. He забывайте об этом, или ваши компьютеры с Windows NT/2000/XP не смогут присоединиться к домену. Не откладывайте вход в домен, чтобы произвести синхронизацию с сервером и предотвратить возможное похищение учетной записи. Компьютер stinkpad и Samba обмениваются маркерами аутентификации, благодаря чему Samba всегда сможет распознать stinkpad. Это и называется «доверием». Процедура подключения клиентов Windows к домену Samba зависит от конкретной версии Windows. В следующих трех разделах будет показано, как это делается. Комментарий Работоспособность контроллера домена Samba может быть проверена парой простых приемов. Для начала всегда запускается testparm:
23.13. Подключение Windows 95/98/ME к домену Samba 393 $ testparm Load smb config files from /etc/samba/smb.conf Processing section "[netlogon]" Processing section "[homes]" Loaded services file OK. Server role: R0LE_D0MAIN_PDC Для нас важна последняя строка (Server role: R0LE_D0MAIN_PDC). Затем выполните smbtree на сервере: $ smbtree -N added interface ip»192.168.1.5 bcast-192.168.1.255 nmask«255.255.255.0 Got a positive name query response from 192.168.1.5 ( 192.168.1.5 ) Got a positive name query response from 192.168.1.5 ( 192.168.1.5 ) HOLSTEIN Got a positive name query response from 192.168.1.5 ( 192.168.1.5 ) //WINDBAG Samba РОС Чтобы проверить подключение, запустите smbtree с другого хоста Linux в локальной сети. Представленная конфигурация является сугубо минимальной. В нее можно легко добавить общие каталоги и принтеры, как и на любом другом сервере Samba. Общий ресурс netlogon содержит сценарий, автоматически загружаемый на клиенты Windows. Этот сценарий монтирует общие каталоги homes как локальные диски Z. Весь сценарий выглядит так: REM NETL0G0N.BAT net use z: \\linux\samba /yes Присвойте ему имя netlogon.bat и сохраните в каталоге /var/samba/netlogon. Следующие директивы сообщают» что Samba выполняет функции главного контроллера домена (PDC): domain master - yes os level » 64 preferred master в yes local master « yes domain logons - yes Помните: в одном домене не может быть двух главных контроллеров, иначе ничего не будет нормально работать. Файловых серверов Samba может быть несколько, но главный контроллер домена только один. См. также smb.conf(5). 23.13. Подключение Windows 95/98/ME к домену Samba Проблема Новый главный контроллер домена Samba (PDC) готов к работе. Как подключить к нему клиентов с системой Windows 95/98/ME?
394 Глава 23. Samba Решение Это самый простой из всех трех случаев. Сначала войдите в Windows под именем пользователя, которое будет использовано для входа в Samba. Затем убедитесь в правильности настройки сети (см. раздел 23.14). Запустите приложение панели управления Сеть, выберите строку Клиент для сетей Microsoft и щелкните на кнопке Свойства. Установите флажок Входить в домен Windows NT. Введите имя домена (holstein в нашем примере) и установите переключатель Вход с восстановлением сетевых подключений. Щелкните на кнопке ОК и вставьте компакт-диск Windows. Перезагрузите систему, чтобы активировать изменения. После перезагрузки вы сможете войти в домен. Комментарий Помните, что имя рабочей группы в smb.conf определяет новое имя домена. См. также Раздел 23.4. 23.14. Подключение клиентов Windows NT/2000 к домену Samba Проблема Новый главный контроллер домена Samba (PDC) готов к работе. Как подключить к нему клиентов с системой Windows NT/2000? Решение Помните пользователя root, для которого в разделе 23.12 была создана учетная запись Samba? Пора использовать эту учетную запись. В Windows NT запустите приложение панели управления Сеть и выполните команду Идентификация ► Изменить. Щелкните на кнопке Домен и введите имя домена, соответствующее имени рабочей группы в smb.conf. Установите переключатель Создать учетную запись компьютера в домене. Наконец, войдите в домен в качестве пользователя Samba root. Это необходимо для инициализации «доверительных отношений» между сервером и клиентскими компьютерами. В Windows 2000 щелкните правой кнопкой мыши на значке Мой компьютер, выберите Свойства, перейдите на вкладку Идентификация и щелкните на кнопке Идентификатор сети. На экране появляется окно мастера идентификации сети, который поможет выполнить все необходимые действия. Как и в предыдущем случае, первое подключение к домену должно осуществляться в качестве пользователя Samba root. Комментарий Помните, что имя рабочей группы в smb.conf определяет новое имя домена.
23.15. Подключение клиентов Windows XP к домену Samba 395 После успешного подключения к домену последующие входы осуществляются нажатием клавиш CtrL+Alt+Del. Вам будет предоставлен выбор между входом в домен или входом в систему на локальном компьютере без подключения к домену. См. также Раздел 23.4. 23.15. Подключение клиентов Windows XP к домену Samba Проблема Новый главный контроллер домена Samba (PDC) готов к работе. Как подключить к нему клиентов с системой Windows XP? Решение Прежде всего на компьютере должна быть установлена версия Windows XP Professional Edition, потому что версия XP Home не позволяет подключаться к доменам (ни к доменам Windows, ни к доменам Samba). В XP Professional необходимо выполнить ряд дополнительных действий по настройке конфигурации и установить заплатку реестра. Процедура выглядит так: 1. Запустите редактор локальной политики безопасности (Панель управления ► Администрирование ► Локальная политика безопасности). 2. Найдите параметр Член домена: Всегда требуется цифровая подпись или шифрование потока данных безопасного канала и отключите его. 3. Найдите параметр Член домена: Отключить изменение пароля учетных записей компьютера и отключите его. 4. Найдите параметр Член домена: Требует стойкого ключа сеанса (Windows 2000 или выше) и отключите его. 5. Найдите в каталоге usr/share/doc/samba-doc/registry файл WinXP_SignOrSeal.reg. Скопируйте его в Windows и активируйте двойным щелчком. Вмеао этого также можно отредактировать реестр вручную: найдите следу к ш раздел и убедитесь в том, что параметр DWORD равен 0: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameteri" 6. "requiresignorseal"=sdword:00000000; 7. Щелкните правой кнопкой мыши на значке Мой компьютер, выберите команду Свойства, затем щелкните на кнопке Идентификация. На экране появляется диалоговое окно мастера сетевой идентификации. Первое подключение к домену должно осуществляться в качестве пользователя Samba root (см. раздел 23.12).
396 Глава 23. Samba Комментарий Помните, что имя рабочей группы в smb.conf определяет новое имя домена. После успешного подключения к домену последующие входы осуществляются нажатием клавиш Ctrl+Alt+Del. Вам будет предоставлен выбор между входом в домен или входом в систему на локальном компьютере без подключения к домену. См. также Раздел 23.4. 23.16. Включение перемещаемых профилей Проблема Вы часто переходите с одного компьютера на другой. Вам хотелось бы, чтобы при этом использовалась одна и та же рабочая среда: меню, ярлыки, фоновые картинки и т. д., словно вы работаете за одним компьютером. Решение Настройте перемещаемый профиль в файле smb.conf. Включите следующие строки в секцию global logon home - \\*L\*U\.profiles logon path - \\*L\profiles\*U Создайте общий каталог profiles: [profiles] path « /var/profiles writeable - yes browseable - no create mask « 0600 directory mask - 0700 Создайте каталог /var/profiles (или другой каталог, который вы хотите использовать) и назначьте ему следующие разрешения: # mkdir -m 1757 /var/profiles Сохраните изменения и перезапустите Samba. Теперь независимо от того, с какого компьютера будет осуществляться вход, вы окажетесь в своей знакомой рабочей среде. Комментарий Директива logon home предназначена для Windows 95/98/МЕ, а директива logon path — для Windows NT/2000/XP. Имена домена и пользователя подставляются автоматически в виде макропеременных; так получается удобная обобщенная конфигурация, которая может использоваться где угодно. Разрешения create mask и directory mask гарантируют, что чтение и запись профилей будут разрешены только владельцам файлов.
23.17. Подключение клиентов Linux к одноранговой сети или серверу Samba 397 В Windows NT/2000/XP профили включаются по умолчанию. Чтобы включить их в Windows 95/98/МЕ, откройте приложение панели управления Пароли и перейдите на вкладку Профили пользователей. Установите переключатель Каждый пользователь устанавливает личные настройки.... Включение перемещаемых профилей может создать проблемы. При входе в разные версии Windows возможно изменение меню Пуск и ярлыков рабочего стола. Кроме того, если на рабочем столе пользователя накапливается большое количество файлов, они будут занимать много места на сервере Samba. См. также smb.conf(5). 23.17. Подключение клиентов Linux к одноранговой сети или файловому серверу Samba Проблема Пользователям Linux в локальной сети требуется подключиться к файловому серверу Samba или получить доступ к доменам или рабочим группам. А еще им нужны простые, удобные графические обозреватели локальной сети для поиска ресурсов. Решение На хостах Linux необходимо установить Samba (см. раздел 23.2). Существует несколько хороших графических обозревателей локальной сети: О smb4k — на мой взгляд, лучший обозреватель локальной сети для Linux. Программа имеет четкий, продуманный интерфейс, она проста в использовании. Единственный недостаток — то, что для нее необходима установка KDE. Если вы не используете KDE, вам понадобятся kdebase и Konqueror; О Lin Neighborhood — простой, удобный графический интерфейс для Samba и smbmount. LinNeighborhood не зависит от конкретного оконного менеджера или рабочей среды и будет работать в любой среде X; О Konqueror, файловый менеджер KDE — введите smb:// в адресной строке, чтобы отобразить список всех доступных рабочих групп. Работа Konqueror зависит от LISA — информационной сетевой службы, устанавливаемой по умолчанию в большинстве дистрибутивов. Если вам все же потребуется отдельно установить LISA, она существует в обоих форматах, .deb и RPM; О Nautilus, файловый менеджер Gnome — введите smb:// в адресной строке, чтобы отобразить список всех доступных рабочих групп.
398 Глава 23. Samba Комментарий Чтобы организовать совместный доступ к файлам для пользователей Linux, настройте общие каталоги, как описано в разделе 23.2. Клиентская часть Samba может устанавливаться отдельно для пользователей, которые хотят только использовать общий доступ, но не собираются открывать общий доступ к файлам сами. Если smb4k не находит рабочую группу автоматически, выполните команду Settings ► Configure ► smb4k ► Network ► Network Search и щелкните на smbclient. По умолчанию используется nmblookup, но smbclient обычно работает лучше. Окно smb4k показано на рис. 23.1. ей '.rjctWDrV -Siwss :0 :'■<■ ;Ч : DRKG^OUP -TfPOWEPPG -leSCJ -Шо* -*£E$ Etoo* rn 3Fb i ^ettiFMj-i ypfi ; i :Г71 jjype t>*K pt* DlvK ■*ВИ*РЮЛЫШИ -i^rbclnvr ■t^piinU -. gSTIMKfWO '-^epp'wmi **\V ^Di---'- 1- |±£апагну2 hBmam -£я*пягя2 Prtntef Duk Disk QnK DtJh №h Dllh а..бШ;Ш :.PAddf«l. 192.ГЕ8 1.10 igj.ifiB.i loo ;92 168 1 5 -A :^E):- lCom*nent Qstault lfwt П. и.-и (ГШй L'.rM . ill l П ЙГЙ ten «J*S«CU5000 fl^ndram Pnnte* отел in маек dm SSpHiitlttn Гргггц 1&П flit: HWYirf Home DirectQne* ttiSlltl inarad iHenhmnga 1ЕЯ% ^=^ ^-^J /ff'CWERPCfth/, flSTiUKFAD^pprflrpa rfWriDBAGtanof*'*? '/WINDBAGWiire I Pictures j рЩм Г? i "1 ti ^riare. Share Snare Щ&Я Рг.«1г 'Jitff Йгпир UtBjJ* Vitf* fret. .■^feMf'eft^ ■■■ C8f1# (■ OOfl) г пл .(10SO) Ь**£« 4.BS G8 J64GS £24 OB 11 ltft-пч (4 Oil ■9H/m/vU (ЙОИет Hteyihan*? ^Filssi ■ Г^Ф* ..'■'■ 'и!. >! 1моп*]м*Ыюгк1~ 'jSmWhoTcV Рис. 23.1. Обозреватель сети smb4k В LinNeighborhood обычно требуется дополнительная настройка. Выполните команду Edit ► Preferences; на вкладке Scan введите имя главного обозревателя сети (в примерах данной главы — windbag). На вкладке Miscellaneous введите имя пользователя по умолчанию и выберите каталог для монтирования (это должен быть ваш домашний каталог вида /home/carla/mnt). На вкладке Post Mount настройте файловый менеджер по умолчанию (не забывайте щелкать на кнопке Save на каждой вкладке). После закрытия меню Preferences выполните команду Edit ► Save Preferences. На рис. 23.2 показано окно LinNeighborhood с отображением всех компьютеров рабочей группы. Сделайте двойной щелчок (или щелкните правой кнопкой мыши) на каталоге, который нужно использовать. На экране появляется диалоговое окно Mount, позволяющее использовать каталог монтирования по умолчанию или выбрать новый каталог. Konqueror и Nautilus удобны тем, что в них не нужно специально монтировать общие каталога; операции с файлами выполняются так, как если бы они хранились локально. Впрочем, иногда это создает проблемы. Например, при обраще-
23.18. Подключение клиентов Linux к группам Samba из командной строки 399 иии Konqueror к каталогу, доступному только для чтения, создается впечатление, что вы можете редактировать или добавлять файлы в общий каталог. Тем не менее на самом деле файлы не изменяются и не добавляются. Изменения можно сохранить на своем жестком диске, но не в общем каталоге. «шипмймм File Edit Optmns Й й Вт fl5 windbag ЬгЩ WORKGROUP £-BsT|WKpAD £tB™dbag - Й$Иаге1 L^snareZ I Resource | //» jooi JDBAG/share? ]ject(s) Help X Stop ■ ш ш Log Atid I Comment celerorr щишштщттт ® Prefs Sllnkpafcp anonymous lan file server te strifes shared fllenthlnngs r:i!!!!^!Uli:.=r.^^iiU'iC=Saiif-fl"|jfc^1 1 1 | MOUntpqint ul„,.V±— ■**«#«■*««* шшшшшшшшшвяят ш : About Mountpolnl 1Ш1 Ш1ШИ_ии!ШШШ11Ш1ШШ wsra 1 /home/carta/mnt/WINDBAG/sharBE/ | /home/carla/mnt/WINDBAG/8ha/e2/ ттттттктжшт ! Logging Off 1 Рис. 23.2. Обозреватель сети LinNeighborhood См. также Smb4k (http://smb4k.berlios.de); LinNeighborhood (http://www.bnro.de/-schmidjo); Konqueror (http://www.konqueror.org); Nautilus (http://www.gnome.org/projects/nautilus). 23.18. Подключение клиентов Linux к рабочим группам Samba из командной строки Проблема Графические обозреватели локальной сети, о которых говорилось в разделе 23.17, удобны, однако вам также нужны средства командной строки для просмотра общих каталогов Samba pi пересылки файлов (ведь сеансы X доступны не всегда, или вы просто предпочитаете консоль). Решение Используйте команду smbclient для получения списка общих каталогов и пересылки файлов. При использовании smbclient вам не придется монтировать общие
400 Глава 23. Samba каталоги для приема или отправки файлов; все происходит точно так же, как при использовании протокола FTP (File Transfer Protocol). Также можно использовать команды smbtree и smbmount/smbumount. Обозреватель локальной сети smbtree работает в текстовом режиме, поэтому для работы с ним не нужно запускать X. Вызовите список хостов и общих каталогов рабочей группы при помощи smbtree, а затем используйте smbmount/smbumount для монтирования/демонтирования общих каталогов. Комментарий Чтобы получить список общих каталогов, передайте smbclient имя сервера Samba: $ smbclient -N -К windbag Sharename Type sharel Disk share2 Disk share3 Disk Затем подключитесь к нужному каталогу: $ smbclient -N //windbag/sharel Domain-[WORKGROUP] OS-[Unix] Server-[Samba 3.0.5-DeMan] smb: \> Список файлов выводится командой Is: smb: \> Is D 0 Sat Aug 14 16:47:24 2003 D 0 Sat Aug 14 16:46:14 2003 chatscripts D 0 Sat Aug 14 16:47:24 2003 calendar D 0 Sat Aug 14 16:47:05 2003 47838 blocks of size 65536. 17571 blocks available Для пересылки файлов используются знакомые команды FTP: smb: \> cd chatscripts smb: \chatscripts\> Is D 0 Sat Aug 14 16:47:24 2004 D 0 Sat Aug 14 16:46:14 2004 provider A 656 Tue Aug 19 15:14:46 2003 47838 blocks of size 65536. 17571 blocks available smb: \charscripts\> get provider provider-copy Команда загружает файл provider в локальный рабочий каталог; при этом файл переименовывается в provider-copy. Чтобы переслать файл provider-copy на сервер после завершения редактирования (без переименования), воспользуйтесь командой smb: \chatscripts\> put provider-copy Перечень команд выводится командой ?: smb: \> ? Завершение сеанса: smb: \> quit Comment testfUes more testfUes testfUes galore
23.19. Подключение клиентов Linux к Samba из графического обозревателя 401 Выходные данные smbtree выглядят примерно так: $ smbtree -N WORKGROUP WWINDBAG anonymous Ian file server \\WINDBAG\ADMIN$ IPC Service (anonymous Ian file server) \\WINDBAG\IPC$ IPC Service (anonymous Ian file server) \\WINDBAG\share2 shared filenthinngs \\WINDBAG\sharel testfiles WSTINKPAD lil black box \\STINKPAD\AOMIN$ IPC Service (lil black box) WWINDBAGMPCS IPC Service (lil black box) WPOWERPC celeron WPOWERPCUPCI Remote Inter Process Communication \\POWERPC\PRINTER$ Обнаружив нужный общий каталог, смонтируйте его в своей системе командой smbmount: $ mkdir samba $ smbmount //powerpc/c-win98 samba -o guest Демонтирование общего каталога после окончания работы выполняется командой $ smbumount samba Параметр -о guest предотвращает запрос пароля. Он используется при подключении к анонимным общим каталогам, не требующим аутентификации. Если ис-* пользуется вход с аутентификацией, введите имя пользователя: $ smbmount //windbag/andrew samba -о andrew added interface ip-192.168.1.5 bcast»192.168.1.255 nmask=255.255.255.0 Password: См. также smbmount(8), smbumount(8), smbtree(l). 23.19. Подключение клиентов Linux к домену Samba из графического обозревателя Проблема Требуется подключиться к домену Samba при помощи одной из графических программ, описанных в разделе 23.17, но вы не знаете, как передать Samba имя пользователя и пароль. Решение В Konqueror и Nautilus для этого достаточно просмотреть сеть и щелкнуть на значке домена. На экране появляется диалоговое окно подключения. В smb4k щелкните правой кнопкой мыши на домене и выберите команду Autheni- cation.
402 Глава 23. Samba В LinNeighborhood щелкните правой кнопкой мыши на домене и выберите команду Scan group as user. См. также Smb4k (http://smb4k.berlios.de); LinNeighborhood (http://www.bnro.de/~schmidjo); Konqueror (http://www.konqueror.org); Nautilus (http://www.gnome.org/projects/nautilus). 23.20. Подключение клиентов Linux к домену Samba из командной строки Проблема Требуется подюпочиться к домеиу Samba при помощи smbtree, smbclient и smbumount — но как передать Samba имя пользователя и пароль? Решение Каждой из перечисленных команд можно передать имя и пароль любого пользователя Samba. Таким образом, вы можете просмотреть общий каталог homes, хотя он исключен из обзора, и подключиться к нему из smbclient: $ smbtree -U andrew added interface ip-192.168.1,5 bcast=192.168.1.255 nmask - 255.255.255.0 Password: Got a positive name query response from 192.168.1.5 ( 192.168.1.5 ) Got a positive name query response from 192.168.1.5 ( 192.168.1.5 ) Got a positive name query response from 192.168.1.5 ( 192.168.1.5 ) HOLSTEIN Got a positive nam query response from 192.168.1.5 ( 192.168.1.5 ) WWINDBAG Samba PDC \\WINDBAG\andrew User's Home Directories \\WINDBAG\ADMINS IPC Service (Samba PDC) \\WINDBAG\IPC$ IPC Service (Samba PDC) $ smbclient //windbag/andrew -U andrew Password: Domain=[HOLSTEIN] OS=[Unix] Server»[Samba 3.0.5-Debian] smb: \> Также можно смонтировать общий каталог командой smbmount: $ smbmount //windbag/andrew samba -o andrew added interface ip-192.168.1.5 bcast«192.168.1.255 nmask-255.255.255.0 Password: После завершения работы каталог демонтируется командой $ smbumount samba Комментарий Пароль также можно ввести в командной строке за именем пользователя, но в этом случае его смогут увидеть посторонние: $ smbmount //windbag/andrew samba -о andrew bigsecret
23.22. Общий доступ к принтерам Linux из системы Windows 403 См. также smbmount(8), smbumount(8), smbtree(l). 23.21. Синхронизация паролей Samba и Linux Проблема Пользователи Samba могут изменять свои пароли smbpasswd, но при этом их пароли Linux на сервере Samba не изменяются. Требуется обеспечить синхронизацию паролей. Решение Включите следующие строки в секцию global файла smb.conf: unlx passwd sync - yes passwd program » /usr/bin/passwd *u passwd chat - "*Enter OLD passwd*" *o\\n "*Enter NEW password" *n\\n "*Reenter NEW password*" *n\\n "*Password changed*" Этот фрагмент обеспечивает вызов passwd для изменения паролей пользователей в файле/etc/passwd при изменении паролей Samba. Директива passwd chat управляет процессом изменения пароля и выводом информации. Комментарий Синхронизация работает в одну сторону; смена паролей Linux не приводит к смене паролей Samba. В директиве passwd chat использованы следующие макроподстановки: О %и — имя пользователя; О %о — старый пароль; О %п — новый пароль; О \\п — перевод строки; обеспечивает разбиение вывода passwd chat на несколько строк. Полный список макроподстановок Samba приведен в smb.conf(5). См. также smb.conf(5). 23.22. Общий доступ к принтерам Linux из системы Windows Проблема Требуется предоставить пользователям Windows доступ к принтерам, подключенным к компьютерам с системой Linux, в рабочих группах или доменах Samba.
404 Глава 23. Samba Решение Вам потребуются как CUPS, так и Samba. Вот что необходимо сделать: 1. Установите принтеры на компьютерах Linux с использованием CUPS (см. главу 14). 2. Установите CUPS на сервере Samba. 3. Настройте CUPS для Samba. 4. Создайте общий ресурс printers в файле smb.conf на сервере Samba. Чтобы настроить CUPS для Samba, выполните следующую команду: # In -s 'which smbpooV /usr/lib/cups/backend/smb Следующая секция printers предоставляет общий доступ ко всем принтерам сети: [printers] comment - All printers printing - cups printcap name - cups Перезапустите Samba после редактирования smb.conf. Затем пользователи Windows запускают мастера установки принтеров. Драйверы Windows должны устанавливаться локально, поэтому им понадобятся компакт-диски Windows или диски с драйверами. Комментарий Проследите за тем, чтобы ресурс назывался printers, а ие printer. Printers — зарезервированное имя ресурса Samba (как и homes и global). При установке CUPS необходимо установить полный набор драйверов в пакетах Foomatic и Gimp-Print. Вообще говоря, для клиентов Windows и Linux можно использовать автономный сервер печати CUPS без участия Samba (см. главу 14), но чтобы предоставить доступ к принтерам Windows из системы Linux, потребуется Samba (см. раздел 23.23). В CUPS общий доступ к принтерам организуется гораздо проще, чем в старых системах печати System V или Berkeley. Вам не придется возиться с низкоуровневыми очередями или сложными ресурсами Samba. Просто установите принтеры через CUPS, создайте в Samba ресурс printers, и они появятся в окне Сетевое окружение на компьютере Windows. См. также Глава 14; раздел 23.23. 23.23. Общий доступ к принтерам Windows из системы Linux Проблема Имеется смешанная локальная сеть Windows/Linux. Требуется, чтобы пользователи Linux могли пользоваться принтерами, подключенными к компьютерам Windows.
23.24. Запуск приложений Windows в Linux 405 Решение Вам потребуются как CUPS, так и Samba. Вот что необходимо сделать: 1. Установите принтеры на компьютерах Windows. Откройте общий доступ к ним так, как это обычно делается. 2. На компьютерах Windows NT/2000/XP убедитесь в том, что «гостевая» учетная запись включена, а доступ к общим принтерам разрешен всем. 3. Установите CUPS на сервер Samba (см. главу 14). 4. Настройте CUPS для Samba. 5. Создайте общий ресурс printers в файле smb.conf на сервере Samba. Чтобы настроить CUPS для Samba, выполните следующую команду: # In -s 'which smbspoor /usr/lib/cups/backend/smb Следующая секция printers предоставляет общий доступ ко всем принтерам сети: [printers] comment - All printers printing e cups printcap name - cups Перезапустите Samba после редактирования smb.conf. Затем установите принтеры Windows на сервере Samba при помощи веб-интерфейса CUPS (http://localhost:631/admin). Комментарий Чтобы организовать доступ из Linux к принтерам, подключенным к Windows 95/ 98/МЕ, не нужны ни имя пользователя, ни гостевая учетная запись. Все, что потребуется, — открыть общий доступ к принтеру. В разделе 23.4 более подробно описано включение общего доступа в различных версиях Windows. Для клиентов Windows и Linux можно использовать автономный сервер печати CUPS без участия Samba (см. главу 14), но чтобы предоставить доступ к принтерам Windows из системы Linux, потребуется Samba. См. также Раздел 23.4; глава 14. 23.24. Запуск приложений Windows в Linux Проблема Сервер Samba настроен; общий доступ к файлам и сетевым принтерам успешно работает. Тем не менее при совместном доступе все же возникает одна существенная трудность: несовместимые файловые форматы. Конечно, OpenOffice неплохо справляется с преобразованием даже относительно сложных документов MS Office, но такое преобразование не распространяется на сценарии Visual Basic и прикладные интерфейсы, написанные на Visual Basic. В Linux не удастся использовать файлы Adobe Photoshop, Quicktime или Проигрывателя Windows Media.
406 Глава 23. Samba Может быть, вы планируете когда-нибудь отказаться от MS Office и перейти на 100 % сеть Linux. А может, вы хотите, чтобы в условиях смешанной сети пользователи могли свободно обмениваться файлами независимо от того, на какой платформе они были созданы. Как решить проблемы с несовместимостью форматов? Решение Установите CrossOver Office, чтобы пользователи Linux могли запускать приложения Windows прямо из Linux. В нашем примере будет использоваться бесплатная демонстрационная версия CrossOver Office Standard Edition. Рис. 23.3. Окно установки Crossover Office Рис. 23.4. Выбор режима использования Crossover Office
23.24. Запуск приложений Windows в Linux 407 Загрузите демонстрационную или коммерческую версию продукта. Чтобы все пользователи системы могли использовать Crossover Office, запустите установочный сценарий в качестве привилегированного пользователя root: # sh install-crossover-standard-demo-3.0.1.sh Verifying archive integrity...OK Uncompressing Crossover Office Standard install На экране появляется диалоговое окно, показанное на рис. 23.3. Щелкните на кнопке Begin Install. Когда установка будет почти завершена, появится окно, показанное на рис. 23.4. Установите переключатель Exit now..., чтобы все пользователи системы могли использовать CrossOver Office. Затем в качестве обычного пользователя запустите программу настройки, чтобы установить нужные приложения Windows. В KDE и Gnome выполните команду Crossover ► Office Setup. После нескольких вводных окон появляется окно, показанное на рис. 23.5. Найдите установочные диски всех приложений Windows, щелкните на кнопке Install и переходите к установке. Crossover Office Standard setup «JiOTfices™da,d 5=bip Ada/Remove J Menus j Middens) PJugjris j Fonts ^Settings.) Installed software-— —" —~ ™ —New software ^fcf—y ^ 3jd^ ТЭ new software, Install... click'Install. 1 Help j Cancel OK *pniy Copyright 2004, С ode Weavers, Inc. Jlon 3.0,1 Рис. 23.5. Установка программ Crossover Office
408 Глава 23. Samba Когда программы Windows потребуют перезагрузить систему, CrossOver Office эмулирует перезагрузку командой Crossover ► Simulate Windows Reboot В KDE и Gnome программа установки создает стартовые меню автоматически. В подразделе «Комментарий» рассказано, как создать стартовое меню вручную в других графических средах. Комментарий CrossOver Office по умолчанию устанавливается в каталог /opt/cxoffice, а в каталогах пользователей создаются файлы -/.cxoffice для настройки сред CrossOver Office. При создании команд меню в графических средах, кроме KDE и Gnome, используются следующие пути: О Help — /opt/cxoffice/doc/index.html; О CrossOver Office Setup — /opt/cxoffice/bin/cxsetup; О Reset CrossOver Office — /opt/cxoffice/bin/cxreset; О Simulate Windows Reboot — /opt/cxoffice/bin/cxreboot; О Unistall CrossOver Office — /opt/cxoffice/bin/cxuninstall. CrossOver Office — превосходный инструмент для смешанных локальных сетей. Вы получаете возможность запускать приложения Windows в системе Linux. Это позволяет пользоваться преимуществами более стабильной, безопасной операционной системы, не ограничиваясь собственными приложениями Linux. В настоящее время свыше 1000 приложений устанавливается и работает через CrossOver Office. Перечень можно найти на странице http://www.codeweavers.com/ site/compatibility/. Учтите что не все приложения работают нормально или поддерживают полный объем функций. Даже в официально поддерживаемых приложениях могут возникнуть проблемы. См. также CrossOver Office (http://www.codeweavers.com/site/products/).
24.1. Введение Механизм разрешения имен состоит из двух компонентов: DNS (Domain Name System) и файла hosts. Протокол DHCP (Dynamic Host Configuration Protocol) имеет непосредственное отношение к разрешению имен: DHCP берет на себя «черную работу» по назначению IP-адресов отдельным хостам. Серверы должны иметь статические IP-адреса, а рабочим станциям вполне хватает динамических адресов — просто подключите их к сети, a DHCP сделает все остальное. Служба DNS, лежащая в основе функционирования Интернета, обеспечивает разрешение имен, то есть преобразование символьных имен хостов в числовые адреса. Несмотря на простоту концепции, для ее реализации пришлось создать огромную инфраструктуру. Теоретически без DNS можно было бы обойтись — в конце концов, мы же используем сложные почтовые адреса и номера телефонов из повседневной жизни. Тем не менее механизм разрешения имен обладает многими преимуществами. С одним IP-адресом может быть связано несколько имен; символьные имена лучше запоминаются. Наконец, серверам можно присвоить имена толкиновских героев, мифологических персонажей или красивые астрономические термины (допустим, последнее обстоятельство не так важно, но зато интересно). Реализация DNS Одна из трудностей, с которой сталкиваются администраторы при настройке собственных серверов DNS, заключается в том, что подавляющее большинство документации ориентировано на BIND (Berkeley Internet Name Domain) — самый старый и распространенный сервер DNS. Может показаться, что BIND — это и есть протокол DNS, а не одна из его реализаций. В этой главе рассматривается сервер DNS djbdns. На мой взгляд, он лучше BIND; djbdns компактен, имеет модульную структуру, работает очень быстро и очень хорошо защищен. Кроме того, он прост в настройке и устойчив, поскольку управляющие демоны автоматически перезапускают его в случае неожиданных
410 Глава 24. Разрешение имен сбоев. Репликация сервера djbdns также эффективно и безопасно осуществляется стандартными средствами Linux (такими, как rsync через ssh), а это означает, что вы можете легко защитить пересылку файлов данных с использованием ключей SSH. Сервер BIND существует очень давно и получил широкое распространение. С другой стороны, он представляет собой одну монолитную программу, что усложняет его адаптацию. В сущности, все, что вы можете сделать, — это определить разные конфигурации для разных применений, но такой подход малоэффективен для отключения ненужных компонентов. Из-за этого в BIND давно возникали проблемы с безопасностью. Более того, вместо удобных, надежных, стандартных средств Unix в BIND используются странные закрытые методы репликации зонных файлов на вторичные серверы. Даже до появления rsync не было недостатка в контролируемых механизмах пересылки файлов, так что причина появления этих протоколов, специфических для BIND, остается загадочной. Терминология DNS Термином DNS обозначаются три понятия: протокол DNS, механизм разрешения имен и вся система его реализации, состоящая из регистраторов доменных имен, корневых серверов, ответственных1 серверов, IANA и региональных координаторов, ICANN и кэширующих серверов DNS, обеспечивающих распределение нагрузки. Вот некоторые термины и названия, с которыми вам стоит ознакомиться. О IANA (Internet Assigned Numbers Authority) — Агентство по выделению имен и уникальных параметров протоколов Интернета; группа, координирующая назначение IP-адресов в мировом масштабе (как IPv4, так и IPv6). О ICANN (Internet Corporation for Assigned Names and Numbers) — Корпорация по назначению адресов и имен Интернета. В частности, ICANN осуществляет надзор над назначением и регистрацией доменных имен. О Корневые серверы — всего существует 13 корневых серверов DNS. Чтобы получить их список, введите команду dig без параметров. Все корневые серверы, кроме трех, расположены в США. Впрочем, серверы С, F, I, J и К представляют собой географически распределенные кластеры, поэтому фактическое количество корневых серверов гораздо больше, и они распределены по всей планете. О Авторитетные серверы — серверы DNS, находящиеся под управлением хост- мастера домена и содержащие полную информацию о соответствии имен IP- адресам. Корневые серверы имен не содержат реальных записей DNS; они всего лишь содержат ссылки на авторитетные серверы имен или другие серверы, которым известен маршрут к авторитетным серверам имен. О Кэширующий сервер (кэширующий резольвер DNS) — кэширующие серверы помогают справиться с гигантским трафиком и сложностью структуры. Если бы каждый запрос DNS для домена обрабатывался авторитетным сер- 1 Authoritative. — Примеч. ред.
24.2. Локальное разрешение имен с использованием файла hosts 411 вером, вся схема вскоре остановилась бы. Этого не происходит, потому что Интернет наполнен кэширующими серверами DNS. Кэширующие серверы выполняют огромный объем работы — они обращаются к внешним серверам для удовлетворения запросов DNS и сохраняют результаты поиска в памяти для прямого обслуживания последующих запросов. 24.2. Локальное разрешение имен с использованием файла hosts Проблема Требуется настроить разрешение имен для локальной сети. Поскольку сеть не обслуживает внешних клиентов, хлопоты с регистрацией доменных имен отпадают; вы можете выбрать любые доменные имена по своему усмотрению (эти имена не будут действительными за пределами локальной сети, но это неважно). Сеть стабильна, изменения редки, поэтому настраивать сервер DNS не обязательно. Все, что нужно — это присвоить хостам удобные, легко запоминающиеся имена. А может быть, у вас имеется зарегистрированное доменное имя, и в сети уже работает сервер DNS, но вы хотите сохранить данные важных компьютеров в файлах hosts на случай, если сервер DNS выйдет из строя. Решение Используйте файлы hosts. И в Linux, и в Windows эти файлы имеют одинаковую структуру. В большинстве версий Linux приходится редактировать два файла: /etc/hostname и /etc/hosts. В файле/etc/hostname вводится только имя хоста: windbag В Red Hat и Fedora вместо /etc/hostname редактируется файл /etc/sysconfig/ network: HOSTNAME-windbag Файл/etc/hosts определяет доменное имя. Файл всегда должен содержать запись localhost, после которой в отдельной строке указывается IP-адрес и полное доменное имя: 127.0.0.1 local host.localdomain localhost 192.168.1.5 w1ndbag.test.net windbag Проверка конфигурации: $ hostname windbag $ hostname --fqdn w1ndbag.test.net $ dnsdomainname test.net Изменения вступают в силу после перезагрузки компьютера.
412 Глава 24. Разрешение имен Чтобы задать имя хоста в системе Windows, щелкните правой кнопкой мыши на значке Мой компьютер, выберите команду Свойства и введите имя на вкладке Имя компьютера. Местонахождение файла hosts зависит от версии Windows; проще всего найти файл командой Пуск ► Поиск. Все компьютеры локальной сети должны содержать идентичные копии файла hosts. Когда это будет сделано, компьютеры смогут обращаться друг к другу по именам, и вы сможете использовать приложения, зависящие от имен хостов (такие, как Samba). Комментарий Файл hosts был первым способом установления соответствия между именами и IP-адресами хостов. Механизм DNS был изобретен из-за того, что с увеличением количества хостов работать с файлами hosts становится неудобно. Файлы hosts по-прежнему обладают рядом преимуществ: О отсутствие зависимости от единого сервера; О возможность использования произвольных доменных имен. Имя используется только в пределах локальной сети, и это обстоятельство избавляет вас от хлопот с регистрацией имен; О возможность произвольного изменения доменных имен может быть удобной для тестирования виртуальных доменов Postfix и Apache; О если использовать файл /etc/hosts только для серверов, которым нужны статические IP-адреса, разрешение имен для остальных хостов сети можно возложить на сервер DHCP и не создавать для них записи hosts (см. раздел 24.3). Пример файла hosts (эти файлы имеют одинаковую структуру в Linux и Windows): 127.0.0.1 1 ocalhost.1ocaldomain 1ocalhost 192.168.1.5 windbag.test.net windbag 192.168.1.6 powerpc.test.net powerpc 192.168.1.10 w1ndbag.test.net stlnkpad См. также hosts(5). 24.3. Настройка сервера DHCP Проблема Вы не хотите возиться с настройкой разрешения имен для рабочих станций. Им не нужны статические IP-адреса, поэтому вы предпочитаете, чтобы адреса автоматически назначались сервером DHCP. Решение Установите и настройте dhcp. Исходный tar-архив находится по адресу http:// www.isc.org. Также существуют пакеты для RPM и Debian (поищите пакеты с именами dhcp). Включите ссылку на сервер dhcp в конфигурацию клиентских компьютеров.
24.4. Настройка клиентов dhcp 413 Комментарий Сервер dhcp может поставлять клиентам всю информацию о конфигурации сети. Конфигурация самого сервера определяется содержимым файла/etc/dhcpd.conf. Примерное содержимое этого файла: # /etc/dhcpd.conf default-lease-tlrae 259200: max-lease-time 518400: subnet 192.168.1.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0: option broadcast-address 192.168.1.255: option routers 192.168.1.1: option domainOname "test.net": range 192.168.1.59 192.168.1.100: option domain-name-servers 152.163.199.56. 198.83.210.28: } Смысл параметров вполне тривиален. Время аренды задается в секундах, поэтому минимальное и максимальное значения в этом примере составляют три и шесть дней. Параметр option routers указывает на шлюз Интернета или шлюз подсети. В записи domain-name-servers указываются либо кэширующие серверы вашей сети, либо серверы имен поставщика услуг Интернета. В представленном примере используются приватные, немаршрутизируемые адреса IPv4. Далее приводятся классы приватных адресов в двух вариантах записи, квартетной и CIDR (Classless Inter-Domain Routing): 10.0.0.0 - 10.255.255.255 (10/8) 172.16.0.0 - 172.31.255.255 (172.16/12) 192.168.0.0 - 192.168.255.255 (192.168/16) Вероятно, вы уже слышали об IPv6, следующем поколении IP. В книге этот протокол не рассматривается; вероятно, IPv4 еще будет использоваться достаточно долго. За дополнительной информацией о IPv6 обращайтесь по адресу http:// www.iana.org/ipaddress/ip-addresses.htm. Настройка клиентов dhcp для Linux и Windows описана в следующем разделе. См. также dhcp-options(5), dhcpd.conf(5), dhcpd(8); RFC 1918. 24.4. Настройка клиентов dhcp Проблема Требуется обеспечить подключение клиентских компьютеров Linux и Windows к серверу dhcp, чтобы назначение им IP-адресов происходило автоматически. Решение В Windows запустите приложение панели управления Сеть и откройте диалоговое окно свойств TCP/IP. Установите переключатель Получить IP-адрес автоматически.
414 Глава 24. Разрешение имен В Linux это делается так же легко; единственная проблема заключается в том, что местонахождение файла конфигурации зависит от дистрибутива. В Red Hat и Fedora внесите изменения в/etc/sysconfig/network-scripts/ifcfg-ethO: TYPE-Ethernet DEVICE-ethO BOOTPROTO-dhcp 0NB00T«yes DHCP_HOSTNAME«st1nkpad В Debian редактируется файл /etc/network/interfaces: auto 1o iface 1o 1net loopback auto ethO Iface ethO 1net dhcp Комментарий Также можно воспользоваться графической программой. В Red Hat и Fedora используйте system-config-network. В KDE и Gnome существуют собственные графические утилиты (как и практически во всех дистрибутивах Linux), так что выбор достаточно богат. Еще один вариант — системно-независимая утилита сетевой конфигурации netGo, позволяющая создавать профили для удобного подключения к разным сетям. См. также Документация по дистрибутиву Linux или графической среде. 24.5. Включение статических хостов в dhcp Проблема Имеются серверы или другие компьютеры, которым должны быть назначены статические IP-адреса. Можно воспользоваться файлом /etc/hosts, но было бы слишком утомительно редактировать /etc/hosts на каждом из множества компьютеров, за которые вы отвечаете. Нельзя ли настроить статические адреса в dhcpd.conf? Решение Конечно, можно. Для этого необходимо знать адреса MAC сетевых адаптеров, которые можно узнать при помощи утилиты ifconfig: $ /sbin/ifconfig ethO Link encap:Ethernet HWaddr 00:03:6D:0Q:83:CF inet addr:192.168.1.5 Beast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Вас интересует значение HWaddr. В Windows 95/98/ME откройте сеанс DOS и введите команду winipefg. В NT/ 2000/ХР следует выполнить команду ipconfig.
24.6. Создание общедоступного сервера DNS 415 Создайте в dhcpd.conf запись следующего вида: host maill { hardware ethernet 00:03:6D:00:83:CF; fixed-address 192.168.1.100: } Обратите внимание: многострочные директивы должны быть заключены в фигурные скобки. Серверы имен задаются отдельной директивой в dhcpd.conf, поэтому адреса MAC им не нужны: option domain-name-servers 192.168.1.10. 192.168.1.11 Повторите описанные действия для всех компьютеров, которым должны быть назначены статические IP-адреса. Комментарий Для самых важных серверов также можно создать записи в /etc/hosts на случай отказа для локальных пользователей. В этом случае сбой одного сервера не приведет к нарушению работы всей сети. Каждому сетевому адаптеру назначается уникальный 48-разрядный адрес MAC (Media Access Control). Первые 24 бита назначает IEEE (Institiute of Electrical and Electronical Engineers, Inc.), а последние 24 бита — производитель. См. также dhcp-options(S), dhcpd.conf(5), dhcpd(8). 24.6. Создание общедоступного сервера DNS Проблема Вы администрируете почтовый сервер, веб-сервер или другой общедоступный сервер и хотите создать собственный сервер DNS. Но зачем платить сторонним поставщикам за то, что можно сделать своими руками? Собственный сервер DNS позволит вам задать конфигурацию сети так, как вы сочтете нужным (например, можно создать один общедоступный маршрутизируемый IP-адрес и поместить все серверы за брандмауэром NAT или разместить рабочие станции и внутренние серверы за брандмауэром NAT, а общедоступные серверы — перед ним). Решение Вам потребуется следующее: О статический, общедоступный, маршрутизируемый IP-адрес; О зарегистрированный сервер имен; О постоянное подключение к Интернету;
416 Глава 24. Разрешение имен О учетная запись у поставщика, поддерживающего возможность использования собственных серверов; О сам сервер. Когда у вас появится все перечисленное, обращайтесь к описанию настройки djbdns в других разделах настоящей главы. Комментарий Статический маршрутизируемый IP-адрес предоставляется поставщиком услуг Интернета. Сервер имен должен быть зарегистрирован полномочной организацией. Если вы еще не регистрировали доменные имена, обратитесь по адресу http://icann.org/ registrars/accredited-list.html — на этой странице приводится список регистраторов доменных имен, уполномоченных ICANN (качественного обслуживания это не гарантирует, но по крайней мере это официальные представители). На рис. 24.1 показано, как выглядит форма регистрации. Account Account Management Home > Name Server Registration : icrt Account Owner Contact Information: Carte Schroder Tx Computing Update Account Contact ■ Domain Tools Advanced Domain Search KtiiiHw Domains Register Domains Transfer Domains Name Server Registration You may register or update a name server for domain names that you haue registered with us. The name server will need both a host name and an IP address associated with it. Once you register the name server you will be able to use your name server Tor domain names registered with any registrar. Please 00 NOT enter Vww' with your host name», TMs i\ not a redirecting service - kl will not direct ynur daman i to an IP о4&|ДО, ftdirjo servers are used for weh hosting purposes. If you are unsure about v*hat а пагпЦ s#rVer is or need help registering your name server, p ft* it si? consult our frequently askred (ft^st ions or use the provided 'hfclp' link. Update Маше Servers Update Domain Contacts Host Name: IP Address: I .TUXC0MPUTING.COM ■■г—г NAME management Рис. 24.1. Форма регистрации доменного имени Сервер DNS не предъявляет особых требований к мощности оборудования или скорости канала. В конце концов, для удовлетворения запроса достаточно одного пакета UDP. В идеальном случае объем оперативной памяти должен быть достаточным для хранения зонных и кэшированных данных в памяти. Если сервер DNS работает на компьютере Linux без X и использования других служб, то старого Pentium III с 128 Мбайт памяти будет достаточно для обслуживания пары сотен зон BIND и многих сотен хостов djbdns. Таким образом, для реализации DNS в условиях маленькой сети windbag.net можно легко воспользоваться компьютером, выполняющим другие функции.
24.7. Установка djbdns 417 См. также Документация djbdns (http://cr.yp.to/djbdns.html), 24.7. Установка djbdns Проблема Требуется использовать djbns для создания сервера DNS. Но что и как для этого нужно установить? Решение Потребуются три tar-архива с исходными текстами: daemontools, uscpi-tcp и djbdns. Их можно загрузить с домашней страницы djbdns по адресу http:// cr.yp.to/djbdns.html. После установки можно переходить к настройке конфигурации. Эта процедура будет описана в следующих разделах. Установка daemontools осуществляется следующим образом: # mkdir -m 1755 /package # cd /package Загрузите и распакуйте обновленный tar-архив daemontools в /package: # tar xzvpf daemontools-0.76.tar.gz # cd adm1n/daemontools-0.76 Компиляция и настройка программ daemontools осуществляется командой # package/install Теперь загрузите обновленный tar-архив uscpi и установите программу: # cd /usr/sources # tar xzvf uscpi-tcp-0.88.tar # cd uscpi-tcp-0.88 # make # make setup check Программа устанавливается в /usr/local/bin. Наконец, загрузите и установите djbdns: # tar xzvf djbdns-1.05.tar.gz # cd djbdns-1.05 # make # make setup check Программа устанавливается в /usr/local/bin. Использование djbdns описывается в следующих разделах. Комментарий Пакет daemontools содержит набор утилит для работы со службами (services). В следующих разделах будут использоваться утилиты supervise, multilog и svstat Утилита supervise автоматически перезапускает службы в случае их аварийного завершения.
418 Глава 24. Разрешение имен Утилита multilog автоматически сдвигает содержимое журналов, чтобы они не занимали места на диске и всегда содержали свежие данные. Утилита svstat выдает информацию о состоянии службы. Пакет uscpi-tcp выполняет функции inetd и xinetd для запуска djbdns и других программ Дэна Бернстайна (Dan Bernstein). Единственное, что от вас потребуется, — установить ее. Все остальное будет сделано автоматически. Пакет djbdns представляет собой семейство программ DNS. Мы будем использовать dnscache, кэширующий сервер DNS, и tinydns, авторитетный сервер DNS. См. также Life with Djbdns (http://www.lifewithdjbdns.com); daemontools (http://cr.yp.to/daemon- tools.html); uscpi-tcp (http://cr.yp.to/uscpi-tcp.html). 24.8. Перемещение журналов tinydns и dnscache Проблема По умолчанию tinydns-conf и dnscache-conf помещают файлы журналов в каталоги /etc/tinydns/log/main и/etc/dnscache/log/main. Требуется переместить эти файлы в каталог /var/log, где обычно хранятся журналы. Решение Чтобы переместить журналы tinydns в /var/log/tinydns, внесите следующие изменения в/etc/tinydns/log/run: #!/Mn/sh exec setuigid dnslog multilog t /var/log/tinydns Сделайте то же самое с dnscache, отредактировав файл /etc/dnscache/log/run: #!/bin/sh exec setuigid dnslog multilog t /var/log/dnscache См. также Описание установки DNS (http://cr.yp.to/djbdns/install.html). 24.9. Создание локального дотирующего сервера имен на базе djbdns Проблема Требуется создать локальный кэширующий сервер имен djbdns, предназначенный исключительно для обслуживания вашей локальной сети. Наличие такого сервера повысит скорость обработки запросов DNS, а это ускорит просмотр веб-страниц, работу электронной почты и других служб Интернета.
24.9. Создание локального кэширующего сервера имен на базе djbdns 419 Решение Программа кэширующего сервера в пакете djbdns называется dnscache. Проведите предварительную подготовку системы, установив пакты daemontools, uscpi-tcp и djbdns (см. раздел 24.7). После установки всех необходимых программ убедитесь в правильности установки djbdns: $ dnsip www.oreinynet.com 208.201.239.37 208.201.239.36 Создайте двух системных пользователей, которые будут являться владельцами dnscache и dnslog. Присвойте им любые имена (в нашем примере они будут называться dnscache и dnslog): # useradd -d /dev/null -s /bin/false dnscache # useradd -d /dev/null -s /bin/false dnslog Задайте IP-адрес и каталог для dnscache: # dnscache-conf dnscache dnslog /etc/dnscache 192.168.1.5 Создайте список «разрешенных» пользователей; в следующем примере использование dnscache разрешается компьютерам локальной подсети: # touch /etc/dnscache/root/ip/192.168.1 Запустите сервер: # In -s /etc/dnscache /service Убедитесь в том, что сервер успешно запущен, командой svstat: # svstat /servlce/dnscache /service/dnscache: up (pid 6776) 30 seconds Чтобы проверить, что сервер выполняет свои функции, выведите содержимое локального кэша: # env DNSCACHEIР-=192.168.1.5 dnsqr a www.yahoo.com 1 www.yahoo.com: 193 bytes. 1+9+0+0 records, response, поеггог query: 1 www.yahoo.coro answer: www.yahoo.com 286 CNAME www.yahoo.akadns.net answer: www.yahoo.akadns.net 60 A 66.94.230.52 answer: www.yahoo.akadns.net 60 A 66.94.230.52 Создайте на клиентских компьютерах ссылку на сервер dnscache (см. раздел 24.10). Настройка завершена. Комментарий Кэширующий сервер выполняет две функции: он отвечает на запросы DNS, получая информацию с других серверов, и сохраняет результаты, чтобы в будущем он мог напрямую обслуживать запросы той же информации. Кэш существует только в памяти, поэтому при перезапуске процесса или перезагрузке системы все его содержимое теряется. Пакет djbdns включает ряд сетевых информационных и диагностических утилит: dnsqr, dnstrace, dnsip, tinydns-get, dnsipq, dnsmx и dnsname. За дополнительной информацией обращайтесь по ссылкам из подраздела «См. также».
420 Глава 24. Разрешение имен См. также Утилиты командной строки для получения информации DNS (http://cr.yp.to/ djbdns/tools.html); утилиты командной строки для отладки конфигурации DNS (http://cr.yp.to/djbdns/debugging.html); разные способы настройки dnscache (http:// cr.yp.to/djbdns.html); Life with Djbdns, Simple Setup (http://www.lifewithdjbdns.com/ #Simple%20Setup). 24.10. Настройка клиентов Linux и Windows для использования дотирующего сервера DNS Проблема Кэширующий сервер готов к работе — но как объяснить клиентам Linux и Windows, где его искать? Решение Если клиенты обслуживаются сервером DHCP, отредактируйте файл конфигурации DHCP и включите в него ссылку на новый сервер имен (см. раздел 24.3). Internet Protocol {TCP/IP) Properties ^щ ^Л Gfcneca ; nfiguiotion'i !fn v я: gel IP .--'lrr.^-: *v^n£C* ^tkirrVjNoaily.i? yOU* netv44k $Up . (his capabi&y. Otherwise:, */&л ne^d \o a& yoyfjVetwotk adniinisir^oj far (•] ftfctairvan iPaddrea* automatically Г* Uc^^he'ioJIowingJPdcf^ietit; ~i .^Obtain DNS. *e*ver addjecs autorrtabo -(* Use the follows^ DNS server addseis Piete/redDNS $#y«sr; ■ Alternate DNS sww J92 1S8 1 Рис. 24.2. Настройка конфигурации TCP/IP
24.11. Создание общедоступного сервера PNS с использованием tinydns 421 На хостах Linux со статическими IP-адресами, не обслуживаемых сервером DHCP, серверы имен настраиваются в файле /etc/resolv.conf. В нашем примере серверу имен присвоен адрес 192.168.1.200, поэтому в файл/etc/resolv.conf включается следующая строка: naraeserver 192.168,1.200 Серверы опрашиваются в последовательности перечисления, поэтому при наличии других серверов эта запись должна стоять на первом месте. Обычно поставщик услуг Интернета указывает первичный и вторичный серверы имен; их можно указать в следующих строках: naraeserver 192.168.1.200 nameserver 12.188.166.2 naraeserver 12.188.166.3 На хостах Windows со статическими IP-адресами откройте диалоговое окно свойств протокола TCP/IP. Внешний вид этого окна показан на рис. 24.2. Комментарий Кэширующий сервер DNS работает сам по себе и не требует постоянного администрирования. На клиентском компьютере можно задать до трех серверов имен. Следите за тем, чтобы не предоставить открытый доступ к кэширующему серверу из Интернета! Во-первых, это создает угрозу для безопасности; во-вторых, у вас нет причин обеспечивать кэширование для всех желающих. В разделе 24.9 рассказано, как это делается. В Windows 2000/XP реализован свой встроенный кэш DNS. Его содержимое можно просмотреть командой С:\> ipconfig /dlsplaydns Сброс кэша выполняется командой С:\> Ipconfig /flushdns Сброс кэша позволяет быстро избавиться от устаревших данных (например, при изменении IP-адреса сервера). См. также resolv.conf(5). 24.11. Создание общедоступного сервера DNS с использованием tinydns Проблема Под вашим управлением находятся серверы, которые должны быть доступны для внешнего мира (почта, веб, FTP). Им нужны доменные имена вида www.piter.com, чтобы пользователи были избавлены от необходимости использовать IP-адреса. Для разрешения этих имен вы хотите настроить собственный сервер DNS. Сервер BIND слишком сложен, к тому же вокруг ходят слухи о проблемах
422 Глава 24. Разрешение имен безопасности в BIND. Как бы то ни было, вы выбрали djbdns. Как же настроить работу сервера? Решение Выполните подготовительные действия, описанные в разделе 24.6. Затем выполните описанные далее действия для установки и настройки tinydns, авторитетного сервера DNS из пакета djbdns. Если вы также используете сервер dnscache, его IP-адрес должен быть отличен от IP-адреса tinydns; это очень важная мера без- пасности. Впрочем, при совпадении IP-адресов dnscache и tinydns попросту откажутся работать. Установите djbdns так, как описано в разделе 24.7. Создайте двух системных пользователей с произвольными именами, которые будут являться владельцами tunydns и dnslog: # useradd -d /dev/null -s /bin/false tinydns # useradd -d /dev/null -s /bin/false dnslog Выполните команду tinydns-conf, чтобы создать каталоги и задать IP-адрес сервера tinydns. Укажите системных пользователей в следующем порядке: # tinydns-conf tinydns dnslog /etc/t1nydns 208.201.239.36 Создайте стартовую запись в service: # In -s /etc/tinydns /service Подождите несколько секунд, затем выполните команду svstat и убедитесь в том, что сервер стартовал: # svstat /service/tinydns /servlce/tinydns: up (pid 6811) 14 seconds Если tinydns не будет нормально стартовать, проверьте содержимое журнала в/etc/tinydns/log/main/current. Там вы узнаете, в чем проблема. Теперь можно переходить к созданию хостовых записей. В следующем примере для этой цели используются сценарии, входящие в поставку tinydns, а имя домена pixels.net было зарегистрировано уполномоченной организацией. Допустим, мы хотим зарегистрировать три хоста, перечисленных в табл. 24.1. Таблица 24.1. Хосты pixels.net Адрес 208.201.239.36 208.201.239.37 208.201.239.38 Имя parsley sage rosemary Роль DNS, почта FTP Веб-сервер Псевдоним ftp www Записи создаются следующими командами: # cd /service/tinydns/root # ./add-ns pixels.net 208.201.239.36 # ./add-ns .239.201.208.in-addr.arpa 208.201.239.36 # ./add-host parsley.pixels.net 208.201.239.36 # ./add-host sage.pixels.net 208.201.239.37 # ./add-host rosemary.plxels.net 208.201.239.38 # ./add-alias ftp.pixels.net 208.201.239.37
24,12. Построение частного сервера DNS 423 # ./add-alias www.pixels.net 208.201.239.38 # make Комментарий Как правило, настройка djbdns осуществляется при помощи конфигурационных сценариев, а не прямым редактированием файла /etc/tindns/root/data. В пакет включены следующие сценарии: О add-host — создание записей А и PTR; О add-mx — добавление почтового сервера; О add-ns — добавление сервера имен; О add-alias — создание записи А без парной записи PTR. См. также Создание сервера DNS (http://cr.yp.to/djbdns/ru-server.html). 24.12. Построение частного сервера DNS Проблема Ваша сеть слишком велика для файла hosts, поэтому вы решили создать сервер DNS исключительно для обслуживания вашей сети. Внешние клиенты обслуживаться не будут. Как это сделать при помощи tinydns? Решение Создайте в своей локальной сети сервер dnscache, как описано в разделе 24.9. Настройте сервер tinydns (см. раздел 24.11) и введите данные внутренних хостов в файле /etc/tinydns/root/data. На следующем шаге необходимо приказать локальному серверу dnscache, чтобы за доменной информацией он обращался к локальному, частному серверу tinydns. Для наглядности воспользуемся примером с сетью pixels.net из раздела 24.11. Создайте следующие файлы, указывая в них IP-адрес частного сервера tinydns: # echo 192.168.1.100 > /service/dnscache/root/servers/pixels.net # echo 192.168.1.100 > /service/dnscache/root/servers/0.168.192.in-addr.arpa Пользователь dnscache должен быть владельцем следующих файлов: # chown dnscache: /service/dnscache/root/servers/pixels.net # chown dnscache: /service/dnscache/root/servers/0.168.192.in-addr.arpa Затем перезапустите dnscache: t svc -t /service/dnscache В дальнейшем сервер dnscache будет обращаться за локальными адресами к локальному серверу tinydns, а за внешними — к файлу/etc/service/dnscache/root/ servers/®.
424 Глава 24. Разрешение имен Комментарий Чтобы этот механизм работал, вам потребуются официально зарегистрированные доменные имена, даже если вы не предоставляете никакого общедоступного сервиса. Если вы хотите использовать в локальной сети любые имена по своему усмотрению, обратитесь к разделу 24.2. См. также Создание сервера DNS (http://cr.yp.to/djbdns/ru-server.html). 24.13. Простое распределение нагрузки в tinydns Проблема В сети имеются дополнительные почтовые, FTP или веб-серверы. Вы хотите настроить их для автоматического распределения нагрузки. Допустим, веб-сайт с интенсивным трафиком обслуживается тремя серверами Apache. Можно ли сделать так, чтобы обращения автоматически передавались наименее занятому серверу? Решение Распределение нагрузки DNS реализуется просто. Достаточно включить данные всех серверов в /etc/tinydns/root/data: +www.pi xels.net:208.201.239.37:86400 +www.pixels.net:208.201.239.38:86400 +www.pi xels.net:208.201.239.39:86400 email.pixels.net:208.201.239.37:a::86400 Anail.pixels.net:208.201.239.37:b::86400 Комментарий Tinydns возвращает до восьми случайных адресов для каждого запроса. Если один сервер станет недоступным, то клиент, пытающийся подключиться к серверу, перейдет к следующему серверу в очереди. См. также Распределение нагрузки между веб-серверами (http://cr.yp.to/djbdns/balance.html).
24.14 Синхронизация с другим сервером tinydns 425 24.14. Синхронизация с другим сервером tinydns Проблема Имеется второй сервер tinydns, используемый в качестве резервного. Как обеспечить его синхронизацию с главным сервером tinydns? Решение Традиционный механизм «rsync через ssh» решает проблему. Следующий сценарий копирует файл DNS data на резервный сервер, а затем выполняет для него команду make: rsync -е ssh -az /etc/tinydns/root/data Sbackup-host:/etc/tinydns/root/data ssh Sbackup-host "cd /etc/tinydns/root; make" Замените Sbackup-host именем или IP-адресом удаленного сервера. Чтобы автоматизировать этот процесс, включите следующие строки в файл /etc/tinydns/root/Makefile; в этом случае выполнение команды make на основном сервере после обновления /etc/tinydns/root/data приведет к автоматическому обновлению резервного сервера: data.cdb: data /usr/1ocal/M n/tinydns•data rsync -e ssh -az /etc/tinydns/root/data Sbackup-host:/etc/tinydns/root/data ssh Sbackup-host "cd /etc/tinydns/root: make" Комментарий Перемещение обычных текстовых файлов — дело нехитрое; для него вполне подойдет программа rsync. Вы можете запланировать регулярные обновления с использованием сгоп или организовать защиту данных и аутентификацию при помощи шифрованных ключей ssh. Резервный сервер также может выполнять функции вторичного сервера DNS. Вы можете настроить клиентские компьютеры для его использования или зарегистрировать его наряду с главным сервером DNS в регистрирующей организации (см. раздел 24.6). См. также Глава 16; глава 17.
Приложение А Поиск документации Linux Документация Linux в WWW Воистину, Linux — дитя Интернета. Чтобы уследить за всеми изменениями и найти всю необходимую документацию, вам придется как следует познакомиться с поисковыми системами и веб-сайтами соответствующей тематики. Первой остановкой на этом пути должен стать веб-сайт вашего дистрибутива Linux. Ищите электронную документацию, файлы HOWTO и FAQ, почтовые рассылки и архивы. Большинство дистрибутивов Linux в той или иной степени адаптируются, поэтому вы должны знать специфические особенности своего дистрибутива. Затем посетите веб-сайты отдельных программ, которыми вы пользуетесь. Поищите электронную документацию, рассылки и сообщества пользователей. Также в Интернете существует огромное количество общих веб-сайтов, посвященных Linux. Далее перечислены некоторые полезные ресурсы. Как обычно, помните о правилах сетевого этикета. Прежде чем отправлять вопрос в рассылку, проведите поиск в его архиве. Если недавно на этот вопрос уже был дан ответ (или если вопрос возникает слишком часто), возможно, вы получите нелестный ответ. Помните о хороших манерах, не обращайте внимания на «троллей» и грубиянов. Жизнь слишком коротка, чтобы тратить ее на бессмысленные перепалки. Веб-сайты Linux The Linux Documentation Project — http://www.tldp.org/. IBM Developer Works — http://www-106.ibm.com/developerworks/linux/. Librenix — http://librenix.com/. O'Reilly Network — http://oreillynet.com/. TuxMobile — http://www.tuxmobil.org/howtos.htmL Wireless LAN Resources for Linux — http://www.hlp.hp.com/personal/Jean_Tourrilhes/ Linux/. The Linux Kernel Archives — http://www.kernel.org. Linux Gazette — http://linuxgazette.net.
Поиск документации Linux 427 Насколько я знаю, существует только одна группа, посвященная поддержке женщин-пользователей Linux, но зато это совершенно замечательная группа. Она содержит ряд замечательных рассылок, включая Newchix для новичков; обучающие курсы по разным темам (таким, как программирование, файловые системы и сети) и т. д. LinuxChix — http://linuxchix.org. Usenet В Usenet существуют десятки групп, посвященных Linux. Начните со следующих групп: comp.os.linux.announce comp.os.linux.hardware comp.os.linux.networking comp.os.linux.security Google Как бы мы жили без Google? Домашняя страница Google — http://google.com. Google Groups, интерфейс поиска в Usenet — http://groups.google.com/.
Приложение Б Информация об устройствах Веб-сайты Linux FAQ - http://et.tldp.org/FAQ/Linux-FAQ/index.html. Linux Network Drivers at Scyld Computing Corporation — http://www.scyld.com/ network. Wireless LAN Resource for Linux — http://www.hlp.hp.com/personal/Jean_Tourrilhes/ Linux. Linux on Mobile Computers — http://tuxmobile.org/. Linux Devices — http://www.linuxdevices.com/. Linux USB Project — http://www.linuxdevices.com/. Linux FireWire — http://www.linuxl394.org/. LinuxPrinting.org — http://www.linuxprinting.org/. SANE (Scanner Access Now Easy) — http://www.sane-project.org/. Advanced Linux Sound Architecture — http://www.alsa-project.org/. Open Sound System for Linux — http://www.4front-tech.com/linux.htmlOSS/. XFree86 — http://www.xfree86.org/. Xouvert — http://www.xouvert.org/. KernelTrap — http://kerneltrap.org/. Linux-Dell-Iaptops — http://www.whacked.net/ldl/faq/. Debian-laptop, рассылка— http://lists.debian.org/debian-laptop/. Linmodems — http://www.linmodems.org/. Hardware Guys — http://www.hardwareguys.com. Usenet comp.os.linux.hardware сотр.os.Linux.portable comp.os.linux.powerpc сотр.os.Linux.x сотр.os.Linux.alpha
Алфавитный указатель А addgroup, команда, 111, 122 adduser, команда, 111, 114 AGP (Accelerated Graphics Port), 242 amavisd-new, 351 amavisd.conf, файл, 351 Apache, 356 Apache Toolbox, 361 Basic и Digest, 369 Virtual Host, директивы, 365 добавление модулей, 360 документация, 356 журналы обращений, 377 страницы ошибок, 372 установка, 358 хостинг, варианты, 357 apachectl, 359 apt-cdrom, команда, 51 apt-get, команда, 49 AuthNaine, директива, 369 Automachron, 312 awk, сортировка, 111 В Bash, приглашение, 284 BitKeeper, 288 bunzip2, 67 С cat, команда, 188 CD-DA, формат, 191 CD-R,CD-RWnCD-ROM,CTaimapTbi, 177 CD/DVD, запись, 176 cdrecord, команда, 179 Checklnstall, утилита, 54, 70 checkout, команда, 297 chfn, команда, 115 chgrp, команда, 139 chkconfig, утилита, 104 chmod, команда, 139 chown, команда, 139 CIFS/SMB, протоколы, 379 Clam Anti-Virus, программа, 351 col, команда, 28 Content Negotiation, 372 Core Development Tools, 67 Courier-IMAP, 323 cron и crontab, файлы, 109 CrossOver Office, 406 CUPS, 27, 230 диагностика, 240 драйверы принтеров, 230 сетевые принтеры, 231 фильтры, 230 CVS, 288 checkout, команда, 297 update, команда, 298 песочница, 297 репозитарии,289 Cygwin, 286 Cyrus-SASL, установка, 329 D daemontools, 417 Debian,49 загрузочные диски, 174 инициализация, 98 обновление пакетов, 55 пакеты, 49 поиск установленных программ, 58 разрешение конфликтов, 61 уровни выполнения, 98 DHCP, протокол, 409 dig, команда, 314 djbdns, 409 dmesg, 74 DNS, 409 авторитетные серверы, 410 корневые серверы, 410 терминология, 410 DNSRBL, списки, 348 dpkg, команда, 49 DRI,243 DSO, 358 Е e2fs progs, 141 edquota, команда, 134 egrep, команда, 23 El Torito, 177
430 Алфавитный указатель Emacs, 79 Ext2, файловая система, 140 Ext3, файловая система, 141 F famdt321 fdisk, 78 FHS, 137 Foomatic, 233 FreshRPMs, 45 fsck, команда, 141 ГзиЬ.файл, 151 G gcc, программа, 67 gdm, 101 GECOS, данные, 114 getty, 244 Gimp-Print, 233 grep, команда, 68 groff, команда, 24 groupadd, команда, 120 groupdel, команда, 121 growisofs, утилита, 189 grpck, команда, 123 GRUB, 193 заставка, 212 защита системных файлов, 210 меню загрузки, 204 установка, 196 gunzip, 67 Н halt, команда, 107 httpd.conf LogFonnat, директивы, 367 VirtualHost, директивы, 365 I IANA.410 ICANN, 410 IMAP, протокол, 320 ipconfig, 414 J JFS, файловая система, 142 JOE, 79 Joliet, стандарт, 178 К КЗЬ, 176 kdm, 101 kerneld, 171 keychain, 282 Knoppix,210 загрузка, 219 установка на жесткий диск, 228 установка программ, 227 Konqueror, 20 L LILO, 193 альтернативная загрузка, 214 загрузка, 213 переход на GRUB, 193 Linux X Window System, 101 перезагрузка, 107 процесс загрузки, 97 In, команда, 105 locate, команда, 23 1рг, команда, 27 lsinod, команда, 248 Ispci, программа, 73 М MAC, адреса, 415 make, 67 man, команда, 19 man path, команда, 25 MBR.97, 193 menuconfig, утилита, 163 mkboot, утилита, 174 mkdir, команда, 157 mkisofs, утилита, 181 Mondo Rescue, 253, 266 Monotone, 288 mount, команда, 150 Mozilla,345 mv, команда, 159 N NetBEUI, 380 NetBIOS, 380 netGo,414 netsync, протокол, 289 nobody, пользователь, 112 NTFS, файловая система, 153 ntp, 309 О ogg-vorbis, формат, 192 Open Relay Database, 349 OpenSSH,264 P passwd, команда, 118 Pinfo, 20 ping, 64 РОРЗ, почтовые серверы, 321 Postfix, 320 Cyrus-SASL, установка, 329 SpamAssassin, 354 аутентификация, 329 журналы, 346 poweroff, команда, 108 PuTTY,286 pwck, команда, 123
Алфавитный указатель 431 Q quotacheck, команда, 134 R rcsdiff, команда, 293 Red Hat загрузочные диски, 174 инициализация, 98 уровни выполнения, 98 ReiserFS, файловая система, 142 remove, команда, 299 repquota, команда, 134 RJOE.80 Rock Ridge, стандарт, 178 root, привилегии su,131 sudo, 132 RPM,32 зависимости, 31 обновление пакетов, 33 удаление пакетов, 34 установка пакетов, 32 rsync, 253 S Samba, 379 аутентификация, 385 версии 2.x и 3.x, 379 главный контроллер домена, 391 клиенты Linux, 397 клиенты Windows, 393 SASL, 322 SCSI, устройства, 75 setgid, 145 Shadow Suite, 110 Slackware инициализация, 98 уровни выполнения, 98 SMTP, протокол, 320 sox, команда, 191 SpamAssassin, 354 Spamcop, 349 Spamhaus, 349 SPEWS, 349 split, утилита, 188 ssh, 253 sudo, команда, 132 SuSE загружаемые модули ядра, 171 T tinydns, 422 touch, команда, 157 traceroute, 64 U umask, 148 umount, команда, 150 USB, устройства, 75 uscpi-tcp, 417 useradd, команда, 110 userdel, команда, 117 V vi,79 Vim, 79, 87 visudo, утилита, 132 W Webalizer,377 Windows OpenSSH, 286 Samba, домены, 393 безопасность, 343 X X Window System, 241 xconfig, утилита, 163 xdm, 101 XF86Config, файл, 245 XFdrake, утилита, 245 XFree86, проект, 241 xinetd, службы, 104 Xnest, 251 Y Yelp, 20 Yum, 44 обновление пакетов, 46 получение информации, 47 сопровождение, 48 удаление пакетов, 47 установка, 44 Z zcat, программа, 24 zless, команда, 24 А авторитетные серверы, 410 архивация и восстановление, 253 асинхронные файловые системы, 152 атрибуты файлов, 140 аутентификация Samba, 385 smtp-auth, 332 с ключом хоста, 275 с открытым ключом, 275 Б безопасность, 110, 343 amavisd-new, 352 Clam Anti-Virus, 351 LILO,216 SSL, 369
432 Алфавитный указатель В виртуальные консоли, 244 виртуальные хосты, 365 внешняя фрагментация, 140 внутренняя фрагментация, 140 вредоносные программы, 343 Г группы, ПО д двоичные драйверы, 73 дисковые квоты, 134 документация, 19 Ж жесткие ограничения, 134 жесткие ссылки, 140 журнальные файловые системы, 141 3 зависимости, 31 загрузчики системные, 193 закрытые ключи, 274 заплатки ядра, установка, 171 К каталоги, 157 компиляция программ, 54 конфигурационные файлы .config, 164 .cvsrc, 302 .joerc, 82 .vimrc, 88 amavisd.conf, 351 bashrc, 284 ntp.conf, 313 rsyncd.conf, 257 XF86Config,246 кэширующие серверы, 410 Л логические блоки, 140 логические тома, 140 М метаданные, 141 мягкие ограничения, 134 мягкие ссылки, 140 О общий доступ к файлам в Windows, 381 протоколы, 380 открытые ключи, 274 П пароли, управление, 118 пользователи, управление, 110 привязка команд, 89 принтеры диагностика, 240 установка, 232 процесс загрузки, 97 Р разделы, 193 fdisk, создание, 159 разрешение имен, 409 разрешения, 140 редактор. См. AppBrowser С серверы времени, 309 системы управления версиями, 288 службы запуск и остановка, 105 приоритет, 103 стримеры, 253 Т текстовые редакторы, 79 У уровни выполнения, 98 учетные записи, блокировка, 117 Ф файловые системы, 137 Ext3,141 JFS, 142 асинхронные, 141 внешняя фрагментация, 140 внутренняя фрагментация, 140 логические блоки, 140 метаданные, 141 ц цепная загрузка, 193 Э экстенты, 140 эмблемы, 376 Я ядро, 162 xconfig, 163 модификация, 162 настройка, 163