Текст
                    А. А. Дидок
Один на один с
FfeeBSD
"МК-Пресс"
Киев, 2006


ББК 32.973-018 УДК 681.3.066 Д44 Дидок А. А. Д44 Один на один с FreeBSD. - К.: "МК-Пресс", 2006. - 704с, ил. ISBN 966-8806-00-Х Эта книга является исчерпывающим руководством системного администратора. Она освещает вопросы установки, настройки и практического использования в сети операционной системы FreeBSD. Автор на основании своего практического опыта работы сетевым администратором в различных крупных компаниях показывает множество аспектов администрирования FreeBSD, включая работу с командными интерпретаторами, управление пользователями и учетными записями, управление файловой системой, использование пакетов приложений и дерева портов, настройка ядра системы, работа в сети и безопасность системы, настройка таких служб и средств как DNS, FTP, NIS, NFS, SAMBA, DHCP, Web-сервер Apache и многое другое. ББК 32.973-018 Дидок Александр Александрович Один на один с FreeBSD Главный редактор: Ю. А. Шпак Подписано в печать 20.03.2006. Формат 70 х 100 1/16. Бумага газетная. Печать офсетная. Усл. печ. л. 57. Уч.-иэд. л. 46. Тираж 2500 экз. Заказ № 6-483 СПД Савченко Л.А., Украина, г. Киев, тел./факс: (044) 517-73-77; e-mail: info@mk-press.com. Свидетельство о внесении субъекта издательского дела в Государственный реестр издателей, производителей и распространителей издательской продукции: серия ДК N851582 от 28.11.2003г. Отпечатано в ЗАО "ВИПОЛ". 03151, г.Киев, ул. Волынская, 60 © Дидок А. А., текст, иллюстрации, 2006 ISBN 966-8806-00-Х © "МК-Пресс", оформление, дизайн обложки, 2006
Краткое оглавление КРАТКОЕ ОГЛАВЛЕНИЕ Часть I. Знакомство с FreeBSD 19 Глава 1. Введение 20 Глава 2. Установка FreeBSD 27 Глава 3. Первый запуск системы 74 Глава 4. Основы работы в системе. Базовые команды 89 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK 132 Часть II. Управление операционной системой FreeBSD 189 Глава 6. Пользователи и управление учетными записями 190 Глава 7. Основы управления системой 211 Глава 8. Файловые системы — управление и мониторинг 232 Глава 9. Установка и обновление сторонних приложений 297 Глава 10. Настройка ядра системы 315 Глава 11. Поддержка системы FreeBSD 338 Часть III. Работа в сети и безопасность системы 351 Глава 12. Настройка сетевой среды 352 Глава 13. Вопросы безопасности системы 402 Глава 14. Коммутируемый доступ. Шлюзы и NAT. Статическая маршрутизация 425 Глава 15. Работа с почтой (e-mail) 434 Глава 16. Базы данных. MySQL 502 Глава 17. Настраиваем Web-сервер 506 Глава 18. Сервер FTP 559 Глава 19. Сетевая файловая система NFS 572 Глава 20. Сервер имен DNS 586 Глава 21. Информационная служба NIS 612 Глава 22. Использование DHCP 632 Глава 23. Динамический DNS (DDNS) 651 Глава 24. Связь с Windows. Использование пакета SAMBA 662 Часть IV. Система X-Window. 693 Глава 25. Использование Х-Window 694
4 СОДЕРЖАНИЕ Краткое оглавление. 3 Содержание 4 Благодарности 15 Предисловие 16 На кого ориентирована книга 17 ЧАСТЬ I. ЗНАКОМСТВО С FREEBSD 19 Глава 1. Введение 20 Понимание операционной системы 20 Как это было: история UNIX 21 Преимущества FreeBSD 22 Использование FreeBSD 24 Философия UNIX 25 ГЛАВА 2. УСТАНОВКА FREEBSD 27 Подготовка к установке 27 Сбор информации 27 Краткое описание разделов в системе i386 29 Выбор метода установки 30 Подготовка загрузочных дискет 30 Подготовка дискет и запись образов 31 Подготовка локального источника установки 31 Создание установочного компакт-диска 32 Подготовка сервера FTP с дистрибутивом FreeBSD 33 Подготовка перед установкой через NFS 33 Начальный этап установки FreeBSD :.... 34 Загрузка системы i386 < 34 Запуск процесса установки с дискет для FreeBSD 4.10 35 Программа конфигурирования ядра UserConfig 36 Запуск процесса установки для FreeBSD 5.3 39 Программа sysinstall 40 Options Editor — редактор опций программы sysinstall 40 Способы установки системы 40 CUSTOM-установка 40 Выбор дисков и создание слайсов. FDisk 40 Именование дисков 40 Редактор FDisk 40 Режим "Dangerously Dedicated" 40 Размещение FreeBSD на нескольких дисках 40 Boot Manager 40 Разбиение на разделы. Точки монтирования 40 Причины разбиения на разделы 40 Правильный выбор количества и размера разделов 40 Программа Disklabel 40 Выбор дистрибутивного набора (на примере FreeBSD 4.11-RELEASE) 40 Набор sre 40 Набор ports 40 Выбор источника установки 40 Установка системы 40 Постнастройка системы 40 Distributions 40 Packages 40 Root Password 40 User Management 40 Console 40 Time Zone 40 Mouse 40 Networking 40
Содержание 5 Interfaces 40 AMD 40 Anon FTP 40 Gateway 40 inetd 40 Mail 40 NFS client/NFS server 40 Routed 40 Sshd 40 Security 40 Startup 40 TTYs 40 Завершение программы установки и перезапуск системы 40 Глава 3. Первый запуск системы 40 Загрузка системы 40 Загрузчик 40 Загрузка ядра 40 Процесс init 40 Программы консоли 40 Консоль и терминалы 40 Консоль 40 Виртуальные консоли/терминалы 40 Файл настройки /etc/ttys 40 Однопользовательский режим 40 Псевдотерминалы 40 Вход в FreeBSD 40 Выход из системы и ее останов 40 Завершение сеанса работы пользователя 40 Останов системы 40 Альтернативная перезагрузка 40 Альтернативное выключение 40 Глава 4. Основы работы в системе. Базовые команды 40 Получение справки 40 Нет шуршанию страниц или использование man 40 Командный интерпретатор 40 Файловая система 40 Работа с файлами и каталогами 40 Типы файлов 40 Регулярные файлы 40 Файлы-каталоги 40 Файлы устройств 40 Сокеты 40 Именованные каналы 40 Ссылки 40 Права доступа к объектам файловой системы 40 Текущий и домашний каталог 40 Имена файлов 40 Метасимволы и символы подстановки 40 Получение списка файлов 40 Изменение текущего каталога 40 Где это я? , 40 Создание файлов и каталогов 40 Копирование 40 Перемещение и переименование 40 Создание ссылок 40 Удаление файлов и каталогов 40 "Искать, найти и... перепрятать" 40 Команды просмотра и обработки файлов, поиск 40 Просмотр содержимого файлов 40 Частичный вывод содержимого файлов 40
Поиск строк по шаблону с помощью команды grep 40 Сортировка содержимого с помощью команды sort 40 Сравнение файлов с помощью утилиты diff 40 Команда wc 40 Замена символов и строк 40 Устранение дубликатов строк 40 Форматирование текста 40 Изменение формата отображения 40 Перенаправление ввода/вывода 40 Редактирование текстовых файлов 40 Использование ее 40 Изучаем vi 40 В заключение 40 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов awk 40 Командные интерпретаторы 40 Установка 40 Интерпретаторы и файл /etc/shells 40 Использование интерпретаторов и не только 40 Файлы инициализации 40 Переменные среды и интерпретатора 40 Переменные интерпретатора 40 Настройка среды интерпретатора .' 40 Настройка sh 40 Особенности настройки bash 40 Настройка csh/tcsh „ 40 Основы программирования 40 Краткий обзор программирования на SHELL 40 Вывод данных 40 Использование переменных 40 Ввод данных 40 Выполнение арифметических операций 40 Управляющие конструкции 40 Работа с файлами 40 Коды завершения 40 Функции 40 Команда trap 40 Язык обработки шаблонов AWK 40 Структура программы на языке AWK 40 Вызов AWK 40 Использование переменных и выражений в AWK. 40 Селекторы 40 Описание блока действий 40 Ввод и вывод данных 40 Функции 40 Пример сложной программы на AWK. 40 В заключение 40 ЧАСТЬ II. УПРАВЛЕНИЕ ОПЕРАЦИОННОЙ СИСТЕМОЙ FREEBSD 40 Глава 6. Пользователи и управление учетными записями 40 Понимание учетных записей 40 Суперпользователь root 40 Системные (псевдо-) пользователи 40 Обычные пользователи системы 40 Управление учетными записями пользователей 40 Файлы учетных записей пользователей 40 Добавление пользователей 40 Утилита adduser 40 Добавление нового пользователя с существующим UID 40
Содержание 7 Удаление пользователей 40 Утилита rmuser 40 Утилита pw 40 Изменение учетных записей 40 Использование chpass для изменения информации 40 Использование passwd для изменения пароля 40 Получение информации о пользователе 40 Классы 40 Группы пользователей , 40 Глава 7. Основы управления системой „ 40 Каталоги с файлами конфигурации системы 40 Каталог /etc 40 Сценарии конфигурации /etc/rc 40 Файлы /etc/def aults/rc. conf и /etc/rc . conf 40 Файл /etc/rc. local 40 Файл приветствия /etc/motd 40 Файл /etc/sysctl. conf 40 Конфигурационный файл /etc/syslog. conf для службы ведения журналов системных сообщений syslogd 40 Файл /etc/news у slog, conf 40 Другие файлы 40 Использование сценария /etc/rc в FreeBSD 5.x 40 Планировщик задач сгоп, файлы crontab 40 Настройка приложений, каталог /usr/local/etc 40 Запуск приложений пользователя 40 Использование технологии rcNG 40 Процессы, даемоны и сигналы 40 Мониторинг процессов и производительности 40 Даемоны и сигналы 40 Глава 8. Файловые системы — управление и мониторинг 40 Файловые системы — общие вопросы 40 Типы поддерживаемых устройств и их имена 40 Разделы в системе FreeBSD 40 Мониторинг использования файловых систем 40 Утилита df 40 Утилита du 40 Монтирование и демонтирование разделов 40 Команда mount 40 Команда демонтирования umount 40 Файл /etc/f stab 40 Монтирование "неродных" файловых систем 40 Добавление дисков — разметка и форматирование 40 Простота управления с помощью утилиты sysinstall 40 Использование угилит командной строки 40 Запись оптических носителей 40 Проверка и восстановление поврежденных файловых систем 40 Этапы проверки файловых систем с помощью утилиты f sck 40 Режим восстановления суперблоков ; 40 Технологии записи метаданных. Soft Updates 40 Квотирование файловых систем 40 Шифрование файловой системы 40 Настройка системы и создание зашифрованного диска 40 Создание резервных копий и восстановление 40 Утилиты создания резервных копий 40 Утилиты dump и restore 40 Использование tar 40 Другие утилиты 40 Программный RAID 40 Использование технологии CCD 40 "Зеркало" или RAID-1 40
Чередующийся массив (RAID-O) 40 Автоматическая конфигурация и монтирование разделов CCD 40 Восстановление массива 40 Подсистема Vinum 40 Иерархия объектов Vinum 40 Выбор организации набора 40 Начальная настройка на использование Vinum 40 Подготовка дисков и создание конфигурации 40 Глава 9. Установка и обновление сторонних приложений 40 Обзор способов установки приложений 40 Использование пакетов в FreeBSD 40 Получение списка установленных приложений 40 Установка пакетов ; 40 Удаление пакетов 40 Обновление пакетов 40 Дерево портов 40 Установка и обновление дерева портов 40 Структура каталогов в дереве портов 40 Поиск необходимого приложения 40 Понимание порта л-. 40 Установка из портов 40 Освобождение дискового пространства 40 Удаление портов 40 Обновление приложений с помощью портов 40 Нерабочие порты 40 Глава 10. Настройка ядра системы .'. 40 Понимание роли ядра 40 Зачем его пересобирать? 40 Подготовка к настройке 40 Конфигурационные файлы 40 Файл GENERIC 40 Файл LINT 40 Файл NOTES 40 Использование /boot/device.hints 40 Файл РАЕ 40 Файл SMP 40 ФайлОЬОСАКО 40 Создание конфигурационного файла ядра 40 Параметр machine ../. 40 Параметр ери 40 Параметр ident 40 Параметр maxuse r s 40 Параметр hints .л 40 Параметр makeopt ions 40 Параметр options 40 Параметр device , 40 Сборка и установка нового ядра 40 Использование классического способа 40 Использование нового способа. 40 Создание файлов устройств 40 Загрузка альтернативного ядра 40 Загрузка и выгрузка модулей ядра. 40 Глава 11. Поддержка системы FreeBSD 40 Ветви системы 40 CURRENT 40 STABLE ; 40 Обновление системы 40 Синхронизация кода 40 Дескрипторы RELENG 40 Процесс синхронизации 40
Содержание 9 Файл /usr/src/UPDATING 40 Подготовка к обновлению системы 40 Настройки в файле /etc/make . conf 40 Проверка совместимости файлов из каталога /etc 40 Рекомендации по переходу в однопользовательский режим 40 Компиляция системы 40 Очистка каталога 40 Выполнение команды make buildworld 40 Сохранение описания процесса сборки 40 Обновление ядра 40 Установка системы 40 Выполнение mergemaster после обновления 40 Завершающая перезагрузка системы 40 ЧАСТЬ III. РАБОТА В СЕТИ И БЕЗОПАСНОСТЬ СИСТЕМЫ 40 Глава 12. Настройка сетевой среды 40 Первоначальная настройка сети 40 Подготовка к настройке 40 Сетевые карты 40 Настройка интерфейсов. Использование if conf ig 40 IP-псевдонимы 40 Использование утилиты ping 40 Настройка маршрутизации. Шлюзы 40 Файл /etc/rc. conf 40 Имя компьютера. Поиск соответствия имен и адресов 40 Файл /etc/hosts 40 Файл /etc/resolv. conf 40 Файлы /etc/host. conf и /etc/nsswitch. conf 40 Стартовый сценарий /etc/netstart 40 Другие файлы 40 /etc /ethers 40 /etc/services 40 /etc/protocols 40 /etc/hosts . allow 40 /etc/hosts .equiv 40 /etc/dhclient .conf 40 /etc/inetd. conf 40 Настройка IPv6 40 Особенности протокола IPv6 40 Адресация в IPv6 40 Поддержка QoS 40 Встроенная поддержка безопасности 40 Автоматическая настройка 40 Как читать адреса IPv6 40 Использование IPv6 eFreeBSD 40 Настройка клиента сети IPv6 40 Freenet6 40 6bone 40 Автоматическая настройка хостов 40 Настройка DNS 40 Настройка устройств Wi-Fi. 40 Несколько слов о беспроводной технологии 40 На ступень ниже 40 Настройка клиента 40 Шифрование WEP 40 Настройка Bluetooth 40 Введение в технологию 40 Использование Bluetooth eFreeBSD 40 Интерфейс HCI 40
Протокол L2CAP 40 Аутентификация 40 Протокол обнаружения служб SDP 40 Протокол OBEX 40 Возможности RFCOMM РРР или •'Мобильный Internet" 40 Глава 13. Вопросы безопасности системы 40 Защита учетных записей '. 40 Защита root и служебных учетных записей 40 Шифрование паролей 40 Использование одноразовых паролей 40 Первоначальная настройка системы одноразовых паролей 40 Входе использованием одноразового пароля 40 Создание нескольких одноразовых паролей 40 Ограничение на использование системных паролей 40 Система Kerberos 40 Сетевая защита 40 Использование TCP Wrappers 40 Использование IPFW , 40 Возможности IPFW 40 Включение IPFW в FreeBSD 40 Настройка IPFW 40 VPN с использованием IPSEC 40 Создание виртуального сетевого подключения 40 Защита соединения с использованием IPSEC , 40 Использование OpenSSH 40 Защита файлов 40 Использование ACL 40 В заключение 40 Глава 14. Коммутируемый доступ. Шлюзы и NAT. Статическая маршрутизация , 40 Коммутируемый доступ 40 Настройка пользовательского РРР 40 Применение пользовательского РРР 40 Сценарии времени соединения/разьединения 40 Настройка РРРоЕ (РРР over Ethernet) 40 Шлюзы и NAT. 40 Настройка шлюза в Internet 40 Даемон преобразования сетевых адресов natd 40 Статическая маршрутизация 40 глава 15. Работа с почтой (e-mail) 40 Протоколы работы с почтой 40 Протокол SMTP 40 Протокол РОРЗ 40 Протокол IMAP 40 Настройка Sendmail „ 40 Управление работой sendmail 40 Замена sendmail на другой агент пересылки почты 40 Конфигурационные файлы 40 Файл псевдонимов /etc/mail/aliases 40 Файл /etc/mail/access 40 Файл /etc/mail/local-host-names.... 40 Файл /etc/mail/virtusertable 40 Файл /etc/mail/sendmail.cf 40 Главный конфигурационный файл /etc/mail/f reebsd.mc 40 Особенности настройки DNS 40 Дополнительная информация 40 Использование файлов . forward 40 Использование procmail 40 Настройка поддержки TLS/SSL и SMTP-аутентификации 40 Использование sendmail при коммутируемом доступе 40
Содержание 11 Использование серверов перенаправления 40 Использование внешних почтовых фильтров 40 Защита от спама на примере SpamAssassin 40 Защита от вирусов на примере использования ClamAV 40 Работа с РОРЗ 40 Установка и настройка qpoppe r 40 Аутентификация АРОР и шифрование TLS/SSL 40 Сервер IMAP4 40 Настройка IMAP-UW 40 Использование Cyrus-IMAPD 40 Использование fetchmail 40 Конфигурационный файл ~/. fetchmailrc 40 Глобальные опции 40 Опции определения серверов и пользователей 40 Пользовательские почтовые агенты (MUA) 40 Программа mail 40 Почтовый агент elm 40 Работа с программой pine 40 Несколько слов о mutt и evolution 40 Альтернативы Sendmail 40 Глава 16. Базы данных. MySQL 40 Сервер баз данных MySQL '. 40 Главные таблицы базы данных mysql 40 Работа с утилитами пакета MySQL 40 Конфигурация сервера 40 Глава 17. Настраиваем Web-cepbep 40 Протокол HTTP 40 HTTP-запрос 40 HTTP-ответ 40 Коды состояния 40 Установка Web-сервера Apache 40 Запуск и останов сервера 40 Немного о размещении файлов 40 Настройка 40 Всемогущий httpd.conf 40 Общие настройки сервера 40 Управление размещением файлов 40 Управление постоянными соединениями 40 Управление количеством процессов и соединений 40 Параметры соединения 40 Другие часто используемые директивы 40 Контроль доступа 40 Виртуальный хостинг 40 Виртуальный хостинг по именам 40 Виртуальный хостинг по IP-адресам 40 Модули 40 mod_ssI 40 mod_perl 40 mod_php4 40 Дополнительные вопросы 40 Управление MySQL через phpMyAdmin 40 Web-интерфейс к почте с использованием OpenWebMail 40 Пример конфигурационного файла httpd.conf 40 Расширение и альтернативы Apache 40 Глава 18. Сервер FTP 40 Сеанс связи 40 Немного о доступе 40 Настройка FTP 40 Файлы настройки 40 /etc/ftpusers 40
12 /etc/ftpchroot 40 /etc/ftpwelcome 40 /etc/ftpmotd 40 /var/run/nologin 40 /var/log/ftpd 40 /etc/ftphosts 40 /etc/shells ■. 40 Настройка анонимного FTP-доступа 40 Создание пользователя только с FTP-доступом 40 Запуск FTPD в режиме даемона 40 Альтернативные FTP-серверы 40 ■ Pure-FTPd 40 Безопасность 40 Расширенные возможности 40 Установка и запуск 40 Пример конфигурации 40 ProFTPD 40 Особенности и характеристики 40 Глава 19. Сетевая файловая система NFS 40 Преимущества NFS 40 Применение на практике 40 Проблемы безопасности и сохранности данных 40 История NFS .-. 40 NFS Версия 1 40 NFS Версия 2 40 NFS Версия 3 40 NFS Версия 4 40 Использование NFS в FreeBSD . 40 Настройка сервера NFS 40 Даемон portmap (rpcbindj 40 Даемон nfsd 40 Даемон монтирования mountd ..' 40 Файл /etc/exports 40 Настройка клиента NFS 40 Монтирование ресурсов NFS 40 Автоматическое монтирование ресурсов 40 Обеспечение безопасности 40 Глава 20. Сервер имен DNS 40 Введение 40 История DNS 40 Понимание структуры системы DNS 40 Применение 40 Файлы и программы 40 Зоны. Прямой и обратный поиск 40 Запуск сервера имен 40 Используемые сегодня версии BIND 40 Настройка системы BIND8. Файл конфигурации. 40 Настройка первичной зоны 40 Настройка подчиненной зоны 40 Перенаправление запросов. Настройка forward-зоны 40 Использование кэширующего сервера 40 Файлы зон 40 Использование директив 40 $ORIGIN 40 $TTL 40 $ INCLUDE 40 $GENERATE 40 Запись SOA 40 Запись NS 40 Запись MX 40
Содержание 13 Запись А 40 Запись CNAME 40 Другие записи 40 HINFO (Host Information) 40 WKS(Well Known Services) 40 RP (Responsible Person) и TXT 40 Запись PTR. Файлы обратного просмотра 40 Файл localhost. rev 40 Обеспечение безопасности 40 Ограничение доступа 40 Запуск named в "песочнице" 40 Замечания по использованию BIND9 в FreeBSD 40 Поддержка IPv6 в BIND9 40 Глава 21. Информационная служба NIS 40 Сетевая информационная служба N1S 40 Общее понимание NIS 40 Терминология, используемая при работе с NIS 40 Принцип работы 40 использований, N IS 40 Планирование 40 Подготовка 40 Серверы N1S 40 Настройка серверов N IS 40 Настройка основного сервера 40 Карты N1S 40 Настройка вторичного сервера NIS 40 Обновление карт 40 Добавление нового вторичного сервера N1S 40 Клиенты NIS 40 Настройка клиента 40 Обеспечение безопасности NIS 40 Запрет входа определенных пользователей NIS 40 Использование системы securenets 40 Использование сетевых групп 40 Использование N1S совместно с NFS. 40 Глава 22. Использование DHCP 40 Беглый обзор 40 Реализация DHCP в FreeBSD 40 Настройка клиента DHCP 40 Файлы на стороне клиента DHCP 40 Использование sysinstall для включения DHCP 40 Ручная настройка клиента на использование DHCP 40 Программа dhclient 40 Конфигурационный файл /etc/dhclient. conf 40 Настройка времени ожидания 40 Настройка "пожеланий" и требований 40 Модификаторы опций 40 Описание аренды 40 Описание псевдонима 40 Другие операторы 40 Настройка сервера DHCP 40 Установка и подготовка к использованию 40 Файлы на стороне сервера DHCP 40 Даемон dhcpd 40 Конфигурационный файл dhcpd. conf 40 Описание глобальных параметров 40 Ведение отдельного журнала событий 40 Описание подсетей 40 Описание отдельных хостов 40
глава 23. Динамический DNS (DDNS) 40 Краткое вступление 40 Настройка системы 40 Ключи 40 Настройка DDNS-сервера 40 Настройка сервера имен DNS 40 Настройка сервера DHCP 40 Настройка клиента 40 Просмотр результатов 40 Использование асимметричных ключей 40 Возможные ошибки и их решение 40 Глава 24. свяэь с Windows. Использование пакета SAMBA 40 Введение в Samba 40 Операции вереде SMB 40 Клиенты и серверы SMB 40 Безопасность: рабочие фуппы, домены и Active Directory - 40 Рабочие фуппы 40 Домены ; 40 Active Directory 40 Возможности 40 Установка пакета. 40 Файлы и программы 40 Запуск 40 Простейший файл smb.conf. 40 Система SWAT 40 Настройка системы Samba 40 Файл smb.conf 40 Структура файла 40 Использование переменных 40 Включение файлов и использование шаблонов 40 Управление доступом 40 Аутентификация 40 Краткое описание некоторых опций контроля доступа 40 Глобальные опции управления сервером 40 Предоставление доступа к ресурсам 40 Простые примеры настройки 40 ' Настройка простого файлового сервера 40 Настройка Samba как контроллера домена 40 Настройка Samba как члена Active Directory (Windows 2000) 40 Обеспечение безопасности 40 Ограничение доступа 40 Правила IPFW 40 Использование пакета SMBFS 40 ЧАСТЬ IV. СИСТЕМА X-WINDOW 40 Глава 25. использование Х-Window „ 40 X-Window и FreeBSD 40 Установка X-Window 40 НастройкаХ 40 Использование шрифтов 40 Графические оболочки 40 Оболочка GNOME 40 Оболочка KDE 40 Список полезных приложений в портах 40
Благодарности 15 БЛАГОДАРНОСТИ Во все времена человек пытался достигнуть вершин, оказаться впереди. В своих стремлениях, так или иначе, ему приходилось опираться на помощь друзей, родственников, знаки природы. А за помощь благодарят. Написание книги — нелегкий труд, в котором без посторонней помощи невозможно достигнуть успеха, поэтому хочу выразить благодарность всем, кто потратил на меня или на данную работу свои силы и время. В первую очередь, благодарю тех людей и структуры, которые обучали меня и вкладывали знания. Это и моя школа (Киевская область), и Международный Соломонов университет (г. Киев), в частности факультет компьютерных наук. Особая благодарность как группе за доверие, дружбу, которая сохраняется и по сей день, и поддержку на профессиональном пути, так и преподавателям: Цейтлину Г. Е., Погорелому С. Д., Тер- зяну Т. К., Почекайлову В. — за прекрасные лекции, интересные темы и общение. Особый вклад был внесен в период моего обучения и профессионального роста Драбовичем М. Ю, Выражаю благодарность за сотрудничество, укрощение "строптивости", за предоставленную возможность получить практические навыки в управлении сетью уровня предприятия. Ваше сотрудничество и руководство было для меня очень важным, несмотря на наши сложные характеры и расхождения во взглядах на решение множества возникавших вопросов. Благодарю прекрасные коллективы АОЗТ "Киевсоюздорпроект" и ДП "'Миратех" за возможность работать, вкладывать свои знания в их развитие и развиваться самому; за высокий уровень доверия и прощение допущенных ошибок, когда таковые имели место. Весомый вклад внесли Юрий Угаров, Геннадий Опарей, Сергей Школин и Александр Кривенец. Вы очень помогли мне — кто верой и поддержкой, кто предоставленными ресурсами и советами. Так или иначе, без вас написание книги очень затянулось бы. Благодарю за дружбу. Выражаю благодарность своей семье и родственникам, в частности родителям — за мое воспитание, а брату Игорю — за весомый вклад в развитие моих жизненных позиций и приоритетов. Юрию Шпаку — за веру в мои авторские способности и помощь в подготовке и написании данной книги. Не могу не поблагодарить Господа Бога за возможность встретить всех упомянутых людей и за Его личное руководство. Просто за то, что я могу жить, дышать, развиваться и ... писать книги. Всем Вам благодарность и посвящение. Александр Дидок Киев, март 2006г.
16 Предисловие ПРЕДИСЛОВИЕ Перед тем как открыть данную книгу, читатель, наверное, не раз задумывался: а стоит ли переходить на эту "непопулярную и сложную" (как говорят все вокруг) операционную систему, называемую FreeBSD. Само только словосочетание "UNIX-подобная" отпугивает большинство пользователей, а также опытных и "чего только не видавших" системных администраторов. А ведь ситуация с данной операционной системой несколько иная! Несмотря на то. что изначально UNIX разрабатывалась как система для больших вычислительных систем класса "mainframe" и серверов для решения сложных специфических задач (см. раздел "Как это было: история UNIX" главы 1), сегодня она занимает значительную нишу в мире сетевых систем, и не только. Средние и малые компании также заинтересовались данной системой, будучи наслышанными о ее бесплатности, простоте, безопасности и стабильности. Многие пользователи устанавливают FreeBSD и Linux на домашние ПК, узнав о мультимедиа-возможностях, переносимости и скорости работы этих систем. Конечно, нельзя не признать, что очень большую долю рынка среди операционных систем для серверов, рабочих станций и домашних ПК перехватила на первый взгляд простая операционная система Windows от компании Microsoft. Автор книги в свое время также был привязан к данной платформе (в первую очередь — из-за незнания существующей альтернативы), однако по прошествии некоторого времени, ознакомившись с Linux-клонами (Black Cat Linux, RedHat, Mandrake, SCO Linux, AltLinux), некоторыми коммерческими UNIX-версиями (HP-UX, AIX, Solaris for SPARC) и FreeBSD (около 5 лет назад), был вынужден отдать предпочтение последней и признать ее наилучшей на сегодняшний день операционной системой (по крайней мере, для серверов). К СВЕДЕНИЮ. Компания SUN выпускает параллельно бесплатную версию своей ОС для архитектуры Intel под названием SUN Solaris for Intel (x86). Автор книги не скрывает своей симпатии к данному продукту и ставит его на уровень, близкий к FreeBSD (SunOS являлась производной от BSD). Так почему же именно FreeBSD, а не Linux или те же коммерческие версии UNIX? Ответ на данный вопрос получит каждый, кто погрузится в мир UNIX, или кто прочитает эту книгу. Тем не менее, можно сразу отметить самые отличительные превосходства FreeBSD над Linux: более свободная лицензия BSD, в отличие от GNU GPL, позволяет разработчикам распространять свои продукты в бинарном виде без предоставления исходных текстов программ (лидер среди коммерческих продуктов — компания Microsoft — заявила о переносе некоторых своих продуктов на данную платформу); поддержка множества аппаратных платформ (Intel, Alpha. amd64, IA-64, UltraSPARC, PC-98); включает поддержку ядра Linux, основанную на Red Hat, что позволяет использовать продукты, не рассчитанные для запуска в среде FreeBSD; стабильность и традиционность системы от версии к версии и между различными ветвями, что позволяет практически без проблем выполнять обновление или переходить на более новые версии;
На кого ориентирована книга 17 простота и скорость установки (в самых простых случаях работоспособную версию системы можно установить на жесткий диск за 5-7 минут!). Сегодня все больше говорят о безопасности различных систем. Хотелось бы привести немного статистической информации, которая для кого-то может стать шокирующей. В 2004 году системы на ядре BSD были названы самыми безопасными и наименее взламываемыми (по данным британской компании mi2q). В то же время, Linux- системы были признаны самыми "дырявыми" и незащищенными. Наиболее шокирует то, что даже Windows-системы оказались более стабильными и защищенными. Итак, процентное соотношение по количеству взломов выглядит приблизительно следующим образом (BSD - Windows - Linux): 5% - 30% - 65%, — хотя необходимо признать, что все во многом зависит от уровня знаний системных администраторов (тем не менее, даже в этом случае радует, что администраторы BSD-систем — более опытные, чем их собратья, использующие Linux-системы ©). Может возникнуть вопрос: зачем писать еще одну книгу, если их и так достаточно? Но, увы, хороших книг мало, большинство из них пишутся новичками в IT- области, или же эти книги являются просто декларативными (дающими общие описания), не предоставляя ответов на возникающие практические вопросы как для начинающих свой путь в качестве администраторов, так и для специалистов. Побуждающим мотивом к написанию этой книги было не желание "просто написать новую книгу", а стремление поделиться опытом и практическими познаниями, дать рекомендации начинающим, уберечь от неверных шагов в самом начале, предоставить примеры решения реальных и наиболее распространенных задач и проблем, а также, в некоторой мере, научить правильному планированию. А как известно, правильное планирование помогает избежать проблем в дальнейшем, а при их возникновении — быстро и безболезненно их устранить. Итак, вам нужна стабильная и защищенная система с мощной аппаратной поддержкой для установки сервера? Нет проблем! Система FreeBSD — это ваш выбор. А может вы — домашний пользователь, любящий посмотреть новый интересный фильм, поиграть в игрушки, напечатать объявление о поиске потерянного домашнего питомца? И тут вам с FreeBSD повезло! В каком бы качестве вы не решили использовать вашу систему, самый лучший выбор — FreeBSD. Именно это было и остается основной целью создания и развития проекта FreeBSD. Осталось только пожелать удачи в изучении этой "всемогущей и многогранной" системы, поведение которой будет целиком зависеть от ваших потребностей и желаний. НА КОГО ОРИЕНТИРОВАНА КНИГА Книга адресована широкому кругу читателей, но более всего уделяется внимание вопросам, возникающим у системных администраторов FreeBSD. Данная книга также может служить учебником для начинающих пользователей UNIX-систем, которые уже имеют практические навыки работы в других ОС (например, от компании Microsoft). Желательно иметь понимание и опыт работы с аппаратной частью компьютера, ее настройкой — эти знания, как правило, очень пригодятся при первой и последующих попытках установить систему. Поскольку система FreeBSD ориентирована, прежде всего, на работу в сетевой среде, рекомендуется ознакомиться с дополнительной литературой в данной области для приобретения минимальных знаний. Пригодится понимание понятий "клиент" и "сервер", необходимо хорошо ориентироваться в сетевых протоколах и службах. Некоторые начальные сведения по данным вопросам будут кратко рассмотрены в книге. Специалисты с многолетним опытом использования FreeBSD (или другой системы семейства UNIX) смогут использовать эту книгу в качестве справочного пособия. В книге исчерпывающе рассмотрены следующие темы:
18 установка FreeBSD и первоначальная настройка; настройка среды, локализация системы, работа с командными интерпретаторами; администрирование системы, вопросы файловой системы, управление пользователями и группами, основы программирования в среде, мониторинг системы, установка дополнительного программного обеспечения; роль ядра системы, его взаимодействие с клиентским программным обеспечением, подробное описание конфигурирования ядра; ветви системы, возможность постоянного поддержания системы в актуальном состоянии; настройка сетевого окружения; доступ в Internet с использованием модема: настройка почтового. WWW- и FTP-сервера; использование системы в качестве шлюза; вопросы безопасности и обеспечения надежной связи систем с использованием VPN и fPSec; настройка служб DNS, DHCP, NFS, NIS; возможность взаимной работы с Windows-системами, используя сервер SAMBA; работа с системой X-Window. Пара слов для тех пользователей, которые просто решили изучить систему FreeBSD в домашних условиях. Много разделов требуют наличия двух компьютеров, соединенных в локальную сеть. При их отсутствии можно использовать так называемые виртуальные машины. Наиболее популярными в среде Windows являются VMware Workstation и Microsoft Virtual PC. В данный момент оба продукта — коммерческие, однако их стоимость намного ниже стоимости нового ПК. Запуск системы в виртуальной машине, как правило, требует наличия мощного процессора и большого объема оперативной памяти.
ЧАСТЬ I ЗНАКОМСТВО С FREEBSD Эта часть ориентирована преимущественно на начинающих пользователей и администраторов, которые ранее никогда не имели дела с FreeBSD. Будет рассмотрена история, а также основные понятия и философия UNIX-систем. С помощью этой части читатель сможет без проблем установить систему FreeBSD на 1386-совместимый компьютер, разобраться с процессом загрузки системы и научиться элементарным основам работы и программирования в среде FreeBSD.
20 Глава 1. Введение ГЛАВА 1. ВВЕДЕНИЕ Что, в первую очередь, мы понимаем, говоря о FreeBSD? Возможность набирать документы и выводить их на печать? Интересные игры? Прослушивание музыки? Путешествия в просторах Internet? В первую очередь мы говорим о мощной UNIX-подобной операционной системе. Попытаемся для начала понять, что же такое операционная система, и как вписывается в данное понятие FreeBSD, каковы цели, преимущества, история и философия UNIX-систем. ПОНИМАНИЕ ОПЕРАЦИОННОЙ СИСТЕМЫ Операционная система (ОС)— одна из важных частей компьютерной системы как таковой. Компьютерная система состоит из трех компонентов: аппаратной части, операционной системы и набора приложений. Приложения — это, собственно, именно то, для чего и создавались компьютерные системы: они выполняют некоторые задачи. Например, существует множество приложений для просмотра Web-страниц, отдельная категория приложений предназначена для работы с текстом или выполнения экономических расчетов и т.д. Аппаратная часть, которую иногда называют "hardware" ("железо"), — это набор физических устройств, необходимых для работы системы. К таким устройствам можно отнести процессор, жесткий диск, монитор, принтер и т.д. Что же такое операционная система?! Операционная система — это компонент системы, который связывает множество приложений с аппаратными устройствами. Операционная система контролирует и управляет устройствами ПК, и в тоже время управляет приложениями, то есть выступает промежуточным звеном между всеми компонентами компьютерной системы. Для нормального функционирования компьютерной системы необходимо, как минимум, наличие аппаратной части и одной операционной системы. Операционных систем может быть несколько, при этом в разных операционных системах могут выполняться различные, совместимые с ними, приложения. При запуске компьютерной системы именно операционная система принимает на себя функции, необходимые для приведения системы в рабочее состояние, при этом она выполняет инициализацию аппаратных устройств. После загрузки ОС ожидает команды пользователя на запуск и выполнение приложений, а также отвечает за корректный останов системы по требованию пользователя. При запуске приложения ОС запускает процесс (или процессы). В системе одновременно может быть запущено множество процессов, но в действительности в каждый отдельный момент времени процессор может обрабатывать только один процесс. Операционная система постоянно переключается между процессами, позволяя каждому из них выполнить свои вычисления. Переключение происходит настолько быстро, что создаётся иллюзия одновременного выполнения нескольких процессов. Такая система называется многозадачной. Во время завершения процесса операционная система управляет прекращением работы, а также отвечает за освобождение используемых ресурсов. Когда какому-либо приложению требуются ресурсы аппаратного обеспечения, именно операционная сие-
Как это было: история UNIX 21 тема обеспечивает соответствующий доступ (например, во время записи файла на диск или иное'устройство, при выводе документа на печать). Итак, над аппаратным обеспечением стоят такие компоненты как файловая система и управление процессами. Выше следуют набор библиотек, далее— система стандартных и пользовательских приложений. При этом пользователю предоставляется доступ к библиотекам и приложениям, которые составляют интерфейс системы. В системе UNIX выделяют особую часть системных средств, называемую ядром. Ядро отвечает за управление аппаратурой и выполнение процессов. Для системы каждое устройство представляет собой некий специальный файл, что позволяет упростить доступ к устройствам, предоставляя его через стандартные команды чтения/записи; при этом доступ к устройствам разграничивается через права файлов устройств. Файловая система UNIX имеет мощную и в то же время простую систему безопасности. КАК ЭТО БЫЛО: ИСТОРИЯ UNIX Так сложилось, что история UNIX связана с компанией AT&T, в частности — с Bell Laboratories. Главными действующими лицами, с которыми в первую очередь связывают возникновение операционной системы UNIX, были Деннис Ритчи и Кен Томпсон. В середине 60-х годов AT&T Bell Laboratories вместе с несколькими другими компаниями пыталась создать операционную систему под названием Multics, которая применялась бы для решения сложных задач, обладала мощной системой защиты и работала на mainframe. Финансированием занимался департамент безопасности Advanced Research Projects Agency (ARPA, или DARPA). Поскольку Кену Томпсону не понравилось то, как работает Multics — ни по производительности, ни по возможностям — он начал реализовывать свои идеи в маленькой программе на простаивавшем компьютере DEC PDP-7. Вместе с Деннисом Ритчи он создает новую операционную систему для этого компьютера. В 1969 году, по причине очень большого отставания от графика работ, Bell Laboratories выходит из проекта Multics, забирая mainframe. Таким образом программисты Computing Science Research Center остаются без вычислительной среды для продолжения разработок. На то время уже была разработана новая файловая система для UNIX, а также находилась в процессе разработки на ассемблере сама система UNIX, сперва — для DEC PDP-7, а затем — для PDP-11. Питер Ньюманн предложил для новой системы имя "UNIX". Система UNIX должна была стать "мечтой программиста" и представляла собой набор компактных программ, каждая из которых выполняла собственную задачу. В ней были заложены инструментальные средства объединения нескольких программ для выполнения сложных задач. Немного позже Деннис Ритчи разрабатывает новый язык программирования С, и система UNIX полностью переписывается в 1973 году на С. Поскольку язык С в последствии стал межплатформенным, то не возникает никаких проблем в переносе кода с одной системы на другую. В некотором смысле, современная популярность операционной системы UNIX обусловлена именно возникновением С и особенностями этого языка программирования. Поскольку компания AT&T была правительственной монополией, ей было запрещено продавать код UNIX на рынке, но она за небольшую плату распространяла свою систему в исходных кодах для правительственных учреждений и университетов. Таким образом, система начинает быстро популяризироваться. В конце концов, после того как она всего за 400$ оказалась в Калифорнийском университете в Беркли, была создана специальная группа для развития проекта UNIX. Эта группа называлась Computer Systems Research Group. Скорее всего, интерес к UNIX в Калифорнийском университете был связан с переходом Кена Томпсона из Bell Laboratories в 1975 году в этот университет. Здесь ему активно помогают студенты Билл Джой и Чак Хелли, а также другие студенты и препода-
22 Глава 1. Введение ватели. Под их руководством университет в Беркли выпускает свою версию UNIX — Berkeley Software Distribution (сокращенно BSD). В данную версию были включены редактор vi и командный процессор с shel 1, популярные и по сей день. В 1977 году было принято решение разрешить продажу системы UNIX, разработанной компанией AT&T, чем начинают заниматься некоторые компании, продавая измененные версии для различных готовых решений. UNIX начинает внедряться во многие сферы деятельности. В конце 70-х годов Министерство Обороны США объявляет, что ее подразделение Advanced Research Project Agency (ARPA) будет использовать UNIX, и за базовую была признана версия BSD этой системы. При этом правительство выставило определенные требования: поддержка сети и устойчивость системы. С этих пор начинается кропотливый труд над усовершенствованием и развитием данной системы, именно тогда BSD стала многопользовательской и многозадачной. В это же время бывший студент Беркли — Билл Джой, помогавший в разработке версии BSD, — открывает свою компанию SUN Microsystems. Выпускаемые этой компанией рабочие станции Sun работали под управлением операционной системы, производной от BSD, получившей название SunOS. Немного позже разгорается большая "война" между различными компаниями, выпускающими собственные версии UNIX-систем. Благодаря неразберихе, творившейся в конце 80-х, на рынок выступает малоизвестная компания Microsoft со своей версией ОС Windows (несколько ранее она занималась системой Xenix вместе с компанией SCO). В 1991 году произошел перелом в эпохе развития всех UNIX-систем: она была пор- тирована (перенесена) на Intel-платформу х86, которая на то время уже была довольно популярна. Данная портированная версия получает название 386/BSD. В университете в Беркли создается коммерческая группа, которая начинает заниматься продажей BSD для платформы х86. В 1993 году две независимые группы практически одновременно решают выпустить свои проекты на основе версии BSD (ранее эти группы раскололись из-за различных взглядов на развитие BSD-систем). Первым возникает проект NetBSD, основной целью которого было создание доступной и универсальной системы, которая могла бы работать на всех существующих аппаратных платформах. Второй проект назывался "FreeBSD", и его основная цель заключалась в создании простой в использовании и настройке операционной системы, рассчитанной на широкий круг пользователей для выполнения каждодневной, разноплановой работы. В версии FreeBSD за основу было взято использование аппаратной платформы Intel х86 — самой популярной на то время платформы для PC. Позже от группы проекта NetBSD, посчитав, что мало внимания уделяется безопасности и надежности системы, откалывается часть, которая создает собственный проект — OpenBSD. В истории UNIX было еще несколько интересных фактов, связанных как с компанией Novell, так и с компанией Apple, но особо хотелось бы упомянуть, что в 1997 году компания SCO (Santa Cruz Operation), выпускает систему UnixWare 7.0, для которой базовой стала система System 5 — SVR5. Все версии UNIX, производные от версии, разработанной в компании AT&T, подлежат лицензированию в компании SCO. Сегодня, несмотря на то, что уже существуют сотни версий UNIX-систем, их число стремительно растет. Лидерами на рынке и постоянными конкурентами остаются некоторые BSD-версии (MacOS, FreeBSD, NetBSD, OpenBSD, Solaris for x86) и Linux- системы (RedHat Linux, Debian, ASPLinux и др.). ПРЕИМУЩЕСТВА FREEBSD Сегодня ведется множество разговоров относительно преимуществ той или иной системы. Наиболее яро в поддержку своей системы выступают пользователи систем на осно-
Преимущества FreeBSD 23 ве ядра Linux, называя их наиболее простыми, открытыми, безопасными, с прекрасной поддержкой мультимедиа и стабильным ядром. Пользователи систем Windows выдвигают те же аргументы, но при этом дополнительно упоминают об интуитивности и простоте интерфейса, умалчивая закрытость и не бесплатность системы (а может быть просто для большинства людей использование пиратских копий стало нормой). Автор книги считает, что семейство огерМцйоннух* систем Windows компании Microsoft, — Прекрасное решение для настольных домашних и офисных систем, если закрыть глаза на то, что они не бесплатные и ресурсоемкие. Почему же мы так мало слышим о системе FreeBSD? Основная причина заключается в слабой рекламе. Не вдаваясь в поиск проблем и недостатков, рассмотрим, чем же примечательна данная операционная система: FreeBSD довольно популярна в сетях, например Internet, и наиболее популярна при этом —у хостеров и провайдеров. Самые большие и часто посещаемые хосты работают именно на этой системе. Переход на другую платформу, как правило, не планируется. В качестве примера можно привести Yahoo!, Sony, сайт проекта Apache и знаменитый русский сайт документации по открытым системам — OpenNet.RU. Открытость. Все исходные коды FreeBSD открыты для публичного доступа и распространяются вместе с системой. Пользователь на свое усмотрение можете менять исходный код, внедрять свои библиотеки и т.п. Стабильность. Благодаря включению в систему тщательно проверенных библиотек и приложений, постоянному и своевременному выпуску обновлений и исправлений, систему FreBSD в любой момент можно считать стабильной. Вам не придется еженедельно или ежемесячно перезагружать систему из-за зависаний или высокого потребления ресурсов, как это бывает в случае с ОС компании Майкрософт. Существует большое количество всевозможных приложений практически для любых задач. Будь то Web-сервер или же офисный пакет, графическая программа или же игрушки — для реализации этих и других задач существуют мощные приложения, которые, как правило, не придется долго искать в Internet. Наиболее популярные пакеты включены в дерево портов (подробно о дереве портов можно узнать в главе 9, "Установка и обновление сторонних приложений"). Лицензионная политика FreeBSD позволяет бесплатно использовать исходные коды системы в своих разработках. А если я разработчик, который не хочет предоставлять исходные коды своих приложений? Пожалуйста! Это также разрешено лицензией. Высокое быстродействие. Как упоминалось ранее, основная роль в управлении аппаратной частью отводится ядру системы. FreeBSD предоставляет возможность настроить ядро, увеличив производительность за счет исключения поддержки ненужных устройств. Простота и прозрачность настройки. Практически все настройки FreeBSD находятся в текстовых файлах. При этом вы получаете доступ ко всем возможностям, заложенным в систему. К примеру, графический интерфейс настройки Windows-систем, хотя на первый взгляд и выглядит простым, не является "прозрачным", поскольку пользователь, как правило, не понимает, где и какие именно данные сохраняются. А системный реестр настолько велик и "заплатан", что искомую запись подчас не в силах найти даже "гуру". Пользователь может сам решать, нужен ли ему графический интерфейс. При этом установить отсутствующий интерфейс можно в любой момент даже через
24 Глава 1. Введение год использования системы в текстовом режиме. Как правило, серверные станции изначально устанавливают без графической оболочки. Удаленное управление. FreeBSD предоставляет возможность администратору получить удаленно полный доступ к управлению системой без каких либо ограничений, даже находясь на другом полушарии Земли. Большим плюсом при этом, опять таки, является текстовый, а не графический режим работы системы. В данном случае, обладая даже низкоскоростным и некачественным соединением, вы практически не ощутите задержек в работе с терминальной сессией. Для систем Windows до ХР и W2k3 получить полный доступ к системе можно было, только используя нестандартное ПО сторонних разработчиков (VNC, Remote Administrator, и другие пакеты). ИСПОЛЬЗОВАНИЕ FREEBSD Большинство приверженцев систем Windows пытаются узнать, чем же так примечательна FreeBSD, что ее устанавливают даже на домашние ПК. Но ведь суть не в самой операционной системе, а в тех разнообразных задачах, которые, как правило, выполняет домашний ПК. Может это прозвучит странно, но система FreeBSD офаничена только фантазией пользователя. Она позволяет настроить компьютер как ифовой сервер, как систему для разработки профаммных продуктов, как мощный вычислительный сервер и т.д. Все что необходимо, — проникнуться безфаничностью FreeBSD. Что же позволяет оптимизировать FreeBSD под свои потребности? Ответ на этот вопрос очень прост, и уже был дан ранее: это полная открытость кода. Любой разработчик может внести в систему свои изменения, что позволит его продукту работать с потрясающей скоростью. И таких проектов немало. Но давайте рассмотрим последовательно наиболее явные задачи, решаемые на FreeBSD: Internet-сервисы. Мощнейший и безопасный стек TCP/IP в FreeBSD делает эту систему практически идеальной платформой для большинства Internet- приложений: о WWW-серверы; о FTP-серверы; о NFS-серверы; о брандмауэры и шлюзы; о серверы электронной почты; о серверы новостей. При этом для выполнения перечисленных задач можно использовать даже самый слабый компьютер, и обновлять его по мере возрастания нагрузок. Используя лишь один двухпроцессорный компьютер на базе процессора XEON, можно без проблем организовать хостинг более сотни сайтов с поддержкой баз данных. Образование. Для тех, кто начал изучать компьютеры или другую инженерную область, к вопросам операционных систем, архитектуры ПК и сети лучше всего подходить с применением FreeBSD. Для этой операционной системы существует множество CAD-пакетов мощных математических приложений для выполнения расчетов. Графические пакеты под FreeBSD ничем не уступают Adobe® Photoshop. Для профаммистов практически не будет офаничений в выборе языка профаммирования: здесь есть Pascal и Object Pascal, С и C++, Fortran, Assembler, Perl и другие не менее популярные языки. Исследования. Вы являетесь работником исследовательской компании и вам необходима постоянная связь между различными фуппами, постоянные online- конференции, обмен опытом и идеями среди коллег? Именно для вас существует
Философия UNIX 25 огромное количество пакетов (причем бесплатных), и никто не будет задавать вопросов о наличии лицензий и прав на использование. Работа в локальной сети. Даже самый старый ПК без проблем справится с такими задачами как маршрутизация, поиск соответствия имён машин с их адресами, защита от вторжений извне, почтовые пересылки, организация небольшого корпоративного Web-сервера. Организация рабочей станции. FreeBSD прекрасно работает как X-терминал, используя бесплатные Х-серверы XI1 и X.ORG, хотя никто не мешает поставить и коммерческий сервер. Под управлением FreeBSD могут работать множество офисных приложений, предназначенных для облегчения повседневной работы. Если есть мощный сервер и несколько дешевых бездисковых станций, то в этом случае FreeBSD может быть загружена по сети. Разработка программного обеспечения. Программист будет приятно удивлен тем, что FreeBSD распространяется с полным набором бесплатных инструментов для разработчика (например, GNU C/C++). Другими словами, используя бесплатные пакеты, можно создавать коммерческие приложения. ФИЛОСОФИЯ UNIX Что же стало причиной такого быстрого роста популярности UNIX-систем? В первую очередь, удачное стечение обстоятельств, несмотря на постоянные войны и внутреннюю борьбу за рынок (а возможно, именно эта борьба в большей степени и повлияла на популярность UNIX). Во-вторых, те новшества, которые появились впервые именно в этой операционной системе: многозадачность, использование многопользовательской среды и, естественно, поддержка сети. Популярности и развитию UNIX-систем непосредственно и напрямую способствовала их открытость и свободное распространение кода. Но история знала немало случаев, когда успешные идеи после удачного старта в последствии умирали навсегда. И тут на первый план выходит философия, заложенная в систему UNIX. Именно философия системы вначале так повлияла на ее популярность среди разработчиков, а затем — и среди простых пользователей. UNIX была построена как простая, доступная и понятная любому, кто потратит минимум усилий на изучение ее принципов, операционная система. Как правило, выделяют четыре аспекта философии UNIX: Система построена на простых, прямолинейных командах. Исторически сложилось так, что система UNIX создавалась на компьютерах с малыми объемами памяти, разработчики пытались создать программы, которые выполняли бы что-то одно, но максимально хорошо. Затем, благодаря объединению команд с помощью сценариев или каналов, можно было из нескольких маленьких, простых команд создавать сложные программные продукты. • Общий стиль интерфейса. Практически для каждой команды существует набор опций, с помощью которых можно управлять выводом или поведением. Для этого используются буквы или цифры после символа дефиса (например, -F). Для некоторых опций необходим ввод аргумента, (например, -Р cat). Некоторые примеры использования опций и аргументов: 15 -1 man -P cat man Команды могут соединяться в канал (pipe). Как упоминалось ранее, в UNIX присутствует такой мощный инструмент как объединение программ в каналы (серия команд в канале называется конвейером). К примеру, для того чтобы быстро
26 Глава/1, Введение найти необходимый процесс в списке активных процессов и приложений, можно создать канал из программ ps и grep;. ps ax I grep myprocess . I Отсутствие типов файлов. Для UNIX нет разницы, каково содержимое того или иного файла. Это может быть файл базы данных или текстовый файл. Правильная интерпретация содержимого файла возлагается на саму программу, которой он передается на обработку. Сегодня для большинства ОС это является нормой, но во время появления UNIX такого практически не существовало.
Подготовка к установке 27 ГЛАВА 2. УСТАНОВКА FREEBSD В данной главе представлено детальное описание процесса установки новой системы FreeBSD, включая рекомендации по подготовке к инсталляции с учетом планируемого использования и возможностей компьютера или сервера сети. Даны советы относительно того, как определить оптимальный состав ПК и заранее предупредить возможность несовместимости. Подробно описан процесс подготовки загрузочных дискет и ресурса с дистрибутивом системы, а также рассмотрена программа sysinstall и даны рекомендации по правильному разбиению диска на разделы. Несмотря на то, что установка системы X-Window является опциональной частью процесса инсталляции, ее описание вынесено в отдельный раздел книги, посвященный работе с X-Window. Это связано с тем, что в книге основной упор сделан на описание FreeBSD как серверной операционной системы. Установка в данном случае графического ядра не только нерациональна, но и расценивается опытными пользователями FreeBSD как серьезная ошибка, поскольку усложняет управление и уменьшает безопасность и стабильность системы. В данной главе описан процесс инсталляции для компьютеров i386 ("PC-совместимых"). За основу принята установка с дистрибутивов FreeBSD 4.10-, 4.11- и 5.3- RELEASE. ПОДГОТОВКА К УСТАНОВКЕ Итак, вы впервые собрались установить FreeBSD... Предупреждаем, что данный процесс несколько сложнее, чем для систем Windows или Linux. Более того, еще до установки придется решить немало вопросов. В первую очередь, необходимо определить: будет ли система самостоятельной или зависимой от сервера, какими ресурсами она должна обладать для выполнения предполагаемых задач, какое для нее требуется дисковое пространство, кто будет пользоваться данной системой в ближайшее время, существуют ли другие системы в сети и какие функции они исполняют. Ответы на эти вопросы сильно влияют на требования к оперативной памяти, быстродействие и объем дисков, рабочую частоту и количество процессоров. Сбор информации В первую очередь удостоверьтесь в том, что обладаете информацией об аппаратных устройствах компьютерной системы, и в случае необходимости, уточните эту информацию. Создайте и распечатайте таблицу со всеми устройствами в системе и ресурсами, необходимыми для их правильной работы.
28 Глава 2. Установка FreeBSD ВАЖНО ЗНАТЬ. Операционная система FreeBSD работает на самых разных компьютерах с различными шинами; поддерживает множество процессоров, различные типы дисков и SCSI-контроллеров, карты PCMCIA, устройства USB, сетевые карты и карты последовательных портов. Список поддерживаемого оборудования поставляется с каждым релизом FreeBSD. Этот список, как правило, может быть найден в файле hardware . тхт в корневом каталоге установочного компакт-диска, дистрибутива на FTP или в документации программы sysinstall. Списки поддерживаемого оборудования для различных релизов и архитектур можно найти на странице "Информации о релизах" Web-сайта FreeBSD: http://www.FreeBSD.org/ru/releases/index.htral. В первую очередь необходимо выяснить следующее: тип и объем жестких дисков; данные о контроллерах (прерывания, порты ввода-вывода); наличие CD-ROM и дисковода; изготовитель и модель видеокарты, объём видеопамяти; характеристики монитора (если необходимо наличие установленной системы Х-Window), его вертикальную и горизонтальную развертку; наличие модема, к какому порту он подсоединён; тип мыши, количество кнопок; изготовитель и модель сетевой карты, шина, на которую она установлена (PCI, ISA, PC-card), прерывание и адрес. При наличии сети необходимо узнать маску подсети, IP-адрес, DNS-серверы, IP- адрес шлюза, имя домена, локальной машины, а при наличии модема, — к какому порту он подключен, телефон провайдера, имя пользователя и пароль учетной записи. Также узнайте, не используется ли в сети DHCP для присвоения адресов. ВНИМАНИЕ! Если в качестве источника установки используется NFS- иЗпи FTP-сервер, то необходимо обязательно выяснить конфигурацию сети. Если какая-либо информация отсутствует, то во время установки FreeBSD попытается автоматически определить устройства, их производителей и модель, а также выполнить настройку конфигурации (прерывания и порты ввода-вывода). В том случае, если подключены неподдерживаемые или неработающие устройства, успешное завершение установки FreeBSD не гарантировано, и возможно потребуется определять и устранять причину сбоя в установке. Если у на компьютере уже установлена какая-либо операционная система, то ее возможности можно использовать для определения конфигурации системы и идентификации подключенных устройств. Если в компьютере уже установлена какая-либо другая операционная система или хранятся важные данные, то настоятельно рекомендуется сделать резервные копии или убедиться в актуальности имеющихся в наличии копий. В определенный момент инсталляции программа установки сообщит о том, что в случае продолжения вся информация о разделах будет изменена. До этого момента выход из программы установки не мог привести к потере какой-либо информации на дисках, однако, начиная с этого этапа, данные будут затерты и, в случае неправильной настройки системы, восстановить их будет невозможно.
Подготовка к установке 29 В любом случае, резервное копирование рабочих файлов никогда не помешает. Жесткие диски — это механические устройства, которым свойственен износ. Резервное копирование можно производить на различные устройства, например, на CD, Zip, Jaz, магнитные ленты или Другие жесткие диски, в крайнем случае — на гибкие диски. Создание резервных копий — это довольно кропотливый труд, в котором всегда требуется внимательность, осторожность и постоянство. Как правило, резервные копии содержат рабочие файлы, а также файлы конфигурации системы. Для поддержания отказоустойчивости самой операционной системы лучше всего использовать зеркальные массивы (RAID-0) или избыточные RAID-массивы (с контролем четности). Для резервного копирования в FreeBSD обычно используют такие встроенные утилиты как tar (с возможностью сжатия утилитами gzip или compress), dump/restore, cpio. Рекомендуем ознакомиться с этими средствами, изучить их возможности, разобраться с опциями и ключами. Существуют также дополнительные коммерческие решения, упоминание о которых выходит за тематические рамки данной книги. Рекомендуется заранее определить, какой объем диска будет занимать операционная система. Если FreeBSD устанавливается на новый компьютер, то беспокоиться не о чем, однако при установке на компьютер, где уже используется другая операционная система, которую необходимо сохранить, определите, как размещаются данные на дисках (напомним, что в книге рассмотрен вариант установки новой системы для использования в качестве сервера; совмещенный вариант и возникающие при этом проблемы практически не рассматриваются). Краткое описание разделов в системе 1386 Как правило, диски разделяются на отдельные части, называемыми разделами. Один диск может содержать только четыре раздела, которые называются главными, однако для возможности создания большего количества разделов был создан новый тип — так называемый расширенный раздел, в котором можно определить множество логических разделов. Расширенный раздел может быть только один на диск. Для определения типа данных, хранимых в разделах, существует понятие идентификатора раздела (некий номер). Операционная система FreeBSD, например, использует идентификатор 165. Другие операционные системы используют, соответственно, другие номера. Помимо этого, каждая операционная система использует собственный подход в представления разделов. Например, читатель, наверное, наиболее известен подход, применяемый в DOS и Windows, где всем разделам присваиваются буквы (называются буквами дисков, а не разделов), начиная с С: (А: и В: используются для именования флоппи-дисководов). В операционной системе FreeBSD, как и в других UNIX-подобных системах, применяется более наглядная структура именования в виде дерева. FreeBSD может хранить все свои данные в одном главном (root) разделе. Если дисков несколько, то можно создать разделы на каждом из них. Для установки FreeBSD необходимо иметь хотя бы один чистый раздел или раздел с ненужными данными, которые можно уничтожить.
30 Глава 2. Установка FreeBSD Для разбиения или изменения размеров разделов с целью освобождения необходимого для операционной системы места используются, специальные программы (например, Partition Magic). В каталоге tools на дистрибутивном компакт-диске находятся две свободно распространяемые утилиты: FIPS и PResizer, которые позволяют изменять размеры pa3flenbB?;F#T16/FAT32 (Partition Magic поддерживает также изменение размеров NTFS-раэделов). Неправильное использование вышеупомянутых утилит может привести к потере данных на диске. Для минимальной установки FreeBSD необходим диск размером не менее 100 Мбайт, однако такой вариант практически не найдет реального применения. Размер диска для рекомендуемого варианта установки FreeBSD составляет около 400 Мбайт (без учета дополнительных пакетов). Для более комфортной работы (поддержка графического режима, офисные пакеты, хранение персональных данных) потребуется диск объемом 1-4 Гбайт. Если на жестком диске уже существует несколько 'разделов, то можно избежать изменения их размеров и возможной потери данных, попытавшись Освободить один из них за счет переноса информации в другие разделы. В результате, освобожденный раздел можно будет использовать для установки FreeBSD. Выбор метода установки В зависимости от наличия тех или иных аппаратных устройств, а также носителя дистрибутива, могут отличаться и методы установки. Программа установки FreeBSD может установить эту операционную систему из файлов, расположенных: на диске CD-ROM или DVD; на FTP-сервере (через брандмауэр или http-proxy); в разделе DOS на одном из дисков компьютера; на NFS-сервере; в существующей файловой системе; на гибких дисках; на SCSI- или QIC-устройствах. Если у вас нет установочных файлов FreeBSD, то их подготовка подробно описана ниже. ПОДГОТОВКА ЗАГРУЗОЧНЫХ ДИСКЕТ Как правило, в большинстве случаев установку FreeBSD выполняют с загрузочных CD- дисков, однако, в том случае, когда в системе нет CD-привода, для загрузки установочной программы в память компьютера необходимо подготовить несколько дискет. Это вызвано тем, что установочная программа не может быть запущена под управлением существующей операционной системы. В любом случае, рекомендуется установка с CD-ROM как наиболее простая и не требующая дополнительной подготовки. По возможности, используйте именно этот вариант, установив в настройках BIOS компьютера загрузку с CD-привода. Для создания загрузочных дискет, во-первых, необходимо получить их образы. Их можно найти на дистрибутивном компакт-диске в каталоге floppies/ или же загрузить с любого "зеркала'' сервера ftp. FreeBSD.org: ftp: //ftp. freebsd.org/pub/
Подготовка локального источника установки 31 FreeBSD/releases/<arch>/<vers>-RELEASE/floppies/, где <arch> и <vers> — архитектура компьютера и номер версии системы соответственно. "Зеркала" именуются, как правило, добавлением цифры после ftp, например, ftp2.freebsd.org. Образы дисков — это файлы с расширением . flp. Для установки FreeBSD 4.X, как правило, необходимы только две дискеты: kern, flp и mfsroot. flp. При установке FreeBSD 5.X потребуются три дискеты: boot. flp, kernl. flp и kern2 . flp. Подготовка дискет и запись образов Подготовьте по одной дискете на каждый образ, отформатировав их, даже если они чистые. Желательно использовать новые дискеты, не содержащие поврежденных секторов. В случае зависания программы установки проверьте дискеты или просто запишите образы на новые отформатированные дискеты и повторите попытку установки. Будьте внимательны: файлы с расширением .flp — это образы дискет, а не простые файлы, которые можно напрямую скопировать на диск. Ни в коем случае не копируйте их прямо на дискету! Вместо этого, воспользуйтесь специальной утилитой для записи образов на диск (для MS-DOS/Windows это — утилита fdimage). Находясь в корневом каталоге дистрибутивного компакт-диска, используйте для каждой дискеты команду: tools\fdimage floppies\<imgname>.flp A: Выполните эту команду для каждого файла . flp, заменив <imgname> на соответствующие имена файлов (перечислены выше). Не забудьте перед каждой новой записью помещать в дисковод новую дискету, а на предыдущей надписывать имя использованного файла. Если файлы были загружены из сети и помещены в один каталог, то используйте команду: fdimage <iragname>.flp A: Если установочные дискеты создаются под управлением другой системы FreeBSD, то для записи образов используйте утилиту dd: dd if=kern.flp of=/dev/fdO В FreeBSD запись /dev/fdO означает первый гибкий диск (диск А:). ПОДГОТОВКА ЛОКАЛЬНОГО ИСТОЧНИКА УСТАНОВКИ При отсутствии установочного компакт-диска можно подготовить его самостоятельно или создать другой источник для установки FreeBSD. Рассмотрим некоторые наиболее распространенные варианты: есть несколько компьютеров в локальной сети и один диск с FreeBSD, при этом нет доступа к Internet — можно создать локальный сервер FTP или NFS, используя содержимое диска FreeBSD, и использовать этот сервер; есть диск с FreeBSD, но FreeBSD не распознает CD-привод, хотя установленная версия MS-DOS/Windows распознает — можно скопировать файлы установки в существующий раздел DOS и установить FreeBSD, используя эти файлы; на диске уже установлена версия DOS или Windows, и для установки необходимо использовать один из разделов — в данном случае просто скопируйте файлы с ди-
32 Глава 2. Установка FreeBSD стрибутива в каталог freebsd корневого каталога раздела (например, c:\freebsd), причем в этом каталоге должна быть в точности воспроизведена структура каталога CD-ROM или сервера FTP; можно создать ленту и затем использовать ее для установки FreeBSD (такой способ практически не применяют в связи с ограничениями ленточных устройств). НЕСКОЛЬКО СЛОВ ОБ УСТАНОВКЕ С ЛЕНТ. Программа установки может найти на ленте файлы, записанные на нее с помощью tar. При этом потребуется некоторое место во временном хранилище на компьютере, куда будет скопировано содержимое ленты. Это связано с тем, что лента — устройство не произвольного, а последовательного доступа. Не забудьте вставить ленту до начала загрузки с установочного диска, чтобы она была обнаружена во время тестирования устройств. Создание установочного компакт-диска Простейший способ создать установочный компакт-диск — загрузить установочные образы CD-ROM ("ISO images") и записать их с помощью CD-рекордера. Получить соответствующие образы ISO можно по адресу ftp://ftp.FreeBSD.org /pub/FreeBSD/releases/<arch>/ISO-IMAGES/<vers>/ или с "зеркала".Замените <arch> и <vers> в соответствии с архитектурой и номером релиза. Как правило, там содержатся образы, перечисленные в табл. 2.1 (в последних версиях могут быть отличия в именовании, как, например, для версии 5.4-ВЕТА1 и 4.11- RELEASE). Таблица 2.1. Именование установочных ISO-образов дисков Имя файла версия-mini.iso версия-disci.iso BepcHH-disc2.iso Содержимое Все, что необходимо для стандартной установки FreeBSD Все, что необходимо для установки FreeBSD, и несколько дополнительных пакетов сторонних производителей Так называемая "live filesystem", используемая в сочетании со средством Repair программы sysinstall. Копия дерева CVS FreeBSD. Несколько дополнительных пакетов сторонних производителей В большинстве случаев достаточно загрузить образ mini-ISO или образ первого диска. Не загружайте оба, поскольку образ первого диска содержит все содержимое образа mini-ISO. На момент выпуска IS0K>6pa3bB многие входящие в их состав пакеты несколько устаревают, не говоря уже о том случае, когда FreeBSD устанавливается через несколько месяцев после выхода образа в свет. По этой причине пакеты, как правило, устанавливают не с диска, а с FTP-серверов. Также очень удобно использовать систему портов (которые очень просто поддерживать в актуальном состоянии) или загруженные с Web-сайта разработчика исходные коды последней версии необходимого программного продукта (порты рассматриваются в главе 9). После загрузки запишите образы CD на диски, используя те утилиты, которые присутствуют в системе. Образы дисков предоставляются в стандартном формате ISO, который поддерживается большинством программ для записи компакт-дисков.
Подготовка локального источника установки 33 Подготовка сервера FTP с дистрибутивом FreeBSD Поскольку диск FreeBSD сформирован так же, как и сервер FTP, то все, что потребуется — это скопировать его содержимое в соответствующий каталог на FTP-сервере (если такой присутствует) или же запустить анонимный FTP, указав в качестве его корня точку монтирования CD-ROM. Для этого поместите компакт-диск в привод и смонтируйте его командой: # mount /cdrom Далее создайте учетную запись для anonymous FTP в /etc/passwd. Для этого отредактируйте с помощью vipw файл /etc/passwd, добавив в него следующую строку: ftp:*:21:21::0:0:FTP anonymous:/cdrom:/sbin/nologin Убедитесь, что сервис FTP включен в файл /etc/inetd. conf, а также активизируется inetd в файле /etc/rc.conf (должна присутствовать строка inetd_enable="YES")- Если такая строка отсутствует, то просто запустите процесс inetd из командной строки (после перезагрузки данного сервера сервис FTP будет недоступен). Запуск inetd может снизить безопасность существующего сервера. Перед тем как запустить процесс inetd, проверьте настройки брандмауэра, чтобы доступ к FTP- серверу был возможен только внутри локальной сети. Настоятельно рекомендуем придерживаться правильной политики безопасности и хорошо документировать все настройки и изменения. Прежде чем что-либо менять, хорошо все продумайте и спланируйте, и только после этого вносите изменения. Подробнее о безопасности читайте в части III, "Работа в сети и безопасность системы". Теперь любой, кто подсоединится по сети к данному компьютеру, во время установки может выбрать тип носителя FTP и, после выбора пункта Other в меню выбора FTP серверов во время установки, набрать ftp: //<ftp-server>. Подготовка перед установкой через NFS Установка через NFS довольно проста: просто скопируйте содержимое диска FreeBSD на NFS-сервер, а затем укажите на него при выборе источника установки NFS. Если NFS-сервер поддерживает только "привилегированные порты", то перед началом установки потребуется установить параметр NFS Secure в меню Options. Если в сети низкая скорость передачи данных, то в меню Options, возможно, придется переключить флажок NFS Slow. NSF-сервер должен поддерживать монтирование подкаталогов. Например, если установочный каталог дистрибутива FreeBSD 4.10 находится в директории storage: /distr/FreeBSD4l0, то сервер storage должен позволять непосредственное монтирование /distr/FreeBSD4iO, а не только /distr. Это задается в файле /etc/exports через параметр -alidirs. Если будет получено сообщение сервера "permission denied", то это может означать, что не включена соответствующая опция или отсутствуют права на доступ к данному ресурсу (подробнее о NFS читайте в главе 19, "Сетевая файловая система NFS").
34 Глава 2. Установка FreeBSD НАЧАЛЬНЫЙ ЭТАП УСТАНОВКИ FREEBSD Итак, переходим непосредственно к описанию самого процесса установки FreeBSD. Дабы не запутать читателя в дальнейшем, сразу же оговоримся: очень сложно описать данный процесс для двух различных ветвей (4х и 5х) и с различных источников. По этой причине внимательно следите за тем, что именно описывается в подразделах! В первом подразделе описаны действия, которые необходимо выполнить для запуска того или иного источника установки, а в последующих рассматривается процесс установки до использования программы sysinstall (о ней — чуть позже). Итак, рассмотрим как происходит: загрузка системы i386; запуск процесса установки с дискет для FreeBSD 4.10; работа с программой конфигурации ядра UserConfig; запуск процесса установки с дискет для FreeBSD 5.3. ВНИМАНИЕ! До появления сообщения, отображённом на рис. 2.1, установка может быть прервана в любой момент без каких-лйбоЛйменений нажестерм дйгаЦ, Если вФгвет наэто сообщение выбрать Yes, то отменить установку FreeBSD или изменить параметры установки уже будет невозможно. lest Cbauret If you' then ME proceed He can fire re running STRONGLY irig» take you SUP.E von uant continue the installation? this on a disk with data you wish tr EHCOUHfiGE YTJU TO MAKE PROPER BACKUPS no responsibility rat^nw for lost disk contents! Ho save before Рис. 2.1. Предупреждение об уничтожении всех данных в разделах перед началом копирования FreeBSD на диск Загрузка системы i386 Для начала установки включите или перезапустите компьютер. Зайдите в BIOS Setup (как правило, для это используют клавиши <Delete>, <F2>, <F10>, комбинация <Alt+S> или какая-либо другая, отображаемая на экране монитора). Найдите и измените в установках параметр, указывающий, с какого устройства должна выполнять установка. Если FreeBSD будет устанавливаться с дискеты, то убедитесь, что выбрано устройство Floppy. В любом случае, прежде чем менять какие-либо параметры, просмотрите документацию к материнской плате. Выйдите из BIOS Setup с сохранением изменений. Во время перезагрузки поместите в соответствующее устройство источник, с которого будет запущена программа установки. Если компьютер запускается как обычно и загружает существующую операционную систему, то это может объясняться тем, что: были неправильно изменены настройки BIOS; не вовремя помещен диск в накопитель; неправильно записан источник установки; BIOS не поддерживает загрузку с выбранного носителя (обратитесь к производителю материнской платы).
Начальный этап установки FreeBSD 35 Если загрузка прошла успешно, переходите к расположенному ниже подразделу, соответствующему используемому варианту установки. Запуск процесса установки с дискет для FreeBSD 4.10 Для начала установки необходимо использовать первой дискету, помеченную как kern, f lp. По ходу загрузки на экране отобразится сообщение с просьбой заменить дискету (рис. 2.2). В противном случае, при зависании системы (если на экране долго ничего не происходит) попробуйте переписать образ kern, f lp на другую отформатированную дискету, как было описано ранее, и повторить попытку (перезапустив компьютер). UiicoMpressing "... . 'dofte . BTX ,1адав*^а,;,йв ВТ# v**3CSlorKis %.81 BilOS ArtiHtfe ft* JEAjlI^kff :|0S' drive D isf^eiskl . IDS dfiwi h; i'ifi4sl-2 :J0S-638kB 128968k» available neHj>ry r'eeBSD/i3BB hoots trap laader,' Jlfewisiqii 8. В ootj&jpeVeeU*,'Was' buf fAlh. edttp 'Tue May* 25k2b'i Кегщв»- ^вх^±рУ2^Ь6|[1, |(1л|«=В><Звв|Б-г*вх32ссВ \ С<ев»в\1п^вг* ^S ^Оа^'Г^о^'у'^сЦpress wft- i ■ ■ i-,« 3i снт ЩАу Рис. 2.2. Просьба сменить первую дискету Теперь необходимо поместить в дисковод следующую дискету, помеченную как mf sroot. f lp, и нажать клавишу <Enter>. После недолгого ожидания (на экране будет вращаться палочка) будет отображено сообщение, наподобие представленного на рис. 2.3. ' lease Jnsert MFS rnnt-if 4пи»у^-п|Ьг1Г «9» si;* it; tfeiitejrj* tt) fiopt fiiMedJiate'l mf «no* ojtliej , key ^ coMiwnd йдо>ф Рис. 2.З. Успешное считывание содержимого загрузочных дискет Для продолжения загрузки следует нажать клавишу <Enter> или подождать десять секунд. Нажатие любой другой клавиши прервет запуск и переведет в режим командной строки. ПРИМЕЧАНИЕ Данное сообщение будет выводиться каждый раз при запуске системы, о чем более подробно читайте в следующей главе. ВНИМАНИЕ! Если вы забудете сменить или перепутаете дискету, она окажется поврежденной или неправильно записанной, то программа установки выдаст сообщение о невозможности найти /mfsroot (рис. 2.4). Продолжив загрузку, она, в конце концов, по окончании процедуры проверки и инициализации оборудования, сообщит о невозможности запуска процесса i nit. Система будет автоматически перезапущена через 15 секунд (рис. 2.5). Попробуйте повторить все с чачала без подобных ошибок.
36 Глава 2. Установка FreeBSD F i D/'hjgfS'-bQfft r$p ttttf&B ' ■evis,rrifp0'.fl _,_ ool iper Htf eKtt.liuffrt^o.qdu. Kie.tfa^ 2<> 2JU2p-31 GMT 2084*. Plja iivsei t MFS.<r.oot t'lflpuy aud press-вп^ел •an titM Att j%ot s ' ''■,.. Jit tfvterV \fl ^рч,* iMped^pS^ly of апр, other- )й?к for соммлпй дгомрГ soot' "g [fcer-' I*' 6 ч- -rt^s _ Рис. 2.4. Вторая дискета повреждена или не была помещена в дисковод иаШпд.,15 ■■-•= ■ , ■" ' Ле S ti etfle Mounting root frOM ats-.tdBCr - iTi.lt not found tit path ^strin init: sbin<oinit Csbin/init. bakj'/stand/'sysinstall pa»n * jfuT-iftW- ...--,-. synfclng disks... dojf)B \ip ine: 17s , . ■ A >natic*reboot in lS'seconds - press a key on the console to abort Рис. 2.5. Автоматический перезапуск программы установки в случае ошибки загрузки со второй дискеты После запуска ядра будет запущена программа конфигурации ядра UserConfig (удалена, начиная с FreeBSD версии 5.0). В большинстве случаев, необходимо просто выбрать пункт Skip kernel configuration and continue with installation (подробное описание программы конфигурации ядра смотрите в следующем подразделе) или нажать клавишу <Q>. После этого ядро продолжит процесс загрузки. На экран будет выведен список найденного оборудования и другая служебная информация вплоть до сообщения о запуске программы Syslnstall (рис. 2.6). Нал пд 1 е onds о. SI deulcds to settle Mounting root froM ufs^/dev/Mdec ePatitl -sysMns.tall r,iwm'l.*ig „as init on vtyB Рис. 2.6. Сообщение о запуске программы Syslnstall ЗАПУСК ПРОЦЕССА УСТАНОВКИ С CDROM ДЛЯ FREEBSD 4.X Установки системы с CD-ROM намного проще, поскольку отпадает необходимость постоянно менять дискеты и практически невозможно получить сообщения, представленные на рис. 2.4 и рис. 2.5. Программа конфигурирования ядра UserConfig Подробно ядро FreeBSD рассматривается в главе 10, сейчас же мы только вкратце коснемся некоторых общих аспектов. Итак, в ядре реализовано множество функций, предоставляющих возможность доступа ко всем устройствам системы. С каждым устройством сопоставлен собственный драйвер с именем, состоящим, как правило, из двух- трех букв (например, f d для драйвера флоппи-дисковода, или sio для драйвера последовательного ввода-вывода СОМ-портов). На этапе загрузки ядро проверяет систему на предмет наличия поддерживаемого оборудования, и, если такое оборудование обнаружено, конфигурирует его, делая доступным для остальной части ядра. Процесс обнаружения называется тестированием устройств. Во время тестирования драйверы могут привести к конфликту, из-за чего
Начальный этап установки FreeBSD 37 система иногда становится неработоспособной. Как правило, такое происходит в системах, где присутствуют устройства ISA. Стандарт ISA требует явного указания некоторой информации, например, номера IRQ и адреса порта ввода-вывода (обычно устанавливаются с помощью перемычек на устройстве или с использованием программы, поставляемой вместе с самим устройством). Проблемы возникают, когда в системе появляется два или более устройств с одинаковыми IRQ или адресами портов, что и приводит к конфликтам. Новые устройства, поддерживающие стандарт PCI, не требуют установки параметров вручную. При наличии в компьютере устройств ISA, драйверы FreeBSD для них должны быть настроены с IRQ и адресом порта, установленными на ISA-карте. По умолчанию, драйверы FreeBSD настроены для использования заводских установок, что и приводит к проблемам во время установки. Ядро, используемое для установки, собрано с максимальным количеством драйверов для поддержки большого количества различных конфигураций оборудования, а это означает, что некоторые из драйверов имеют конфликтующие настройки. Во избежание подобных конфликтов, необходимо иметь подробные сведения об устройствах и на этапе установки отключить отсутствующие устройства или изменить неверную информацию об их заводских настройках. Для этого и служит программа UserConfig, главное меню которой состоит из трех пунктов (рис. 2.7): пропустить конфигурирование ядра и продолжить установку; запустить конфигурирование в полноэкранном визуальном режиме; запустить конфигурирование в режиме CLI (режим командной строки). '' KeifVifet* Conf irjuratjoV) Hftrtt Sk-ip Kernel conf iyur.it ion and continue with insiui lut ion .Start kernel configuration in fill J-screen visual Mode Start kernel configuration in CLI Mode Here you have the chance to go into kernel configuration Mode, Maying' any changes which tiny be necessary to properfу adjust the kernel" to Match your hardware configuration. If you are Installing FreeBSD for the firs ti e - ect UisuaJ Hpde (press Down-flrrpH hen ENTER) If you need to do More specialized kernel configuration and are an experienced FreeBSD user, select CLI Mode. If you are ort.Un 'that you do not need, to configure your -kernel then siMply press ENTER or 0 now. , Рис. 2.7. Меню программы конфигурирования ядра Если необходимо выполнить настройку ядра, то для этого лучше всего выбрать второй пункт меню. В результате отобразится экран конфигурации ядра, разделенный на четыре части: Список активных устройств (Active Drivers), поделенный на группы (Storage, Network и т.д.). Если раскрыть группу нажатием клавиши <Enter>, то можно увидеть список, где каждый драйвер показан в виде описания, имени, IRQ и порта (рис. 2.8). Если какой-либо активный драйвер конфликтует с другим активным драйвером, то вверху отобразится информация о количестве конфликтующих устройств, а в списке после имени драйвера будет указано "CONF" (рис. 2.9). Список неактивных устройств (Inactive Drivers), поделенных на группы подобно активным (см. рис. 2.8). Они остаются в ядре, но будут пропущены при тестировании.
38 Глава 2. Установка FreeBSD Дополнительная информация о выбранном в данный момент драйвере, включая IRQ, DRQ, адрес порта, флаги, адрес памяти (см. рис. 2.8). Информация об управляющих клавишах, доступных в данный момент (см. рис. 2.8). SiWage : . ATH/'PTftPl cot-ipatible disk controller ' BTfl/ftTflPI compatible:disk controller Floppy disk controller Network Communications Input Multinedia : ' Ihact ive-Bri vars> Storage : network ':,, . CoMMunications Input MultiMedia ; Miscellaneous ' Port address : 8xlf8 IRQJmrnber .14 Щада. УвхД Center'!-' Edit, device parameters 1Щ31 Change fields (Collapsed) (Col lapsed) (Collapsed) (Col lapsed) (Collapsed) (Collapsed} lev IRO^-P' — «taB 14 Вх1ГИ atal' 15 6x176 fftcfl 6 6x3f8 —~— i е^\~- -- Ы J i« tO)jfe device [Q] S<nv8 a,nd Ex.it / £*] Help Рис. 2.8. Визуальный интерфейс конфигурирования ядра -BcrtiverUf JM- confluts- —?- й- —1ЙЦ—Port— Storage ' -(Collapsed) Network ; NElHBB,NE20ee,3C5B3,UB/'SrfCeexx Ethernet adapters Isolait, Novell NE2 08/NE32-OL Ethernet adapters (Collapsed) (Col lapsed) CoMMunications : Input '. HuItiHedia Miscellaneous'' --lAact iva-br ivers- '(Col lapsed) Kl] ) j edU :OHF lncB rBeV- 1B 8x288 18 8x286 Рис. 2.9. Конфликтующие устройства Если появятся сообщения о конфликтах, раскройте список, нажав клавишу <Х>, и удалите все устройства, которых точно нет в вашей системе, нажатием клавиши <DeIete> (перемещение в список неактивных устройств). Нажав клавишу <ТаЬ> перейдите в список отключенных устройств, и найдите в нем устройства, присутствующие в системе (если таковые есть). Активизируйте их нажатием клавиши <Enter> на соответствующем элементе списка. Если конфликты не были устранены, то вернитесь в список активных устройств, перейдите к конфликтующему устройству и измените его конфигурацию в третьем окне — окне свойств, переход к которому производится нажатием клавиши <Enter>. Если точные значения параметров неизвестны, используйте -1. Это позволит некоторым драйверам безопасно протестировать устройства для определения правильных значений.
Начальный этап установки FreeBSD 39 К СЛОВУ... Для изменения адреса устройства, как правило, приходится переставлять перемычки или DIP-переключатели на устройстве. Некоторые устройства могут поставляться с дискетой, содержащей программу перенастройки. После такой перенастройки, естественно, придется повторить процесс установки FreeBSD "с нуля". Для сохранения настроек и выхода из программы UserConfig, нажмите клавишу <Q>, а затем — <Y>. Для выхода из программы без сохранения изменений после <Q> необходимо нажать клавишу <N>. Запуск процесса установки для FreeBSD 5.3 Процесс установки в данном случае несколько иной: во-первых, требуется больше дискет; во-вторых, отсутствует меню конфигурирования ядра (программа UserConfig). Итак, первым делом до запуска системы поместим в дисковод дискету, помеченную как boot. f lp, после чего включим компьютер и дождемся запроса на установку следующей дискеты. Содержимое экрана должно приблизительно соответствовать рис. 2.10. UncoMpressIng .. done ' < ■ ■ i BTX lofcder. I.вв BTX ver^io^i Ss 1.81 Console: internal video/keyboard BIOS dr;iOe H: i$ diske '" *v BIOS drive C,: is disRi ВI OS, drive B: Is disk2,, ■ i IOS" бЗВкВ'12вббвкВ available мемогу FreeBSD''13,86 bootstrap loader, Be wis ion 1.1 <root©harlow.cSe bufldlO.edu/Thu Net. 4 22:23:29 UTC 2884) oadfng •'boot/ttefaultsv'loader eonf- ' /kernel text=8x43648c N ' -, losert disk labelled "Kernel /lopf? Л" end press ail -yr _ Рис. 2.10. Запуск процесса установки FreeBSD 5.3 с установочных дискет В данном случае отображен запрос установить дискету, помеченную как kernl. f lp. Если данное сообщение не появилось, текст на экране долго не изменяется, а "волшебная палочка" перестала вращаться, то, возможно, причина — в неисправности или несовместимости каких-либо устройств. Поместив в дисковод вторую установочную дискету, нажмите любую клавишу на клавиатуре. После недолгого ожидания (на экране опять должна появиться вращающаяся палочка), будет отображено сообщение "Insert disk labelled "Kernel floppyi" and press any key...". Поместите в дисковод дискету, помеченную как kern2. flp, нажмите на клавиатуре любую клавишу и дождитесь появления сообщения: "Insert boot floppy and press Enter". После этого опять поместите в дисковод первую дискету и нажмите клавишу <Enter>. ВНИМАНИЕ! Если забыть сменить или перепутать дискету, то программа установки выдаст сообщение о невозможности найти файл и попросит подождать десять секунд или нажать любую клавишу. Затем будет выполнена неудачная попытка продолжить установку, в результате чего на экране появится сообщение, представленное на рис. 2.11. Поместите в дисковод дискету boot. flp и нажмите клавишу <Enter> для перезагрузки. Повторите все сначала без подобных ошибок
40 Глава 2. Установка FreeBSD Manual root filesysteM specification: <fstype>:<device> Mount «Jevice> using filesysten <fstype> eg. ufs:daflsla ? , List valid disk boot devices <enpty line> Abort Manual input Hountroqt> Щ Рис. 2.11. Сообщение в случае установки неверной дискеты В результате описанных действий отобразится меню выбора способа запуска системы (рис. 2.12), первый пункт которого будет выбран по умолчанию через десять секунд. WIcomb- ttf-FreeBSD* 1 -.^oot^FreeBSIl fdertmltl Z Boot FreeBSO with ACPI disabled &: ^oo't Fr««BSB in Safe Mode .4. Bout FreeBSD in. single user*" Hode *5 Boot FreeBSP with verbose logging, 6, Escape, t'o loader pronjit '•>, Reboot Select option, ЛЕп^етн! for default' or [Space] to paube> tihier 9 _ C-7-—. <-~ -I- VC ' M i' 4 > J '-/ t - ч r о о у ; • _-_-..< L.I _ > / ^r--,~ s t ч =oTT)-=> ч> /•=- / -—( V ,4-+~ -<-' -. > 1. •s ._< Рис. 2.12. Меню выбора способа загрузки системы Для приостановки таймера нажмите пробел. Выбор пункта меню происходит по нажатию соответствующей цифры на клавиатуре. Значения пунктов меню: 1. Загрузка по умолчанию (по нажатию клавиши <1>, <Enter> или автоматически через десять секунд). 2. Загрузка с отключенной поддержкой ACPI. 3. Загрузка в "безопасном" режиме. 4. Запуск системы в однопользовательском режиме. 5. Запуск системы с расширенной информацией. 6. Прерывание запуска и переход в командную строку. 7. Перезапуск. К СВЕДЕНИЮ... С этим меню вы будете сталкиваться каждый раз при запуске установленной системы. Время ожидания и пункт, выбранный по умолчанию, можно будет изменить после установки системы в конфигурационном файле ядра. Для продолжения установки в большинстве случаев необходимо выбрать пункт по умолчанию, нажав клавишу <Enter> или подождав десять секунд. Система продолжит запуск, а на экран будут выведены сведения об операционной системе, список найден-
Программа sysinstall 41 ного оборудования и другая служебная информация (рис. 2.13) вплоть до запуска программы sysinstall (рис. 2.14). ПРОЦЕСС УСТАНОВКИ С CD-ROM ДЛЯ FREEBSD 5.3 Запуск установки системы с CD-ROM, как и в случае с FreeBSD 4.X, намного проще тем, что отпадает необходимость постоянно менять дискеты, а вероятность получить сообщение, подобное представленному на рис. 2.11, практически равна нулю. Copyrght (с) 1992-2::4 Т е Fre- :ЧП Р oject. Cpyright С) 1970, 1-88, 1'83, 198S 1-:Ч, 1989, 1991, 149 , 1993, 1"Ь4 Tie Pegents of t e Uii a sity of Cal ornia. P 1 r ghts re-: = -■*. FreeBSD 5.3-P> "4»SE »8:.Fri M.v 5 84:19:18 UTp 28i4 root® -г1ои ro.bu ali.ei'u: usr/objAi-r/src'sys/'G J:1 С Tir-ecouiter "i: 4" fr-qu-i*y 1 *31:2 Hz qu. ity в ■U: P D HtYloi( 1) XP 2 :в+ (183^.58-Н2 688-class С'I) Origin = "Puther ic'l D" Ы ■= В'блв S =ppirg = 0 Features-8- "= fbff< PU, и**, DE,P«,,TSC,^4)p-E,MCE,C"4,PPIp,SP,r'THe,PGE, ГОР, ► 1 0U,PPT,PSE3B,M v,FXSJt,SSE> AMD Features=exce48eeee<fiMIE,DSP,3DNon*> real «емогу = 134217728 (128 Mfi) avail мемогу = 117448512 (112 MB) ЙСР1, ЙР1Е Table; <PTLTD J - вР|С > ., MP.DT: Forcing act lve-lflw polarity and level trigger for SCI ioapicB <Uerslon 1.1> irqs 8-23 on Motherboard npxfl: (FASTI прхв: <nath processor> on Motherboard прхв: IHT'1Б Interface acpiB:' <PTLTD .' RSDT> on Motherboard acpiB: Power Sutton (fixed) TiMecounter "ftCPl-safe'v frequency 35.79545'Hz quality 1888 acpi_tiMer8-: <24-hW t iMer a-t-3.S79545MHz> port ВУ1вв8-вх1ВвЬ on acpiB срив: <ЙСР1 tWJ> on acpiB icibe: <ЙСР1 Host-PCl bridge> port 8xcf8-Bxcrf on acpiB Рис. 2.13. Служебная информация во время запуска системы с установочных дискет Uaiting 5 seconds for SCSI devices to settle ' Mounting root froM ufs:/dev/Md8 stand/'syslnstall running as init on ut : Рис. 2.14. Запуск программы sysinstall ПРОГРАММА SYSINSTALL По окончанию процесса загрузки ядра будет запущена программа sysinstall —программа установки, предоставляемая проектом FreeBSD (рис. 2.15). Данное приложение разделено на несколько меню и экранов, которые используются для настройки и управления процессом установки. СОВЕТ Для просмотра результатов тестирования устройств нажмите клавишу <Scroll Lock>. Для навигации используйте клавиши <PageUp>, <PageDown>, <T>, <i>. Это позволит проконтролировать обнаружение всех устройств системы и их правильную настройку. Если необходимости что-либо изменить, можно прервать установку и начать все с самого начала. Для того чтобы выйти из режима просмотра результатов тестирования устройств, следует снова нажать клавишу <Scroll Lock>.
42 Глава 2. Установка FreeBSD Не 1 соме to the FreeBSD installation and configuration tool. Please select one at the op+ions "uelnw hi» using the arrow keys or typing the first character of the option поме you're interested in. lnuoke an option with ISPRCEJ or IEHTERJ. To exit, use tTflD] to моче to Exit. Щ1Ц.УМ «uic start - How to use t is мепи s st = Begin a standard installation (recoMMended) flegin a quick installation (for experts) Begin a custon installation (for experts) j Do posx-install configuration cf FreeBSD ' Installation instructions, RKftDHE. etc. Select keyboard type Uiew/Set various installation options ] Repair Mode Kith CDRDM BUD/floppy nr start shell | Upyrade an existing syster-f . ' Load default install configuration Glossary of functions МБПГЯГаП X Exit Install Рис. 2.15. Главное меню программы sysinstail Для тех, кто устанавливает FreeBSD на ноутбук с PC-card устройствами, первоначальное окно может выглядеть иначе. Если первым отобразится окно с текстом: Found PC-card slot(s). Use PC-card device as installation media? [ Yes ] [ No ] то, определите, какое именно устройство находится в слоте, решите, необходимо ли оно для установки системы, и в случае необходимости ответьте YES — мастер поможет правильно настроить устройство и попытается проинициализировать его, выдав при этом сообщение: Initializing PC-card controller ... Итак, переходим к изучению самой программы, sysinstail. Придется привыкнуть к работе с клавиатурой — мышь в программе не работает, однако навигация с помощью клавиатуры не вызывает каких-либо затруднений. Как правило, для управления и перехода между различными окнами используются клавиши управления курсором, <Enter>, <Пробел> и другие клавиши. В различных версиях программы эти клавиши могут иметь разное назначение (например, действие клавиши <Пробел> в sysinstail для FreeBSD 5.3 немного отличается от действия в FreeBSD 4„10). В нижней части активного окна отображается короткая подсказка о возможных действиях пользователя или просьба нажать клавишу <Fl> для вызова контекстной справки по текущему разделу или другой справочной информации. Например, в нижней части окна, представленного на рис. 2.15, предлагается вызвать окно справки по установке системы. Как правило, первые буквы в названиях меню выделены другим цветом, и нажатие соответствующих клавиш на клавиатуре выделяет (но не выполняет) соответствующий пункт меню (в некоторых окнах для выбора используются цифры, указанные возле пунктов меню). Подробное описание клавиш и их функций содержится в окне, содержащем информации об использовании sysinstail, которому соответствует пункт меню Usage (рис. 2.16). Для просмотра документации по продукту, списка поддерживаемого оборудования и т.д. в главном меню следует выбрать пункт Doc и нажать клавишу <Enter>. В результате будет отображено меню документации с подробными инструкциями по установке, а также — полный список поддерживаемого оборудования, ошибки, найденные в данном релизе, но неисправленные на момент выпуска и т. д. (рис. 2.17).
Программа sysinstall 43 HOW TO USE THIS SVSTEM [press -the PageDown key to go tn the next screen when you finish reading this one! The following keys are recognized in Most of the dialogs you'll encounter during this installation: KEY SPRCE ENTER UP flRRUU DOWN fiRROU TAB RIGHT flRHOW SHIFT-TAB LEFT flRROV POGE UP РПКЕ DOUN flCTIDH Select or toggle the current lten. Finish with а кепи or itnn. Howe toprovious Ким {or up, in a text display box). Move to next Нем Cor down, in a text display box). Move to next Нем or group. Howe to next Нем or group (sane as TflD). Hove to previous iteM or group. Move to previous iteM or group (sam as SHIFT-TfiB). In text display boxes, scrolls up one page. In text display boxes, scrolls down one page: Рис. 2.16. Информация об использовании клавиш в программе sysinstall If you are at all unsuro about the configuration of your hardware or are looking to build n systeM specifically for FreeBSD. road the Hardware guide? Hen users should also read the Install document for a step-by-step tutorial on installing FreeBSD, For general inforMation, consult the DEODKE file. МЯН i xit this nenu (returni ■ to revl'ous) Я general description of FrBuilSl). Read this.» Migration Guide to FreeBSD 5.X. Late-breaking, post-release news. The FreeBSD survival guide for PC hardware. fi step-by-step guide to installing FreeBSD. The FreeBSD Copyright notices. The release notps for this version of FreeRSD. Creating shortcuts to sysinstall. Go to the HTML docunentation femi (post-install). Cancel Рис. 2.17. Меню документации sysinstall Для возврата в главное меню выберите пункт Exit и нажмите клавишу <Enter>. Все основные функции программы sysinstall, вызываемые до и после установки FreeBSD на диск, перечислены в алфавитном порядке и могут быть напрямую вызваны из главного меню программы. Для перехода в меню функций (рис. 2.18) используется команда главного меню Index ► Glossary of functions программы sysinstall (см. рис. 2.15). Для того чтобы прервать процесс установки, выполнить ее с самого начала или приостановить, можно нажать комбинацию клавиш <Ctrl+Alt+Del>, в результате чего откроется окно, показанное на рис. 2.19. Options Editor — редактор опций программы sysinstall Прежде, чем перейти к описанию стандартной установки FreeBSD, необходимо кратко упомянуть об одной очень важной функции — редакторе опций программы sysinstall. Как правило, установленные по умолчанию значения параметров устраивают
44 Глава 2. Установка FreeBSD большинство пользователей, однако бывают случаи, когда без их изменения обойтись невозможно. This иепи contains ten alphabetized: index of the top ;level functions it», this ргодгом (sosinstal1). Invoke лп option by pressing tSPACE] or' IENTER1. To exit, use ITflBl to Move to the,Cancel button. ■:l',M»i^ • M < i ■*. .4' '" . 1 1 T 1 . H? • Hi?' i h B«, '' •'.' >e Be .J*fi£ x pe«- Je onfi ure anonvMOUS FTP logins. -Com It any pending; attvions Cdangeroust) Custokize systeM console behavior. The susten configuration иепи. Land default settings. The Mouse configuration мвпи. The disJ<Label editor Root rif the distribution tree. 'Basic; FreeBSD distribution-Menu. Select developer's distribution. Src distribution мепи. Select X-developer'-e distribution.. Select kernel developer'^ distribution. Canee'l Цяс PageUp ^r-I^ieinwn о mbvb th • «pit u>is мети la? art Рис. 2.18. Список функций sysinstall Do you want to abort the installation? flfi'i|^jl "bort the installation Restart the installation ргодгай Continue the installation Cancel Рис. 2.19. Прерывание процесса установки Попасть в окно редактора опций из главного sysinstall можно как минимум тремя способами: первый, наиболее простой и быстрый вариант — выбрать в главном меню пункт Options (см. рис. 2.15); находясь в окне Glossary of functions (см. рис. 2.18), выбрать пункт Options Editor; находясь в главном меню режима установки1 для экспертов, выбрать меню опций (см. рис. 2.23). Экран редактора опций представлен на рис. 2.20. Для каждого выбранного пункта в нижней части экрана отображается краткое описание, а изменение опций происходит по нажатию клавиши <Пробел>. Для того чтобы получить детальную информацию о различных параметрах, следует нажать клавишу <F1> или <?>. Выход из редактора опций осуществляется по нажатию клавиши <Q>. Рассмотрим кратко некоторые опции, их назначение и влияние на ход установки (табл. 2.2).
Программа sysinstall 45 Options Editor а'ме FS' S'eclire FS,S4ow FS Ttf?' FS version 3, lebuggrhg о Mannings es to All. IHCP ■ "' IPv6 TP userwaMe ditor ape Blocksize • xtr'act Detail oloase Маме Install Root Ualue 'ST NO NO YES NO MO NO NO NO ftp , «sr-'b'i Szb '■■■_ ' hiffh' in/be 4.IB-RELEASE у None liroM&ei package Browser ЕхфА- Media Type^ Madid"Tirieou% 'Package Темр- , Newfs firfls . Fixit fconsole- Coiiftg save Яе-Scan Devices Use Defaults' Oalue Ul! /usr^ltoceVbin/l ink* <not yat stft> ■зав, *■ /Wr t«p -* 16Э84 <-f 2048 standard YES <c*> tRESETf] se SPftCE to select/toggle an option, arrow keys to Move, 'or Fl f,or' More .help. <Uhe» you're, done type Q'to Quit. .••' " ' ■£ . ' - ' ., . ■ hich •I-■ о atteMp > bad fron t- ■ »■ =di Рис. 2.20. Редактор опций sysinstall Таблица 2.2. Описание опций Название NFS Secure NFS Slow NFS TCP DHCP FTP username Значение по умолчанию NO NO NO NO ftp Editor /usr/bin/ee Описание Включает поддержку NFS Secure, когда сервер NFS поддерживает соединение только по защищенному порту (как правило, это касается систем SUN). Более подробно этот вопрос рассматривается в главе 8, посвященной сетевой файловой системе Если FreeBSD устанавливается по NFS и используется медленное соединение, то рекомендуется поменять N0 на YES Как правило, NFS-сервер использует для работы параллельно протоколы TCP и UDP. Администратор NFS-сервера в целях безопасности может запретить с помощью данной опции использование протокола UDP Если в сети присутствует сервер DHCP, то данный параметр рекомендуется использовать для рабочей станции Имя и пароль пользователя для установки по FTP. Если сервер с дистрибутивом не поддерживает вход anonymous (пользователь ftp без пароля), то, нажав пробел, можно ввести соответствующее имя пользователя и пароль для той системы, с которой предполагается установка Редактор по умолчанию. В ходе инсталляции, как правило, необходимо отредактировать несколько конфигурационных файлов, например, /etc/exports, /etc/ttys, /etc/inetd.conf. Для любителей программы vi, данная опция, возможно, упростит процесс изменения файлов
46 Глава 2. Установка FreeBSD Таблица 2.2. Окончание Название Значение по умолчанию Release Name Media Type <no media> Media Timeout 30C Package Temp /var/tmp Use Defaults Описание Имя релиза. Данную опцию рекомендуем не изменять. Используйте версию sysinstall той системы, которую хотите установить. Если указанное имя релиза не совпадет с именем релиза на источнике, то установка приостановится, система попросит подтвердить, что вы уверенны в своем выборе или прекратить установку (рис. 2.21 и рис. 2.22) Выбор источника установки. При нажатии на пробел отобразится окно выбора, которое будет описано далее. Оно открывается всякий раз, если источник не установлен или недоступен. Рекомендуется выбрать источник установки заранее, если предполагается использовать CUSTOM-метод установки FreeBSD (рассматривается ниже). Это необходимо, если в процессе подготовки к установке вы хотите использовать справку по нажатию клавиши <F1> Таймаут для источника установки Временный каталог для разворачивания пакетов во время установки. Если все таки было решено установить пакеты, поставляемые вместе с дистрибутивом, то для этого потребуется промежуточный раздел для разворачивания архивов. Если для /var был определен недостаточный размер, то размещение временной директории скорее всего придется изменить Автоматическое присвоение всем параметров значений, выбранных по умолчанию Horning: The version of the FreeBSD disc currently in the drive (4.11-RELEftSE) does not natch the vers ion'of the boot floppy (4.1i-RELEflS). If thi£ is intentional, to avoid this Message .in the future plpaso visit the Option*.- editor to sot the boot floppy version string to Match that of the disc before selecting it as your installation Media. 9Ю1ЛВ • i s те Рис. 2.21. Сообщение о несоответствии версии релиза программы установки и версии релиза операционной системы на источнике дистрибутива Uould you like to try and use this disc anyway? ГИУТ» No Рис. 2.22. Запрос на подтверждение продолжения установки Способы установки системы На выбор пользователя предоставляется три способа установки FreeBSD, которые можно найти в главном меню программы sysinstall:
CUSTOM-установка 47 Standard— метод установки, который рекомендуется использовать пользователям, в первый раз столкнувшимся с FreeBSD. Данный метод позволяет выполнить процесс установки с постоянными комментариями в режиме мастера, когда программа установки постоянно указывает, что рекомендуется сделать в данный момент. Программа сама позаботится о том, какое окно вывести. Express— метод, который чем-то напоминает предыдущий, но с отсутствием постоянных комментариев, что позволит быстрее установить систему, не отвлекаясь на постоянное чтение пояснений. Custom— режим установки, используемый наиболее часто специалистами или теми, кто хочет сам руководить всей последовательностью установки системы, без каких либо указаний программы. Рассмотрим последний из перечисленных способов установки. CUSTOM-УСТАНОВКА Процесс установки системы данным методом выбран не напрасно. Как упоминалось ранее, мы пытаемся разобраться в процессе и "поднять" именно сервер на базе FreeBSD. В данном случае глубокое понимания процесса установки и того, что происходит в определенный момент времени, играет значительную роль в дальнейшей поддержке стабильной и безопасной системы. Итак, для входа в режим CUSTOM-установки необходимо выбрать в главном меню программы установки пункт Custom (см. рис. 2.15). В результате откроется подменю, в котором будет предложено выбрать параметры установки системы: опции (рассматриваются выше), диски, разделы, дистрибутивный набор, источник установки и др. (рис. 2.23). This is the custoH installation Menu. You May use this Menu to specify details on the type of distribution una wish to hav/e, where you wish to install it frOM and how you wish tV allocate disk storage to FreeBSD. Exit'this Menu (returning to previous) lH«w/Set various installation options Allocate disk space for FreeBSD Label allocated disk artitions ■• = lect "d srl tl< to ex ratt Choose the installation nurtin type Peri'orn any pending Partiticn^l.aDel/'Extract actions авчяв Conce1 Рис. 2.23. Главное меню CUSTOM-установки После установки одного из этих параметров вы опять возвращаетесь в данное меню, и таким образом полностью управляете процессом настройки и установки системы. Выбор дисков и создание слайсов. FDisk Во-первых, необходимо отметить, что в FreeBSD диски делятся не на разделы, как принято в Windows/DOS или Linux-системах, а на слайсы (slice), хотя пункт меню и называется Partition (см. рис. 2.23). Итак, выбрав пункт Partition, мы попадаем в редактор FDisk (если в системе есть только один диск), или же — в меню выбора дисков, обнаруженных во время тестирования устройств (рис. 2.24).
48 Глава 2. Установка FreeBSD Please select the drive, or drives, on which you wish lo nerforn this operation. Ifvou ere atteMpting to Install a boot partition on a drive other than the first ore or have Multiple operating systpMs on your Machine, you will have the option to install a boot Manager later. To select a drive, use the arrou'keos to Move to it and press [SPACE! or IENTFR1. To de-solnct it, press it again. Use [TOUl to get to the buttons and leave this mitu. BASES I 1 I 1 333 ad2 daB Гапсе1 Рис. 2.24. Выбор диска Именование дисков На рис. 2.24 представлено несколько дисков, именованных особым способом. Первые два — это IDE-диски, а третий — диск SCSI. Диски IDE именованы как adO и ad2, a SCSI-диск — как daO. В конфигурации ядра по умолчанию принято, что именование IDE-дисков происходит не по мере их обнаружения, а по расположению, и начинается с нуля. Таким образом, adO — это диск "master" на первом контроллере IDE (первичный канал), ad2 — диск "master" на втором контроллере (вторичный канал). Диск "slave" на первичном IDE-канале будет именоваться как adl. Для SCSI-устройств используется другая система именования: названия начинаются с da, а цифра обозначает номер диска. При этом номер' диска, как правило, не привязан к порядку расположения на шине SCSI. Такая система именования позволяет без проблем добавлять в дальнейшем в систему дополнительные дисковые устройства. Для того чтобы установить FreeBSD на первый диск, выберем adO и нажмем клавишу <Enter> или <Пробел>. В результате откроется редактор слайсов FDisk. Редактор FDisk Экран FDisk разбит на три раздела (рис. 2.2S): информация о диске; информация о слайсах; перечень доступных команд. Disk пане: ЯИЛ .. i DISK Partition Editor DISK Geonstru: 52B cyls'64 heads/63 sectors =2096648 sectors C1B23MB) , ' ' i ■ ■■ ' ' ' ' , Offset Slze(ST) End Щме PType Dose Subtle Flags ,.»:'"'.' -3. , '■■'..-:. ■•■ " ■ •-■ "---■.«■'- ,ns 2B96577 B96639 adBsl 2> ■ ^ fat' 1 The following cOMMands авге,: supported tin'upper or lower case): ft = Use Entire Disk G = set Drive GeOMetry С -Create Slice F = 'DD' Mode II = Delete Slice Z-■= Toggle Size Uwits S = Set Bootable ! = UIzard м. T = Change Type U = Undo All Changes Q =,Finish Use Fl or*? to get йоге help, 'arrow keys to select. Рис. 2.25. Главное окно программы FDisk
CUSTOM-установка 49 Первый раздел содержит информацию о текущем диске, такую как имя в FreeBSD, геометрию и общий размер. Второй раздел содержит сведения об имеющихся слайсах или одну запись ''unused" в случае, когда диск не имеет слайсов. Для каждого слайса отображается информация о начальном и последнем секторе, о размере, имени в FreeBSD и типе слайса, а также детализированные сведения в виде подтипа и флагов. В примере на рис. 2.25 был выбран первый IDE-диск adO объемом 1 Гбайт. В разделе слайсов можно увидеть один слайс "unused" (всегда присутствует на i386- совместимых машинах) и один DOS-раздел с файловой системой FAT. Размер указан в количестве секторов. Имя данного слайса в FreeBSD — adOs 1. Если в процессе разбиения была допущена ошибка, — не беда: для сброса всех изменений в любой момент можно нажать клавишу <U>. Итак, если данный диск чистый (присутствует только область "unused") или не содержит важных данных, то можно нажать клавишу <А> (Use Entire Disk). В этом случае все существующие разделы будут удалены из списка, и появится один большой слайс для FreeBSD и маленький слайс "unused" размером в 63 сектора. Далее с помощью клавиш управления курсором следует выбрать вновь созданный слайс и нажать клавишу <S> (Set Bootable) чтобы сделать данный слайс загрузочным (в столбце Flags напротив adOsl должна появиться буква "А"). Можно пойти и другим путем. Если существует несколько разделов, и необходимо удалить только один из них (на другом, например, хранятся важные данные или установлена операционная система Windows, которую требуется сохранить), то перейдите к необходимому слайсу и, нажав клавишу <D> (Delete Slice), удалите его (при этом освобожденное место будет помечено как "unused slice"). Далее, выбрав этот слайс "unused", нажмите клавишу <С> (Create Slice). Появится окно с просьбой ввести размер создаваемого слайса. По умолчанию, этот размер выбирается равным всей непрерывной неразмеченной области или всего диска. Размер задан количеством секторов, но, поставив в конце букву "М", можно сообщить программе, что данные введены в мегабайтах. После нажатия клавиши <Enter> откроется окно, в котором необходимо ввести тип слайса (раздела). Оставьте значение, выбранное по умолчанию (165), если создаете раздел FreeBSD, или введите иное для создания раздела другого типа (например, 12 для FAT). Номер любого слайса можно изменить в любой момент, выбрав соответствующий слайс и нажав клавишу <Т> (Change Type). Если определять размер в секторах неудобно, то нажимая клавишу <Z>, можно переключить единицу отображения. В колонке Size в скобках будет отображаться символьный идентификатор для используемой в данный момент единицы: ST— секторы, KB — килобайты, MB — мегабайты. Возможные флаги состояния разделов перечислены в табл. 2.3. Таблица 2.3. Флаги состояния разделов в программе FDisk Название Описание Правильно выровненный слайс > Конец слайса находится за 1024-м цилиндром (могут возникнуть проблемы при загрузке) R Слайс уже содержит существующую файловую систему root (/) в Слайс использует плохо опознаваемую обработку BAD 144 с Слайс, совместимый с FreeBSD 2-0 (используется по умолчанию) а Слайс помечен как активный Для выхода из программы FDisk с сохранением изменений нажмите клавишу <Q>. Если присутствует несколько дисков, которые необходимо использовать в FreeBSD, то вернитесь в окно выбора дисков (рис. 2.24) и, выбрав требуемый диск, повторите процесс разбиения на слайсы в FDisk.
50 Глава 2. Установка FreeBSD Режим "Dangerously Dedicated" Находясь в режиме редактирования слайсов, можно заметить наличие режима "Опасного выделения" ("DD" mode), который активизируется по нажатию клавиши <F>. Несмотря на такое устрашающее название, многие начинающие администраторы используют данный режим довольно часто. Он назван "опасным" по двум причинам: диск в этом режиме не содержит таблицу разделов, поэтому многие утилиты работы с диском не смогут распознать тип диска и, более того, могут просто повредить расположенный на нем BSD-загрузчик; некоторые BIOS некорректно распознают диск в таком режиме, что может привести к зависанию при загрузке или же к ошибкам чтения, когда загрузчик BSD не находит сам себя. Для чего же оставлен режим "Dangerous Dedicated" и почему он так популярен среди новичков? Причина, конечно же, заключается не в использовании всего объема диска из-за отсутствия слайса "unused". Дело в том, что этот режим позволяет обойти проблемы, связанные с несоответствием данных BIOS и реальных параметров диска. Когда программа установки FreeBSD создаёт слайсы, то размещает их в соответствии с тем, как с ними будет работать BIOS. При неправильном создании слайсов загрузка системы будет невозможна. Самый простой способ избежать этого — воспользоваться режимом "DD", хотя это, как правило, не рекомендуется. Существует более приемлемый вариант. На рис. 2.25 геометрия для диска adO была следующей: 520 цилиндров/64 головки/63 сектора. Перемножив эти значения, получаем 2096640 секторов или 1 Гбайт. Однако реальные параметры в BIOS таковы: 2080/16/63. Для того чтобы установить корректные значения, следует нажать в программе FDisk клавишу <G> (set Drive Geometry). Меняйте геОметрЙо диска тоШкЬ'чгтом случае, кдгйа ц0( не йспс-льэуётсядля загрузки других систем, или на нем нет никаких данных. Для всех остальных (не загрузочных) дисков, присутствующих в системе, программа FDisk отображает правильные параметры, и менять геометрию, как правило, не приходится. Для возврата диска к нормальному режиму можно воспользоваться DOS-утилитой fdisk, вызвав ее с параметром /mbr для затирания загрузчика BSD и установки стандартной MBR. Это можно также сделать с помощью UNIX-утилиты dd: dd if=/dev/zero of=/dev/rad0 count=15 Размещение FreeBSD на нескольких дисках Предположим, что у нас есть два диска: первый — диск IDE, который будет служить для установки на него FreeBSD, а второй — диск SCSI, который будет использоваться для размещения файла подкачки (о файле подкачки речь пойдет ниже, в разделе, посвященном точкам монтирования). Выберем в программе FDisk первый диск adO, и укажем использование его целиком под FreeBSD. Для этого нажмем клавишу <А>, а затем, выделив вновь созданный слайс, — клавишу <S>. После этого выходим из FDisk, и на появившийся запрос отвечаем: установить Standard MBR. Далее выбираем SCSI-диск daO и опять создаем слайс FreeBSD на весь диск, выходим из FDisk и на запрос отвечаем Standard. После выполнения описанных действий с дисками нажмем клавишу <ТаЬ>, чтобы перейти на кнопку ОК, и затем нажимаем клавишу <Enter>. Корректная разметка слайсов рассматривается разделом ниже.
CUSTOM-установка 51 Boot Manager Рассмотрим более подробно окно выбора загрузчика, о котором несколько уже упоминалось в предыдущем разделе. Оно предоставляет выбор: установить менеджер загрузки FreeBSD (Boot Manager); записать стандартный MBR (без выбора загрузки) или не производить никаких действий с главной загрузочной записью (рис. 2.26). FrreBSI) comos with a boot selector that allows you to easily select Itptweeii FreeBSD and any other operating systeMs on your Machine at boot ti-мо. If you have More than one drive and want to boot fron the second ono, the boot selector will also rake it possible J to do so (1 Inital ioiiK in the PC LIDS usually prevent this otherwise). If you dD not want « boot selector, or wish to replace an existing one, select "standard*". If you would prefer your Master Boot Record to retrain untouched then select "Hone". NOTE: PC-DOS users will alnost certainly require "Mono""' il.U'.'.'IJ Install the FreeBSD Boot Mana.er I Install a standard MBR Cno boot Manager) Leave the Master Boot I'erord untouched Г—ТЯ—1 ГапсМ Рис. 2.26. Диалоговое окно установки менеджера загрузки Установка менеджера загрузки необходима в следующих случаях: Когда в системе более одного диска, и установка FreeBSD производится не на первый диск. В данном случае необходимо выбрать самый первый диск (в рассмотренном выше примере — adO) и, не производя никаких действий с ним, выйти из утилиты. Далее на запрос установки менеджера загрузки для устройства adO следует выбрать первый пункт BootMgr, затем — выбрать диск (например, adl, если было решено устанавливать систему в этот раздел), создать в редакторе дисков слайс для устанавливаемой системы, и на запрос установки загрузчика выбрать пункт Standard. Если на диске есть несколько разделов с различными операционными системами, и при запуске компьютера необходимо выбирать систему для загрузки. Если FreeBSD является единственной операционной системой на компьютере, и устанавливается на первый диск, то в окне установки менеджера загрузки необходимо выбрать пункт Standard. В том случае, если уже имеется какой-либо менеджер загрузки сторонних разработчиков (например, LILO от одной из Linux-системы), и вы не хотите переписывать информацию в MBR, то необходимо выбрать последний пункт — None. В данном случае для загрузки FreeBSD потребуется правильно настроить используемый менеджер загрузки. Разбиение на разделы. Точки монтирования В отличие от других операционных систем, FreeBSD не работает напрямую с первым логическим уровнем разбиения на разделы (слайсы). Как правило, слайсы необходимо разбить на разделы BSD, составляющие файловую систему, с которой будет работать FreeBSD. Таких разделов должно быть как минимум два: root и swap. Компоновка разделов — одна из самых сложных задач во всем процессе установки системы, и от нее зависит как эффективность работы системы в целом, так и наличие проблем в будущем. Для разбиения служит программа Disklabel, в которую можно попасть из меню CUSTOM-установки (см. рис. 2.23), выбрав пункт Label.
52 Глава 2. Установка FreeBSD Причины разбиения на разделы Причин разбиения на разделы можно привести очень много. Перечислим лишь основные из них: Отказоустойчивость во время сбоев. Никто не застрахован от неправильного поведения какой-либо программы или от сбоев питания. Все эти и другие воздействия могут привести к серьезным неисправностям файловой системы, особенно при ее активном использовании. Естественно, что в FreeBSD, подобно другим операционным системам, существуют утилиты поиска и устранения неисправностей, например, стандартная утилита f sck. Самые важные системные файлы, как правило, размещены в разделе root. Этот раздел не рекомендуется использовать для хранения временных или пользовательских данных. Управление доступом. В каждой файловой системе используется собственная маркировка общего доступа, например, "только чтение". Если требуется защитить какие-либо данные от изменений, то рекомендуется разместить их в отдельном разделе без возможности записи. Управление свободным пространством. Активно используемая система, так или иначе, когда-либо оказывается заполненной данными. Если пользователь системы в какой-то момент заполнит своими данными раздел, используемый системными программами, то может произойти сбой как отдельных программ, так и всей системы в целом. Очень неприятная ситуация возникает, когда вдруг обнаруживается, что несколько часов не приходит электронная почта, вы очень долго пытаетесь определить причину проблемы и в результате оказывается, что она заключается в отсутствии места для сохранения почты. Производительность системы. Как правило, хороший сервер, в не зависимости от загрузки, должен быстро отвечать на все запросы от пользователей. Предположим, у нас есть двадцать рабочих мест, и один сервер, выступающий в качестве FTP- и Web-сервера для доступа из Internet, файлового сервера NFS для десяти клиентских систем FreeBSD, файлового сервера SMB для десяти клиентских Windows-машин. И при этом приходится обслуживать постоянный поток почтовых сообщений в обе стороны для всех двадцати компьютеров. В таком случае желательно иметь быстродействующий раздел swap, отдельный раздел для почты и раздел для SMB- и NFS-клиентов. Все эти причины, так или иначе, влияют на правильное разбиение слайсов на разделы, а также на их размеры. Правильный выбор количества и размера разделов Прежде чем приступить к описанию программы Disklabel, необходимо разобраться в назначении основных директорий системы, для которых рекомендуется создавать отдельные разделы: Раздел root (/). Это самый верхний уровень иерархии файловой системы во всех UNIX-системах, который присутствует всегда, и без него установка системы невозможна. Все остальные файловые системы (даже размещенные на других компьютерах), кроме swap, устанавливаются в качестве подчиненных этому разделу. Размер раздела root обычно устанавливается равным 50-200 Мбайт (отметим, что в данном разделе содержится домашняя директория для пользователя root). В нем хранится загрузочная информация и ядро (до версии 5.0), конфигурационные файлы из директории /etc, а также программы, которые необходимы для запуска и работы системы даже в случае недоступности остальных разделов (например, в случае сбоя): /bin, /sbin, /stand, /dev и т.д. Раздел boot. Данный раздел необходимо создать в том случае, когда используется FreeBSD версии выше 5.0, и разместить его так, чтобы он полностью помещался в первых 1024 цилиндрах. Размещение файла ядра в данном разделе позволяет
CUSTOM-установка 53 избежать ограничений на размещение раздела root в пределах первых 1024 цилиндров диска. Раздел swap. Для данного раздела существует общее правило: его размер должен быть равен удвоенному размеру оперативной памяти. Например, для 256 Мбайт ОЗУ под раздел swap необходимо выделить 512 Мбайт. Основное назначение данного раздела — позволить FreeBSD использовать больше памяти, чем имеется в действительности. Для этого операционная система записывает на диск в раздел swap неиспользуемые страницы из реальной памяти до их востребования. В необходимый момент FreeBSD может записать другие данные из памяти и считать необходимые из области подкачки (альтернативное название для раздела swap). Поскольку swap — это область диска, то скорость работы с областью подкачки ограничена скоростью работы жесткого диска. По этой причине для раздела swap рекомендуется использовать отдельный, самый быстрый диск системы. Раздел swap невозможно смонтировать к / и просмотреть его содержимое в виде директории. Если в системе установлено более 256-512 Мбайт ОЗУ, то рекомендуется создать небольшой раздел swap, поскольку он практически не будет использоваться (все зависит от приложений, которые запускаются на сервере). Просмотреть/изменить состояние области подкачки можно с использованием утилит top, pstat и swapon. Раздел usr. Содержит большую часть операционной системы и утилит, а также устанавливаемые пользователем приложения (/usr/local). Размер этого раздела должен быть достаточно большим для размещения всех пакетов программ, документации, дистрибутивных файлов при установке приложений из портов. Очень много места занимает система X-Window, а при ее обновлении может потребовать несколько гигабайт свободного пространства для промежуточных файлов. В каждом отдельном случае раздел usr может иметь объем от 500 Мбайт до 6 Гбайт и выше. Раздел var. Данный раздел содержит практически все буферные каталоги, например, для организации очереди печати и электронной почты. В этом каталоге размещаются журнальные файлы программы sysinstall и других приложений, например для Web-сервера Apache. Базы данных MySQL также могут храниться в каталоге var. Расчет необходимого места для данного раздела в каждом случае особый. Он может занимать как 100 Мбайт, так и несколько гигабайт (например, если почтовый сервер очень загружен и необходимо хранить письма за несколько дней). Раздел home. В данном разделе размещаются все домашние каталоги пользователя. По умолчанию, если не выделить отдельный раздел, этот каталог размещается в /usr/home, a /home является символической ссылкой на него. Тем не менее, если во время установки FreeBSD не создать пользователей, то в системе будет отсутствовать и /home, и /usr/home. Как только будет создан раздел для /home, то его имя уже не будет просто символической ссылкой, и все данные пользователей действительно будут размещаться в разделе, независимом от раздела /usr. Если есть много пользователей (например, при организации Web-сервера), то для данного раздела рекомендуется выделить много места (или даже целый диск). Раздел tmp. Данный каталог служит для размещения временных файлов. Как правило, это — общедоступный раздел, не предназначенный для хранения постоянных данных. Множество приложений сохраняют промежуточные данные именно в этом каталоге или в /var/tmp. Обычно, если не определено другой настройки, каталог /tmp очищается при каждой перезафузке. Размер данного каталога может варьироваться от десяти до нескольких сотен мегабайт. Если в системе используются несколько дисков, то разделы home и swap рекомендуется размещать на отдельных дисках.
54 Глава 2. Установка FreeBSD Программа Disklabel Определившись с необходимыми разделами для системы, можно переходить к их созданию и установке точек монтирования. Как было описано выше, для этого необходимо перейти из главного меню CUSTOM-установки в программу Disklabel, выбрав пункт Label (см. рис. 2.23). Открывшееся в результате окно будет подобно представленному на рис. 2.27. Если вы впервые устанавливаете систему и еще не до конца определились с тем, какие разделы создавать и сколько выделить им места, то можете переустановить систему в любой момент до ее запуска в рабочее состояние. , lrep:SD Diskl.ibel Editor Disk d8 'r q «мв: dBsl Frde:,629086- ■ pC 3B71H: Disk: d«8 Partition nane:,dai - Free:, 2097128 blocks1 (1B23MB) Part Mount Size Newts' Par Mount Size Neufs Die following conMands are valid lie re (upper'-or'lower case): С .= Create D - Delete M = Mount pt. ' N = Neufs Opts Q Finish. S = Toggle SoftUpdates T - Toggle Neufs U - Undo Я = fluto Defaults R = Delete+rterge Use Fl or ? to get More help, arrow keys to select. Рис. 2.27. Главное окно программы Disklabel Итак, окно программы Disklabel разделено на три части: список дисков, BSD слайсов и свободного размера на них; список разделов с их именами, точкой монтирования, выделенным размером и списком флагов; доступные команды (в FreeBSD 5.x введена дополнительная команда Z = Custom Newfs). В примере на рис. 2.27 есть по одному BSD-слайсу на каждый диск: слайс adOsl на IDE-диске adO и слайс daOsl на SCSI-диске daO. В принципе, можно положиться на саму программу Disklabel и позволить ей самой разбить слайсы на разделы, нажав клавишу <А> (Auto Defaults), однако это — не самый лучший вариант. Так, в нашем примере в результате автоопределения будет разбит только один из слайсов (выделенный в данный момент в верхней части экрана), к тому же, если это будет второй диск размером всего 1 Гбайт, то авторазбиение выделит разделу /us r около 100-150 Мбайт, чего явно недостаточно. Для удаления всех изменений и перехода в программу FDisk необходимо нажать клавишу <U> (Undo). Проще всего поочередно удалить все или неподходяще разделы с помощью клавиши <D>. Предположим, мы решили создать на диске adOsl раздел root размером 100 Мбайт. Для этого выберем в верхней части экрана слайс adOsl и, нажав клавишу <0 (Create), откроем диалоговое окно, в котором необходимо ввести размер создаваемого раздела. По умолчанию, как и в случае с программой FDisk, размер указывается в количестве блоков и равен всему свободному пространству в выделенном слайсе. Уда-
CUSTOM-установка 55 лив это значение, введем 100 и в конце добавляем букву "М" (М — размер в мегабайтах, G— размер в гигабайтах, С — размер в цилиндрах), чтобы получилось значение 10 ОМ, после чего нажимаем клавишу <Enter>. Программа попросит выбрать тип создаваемого раздела. Это может быть или файловая система или раздел swap. В нашем примере создается файловая система, поэтому выбираем первый пункт, после чего откроется окно, в котором будет предложено ввести точку монтирования. Для раздела root точка монтирования выглядит как косая черта /. В результате выполнения описанных действий во второй части окна Disklabel появится один раздел с именем adOsla. Разберемся, как следует понимать название adOsla. Первые буквы, как оговаривалось ранее, указывают на тип физического устройства: в данном случае ad указывает на диск IDE. Цифра после ad обозначает порядковый номер устройства на шине, начиная с нуля (adO — диск "master" на первом IDE-контроллере). На диске может присутствовать несколько слайсов. В нашем примере на диске adO есть один слайс, на который указывает буква s и цифра 1 (слайсы нумеруются, начиная с единицы). Итак, adOsl — это первый слайс на ведущем диске первого IDE-контроллера. Как упоминалось ранее, слайсы в BSD имеют еще один уровень разбиения: непосредственно разделы — и с каждым таким разделом сопоставляется определенная буква. Для некоторых разделов эта буква строго закреплена, например, а — для раздела root, Ь —для раздела swap. Отсюда, обозначение adOsla указывает на раздел root на первом слайсе ведущего диска первого IDE-контроллера. Вернемся к разделению слайсов на разделы. На следующем этапе обычно выделяют необходимое место для раздела swap. Для представленного выше примера будет удобно выделить все пространство слайса daOsl, размещенного на быстром SCSI-диске. Для этого переходим в первую часть окна и, выбрав соответствующий слайс, как и для раздела root, нажимаем клавишу <С>. Оставляем значение размера неизменным, а в окне выбора типа раздела выбираем пункт Swap (рис. 2.28). Вопроса о точке монтирования не будет, поскольку, как упоминалось ранее, файл подкачки невозможно смонтировать в файловую систему. reeBSl) Bisklabel Editor ed'e .Phr.iltW.nBne: ad»?! 'jfrea: fi88G8G§ Ыоскя (2Й71МВ) da8 Pa 'f ion, пане: daBs free: 2897128 bloc 18 ИВ i ' ' ■■ ' Mount - Sizif Neufs Part Mount Size HeufS If you want to use this partition for swap space, select Swap. If you want to put a filesystoM on it, choose FS. QHO'SU Cancel The folio . •. f < 'i ,. ,ч i , i - , - ■■■ C'= Create-" /".= Delete И Hount.pt. N •= NawfE Dp - - Q'- Finish ,.S Toggle SoTtUpdatW T Toggle ы-s . t) 'Undo fi Rut о Defaults l R - Deflate «-Негде se Fl or 7 4o get .ноге help, arrow keys to select Рис. 2.28. Выбор типа создаваемого раздела Создадим также раздел /tmp размером 150 Мбайт. Прежде чем перейти к созданию остальных разделов, обратим внимание на результат наших действий (рис. 2.29). Можно заметить, что в строке для раздела swap указано использование файловой системы SWAP, все же остальные разделы используют UFS (системы FreeBSD S. 1 и выше по умолчанию используют файловую систему UFS2, которая повышает скорость
56 Глава 2. Установка FreeBSD работы утилиты f sck, позволяет использовать ACL файловой системы для увеличения безопасности и предоставляет много других усовершенствований). reeUSD Disklabel Editor Disk adB Partition пане,; adBsl Free: 5778865 blocks (2821MB) Disk: daB , Partition вамч:' da8sl Free: 6 blocks (8MB) Part Mount adBsla ' • adflsle /tup dadslb snap hu follouibig connands are valid bore (upper or lower case): ■= Create P = Delete M - Mount pt. H Hants Opts. Q ^ Finish- S - Toggle So ft Updates T Toggle Newfs U « Undo " fi.= Auto DeГак Its К DeLete+Herge Use Fl or ? to get «lire help, arrow keys to select. I Рис. 2.29. Окно программы Disklabel с созданными разделами /, /tmp и swap Если устанавливается FreeBSD версии 5.1 и выше, и при этом требуется использовать файловую систему UFS, совместимую с предыдущими версиями (например, необходимо, чтобы раздел /tmp использовался сразу двумя операционными системами), то можно нажать клавишу <1> (или, выбрав пункт Custom Newfs, заменить в поле параметров -02 на -01). Для возврата к использованию UFS2 нажмите на соответствующем разделе клавишу <2> (соответственно, для Custom Newfs необходимо заменить -01 на -02). Если вы переустанавливаете систему и не хотите удалять данные в некоторых разделах, нажмите клавишу <Г> (Toggle Newfe) выделив каждый из них. Тем самым будет отменено пересоздание файловой системы (в столбце Newfs каждого раздела должен исчезнуть флаг Y). Иногда, может возникнуть ситуация, когда потребуется поменять местами точки монтирования для некоторых разделов (например, /var и /tmp). Нет проблем! Просто выделите один из разделов, нажмите клавишу <М> (Mount pt.), удалите все разделы, и нажмите клавишу <Enter>. В результате в столбце Mount будет написано <none>, a в столбце Newfs — *. Затем выберите другой раздел, и внесите новую точку монтирования, после чего создайте точку монтирования для раздела <попе>. ВНИМАНИЕ! Такие действия не рекомендуются выполнять для раздела root. Это связано с тем, что не меняется буква раздела в полном имени. Как правило, данный способ создания точек монтирования используется, когда в системе есть раздел другой операционной системы, который необходимо использовать. Например, для существующего DOS-раздела можно создать точку монтирования /mnt/dos, а для ext2fs — /mnt/linux. Читатель, наверное, заметил, что для раздела root отключена опция SoftUpdates (флаг +S). Если включен режим "SoftUpdates" и активизировано кэширование записи на IDE, то риск потери или порчи данных при сбое резко увеличивается. Не совмещайте одновременное использование этих двух режимов в разделах, содержащих важные данные. Представим следующую ситуацию... Только что было обновлено ядро, или какой- Si=-e Heufs Part Mount Size Hewfs 10BMB UFS Y 158MB UFS*S У 1823MB SIMP
CUSTOM-установка 57 либо пользователь только что изменил свой пароль, и в этот момент произошел сбой питания. Последствия могут оказаться непредсказуемыми, если файл нового ядра или база паролей окажутся незаписанными, или — что еще хуже — испорченными. Реальное обновление данных в разделах с включенным режимом "SoftUpdates" может выполняться с задержкой до 30 секунд. Для включения/выключения этого режима используют клавишу <S> (Toggle SoftUpdates). Почему же не рекомендуется использовать его для раздела root? Во- первых, во время аварийного останова системы есть риск потерять необновленные данные. Во-вторых, из-за задержек в реальной записи изменений на диск возможен случай временной нехватки дискового пространства. Итак, когда мы разобрались с дополнительными параметрами для разделов, можно завершить создание остальных разделов. Конечный результат может выглядеть примерно так, как показано на рис. 2.30. , ireeBSD Disklabel Editor Disk: ai'B Parti on n ie: adBrl Free: В ЬЬ «^s (вгЧ ) Qisk: da8 Part if о na«!: da:-l Fr-e: В Ыо <ss ('-MB) Part ' rioiirt adB-1* /l «d;-He Ч^р «d:~1f /vrr adQslg . )-• e ad:sl"i /usr daBslb s . p Tie fol'i'.lng <~or .'lis л - 'valid here Cupper'or loner cas-): С = С а о В, Dele О' 'м = Мои it pt. Н = Ири sii^ts Q = F is'i S = Tiggle So Updated T = Toggle Ho -ts\ U = Undo ' ft « ft tfp Def ults R = Delete^Ke^ge Use. Fl or ?.i*b,.jet Morov;belp,V arrow ke^s to. select. Рис. 2.30: Результат создания разделов в программе Disklabel (FreeBSD 4.11) Создавайте раздел /usr в последнюю очередь, выделяя ему весь остаток доступного места. Для сохранения изменений и выхода нажмите клавишу <Q> (Finish). Выбор дистрибутивного набора (на примере FreeBSD 4.11-RELEASE) Выбор дистрибутивного набора, как правило, зависит от планирования использования системы и от дискового пространства. Существует несколько предустановленных опций, которые подходят для большинства новичков. Заметьте, что эти наборы несколько отличаются в FreeBSD версий 4.x и 5.x. Выбрав подходящий набор, можно, в случае необходимости, просмотреть и откорректировать его содержимое. Даже установив FreeBSD, можно добавлять требуемые наборы на уже работающей системе, потому не бойтесь экспериментировать (для работы системы необходим, как минимум, набор bin). Итак, выйдя из редактора разделов Disklabel мы вновь попадаем в меню CUSTOM- установки (см. рис. 2.23). Выберем пункт Distributions ► Select distribution(s) to extract. В результате откроется окно выбора предустановленных наборов (рис. 2.31). ■S'ze H; s , Part Mumt Siz» КС»* s I!! BBS, V 1 'MB I t>SV s в и s*s-y • 512KB UFS+S^V 1 97-B U S*S Y 1B231B S 'P
58 Глава 2. Установка FreeBSD fis a convenience, не providu suueril "cannnd" distribution sats. Those select what ич consider 'tn bo tho;nos+ reasonable defaults for thu type of systuM I» question. If you would prefer to pick «nd ciioose "the.. list of distributions yourself. slHpiy select "CustoM". You can also pick a cunned distribution set and then fine-tunu »t with the Custort Нем. Choose on Нем by pressing fSPfiCEJ Or IEHTER3. Exit iten or Move to .the OH button witlf.lTflBl. Uhen finished, choose the g<g гдяп [ } Г 1 [ ] Г J [ 1 i it this- Menu (returning to .revious) fill xyster* sources, binaries and X Uindow SysteM) Reset selucted distribution list to nothing Full sources, binaries and doc but no goMes Sane os above * X Uhidou SysleM Full binaries ond doc, kernel sourres only Заме as above + X Window SysteM Average user - binaries and dor only I—illll :ancel Рис. 2.31. Окно выбора предопределенных списков дистрибутивного набора Нажмите клавишу <End>, а затем — <А> для перехода к пункту Minimal (The smallest configuration possible). Нажатие пробела позволит пометить данный пункт как используемый при установке (с каждым пунктом связан определенный список устанавливаемого в систему набора файлов). Далее перейдите ниже к пункту Custom (Specify your own distribution set) и нажмите клавишу <Пробел>. В результате откроется окно, представленное на рис. 2.32. Please check off the distributions you wish, to Install, fit the very MiniMUM, this should be "bin". в<зашп [XI i j i i i i i i L 1 [ 1 1X1 t ] t ] [ 1 ip« и , ' Mj ' . я 3 xit this Menu (returning to previous fill systeM sources, binaries ond X Window SystBM Reset all of the below Binary base distribution (required) FreeBSD 1.x binary coMpatibllity FreeBSD 2.0 binary coMpatibllity FreeBSD 2,1 biliary. coMpatIbllity FreeBSD 2.2.x and1 Э..;в й.ои-l binary compatibility FreeBSD 3.x biliary coMpal ibi 1 ity FreeESD 4.x binary coupetibllity Basic encryption services KerberosIU authentication sorvlc.es Kerberos5 authentication services Spelling checker dictionary files Cancel Рис. 2.32. Подробный список дистрибутивного набора Как видим, в предустановленный набор "Minimal" входят наборы bin и crypto (в FreeBSD 5.X в наборе "Minimal" отсутствует crypto, поскольку этот набор устанавливается по умолчанию). Это — все, что достаточно для работающей системы. Набор bin — это минимальный набор необходимых утилит. Набор crypto требуется для поддержки хеширования паролей по алгоритму Blowfish, более надежному, чем используемый по умолчанию алгоритм MD5 (подробная информация о том как применить ту или иную систему шифрования паролей, находится во второй части книги), а также для поддержки старого формата паролей UNIX на основе алгоритма DES (для совместимости файла паролей со старыми версиями систем). Пароли на основе алгоритма DES на сегодняшний день считаются ненадежными и слабо защищенными. Желательно также выбрать пункты compat22, compat3x и compat4x для бинарной совместимости со всеми версиями FreeBSD 3.X—4.Х и FreeBSD 2.2.X. Иногда может по-
CUSTOM-установка 59 надобиться набор "Kerberos5", потому выберем также пункт krb5. Как и другие UNIX- системы, FreeBSD славится мощной системой интерактивной документации man (manual pages), для установки которой следует выбрать пункты man и catman. Переместившись далее по списку, можно найти еще три важных пункта: src, ports и XFree86 (X.Org в версиях FreeBSD 5.3-RELEASE и выше). Рассмотрим их более подробно. Набор src Как упоминалось вначале книги, FreeBSD поставляется со всеми исходными кодами, и обычное поведение системы можно изменять как заблагорассудится. Для установки исходных текстов следует выбрать пункт src, после чего откроется еще один список. Выберите в нем элемент АН, если требуется установить все исходные тексты, однако в большинстве случаев достаточно выбрать пункты base, etc и sys. Кстати, последний пункт отвечает за установку исходных текстов ядра системы, с помощью которых можно в любой момент перестроить ядро под свои нужды (а для создания мощной и защищенной системы перестраивать ядро так или иначе придется). Для возврата к предыдущему пункту необходимо переместиться в самый верх списка (<« Exit) и нажать клавишу <Пробел>. Набор ports Коллекция портов FreeBSD — это простой и удобный способ установки программного обеспечения. Она представляет собой набор файлов и сценариев для автоматизации загрузки, компиляции и установки пакетов программ, и сама по себе исходных кодов не содержит. Представьте себе, сколько бы потребовалось бы места для размещения около 14 тысяч архивов программ (приблизительный объем коллекции портов на момент написания книги)! Перед тем как установить порты, убедитесь, что в разделе /us r достаточно свободного места, поскольку коллекция портов займет на диске 300-400 Мбайт (в зависимости от версии), а сама программа установки не проверяет, достаточно ли на диске места. Перед установкой коллекции портов программа sysinstall выведет диалоговое окно User Confirmation Requested с просьбой подтвердить выбор. Выберите YES для установки, или NO, чтобы отказаться от установки коллекции портов (в дальнейшем ее в любой момент можно установить отдельно). Набор XFree8 6 (как и Х.Огд) в данной части книги не рассматривается. Установка, настройка и использование графической среды описано в части IV. Выбрав все необходимые наборы, вернемся в главное меню CUSTOM-установки. Итак, мы практически подошли к непосредственной установке системы на жесткий диск. Осталось только выбрать источник и подтвердить саму процедуру установки. Выбор источника установки Для выбора источника установки используется пункт Media (Choose the installation media type) главного меню CUSTOM-установки (см. рис. 2.23). В результате откроется диалоговое окно, представлено на рис. 2.33. При установке с CD/DVD перейдите к пункту Install from a FreeBSD CD/DVD (выбран по умолчанию), и, выбрав кнопку ОК, нажмите клавишу <Enter>. Поддерживаются как ATAPI-, так и SCSI-устройства. Для установки по FTP или NFS программа sysinstall попросит выбрать сетевое устройство и настроить его. Как это сделать, описано ниже в разделе "Постнастройка системы".
60 Глава 2. Установка FreeBSD FreeBSD can 1>н installed fruM a variety о Г different installation Madia, ranging Ггом floppies to an Internet FTP server. If you're"' installing FreeBSD froM a Supported CJVDUII drive tlion this is generally the best Media to Use if you have no overriding reason for using other Media. ME5ESU Install froM a FreeBSD CD/DUD Install froM an FTP server Install fron an FTP server through a ПгеиаИ Install fron on FTP server through a http proxy Install froM a DOS partition Install over NFS Install froM an existing filesysten Install fron a floppy disk set Install froM SCSI or QIC tape Go tci the Options screen Cancel l <~U£> Г V Рис. 2.33. Меню выбора источника установки ВНИМАНИЕ! При установке по сети (например, с локального FTP- или NFS-сервера) не забудьте указать доступный сервер имен в IP-параметрах, в противном случае придется оперировать реальными IP-адресами вместо имен серверов. Например, если дистрибутив находится на NFS-сервере с именем storage (компьютеры сети знают это ИМЯ ПО записи В файле /etc/hosts) ПО адресу storage: /distr/FreeBSD410, TO измените в пути имя на реальный IP-адрес сервера, например: i92.i68.o.2:/distr/FreeBSD4io (если реальный IP-адрес для сервера STORAGE — 192 .168 . 0 . 2). При установке с анонимного FTP (как изменить опции для установки с требующего авторизации FTP-сервера было описано ранее) используются три режима на выбор: FTP (активный), пассивный FTP, через http-proxy. FTP (Install from an FTP server) — с этой опцией все загрузки по FTP будут выполнены в "активном" режиме. Этот режим используется для работы со старыми версиями FTP, которые не поддерживают пассивный режим; также данный режим не позволяет работать через брандмауэр. Пассивный FTP (Install from an FTP server through a firewall) — для работы с FTP используется "пассивный" режим, который позволяет работать через брандмауэр. FTP через http-proxy (Install from an FTP server through a http proxy) — в данном режиме используется протокол HTTP для работы с FTP через ргоху- сервер, при этом proxy транслирует все запросы, пересылая их на FTP-сервер. Данный режим, как правило, используется для обхода, если запрещен FTP. Кроме выбора адреса FTP-сервера программа попросит ввести адрес proxy-сервера с портом. Порт, используемый по умолчанию, — 3128. Не забудьте, что в данном случае также необходимо изменить имя пользователя для соединения с FTP- сервером. Для этого добавьте к имени (по умолчанию, ftp) после знака @ имя используемого сервера. Например, в случае использования сервера ftp.ua.freebsd.org имя пользователя будет выглядеть как ftp@ftp.ua.freebsd.org.
CUSTOM-установка 61 Установка системы После выбора устройства вернитесь в предыдущее окно (см. рис. 2.23) и выберите седьмой пункт: Commit (Perform any pending Partition/Label/Extract action). На вопрос User Confirmation Requested ответьте YES, если вы согласны продолжать установку, и записать новую информацию на диск (если испугались ©, выбирайте NO). Если все было настроено правильно, то будет создана файловая система, и начнется копирование. Как правило, время установки зависит от выбранного дистрибутивного набора, источника установки и самого компьютера. На современных ПК процесс копирования может занять от одной до пятнадцати минут. Появится несколько сообщений о статусе процесса установки. Обычно на вторую виртуальную консоль выводится подробная информация о процессе установки — для ее просмотра комбинацию клавиш <AIt+F2>. После распаковки набора bin уже можно немного работать в системе на четвертой виртуальной консоли vty4 — для перехода к ней используйте комбинацию клавиш <Alt+F4>. Для возврата в первую консоль необходимо нажать комбинацию клавиш <Alt+Fl>. Во время копирования в системе будет сформировано дерево каталогов файловой системы. Приведем основные директории, которые будут созданы (для FreeBSD 4.11- RELEASE) и их назначение (листинг 2.1). Более детальная информация может быть получена в справочном руководстве man hier. Отметим также, что дерево каталогов может немного отличаться в различных версиях FreeBSD. Листинг 2.1. Дерево каталогов, создаваемое во время установки FreeBSD / - директория root /bin/ - базовые пользовательские утилиты, как для однопользовательской, так и для многопользовательской среды /boot/ - программы и конфигурационные файлы, используемые по время загрузки системы; в версиях FreeBSD выше 5.О здесь также хранится ядро системы defaults/ - файл конфигурации загрузки по умолчанию; более подробная информация — "man loader.conf" /dev/ - блочные и символьные файлы устройств; сценарий MAKEDEV для создания файлов устройств (см. "man 8 MAKEDEV") /etc/ - файлы конфигурации системы и сценарии defaults/ - файл системной конфигурации по умолчанию (см. "man re") kerberosIV/ - набор конфигурационных фалов для kerberos версии IV (см. "man 1 kerberos") mail/ - файлы настройки Sendmail namedb/ - файлы настройки named (см. "man 8 named") periodic/ - набор сценариев для ежедневного, еженедельного и ежемесячного запуска, с использованием планировщика cron; see periodic(8) ррр/ - файлы конфигурации ррр (см. "man В ррр") ssl/ - конфигурационные файлы для OpenSSL и набор сертификатов /kernel - файл ядра (загружается в' оперативную память во время загрузки ОС), в пятой ветке файл ядра перенесен в каталог /boot. /modules/ - загружаемые модули ядра; see kidstat(8) /mnt/ - пустая директория, используемая системным администратором в качестве временной точки монтирования /ргос/ - файловая система process; see procfs(5), mount_procfs(8) /root/ - домашняя директория суперпользователя root /sbin/ - системные программы и утилиты для администрирования, используемые как в однопользовательской, так и в многопользовательской среде /stand/ - программы для использования в автономной среде (постнастройка и т.п.)
62 Глава 2. Установка FreeBSD Листинг 2.1. Продолжение /tmp/ - временные файлы, наличие которых после перваагруаки не обяаательно и не критично для правильной работы системы и приложений /usr/ - содержит практически все пользовательские программы и утилиты bin/ - общие утилиты, средства программирования и приложения games/ - полезные и несерьезные программы include/ - стандартные подключаемые файлы С lib/ - архив библиотек compat/ - общедоступные библиотеки совместимости libdata/ - файлы данных для различных утилит msdosfs/ - таблицы преобразования наборов символов perl/ 5.00503/ - модули Perl для Perl упомянутой версии; see perl(l) libexec/ - системные даемоны и утилиты (используемые другими приложениями) 1рг/ - утилиты и фильтры для системы печати LP; see lpr(l) sendmail/ - исполняемые файлы sendmail; see mailwrapper(в) and sendmail(в) local/ - локальные программы, библиотеки и т.п. Также используется как директория установки набора портов FreeBSD. В пределах local/, используется структура директорий, как и для /usr. Исключением является только директория man, которая находится прямо в local/, тогда как в /usr расположена по пути local/share/, и документация к портам ports/ - коллекция портов FreeBSD sbin/ - системные утилиты и даемоны, используемые пользователями share/ - архитектурно-независымые файлы (содержимое данной директории будет зависеть от выбранного дистрибутивного набора) diet/ - список слов; see look(l) doc/ - всевозможная документация; FAQ/ - часто задаваемые вопросы bind/ - документация к BIND (Berkeley Internet Name Domain) handbook/ - руководство по FreeBSD tutorials/ - учебные пособия по FreeBSD examples/ - различные примеры для пользователей и программистов info/ - информационная гипертекстовая система GNU locale/ - файлы локализации; see setlocale(3) man/ - файлы справочной системы misc/ - различные системные текстовые файлы mk/ - шаблоны для утилиты make'; see make(l) nls/ - файлы поддержки языков; see mklocale(l) perl/ - библиотека perl; see perl(l) sendmail/ - конфигурационные файлы sendmail; see sendmail(8) skel/ - набор dot-файлов для новых пользователей системы syscons/ - файлы, используемые утилитой syscons; see syscons(4) vi/ - файлы локализации и утилиты для vi(l) sre/ - исходные файлы BSD и программ сторонних разрабочиков sys/ - исходные файлы ядра системы X11R6/ - исполняемые файлы, библиотеки и т.п. из дистрибутивного набора X11R6 /var/ - универсальные многоцелевые журнальные файлы, временные, промежуточные и спул-файлы backups/ - всевозможные резервные файлы crash/ - директория используемая для хранения дампа ядра во время сбоев; смотрите crash(в) и savecore(8)
Постнастройка системы 63 Листинг 2.1. Окончание сгоп/ - файлы используемые системой сгоп; см. сгоп(В) tabs/ - файлы crontab; см. crontab(5) log/ - всевозможные системные журнальные файлы mail/ - файлы пользовательских почтовых ящиков run/ - системные файлы, описывающие различную информацию о системе со времени ее загрузки spool/ - спул директории для почтовой системы и системы печати clientmqueue/ - недоставленные и ожидающие очереди локальные почтовые сообщения; см. sendmail(6) ftp/ - директория пользователя ftp для использования анонимного FTP mqueue/ - очередь недоставленных почтовых сообщений; см. sendmail(В) output/ - спул-директория для принтера tmp/ - временные файлы, сохраняемые между перезагрузками системы vi.recover/ - директория, где vi сохраняет восстановленные файлы ур/ - карты системы HIS По окончании установки будет отображено сообщение, представленное на рис. 2.34. Uisit the general configurat Ion Menu for a chance to sot any lest options'? Yes Рис. 2.34. Сообщение по окончании копирования файлов системы Выберите YES и нажмите клавишу <Enter> для перехода в окно постнастройки установленной системы (рис. 2.35). If you've already Installed FreeBSD, you May use tills метш to custoMize it KOHBuhat to suit your particular configuration. Most iMportantly, you can use the Packages utility to load extra "3rd party" software not provided in the base distributions. ■ЯГСТП Hat geM~-iT twt ; xit this иепц (returnin to reuious) Install additional distribution sots Install pre-packaged software for FreeBSD Set the syjteM Manager's password The disk Slice (PC-stylo partition} Editor The disk Label editor Add user and group InforMation CustoMize systeM console behavior Set which iiMe zone you're in Change the installation Media typo Configure your Mouse Configure additional network services ШРШШ Cancel — Pre И for Рис. 2.35. Окно постнастройки системы ПОСТНАСТРОЙКА СИСТЕМЫ В принципе, система установлена и практически готова к использованию, однако желательно выполнить еще ряд настроек, особенно если вы — новичок в FreeBSD. Рекомендуется, не выходя из программы sysinstall, позаботиться об установке пароля пользова-
64 Глава 2. Установка FreeBSD теля root, сетевых настройках, параметрах безопасности, запускаемых по умолчанию службах и других параметрах системы. Конечно же, все это можно сделать после первого входа в FreeBSD, отредактировав конфигурационные файлы или с помощью уже знакомой нам программы sysinstall, запущенную ее из директории /stand. Сейчас мы рассмотрим настройку системы с помощью программы sysinstall без перезагрузки. Для постнастройки необходимо вернуться в главное меню программы sysinstall и выбрать пункт Configure (см. рис. 2.15). В результате откроется окно, представленное на рис. 2.35. в котором нас, в основном, интересуют рассмотренные ниже пункты. Distributions Если вдруг обнаружится нехватка какого-либо набора и системе, или потребуется что-либо доустановить, то это всегда можно сделать, выбрав в меню постнастройки пункт Distributions. В открывшемся окне, как правило, не отображаются уже установленные наборы, что может показаться неудобным. Packages Данный пункт предоставляет возможность установить набор пакетов. Сперва программа попросит установить источник поиска пакетов. Если после установки FreeBSD компьютер еще не перезапускался, то по умолчанию будет использован тот же источник, что и при установке системы. Как правило, на CD-ROM находится ограниченный и устаревший набор пакетов. Для установки последних наборов используйте FTP- серверы. Перечень пакетов разделен на группы, в каждой из которых находится список соответствующих приложений. Установленные пакеты будут помечены с помощью знака "X", а зависимые — с помощью буквы "D". Выберите необходимые пакеты (внизу окна можно прочитать короткое описание для каждого), и, перейдя в главное меню установки пакетов, выделите кнопку Install, используя клавишу <ТаЬ> или <—►>. Программа отобразит содержимое выбранного набора, и после нажатия клавиши <Enter> приступит к его установке в системе. Root Password Этот пункт позволяет установить пароль для суперпользователя root, root — это учетная запись главного пользователя FreeBSD, имеющего неограниченный доступ к файлам и настройкам системы. Если пропустить шаг установки пароля для пользователя root, то не будет запрашиваться пароль при входе под этой учетной записью в систему, а также откажутся работать некоторые программы настроек. После ввода пароля необходимо повторить ввод еще раз. Если длина пароля менее шести символов, то программа предупредит об этом, но пароль все же можно будет установить, повторив его ввод еще дважды. В отличие от остальных операционных систем и программ, где при вводе каждого символа отображается звездочка или иной знак (в Lotus Notes, например, — три знака на один символ), в FreeBSD (как и в остальных UNIX-системах) на экране ничего не отображается. Это — одна из мер безопасности, дабы у злонамеренного наблюдателя не возникало желания подсчитать длину пароля, следя за вашими действиями. User Management Этот пункт позволяет добавлять в систему пользователей или группы (рис. 2.36).
Постнастройка системы 65 The subnemis here аНои to Manipulate user groups and login accounts. ашхчч i xit this Menu (returnin. to <re4rious) Add а пей user to the systeH. Add л new user group to the systeti. Cancel Рис. 2.36. Добавление пользователей или групп в систему с помощью утилиты sysinstall Данный пункт не рекомендуется использовать после того, как уже начнется работать с FreeBSD. Как правило, пункт User Management используется новичками и не позволяет установить множество параметров. Если придется воспользоваться данным пунктом в будущем, то не забудьте удостовериться в том, что все параметры пользователя соответствуют требованиям с помощью утилиты chpass (chpass username). Эта утилита позволяет не только просматривать, но и изменять многие параметры (кстати, не забудьте перед ее использованием изучить редактор vi). Пункт User Management, как правило, используется для быстрого добавления одного пользователя в группу wheel. Для добавления пользователей в систему после установки FreeBSD используйте утилиту pw (pw user add), окно которой представлено на рис. 2.37. User and. Group ManageMent Login 10: ■ 1 Fu11 пане: ' User 8 Коми directory: HUH A UID: 18Й1 -,1 new user Group: i l ...l Login shell: •bln/sh Password: 1 Mnnber groups' i l OK CANCEL Рис. 2.37. Окно добавления пользователя Рассмотрим назначение полей окна User and Group Management: Login Ш — имя пользователя — строка, которая однозначно идентифицирует каждого пользователя в системе. Длина имени пользователя ограничена шестнадцатью буквенно-цифровых символов. Как правило, имена водят в нижнем регистре во избежание путаницы, поскольку FreeBSD чувствительна к регистру. UID — некоторое число, уникальное в системе, с которым сопоставлено имя пользователя. Как правило, это поле можно оставить без изменений, однако если вы уверены в необходимости его изменить, можете это сделать на свой страх и риск. Если в системе найдется пользователь с таким UID, то программа сообщит о невозможности создать новую учетную запись. Group — в данном поле указывают идентификатор группы, если он известен, в противном случае его следует оставить пустым. Если добавляется пользователь,
66 Глава 2. Установка FreeBSD который сможет получать права root командой su, можете ввести в поле Group число 0. Password — пароль пользователя для входа в систему. Пароль может быть каким угодно, но не простой. Если это поле оставить пустым, то будет создан "отключенный" пользователя без возможности входа в систему. Учетная запись для "отключенного" пользователя станет доступной только после того, как для него введет пароль суперпользователь root. Full name — дополнительное информационное поле, которое более подробно описывает владельца учетной записи. Используется в поле From: при отсылке электронной почты, потому рекомендуется для заполнения. Member groups — в этом поле необходимо ввести имя существующей группы, в которую необходимо включить пользователя. Введите wheel, если создается учетная запись для пользователя с возможностью получать права root (используя команду su). Home directory — домашний каталог для пользователя, куда он будет попадать при каждом входе в систему, и где сможет хранить свои файлы. Рекомендуется оставить значение, выбранное по умолчанию, которое автоматически формируется как/home/<Login ID>. Login shell — командный интерпретатор по умолчанию (/bin/sh). Возможно, кому-то со временем значение, выбранное по умолчанию, покажется неприемлемым, впрочем, о вкусах не спорят. Автор книги предпочитает устанавливать интерпретатор С shell, расположенный в директории /bin/csh. Возможно, ранее был установлен из дополнительных пакетов интерпретатор Bourne Again Shell (bash), тогда следует сослаться на директорию /usr/local /bin/bash. Добавление группы — операция довольно простая: достаточно только ввести имя группы, ее GID и список пользователей, которых необходимо в нее включить. Console Этот пункт используется для настройки консоли, в частности, параметров клавиатуры, экранных шрифтов, хранителей экрана, частоты мерцания курсора. Как правило, эти параметры без проблем можно изменить позже в главном конфигурационном файле системы. Окно, открываемое при выборе пункта Console, представлено на рис. 2.38. j The default syslOH console driver for FreeBSD: (syscons) has a lumber of configuration options which илу Ъв set According to your preference. Uhen j>ou are done setting configuration options, select Cancel. МЗД» i xit this Menu (returnln to ireuious) Choose an alternate, screen font HA Choose an a 1 termite keyboard nap: Set the rate at which keys repeat Configure the screen saver IH&V Choose an alternate screeiiMap Ш№ЭЕ1 Cancel Рис. 2.38. Установка параметров консоли (FreeBSD 4.11) Для пользователей России и Украины подойдут следующие установки: FoBt—IBM 866; Keymap—Russia KOI8-R; Screenmap — KOI8-R to IBM866; Ttys — const25r (только для версий выше FreeBSD5.x).
Постнастройка системы 67 Time Zone Этот пункт позволяет настроить FreeBSD под текущий часовой пояс, если время в нем не совпадает со временем GMT (по Гринвичу). В диалоговом окне Select local or UTC (Greenwich Mean Time) clock, которое открывается при выборе пункта Time Zone, необходимо выбрать вариант NO. Затем откроется еще несколько диалоговых окон, которые позволят точно настроить часовой пояс. Для большинства пользователей Украины последовательность выбора такова: 8 Europe ► 43 Ukraine ► 1 most locations На вопрос "Does the abbreviation 'EEST look reasonable?" ответьте YES. Mouse Этот пункт служит для настройки мыши, а также ее включения или отключения. Если не устанавливался Х-сервер, то наличие мыши не обязательно и, скорее всего, не потребуется, кроме как для операций копирования и вставки текста. В опции Flags (Set Additional flags) можно ввести дополнительные параметры, например, -3 для эмуляции трехкнопочной мыши (применяется в Х-Window). Networking Данный пункт позволяет изменить всевозможные параметры, касающиеся сетевой среды: настройка интерфейсов Ethernet, выявленных в системе или же SLIP/PPP, а также IP-настройки, если они известны. Можно разрешить компьютеру работать в качестве анонимного FTP-сервера (см. главу 18, "Сервер FTP"), или же шлюза (см. главу 12, "Настройка сетевой среды"), отредактировать файл inetd.conf, разрешить запуск даемона SSH и сервера МТА (см. главу 15, "Работа с почтой (e-mail)"), разрешить запуск NFS-сервера или же указать, что машина является его клиентом (см. главу 19, "Сетевая файловая система NFS"). Для новичков окно, которое открывается при выборе пункта Networking, как правило, кажется одним из самых пугающих и непонятных (рис. 2.39). You меу have already configured one network device Canii the other various hostnaMe/gateway'naMe server pareneters) in the process of installing FreeBSD. This Menu allows you to configure other aspects of your_systen's network configuration. <<< an ктггття [ i IXJ [ 1 1 1 rxj Г i I ] [ ] [ ] [ J H Wf jo fti FTP Nn л He'» Л9 M ¥ Exit this Menu (returnin to revious) onfiure additional ne work interfaces This Machine wants to run the nuto-Mounter service Set flags to AMD service (if enabled) This Machine wishes to allow anonynous FTP. This Machine will route packets between interfaces This Machine wants to run the I net daeMon This Machine wants to run a Mail Transfer (Ijjent This Machine will be an NFS client This Machine will be an NFS server Select a clock-synchronization server Run authentication server for clients with PC-NFS CanceI Рис. 2.39. Настройка сетевой среды Если непонятен смысл той или иной аббревиатуры или неизвестно влияние какого- либо сервиса на безопасность системы, то лучше оставить такие сервисы не включенным и вернуться к их настройке лишь разобравшись в сути вопроса и будучи уверенным в своих действиях.
68 Глава 2. Установка FreeBSD Interfaces Для настройки сетевых интерфейсов следует выбрать пункт Interfaces, и в новом окне указать тот интерфейс, который требуется сконфигурировать. ВНИМАНИЕ! В данном пункте находится подробное описание настроек, которые могут потребоваться еще во время установки FreeBSD (например, в случае использования в качестве источников дистрибутива FTP- или NFS-сервера). Существует три типа сетевых интерфейсов, которые можно настроить: Serial ports — интерфейсы SLIP и РРР (напротив этих портов будут указаны их названия, например, СОМ1, COM2 и т.д.). Интерфейсы носят название six, pppX (где х — некоторое число). Интерфейс SLIP используется в случаях соединения по последовательному порту двух компьютеров, где один является ведущим, а другой ведомым. Интерфейс РРР необходимо настроить, если у присутствует модемное соединение. Данный пункт используется в основном в тех случаях, когда установка FreeBSD будет производиться не с локальных источников, а по модемному соединению. В этом случае программа установки также запросит телефон провайдера, имя пользователя и пароль. Parallel ports — интерфейс PLIP (как правило, один — 1р0). Подобен SLIP, но с использованием параллельного порта и с большей скоростью передачи данных. Ethernet — само собой разумеется, наибольшую сетевую производительность покажет Ethernet-карта. FreeBSD поддерживает множество сетевых карт, а также карт PCMCIA (для обнаружения в системе должна быть подключена до включения ноутбука). При любом варианте будет предложено настроить IPv6 (как правило, можно отказаться), а затем определено наличие в сети сервера DHCP для автоматической настройки интерфейса (запустится процесс dhclient, и, в случае нахождения сервера DHCP, заполняется информация о конфигурации сети). После этого будет открыто окно настройки параметров сетевого интерфейса (и глобальных параметров, не привязанных к конкретному интерфейсу), представленное на рис. 2.40. Host: nobile.a 1tersys-ua.сом IPv4 Gatсилу: I 1 Network Configuration Поил in: altersys-ua.coM Nane server: Configuration for Interface Inc0 IPv4 ftddress: Netnask: 1 255.2S5.255.B Extra options to ifconfig: UK CANCEL Рис. 2.40. Окно настройки сетевого интерфейса
Постнастройка системы 69 Краткое описание активного поля отображается внизу экрана, мы же рассмотрим эти поля более подробно: Общая сетевая конфигурация машины: о Host — имя компьютера (после изменения поля Domain к значению этого поля будет автоматически добавлено имя домена). Например, если здесь ввести mobile, а в следующем поле — altersys-ua. com, то полное DNS- имя машины примет вид mobile. altersys-ua. com. о Domain — DNS-имя домена, описывающее логическое представление подсети, к которой относится данный компьютер (например, altersys-ua. com или subloc. altersys-ua. com). о IPv4 Gateway — IP-адрес устройства, выполняющего роль шлюза в сети. Шлюз отвечает за переадресацию трафика в другую подсеть, если адрес назначения находится не в локальной сети относительно источника отправки. Если компьютер планируется использовать в роли шлюза, то оставьте данное поле незаполненным. о Name server — сервер имен (DNS). В данном поле необходимо ввести IP- адрес DNS-сервера сети или провайдера для правильного преобразования DNS-имен в IP-адреса и наоборот. Специфичная для данного интерфейса конфигурация (имя интерфейса отображено в подписи рамки, окружающей эту группу параметров): о IPv4 Address — IP-адрес конкретного сетевого интерфейса. Для возможности пересылки пакетов IP-адрес должен относиться к той же подсети, что и шлюз. о Netmask — маска подсети, определяющая, к какой сети относится интерфейс. Для различных классов сетей существуют стандартные маски. По умолчанию, для сети класса С используется маска 255.255.255.0. Подробную информацию о подсетях можно узнать в части III. о Extra options to ifconfig — дополнительные параметры настройки сетевого интерфейса. Как правило, изменять данное поле во время установки нет необходимости, однако, если вы не впервые устанавливаете FreeBSD и уже занимались оптимизацией настроек интерфейса, то это поле может пригодиться. После внесения всех необходимых значений, следует нажать кнопку ОК, и на вопрос включения интерфейса с данными параметрами ответить YES, после чего к данному интерфейсу будут применены все настройки. Для некоторых полей, которые, возможно, остались незаполненными, программа установки выведет соответствующее предупреждение. Например, если не заполнить поле IPv4 Gateway, то отобразится предупреждение, представленное на рис. 2.41. No (jeteHOy 1ms Ъееп set. You nay be ипдЫе to access hosts not on your local network (IBBS!) ЯРЭН P» . - -r Рис. 2.41. Предупреждение о том, что не было заполнено поле шлюза, используемого по умолчанию AMD Выбор этой опции добавит поддержку автоматического монтирования. Обычно она используется вместе с протоколом NFS для автоматического монтирования удаленных файловых систем.
70 Глава 2. Установка FreeBSD Anon FTP С помощью этой опции можно разрешить анонимный FTP-доступ. О том, как настроить анонимный и обычный FTP, описано в главе 18, "Сервер FTP". В данном случае не рекомендуется сразу же разрешать анонимный доступ. Gateway Установите эту опцию, если компьютер имеет два и более интерфейса (например, один "смотрит в мир", а другой — в локальную сеть) и будет использоваться в качестве шлюза или маршрутизатора. inetd Суперсервер inetd "прослушивает" порты и, в случае поступления на один из них (настроенный и разрешенный) запроса, запускает другой процесс, обслуживающий поступивший запрос (man 8 inetd). Mail В былые годы было принято, что почтовым сервером по умолчанию устанавливается sendmail, а уже в процессе работы системы его можно было заменить каким-либо другим МТА (Mail Transfer Agent — сервер, отвечающий за доставку почты пользователям системы). В силу роста популярности альтернативных почтовых агентов, таких как Postfix, Exim, QMail, теперь в процессе постнастройки FreeBSD можно выбрать полюбившийся "почтовик". В результате выбора пункта Mail отобразится список доступных МТА (рис. 2.42). Use sendiiail. but do not listen on the network Use the Postrix MTfl Use the Exin MTfl Do not instell an MTR Exit this Menu (returning to previous) Рис. 2.42. Список доступных МТА Рекомендуем оставить выбор Sendmail неизменным, поскольку все, что описано в книге относительно почты, будет основано именно на этом продукте. Отметим также, что Sendmail уже установлен в системе, а выбор другого МТА повлечет за собой установку дополнительного пакета. К тому же, исторически сложилось так, что все "почтовики" устанавливаются под именем sendmail, поэтому наличие исполняемого файла sendmail еще не говорит о том, что используется именно Sendmail. Если требуется вообще отказаться от почтового сервера, то в меню, представленном на рис. 2.42, следует выбрать пункт NONE (в данном случае в файле /etc/rc. conf будет добавлена строка sendmail_enable="NONE"). NFS client / NFS server В среде UNIX для использования удаленных ресурсов принято использовать сетевую файловую систему NFS. Если компьютер содержит (или предполагается, что будет содержать в будущем) совместно используемые ресурсы, то потребуется настроить NFS-сервер. В данном случае будет предложено отредактировать файл экспорта /etc/exports. Если в сети уже есть NFS-сервер, и планируется использовать его ресурсы, то выберите установку NFS-клиента. К слову, машина может функционировать как NFS- клиент и сервер одновременно, в любом случае не забудьте также включить опцию portmap, которая находится ниже по списку. Более подробную информация о NFS можно получить в справочном руководстве man 8 nf sd, а также в главе 19, "Сетевая файловая система NFS". ГЦ
Постнастройка системы 71 Routed Routed — это даемон маршрутизации. Утилита routed управляет таблицами маршрутизации,, обеспечивает обнаружение широковещательных маршрутизаторов, а также отвечает за предоставление таблиц маршрутизации компьютерам в сети. В случае выбора данной опции будет запрошено местонахождение утилиты по умолчанию (/sbin/routed), а затем потребуется ввести флаги. По умолчанию, установлен флаг -q. Sshd Изначально для передачи терминальной информации применяли приложения telnet и rlogin, в которых используется передача данных в явном виде. Это может привести к простому перехвату всего потока данных, включая пароли. Для предотвращения "прослушивания" за счет шифрования всего потока терминальной информации было разработано приложение OpenSSH для OpenBSD, которое затем было портировано в другие UNIX-подобные системы, в том числе и в FreeBSD. В FreeBSD за работу SSH по порту с номером 22 отвечает даемон sshd, поэтому рекомендуется включить его поддержку и автоматический запуск во время загрузки системы, и оставить закомментированной строку запуска telnet в файле /etc/ inetd. conf на этапе настройки суперсервера inetd. Более подробно история, назначение, описание, настройки, обеспечение безопасности каждой из перечисленных служб рассматривается в соответствующих главах книги. После настройки сети и сервисов, вернитесь в окно FreeBSD Configuration Menu. (см. рис. 2.35). Security Этот пункт позволяет выбрать требуемый уровень безопасности. Изменения вносятся в файл /etc/rc. conf. Если выбрать высокий уровень безопасности, то будет невозможно запускать Х-сервер и некоторые другие приложения. Первоначально предоставляется возможность выбрать два уровня: "Medium" (уровень, используемый по умолчанию) и "Extreme". Для начала рекомендуется оставить выбранным уровень "Medium", и только после полной настройки системы установить необходимое значение для securelevel (уже будет установлено, если выбрать уровень "Extreme"). Отметим, что уровень безопасности — это набор параметров настройки системы, разрешающий или запрещающий запуск отдельных программ, выбранных по умолчанию. Например, в режиме "Extreme" будет запущен securelevel, и отключен запуск sendmail, sshd, portmap, NFS и т.п., а в режиме "Medium" будет отключен securelevel и включены все вышеупомянутые сервисы. Впрочем, уровень безопасности — это не панацея, поскольку запуск любой из программ можно будет установить позже, после установки FreeBSD, изменив файл /etc/rc. conf. Startup Сервер, скорее всего, будет выполнять какие-либо фоновые процессы, например, выступать в качестве DNS- или NIS-сервера. С помощью пункта Startup можно указать, какие сервисы должны запускаться при старте системы. Заметим, что именно здесь можно установить запуск бинарной совместимости с Linux. Если Linux-пакет не установлен, то отобразится запрос на его установку, после чего необходимые файлы скопированы в директорию /usr/compat, а в корне /compat->/usr/compat будет создана символическая ссылка. Необходимо отметить, что Linux поддерживается на уровне ядра, а не как эмуляция среды, как, например, это происходит в Windows при использовании пакета Wine или других ему подобных (см. директорию /usr/ports/emulators).
72 Глава 2. Установка FreeBSD TTYs С помощью этого пункта производится настройка консолей. Потребуется отредактировать файл /etc/ttysB редакторе (по умолчанию, ее). В этом файле задается также необходимый уровень защиты для каждой консоли в отдельности (рис. 2.43). Если были установлены параметры консоли, рекомендованные ранее, не забудьте поменять значения cons25 на cons25r (в FreeBSD 4.x в настройках Console отсутствовал пункт Ttys), как показано на рис. 2.43. ' [ (- аре) мели search pronpt k delate .line p prev li g prev page' о «sell code *x search "1 undelete line fn next li "v next page и end of file "л begin of line *u delete word •"!) back 1 char 4 t begin of file "e end of line "г restore word *f forward 1 char с coMMand Ad delete char "* ' undelete char "z next word L: 31 C: 1 ======== ====== - - ======================================== г insole none unknown off secure tyvB "Vusr/1ibexec/getty Pc" cons25r on secure Ulrtual terninals , tyvl 'Vusr/l ibexec/getty Pc" -cons25r on secure tyv2 "/usr/1ibexec/getty Pc" cons25r on secure tyv3. -Vusr/1 ibexec/getty Pc" cons25r on secure tyv4 ~"/usr/l ibexec/getty Pc" cons25r on secure tyv5 'Vusr/1ibexec/getty Pc" cans2Sr on secure tyv6 *Vusr/libexec/getty Pc" cons25r on secure tyv7 'Vusr/1ibexec/getty Pc" cons25r on secure tyv8 -"/usr/XllR6/bin/xdn -nodaenon" xterM off secure , Serial terninals .The 'dialup' keyword identifies dial in lines to login, fing.erd etc. ty'dB 'Vusr/Hbexec/getty std.geee"" dialup off secure '' tydl 'Vusr/1ibexec/getty std.96eB" dialup off secure tyd2 *Vusr/libexec/getty std.96Be" dialup off secure. tyd3 'Vusr/1 ibexec/getty std.968e'' dialup, off secure. Рис. 2.43. Редактирование файла настроек консолей (/etc/ttys) Описание конфигурирования Х-сервера, как и описание установки, вынесено в отдельную часть книги и здесь не рассматривается. ЗАВЕРШЕНИЕ ПРОГРАММЫ УСТАНОВКИ И ПЕРЕЗАПУСК СИСТЕМЫ Если все необходимые настройки были произведены, то можно выйти из программы sysinstall. Если же что-либо не было настроено или требуется изменить некоторые настройки, то можно это сделать сейчас или же после перезапуска системы. Для выхода из программы установки необходимо вернуться в главное окно sysinstall, выбрать кнопку X Exit Install, перейдя к ней с помощью клавиши <ГаЬ> или <—»>, и затем нажать клавишу <Enter>. Программа задаст вопрос о подтверждении выхода из установки: User Confirmation Requested Are you sure you wish to exit? The system will reboot (be sure to remove any floppies/CDs/DVDs from the drives). Yes [ No ] Выберите Yes и извлеките дискету из дисковода. Если установка производилась с компакт-диска, то он будет заблокирован до тех пор, пока компьютер не начнет перезагрузку. Во избежание запуска программы установки быстро извлеките диск из привода.
Завершение программы установки и перезапуск системы 73 Если все было установлено и настроено правильно, то будет произведен запуск FreeBSD. Подробно процесс запуска будет рассмотрен в следующей главе. Сейчас обратим внимание на следующее: если на экране появится запрос на ввод имени пользователя, то это свидетельствует об успешном запуске FreeBSD. Обращаем также внимание на то, что первая загрузка может быть довольно продолжительной, поскольку некоторые программы требуют первоначальной настройки прежде, чем станут доступными для использования (например, если был выбран запуск sshd во время загрузки системы, то ей потребуется время для генерирования ключей).
74 Глава 3. Первый запуск системы ГЛАВА 3. ПЕРВЫЙ ЗАПУСК СИСТЕМЫ Для данной главы больше бы подошло название "Первый запуск системы. Перекрестимся?". И не только потому, что уже сейчас — на этапе первой загрузки — могут возникнуть серьезные проблемы (как правило, по вине устанавливающего), но и даже с той точки зрения, что вы окунаетесь в мир нового и до этого момента для вас неизвестного. Иногда, для того чтобы в шутку "припугнуть" новоиспеченного "юниксоида- активиста", на его вопрос о том как выглядит система на первый взгляд отвечаем: "Ну... ты MS-DOS видел? Так вот это что-то подобное, но еще хуже!" ©. В этот момент у него начинают проплывать перед глазами уроки информатики в те давние школьные годы и ужасные задания "Создать директорию 1 на диске А:, две поддиректории в директории 1, скопировать/перенести некий файл А в другую директорию" и т.д., а также зловеще мигающий курсор на темном экране. Если вам уже плохо, то еще не поздно отступить. Первые вопросы, которые возникают у начинающих пользователей и будущих администраторов системы FreeBSD, касаются загрузки, входа в систему и выхода из нее (выхода/смены пользователя, перезагрузки или выключения компьютера). Ответить на данные вопросы, конечно, можно с помощью пяти предложений, но хотелось бы как следует пояснить процессы, происходящие в системе, и как ими управлять. Минимальное понимание этих вопросов позволит избежать серьезных ошибок, а в случае возникновения каких-либо проблем знать "где зарыта собака", суть проблемы и приблизительное понимание путей ее решения. ЗАГРУЗКА СИСТЕМЫ Итак, что из себя представляет процесс запуска системы. Это некая упорядоченная последовательность выполнения строго определенных задач по подготовке системы к использованию. В эту последовательность входит: самотестирование системы; обнаружение устройства для загрузки; считывание программы загрузки и передача управления ядру системы для обнаружения и инициализации устройств; запуск служб, необходимых для работы системы (проверка дисков, инициализация сети и т.д.); запуск служб системы и служб, определенных пользователем; сам вход пользователя для выполнения определенных действий в различных прикладных пакетах. Весь описанный процесс, как правило, выводится на консоль, а часть его также записывается в системный журнал утилиты syslog. Соответствующий журнальный файл может быть найден и просмотрен в директории /var/log. Также для просмотра последних сообщений системы удобно использовать утилиту dmesg. Но все же... Проследим процесс запуска FreeBSD, пропустив при этом процедуры, выполняемые BIOS и POST. Итак, когда BIOS находит первое доступное устройство загрузки, заданное в конфигурации, начинается процесс, называемый начальной загруз-
Загрузка системы 75 кой, состоящий из целой серии процессов. При загрузке системы с диска в первую очередь считывается нулевой сектор жесткого диска: MBR (Master Boot Record) — программа размером не более 512 байт, позволяющая найти все разделы, из которых возможен запуск (копия MBR располагается в файле /boot/bootO). Если вдруг MBR был поврежден или перезаписан другой операционной системой, то можно вернуть его следующей командой (загрузившись с Live CD или загрузочных дискет FreeBSD): # fdisk -В -Ь /boot/bootO deviceName где deviceName — имя загрузочного устройства, например adO. В случае, если при установке системы не была выбрана установка Boot Manager, то автоматически произойдет загрузка программы, находящейся в загрузочном секторе загрузочного раздела (копия располагается в файле /boot /boot 1). Данная программа также ограничена 512 байтами и содержит информацию о метке диска, а также о расположении boot 2. Программа boot2 (копия находится в файле /boot/boot2) распознает файловую систему FreeBSD и может передавать управление ядру или программе-загрузчику. Программы bootl и boot 2 неразрывно связаны между собой и устанавливаются вместе. Более того, в FreeBSD 5.X эти два файла объединены в один: /boot/boot. Если возникла необходимость перезаписать эти программы в загрузочную область раздела, используйте следующие команды: # disklabel -В [-b bootl -s boot2] slice # bsdlabel -В [-b bootl slice где slice — имя раздела, например, adOsl; disklabel — утилита для FreeBSD 4.X; bsdlabel — утилита для FreeBSD 5.X; параметры, заключенные в квадратные скобки, указывать не обязательно. Загрузчик Программа boot2 производит запуск непосредственно из файловой системы программы-загрузчика и передает ей управление (путь к программе-загрузчику: /boot/loader). Программа-загрузчик loader определяет, с какого диска запущена система, устанавливает начальные переменные и ненадолго запускает некий интерпретатор команд, получаемых из сценария или с клавиатуры. Затем она считывает файл /boot/loader.гс, который использует значения из файла конфигурации по умолчанию /boot/default/loader.conf, и переопределяющего его файла /boot/ loader. conf. На основании loader. гс и полученных параметров выполняется загрузка модулей ядра и ядра системы. Процесс начальной загрузки на этом прекращается. Но прежде, чем загрузить ядро, загрузчик предоставляет возможность прервать дальнейшую загрузку и изменить некоторые параметры запуска или путь к запускаемому ядру. Для этого необходимо в момент десятисекундного ожидания загрузчика в FreeBSD 4.X (рис. 3.1) нажать любую клавишу, кроме <Enter>, а в FreeBSD 5.X (рис. 3.2) — выбрать пункт 6. Escape to loader prompt. Hit [Enter} to boot 1ммес1 iately, or any Dther key for соммамс! pronpt. Booting [kernel] in 6 seconds... _ ■ Рис. З.1. Ожидание действий пользователя загрузчиком в FreeBSD 4.X
76 Глава 3. Первый запуск системы I Uel-.ме to FreeBSD? 1. Boot F p»T D [lefadtl 2. Boot F eeVSD u" "i PCPI disabled,. 3. Boot F peBSD in Safe Mode 4. Boot F eeBSD in single user Mode 5. Bo6t F eeBSD with verbose loggirg 6. E- ape to loader prompt 7. Peboot Select option, tEnterl for default or [Space! to pause tiMer Э _ Рис. 3.2. Меню загрузчика в FreeBSD 5.X При прерывании паузы перед запуском ядра отобразится командная строк с простым и небольшим набором поддерживаемых команд. Перечислим и опишем некоторые из них. autoboot time Изменить время ожидания перед запуском ядра, которое по умолчанию равно десяти секундам. Позволяет вернуться в режим ожидания с другим временем задержки. boot [kernel] [-arg] Перейти к загрузке текущего или указанного в качестве параметра ядра. Если указанны аргументы, то ядро будет запущено с соответствующими параметрами. Наиболее часто используемые аргументы: -а — во время загрузки спрашивать устройство для монтирования в качестве корневой файловой системы; -с — произвести загрузку с компакт-диска (Fixit); -s — перейти в однопользовательский режим после загрузки системы; -v — вывод расширенной информации во время и после загрузки ядра. help [topic] Получить справку по теме (файл справки /boot/loader.help). Для вывода списка необходимо в качестве topic указать слово index. load [-t type] filename Загрузить указанное ядро, модуль или файл указанного типа. Is [-1] [path] Вывести список файлов по указанному пути. Если путь не указан — вывести список файлов в директории /. Для вывода размера файлов дополнительно необходимо указать параметр -1. lsdev [-v] Вывести список всех устройств, с которых возможна загрузка дополнительных модулей. Указание параметра -v позволяет вывести дополнительную информацию об устройствах. Пример:
Загрузка системы 77 OK lsdev -v cd devices: disk devices: diskO: BIOS diskl: BIOS disklsla: disklslb: disklsld: disklsle: disklslf: pxe devices: lsmod [-v] Вывести список загруженных модулей. more filename Вывести содержимое указанного файла. Обратите внимание, что таким образомдбез сортВетствующих прав можно просмотреть содержимое любого файла в любой директории в переделах слайса, используемого для загрузки. reboot Выполнить перезагрузку системы. set variable; set variable=value Используются для изменения параметров загрузчика. Смотрите help set. show [variable] Вывести значение указанной переменной или список всех установленных переменных с принимаемыми значениями. unload Выгрузить из памяти все загруженные модули ядра и ядро. Наиболее часто используется, когда после сборки нового ядра система отказывается запускаться. В таких случаях применяют прерывание загрузчика и выполняется следующая последовательность команд в FreeBSD 4.X (вводимые команды выделены полужирным шрифтом): ok unload ok load kernel.old /kernel.old text=0x3418b5 data=0x ( ... } ok boot Copyright (c) 1992-2005 The FreeBSD Project. { ... } В операционной системе FreeBSD 5.X путь к файлу предыдущего ядра имеет вид: /boot/kernel .old/kernel. Исходя из этого, в таких случаях после команды unload необходимо выполнять следующую команду: OK load /boot/kernel.old/kernel drive A: drive C: FFS 256MB (63-524351) swap 102MB (524351-734911) FFS 256MB (734911-1259199) FFS 256MB (1259199-1783487) FFS 1177MB (1783487-4194288)
78 Глава 3. Первый запуск системы Загрузка ядра Ядро системы, расположенное в корне файловой системы (до версии FreeBSD 5.0), или в директории /boot обеспечивает запуск специализированной службы init а также инициализацию всего оборудования в системе. В процессе работы программы init ядро еще может выполнять определенные действия по настройке оборудования и "вклинивать" свои сообщения на консоль. Для различения сообщений, получаемых от ядра и от программы init, они отличаются различной яркостью. Так, сообщения ядра выделяется ярко-белым шрифтом, а сообщения программы init — сероватым. Как упоминалось ранее, ядро отвечает за все аппаратные ресурсы в системе и служит как бы промежуточным слоем между приложениями и устройствами. Для просмотра всех сообщений ядра используется команда dmesg I more. Прокомментируем пример вывода сообщений ядра (листинг 3.1) для ноутбука IBM ThinkPad 600E (переконфигурированное ядро). Листинг ЗЛ. Сообщения ядра во время нагрузки системы (комментарииавтора выделе- . НЫ ПОЛУЖИРНЫМ ШРИФТОМ) , : ' <- 1- ■ J^ # Вывод информации о системе, версии системы и ядра, дате компиляции файла # ядра и пользователе, его скомпилировавшего. Директория в которой было # собрано ядро. Copyright (с) 1992-2005 The FreeBSD Project. Copyright (с) 1979, 19B0, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 4.11-RELEASE #6: Fri Apr 1 20:25:20 EEST 2005 root@mobile.altersys-ua.cora:/usr/src/sys/compile/MOBILE # Информация о процессоре, его возможностях, количестве памяти в системе Timecounter "i8254" frequency 1193182 Hz CPU: Pentium II/Pentium II Xeon/Celeron (363.96-MHz 686-class CPU) Origin = "Genuinelntel" Id = 0x66a Stepping = 10 Features=0xl83f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CM0 V,PAT,PSE36,MMX,FXSR> real memory = 201129984 (196416K bytes) # Указания для ядра из файла /boot/kernel.conf, этот файл содержит команды # в том случае, если вы входили в•Userconfig при запуске программы # установки системы. Как правило, после правильного редактирования # конфигурационного файла ядра, компиляции ядра и его установки в системе, # все записи для устройств, отмеченных di и en, можно удалить, # но лучше отключить использование данного файла при запуске системы # на случай, если вдруг некоторые ISA-устройства в системе начнут # работать неверно или конфликтовать. Отключить использование данного # файла можно, удалив в файле /boot/loader.conf строку # userconfig_script_load="YES" или изменив на userconfig_script_load="NO" config> en pcicO config> po pcicO ОхЗеО config> ir pcicO 0 config> iom pcicO OxdOOOO config> f pcicO 0 config> q # Информация о запускаемых модулях loader-a, в данном случае запускается # поддержка режима VESA и сплеш-изображекий в формате Ьтр avail memory = 191262720 (186780К bytes) Preloaded elf kernel "kernel" at 0xc0438000. Preloaded userconfig_script "/boot/kernel.conf" at 0xc043809c. Preloaded elf module "splash_bmp.ko" at 0xc04 380ec. Preloaded elf module "vesa.ko" at 0xc0438190. Preloaded splash_image_data "/boot/splash.bmp" at 0xc043822c.
Загрузка системы 79 ЛИСТИНГ3.1 .П0ОДОЛЖ8НИ8 - - - • '■'"._" - ".<-'- > t ' * > VESA: v2.0, 2496k memory, flag3:0x0, mode table:0xc042e282 (1000022) VESA: MagicMedia 256AV 48K # Процесс обнаружения устройств в система # и выделение им требуемых ресурсов Pentium Pro MTRR support enabled mdO: Malloc disk pcibios: No call entry point apmO: <APM BIOS> on motherboard apmO: found АРМ BIOS vl.2, connected at vl.2 npxO: <math processor> on motherboard npxO: INT 16 interface pcibO: <Intel 82443BX (440 BX) hoat to PCI bridge> on motherboard pciO: <PCI bus> on pcibO agpO: <Intel 82443BX (440 BX) host to PCI bridge> mem 0x40000000- 0x43ffffff at device 0.0 on pciO pcibl: <Intel 82443BX (440 BX) PCI-PCI (AGP) bridge> at device 1.0 on pciO pcil: <PCI bus> on pcibl pcil: <NeoMagic MagicMedia 256AV SVGA controllers at 0.0 irq 11 pcicO: <TI PCI-1251 PCI-CardBus Bridge> mem 0x50102000-0x50102fff irq 11 at device 2.0 on pciO pcicO: TI12XX PCI Config Reg: [ring enable][speaker enable][pwr save][CSC parallel isa irq] pccardO: <PC Card 16-bit bus (classic)> on pcicO pcicl: <TI PCI-1251 PCI-CardBus Bridge> mem 0x50101000-0x50101fff irq 11 at device 2.1 on pciO pcicl: TI12XX PCI Config Reg: [ring enable][speaker enable][pwr save][CSC parallel isa irq] pccardl: <PC Card 16-bit bus (classic)> on pcicl csaO: <CS4610/CS4611> mem 0x50000000-0x500fffff,0x50100000-0x50100fff irq 11 at device 6.0 on pciO csa: card is Unknown/invalid SSID (CS4610) device_probe_and_attach: csaO attach returned 6 isabO: <Intel 82371AB PCI to ISA bridge> at device 7.0 on pciO isaO: <ISA bus> on isabO atapciO: <Intel PIIX4 ATA33 controller port Oxfcf0-0xfcff at device 7.1 on pciO ataO: at OxlfO irq 14 on atapciO atal: at 0x170 irq 15 on atapciO uhciO: <lntel 82371AB/EB (PIIX4) USB controlled port 0x8400-0x841f irq 11 at device 7.2 on pciO usbO: <Intel 82371AB/EB (PIIX4) USB controlled on uhciO usbO: USB revision 1.0 uhubO: Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhubO: 2 ports with 2 removable, self powered chipO: <Intel 82371AB Power management controller> port OxefaO-Oxefaf at device 7.3 on pciO ormO: <Option ROM> at iomem OxcOOOO-Oxcbfff on isaO pmtimerO on isaO fdcO: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isaO fdcO: FIFO enabled, 8 bytes threshold atkbdcO: <Keyboard controller (i8042)> at port 0x60,0x64 on isaO atkbdO: <AT Keyboard> flags 0x1 irq 1 on atkbdcO kbdO at atkbdO psmO: <PS/2 Mouse> irq 12 on atkbdcO psmO: model Generic PS/2 mouse, device ID 0 vgaO: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isaO scO: <System console> at flags 0x100 on isaO
80 Глава 3. Первый запуск системы Листинг3.1. Окончание , - -■ .',.'. scO: VGA <1б virtual consoles, flags=0x300> sioO at port 0x3f8-0x3ff irq 4 flags 0x10 on isaO sioO: type 16550A ppcO: cannot reserve I/O port range unknown: <PNP0000> can't assign resources unknown: <PNP0303> can't assign resources unknown: <IBM3780> can't assign resources unknown: <PNP0700> can't assign resources ppcl: Otandard parallel printer port> at port 0x3bc-0x3bf irq 7 on isaO ppcl: Generic chipset (NIBBLE-only) in COMPATIBLE mode lptO: <Printer> on ppbusO lptO: Interrupt-driven port unknown: <PNP0501> can't assign resources pcml: <CS423x-PCI> at port 0x530-0x537,0x388-0x38b,0x220-0x233 irq 5 drq 1,0 on isaO unknown: <CSC0103> can't assign resources unknown: <IBM0071> can't assign resources unknown: <PNP0e03> can't assign resources unknown: <PNP0680> can't assign resources unknown: <PNP0680> can't assign resources # Запуск приложений, работающих на уровне ядра, таких как, например, # пакетные фильтры и система шифрования IPSec IP packet filtering initialized, divert enabled, rule-based forwarding enabled, default to deny, logging limited to 100 packets/entry by default IPsec: Initialized Security Association Processing. IP Filter: v3.4.35 initialized. Default = pass all, Logging = enabled # Обнаружение и инициализация остальных устройств pccard: card inserted, slot 0 adO: 6149MB <HITACHI_DK239A-65B> [13328/15/63] at ataO-master UDMA33 acdO: CDROM <SANYO CRD-S372BV> at atal-master PI04 # Последнее сообщение ядра, после которого управление передается # процессу init Mounting root from ufs:/dev/adOsla { ... } # Уже во время выполнения процесса init ядро может дополнительно # предоставлять ресурсы некоторым устройствам (например, картам PCMCIA). # Более того, подобное сообщение может быть выдано ядром во время работы # пользователя в системе ерО: <3Com 3C574B, Megahertz 3CCFE574BT or Fast Etherlink 3CS74-TX> at port 0x240-0x25f irq 11 flags 0x1 slot 0 on pccardO epO: Ethernet address 00:01:03:82:5c:41 Процесс init Для пользователей других UNIX-систем данный процесс должен быть очень хорошо знаком. Но, в отличие от них, в BSD-системах есть только два уровня исполнения и полное отсутствие файла inittab ©. Присутствует однопользовательский режим ба сети и полнофункциональный многопользовательский с поддержкой сценариев конфигурации системы. В результате работы с HP-UX и Solaris появляется привычка к разньп уровням исполнения, но иногда бывают моменты, когда можно запутаться во всех ас пектах их исполнения. Несмотря на эти различия в количестве уровней исполнения, цели, задачи и прин ципы, заложенные в init, во всех системах практически одинаковые. Итак, на стари данный процесс выполняет установку имени машины, проверку и подключение диска и файловых систем, перечисленных в файле /etc/fstab с флагом auto (если файло
Консоль и терминалы 81 вая система была неправильно размонтирована при последнем завершении работы системы, то программа запустит утилиту f sck для проверки на повреждения, и, в случае обнаружения ошибок, попытается их исправить), запуск даемона syslogd для журна- лизации процессов, происходящих в системе, а также других служб, таких как почтовый сервер, сетевые настройки, включение наблюдения за квотами и т.п. Во время работы системы, процесс init также отвечает за состояние системы и управляет ею посредством сигналов. Для отправки сигнала используется команда kill. Например, для перехода из многопользовательского в однопользовательский режим можно использовать такую команду: # kill -TERM l В данном случае под 1 понимается процесс init. Процесс init всегда запускается с номером 1: f ps ax I grep init 1 ?? ILs 0:00,01 /sbin/init -- Для выполнения таких процессов как инициализация сети, запуск различных процессов и т.п., процесс init считывает файлы конфигурации системы и сценарии гс. * в каталогах /etc и /etc/defaults, а также пользовательские сценарии * . sh в директориях /usr/local/etc/red и /etc/red (в FreeBSD 5.X) для автоматического запуска в фоновом режиме. Программы консоли В последнюю очередь init пытается считать файл /etc/ttys для инициализации настроек консоли, виртуальных или псевдотерминалов и (как это ни кажется странным) установки уровня безопасности для них. Пример записи из файла /etc/ttys: ttyvO "/usr/libexec/getty Pc" cons25r on secure Как правило, к программам консоли относится getty. Именно она инициализирует терминал и устанавливает параметры безопасности системы и типа терминала. Из вышеприведенного примера видно, что за инициализацию виртуального терминала ttyvO отвечает программа getty, тип терминала— Рс, уровень безопасности— secure. В конце инициализации консоли и виртуальных терминалов getty запускает программу login, отвечающую за правильность ввода имени пользователя и пароля. КОНСОЛЬ И ТЕРМИНАЛЫ Рассмотрим такие основополагающие понятия системы FreeBSD как "терминал" и "консоль", поскольку именно с ними связана вся гибкость и простота работы в системе. Без знания этих понятий будет очень тяжело разобраться в системе, и принципах ее работы как многопользовательской ОС. Консоль Поскольку вопрос автоматического запуска графической среды не рассматривался в силу соглашения, что система устанавливается для выполнения задач специфичных для сервера, то после загрузки системы можно увидеть запрос ввода имени пользователя сразу после завершения стартовых сценариев. На экране появится примерно следующее: Additional ABI support: linux . Local package initialization: . Additional TCP options: .
82 Глава 3. Первый запуск системы Thu Apr 14 17:14:34 EEST 2005 FreeBSD/i386 (mobile.altersys-ua.com) (ttyvO) login: В каждом конкретном случае сообщение может быть несколько иным — это зависит от установленных пакетов, дня запуска системы, имени хоста и т.д. Но для понимания, что же такое консоль это не важно. В данный момент нас будут интересовать две последние строки. В первую очередь: FreeBSD/i386 (mobile.altersys-ua.com) (ttyvO) Здесь мы можем увидеть информацию о системе (работая в системе, можно выполнить команду uname -nps, или uname -а для отображения всей информации о системе). Итак, мы используем FreeBSD на системе с архитектурой Intel x86. Полное имя компьютера mobile.altersys-ua.com. В каждом конкретном случае оно будет выглядеть иначе (если сеть не устанавливалась, то, скорее всего, имя будет Amnesiac). Последнее, что мы можем увидеть, — это то, что находимся в виртуальном терминале ttyvO, иначе называемом системной консолью. Последняя строка всегда выглядит как: login: Далее описан процесс входа в систему. Виртуальные консоли/терминалы Все идет хорошо, пока пользователь не сталкивается с проблемой запуска нескольких задач одновременно, с возможностью наблюдения результатов или процесса выполнения каждой задачи. Наличие одной консоли в такой системе было бы существенным недостатком. Вспомните работу в MS-DOS, когда, запустив копирование большого количества файлов, можно было смело отправляться пить кофе, и не один раз. А ведь копирование файлов, не забирает много ресурсов процессора! В многопользовательских и многозадачных операционных системах существует несколько вариантов решения подобных проблем. В системе FreeBSD существует понятие виртуальных консолей, и настроена она таким образом, что возможна одновременная работа с ними. В случае необходимости, используя специальные сочетания клавиш на клавиатуре, можно переключаться с одной виртуальной консоли на другую. При этом система сама заботится о правильном перенаправлении ввода с клавиатуры и вывода на монитор при переключении на другую консоль, используя для этого свои специальные каналы ввода/вывода. Для переключения между виртуальными консолями зарезервированы специальные комбинации клавиш. Сочетания клавиш <Alt+Fl>, <Alt+F2> и т.д. до <Alt+F8> зарезервированы для переключения между различными виртуальными консолями в FreeBSD, которых по умолчанию устанавливается восемь. Файл настройки /etc/ttys Как уже упоминалось ранее, в конфигурации по умолчанию FreeBSD предоставляет возможность работать только с восемью виртуальными консолями, однако это "ограничение" можно изменить, отредактировав файл /etc/ttys. При этом количество консолей можно как увеличивать, так и уменьшать. Заметим, что в действительности объявлено девять консолей: одна из них не является виртуальной (ttyvO), а еще одна (ttyv8) служит для запуска графической оболочки Х-Window: ttyvO "/usr/libexec/getty Pc" cons25r on secure # Virtual terminals ttyvl "/usr/libexec/getty Pc" cons25r on secure
Консоль и терминалы 83 ttyv2 ttyv3 ttyv4 ttyv5 ttyv6 ttyv7 ttyv8 "/usr/libexec/getty "/usr/libexec/getty "/usr/libexec/getty "/usr/libexec/getty "/usr/libexec/getty "/usr/libexec/getty "/usr/XHR6/bin/xdm Pc" Pc" Pc" Pc" Pc" Pc" -nodaemon" cons25r cons25r cons25r cons25r cons25r cons25r xterm on on on on on on off secure secure secure secure secure secure secure Каждая строка в файле /etc/ttys описывает специальный файл устройства. Строки разбиваются на поля с помощью знака табуляции или пробела. Пустые строки и строки, которые начинаются со знака "#", игнорируются. Первое поле— название устройства из директории /dev. Второе поле описывает исполняемый файл, который предназначен для обслуживания соединения, как правило, это getty. Третье поле описывает тип терминала, например: vtlOO, xterm, pty, remote, cons25r и др. (список находится в файле /etc/termcap). Остальные поля предназначены для установки специальных параметров, например, значение "on" позволяет инициализировать данный терминал на этапе выполнения init. Установка значения "secure" разрешает вход пользователя с UID 0, а установка "insecure" запрещает такому пользователю получать непосредственный доступ к терминалу. После изменения файла /etc/ttys для применения новых настроек необходимо заставить процесс init перечитать данный файл. Так как процесс init всегда запускается первым в системе, то он имеет PID (Process ID), равный единице (1). Исходя из этого, команда "перенастройки" всегда будет выглядеть следующим образом: # kill -HUP l Получить имя устройства текущего терминала или его название можно с помощью таких простых команд как tty или who, например: # tty /dev/ttypO # who informex ttypO Oct 6 10:31 (192.168.0.1) Однопользовательский режим Довольно популярным в практике администратора может оказаться вопрос с однопользовательским режимом, о котором уже упоминалось ранее. В данный режим можно попасть несколькими способами. Например, после сбоя и невозможности автоматического исправления ошибок во время запуска система сама перейдет в него, или же можно на этапе ожидания перед загрузкой ядра прервать данный процесс и вручную указать запуск системы в однопользовательском режиме (boot -s). Третий вариант — это переход из многопользовательского в однопользовательский режим с помощью команды shutdown now. Заметим, что упомянутая команда переведет систему именно в однопользовательский режим, а не выключит ПК, как это могло бы показаться на первый взгляд (о выключении системы будет рассказано в конце главы). Однопользовательский режим предназначен для выполнения специфических административных задач как, например, проверка всех разделов на отсутствие ошибок и внесение исправлений при обнаружении таковых. В однопользовательском режиме отсутствует поддержки сети, а также запускается он с размонтированными разделами, кроме раздела / (если не использовался переход из многопользовательского режима). Помимо этого (и что нас больше всего интересует в данный момент), при работе в таком режиме присутствует только одна консоль (переключиться на виртуальные невозможно). Консоль для однопользовательского режима в файле /etc/ttys описана отдельно: # If console is marked "insecure", then init will ask for the root 'bpassword
84 Глава 3. Первый запуск системы ft when going to single-user mode. console none unknown off secure Обратите внимание на комментарий, стоящий перед описанием консоли. Установка параметра "insecure" вместо "secure" позволит несколько обезопасить систему, поскольку будет запрашиваться пароль суперпользователя root прежде возможности выполнять какие-либо действия в указанном режиме. Если вы только начинаете изучать систему, рекомендуем не изменять данный п* раметр, так как в том случае, если вы забыли пароль для root, можно потерять возможность восстановления системы. С другой точки зрения, если к вашему ком» пьютеру имеют физический доступ другие люди, никто не помешает им войти в од> нопользовательском режиме и изменить пароль для root!!! Поэтому серверы (это касается любого устройства, для. которого необходимо обеспечить ограничение фи* зического доступа) необходимо защищать также и физически, устанавливая их в шкаф или другое помещение, доступ к которому можно ограничить с помощью ра# личных устройств контроля (магнитная карта, ключи и т.п;). Вопрос физической за щиты серверного оборудования также входит в компетенцию системного администратора. ; Псевдотерминалы Существует еще один тип наиболее часто используемых терминалов— так называемые псевдотерминалы. В чем же их особенность? До этого момента мы рассматривали терминалы, которые можем использовать на самом сервере. А как же обстоит вопрос с удаленным доступом и управлением, о котором так много говорится при упоминании о UNIX-системах? В файле /etc/ttys присутствует большой список записей (255) следующего вида: ttyXY none network где X принимает значения из массива [pqrsPQRS], a Y — из массива [0-9, a-v]. Этой есть описание псевдотерминалов. Именно псевдотерминалы отвечают за удаленные подключения пользователей по таким протоколам как ssh, telnet и т.п. Также, благодар» наличию псевдотерминалов, решается проблема запуска нескольких терминальных сессий в виртуальном терминале (например, в графической системе X-Window). ВХОД В FREEBSD Если до этого вы никогда не работали с многопользовательской системой, то понятие входа в систему для вас окажется новым. Понятие многопользовательской системы означает, что она может быть использована множеством различных людей, одновременно запускающих свои приложения на компьютере для выполнения своих специфических задач. В таких системах остро встает вопрос: как отличить одного пользователя от другого, и кто запустил какое приложение на выполнение? В FreeBSD этот вопрос решается путем входа: проверки имени пользователя, перед тем как он начнет запуск каких либо приложений. Для этого каждому пользователю предоставляется свое уникальное имя в системе, называемое "account" или учетная запись, а также некоторый пароль для этого имени, хранящийся в системе в зашифрованном виде. Итак, система ожидает ввода имени пользователя, которое идентифицирует пользователя системы. Как только будет введено действительное имя пользователя, систем» предоставит соответствующий интерфейс (описание настройки различных оболочек бу-
Вход в FreeBSD 85 дет рассмотрено далее). Как правило, имя пользователя в системе построено на действительном имени или фамилии пользователя. В больших компаниях, где имена могут совпадать, обычно, выбираются имена пользователей, сочетающие имя и фамилию. Например, распространенным способом является использование первой буквы имени и полностью фамилии, или наоборот— полностью имя и одна-две первых буквы фамилии. Таким образом, имя пользователя для автора книги будет звучать как adidok или aiexanderd. ПРИМЕЧАНИЕ Имена пользователей в FreeBSD чувствительны к регистру, поэтому принято все их писать с маленькой буквы во избежание проблем и путаницы. Имя учетной записи внутри одной системы для любого пользователя не должно совпадать с именем любого другого пользователя данной системы. Если была только что установлена новая система и во время инсталляции не было выбрано добавление пользователей/групп, то единственным возможным именем в данный момент может быть только root. Если во время установки была проигнорирована необходимость установки пароля для root, то во время входа в систему под этим именем пароль запрошен не будет. Что настоятельно рекомендуется запомнить в данный момент: имена пользователей чувствительны к регистру, длина имени составляет 16 символов; права суперпользователя в системе не ограничены, поэтому один неверный шаг может привести к необратимым последствиям, вплоть до необходимости полной переустановки системы. Используйте права суперпользователя только в случае крайней необходимости и осторожно, тщательно планируя и обдумывая каждое действие. ПРИМЕЧАНИЕ Автор книги рекомендует еще во время инсталляции создавать хотя бы одного пользователя, включенного при этом в группу wheel (это предоставляет пользователю возможность перейти в режим суперпользователя, не завершая свой сеанс). Для пользователя root рекомендуется назначить сложный пароль — минимум 8 знаков (под знаками понимается сочетание чисел, букв, спецсимволов). Также настоятельно рекомендуется запретить прямой вход под пользователем root с любой консоли, кроме как через получение прав'суперпользователя с помощью команды SU. Предположим, у нас есть имя пользователя user2. Сразу после загрузки FreeBSD на запрос системы произвести авторизацию (login: ) вводим имя пользователя и нажимаем <Enter>. После этого, если учетная запись разрешена и имеет установленный пароль, появится другой запрос — на этот раз, запрос ввода пароля для пользователя user2: login: user2 Password: Как и во время установки системы, когда задавался пароль для пользователя root, при вводе пароля для авторизации на экране не будут отображаться никакие символы. После ввода пароля нажимаем <Enter>. В случае успешного ввода попадаем в среду операционной системы FreeBSD, представленной в виде командного интерпретатора, установленного по умолчанию. Как правило, при входе пользователя отображается время последнего входа, "Сообщение дня" (текст из файла /etc/motd) и строка, которая
86 Глава 3. Первый запуск системы завершается неким специальным символом, например, %, $, #. Эта строка сигнализиру ет о том, что вы были успешно опознаны системой и можете выполнять необходимы команды в системе. Заметим, что следует обращать внимание на время последнего входа в систему. Ее ли было замечено, что в день вашего отсутствия был произведен вход под вашей учет ной записью, то измените пароль, поднимите историю команд, а также просмотрит! журнальные файлы. При неправильно введенном пароле или имени пользователя на консоль будет вы ведено сообщение о неправильно введенных данных: "Login incorrect" (заметьте, что и выводится информация о том, что именно неправильно — пароль или имя пользовате ля). После трех неудачных попыток войти в систему начинает действовать система за щиты от программ подбора паролей, приводящая к длительным задержкам перед по вторным запросом на ввод информации для авторизации. ВЫХОД ИЗ СИСТЕМЫ И ЕЕ ОСТАНОВ Так или иначе, когда-либо наступает момент необходимости перезапуска системы ил просто выхода пользователя. Рекомендуется рассмотреть данные вопросы еще до нача ла полноценного использования системы. Завершение сеанса работы пользователя Выход из системы — часто используемая операция. Она требуется в различных си туациях: если вы хотите сменить пользователя, если необходимо отойти на несколь» минут от рабочего места или же просто по окончанию работы с сервером. Выход из сио темы может предотвратить преднамеренный несанкционированный доступ к вашщ данным других пользователей, а по окончанию вашей работы — освободить ресурс) для других пользователей и их процессов. Наиболее правильно выполнять выход с помощью команды exit. Данная команд заставляет оболочку прекратить свою работу и освободить ресурсы системы. Вмест ввода команды exit также можно использовать комбинацию клавиш <Ctrl+D>. Крои этого, некоторые оболочки поддерживают команду logout (например, csh). Если был запущены несколько оболочек, то необходимо произвести выход из всех их отделый (получение привилегий другого пользователя с использованием команды su также вы полняет запуск отдельной оболочки, из которой потребуется промежуточный выход). Останов системы Во время своей работы система постоянно обрабатывает большое количество файлов, запускает и обслуживает различные процессы и т.п. До того как будет отключеШ питание, системе необходимо выполнить цикл операций по подготовке к отключению последовательный останов всех процессов, в том числе корректное завершение пользе вательских процессов и отключение самих пользователей, синхронизация данных в п» мяти и на дисках, и затем размонтирование всех файловых систем. Это относится кш к процессу перезапуска, так и выключения системы. Операционная система FreeBSH предоставляет несколько способов останова системы, но рекомендуем использован только один из них, а точнее — сценарий shutdown. Как правило, для перезагрузки или отключения системы используется команд shutdown, которая доступна только пользователю root и пользователям из групт operator. Даная программа посылает сигнал TERM процессу init, который выполняв сценарий /etc/rc. shutdown и затем посылает команду TERM (в случае необходимо сти — команду KILL) всем процессам, работающим в системе. Затем происходит ш
Выход из системы и ее останов 87 хронизация кэша и файловой системы с помощью команды sync. В последнюю очередь происходит размонтирование разделов с пометкой флагом "clean" и остановка ядра. Общий формат команды shutdown имеет следующий вид: shutdown (параметры] время [сообщение] С помощью параметров можно изменять поведение сценария завершения работы. Все параметры перечислены в табл. 3.1. Необязательный параметр сообщение позволяет определить сообщение, посылаемое перед отключением всем пользователям системы, подключенным в данный момент (данное сообщение будет периодически выводиться пользователям с учащением при приближении ко времени ее выполнения). Таблица 3.1. Параметры, используемые в команде shutdown Параметр Описание Прочитать предупреждающее сообщение из стандартного устройства ввода -h Остановка системы в указанное время -р Остановка системы в указанное время с отключением питания, если система программно и аппаратно имеет такую поддержку (АРМ или AGPI). В системе FreeBSD 4.Х такая программная поддержка реализована на уровне ядра или с использованием модуля ядра арт (возможно использование также и acpi, что может иногда приводить к сообщению "kernel panic" и непредсказуемому останову системы). В системе FreeBSD 5.X по умолчанию используется модуль acpi. Более подробное описание смотрите в главе 10, посвященной настройке ядра -г Перезагрузка системы в указанное время -к Отключение всех подключённых пользователей (кроме root) и дальнейшая невозможность пользователей получить доступ к системе. Не смотря на это, система поддерживает сеть и остается в многопользовательском режиме. Доступ может получить только суперпользователь root. Это обусловлено созданием специального файла /var/run/nologin, присутствие которого в системе обозначает невозможность подключения пользователей с выводом сообщения, находящегося в данном файле. Для возврата системы в нормальное состояние просто удалите упомянутый файл -о Перезагрузка или отключение системы (в зависимости от наличия ключа -h, -р или -г) без посылки сообщения процессу init (как следствие — невыполнение сценария /etc/rc. shutdown), что может вызвать проблемы при загрузке системы и запуске определенных процессов. Фактически, выполнение операции выключения/перезагрузки с помощью утилит halt или reboot, описанными позже -п Может использоваться в сочетании с параметром -о, что приводит к пропуску операции сброса кэша файловой системы на диск. Данная опция не должна использоваться, так как может приводить к потере данных Не указан Отключение всех пользователей й перевод системы в однопользовательский режим без размонтирования файловых систем Наибольший интерес представляет указание времени в команде. Для этого используется несколько вариантов. Наиболее часто (до окончательной настройки системы) указывают ключевое слово now, что позволяет немедленно выполнить операцию выключения/перезагрузки. Во внедренной в общее использование системе чаще всего указывают отключение по истечению определенного количества минут. Например, команда: # shutdown -r M "System reboot (new kernel installation)" позволяет указывает, что перезагрузка системы будет выполнена через четыре минуты. При этом все пользователи системы получат сообщение о пользователе, инициирующем
88 Глава 3. Первый запуск системы операцию, о времени, предоставленном им для сохранения данных и завершению работы, а также текст сообщения (если был указан): *** System shutdown message from informex@mobile.altersys-ua.com *** System going down in 4 minutes System reboot (new kernel installation) Существует также возможность указать операцию перезагрузки или выключения системы по дате и времени. При этом используется формат YYMMDDHHMM, где YY — год, ММ— месяц, DD— число, НН— час и ММ— минуты. Разрешается использовать сокращенные записи времени события: MMDDHHMM (в текущем году), DDHHMM (в текущем месяце) и ННММ (сегодня). За пять минут до операции завершения работь! системы будет создан файл /var/run/nblbgin (см. табл. 3.1, параметр -к), при этом текущие пользователи не будут отключены, а новые не смогут зарегистрироваться и войти в систему. Альтернативная перезагрузка Для перезагрузки можно также использовать команду reboot (f astboot), но данная команда может отсутствовать в других операционных системах, потому привыкать к ней не рекомендуется. Другой проблемой является неполная подготовка системы к отключению, отсутствие предупреждающего сообщения и задержки перед выполнением перезагрузки. Для перезагрузки системы также можно воспользоваться комбинацией клавиш <Ctrl+Alt+DeI>, которая доступна в системе по умолчанию. Даная комбинация выполняет перезапуск системы в соответствии с командой reboot, потому не рекомендуема к использованию. Во-вторых, упомянутая комбинация клавиш может нарушать политику безопасности, в частности, при возможном доступе других пользователей к клавиатуре сервера они могут перезапускать систему без соответствующего права на то. Альтернативное выключение Для отключения системы можно использовать команду halt (fasthalt), которая может отсутствовать в других операционных системах. Подобно команде reboot, она не выполняет полную подготовку системы к отключению, а также не посылает предупреждающее сообщение пользователям, подключенным к системе в данный момент. Ее использование не рекомендуемо.
Получение справки 89 ГЛАВА 4. ОСНОВЫ РАБОТЫ В СИСТЕМЕ. БАЗОВЫЕ КОМАНДЫ Итак, первый вход в систему благополучно выполнен. Идем дальше... Прежде, чем углубиться в изучение возможностей FreeBSD, необходимо рассмотреть те основы, без которых дальнейшая работа будет или невозможна, или непродуктивна. Что мы можем отнести к основам? Знание того как получить справку по командам, передвигаться по директориям, просматривать и изменять файлы, какие существуют типы файлов и права доступа. Именно эти вопросы и будут кратко рассмотрены в данной главе. ПОЛУЧЕНИЕ СПРАВКИ Пользователи операционных систем семейства Microsoft Windows привыкли к тому, что система плохо документирована, ведет себя не так, как ожидалось бы, а за помощью обратиться практически некуда — сама компания взимает за такой сервис дополнительную плату (это уже не говоря о стоимости самой операционной системы). При этом приходится или широко использовать Internet (в поисках неизвестно чего, неизвестно где), или искать хороших администраторов, или "мучаться" в самостоятельных поисках ответа на интересующий вопрос. В отличие от Windows, системы UNIX еще на заре своего возникновения предоставляли широкую помощь и поддержку своим пользователям как в печатной документации, так и в справке внутри самой операционной системы. Хотя на самом деле тогда все это стоило неимоверных денег (вспомните историю возникновения UNIX). И на сегодняшний день существуют бесплатные системы данного семейства, которые при этом не потеряли своей отличительной черты: хорошей документации, прекрасной системной справки, всесторонней официальной поддержки по Internet. Говоря о FreeBSD, в первую очередь необходимо упомянуть о существовании официального руководства "FreeBSD Handbook" ("Руководство FreeBSD") — наиболее интересного и полного источника информации о возможностях и решениях FreeBSD, написанного на различных языках. Его можно найти как на официальном сайте (см. http://www.freebsd.org/doc/ru/books/handbook/), так и в самой операционной системе в различных форматах (html, txt) в директории /usr/share/doc/ru/ books/handbook/, но при условии, что установлен или набор doc из дистрибутива. Очень интересен тот факт, что, как правило, данным руководством, к большому сожалению, мало кто пользуется, а ведь оно "перекрывает" множество "мусора", присутствующего в Internet и описывающего решения различных задач, которые уже и так хорошо документированы. Второй по полноте изложения и удобству можно назвать справочную систему man, рассмотренную подробно далее. Ну и, естественно, не забудем о той справочной информации которую предоставляют "неофициальные" источники: всевозможные статьи из Internet и книги различных авторов, в том числе и та книга которую вы держите в руках.
90 Глава 4. Основы работы в системе. Базовые команды Нет шуршанию страниц или использование man Практически каждая команда, каждая утилита, каждое приложение в FreeBSD поставляется с документацией в электронном формате, которая называется man- страницами. Именно из этих страниц большинство пользователей и получает основную информацию о настройке, опциях, управлению работой практически любой утилиты. Все man-страницы хранятся в строго определённых директориях (просмотрите файл /etc/manpath.config), а системная команда man позволяет находить искомый элемент и выводить справку. Для вывода справки по искомой команде используют следующий формат: О man command В данном случае, command — это любая утилита или команда системы (и не только). Например, для получения помощи по самой системе man-страниц используется команда: # man man MAN(l) FreeBSD General Commands Manual MAN(l) NAME man -- format and display the on-line manual pages (...) Из этого примера видно, что при выводе man-страницы в первой строке отображается название раздела, которое также имеет номер. Это объясняется тем, что система man-страниц разделена на разделы, при этом одна и та же команда может находиться в нескольких разделах одновременно. Разделы man-страниц с их описанием перечислены в табл. 4.1. Таблица 4.1. Разделы системы man-страниц Номер Раздел Описание 1 Пользовательские ко- Информация о большинстве пользовательских команды манд 2 Системные вызовы Информация о системных вызовах (то есть, описание API). Для разработчиков 3 Функции из библиотек Описания различных библиотек и их вызовов с использованием функций. Для разработчиков 4 Описание устройств Информация о различных устройствах — точнее об интерфейсах к драйверам. Для разработчиков 5 Форматы файлов Детальное описание структуры и формата файлов (как системных, так и устанавливаемых с различными приложениями). Часто используется при .настройке системы и приложений 6 Развлечения и игры Данный раздел в описании не нуждается © — содержит инструкции и описание игр и других программ для развлечения 7 Различная дополни- Вся информация, которая не относится к другим раз- тельная информация делам, помещается в данный раздел 8 Команды управления В данном разделе содержатся описания программ, системой служащих для управления системой (администрирование) 9 Для разработчиков яд- Описание системных функций уровня ядра. Для раз- ра работчиков Поскольку команды могут находиться в различных разделах, система man-страниц позволяет указать раздел, в котором необходимо произвести поиск. Например, команда перехода в другую директорию cd находится в первом разделе, но при этом разработ-
Получение справки 91 чику может понадобиться описание драйвера cd для CD-ROM из четвертого раздела. Для указания раздела перед командой необходимо просто указать номер раздела (см. табл. 4.1), например: # man 4 cd CD(4) FreeBSD Kernel Interfaces Manual CD(4) NAME cd — SCSI CD-ROM driver { ... I Для того чтобы вывести информацию о команде (функции, устройстве) из всех разделов, в которых она находится, необходимо непосредственно перед ней указать ключ -а. Таким образом, команда # man -a cd выведет справочную информацию из трех различных разделов (1,4 и 9). Может оказаться, что выведенной информации недостаточно, или же что для полного понимания информации необходимо обратиться к другой странице справочного руководства. Как правило, связанные команды можно найти в секции "SEE ALSO" в конце man-страницы. При этом следует обратить внимание на цифру в скобках (например, da (4)). В скобках указывается раздел, в котором необходимо искать информацию по данной команде (функции, устройству). Как можно заметить при просмотре различных man-страниц, все они разделяются на несколько блоков. Некоторые авторы пишут нестандартные страницы справки но, как правило, большинство имеют следующие блоки: NAME — имя команды и другие варианты команды (например, chpass имеет имена chfn, chsh, ypchpass, ypchfn и ypchsh), также дается краткое описание команды. SYNOPSIS — список возможных опций и аргументов команды. Если в зависимости от некоторой опции меняется список других опций, то такой вариант команды отображается в новой строке. DESCRIPTION — данная секция, как правило, содержит краткое описание команды и (если нет отдельного раздела OPTIONS) использования каждого из параметров команды. OPTIONS — предназначен для описания использования каждого из параметров, перечисленных в разделе SYNOPSIS. FILES — если команда зависит от присутствия или содержимого каких-то файлов в системе, то они перечисляются в данной секции. SEE ALSO — операционная система FreeBSD (как и другие UNIX-подобные системы) имеет в своем составе много взаимосвязанных команд или различных команд, решающих подобные задачи. В данной секции указывается перечень таких "дружественных" команд. BUGS — данная секция содержит список известных ошибок и проблем, а также рекомендации по их устранению. Система man-страниц позволяет выводить краткую информацию о команде, если было забыто предназначение какой-то и нет желания просматривать целую man- страницу. Пример краткого описания команды: fc man -f traceroute traceroute(8) - print the route packets take to network host Для просмотра краткого описания всех файлов в текущей директории можно использовать один из следующих форматов вызова: # man -f *
92 Глава 4. Основы работы в системе. Базовые команды # whanis * Для поиска команды по ключевому слову используйте один из следующих форматов вызова: # man -k nat # apropos nat Вместо nat используйте то слово, необходимое в конкретном случае. При этом будет выведен список всех страниц, в которых встречается искомое слово. Хочется напомнить, что в man-страницах хранится информация не только о командах или функциях, но и просто общая справочная информация. Например, команда man hier выдает информацию о структуре файловой системы, a man security — информацию о безопасности системы. КОМАНДНЫЙ ИНТЕРПРЕТАТОР Мы не будем сейчас очень подробно рассматривать командные интерпретаторы и их возможности. Опишем только вкратце то, что поможет на данный момент без проблем изучать работу в системе. Что такое командный интерпретатор (или, как его еще часто называют, "оболочка", "shell")? Ответ очень прост: пользовательский интерфейс. Командный интерпретатор, по своей сути, — это та же программа, которая просто "понимает" команды пользователя и выполняет роль промежуточного слоя между ним и ядром системы. В качестве аналогии можно привести Explorer из Microsoft Windows. Это— такой же интерпретатор, но только принцип работы с ним совсем другой. Как уже упоминалось ранее, командный интерпретатор запускается после авторизации пользователя в системе. При этом каждый пользователь может иметь свой собственный интерпретатор команд, настроенный по собственному вкусу. Оболочка, исполняемая по умолчанию, указывается в профиле пользователя (вспомним, что во время постнастройки системы при добавлении нового пользователя задавался вопрос об оболочке). Для того чтобы выяснить, какой интерпретатор установлен по умолчанию, можно воспользоваться командой: %echo $SHELL /bin/csh или %grep 'whoami' /etc/passwd informex:*:1001:0:Olexa:/home/informex:/bin/csh Обратите внимание на обратные кавычки при написании команды 'whoami;. Данный символ, как правило, может быть найден под клавишей <Esc>. Любая команда, заключенная в такие кавычки, будет выполнена внутри команды раньше (вложение команд). Таким образом, сначала будет выполнена команда whoami, и результат ее выполнения будет подставлен в команду grep.* Первая команда выведет полный путь к исполняемому файлу интерпретатора, а вторая— строку из файла /etc/passwd описывающую ваш профиль, в котором последнее поле указывает на командный интерпретатор по умолчанию (поля в файле /etc/passwd разделяются символом двоеточия ":"). В системе FreeBSD, по умолчанию, присутствует как минимум два интерпретатора: tcsh/csh (С Shell) и sh (Bourne Shell). При этом пользователь root, по умолчанию, использует csh, а вновь создаваемым пользователям назначается sh (если не указать
Командный интерпретатор 93 иное). Оба этих интерпретатора несколько устарели, хотя, по большому счету, интерпретатор csh уже заменен новой версией — tcsh — и является жесткой ссылкой на него, и потому устаревшим считаться не может ©. На сегодняшний день, помимо упомянутых интерпретаторов, существует немало альтернатив, например: ksh (Kom shell) или bash (Bpurne Again Shell). К слову, автор книги предпочитает работать со стандартным интерпретатором tcsh (csh). Установить дополнительные интерпретаторы не составляет никаких проблем (особенно если воспользоваться набором портов), однако для использования их по умолчанию простой установки будет недостаточно. В целях безопасности, все командные интерпретаторы должны быть перечислены в специальном файле /etc/shells, на изменение которого права имеет только пользователь root (как и на установку приложений). Однако в действительности перейти в другой командный интерпретатор можно, просто запустив его из командной строки другого интерпретатора, например: %/usr/local/bin/bash bash-2.05b$ Как правило; установка командного интерпретатора из набора портов или набора пакетов автоматически вносит соответствующие и^енён^й в файл, /etc/shells, добавляя в него полный путь к исполняемому файлу интерпретатора. Установить пользователю другой интерпретатор, запускаемый по умолчанию, может пользователь root вручную с использованием команды vipw или же других методов (их существует предостаточно). Сам же пользователь может изменить "шелл" как минимум с помощью команды chpass (другие названия — chfn/chsh/ ypchpass/ypchf n/ypchsh) следующим образом: %chpass -s /usr/local/bin/bash Password: chpass: user information updated Как видим, необходимо передать в качестве аргумента для параметра: -s и путь к интерпретатору команд (находящийся в файле /etc/shells), — и затем ввести пароль. В результате, если путь к интерпретатору и пароль были введены правильно, измененная информация будет внесена в профиль пользователя. Если путь к интерпретатору не указан в файле /etc/shells, то будет получен следующий ответ системы: %chpass -s /usr/local/bin/ksh chpass: /usr/local/bin/ksh: non-standard shell Причины такого поведения будут подробно рассмотрены при описании работы с командными интерпретаторами в следующей главе 5, "Командные интерпретаторы, сценарии и язык обработки шаблонов". Напомним еще раз, что система FreeBSD чувствительна к регистру символов в командах и именах файлов. Как правило, во избежание путаницы, при создании новых файлов следует использовать нижний регистр символов. Хотелось бы упомянуть о тех удобствах, которые предоставляют современные командные интерпретаторы, и в первую очередь— о дополнении частичного имени файла. Что под этим подразумевается? Предположим, мы находимся на самой вершине иерархии файловой системы / и хотим просмотреть содержимое файла COPYRIGHT. Мы могли бы набрать полностью имя команды и имя файла с клавиатуры, но есть другой, более удобный вариант — использовать клавишу <ТаЬ> для завершения имени. При этом достаточно будет ввести только следующий текст: $ more С
94 Глава 4. Основы работы в системе. Базовые команды и нажать <ТаЬ>. в результате чего строка изменится к следующему виду: $ more COPYRIGHT Обратите внимание на появившийся пробел в конце строки, это говорит о том, что имя файла было полностью подставлено. Что же произойдет, если мы хотим просмотреть файл /etc/csh. logout с использованием дополнения частичного имени. Наберем с клавиатуры следующую строку: $ more /e и нажмем <ТаЬ>. Как видим, ничего не произошло, не считая того, что системный динамик подал звуковой сигнал. Этот сигнал сообщает о невозможности дополнения частичного имени по причине отсутствия элемента файловой системы с таким символом или невозможности точно определить, что хотел пользователь дополнить. В таких случаях следует нажать еще раз клавишу <ТаЬ> (в bash) или <Ctrl+D> (в csh/tcsh) для вывода возможных вариантов: $ more /e entropy etc Это позволит получить имена всех директорий или файлов с таким же начальным символом. Для нашего примера, для того, чтобы однозначно указать, что требуется дополнять, необходимо дописать символ "t". Поскольку /etc/ — это директория, то будет автоматически также добавлен символ обратной косой: $ more /etc/ Теперь введем первую половину имени какого-либо файла: $ more /etc/csh.1 Нажимаем клавишу <ТаЬ>, в результате чего имя дополняется не полностью, и опять звучит звуковой сигнал. Нажимаем соответствующее сочетание клавиш для просмотра вариантов (<ТаЬ> или <Ctrl+D>) и смотрим причину такого поведения: $ more /etc/csh.log csh.login csh.logout Дописываем символ "о" и нажимаем клавишу <ТаЬ>, в результате чего получаем необходимую запись команды: $ more /etc/csh.logout В действительности, все будет происходить намного быстрее, чем описано здесь (такой пример был выбран специально для изучения поведения системы автоматического дополнения неполного имени файла), и скоро клавиша табуляции станет повседневным и незаменимым помощником. Вторым удобством, присутствующим в современных командных интерпретаторах, является наличие истории команд, хотя иногда это может нарушать политику безопасности. Перемещение по истории команд реализовано с помощью клавиш управления курсором. Поведение различных интерпретаторов при этом различно. Например, bash позволяет просматривать список команд только последовательно или переходить к некоторому пункту истории команд с помощью сочетаний клавиш, а вот в tcsh есть возможность быстрого поиска по совпадению подстроки. Пусть, к примеру, у нас есть следующая история команд: cd /etc more shells edit rc.conf more /usr/local/etc/apache/httpd.conf find /usr -name apache -print
Командный интерпретатор 95 Для того чтобы вернуться к первой команде, в bash необходимо последовательно просмотреть весь этот список или указать номер команды в списке истории с помощью ведущего знака восклицания (просмотреть номер команды можно с использованием команды history). В tcsh достаточно ввести символ "с" (с которого начинается первая команда в примере) и нажать стрелку вверх <|> (теперь проход по списку будет осуществлен по совпадению; отображаться будут только те команды, которые начинаются с указанного символа или набора символов). Правда удобно? К слову, по умолчанию, в tcsh установлено запоминание 100 команд (см. содержимое файла -/.cshrc в домашней директории пользователя). Третье удобство командных интерпретаторов — использование переменных среды. Переменная среды — это сочетание переменной и ее значения, которое хранится в памяти и может быть доступно любой утилите или сценарию в данной среде. Таков общий принцип, но сами переменные меняются в зависимости от используемого интерпретатора. В дополнение к стандартным переменным среды, можно определять собственные как на время текущей сессии, так и на постоянной основе. Заметим однако, что в каждом интерпретаторе существуют свои правила определения, описания и хранения постоянных переменных. Для получения списка установленных переменных среды, воспользуйтесь командой env: $ env SHELL=/usr/local/bin/bash TERM=cons25r USER=informex ENV=/home/informex/.shrc PAGER-more FTP_PASSIVE_MODE-YES PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/loc al/bin: /usr/XHR6/bin: /home/informex/bin MAIL=/var/mail/informex BLOCKSIZE=K PWD=/home/informex EDITOR=vi SHLVL=1 HOME=/home/informex LOGNAME=informex _=/usr/bin/env Для получения значения отдельной переменной среды необходимо перед именем переменной установить знак доллара "$" и использовать какую-либо команду вывода, например echo: $ echo $USER informex При установке переменной или изменении ее значения, использовать знак доллара не нужно. Для примера, установим переменной среды для bash (или sh) и tcsh/csh (выделены различными стилями шрифта): bash$ export EDITOR=ee bash$ echo $EDITOR ее csh-%setenv EDITOR ее ceh-%echo $EDITOR ее Более подробно работа с командными интерпретаторами рассматривается в следующей главе.
96 Глава 4, Основы работы в системе. Базовые команды ФАЙЛОВАЯ СИСТЕМА Отчасти файловая система затрагивалась в главе 2, посвященной установке системы были рассмотрены основы именования разделов и слайсов, создание слайсов и раздела на этапе установки системы, а также структура каталогов. Напомним, что файловая сие тема в FreeBSD представлена в виде дерева, а ее высшей точкой является корень, обр» щение к которому происходит через символ "/" (root). Независимо от того, сколыв существует дисков и разделов, обращение ко всем происходит, начиная с корня / (в от личие от систем Microsoft Windows), то есть, все разделы всех дисков могут распол» гаться в иерархии только ниже /. В корне могут располагаться файлы и директории. Директория (или каталог)- это файл специального вида, который может содержать файлы или другие каталоги (| может и не содержать ничего ©). Все директории в иерархии файловой системы раздо ляются символом косой черты "/". Например, поддиректория local в директории /usr будет доступна через /usr/local. К некоторому файлу test. file в данной директо рии можно обратиться через путь /usr/local/test. file. Напомним, что файл! test. file и tesT. file, в силу специфики файловой системы,— разные файлы. 3» метим также, что система FreeBSD для определения типа файла не используется такой понятия как "расширение"— тип файла фактически определяется по методу его ис пользования или программой обработки. Подключение раздела называется монтированием файловой системы. Любая фай ловая система монтируется к некоторой точке монтирования, в роли которой можа выступать директория, расположенная в корне файловой системы (например, /home или же ниже по иерархии (например, /usr/backup). Такая директория, фактически является корнем примонтированной файловой системы. К точке монтирования / всегд монтируется первый (загрузочный) раздел. Поясним это на следующем примере. Предположим, есть некий раздел ad2slf (master-диск на втором IDE-контроллере, первый слайс), в корне которого находите две директории: dirl и dir2. Примонтировав данный раздел к точке монтирована /var получим в директории /var две поддиректории: /var/dirl и /var/dir2. Ahj логично, примонтировав этот же раздел к точке монтирования /usr/home, получт в ней те же самые директории dirl и dir2 с возможностью доступа к ним по пуп /usr/home/dirl и /usr/home/dir2. Таким образом, полный путь к содержимом] раздела меняется в зависимости отточки монтирования (рис. 4.1). 7 I adOsIa \/ (ad2s1e) /var(adOsla) ad2s1e т^ /log(ad2s1e) /var/log (adOsIa) Рис. 4.1. Различие между корнем файловой системы и точкой монтирования /(ad2s1a) /usr(adOsla) ad2s1a /local (ad2s1a) /usr/local (adOsIa)
Работа с файлами и каталогами 97 Более подробную информацию по этому вопросу можно получить во второй части книги, посвященной управлению системой и ее ресурсами. РАБОТА С ФАЙЛАМИ И КАТАЛОГАМИ Наиболее часто системному администратору, как и любому другому пользователю системы, придется работать с файлами. Это, в том числе, подразумевает умение найти требуемый файл, просмотреть и отредактировать его, а также перемещаться между директориями и выполнять другие операции. Типы файлов Прежде чем перейти к изучению основных команд, предназначенных для работы с файлами и каталогами, разберемся с типами файлов в системе FreeBSD, поскольку без понимания этого вопроса работать будет довольно сложно. Регулярные файлы К регулярным файлам относятся простые текстовые файлы, представляющие собой набор записей, разделенных, как правило, символом перехода на новую строку. Кроме того, к регулярным относятся также и те файлы, которые могут не содержать символа перехода на новую строку, однако их содержимое можно просмотреть в любом текстовом редакторе. Заметим, что исполняемые файлы (здесь имеются в виду бинарные файлы) также относятся к регулярным. Каждый файл (не только регулярный) имеет некоторый перечень атрибутов. Тому, кто работал с операционными системами Windows NT/2000 и ее файловой системой NTFS, это будет понять легче. В FreeBSD к атрибутам относится следующее: тип файла; права доступа; владелец; дата и время создания; дата и время последней модификации. Заметим, что имя файла является его характеристикой, а точнее — указателем на индексный дескриптор. Индексный дескриптор (inode) — это некоторый блок (обозначаемый числом), который содержит атрибуты файла и информацию о его размещении (блока данных, в котором размещается файл). При этом один и тот же файл может иметь несколько имен в пределах файловой системы, но только один индексный дескриптор. Как же выяснить тип файла (удостовериться, что он регулярный), его атрибуты, индексный дескриптор и т.п.? Для этого служит команда Is, которую мы подробно рассмотрим немного позже. Сейчас же приведем один вариант ее использования: # is -ii /copyright 10 -г—г—г— 1 root wheel 6192 May 8 10:05 /COPYRIGHT Это командой мы запросили вывести подробную информацию о файле COPYRIGHT с информацией об индексном дескрипторе, типе файла, правах доступа, количестве жестких ссылок, владельцах, размере и дате создания. Подробно жесткие ссылки рассматриваются ниже в подразделе "Ссылки". Сейчас же просто отметим, что жесткая ссылка — это указатель на физическое расположение файла в файловой системе. С ее помощью можно обращаться к одному и тому же элементу файловой системы по различным именам и из различных директорий.
98 Глава 4. Основы работы в системе. Базовые команды Рассмотрим последовательность размещения информации в результате выполнения команды Is: индексный дескриптор файла (в нашем примере — 10); тип файла (в нашем примере — регулярный, о чем свидетельствует ведущий дефис); права доступа (r--r--r—означает, что все пользователи имеют доступ на чтение); количество жестких ссылок, о которых речь пойдет чуть позже ( в нашем примере—1); владелец файла (в нашем примере — пользователь root); группа владельцев (в нашем примере — группа wheel); размер файла (в нашем примере — 6192 байт); дата создания файла (в нашем примере — 8 мая текущего года в 10:05 утра). В операционной системе. FreeBSD для быстрого определения типа файйа иЬгЮЙбзу- ется также команда file,. ... - Файлы-каталоги Ранее мы уже упоминали о том, что каталоги — это специальные файлы, содержащие информацию о других файлах. Теперь рассмотрим, что они собой представляют. Фактически, каталог (или директория) — это таблица имен файлов и их индексных дескрипторов. Файл-каталог (далее будем использовать понятия "каталог", "директория" и "файл-каталог" как равнозначные) является основой для построения иерархической файловой системы. Прочитать содержимое каталога может только операционная система, которая "знает", чем регулярный файл отличается от файла-каталога. Выполним следующую команду: # Is -aiFl /boot 23554 ./ 2 ../ 23963 beastie.4th 23954 boot 23952 bootO 23953 bootOsio 23955 boctl 23956 boot2 23957 cdboot 23555 defaults/ (...) Здесь мы видим список файлов в директории /boot. Каталоги обозначаются завершающей косой чертой. Как и регулярные файлы, они имеют индексный дескриптор. При полном выводе (Is -1) в поле типа файла будет отображен символ d (от англ. "directory"), указывающий, что данный файл является каталогом: 4 th # Is -alF /: total 622 drwxr-xr-x drwxr-xr-x -r—r—r— -r--r—r— -r--r—r— -r--r—r-- bool 6 19 1 1 1 1 root root root root root root wheel wheel wheel wheel wheel wheel 512 512 7007 8192 512 512 Oct Oct May May May May 12 17 8 8 8 8 03: 04: 10: 10: 10: 10: :42 :02 :03 :03 :03 :03 ./ ../ beastie. boot bootO bootOsio
Работа с файлами и каталогами 99 -г—г—г-- 1 root wheel -г—г—г— 1 root wheel -г—г—г— 1 root wheel drwxr-xr-x 2 root wheel < ... > Наверное, читатель уже успел обратить внимание на два странных каталога, обозначаемых как "." (точка) и ". ." (две точки). Эти специальные каталоги имеются в каждой директории и обозначают, соответственно, ссылку на текущий каталог (".") и ссылку на каталог выше по иерархии (". ."). При этом заметим, что регулярный файл должен иметь хотя бы одну жесткую ссылку (см. пример из предыдущего подраздела "Регулярные файлы"), а любой каталог должен иметь хотя бы две жесткие ссылки! Это обусловлено тем, что при создании файла-каталога всегда создается две ссылки на один индексный дескриптор. Например, при создании каталога /test будут созданы ссылки на один и тот же индексный дескриптор как /test и как /test/, (с завершающей точкой) в самом каталоге /test. Однако при создании подкаталога subtest в каталоге /test количество жестких ссылок увеличится на единицу: # Is -alP /test total 6 drwxr-xr-x 3 root wheel 512 Oct 17 16:37 ./ drwxr-xr-x 20 root wheel 512 Oct 17 16:37 ../ drwxr-xr-x 2 root wheel 512 Oct 3.7 16:37 subtest/ Это обусловлено созданием жесткой ссылки /test/subtest/. . (две завершающие точки) в каталоге /test/subtest на индексный дескриптор каталога /test. Тем не менее, подсчитывать количество подкаталогов некоторого каталога по количеству жестких ссылок не следует, так как они могут находиться и за пределами указанной директории. Лучше использовать следующую последовательность команд (подставив при этом необходимую директорию вместо /etc): # Is -1 /etc | grep "Ad" | wc -1 Заметим, что выполнять прямую запись в файл каталога нельзя, даже обладая суперполномочиями. Запись в файл каталога производится операционной системой при изменении содержимого каталога (например, при создании или удалении файла в нем). Файлы устройств Файлы устройств (или, если говорить более точно, — специальные байт-ориентированные и блок-ориентированные файлы) не содержат никаких данных. При этом каждому физическому устройству, которое поддерживает операционная система, соответствует как минимум один файл устройства. При обращении к файлу такого типа происходит вызов соответствующего драйвера устройства, присутствующего в операционной системе. По типу обращения файлы устройств разделяются на блок-ориентированные (буферные) и байт-ориентированные (последовательные, символьные). Первые используются при передаче данных пакетами фиксированной длинны с использованием промежуточного буфера, а вторые— для передачи последовательных данных посимвольно. К блок-ориентированным файлам устройств можно отнести файлы, ассоциированные сустройствами хранения данных, такими как флоппи-диски, оптические диски, жесткие диски и т.п. К байт-ориентированным относятся файлы таких устройств как терминалы, клавиатура, некоторые типы магнитных лент. С некоторыми устройствами могут быть связаны три специальных файла: stdin, stdout и stderr. По умолчанию, stdin (файл стандартного ввода) указывает на файл клавиатуры, stdout (файл стандартного вывода) — на файл терминала (как и stderr). Сданными устройствами связано понятие перенаправления ввода/вывода. 512 May 8 10:03 bootl 7680 May 8 10:03 boot2 1184 May 8 10:03 cdboot 512 Aug 11 07:09' defaults/
100 Глава 4. Основы работы в системе. Базовые команды При просмотре списка файлов в расширенном виде (Is -1) тип файла будет помечен символом с, например: # Is -1 /dev total 1 crw-r 1 root operator 4, 12 Oct 17 12:39 acdO crw-r—r-- 1 root wheel 243, 0 Oct 17 12:39 acpi crw-r 1 root operator 4, 11 Oct 17 12:39 adO crw-r 1 root operator 4, 13 Oct 17 12:39 adOsl crw-r 1 root operator 4, 14 Oct 17 15:39 adOsla { ... } Утилита file для любого из них выведет приблизительно следующую информацию: # file /dev/adO /dev/adO: character special (4/11) Сокеты Существует особый интересный тип файла под названием сокет (socket). Данный тип, как правило, используется для обмена информацией между различными компьютерами в сети. Иногда сокеты используются для обмена информацией между процессами на одном хосте, но данный вариант удобнее реапизовывать на основе каналов. Во время взаимодействия процессов с использованием сокетов выделяют две стороны: клиент и сервер. При этом программа сервера пассивно прослушивает запросы от клиентов, а программа клиента активно пытается найти сервер и передать данные. Благодаря наличию таких функциональных характеристик, сокеты резко отличаются от стандартных типов файлов. Сокеты разделяют на контактные и бесконтактные. Первые осуществляют обмен данными при установленном соединении между хостами, а вторые позволяют обмениваться данными с указанием адреса назначения всякий раз при отправке пакета. Именованные каналы В действительности, существует две разновидности каналов (pipe): именованные и неименованные, — но поскольку последние не имеют имени (хотя взаимодействие сними подобно обычным файлам) и какого-либо представления на уровне файловой системы, мы их рассматривать не будем. Заметим только, что они выступают в качестве связи между родительским процессом и порожденными им дочерними процессами. Именованный канал представляет собой простой файл, служащий для взаимосвязи двух процессов на одном компьютере, и присутствующий в системе только на время обмена информацией между этими процессами (или на время работы процессов, оставаясь пустым в случае отсутствия обмена). Принцип взаимодействия очень прост: один процесс последовательно записывает поток данных в канал, а другой последовательно их считывает в режиме FIFO (First In, First Out — первым пришел, первым ушел). В отличие от неименованного, данный тип канала позволяет взаимодействовать любым процессам в системе, а не только порожденным с родительским. Как сокеты, так и именованные каналы в операционной системе FreeBSD обозна-j чаются как socket в утилите file и символом s в расширенном выводе утилиты Is в поле типа файла: # file /var/run/* /var/run/cron.pid: ASCII text /var/run/devd.pid: ASCII text /var/run/devd.pipe: socket /var/run/dmesg.boot: ASCII English text •/var/run/log: socket
Работа с файлами и каталогами 101 # Is -1 /var/run total 4 2 -rw-r--r-- -rw-r—r-- srwxr-xr-x -rw-r—r— srw-rw-rw- ! ... } 1 1 1 1 1 root root root root root wheel wheel wheel wheel wheel 4 Oct 18 10:20 cron.pid 4 Oct 18 10:14 devd.pid 0 Oct 18 10:14 devd.pipe 4926 Oct 18 10:14 dmesg.boot 0 Oct 18 10:14 log Ссылки Ранее уже упоминалось о ссылках — точнее о жестких ссылках, благодаря которым можно обращаться к одному и тому же элементу файловой системы по различным именам и из различных директорий. Теперь рассмотрим более подробно, типы ссылок, их возможности и ограничения. Итак, ссылка на файл, является указателем на элемент файловой системы, не повторяя при этом его содержимого. Фактически, любое имя файла является ссылкой на файл. Существует два типа ссылок: жесткие и символические. Жесткие ссылки наиболее распространены, поскольку любое первоначальное имя файла уже является жесткой ссылкой. Вновь создаваемая жесткая ссылка на существующий файл является точной копией других ссылок на этот же файл (при создании новой жесткой ссылки увеличивается счетчик числа жестких ссылок). Удаление жесткой ссылки не удаляет файл как блок данных до тех пор, пока не будет удалена последняя жесткая ссылка (пока счетчик жестких ссылок не равен нулю, удаляется только запись о файле в каталоге). Только с удалением последней жесткой ссылки на файл содержимое файла удаляется из файловой системы безвозвратно. ВНИМАНИЕ! В отличие от других операционных систем и их файловых систем, FreeBSD не имеет встроенной поддержки восстановления удаленных файлов. Перед тем как удалить последнюю жёсткую ссылку, удостоверьтесь, что данный файл не нужен в системе. Ограничением жестких ссылок является то, что их невозможно создавать для каталогов (жесткие ссылки для каталогов в необходимый момент создает сама операционная система). Более того, жесткая ссылка на файл может быть создана только в пределах той файловой системы, в которой этот файл находится. Предположим раздел adOsla при- монтирован как / (корень), a ad2sla — как /home, а в директории /home/user2 находится файл letter. txt. В таком случае, нельзя создать жесткую ссылку на упомянутый файл выше директории /home по иерархии (то есть, нельзя создать жесткую ссылку в директориях /, /var, /usr и т.д.). Для того чтобы обойти это ограничение, можно создать символическую ссылку (symlink). Символическая ссылка — это файл, который указывает на другой файл или директорию (без ограничения в ее размещении). Фактически, символическая ссылка — это простой текстовый файл, в котором указан путь к исходному файлу. При этом такая ссылка не является регулярным файлом, а относится к типу "ссылка" (link). Распознать символическую ссылку не составляет труда с помощью утилиты Is или file: # is -1 / total 53 -г—г—г — drwxr-xr-x drwxr-xr-x drwxr-xr'-x lrwxr-xr-x (...) 1 root wheel 6192 May 8 10:05 COPYRIGHT 2 root wheel 1024 Aug 11 07:09 bin 6 root wheel 512 Oct 12 03:42 boot 2 root wheel 512 Aug 11 07:09 cdrom 1 root wheel 10 Aug 11 07:30 compat -> usr/compat
102 Глава 4. Основы работы в системе. Базовые команды # Is -F1 / COPYRIGHT b;. я. / boot / cdrom/ compatG \ ... ,* # file /compat /compat: symbolic link to "usr/compat' Обратите внимание на тип файла в расширенном результате утилиты Is: символическая ссылка обозначается символом 1 в поле типа файла, хотя при этом трудно не заметить, что за именем файла-ссылки после стрелки (->) следует указание на исходный файл. Проблема символических ссылок заключается в том, что возможно существование ссылок "в никуда", то есть — по ложному пути. Данная ситуация возникает из-за отсутствия контроля за количеством символических ссылок или удаления/переименовании' переноса исходного файла или директории без удаления символических ссылок на него. Заметим, что символическая ссылка может указывать на исходный файл по абсолютному или же относительному пути. Абсолютный путь — это полный путь к файлу или каталогу, начиная от вершины / файловой системы. Например, /home/informex или /usr/local/etc/my.cnf. Относительный путь может иметь несколько вариантов представления, но в его основу положено указание пути к файлу или директории относительно текущей директории. Например, находясь в директории /usr/local, можно обратиться кфай> лу etc/my. cnf, абсолютный путь К которому ВЫГЛЯДИТ как /usr/local/etc/ my. cnf. К этому же файлу можно обратиться несколько иначе, используя уже известные нам ранее ссылки на текущую и родительскую директорию, присутствуют: щие в любой директории, например: . /etc/my, cnf или . ./local/etc/my.cnu К этому же файлу можно обратиться из директории /usr/bin: ../local/etc/ my. cnf. Вариантов могут быть десятки и сотни, но проще всего использовать самыЦ короткий путь. Права доступа к объектам файловой системы В системе FreeBSD для просмотра файла или каталога, их изменения или удаленш необходимо иметь соответствующие права. Права также существуют на доступ к любому файлу устройства, а также на запуск и останов множества утилит (это вам не MS-DOS, где любой пользователь мог просмотреть ваши секретные файлы или выполнить запрещенную команду!). Скорее всего, читатель уже успел поработать с операционными системами Microsoft Windows NT/2000/XP/2003, которые позаимствовали понятие "право доступа" w UNIX-систем, и потому этот вопрос не должен вызвать особых трудностей. Каждьй пользозатель в системе имеет уникальный идентификатор UID и обязательно входш в одну группу (группа пользователя), а может и несколько других (вторичные). Кажда группа также имеет уникальный идентификатор GID. Именно на основе этих понятий! определяются права доступа пользователей к объектам файловой системы. Для каждого объекта файловой системы существует три группы прав доступа: Права доступа для владельца. Владелец — некий пользователь системы, для ко торого единолично определены права доступа (разрешенные операции).
Работа с файлами и каталогами 103 Права доступа для группы-владельца. Группа-владелец — некоторая группа системы, всем членам которой назначены одинаковые права доступа к данному объекту. Права доступа для всех остальных пользователей системы. Права доступа для всех пользователей системы, которые не входят в группу-владельца и не являются владельцем данного объекта. Каждой группе прав доступа ставится в соответствие набор из трех битов полномочий: чтение (read), запись (write) и выполнение (execute), — который записывается как rwx. Право чтения позволяет пользователю читать файл или просматривать каталог; право записи позволяет удалять или изменять файл, а для каталога — создавать в нем или удалять другие объекты файловой системы; право на выполнение позволяет выполнять файл как программу или сценарий, а для каталога разрешает поиск в каталоге. Таким образом, установив для некоторого файла биты полномочий в виде г-х, мы разрешаем пользователю читать и выполнять этот файл, но запрещаем изменять или удалять его. Если установка битов полномочий выглядит как г~, то пользователю разрешено только чтение файла или просмотр содержимого каталога. Поскольку для каждого объекта файловой системы существует три группы прав доступа, полная запись прав доступа состоит из девяти битов, например: rwxr-x-r—, что трактуется как "владелец имеет все права на файл (чтение, изменение, удаление и выполнение), пользователи группы-владельца имеют права на просмотр и выполнение файла, а все остальные пользователи системы имеют право только на просмотр". Как видим, система прав доступа в FreeBSD довольно прозрачна и не вызывает осложнений при изучении. Более подробно права доступа рассматриваются во второй части книги. Там же будет затронуты вопросы установки и изменения прав доступа к объектам файловой системы. Текущий и домашний каталог После входа в систему пользователь всегда попадает в свой домашний (начальный) каталог, указанный в профиле. Как правило, данный каталог для каждого пользователя размещается ниже по иерархии от раздела /home (если такой раздел не выделен, то — от /usr/home, a /home — это просто символическая ссылка). Домашний каталог предназначен для хранения пользователем своих данных, а также информации о персональных настройках различных программ. Каждый пользователь имеет свой персональный домашний каталог, имя которого, как правило, совпадает с именем пользователя (например, /home/admin, /home/info, /home/adidok). В нем пользователь может делать все, что ему вздумается, включая удаление любых файлов и директорий и создание новых. Если пользователь вышел за пределы начального каталога, большинство оболочек позволяют быстро вернуться в него с помощью знака тильды "~", который указывает на полный путь к начальному каталогу пользователя. При этом можно быстро обратиться к начальному каталогу других пользователей, указав после тильды имя пользователя, например: %pwd / %cd - %pwd /home/informex %cd ~admin %pwd /home/admin где команда cd позволяет изменить текущую директорию, а команда pwd — вывести полкый путь к текущей директории.
104 Глава 4. Основы работы в системе. Базовые команды Вот мы и подошли к понятию текущей директории. Пользователь при работе постоянно изменяет свое положение относительно корня файловой системы. Текущим каталогом является тот каталог, в котором вы находитесь в данный момент. После входа в систему текущим является домашний каталог пользователя. Имена файлов Файловая система FreeBSD не накладывает ограничений на длину имени файла или на используемые в имени символы. Однако при этом есть немало замечаний. Самое очевидное из них заключается в том, что слишком длинные имена лучше не использовать — это неудобно. А вот с набором рекомендуемых к использованию символов стоит разобраться подробнее. Операционная система использует некоторые символы для своих специальных целей. Например, если имя файла начинается со знака дефиса "-", то использование неэк- ранированного имени файла может быть воспринято практически любой командой FreeBSD как опция. Обратите также особое внимание на то, что файл, который начинается со знака точки, является скрытым и отображается в листинге директории (Is) только в случае использования опции отображения скрытых файлов (-а). Таких символов, которые могут иметь особенности при использовании в системе, более чем достаточно, потому рекомендуется ограничиваться следующим набором: буквы латиницы [A-Z,a -z]; цифры [0-9]; знак подчеркивания ("_") и точка ("."). При использовании этих символов при обращении к файлам не возникнет никаких проблем. Знак пробела также можно использовать, но, все таки, рекомендуется заменять его знаком подчеркивания. В случае использовании знака пробела, имя файла необходимо экранировать с помощью одинарных или двойных кавычек, например: %touch 'file with slash' %touch "file with slash 2" Можно использовать более общий формат экранирования при использовании пробелов, который основан на установке символа обратной косой "\" непосредственно перед каждым символом пробела: %touch file\ with\ slash\ 3 Обратную косой при обращении к файлу необходимо также использовать при наличии в имени файла какого-либо метасимвола. Метасимволы и символы подстановки Метасимволы и символы подстановки имеют специальное назначение в операционной системе, позволяя оптимизировать работу с файлами (и не только). Необходимо избегать их использования в именах файлов. Рассмотрим небольшой перечень и краткое описание наиболее часто используемых метасимволов и символов подстановки: $ — данный знак позволяет обращаться к переменным оболочки (например, $SHELL); & — перевод процесса в фоновый режим; I — разделитель команд при использовании конвейера (перенаправление результата команды на вход следующей команды); ? — символ подстановки, подразумевается любой одиночный символ; * — символ подстановки, подразумевается неопределенное количество символов от нуля до бесконечности; > — перенаправление вывода; < — перенаправление ввода;
Работа с файлами и каталогами 105 ' — подстановка команды в другую команду (обратные кавычки); [] —подстановка диапазона символов (например, [A-Z] означает любой символ от А до Z, a [a-z, 0] —любой символ от а до z или ноль); / — разделитель имен каталогов в пути. Рассмотрим пример работы с файлами, которые могут содержать такие символы (более подробно команды, используемые в этом примере, будут рассмотрены ниже в этой главе). Us !<?#$%#$&%-(&) * file.cnf " "dnso0q223.txt [] *? goAHEAD|getMORE "123" fiLe.cnf oneX>to>oneY %mv \"123\" 123 im \* %mv \!@#\$%#\$\6%A\(\S\) 1234534756970 %rm goAHEAD\|getMORE %mv oneX\>to\>oneY oneX-to-oneY %rm \[]\ \*\? \"\ \"dnso0q223.txt Us 123 1234534756970 fiLe.cnf file.cnf oneX-to-oneY Обратите внимание на удаление файла с именем "*". Если бы не было установлено экранирование, то в результате выполнения команды удаления rm * были бы удалены все файлы в данном каталоге ©. Получение списка файлов Для того чтобы увидеть список файлов в текущей или другой директории используется команда Is (аналог команды dir системы MS-DOS). Для просмотра списка фалов пользователю обязательно нужно иметь право на чтение директории (то есть, просмотреть список ее элементов). Команда Is без параметров и аргументов выводит простой список файлов в текущей директории, подобно тому, как показано в примере: %1з Desktop billing fastuseradd shizz.txt SljozyMateri cooler lastlyric shizz.txt~ SljozyMateri- dead.letter main.cora.ua test При этом мы не получаем никакой дополнительной информации ни о размере файлов, ни об их типе. Более того, мы не можем увидеть скрытых файлов. Для того чтобы увидеть информацию о том, к какому типу относятся элементы списка, используется опция -F: %ls -F Desktop/ billing/ fastuseradd* shizz.txt SljozyMateri cooler/ lastlyric@ shizz.txt- SIjozyMateri- dead.letter main.com.ua/ test/ СПРАВКА В FreeBSD скрытыми считаются файлы, имя которых начинается с точки (это касается и каталогов). Как правило, скрытыми устанавливаются конфигурационные файлы для того, чтобы лишний раз не загромождать список элементов каталога и исключить их случайное удаление. Для таких файлов неприменимы символы подстановки без явного указания ведущей точки в шаблоне (используйте, например, шаблон ".*").
106 Глава 4. Основы работы в системе. Базовые команды В показанном выше примере по завершающему символу можно определить, к какому типу относится элемент списка: / — директория; * — исполняемый файл или сценарий (установлен бит executable); @ — символическая ссылка; = — файл является сокетом; | — именованный канал (FIFO). Если необходимо выделить только каталоги, используйте вместо -F опцию -р, которая устанавливает для них завершающий символ косой ("/")• ПРИМЕЧАНИЕ Опции в командах принято указывать через дефис "-"и разделять пробелом, щ пример: is -1 -F. При этом, если опции не имеют аргументов, то можно применя объединение символов опций под.одним дефисом, например: is -Fla. Обрати внимание на тот факт, что некоторые команды не поддерживают данное соглаш^ ние. . ' ' ? Для вывода списка всех без исключения файлов, присутствующих в каталоге, используйте опцию-а: %ls -а .login_conf .xinitrc fastuseradd .mail_aliases Desktop lastlyric bash_history .mailrc SljozyMateri main.com.ua cshrc .profile SljozyMateri- shizz.txt fetchmailrc .recently-used billing shizz.txt- history .rhosts cooler test login .shrc dead.letter Для вывода всех файлов за исключением . (одна точка) и . . (две точки) используйте вместо -а опцию -А. Для того чтобы вывести весь список файлов в одном столбце, можно добавить опцию -1: %ls -А1 .bash_history .cshrc .fetchmailrc .history .login .login_conf .mail_aliases ( ... ) Если необходимо сформировать список всех элементов директории в строках через запятую, используйте следующий формат команды: %ls -m Desktop, SljozyMateri, SIjozyMateri~, billing, cooler, dead.letter, fastuseradd, lastlyric, main.com.ua, shizz.txt, shizz.txt-, test Для того чтобы рекурсивно отобразить содержимое всех подкаталогов текущего каталога, используйте опцию -R (листинг урезан по причине громоздкости): %ls -R ( ... } ./main.com.ua/txt: life
Работа с файлами и каталогами 107 ./main.com.ua/txt/life: marennya_ochey.txt neznane_oblycha.txt . /test: 123 1234534756970 fiLe.cnf file.cnf or.eX- to-oneY Наиболее часто используется уже упоминаемый ранее расширенный (long) вывод, когда вместе с именем файла отображается дополнительная информация, наподобие прав доступа, владельца и т.п.: %ls -1 -informex/shizz.txt -rw-r—г— 1 informex wheel 10337 Aug 19 14:14 /home/informex/shizz.txt Важно заметить, что при отсутствии Аргумента будет сформирован, перечень файлов в текущей директории, если же в качестве аргумента было указано имя файла, то будет выведена расширенная информация об этом файле. Если в качестве аргумента был указан каталог, то будет выведена информация обо всех элементах в нем (если не была указана опция -d). Описание каждого из полей уже было представлено ранее в этой главе, потому рассмотрим только некоторые другие опции, используемые в паре с опцией -1, которые немного изменяют ее поведение: -Т — поле даты последнего изменения файла будет отображено в полном формате (например, вместо Aug 19 14:14 будет выведено Aug 19 14:14:39 2005); -п — вместо имени владельца и группы владельца будут выведены числовые UID и GID (например, вместо informex wheel будет выведено 1001 0); -и — вместо времени последнего изменения файла будет отображаться время последнего доступа к файлу; -h — размер файла будет выводиться в более подходящем виде (В — байт, К — килобайт, м — мегабайт, G — гигабайт, Т — терабайт и Р — петабайт). Например: %ls -lh /boot/kernel/kernel /COPYRIGHT /text -Г--Г--Г-- 1 root wheel 6.OK May 8 10:05 /COPYRIGHT -r-xr-xr-x 1 root wheel 3.6M Oct 22 19:20 /boot/kernel/kernel -rw-r—r— 1 ropt wheel 672B Oct 4 17:11 /text Утилита Is имеет множество других опций. Просмотреть список и детальную информацию о них можно в справочной системе по команде man Is. Изменение текущего каталога Для перехода в другой каталог используется уже знакомая нам команда cd. Для перехода в подкаталог текущего каталога в качестве аргумента необходимо просто передать имя требуемого подкаталога: %ls -F Makefile compile/ i386/ isa/ svr4/ acpica/ conf/ ibcs2/ linux/ bios/ cpufreq/ include/ pci/ ■Jed conf В качестве аргумента можно использовать абсолютный или относительный путь к каталогу:
108 Глава 4. Основы работы в системе. Базовые команды •fccd . . %cd ../../admin %cd i386/conf £cd /usr/local/etc Использование команды cd без аргументов позволяет переместить пользователя в начальный каталог (переменная среды $НОМЕ): °spwd /booc/kernel %cd %pwd /usr/home/informex Где это я? Во время работы в системе несложно запутаться и заблудиться в иерархии файловой системы даже опытному администратору. Но благо, что в системе присутствует команда, позволяющая в любой момент узнать, где вы в данный момент находитесь. Используйте простую команду pwd: %pwd /usr/local/share/examples/pkgtools/tcsh Создание файлов и каталогов Безусловно, хорошо уметь перемещаться по файловой системе и смотреть на то, что было создано раньше. А вот знать, как самому создавать файлы или каталоги, все-таки интереснее! Не смотря на то, что команда touch представлена в документации как утилита для изменения времени доступа или модификации файла, она также используется для создания нового пустого файла. Итак, все, что необходимо для создания нового файла — это выполнить следующую команду: %touch newfile где newfile — это произвольное имя нового файла. Если файл существовал на момент выполнения данной команды, то будут просто изменены время доступа и модификации файла на текущее системное время, а содержимое файла при этом не изменится. Подробности смотрите в справочном руководстве man touch. Новые файлы также можно создавать с помощью операции перенаправления ввсь да/вывода. Более того, все утилиты редактирования текстовых файлов имеют функцию создания нового файла. Но об этом будет рассказано позже. Для создания каталогов в FreeBSD однозначно придется пользоваться командой mkdir (аналогичная команда присутствует и в системе MS-DOS). Данная команда позволяет создать несколько каталогов одновременно, имена которых необходимо передать ей в качестве аргументы. При этом можно указывать как путь относительно текущей директории, так и абсолютный путь. Так, для создания нового пустого каталога testdire текущей директории используется команда %mkdir testdir Создание каталога по абсолютному пути будет выглядеть следующим образом: %mkdir /home/newuser
Работа с файлами и каталогами 109 При этом есть несколько замечаний. Во-первых, необходимо иметь права на запись в родительский каталог (для показанного выше примера это каталог /home). Во-вторых, если каталог уже существует, то будет выдано сообщение, подобное следующему: mkdir: /home/newuser: File exists В-третьих, все указанные в пути каталоги ниже создаваемого должны уже существовать и быть доступными для пользователя, иначе будет выдано сообщение, наподобие следующего: Imkdir /usr/local/informex/depot mkdir: /usr/local/informex: No such file or directory Обойти данное ограничение можно с помощью опции -р, которая позволяет создать все отсутствующие каталоги, которые были заданы в пути к создаваемому каталогу, например: %mkdir -p nodir/nodir/nodir/enddir При создании нового каталога, по умолчанию, ему будут назначены права доступа drwxr-xr-x (числовой эквивалент 755) указывающие на то, что все пользователи системы имеют право на просмотр списка файлов в нем и поиск, но только владелец имеет право на его изменение (фактически, — на создание или удаление в нем файлов). Установить права доступа для создаваемого каталога на момент создания самого каталога позволяет опция -т, аргументом которой является режим доступа, заданный в любом разрешенном формате (man chmod). Например, для создания каталога testdir7 в текущем каталоге с правом на изменение у владельца и группы-владельца (остальные пользователи с правом на чтение и поиск) используется следующая команда: %mkdir -m 775 testdir7 Более подробная информация о создании каталогов может быть найдена в справочной системе man mkdir. Копирование Иногда требуется скопировать файл в новую директорию, или целую директорию в другую. При этом заметим, что копирование файла в файл создает новый элемент файловой системы, а не жесткую ссылку на существующий файл (создание жестких ссылок будет рассмотрено отдельно). Более того, если источников копирования более одного (несколько файлов или каталогов), то точкой назначения обязательно должен быть каталог. Итак, для копирования файлов и каталогов используется команда ср (аналог команды ср в MS-DOS), первым аргументом которой может выступать файл или директория, а также список .файлов или директорий, а последним аргументом — место назначения (файл или директория). Данная команда, кроме аргументов, может принимать несколько параметров. Рассмотрим некоторые из них: -R— рекурсивное копирование, используется при копировании директорий. При этом будет скопировано содержимое директории и всех ее поддиректорий. Поведение команды будет также изменяться в зависимости от написания имени директории-источника. Если указать имя директории-источника с завершающей косой "/" (например, test/), то будет скопировано содержимое указанной директории без самой директории. Если завершающая косая в имени директории-источника будет опущена, то в директории назначения будет создана полная копия директории-источника. Если директория назначения не существует, то она будет создана, но при этом копирование в любом случае выполняется как при наличии завершающей косой "/", независимо от того, есть она или нет. Покажем это на таком примере:
ПО Глава 4. Основы работы в системе. Базовые команды %ls -1 total drwxr- drwxr- drwxr- 6 кг-х xr-x xr-x %ls test/ 123 %cp -R %cp -R %cp -R %ls 1 test %ls 2 123 %ls 3 123 test 2 informex wheel 2 informex wheel 2 informex wheel fiLe.cnf 1/ test/ 2/ test 3/ fiLe.cnf fiLe.cnf 512 Oct 24 512 Oct 24 512 Oct 24 t file.cnf file.cnf file.cnf 16 16 16 20 20 20 1 2 test oneX-to-oneY oneX-to-oneY oneX-to-oneY -i — запрашивать подтверждение при замене файла назначения. По умолчанию, утилита копирования замещает присутствующий файл назначения, если его имя совпадает с файлом источника. Указание данной опции позволяет обезопасить себя от случайной или нежелательной перезаписи файла назначения или файлов в директории назначения, имена которых совпали с именами файлов в директории-источнике. К примеру: 512 Oct 24 16:21 512 Oct 24 16:35 %ls -1 total 6 drwxr-xr-x 3 informex wheel drwxr-xr-x 2 informex wheel drwxr-xr-x 2 informex wheel 512 Oct 24 16:28 test %cp -Ri test/ 2/ overwrite 2/1234534756970? (y/n [n]) у { ... } -n — опция, которая отменяет предыдущую (-i) и позволяет пропускать перезапись существующих файлов без каких-либо вопросов. -р — опция, позволяющая при копировании сохранить у файлов следующие атрибуты: время изменения, время доступа, флаги файла, права доступа, идентификатор владельца и группы владельца. Покажем это на следующем простом примере (обратите внимание на выделенный текст): %ls -Id test drwxr-xr-x 2 informex www 512 Oct 24 17:39 test %ls -1 8hizz.txt -rwxrwxrwx 1 informex wheel 10337 Aug 19 14:14 shizz.txt %cp shizz.txt test/ %ls -1 test/shizz.txt -rwxr-xr-x 1 informex www 10337 Oct 24 17:45 test/shizz.txt %cp -p shizz.txt test/ %ls -1 test/shizz.txt -rwxrwxrwx 1 informex wheel 10337 Aug 19 14:14 test/shizz.txt Как видно из примера, при копировании без опции -р, скопированный файл наследует права доступа и владельцев от родительского каталога. Также устанавливаете)! время доступа и изменения на основании системного времени в момент выполнения операции копирования. При копировании с использованием опции -р все атрибуты файла остались без изменений.
Работа с файлами и каталогами 111 Обращаем внимание на возможность зацикливания операции копирования и как результат — переполнения файловой системы (переполнение и потеря данных возможны при включенном кэшировании диска или при поддержке soft updates). Зацикливание может произойти, например, в следующем случае: # pwd /usr ft cp -R * backup/ Очень повезет, если будет достигнут предел вложений, и копирование прервется с сообщением "name too long (not copied)", однако это маловероятно, да и на последующее удаление рекурсивно созданных каталогов уйдет немало времени. Другие опции и подробности о работе с командой копирования ср смотрите в справочной системе man ср. Перемещение и переименование Для переименования и перемещения объектов файловой системы используется одна и та же команда mv. Она довольно проста и, как правило, никаких проблем при ее использовании не возникает. Переименование будет выполнено, если файл-источник или каталог-источник, указанный в качестве первого аргумента, находится в той же директории что и пункт назначения. Приведем примеры переименования файла и каталога: %mv fastuseradd fuseradd %ls fastuseradd Is: fastuseradd: No such file or directory %ls fuseradd fuseradd % mv /home/informex/fuseradd /home/informex/fastuseradd %ls /home/informex/fuseradd Is: /home/informex/fuseradd: No such file or directory %ls /home/informex/fastuseradd /home/informex/fastuseradd %mv main.com.ua/ maincomua %ls -Id maincomua/ drwxr-xr-x 3 informex wheel 512 Oct 20 16:55 maincomua/ Можно переместить несколько источников. При этом точкой назначения обязательно должен быть каталог, размещенный на любом уровне иерархии файловой системы. Также перемещение будет выполнено, если источник только один. При этом, если источник и точка назначения — это файлы, то последний будет замещен. Есть и некоторые другие особенности поведения команды mv. Например, когда точка назначения отсутствует в системе на момент перемещения, она будет создана и заменена источником (который-фактически будет просто перемещен и переименован). Например: %ls maincomua/ txt %mv maincomua/ test/m %ls test/m txt или же: %ls -1 shizz.txt -rwxrwxrwx 1 informex wheel 10337 Aug 19 14:14 shizz.txt %mv shizz.txt test/newshizz.txt %ls -1 test/newshizz.txt -rwxrwxrwx 1 informex wheel 10337 Aug 19 14:14 test/newshizz.txt
112 Глава 4. Основы работы в системе. Базовые команды При перемещении файлов и каталогов все атрибуты сохраняются, вплоть до прав доступа, времени последнего изменения и индексного дескриптора файла (inode). Как и команда копирования ср, команда перемещения mv поддерживает интерактивный режим, задаваемый опцией -i, благодаря которой каждый раз при попытке замещения существующего файла будет задан вопрос для подтверждения выполнения такой операции. В противоположность этому, существует опция -f, которая позволяет подавляй подобные вопросы. Опция -v позволяет выдавать отчет о переименовании/перемещении каждого файла (каталога) в отдельности. Более подробная информация о команде mv может быть получена из справочного руководства man mv. Создание ссылок О жестких и символических ссылках, а также об их отличиях мы уже упоминали ранее. Теперь поговорим о том, как их создавать. Для этого служит команда In. Создавать жесткие ссылки можно только на файлы. Команда In при этом должна вызываться без аргумента -s (данная опция определяет создание символической ссылки). Напомним, что все жесткие ссылки на один файл должны находиться в пределах одной файловой системы. Приведем простейший пример создания жесткой ссылки на файл, присутствующий в той же директории: %ls -li total 2 518551 -rw-r--r— 1 informex www 141 Oct 25 17:11 sourcefile %ln sourcefile targetfile %ls -li total 4 518551 -rw-r—r— 2 informex www 141 Oct 25 17:11 sourcefile 518551 -rw-r—r— 2 informex www 141 Oct 25 17:11 targetfile Как можно заметить, при создании жесткой ссылки сначала указывается имя файла- источника, а затем— файла назначения. Теперь при изменении содержимого одного файла или его атрибутов будут также изменяться соответствующие атрибуты другого файла: %chmod 777 sourcefile %touch sourcefile %ls -li total 4 518551 -rwxrwxrwx 2 informex www 141 Oct 25 17:15 sourcefile 518551 -rwxrwxrwx 2 informex www 141 Oct 25 17:15 targetfile В примере выше мы изменили права доступа и время доступа/изменения для файла sourcefile и увидели соответствующие изменения у файла targetfile. Когда жесткую ссылку невозможно создать в силу упомянутых ограничений, а необходимо получить возможность быстрого доступа к некоторому файлу или каталогу и текущего (скорее всего, начального) каталога, можно без проблем создать символическую ссылку. Все, что требуется, — добавить опцию -s после команды In непосредст венно перед аргументами. Например, если в начальном каталоге необходима ссылка ш файл, размещенный совсем в другой файловой системе (предположим, к конфигурационному файлу сервера Apache /usr/local/etc/apache/ httpd.conf), то можю воспользоваться следующей командой: # In -s /usr/local/etc/apache/httpd.conf httpd.conf Кроме того, если имя файла-источника и файла назначения будут совпадать (как» нашем примере), то второй аргумент можно опустить, например: # In -s /usr/local/etc/apache/httpd.conf
Работа с файлами и каталогами 113 ft Is -l httpd.conf lrwxr-xr-x 1 root wheel 32 Oct 25 17:32 httpd.conf -> <!>/us r/local/etc/apache/httpd.conf Чем неудобны символические ссылки? Во-первых, это — отдельные файлы, со своим индексным дескриптором, но при этом для них невозможно изменить права доступа или владельцев. Во-вторых, по символической ссылке невозможно определить размер файла, на который она ссылается. Более того, при удалении файла, на который ссылалась символическая ссылка, сама она не удаляется, а продолжает занимать дисковое пространство (хотя и небольшое по размеру). Потому рекомендуется использовать символические ссылки только в том случае, когда нет никакой возможности создать жесткую ссылку. Более подробно о создании ссылок смотрите в справке man In. Удаление файлов и каталогов Для удаления в разных случаях можно использовать различные команды. В первую очередь рассмотрим наименее используемый вариант: удаление каталогов с помощью команды rmdir. Причина непопулярности этой команды заключается в ее ограничении на удаление некоторых каталогов, а точнее — в невозможности удалить непустой каталог. Если в удаляемом каталоге присутствует другой пустой каталог или несколько пустых каталогов, то упомянутое ограничение можно обойти с помощью опции -р (удаление цепочки пустых каталогов). Предположим, в текущем каталоге есть три подкаталога: test с множеством файлов, пустой каталог testl, и test2 с пустым подкаталогом empty. Тогда попытка удаления может выглядеть следующим образом: %rmdir test rmdir: test: Directory not empty %ls test 123 fiLe.cnf file.cnf oneX-to-oneY %rmdir testl %rmdir test2 rmdir: test2: Directory not empty %ls -1 test2 total 2 drwxr-xr-x 2 informex wheel 512 Oct 24 21:53 empty %rmdir -p test2/empty/ Теперь, наверное, читателю понятно, почему эта команда так непопулярна. Но как же быстро удалить директорию с тысячами ненужных файлов, загромождающих файловую систему? Для этого лучше всего использовать универсальную команду удаления файлов и директорий rm. В качестве аргумента ей можно передать как имя одного файла, так и список из файлов, разделенный символом пробела. Без указания определенных опций команда rm также не позволяет удалять директории. Для удаления пустых директорий используется опция -d. Для удаления непустых директорий необходимо рекурсивно удалить все файлы в директории, а затем —саму директорию. Такое поведение утилиты задается опцией -R (или -г). Приведем несколько простых примеров удаления файлов и директорий: %rm 123 file.cnf Irm * rm: directory: is a directory rm: empty: is a directory %rm -d empty %rm -R directory lis -1 total 0
114 Глава 4. Основы работы в системе. Базовые команды Первая команда удаляет два файла в текущей директории: 123 и file. cnf. Сл& дующая команда удаляет все файлы в текущей директории, кроме директорий (и dot' файлов). Третья команда позволяет удалить пустой каталог empty. Предположив, что каталог directory не пустой, в четвертой команде используем рекурсивное удаление, Вместо операций, представленных в рассмотренном выше примере, было бы прощ и быстрее выполнить одну единственную команду для удаления всех элементов в текущей директории (кроме dot-файлов, которые потребуется удалять с использование» других шаблонов имен dpaunoe): Srm -R * %ls -a .hidefile Рассмотрим некоторые другие полезные опции команды rm: -v — отображать все удаляемые элементы; -р — безопасное удаление (перед удалением файл перезаписывается три раза; первый и третий раз он заполняется символами Oxf f, второй раз — 0x00; -i — выдавать запрос перед удалением каждого элемента; - f — подавлять запрос на подтверждение удаления, даже если права доступа не позволяют удалить файл. Команда rm при удалении символических ссылок никогда не удаляет файлов, н> которые они указывали. Также при попытке удаления файлов . (одна точка) и . . (дм точки) будет всегда выдаваться сообщение об ошибке (например, если шаблон имен! файла указан как ". *")■ Опция -Р применяется только для регулярных файлов. Обращаем внимание на то, что восстановить удаленный файл практически невод можно, потому будьте предельно внимательны. Также хотелось бы напомнить следую; щее: если файл имеет несколько жестких ссылок, то файл, как блок данных, не удаляется из файловой системы, а удаляется только жесткая ссылка: %ls -li total 4 494782 -rw-r—г— 2 informex www 181 Oct 25 14:59 hardfilel 494782 -rw-r—r— 2 informex www 181 Oct 25 14:59 hardfile2 %rm hardfilel %ls -li total 2 494782 -rw-r—r— 1 informex www 181 Oct 25 14:59 hardfile2 Какой бы файл ни удалялся, удостоверьтесь, что на него нет символических ссылоц которые после удаления будут указывать "в никуда". Более подробная информация по этому вопросу содержится в справочном руково детве man rm. "Искать, найти и... перепрятать" "Ну вот! Пытался сохранить дипломную работу подальше от посторонних глаз,| теперь не в состоянии сам ее найти. ПОМОГИТЕ!". Да, бывают и такие ситуации. Человеческая память не в состоянии хранить мноп информации, а уж тем более помнить пути ко всем каталогам и файлам в них. Благц любая операционная система имеет утилиты для поиска файлов и директорий по pai личным критериям, и FreeBSD не стала исключением. В распоряжение пользоватея предоставляется мощная утилита поиска по всевозможным критериям: find. Наиболв простая форма данной команды имеет следующий вид: %find . -print
Работа с файлами и каталогами 115 В результате ее выполнения будет выдан список всех файлов в текущем каталоге и всех подкаталогах, потому в таком формате использовать команду find не рекомендуется (не проще ли тогда просто выполнить Is -aR ?). Более логично указать критерии поиска — тем более, что их можно указать несколько (как дополняющих так и взаимоисключающих). Самый простой критерий — это имя (часть имени) искомого файла: %find . -паше "diploma*" -print Такая команда позволяет найти и отобразить список всех файлов и директорий в текущем каталоге и подкаталогах с именами, начинающимися на "diploma". Если необходимо выполнить поиск в другом каталоге, его имя указывается вместо точки, например: # find / -name "*.rc" -print Данная команда позволяет найти и отобразить список всех файлов, имя которых завершается символами ".гс" во всех директориях, на всех разделах и сетевых ресурсах, которые примонтированы на момент выполнения поиска. Обратите внимание на то, что при отсутствии прав на некоторые каталоги, поиск в них выполнен не будет. Вместо этого на консоль будет выведено сообщение, подобное следующему: find: /usr/local/etc/qpopper: Permission denied К счастью, поиск при этом не будет завершен. Заметим, что выполнить поиск из корня чревато повышением нагрузки на систему и большими временными затратами (в больших системах поиск может занимать более часа). По этой причине утилита find имеет опцию, позволяющую ограничить глубину рекурсивного поиска, например, выполнить поиск, аналогичный рассмотренному в предыдущем примере, но с глубиной вложения не более пяти уровней: # find / -maxdepth 5 -name "*.rc" -print /usr/share/examples/bootforth/loader, re /usr/share/examples/etc/mail.re /usr/share/examples/etc/locate.re /usr/share/examples/ppp/isdnd.re /etc/mail.re /etc/locate.re /boot/loader.re Для поиска файлов, принадлежащих некоторому пользователю, используется опция user, например: # find / -user relay -print /var/mail/relay /var/mail/.relay.pop Другими популярными критериями поиска служат: тип файла (опция type), права доступа (опция perm), группа-владелец (опция group), индексный дескриптор (опция inum), размер файла (опция size) или время доступа/изменения. К примеру, чтобы найти все файлы, принадлежащие пользователю informex, на которые установлены права доступа 64 4 и которые изменены за последние шесть часов, поможет следующая команда: # find / -user informex -perm 644 -mtime -6h -print /usr/home/informex/test/.hidefile /usr/home/informex/test/1234534756970 /usr/home/informex/test/file.cnf /usr/home/informex/test/fiLe.enf /usr/home/informex/test/oneX-to-oneY /usr/home/informex/test/123 /usr/home/informex/main.com.ua/txt/life/marennya ochey.txt
116 Глава 4. Основы работы в системе. Базовые команды /usr/home/informex/main.com.ua/txt/life/neznane_oblycha.txt Кроме утилиты find, можно воспользоваться быстрым поиском по базе данных файлов /var/db/locate.database с помощью утилиты locate. Упомянутая база данных хранит список общедоступных файлов системы и, по умолчанию, обновляете! каждую неделю, поэтому ее использование для недавно созданных файлов может не увенчаться успехом. Также утилита locate может отобразить файл, который недавно (после последнего обновления базы) был удален. Но, к сожалению, невозможно прои* водить поиск файла по различным критериям, даже ограничить поиск в некотором каталоге, однако в последнем случае все же можно просто отфильтровать вывод утилиты подобно тому, как это сделано в следующем примере: % locate _o I grep /usr/home/informex /usr/home/informex/main.com.ua/txt/1i fe/ma rennya_ochey.txt /usr/home/informex/main.com.ua/txt/life/neznane_oblycha.txt Более подробную информацию об упомянутых утилитах поиска смотрите на страницах справочного руководства man find и man locate. Команды просмотра и обработки файлов, поиск Уже первые версии UNIX имели мощный арсенал простых команд по обработке содержимого текстовых файлов, и не только файлов. Рассматривать все нет необходимости, да и займет это большую часть книги. Ограничимся теми командами, которые будут часто встречаться или без знания которых иногда сложно решить даже простую задачу. Просмотр содержимого файлов Для простого постраничного просмотра содержимого файлов служит команда more или less. В данный момент это — одна и та же команда, хотя раньше команда less имела более широкие возможности, чем more. Эти команды работают намного быстра любого текстового редактора, что достигается за счет постепенного чтения и вывода со держимого файла. К тому же, команда more позволяет быстро найти подстроку в файле, передвигаться постранично или по строкам, а также быстро переходить к просмотр) страницы по номеру строки или процента от общего объема файла. Проблемой может возникнуть в том случае, если файл имеет строгое форматирование (то есть, каждый абзац разбит на строки с использованием символа перевода на новую строку). В этом случае утилита не очень корректно разрывает строки. Например текст был жестко отформатирован в расчете на экран шириной 80 символов, а при просмотре командой more с шириной терминала в 65 символов вышла вот такая нечитабельная "каша": %more zrada.txt Ale v sluhavtsi zahaotyly korotki gudky ... Daryna zaplakala . .. ij bulo boljache, vona hotila pobachyty jogo ochi, zaraz, same v tsyu myt ' - jaki vony, sprobuvaty pomityty sche hoch malen'kiy vognyk kohannja, zachepyt ysja, sprobuvaty rozdmuhaty do togo scho bulo ... Na dvori temno, des' vyspivue tsvirkun ... tsikavo - de same? A tarn dalechen'ko pid lihtarem bilja lavky majorjat' nichni metelyky - tsikavi stvorinnja, zavzhdy pragnut' do svitla ta tepla ... i tse ih chas to vbyvaye. Spravdi - dyvniy instynkt ...
Работа с файлами и каталогами 117 Daryna pochala perebyraty - de zh vona pomylylasja, de skazala hybne slovo, v chomu ii provyna. Команда more имеет очень много возможностей, которые рассматривать нет смысла. Опишем только минимальный необходимый набор: для построчной прокрутки экрана вперед используется клавиша <j>, <Enter> или для построчной прокрутки назад используются клавиши <к> или <|>; нажатие пробела, клавиши <f> или <PageDown> позволяет пролистать текст на экран вперед; нажатие клавиши <Ь> или <PageUp> позволяет пролистать текст на экран назад; для перехода на определенное количество строк вперед/назад следует ввести число и воспользоваться одной из вышеупомянутых клавиш; для поиска подстроки далее по тексту следует ввести символ косой (/) и искомую строку символов, например /matching; для поиска подстроки по тексту назад вместо символа косой используется знак вопроса (?); для перехода к некоторой строке по известному номеру следует ввести число и символ "g", например, 100g соответствует переходу к сотой строке в файле; если ввести 50%, то будете выполнен переход к середине файла; для завершения просмотра файла и выхода из утилиты more следует нажать клавишу <q>. Существует еще одна интересная команда, которая используется для соединения нескольких файлов в один и при этом, по умолчанию, выводит результат конкатенации на экран. Это — команда cat (не путать с cut). В качестве ее аргументов выступают имена файлов, которые необходимо соединить в один. С помощью команды cat можно просто вывести весь файл на экран без постраничного пролистывания. Команда имеет несколько интересных опций, например, -п — нумерация строк. Примеры использования: %cat shizz.txt zrada.txt > shizzrada.txt %cat -nb lastlyric 1 "Osin'" 2 Torknutysya poglyadom zoloto'i krasy, 3 Vidchuti shorohom znayomu melodiyu, 4 Prochytaty richky sliz na svoyemu vikni, 5 Bil' na dushi svoyeyu sterty doloneyu. 6 18.10.2005. За более подробной информацией обращайтесь к справочному руководству man less и man cat. Частичный вывод содержимого файлов Для частичного вывода содержимого файлов используется три команды: tail, head и cut. При этом все они сильно отличаются по результату. Команда tail применяется тогда, когда необходимо вывести некоторое количество строк или символов с конца файла, или же когда требуется постоянно следить за изменениями в конце файла по мере добавления в него информации. Наиболее часто используемые опции: -с <number> — отображение указанного количества символов с конца файла; -n <number> — по умолчанию отображается 10 последних строк; данная опция позволяет указать и другое количество выводимых строк;
118 Глава 4. Основы работы в системе. Базовые команды -г — отображение строк в обратном порядке (последняя, предыдущая и т.д.); -f — для непрерывного отображения окончания файла (по мере добавления данных в файл они моментально отображаются на экране). Пример использования: %tail -n 3 lastlyric Bil' na dushi svoyeyu sterty doloneyu. 18.10.2005. Команда head позволяет отобразить определенное количество строк или символов от начала файла. Опции: -с <number> — количество отображаемых символов от начала файла; -n <number> — количество выводимых строк от начала файла. Примеры использования: %head -n 2 lastlyric "Osin"' Torknutysya poglyadom zoloto'i krasy, %head -c 20 lastlyric "Osin*" Torknutysya % Команда cut работает совершенно иначе. Она позволяет разбить каждую строку файла на поля по указанному шаблону и вывести только необходимые. К примеру, для вывода только первых шести символов каждой строки из файла /etc/passwd необходимо выполнить такую команду: %cut -с 1-6 /etc/passwd root:* nobody inform Следующая команда позволяет разбить файл /etc/passwd на поля по символу ":" (символ разделитель задается опцией -d) и отобразить первое поле (для указания выводимого поля используется опция -f), а фактически — список всех пользователей системы: %cut -f l -d ":" /etc/passwd root nobody informex Символом-разделителем полей по умолчанию является символ табуляции, а не пробела, как можно было бы ошибочно предположить. Подробная информация обо всех описанных командах может быть найдена на соответствующих страницах справочного руководства. Поиск строк по шаблону с помощью команды grep Поиск файлов — это хорошо. А вот найти в файле или множестве файлов какую-то строку — еще более полезно и так часто необходимо. Благо, для решения таких задач в системе FreeBSD есть особый набор команд: grep, f grep и egrep. Команда grep позволяет искать в файлах подстроку по простому шаблону, egrep — по шаблону с поддержкой регулярных выражений, f grep — строки по строгому совпадению (без поддержки регулярных выражений и символов замещения).
Работа с файлами и каталогами 119 Кпримеру, для поиска подстроки "string" в файле file, txt используется следующий формат команды: # grep string file.txt Заметим, что при этом будут найдены и выведены на экран все строки, содержащие данную подстроку (например, строки, содержащие последовательность символов "stringer" или "strings"). Запомните, что, по умолчанию, команда дгер не ищет слова! Если необходимо найти подстроку как целое слово (подстрока, которая окружена символами пробела, табуляции, кавычками и т.п., кроме чисел и букв) используйте опцию -w; # grep -w 192 /etc/rc.conf ifconfig_epO="inet 192.168.0.200 netmask 255.255.0.0" defaultrouter="192.168.0.1" Если необходимо найти строки, содержащие последовательность символов с пробелом или с другим подобным символом, необходимо взять данную последовательность в кавычки, например: # grep "text with slash" file.txt При этом можно применять некоторые модификаторы. Например символ каре ("Л") указывает, что искомая подстрока является началом строки в файле: # grep "Asort" /etc/my.enf sort_buffer_size = 512K sort_buffer_size = 20M sort_buffer_size = 20M Если для поиска указано несколько файлов, то, по умолчанию, для каждой строки отображается имя файла, в котором была найдена строка. Такое поведение можно отключить опцией -п (а стоит ли отключать?). После имени файла удобно также отображать порядковый номер строки, в которой была найдена искомая подстрока. Для этого используется опция -п: # grep -n 192.168.0.200 /etc/* /etc/hosts:2:192.168.0.200 mobile.altersys-ua.com mobile /etc/rc.conf:12:ifconfig_ep0="inet 192.168.0.200 netmask 255.255.0.0" /etc/rc.firewall:38:ip="192.168.0.200" Для поиска без учета регистра символов используется опция -i, а для вывода строк, не содержащих искомую подстроку, воспользуйтесь опцией -v. Более подробная информация о команде grep, а также о командах egrep и f grep содержится на страницах справочного руководства. Сортировка содержимого с помощью команды sort Перед тем как обработать некоторый массива текстовых данных, его требуется отсортировать в определенном порядке. В таких случаях необходимо воспользоваться стандартной командой sort. Помимо сортировки одного файла, эта команда позволяет соединить несколько файлов в один перед совместной сортировкой. По умолчанию, команда sort не игнорирует ведущие пустые символы, и после сортировки такие строки будут расположены первыми (или последними при сортировке в обратном порядке). Для изменения стандартного поведения команды используются следующие опции: -Ь — игнорировать ведущие пустые символы; -d — сортировка в стиле словаря; используются только пустые и алфавитные символы, а также цифры; - f — сортировка без учета регистра символов;
120 Глава 4. Основы работы в системе. Базовые команды -i — игнорировать все непечатаемые символы; -п — сортировка в соответствии с числовым значением символов; -г — сортировка в обратном порядке; -о <f iiename> — записать результат в файл filename; -и — одинаковые строки выводить только один раз. Команда имеет еще несколько опций, полный список которых и описание можно найти в справочном руководстве по команде sort (man sort). Примеры использования команды sort: %sort -r lastlyric %sort -b zrada.txt Isort -df lastlyric zrada.txt -o catsort.txt Сравнение файлов с помощью утилиты dif f Система FreeBSD имеет ряд утилит для сравнения содержимого файлов на предмет отличий. К таковым относятся cmp, comm, dif f 3, sdif f и, конечно же, самая популярная утилита dif f. Именно её мы вкратце и рассмотрим. Заметим, что команда dif f ис- пользуется некоторыми системными утилитами (например, при создании ежедневного отчета о состоянии системы). В первую очередь, команда dif f может применяться для сравнения только двух текстовых файлов. Ее результат имеет характерные свойства: перед отображением отличий выводится информационная строка, содержащая номер строки, или же список из номеров отличающихся строк из первого файла. Затем данная информационная строка содержит код статуса (а — строка была добавлена, с — строка была модифицирована, d — строка была удалена), в завершение которой следует номер отличающейся строки (или строк) во втором файле. Команда dif f имеет множество параметров, но наиболее часто используется только три из них. -и — так называемый объединенный формат вывода, когда отображается догк» нительная информация об именах файлов и дате их последнего изменения. Отличающимся строкам предшествует несколько одинаковых строк в обоих файлах Добавленным строкам предшествует символ "+", удаленным — символ "-", а личным строкам — знак "!". -с — вывод результатов сравнения в нестандартном формате, который очень похож на вывод при использовании предыдущей опции, но с некоторыми незначительными отличиями; -С п — вывод результатов сравнения в нестандартном формате с дополнительным количеством п предшествующих, не модифицированных строк. Примеры сравнения двух текстовых файлов: # diff -u /var/backups/master.passwd.bak /etc/master.passwd /var/backups/master.passwd.bak Fri Oct 28 12:46:42 2005 +++ /etc/master.passwd Fri Oct 28 13:32:40 2005 @@ -29,4 +29,5 @@ spamd:*:58:58::0:0:SpamAssassin user:/var/spool/spamd:/sbin/nologin info:*:1005:0::0:0:User &:/home/info:/bin/sh clamav:*:106:106::0:0:Clam Antivirus:/nonexistent:/sbin/nologin -testeron:*:1006:1006::0:0:User s:/home/testeron:/bin/sh +testeronl:*:1007:1007::0:0:User &:/home/testeronl:/bin/sh +testeron:*:1008:1008::0:0:User &:/home/testeron:/bin/sh # diff -c /var/backups/master.passwd.bak /etc/master.passwd *** /var/backups/master.passwd.bak Fri Oct 28 12:46:42 2005 /etc/master.passwd Fri Oct 28 13:07:15 2005 ***************
Работа с файлами и каталогами 121 *** 30,32 **** — 30,33 info:*:1005:0::0:0:User &:/home/info:/bin/sh clamav:*:106:106::0:0:Clam Antivirus:/nonexistent:/sbin/nologin testeron:*:1006:1006::0:0:User &:/home/testeron:/bin/sh + testeronl:*:1007:1007::0:0:User &:/home/testeronl:/bin/sh # diff -C 2 /var/backups/master. passwd. bale /etc/master.passwd *** /var/backups/master.passwd.bak Fri Oct 28 12:46:42 2005 /etc/master.passwd Fri Oct 28 13:07:15 2005 *************** *** 31,32 **** --- 31,33 clamav:*:106:106::0:0:Clam Antivirus:/nonexistent:/sbin/nologin testeron:*:1006:1006::0:0:User S:/home/testeron:/bin/sh + testeronl:*:1007:1007::0:0:User &:/home/testeronl:/bin/sh Более подробная информация о сравнении файлов содержится в справочном руководстве к командам diff, cmp, comm, sdif f и diff3. Команда wc Команда wc служит для подсчета количества символов, слов и строк в указанном файле. Под одной строкой понимается набор символов, разделенных символом перехода на новую строку (этот символ при подсчете статистики не учитывается). Слово — это последовательность символов, отделенная с обеих сторон символами пробела, табуляции или перехода на новую строку. По умолчанию, команда wc отображает все значения: количество строк, слов и символов: %wc nosorted 5 7 47 nosorted Можно указать в качестве параметров несколько файлов. Тогда информация по каждому файлу будет выведена в отдельной строке, с последней строкой "total", которая служит для отображения суммарного значения подсчета для всех файлов: %wc nosorted /etc/rc.conf 5 7 47 nosorted 49 50 1080 /etc/rc.conf 54 57 1127 total Результат работы команды wc можно изменить, отображая только необходимые значения. Для этого служат три опции: -1 — подсчитывать только строки; -w — подсчитывать только слова; -с — подсчитывать только символы. Пример использования опций: %wc -lc /etc/rc.conf 49 1080 /etc/rc.conf %wc -1 nosorted /etc/rc.conf 5 nosorted 49 /etc/rc.conf 54 total Замена символов и строк Нередко возникает задача замены в файле или в другом источнике одних символов или целых слов другими (а то и просто в их удалении). Для решения таких задач ис-
122 Глава 4. Основы работы в системе. Базовые команды пользуется команда tr. Самый простой вариант ее использования — передать ей два аргумента: первый — искомая подстрока, второй — символы подстановки. Например: %tr 'a-z' 'A-Z' Такая команда заменяет в тексте все маленькие буквы на прописные для стандартного устройства ввода (то есть, клавиатуры). Программа не рассчитана на замену подстрок строго в файлах, поэтому придется использовать операции перенаправления ввода/вывода, о которых рассказано подробно немного ниже в этой же главе. Все операции замены будем выполнять на примере файла trans следующего содержания: Afftor knigi Alexander Didok, dannyje stroki sluzhat primerom. Итак, укажем данный файл в качестве параметра команды tr и просмотрим результат: %tr 'a-z' 'A-Z' < trans AFFTOR KNIGI ALEXANDER DIDOK, DANNYJE STROKI SLUZHAT PRIMEROM. Через дефис задается диапазон символов. При этом первый символ в первом диапазоне заменяется на первый символ в результирующем диапазоне. Диапазон символов можно задавать по-разному. Более того, присутствуют классификаторы набора символов, которые позволяют задать различные предустановленные диапазоны. Перечислим некоторые из них: [: upper: ] — все прописные символы; [: lower: ] — все строчные символы; [:alnum:] —все цифры; [: space: ] — все символы разделения слов. Пример использования классов: %tr '[:space:]' ':' < trans Afftor:knigi:Alexander:Didok,:dannyje:stroki:sluzhat:primerom.: Для удаления всех указанных в диапазоне символов используется опция -d и только один аргумент, например: %tr -d '.,' < trans Afftor knigi Alexander Didok dannyje stroki sluzhat primerom Команда tr имеет много различных вариантов использования и замечаний. Подробную информацию обо всех ее возможностях, а также о наборе классов можно найти в справочном руководстве man tr. Еще одной командой замены, менее известной и популярной, является expand. Она служит только для одной цели: преобразование всех символов табуляции в пробелы. Еще одна утилита: unexpand — позволяет преобразовать определенное количество символов пробела в символ табуляции. Устранение дубликатов строк Для устранения дублирующихся соседних строк, или же наоборот — вывода только тех строк в файле, которые дублируются,— используется программа uniq. По умолчанию, сравниваются смежные строки и выводятся только уникальные строки. Например: %more haveuniq аа аа аа аа ЬЬ ЬЬ
Работа с файлами и каталогами 123 и 11 аа аа АА аа %uniq haveuniq аа аа bb bb 11 11 аа аа АА аа Как видно из примера, исчезла первая строка, идентичная второй. Если необходимо отобразить только повторяющиеся строки, используйте опцию -d: luniq -d haveuniq аа аа Для отображения уникальных строк используется опция -и. Команда uniq позволяет также сравнивать строки по полям, при этом указывается количество полей от начала строки,которые необходимо проигнорировать: %uniq -f l haveuniq аа аа bb bb 11 11 аа аа Для сравнения строк, игнорируя регистр символов, используется опция -i. Более подробную информацию по данной команде можно найти в справочном руководстве иап uniq. Форматирование текста Иногда пользователи сталкиваются с проблемой форматирования текста, когда есть файл с одной длинной строкой, которую необходимо разбить таким образом, чтобы ее можно было легко прочитать. Или же наоборот: файл содержит по два-три слова в стропе. Если файл небольшой, то эту проблему можно решать и вручную. А что, если размер файла составляет несколько десятков килобайт? В этом случае на помощь придет маленькая и простая утилита fmt, которая позволяет удобно разбить длинную строку или правильно собрать короткие строки. По умолчанию, строка будет разбита на строки длиной около 65 символов. Изменить это значение можно с помощью опции -w <number>. Если есть дублирующиеся символы пробела, то с помощью опции -s их можно преобразовывать в один символ пробела. Примеры использования команды fmt представлены в листинге 4.1. Листинг 4.1. Пример использования команды форматирования fmt taore formats Inogda pol'zovateli stykayutsja s problemoi formatirovanija teksta, k ogda imeetsja fail s odnoi dlinnoi strokoi kotoruyu neobhodimo razbit' takim obra-zom, chtoby ее mozhno bylo legko prochitat'. (fmt formats Inogda pol'zovateli stykayutsja s problemoi formatirovanija teksta, kogda imeetsja fail s odnoi dlinnoi strokoi kotoruyu neobhodimo razbit' takim obra-zom, chtoby ее mozhno bylo legko prochitat' . tfmt -s -w 70 formats Inogda pol'zovateli stykayutsja s problemoi formatirovanija teksta, kogda imeetsja fail s odnoi dlinnoi strokoi kotoruyu neobhodimo razbit' takim obra-zom, chtoby ее mozhno bylo legko prochitat'.
124 Глава 4. Основы работы в системе. Базовые команды Другой подобной командой является fold. Она позволяет разделять длинные стро ки в определенной позиции (ее значение по умолчанию равно 80). Изменить данное зка чение можно с помощью опции -w <number>: %fold -w 60 formats Inogda pol'zovateli stykayutsja s problemoi formatirova nija teksta, kogda imeetsja fail s odnoi dlinnoi strokoi kot oruyu neobhodimo razbit' takim obra-zom, chtoby ее mozhn о bylo legko prochitat'. Для менее жесткого разделения длинных строк можно воспользоваться опцией которая позволяет разорвать строку после последнего пробела в позиции, меньшей ил равной позиции разбиения. Более подробную информацию по этому вопросу можно найти в справочном рук» водстве man fmtHman fold. Изменение формата отображения Для изменения формата отображения содержимого файла служит команда od. Осе бенно она полезна для отображения нетекстовых файлов, которые содержат неотобра жаемые символы. Данная команда имеет много опций, которые мы все рассматривать а будем. Упомянем только некоторые из них: -Ь — отображать содержимое в виде восьмеричных чисел; -h — отображать содержимое в виде шестнадцатеричных чисел; -с — отображать в виде символов ASCII (в стиле языка С); -а — отображать в виде символов ASCII, спецсимволы отображаются с использо ванием специальных названий (например, nl — символ новой строки, sp — си» вол пробела). Пример использования команды od показан в листинге 4.2. Листинг 4.2. Пример использования команды od %od -b sorted 0000000 141 141 141 141 141 141 141 141 141 141 012 141 156 171 040 163 0000020 164 162 151 156 147 012 142 142 142 142 142 142 142 142 012 150 0000040 145 154 154 157 040 165 163 145 162 012 164 145 163 164 012 0000057 %od -с sor 0000000 0000020 0000040 0000057 %od -a sor 0000000 0000020 0000040 0000057 ted a t e ted a t e a r 1 a r 1 a i 1 a i 1 a n о a n о a g a g sp a \n u a nl u a b s a b s a b e a b e a b r a b r a . b \n a b nl \n b t nl b t a b e a b e n b s n b s Y b t Y b t \n \n sp nl nl s h s h Подробности по использованию этой команды смотрите на странице справн man od. Перенаправление ввода/вывода Перенаправление ввода/вывода — это одна из самых интересных характерисга UNIX-систем, в том числе и FreeBSD. Наряду с перенаправлением рассмотрим так* конвейеры, поскольку они, фактически, основаны на перенаправлении вывода одно команды на вход другой. В первую очередь рассмотрим простейший пример:
Работа с файлами и каталогами 125 Us > listfile В результате выполнения данной команды будет составлен список файлов в текущей директории и сохранен в файле под именем listfile. Заметим, что при этом на консоль данный список выведен не будет. Если файл listfile присутствовал в текущем каталоге, то он будет полностью заменен результатом выполнения команды Is. Если же файл с таким именем в системе отсутствовал, то он будет создан. Обращаем внимание на то, что таким образом с помощью перенаправления вывода в новый файл можно создавать новые файлы. Пример создания пустого файла /tmp/newf ile может «меть следующий вид: %еспо "" > /tmp/newfile $11 /tmp/newfile -rw-r—r— 1 informex wheel 1 Oct 26 13:20 /tmp/newfile Если требуется дописать новые данные в конец существующего файла с сохранением всей прежней информации, используйте вместо символа ">" сочетание "»", например, Is -1 » listfile. С помощью перенаправления вывода можно создавать новые файлы (или дописывать в конец) слиянием уже существующих, например: %more lastlyric SljozyMateri shizz.txt > concatfile Если необходимо получить на вход информацию не с клавиатуры, а из файла, то используется перенаправление ввода. Пусть, к примеру, у нас есть некоторый файл notsorted следующего содержимого: hello user bbbbbbbb test any string aaaaaaaaaa Отсортируем его по строкам и сохраним результат в файле sorted с помощью команды sort и операций ввода/вывода, после чего просмотрим содержимое нового файла: %sort < notsorted > sorted %more sorted aaaaaaaaaa any string bbbbbbbb hello user test Рассмотрим еще один пример: отправка пользователю informex@altersys- ua.com письма, содержащего в теле текст файла sorted с использованием перенаправления ввода: %mail informex@altersys-ua.com < sorted Теперь относительно конвейеров... Это — еще более интересный вопрос. Использовать конвейеры придется довольно часто. Они позволяют намного упростить работу с командами при решении как простых, так и сложных задач. Самый простой пример — постраничный вывод содержимого большого каталога. Для такого случая используется следующий конвейер (постраничный вывод содержимого каталога /etc): It Is -F /etc I more
126 Глава 4. Основы работы в системе. Базовые команды С помощью конвейера во многих случаях можно обойтись без операций перец правления ввода/вывода. Например, предыдущий пример отправки почты может выг| деть следующим образом: %more sorted | mail informex@altersys-ua.com Здесь результат команды more sorted передается на вход следующей комаад в конвейере — mail. Команду сортировки одного файла и сохранения результа в другом файле без перенаправления ввода/вывода можно заменить следующим конвд ером (в конкретном примере вывод будет направлен и на терминал): %more notsorted | sort | tee sorted Важно понять сам принцип построения конвейеров. Если этого достичь, i в дальнейшем можно решать трудные задачи с помощью множества простых и пои ных команд. Главное при этом — разбить задачу на составляющие. Редактирование текстовых файлов Иногда, начинающим сложно понять: зачем использовать "допотопные" консол ные текстовые редакторы, не распознающие щелчков мыши, или запоминать множесп клавиатурных комбинаций для выполнения того или иного действия. Тем не менее, я кие редакторы для администратора системы FreeBSD — главный рабочий инструмент, с этим нужно смириться. Все дело в том, что, как уже упоминалось ранее, настрой системы и практически всех серверных приложений, по сути, сводится к внесению m менений в текст конфигурационных файлов. Итак, чаще всего в FreeBSD используются два редактора: edit (ее/гее) и vi. Пр этом наличие первого в системе — это приятная новинка, а вот второй является "ве1 ным спутником" практически всех UNIX-систем. Рассмотрим подробнее возможности использование каждого из них. Использование ее Редактор ее (easy editor) — это один из самых простых и удобных текстовых реда торов, присутствующих в системе после установки. Практически все время данный р дактор находится в состоянии ввода текста, и только иногда— в других режимах (и мандный режим, меню). Разобраться с ее не составит никаких проблем даже начинай щему пользователю персонального компьютера. Вызвать на выполнение редактор очень просто. При этом используется несколь» вариантов. Один из них — открытие без указания редактируемого файла (фактичеси создание нового файла) с последующим сохранением нового файла под каким-лив именем. Второй вариант — указать редактируемый файл в командной строке в качеств аргумента. При этом, если файл существует, он будет открыт на изменение, в проти» ном случае при сохранении будет создан новый файл. Заметим, что, вызывая редакто с помощью команды гее возможно только указать файл для открытия, в противно» случае запуск Easy Editor запущен не будет. Первоначальный внешний вид редактора позволяет увидеть наиболее распростр» ненные комбинации клавиш. Такой вариант используется большинством пользователе! поскольку позволяет избежать излишнего запоминания комбинаций клавиш. Внешни вид редактора ее показан на рис. 4.2. Как видим, по умолчанию окно разделено на че тыре части: подсказка по сочетаниям клавиш, информационная строка, редактируемы текст и дополнительная многофункциональная строка. Первая часть — подсказка по сочетаниям клавиш. Как упоминалось ранее, упра» ление редактором почти полностью осуществляется с помощью различных комбинаци! клавиш. При этом все сочетания построены на использовании клавиши <Ctrl>, котор* обозначается символом каре ("А"). Перечислять здесь комбинации клавиш мы не бу дем — отметим только, что они могут отличаться в зависимости от настроек.
Работа с файлами и каталогами 127 "I (e cape) г- и у s-arch pronpt *о esc'i со «'в ~х s--rch . "и е d of f "e "& begin of H le '1 begin of file "e end of liie *c ommand ~d delete char font8xH="cp86.-8xl4'' fon18xl6="cp866-8xl6" font8x8="cp866-8x8" keynap="ru.koi8-r" scrnMap="koi8-r,2cp86&" saver="loflo" blanktime="?O0" os tname="mobile.altersys-ua.сом ■ card_enable="yes" lfconf ig_pccard="YES"' , , ' « ifcoi>fig_ep0="inet 192.168.9.200 -netmask гбб.гбб.СГ.в" clefaultrouter7="192'.168.0.1l'■ -<- sshd_enable="yes". na«iedlenable-'"VES" sendmail_Jenable="VES"' . firewall_enab^e=f'VES" ' file "Vetc/rc.corif". 48 lines N Рис. 4.2. Внешний вид утилиты ее Информационная строка несколько ограничена и позволяет просматривать текущий номер строки (L) и порядковый номер символа в строке (С). Эта часть, по сути, служит обычной разделительной линей между окном справки и окном редактирования текста. Тем не менее, при программировании, когда при компиляции было указано на ошибку в некоторой строке файла, информационная строка удобна для поиска ошибки. Активнее всего используется третья часть: непосредственно область редактирования файла. Эту часть мы рассматривать не будем. Отметим только, что в некоторых случаях при определенных настройках среды и в зависимости от используемой терминальной программы неожиданно могут появляться лишние символы. Если у пользователя нет права на изменение файла, то при попытке сохранения будет получено сообщение о невозможности создать файл ("unable to create file ..."). Данное сообщение будет отображено в самой нижней строке окна. Это и есть четвертая многофункциональная часть, вид которой различается в зависимости от текущего режима. Например, при открытии или сохранении файла здесь будет отображена дополнительная информация о количестве строк или символов; во время поиска отображается строка запроса для ввода искомого слова; в режиме ввода команд будет запрошена строка для требуемой команды, при этом также изменится первая часть окна — в ней будет предоставлен список возможных к использованию команд (для выхода из данного режима необходимо просто нажать <Enter>). Итак, использование ее не представляет никаких сложностей. Что же касается нестандартного поведения и особенностей настройки, то здесь придется несколько повозиться. Заметим, что в редакторе ее используется несложное меню, которое не нуждается в комментариях. Вызвать окно меню можно нажатием клавиши <EsO или комбинации клавиш <CTRL+[>. Для перехода к изменению параметров необходимо нажать клавишу <Е> или выбрать пункт settings в главном окне меню. В результате будет отображено подменю modes menn со списком параметров и установленных значений (рис. 4.3). Рассмотрим подробнее параметры ее и описание каждого из них (табл. 4.2). ~k dele e * ine ~р, prev It g prev раде П mdele e line ~n r-xt li "v next р.де "w dele'e Pbrfd' ~b baJ< 1 chap . "r re tore word "f ftriMard 1 c" ar iVelete c" ir "z1 next ftrd I V
128 Глава 4. Основы работы в системе. Базовые команды modes menu В) tabs to spaces ON b) case sensitive search ON c) margins observed OFF cl) auto-paragraph forwat OFF e) eightbit characters ON f) info window ON g) execs key bindings OFF h) right Margin 79 i) 16 bit characters OFF j) save editor configuration ■ress Esc to cancel Рис. 4.З. Меню установок редактора ее Таблица 4.2. Список параметров редактора ее и их описание Параметр tabs to spaces Значение по умолчанию OFF Описание case search margins observed Автоматическое преобразование символа табуляции в определенное количество пробелов sensitive OFF Данный параметр определяет, будет ли выполняться поиск с учетом регистра символов OFF Данный параметр позволяет определить автоматический перевод курсора в начало следующей строки по достижению правого поля документа (см. пункт right margin) auto-paragraph for- OFF Установка данного параметра приводит к авто- mat матическому форматированию абзаца при вводе текста. Установка единичного символа переноса строки не будет иметь успеха — утилита сама установит пробел в конце предыдущей строки и присоединит редактируемую строку к ней. Для создания нового абзаца необходимо установить два символа переноса строки Позволяет отображать восьмибитные символы расширенной таблицы ASCII info window ON Позволяет управлять отображением двух верхних частей окна, а точнее скрывать/показывать их в зависимости от установленного значения Позволяет установить такие же клавиатурные комбинации, как и в редакторе Emacs. Рекомендуется использовать именно такой вариант 79 Определение границы правого поля (большинство дисплеев и терминалов, по умолчанию, отображают 80 символов в строке) OFF Позволяет указать редактору, как обрабатывать шестнадцатибитные символы в тексте: как два восьмибитных или как один шестнадцатибитный Поскольку у разных пользователей системы могут быть различные предпочтения) настройке внешнего вида и возможностей редактора, утилита ее позволяет хранил конфигурацию для каждого пользователя в его домашней директории в фаГи . ini l. ее. Кроме того, значения по умолчанию для всех пользователей, у которых нк такого файла, находятся в одном файле /usr/share/misc/init .ее, поэтому общк для всех начальные установки следует вносить именно в него. eightbit characters ON emacs key bindings ON right margin 16 bit characters
Работа с файлами и каталогами 129 Существует также и третий вариант — довольно своеобразный и нестандартный: файл конфигурации для редактора ее может храниться в любой другой директории, при этом он будет использоваться при вызове ее именно из этого каталога и перекрывать ранее определенные параметры конфигурационного файла из домашней директории. Для сохранения настроек в текущей или домашней директории пользователя следует использовать команду j) save editor configuration из меню, показанного на рис. 4.3. При этом будет отображено диалоговое окно, определяющее место сохранения текущих из- иенений. К слову, никто не мешает создавать/изменять конфигурационный файл вручную. За подробностями обратитесь к справочной системе man ее. Изучаем vi Программы, подобные vi, иногда называют "монстрами". При этом подразумевают, как правило, сложность подобных продуктов, однако следует сказать что, не смотря на сложность, такие программы — действительно "монстры", судя по предоставляемым ими возможностям и функциональности. Наверное, вас не раз запугивали словом "ви- aii" как чем-то сложным и страшным. Вам говорили, что это — "вообще такие дебри". Давайте же прольем на данный вопрос немного света. Действительно, сложность текстового редактора vi неоспорима, но нельзя недооценивать те возможности, которые он предоставляет. Вторым важным аспектом является распространенность vi практически во всех UNIX-подобных системах, и, как следствие, простота перехода на любую из них (вдруг понадобится внести изменения в конфигурацию какого-либо сервера у компаньонов во время болезни их администратора, а в их сети все серверы работают на операционной системе SUN Solaris). К примеру, для редактирования файла file.txt или создания нового файла с таким именем необходимо выполнить следующую команду: % vi file.txt В результате мы оказываемся в командном режиме vi. Всего выделяют два основных режима: командный, в котором все нажатия клавиш интерпретируются как команды, а не как ввод текста; режим редактирования, в котором, собственно, и вводится текст. Обратите внимание на то, что символы тильды ("~") не являются содержимым файла, а просто указывают на пустые строки. В текстовый режим можно перейти тремя способами. Через режим добавления (append). По нажатию клавиши <а> можно начать добавление текста после текущего символа. По нажатию клавиши <А> можно перейти к добавлению текста в конце текущей строки. Через режим вставки (insert). Для вставки текста перед текущей позицией курсора следует нажать клавишу <i>, а для вставки текста в начале текущей строки необходимо нажать клавишу <1>. Через режим открытия (open). Для вставки новой строки после текущей и начала ввода нового текста необходимо нажать клавишу <о>. Если требуется добавить новую строку выше текущей и начать в ней ввод текста — нажмите клавишу <0>. Выход из режима редактирования текста в командный режим осуществляется наитием клавиши <Esc>. Если вы не можете определить, в каком режиме находитесь, нажмите дважды клавишу <Esc> — звуковой сигнал сообщит о том, что вы находитесь i режиме ввода команд. Звуковой сигнал можно отключить, включив при этом расширенный режим отображения справки. Для этого, находясь в командном режиме, следует [шести следующий текст и нажать клавишу <Enter>:
130 Глава 4. Основы работы в системе. Базовые команды :set verbose Теперь вместо звукового сигнала в самой нижней строке будет отображаться текст: "Already in command mode". Перемещаться по тексту во время редактирования позволяют не все клавиатуры и терминалы, поэтому желательно перемещаться в командном режиме с помощью следующих клавиш: <h> — перемещение влево на один символ; <|> — перемещение вправо на один символ; <j> — перемещение вниз (напоминает стрелку вниз); <к> — перемещения вверх; <w> — переход на одно слово вперед (от слова "word"); <b> — переход на одно слово назад (от слова "back"); <0> — перемещение в начало строки; <$> — перемещение в конец строки; <}> — перемещение в начало следующего абзаца; <{> — перемещение в начало предыдущего абзаца; <G> — переход в конец текста. Уже страшно? И это только начало. Каждой команде перемещения, по умолчанию, сопоставляется число 1, в результате чего все они перемещают курсор на один элемент (символ, строку, слово, абзац и т.д.). Эту настройку можно изменить, указывая перед командой некоторое число. Например, для того чтобы перейти на три строки вниз необходимо нажать <3> и затем <j>. Команды редактирования текста и операций над файлами в редакторе vi перечислены в табл. 4.3. Таблица 4.3. Команды редактирования и управления файлами в vi Команды Операция Dd Удалить текущую строку целиком. Если сначала ввести число, то будет удалено несколько строк от текущей, включая ее саму. Например, если ввести число 3, то будет удалена текущая строка и две следующих О Удалить весь текст от текущей позиции курсора до конца строки R Заменить символ в текущей позиции курсора наследующий введенный R Заменяет посимвольно текущий текст в строке на вводимый текст, начиная от текущей позиции курсора до позиции, когда будет нажата клавиша <Esc> S Очистить строку (строки) и ввести в ней новый текст х Удалить текущий символ и сместить всю строку после удаленного символа влево (операция Delete) X Удалить символ (символы) до текущей позиции курсора и сместить всю строку влево (операция Backspace) J Объединить текущую и следующую строку (замена символа новой строки символом пробела). Можно объединить несколько строк одновременно, указав перед командой число объединяемых строк Изменить регистр текущего символа и переместить курсор вправо на один символ. Если указать перед командой число, то будет изменен регистр у соответствующего количества символов, начиная с текущей позиции курсора :w Сохранить изменения в текущем файле. Если: файл с таким именем существует, то сохранение выполнено не будет :w! Сохранение файла. Если файл с таким именем уже существует, то будет выполнена операция его перезаписи щ Выйти из программы. Если есть несохраненные изменения, то выход из программы будет прерван с соответствующим сообщением
В заключение... 131 Таблица 4.3. Окончание Команды Операция :q! Выйти из профаммы с потерей несохраненных изменений :wqwiiiZZ Сохранить изменения ивыйти из профаммы :el Проигнорировать -все внесенные изменения и считать по-новому исходной вариант файла. -Заметим, что во время редактирования файла вплоть до выхода из профаммы вы работаете не с исходным файлом на- прямую, а с«й копией•- . - -., .»' :e<fllename> Зафузить файл filename для редактирования Команды прокрутки текста, использование буфера обмена, поиск и замену строк в файле оставляем читателю для самостоятельного изучения. Все эти вопросы подробно рассматриваются в справочном руководстве (man vi). В ЗАКЛЮЧЕНИЕ... Представленной на данный момент информации должно быть достаточно для начального ознакомления с работой в системе FreeBSD. Рассмотренные команды используются как пользователями, так и администраторами системы чаще всего (естественно, это утверждение относится к работе в текстовом терминале), и без знаний, представленных в этой главе, дальнейшее изучение книги практически невозможно.
132 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK ГЛАВА 5. КОМАНДНЫЕ ИНТЕРПРЕТАТОРЫ, СЦЕНАРИИ И ЯЗЫК ОБРАБОТКИ ШАБЛОНОВ AWK Данная глава приведена в ознакомительных целях и не претендует на исчерпывающее руководство для изучения вопросов, указанных в заголовке. Практика показывает, что многие администраторы так и не научились должным образом работать с оболочками, а уж тем более писать на так называемом языке SHELL сценарии, но это не помешало им стать успешными администраторами и хорошо справляться со своими обязанностями. В целом, действительно, администрирование не требует знания программирования, но благодаря таким навыкам администратор может на порядок упростить свою каждодневную работу, и сделать гораздо более удобным выполнение некоторых команд. Надеемся, что краткий обзор командных интерпретаторов и основ написания сценариев поможет читателю в его профессиональной деятельности. КОМАНДНЫЕ ИНТЕРПРЕТАТОРЫ Краткую вступительную информацию о командных интерпретаторах можно найти в предыдущей главе, и потому рассмотренные в ней вопросы в данной главе будут опущены. Итак, командный интерпретатор позволяет взаимодействовать пользователю с операционной системой. По умолчанию, в системе FreeBSD присутствует два командных интерпретатора: tcsh/csh и sh, — о которых вкратце было рассказано ранее. Но предположим, пользователя не удовлетворяет столь небольшое количество оболочек, или же требуется использовать другой интерпретатор, установленный по умолчанию в профиле пользователя. Должен ли администратор беспрекословно выполнять такое пожелание? Конечно же, нет. Во-первых, установка нового командного интерпретатора приведет к потенциальному увеличению риска взлома системы изнутри, что зависит и от командного интерпретатора, и от намерений недобросовестного пользователя. Уменьшить этот риск позволит запрет установки неизвестных интерпретаторов в качестве интерпретатора по умолчанию. Фактически, пользователь сможет пользоваться любым интерпретатором, запустив его из своего стартового. Запретить запуск можно, изменив (или не изменив, что зависит от сценария установки) файл /etc/shells, о котором подробно будет рассказано позже. Во-вторых, установка дополнительного командного интерпретатора нагружает систему дополнительными конфигурационными файлами. Каждый командный интерпретатор подразумевает несколько файлов, описывающих его настройки. В отличие от других простых приложений, они настраиваются в нескольких файлах, что может запутать не только начинающего администратора. Только для tcsh/csh в каталоге /etc присутствует три глобальных конфигурационных файла: csh.cshrc, csh.login и csh.logout.
Командные интерпретаторы 133 Установка Итак, вы решились на установку командного интерпретатора. Запомните: для установки командных интерпретаторов используйте только набор пакетов или дерево портов (вопросы установки приложений рассмотрены в главе 9, "Установка и обновление сторонних приложений"). Для установки из набора пакетов запустите утилиту sysinstall и проследуйте по пути Configure ► Packages ► выбор источника установки (CD/DVD или FTP) ► shells. Затем в появившемся списке выберите необходимый интерпретатор с помощью клавиши пробела (напротив выбранных пакетов появится [х]), после чего нажмите клавишу <ТаЬ> и <Enter>. В появившемся окне перейдите к кнопке Install и нажмите клавишу <Enter>. В новом окне появится список выбранных пакетов (рис. 5.1). Для того чтобы подтвердить выбор, нажмите ОК и по завершении установки выходите из утилиты sysinstall. These ere the packages you've selected for extraction. If you're sure of these choices, select OK. If not, select Cancel to go back to the package select I [eu13 ЗЯЯЕИУЕ l/usr/ orts/shells/«clkshJ Н(ШШ Cancel ion menu. - Рис. 5.1. Список выбранных командных интерпретаторов для установки в систему Итак, новое приложение установлено. В данном случае, исходя из рис. 5.1, мы установили известный интерпретатор ksh (Korn Shell), который можно запустить по команде ksh (если необходимо, выполните команду rehash). Также, данный интерпретатор сразу же становится доступным для указания его в качестве стартового для любого пользователя (путь к файлу — /usr/local/bin/ksh). О том, как это запретить, будет сказано позже. Теперь что касается установки из дерева портов. Здесь выбор приложений, как правило, намного шире. Однако прежде необходимо установить саму коллекцию портов, но это — вопрос из главы 9, а сейчас мы просто предположим, что порты в системе присутствуют. Перейдите в каталог /usr/ports/shells и просмотрите список доступных приложений: # cd /usr/ports # Is 44bsd-csh Makefile bash bash-completion bash2 bush es esh /shells/ fd flash gscommander ibsh ksh93 mudsh nologinmsg osh pash pdksh perish re rssh sash scponly tcsh-bofh tcshrc v7sh viewglob vshnu wapsh zoidberg zsh zsh+euc hack После выбора необходимого приложения перейдите в его каталог и выполните команду установки, например: # cd bash/ # make install clean
134 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK При этом необходимо иметь дистрибутивные файлы на CD/DVD, быть подключе ным к сети Internet или же скопировать их из другого места вручную в каталог дистр бутивов (см. главу 9, "Установка и обновление сторонних приложений"). После тогой требуемые файлы загружены, распакованы, скомпилированы и установлены в систем можно использовать данное приложение, в том числе установить его как командный Ш терпретатор по умолчанию (необходимые изменения автоматически вносятся в фа! /etc/shells). Для нашего примера это будет интерпретатор Bash (Bourne Agai Shell), вызываемый по команде bash, бинарный файл которого расположен в катали /usr/local/bin. Отметим, что в качестве интерпретатора по умолчанию может быть установлена! только специально предназначенная для этого программа, но и любая другая. Болеете' го, можно установить даже несуществующий интерпретатор, что в результате прост запретит вход пользователя через терминал (это относится и к использованию служи ftp). При этом службы, не требующие подключения к терминалу, (например, почта) 6} дут обслуживать запросы таких пользователей. Но прежде чем перейти к подобным во просам, рассмотрим назначение и использование файла /etc/shells. Интерпретаторы и файл /etc/shells Вы можете не знать, как настраивать интерпретаторы; возможно, вы не будете ш сать сценарии оболочек, но не знать файл /etc/shells и как с ним работать не моли себе позволить ни один администратор FreeBSD! Данный файл является базой данных разрешенных к использованию интерпретати ров. Каждый интерпретатор должен быть описан в отдельной строке полным путем исполняемому файлу от корня файловой системы. Пустые строки в файле игнорируй» ся, а те, которые начинаются с символа "#", являются комментариями. Если были уел новлены приложения, взятые в качестве примера в предыдущем подразделе, то фай /etc/shells примет вид, подобный представленному в листинге 5.1. Листинг 5.1. Пример файла/etc/ahalls , '- # $FreeBSD: src/etc/shells,v 1.5 2000/04/27 21:58:46 ache Exp $ # # List of acceptable shells for chpass(l). ft Ftpd will not allow users to connect who are not using # one of these shells. /bin/sh /bin/csh /bin/tcsh /usr/local/bin/ksh /usr/local/bin/bash С файлом /etc/shells связано большое множество различных неприятностей,1 его использование имеет несколько особенностей. Итак, оболочку по умолчанию пользователю устанавливает системный админии ратор при добавлении этого пользователя в систему. Устанавливаемая оболочка мша как входить в список из файла /etc/shells, так и отсутствовать в нем. При эта пользователь может без проблем пользоваться многими службами, предоставляемы» сервером. Однако некоторые службы требуют обязательного наличия записи для обе лочки пользователя в файле /etc/shells для предоставления ресурсов или доступ К таким службам можно отнести службы терминального доступа и службы fl| К примеру, используется почтовая служба и вдруг потребовалось получить досту к серверу с помощью telnet или ssh. В процессе подключения в получении такс* доступа было отказано — в таком случае убедитесь, что оболочка прописана в фай) /etc/shells (вернее сказать, спросите об этом у администратора).
Командные интерпретаторы 135 Name: User Ftpuser Shell: /usr/local/sbin/pure-ftpd ЗМЕШНО, НО ПРАВДА Ситуация, описанная выше, напоминает шутку, когда администратор системы Win- Sows получает сообщение об ошибке, в котором предлагается обратиться к системному администратору за разъяснением и помощью в исправлении., Системный администратор в недоумении _спрашив Второй аспект при работе с оболочками... Как уже было сказано выше, администратор может установить пользователю любую оболочку или поменять ее на любую дру- гую, но при этом сам пользователь может изменить оболочку только на одну из тех, которые перечислены в файле /etc/shells, или не может вовсе. Возьмем, к примеру, некоторого пользователя ftpuser со следующими характеристиками учетной записи: # finger ftpuser Login: ftpuser Directory: /home/ftpuser Never logged in. No Mail. No Plan. Из примера видно, что пользователь ftpuser имеет установленную нестандартную оболочку (не перечисленную в файле /etc/shells), а точнее— полный путь к исполняемому файлу ftp-сервера. Вдруг пользователю понадобилось изменить свою оболочку, чтобы получить терминальный доступ. В таком случае ему необходимо обратиться к системному администратору, так как он не имеет возможность сам получить терминальный доступ. В то же время, пользователь ftpshell имеет следующие параметры: tt finger ftpshell Login: ftpshell Directory: /home/ftpshell Never logged in. No Mail. No Plan. Данному пользователю в некоторый момент понадобилось изменить оболочку по умолчанию на /usr/local/bin/zsh, которая была недавно установлена в системе и прописывается администратором всем новым пользователям как стартовая. При этом системный администратор забыл прописать путь к данному интерпретатору в файле /etc/shells. Пользователь ftpshell столкнется с невозможностью самостоятельно выполнить операцию изменения стартовой оболочки на необходимую. При этом ему придется обращаться к администратору для изменения своей учетной записи или же попросить прописать путь к интерпретатору в файле /etc/shells. С другой стороны, что касается системного администратора, помня вышеописанные случаи, не стоит "слепо" включать в список /etc/shells все приложения, используемые как стартовые для пользователей. В наибольшей степени это относится к приложениям, запускаемым от имени root— их использование таит в себе угрозу получения ограниченными в правах пользователями полного доступа к системе от имени пользователя root. У того, кто следует описанным выше предостережениям и знает скрытые "подводные камни", по идее, не должно возникать никаких проблем с разрешением использования командных интерпретаторов, а если даже они и возникнут — он знает, в чем суть проблемы и как ее решить. Более того, у пользователя всегда есть возможность перейти к работе с другим интерпретатором, вызвав его из текущего, что позволяет администратору отказывать пользователям в добавлении "сомнительного" приложения в список разрешенных в файле /etc/shells. Name: User Ftpshell Shell: /usr/local/bin/bash
136 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Использование интерпретаторов и не только Не смотря на то, что мы еще не рассматривали основы управления пользователям» в данной главе необходимо затронуть некоторые принципы управления их учетным записями и профилями, но только с точки зрения использования командных интерпре таторов. Настройка и работа с интерпретаторами не может быть отнесена автором км дачам управления системой, хотя многие могут с этим не согласиться. И все же здес будет принята именно такая точка зрения. К тому же, не секрет, что большинство адм« нистраторов не знают основ работы с интерпретаторами, однако без проблем спраш ются со своими обязанностями. Но речь сейчас не об этом... Ответим на несколько популярных вопросов, рассмотрев при этом ряд примеров: Как изменить командный интерпретатор, используемый по умолчанию? Как запретить вход пользователя в систему, но разрешить работать со службами? Как запретить вход пользователя, но позволить работать со службой ftp? Как ограничить работу пользователя в системе, разрешив ограниченный досту! к терминалу? Что будет, если установить в качестве интерпретатора /usr/bin/passwd ил /usr /bin/ma i 1, и можно ли так делать? Итак, пользователь, который имеет доступ к командному интерпретатору, мож« в любой момент изменить его на иной другой и даже, в определенных случаях, избавил себя от такой возможности в будущем. Изменение командного интерпретатора выпол няется командой chsh (chpass и др.). При этом пользователь может изменить не тол ко командный интерпретатор, но и другие поля в записи для своей учетной записи, вы звав ее без указания параметров. В нашем случае команду chsh необходимо вызываи с опцией -s (изменение оболочки), для которой в качестве аргумента должен быть ум зан путь к исполняемому файлу. При этом он должен быть записан в файл /etc/shells (если пользователь сам меняет себе оболочку): ftpshell@mobile$ chpass -s /usr/bin/passwd chpass: /usr/bin/passwd: non-standard shell ftpshell@mobile$ chpass -s /bin/csh Password: chpass: user information updated ftpshell@mobile$ В данном примере пользователь ftpshell вначале попытался изменить оболочи на отсутствующую в файле /etc/shells, получив в результате отказ. После указана разрешенной оболочки и подтверждения пароля данные были успешно изменены. Пр следующем входе в систему пользователь окажется в оболочке С Shell. Обратите внимание на то, что администратор (пользователь root) также может и менить рассмотренным способом оболочку любому пользователю, обязательно указа его имя в конце команды. При этом от него не требуется ввода пароля, а также пут к файлу оболочки может быть фиктивным (указывать на несуществующий файл), него воря уже о том, что запись о файле оболочки может отсутствовать в файл /etc/shells: # chpass -s /usr/bin/nofile ftpshell chpass: WARNING: shell '/usr/bin/nofile' does not exist chpass: user information updated # chpass -s /sbin/nologin ftpshell chpass: user information updated В представленном примере администратор системы попытался установить полья вателю оболочку, запись о которой не только отсутствует в файле /etc/shells, но; самого файла в системе не существует. Утилита выдала соответствующе предупра
Командные интерпретаторы 137 дающее сообщение. Во втором случае был указан путь к существующему файлу, запись для которого, как правило, отсутствует в файле разрешенных оболочек— /sbin/ nologin. Если в первом случае пользователь при попытке авторизации в системе будет получать сообщение "Access denied", то во втором случае пользователь авторизация пройдет успешно, вот только работать пользователь не сможет, так как система выдаст на экран предупреждающее сообщение и отключит сессию: Using username "ftpshell". ftpshellGmobile's password: Server refused to set environment variables Last login: Sat Dec 24 10:45:18 2005 from 192.168.0.1 Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights preserved. This account is currently not available. Данный метод очень широко применяется в системах, где необходимо запретить пользователям терминальный вход и вход по ftp. Действительно, никто не мешает добавить /sbin/nologin в список разрешенных оболочек в файле /etc/shells для разрешения доступа по ftp, но лучше этого не делать. В таких случаях наиболее широко используется способ включения в файл /etc/shells пути к исполняемому файлу сервера FTP. Например, при использовании Pure-FTPd в базу добавляется строка /usr/local/ sbin/pure-ftpd , и этот же путь используется в учетной записи пользователя. Но и такой вариант не очень элегантен, так как некоторые программы при попытке терминального доступа пользователя и их вызова в качестве интерпретатора могут привести «проблемам. Наиболее интересным вариантом будет установка в качестве интерпретатора какой-либо интерактивной пользовательской программы, к примеру, программы работы с почтой mail или сценария изменения пароля passwd. В первом случае пользователь сможет получать доступ к почтовому ящику на сервере (в случае непустого ящика): Using username "ftpshell". ftpshellGmobile's password: Server refused to set environment variables Last login: Sat Dec 24 11:18:39 2005 from 192.168.0.1 Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights preserved. Mail version 8.1 6/6/93. Type ? for help, "/var/mail/ftpshell": 2 messages 2 new >N 1 ftpshell@localhost Sat Dec 24 03:11 42/1518 "altersys-ua.com" N 2 ftpshell@localhost Sat Dec 24 03:11 70/2248 "altersys-ua.com" & Во втором случае пользователь самостоятельно в любой момент сможет изменять пароль к своей учетной записи, не имея при этом полного доступа к терминалу: Using username "ftpshell". ftpshellGmobile's password: Server refused to set environment variables Last login: Fri Dec 23 17:55:39 2005 from 192.168.0.1 Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights preserved. Changing local password for ftpshell
138 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Old Password: New Password: Retype New Password: Хотелось бы упомянуть еще об одном, более оригинальном решении: написанм своего сценария или программы для работы в качестве оболочки. Да, такое возможно, и более того, написать такой сценарий не составит труда даже начинающему программисту или же простому администратору, знающему основы языков Perl, С или SHELL (или любого другого). В качестве примера создадим файл myshell.pl в каталоге /usr/bin, содержимое которого представлено в листинге 5.2, и сделаем его выполняемым, установив для него бит "executable". Листинг 5.2. Пример сценария на языке Perl, который позволяет пользователю регистрироваться в системе и выполнять ограниченное количество операций: ,.' изменение пароля, чтение почты и выбор другой оболочки ] #!/usr/bin/perl while (l) { print "\nPlease try one:\n"; print "1) change password\n"; print "2) change shell\n"; print "3) read mail\n"; print "4) exit\n\n> "; chomp (Scommand = <STDIN>); if ($command==4)( exit; ) elsif ($command==l) { system(passwd) ; } elsif ($command==2) { $i=0; open(SHELL, '/etc/shells'); .while (<SHELL>) { if (!($_=-/A#/i) ii !($_=~/A\n/i)){ $i++; print $i,") ",$_; @shells{$i)=$_; }; ); close(SHELL); print "shell> "; chomp ($shell = <STDIN>); system("chpass -s $shells{$shell}"); } elsif ($command==3) { system(mail); ); jj Установив пользователю ftpshell данный сценарий в качестве стартовой оболочки, мы офаничиваем его работу в терминале до возможности выполнения всего лиц»! нескольких операций. Пример работы пользователя в таком случае может выглядеи следующим образом: login as: ftpshell ftpshellSmobile's password: Server refused to set environment variables Last login: Sat Dec 24 15:37:28 2005 from 192.168.0.1
Командные интерпретаторы 139 Copyright (с) 19В0, 1983, 1986, 19В8, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights preserved. Please try one: 1) change password 2) change shell 3) read mail 4) exit > 3 No mail for ftpshell Please try one: 1) change password 2) change shell 3) read mail 4) exit > 1 Changing local password for ftpshell Old Password: New Password: Retype New Password: Please try one: 1) change password 2) change shell 3) read mail 4) exit > 2 1) /bin/sh 2) /bin/csh 3) /bin/tcsh 4) /usr/local/bin/ksh 5) /usr/local/bin/bash 6) /usr/local/sbin/pure-ftpd 7) /usr/bin/myshell.pi shell> 5 Password: chpass: user information updated Please try one: 1) change password 2) change shell 3) read mail 4) exit Сценарий из листинга 5.2 не претендует на оригинальность и отображает только возможность написания своих сценариев для работы в качестве оболочки пользователя. Читатель берет на себя полную ответственность за его использование на свой страх и риск.
140 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Обращаем внимание читателя на тот факт, что пользователю root не следует уел' павливать н качестве стартового интерпретатора программы сторонних разработчика Рассмотрим, какие файлы могут принимать участие в процессе инициализации (ил вершения работы) командного интерпретатора. Файлы инициализации Говорить о существовании единого файла инициализации для всех интерпретаторе некорректно — для каждого конкретного интерпретатора в системе присутствуют ил могут присутствовать собственные файлы инициализации различного формата и на строек. Во многих случаях это приводит к некоторой путанице, но это уже человечески фактор. "Зачем же нужны файлы инициализации?", — спросит читатель. На этот вопряЦ ответим списком их наиболее используемых возможностей: автоматический запуск команд при входе и выходе пользователя из системы; установка переменных среды; изменение командной строки запроса; создание псевдонимов для различных команд с целью упрощения их использовв ния. Существуют и другие возможности, но они используются крайне редко. Обратит внимание на то, что файлы инициализации существуют на системном уровне (для уст» новки общих параметров для всех пользователей данного интерпретатора) и на пользо вательском уровне (для переопределения системных и установки дополнительных га раметров). При этом первыми считываются и применяются настройки из файлов см темного уровня, а затем они переопределяются и дополняются настройками из файла пользовательского уровня. Файлы инициализации системного уровня находятся в ката логе /etc, а пользовательского размещаются в домашнем каталоге пользователя, и ки имени добавляется точка (скрытый файл). Например, в каталоге /etc может находитьс файл profile, а в домашнем каталоге пользователя — файл .profile. Для командного интерпретатора sh (Bourne Shell) существует только один систо ный файл инициализации: /etc/profile. Пользовательских же два: . profile i .shrc. Файл /etc/profile, по умолчанию, не выполняет никаких действий по ини циализации командного интерпретатора, но в случае необходимости может быть изме нен. Обратите внимание на то, что данный файл исполняется только при инициализацтй интерпретатора sh, из чего следует, что при выходе пользователя никаких действий вы полнено не будет (такая возможность существует в других интерпретаторах). Тага следует обратить внимание на то, что данные файлы используются интерпретаторо» только в том случае, если он является интерпретатором по умолчанию. Рассмотрим, что собой представляют файлы инициализации по умолчанию. He-j сколько забегая наперед, отметим, что при добавлении пользователя в систему ему и№ жет быть назначен набор конфигурационных файлов, копируемый из каталол /usr/share/skel. В упомянутом каталоге находятся файлы конфигурации по умо.^ чанию, которые можно изменить в любой момент, например, если всем новым созда ваемым пользователям необходимо установить особенные настройки для интерпретатора (и не только для него). Если просмотреть содержимое каталога /usr/share/ske!, то вы увидите файлы, которые начинаются со слова dot (эта приставка при копиром нии удаляется). В текущий момент нас интересуют файлы для оболочки sh, то ecu dot. profile (листинг 5.3) и dot. shrc (листинг 5.4). Листинг 5.3. Содержимое файла /usr/share/skel/dot.profile (система FreeSSD 6) , # $FreeBSD: src/share/skel/dot.profile,v 1.21 2002/07/07 00:00:54 mp Exp) # tt .profile - Bourne Shell startup script for login sheila # # see also sh(l), environ(7).
Командные интерпретаторы 141 Ьстинг 5.3. Окончание ) remove /usr/games and /usr/XHR6/bin if you want tATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/b Un:/usr/XllR6/bin:$H0ME/bin; export PATH ♦Setting TERM is normally done through /etc/ttys. Do only override (if you're sure that you'll never log in via telnet or xterm or a f serial line. (Use cons2511 for iso-* fonts ( TERM=cons25; export TERM BLOCKSIZE=K; export BLOCKSIZE EDITOR=vi; export EDITOR ?AGER=more; export PAGER I set ENV to a file invoked each time sh is started for interactive use. fflV=$HOME/.shrc; export ENV ( -x /usr/games/fortune ] && /usr/games/fortune freebsd-tips Файл dot.profile устанавливает значение для переменной PATH, указывающей па каталоги, в которых будет выполнен поиск приложения, если указано неполное имя (имя файла без пути). Затем указываются некоторые предпочтения для пользователя: исчисление размера в килобайтах, редактор по умолчанию — vi, утилита постраничного вывода — more. После этого устанавливается значение для переменной ENV, которая содержит имя файла, вызываемого при всяком использовании интерпретатора sh «качестве стартовой оболочки. Этим файлом и является . shrc. В новых версиях FreeBSD при входе пользователя вызывается также утилита fortune, которая каждый раз случайным образом отображает быструю подсказку по использованию системы. За лу возможность и отвечает последняя строка файла dot. profile. Теперь, что касается файла dot. shrc (.shrc)... Этот файл, по идее, вызывается галько при вызове интерпретатора sh как стартового. В нем можно задать права доступа, устанавливаемые по умолчанию на создаваемые файлы, или же создать псевдонимы команд для упрощения вызова последних с определенными опциями без их указания «строке вызова. В этом же файле указывается вид командной строки запроса и несколь- ю других дополнительных возможностей интерпретатора sh. ||мстинг 5.4. Содержимое файла /usr/share/sTcel/dot. зпгс (система FreeBSD 6) ~ ISFreeBSD: src/share/skel/dot.shrc,v 1.3 2002/07/23 12:28:16 jmallett Exp $ I t .shrc - bourne shell startup file t (This file will be used if the shell is invoked for interactive use and (the environment variable ENV is set to this file. ( (see also sh(l), environ(7). (file permissions: rwxr-xr-x I I umask 022 ) Enable the builtin emacs(l) command line editor in sh(l), (e.g. C-a -> beginning-of-line. set -o emacs
142 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Листинг 5.4. Окончанйа ; ' '" ' '•'■'' ""'" ■■ |j # Uncomment this and comment the above to enable the builtln vi(l) command ft line editor in sh(l), e.g. ESC to go into visual mode. # set -o vi # some useful aliases alias h='fc -l1 alias j=jobs alias m=$PAGER alias 11=Чз -laFo' alias l='ls -1" alias g='egrep -i' # # be paranoid # alias cp='cp -ip' # alias mv='mv -i1 # alias rm='rm -i1 # # set prompt: ''username@hostname$ '' # PSl-="4whoami'@'hostname I sed 's/\..*//''" # case 'id -u' in # 0) PS1-"${PS1)# ";; # *) PS1="$(PS1}$ ";; # esac # search path for cd(l) # CDPATH=.:$HOME Файлы . profile и . shrc использует также и командный интерпретатор bash, но не только их. Формат упомянутых файлов для bash ничем не отличается, только обращение к файлу . profile происходит при условии, что интерпретатор bash установлен как стартовая оболочка пользователя. В ином случае считываются установки из файл .bashrc. Кроме того, при выходе пользователя из оболочки и при наличии файла . bashlogout, будут выполнены описанные в нем указания. Перейдем к рассмотрению файлов инициализации более популярного в систем FreeBSD интерпретатора csh/tcsh (С Shell). Его настройка более "прозрачна" по ера» нению с sh, но фактически ничем не отличается. На глобальном уровне в каталоге /etc присутствуют три файла: csh. cshrc, csh. login и csh. logout. Все они, по умолч» нию, не играют никакой роли в настройке интерпретатора, так как содержат толы» комментарии, чего нельзя сказать о пользовательских файлах инициализации интерп|* татора: -/.cshrc (вначале проверяется наличие ~/.tcshrc), ~/. login i ~/.logout. Для того чтобы воспользоваться глобальными файлами инициализации, следуя при необходимости снять комментарии с определенных строк или же добавить, в зав» симости от предпочтений (к примеру, если всем пользователям tcsh необходимо в са мом начале установить обязательное выполнение некоторой команды). Для начала рассмотрим самый простой файл .login. Его назначение понятное названия файла: выполнение определенных операций при входе пользователя в систе» (точнее сказать, выполнение указанных программ при входе пользователя). Дант файл позволяет в каждой строке перечислить утилиты в порядке их выполнения. Hi умолчанию, при входе пользователя выполняется только одна утилт /usr/games /fortune, если таковая присутствует в системе (листинг 5.5).
Командные интерпретаторы 143 Листинг S.5. Пример содержимого файла . login для интерпретатора o«h/toah I$FreeBSD: src/share/skel/dot.login,v 1.16 2001/06/25 20:40:02 nik Exp $ i .login - csh login script, read by login shell, after '.cshrc' at login. i see also csh(l), environ(7). [ -x /usr/games/fortune ] && /usr/games/fortune freebsd-tips To же самое относится и к файлу . logout, который по умолчанию отсутствует в домашнем каталоге пользователя (и в каталоге шаблонов /usr/share/skel). Единственное отличие: данный файл запускает процессы при выходе пользователя из системы. Пример содержимого такого файла для удаления временных файлов из каталога /tmp и вывода сообщения о завершении работы может выглядеть довольно просто: rm -rf /tmp/* SS echo "Cleaning of temporal files..." echo "Goodby. See you later..." Обратите внимание на то, что оба описанных файла исполняются только в том случае, если интерпретатор запущен как стартовый для пользователя. Единственный файл, который выполняется в любом случае, — это .cshrc. В нем определяются настройки среды командного интерпретатора, такие как установка псевдонимов команд, права доступа к новым создаваемым файлам, пути поиска программ, заданных неполным именем, установка переменных среды и строки запроса (листинг 5.6), а также многие другие настройки, рассмотрение которых выходит за рамки данной главы. Листинг 5.6. Пример содержимого файла. o«hrc для oah/toah пользователя root i $FreeBSD: src/etc/root/dot.cshrc,v 1.29 2004/04/01 19:28:00 krion Exp $ 1 .cshrc - csh resource script, read at beginning of execution by each shell i i see also csh(l), environ(7). alias h history 25 alias j jobs -1 alias la Is -a alias If Is -FA alias 11 Is -1A ♦ A righteous umask mask 22 set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbln Wusr/local/bin /usr/XHR6/bin $HOME/bin) setenv EDITOR vi setenv PAGER ' more setenv BLOCKSIZE К if ($?prompt) then # An interactive shell — set some stuff up set prompt = "'/bin/hostname -s'tt " set filec set history = 100 set savehist = 100 set mail = (/var/mail/$USER) if ( $?tcsh ) then
144 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Листинг 5.6. Окончание bindkey "Aw" backward-delete-word bindkey -k up history-search-backward bindkey -k down history-search-forward endif endif К файлам инициализации можно также отнести и файл . history, содержимое которого считывается после файла . cshrc. В данном файле хранится история команд, которая может быть использована для упрощения работы в системе. Переменные среды и интерпретатора Прежде чем перейти к рассмотрению следующего вопроса, имеет смысл разобрался в таком основополагающем понятии как переменные среды и командного интерпретатора. "Переменные" — поскольку их можно устанавливать и изменять в процессе работы в оболочке. Для просмотра установленных переменных среды используется команда printenv или env без аргументов: %printenv USER=informex LOGNAME=informex HOME=/home/informex MAIL=/var/mail/informex PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/locj •bal/bin: /usr/XHR6/bin: /home/informex/bin 4 TERM=xterm BLOCKSIZE=K FTP_PASSIVE_MODE=YES SHELL=/bin/csh SSH_CLIENT=192.168.0.1 3439 22 SSH_CONNECTION=192.168.0.1 3439 192.168.0.200 22 SSH_TTY=/dev/ttypO DISPLAY=localhost:10.0 HOSTTYPE=FreeBSD VENDOR=intel OSTYPE=FreeBSD MACHTYPE=i386 SHLVL=1 PWD=/home/informex GROUP=wheel HOST=mobile.altersys-ua.com REMOTEHOST=informex EDITOR=vi PAGER=more Просмотреть значение отдельно взятой переменной среды можно с помощью ко манды echo и имени переменной с предваряющим знаком $, или же с помощью все то же команды printenv, передав ей имя переменной: %echo $SHELL /bin/csh %printenv HOME /home/informex %sh $ echo $HOME /home/informex $ printenv SHELL /bin/csh
Командные интерпретаторы 145 Список переменных среды варьируется в зависимости от оболочки и настроек среды. Обратите внимание на то, что все переменные среды пишутся прописными символами, чего рекомендуется придерживаться и при создании новых переменных среды спомощью команды setenv для tcsh и export для sh или bash во избежание путаницы с переменными интерпретатора (которые принято писать строчными символами, но не всегда, например, для sh): %setenv TEST1 "some test 1" %printenv TEST1 some test 1 %sh $ export TEST2="some test 2" $ printenv TEST2 some test 2 Для чего же предназначены эти переменные? Ответ прост и банален: для использования в различных программах, с целью упрощения работы пользователя и настройки. Предположим, кто-то для редактирования текстовых данных предпочитает пользоваться редактором edit, а команда изменения параметров учетной записи пользователя chpass была жестко привязана к использованию редактора vi. В таком случае пришлось бы изменить исходные тексты для vi и перекомпилировать их с последующей заменой, что неудобно. К тому же, здесь мы сталкиваемся с проблемой несоответствия предпочтений различных пользователей системы. Выход из сложившейся ситуации заключается в привязывании утилиты chpass к значению переменной среды EDITOR. За счет изменения значения этой переменной предпочитаемая утилита редактирования может быть установлена пользователем самостоятельно и изменена в любой момент времени: %printenv EDITOR vi %chpass #Changing user information for informex. Shell: /bin/csh Full Name: Olexa Office Location: Office Phone: Home Phone: Other information: :q chpass: user information unchanged %setenv EDITOR edit %chpass #Changing user information for informex. Shell: /bin/csh Full Name: Olexa Office Location: Office Phone: Home Phone: Other information: press Escape (Л[) for menu chpass: user information unchanged % Это относится также и к другим переменным среды, например, к TERM (тип терминала для правильного форматирования вывода), BLOCKSIZE (предпочитаемая величина при выводе размера данных, например, блоки или килобайты), PAGER (предпочитаемая
146 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK программа для постраничного вывода текстовой информации). Никто не мешает ис пользовать эти значения в командной строке. Возможен даже следующий вариант ис пользования: %$PAGER -/.login [ -х /usr/games/fortune ] &fi /usr/games/fortune freebsd-tips /usr/bin/su Для удаления переменных среды используется команда unsetenv: %unsetenv PAGER %echo $PAGER PAGER: Undefined variable. Переменные интерпретатора Переменные интерпретатора существуют только на время конкретного сеанса пользователя и не распространяются на переменные другого интерпретатора, запущенного из текущего интерпретатора, так как доступны только процессу интерпретатора. Возможно, это с ходу тяжело понять. Поясним сказанное на примерах. Каждый интерпретатор обладает некоторыми свойствами, и иногда эти свойства необходимо изменять, в других же случаях требуется определить переменную, недос» тупную из других интерпретаторов, запущенных в текущей сессии. Для просмотра списка текущих переменных интерпретатора используется команда set без параметров в csh/tcsh (та же команда в sh позволяет просмотреть список переменных как интерпретатора, так и среды): %set addsuffix argv () csubstnonl cwd /home/informex dirstack /home/informex echo_style bsd edit filec gid 0 group wheel history 100 home /home/informex killring 30 loginsh mail /var/mail/informex j owd path (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin 4>/usr/local/bin /usr/XHR6/bin /home/informex/bin) prompt % prompt2 %R? prompt3 CORRECTOR (y|n|e|a)? savehist 100 shell shlvl status tcsh term tty uid user /bin/csh 1 0 6.14.00 xterm ttypO 1001 informex
Командные интерпретаторы 147 version tcsh 6.14.00 (Astron) 2005-03-25 (i386-intel-FreeBSD) options 4>wide,nls,dl,al,kan,rh,color,filec Обратите внимание на то, что, в отличие от переменных среды, переменные интерпретатора могут не иметь значения. Для установки переменной интерпретатора Bcsh/tcsh используется команда set с передачей ей в качестве аргумента имени переменной и, возможно, — значения для данной переменной, отделенного знаком равенства, например: %set history=200 %echo $history 200 iset someCshEnv= aecho $someCshEnv % Для объявления переменной интерпретатора sh достаточно просто указать ее имя (рекомендуется писать название полностью прописными буквами) и значение, отделенное знаком равенства, без использования команды set: $ HISTORY=300 $ echo $HISTORY 300 $ SOMEFREE= $ echo $SOMEFREE $ Для удаления переменной среды используется команда unset, при этом ее формат одинаков как для csh, так и для sh: $ unset HISTORY $ echo $HISTORY $ В csh это будет выглядеть следующим образом: %unset history fcecho $history history: Undefined variable. % Перейдем к рассмотрению последнего вопроса по использованию командных интерпретаторов, а точнее — к настройке среды. Несмотря на попытку автора свести работу с переменными в различных интерпретаторах в один раздел, подходить к использованию переменных в различных оболочках следует по-разному. Так, в данном разделе не были рассмотрены особенности работы с переменными среды и оболочки в случае использования Korn Shell, которые отличаются от описанных выше методов. Настройка среды интерпретатора Частично настройка среды интерпретаторов была рассмотрена в предыдущих разделах за счет рассмотрения файлов инициализации и использования переменных. Тем не менее, многие могли не понять, что команды из файлов инициализации могут приме-
148 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK няться для настройки интерпретатора интерактивно, а применяемые интерактивно ко манды настройки можно использовать и в файлах инициализации. В принципе, к на стройке интерпретатора относится изменение его внешнего вида (командной строки за проса) и добавление собственных команд за счет описания псевдонимов. Попытаемо разобраться в некоторых аспектах настройки различных интерпретаторов. Настройка sh Для начала рассмотрим создание псевдонимов в sh. Псевдоним в контексте обо лочки — это замена команды (или команды с параметрами) другим именем. К примеру, в оболочке csh можно использовать команду 11, которая в действительности являета псевдонимом утилиты Is с параметрами -1А. Оболочка sh имеет, по умолчанию, ряд определенных псевдонимов в файле инициализации . shrc, но, как известно, этот файл применяется только при условии, чти интерпретатор установлен как оболочка по умолчанию. Для того чтобы можно было ио пользовать псевдоним 11 в sh, вызвав его как субоболочку (оболочка в оболочке), не- обходимо выполнить следующую команду: $ alias ll='ls -la' Обратите внимание на формат объявления псевдонима с помощью команды alias; сначала указывается имя псевдонима, затем — знак равенства и после него — полета»- ляемая команда в кавычках (одинарных или двойных). Проверим, что псевдоним 11 работает: $ pwd /var/db $ 11 total drwxr- drwxr- ■ j -r—r- 1790 -xr-x ■xr-x --r— 10 21 2 1 2 1 locate.database -rw-r- -rw-r- drwx— drwxr- drwxr- drwxr- drwxr- drwxr- ■-Г-- •-r— •xr-x -xr-x -xr-x -xr-x -xr-x 1 1 4 280 20 2 36 6 root root operator root root nobody root root mysql root root root root root wheel wheel operator wheel wheel wheel wheel wheel mysql wheel wheel wheel wheel wheel 512 512 512 0 512 1782159 82 0 2560 8192 512 512 512 512 Dec Jan Jan Dec Nov Dec Jan Nov Jan Dec Dec Nov Nov Nov 18 5 5 18 3 3 5 26 5 22 22 3 26 30 02 13 16 02 10 04 04 22 11 23 23 10 22 17 38 26 00 38 09 24 07 01 27 32 28 09 20 12 . . . entropy hcsecd.keys ipf mixerO-state mountdtab mysql pkg ports portsnap scrollkeeper sup При создании псевдонима на существующий псевдоним значение старого измен»- ется. Удаление псевдонима производится командой unalias: $ unalias 11 $ 11 11: not found Кроме изменения/добавления псевдонимов, существует возможность изменять командную строку запроса. По умолчанию, для рядового пользователя в sh она выглядит как символ $ с пробелом, а для суперпользователя — как символ # с пробелом. Некого рые пользователи предпочитают изменять командную строку. При этом она может принимать различный вид: от одного символа до громоздких информативных строк. Какбн там ни было, изменение строки запроса все-таки опишем.
Командные интерпретаторы 149 Итак, в списке переменных оболочки присутствует первичная и вторичная переменная командной строки запроса, именуемые PS1 и PS2. Вторичная переменная (PS2) отображается только в случае незавершенных команд, а первичная (PS1) — всякий раз при ожидании новой команды от пользователя. Для изменения командной строки запроса на текущую сессию достаточно присвоить новое значение переменной PS1. При этом можно использовать различные символы подстановки и подставлять всевозможные команды. Символами подстановки при использовании sh являются следующие последовательности: \$ — если пользователь имеет права root, то отображается символ "#", во всех остальных случаях — символ "%"; \h — короткое имя хоста (аналогично результату команды'hostname -s'); \н — полное доменное имя хоста (аналогично 'hostname'); \w— текущий каталог (использование pwd' не даст желаемого результата). Воспользовавшись рассмотренными последовательностями символов подстановок и подстановкой команд, создадим несколько примеров изменения вида командной строки запроса и результаты: $ PSl="'whoami'@\h\$ " informex@mobile$ PS1="'hostname':\w> " mobile.altersys-ua.com:/> cd usr mobile.altersys-ua.com:/usr> PS1="'whoami'@\h[\w]\$ " informexGmobile[/usr]$ cd - informex@mobile[/usr/home/informex]$ PS1="\$ " He стоит сильно увлекаться изменением командной строки запроса. Большинство интерпретаторов настроены на короткую строку запроса, позволяйщую просто определить, какая оболочка используется, и каковы права пользователя в системе вданный момент. Автор книги придерживается мнения, что изменение вида командной строки запроса — это "плохой тон", который вводит путаницу и загромождает терминал ненужной информацией. К примеру, пользователь с именем client 13 на машине officei3 в домене company.local захотел всегда видеть в командной строке запроса имя пользователя, имя машины и порядковый номер команды в истории команд. Давайте подсчитаем, сколько приблизительно символов займет такая строка на терминале в 80 столбцов (предположим, что получили строку ciienti3@officel3.company. 1оса1:ЮЗ>). Результат впечатляет: 36 символов, что составляет почти половину ширины терминала! Для сохранения настроек, чтобы они применялись всякий раз при входе пользователя в систему, следует внести соответствующие изменения в файл ~/.shrc. Более подробную информацию по настройке интерпретатора Bourne Shell можно найти «справочном руководстве man sh. Особенности настройки bash Поскольку bash (Bourne Again Shell) — это обновленная и переработанная версия антерпретатора sh? то мы рассмотрим только изменения и дополнения в настройке. Относительно использования псевдонимов никаких замечаний не будет, а вот для создания строки запроса или приглашения существует несколько дополнительных символов подстановки. Кроме того, переменных оболочки стало намного больше (не говоря уже о по- шлении PS3 и PS4).
150 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Перечислим символы подстановки, используемые в bash: \а — подача звукового сигнала (завершение каждой команды будет выделятм звуковым сигналом системного динамика); \d — дата в формате "ДеньНедели Месяц Дата" (например "Thu Jan 05"); \h — короткое имя хоста; \Н — полное доменное имя хоста; \1 — имя терминального устройства (к примеру, ttypO); \s — имя оболочки (если это — суперпользователь, то будет отображено basti иначе — bash); \t — текущее системное время в формате "ЧЧ:ММ:СС" (по 24-хчасовой разми ке), к примеру 19: 59:07; \Т — текущее время в 12-тичасовой разметке, например 07:59:22; \@ — текущее время в формате АМ/РМ, например 08:01 РМ; \А — текущее время в формате"ЧЧ:ММ", например 20: 01; \и — имя пользователя (вместо подстановки * whoami *); \v — версия оболочки, к примеру, 3. 00; W — релиз программы оболочки, к примеру, 3.00.16; \w — полный путь к текущему каталогу, домашний каталог будет отображала как символ тильды "~"; \w — имя текущего каталога без полного пути, домашний каталог пользоватем будет отображен как ~; \ ! — порядковый номер команды в файле истории команд; \# — порядковый номер команды с начала работы в оболочке (как правило, ж совпадает с порядковым номером в истории команд); \$ — если пользователь имеет права root, то отображается символ "#", во все остальных случаях — символ "%". Рассмотрим несколько примеров использования перечисленных символов подо* новки: -bash% PSl="\u@\h\$ ■• informex@mobile$ PSl="\u@\h[\w]:\!> " informex@mobile[~]:197> cd /usr/local informex@mobile[/usr/local}:198> PS1«"\A \u[\w]\$ " 20:13 informex[/usr/local]$ cd ~ 20:14 informex[~]$ Рассмотрим еще некоторые особенности настройки оболочки bash. Так, с по»ю щью команд set и shopt можно изменить стандартное поведение bash в различны» ситуациях. Для этого используется следующий вид вызова команды set: set +/-ОПЦИЯ При этом знак плюса ("+") используется для отмены установки опции, а не для уь тановки, как можно было бы ошибочно подумать. К примеру, воспользуемся опций verbose, установка которой позволяет повторять строки ввода: 20:18 informex[~]$ set -о verbose 20:18 informex[~]$ mail mail No mail for informex 20:18 informex[~]$ cd /home cd /home 20:18 informex[/home]$ Список других опций (используйте команду set -о) и их описаний для установи командой set можно найти в справочном руководстве man bash.
Командные интерпретаторы 151 Что касается использования команды shopt, то для установки опций с ее помощью применяется следующая форма: shopt -s переменная а для отмены: shopt -u переменная Просмотреть список всех опций, управляемых с помощью команды shopt, можно вызвав данную команду без опций: informex[/home]$ shopt cdable_vars off cdspell off checkhash off checkwinsize off cmdhist on colonbreakswords on dotglob off I ... » Покажем использование команды shopt на примере. Для этого включим опцию mail warn, которая позволяет информировать пользователя о появлении новой почты: informex[/home]$ shopt -s mailwarn informex[/home]$ echo "test" I mail -s test \u@localhost informex[/home]$ You have mail in /var/mail/informex informex[/home]$ He забудьте сохранить изменения в файлах инициализации (несмотря на возможность использования .profile, bash первоначально ищет специфичные для него файлы инициализации). Более детальную информацию о различиях в использовании и настройке sh и bash можно найти на страницах справочного руководства man bash. В случае использования ksh (Korn Shell) присутствуют практически все возможности и расширения) присутствующие в bash: подобное определение псевдонимов, настройка опций оболочки. Единственное существенное отличие— отсутствие большинства символов подстановки для настройки вида командной строки запроса. К слову, ksh использует в качестве файлов инициализации /etc/profile и "/.profile. Настройка csh/tcsh Настройку csh (С Shell) мы рассматриваем в последнюю очередь неспроста. Это обусловлено ее нестандартностью по сравнению с остальными интерпретаторами, что вызвано, скорее всего, попыткой сделать данный интерпретатор наиболее близким для программистов на языке С. Первые же серьезные различия обнаруживаются уже при рассмотрении вопроса с псевдонимами. Итак, для создания псевдонимов используется та же команда alias, однако формат описания отличается. Во-первых, имя псевдонима и его значение разделяется не знаком равенства, а символом пробела или табуляции: %alias la Is -a Во-вторых, не обязательно (но иногда требуется) значение псевдонима брать в кавычки, но это не существенное замечание (оно, к примеру, не актуально в случае ис-
152 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK пользования конвейеров, перенаправления вывода и т.п.), чего не скажешь о возможм сти применять анализ строки и использовании значения аргумента псевдонима в люб« месте строки описания. Рассмотрим это на примере: %alias fastmail 'echo \!:3 I mail -s \!:2 \!л' %alias fastmail echo !:3 I mail -s !:2 !A %fastmail admin@main.com.ua "fastmail" "Test fastmail alias ..." Здесь мы создали псевдоним fastmail с использованием странных обозначени \!:3, \!:2и\!л. Каждое такое обозначение описывает один аргумент, который буде использован при вызове команды fastmail. С помощью \! Л обозначается первый ар гумент в вызове псевдонима (можно использовать также подстроку \! : 1), с помощи \! : 2 — второй аргумент и т.д. В результате вызова команды из четвертой строки при мера будет создано и отправлено письмо по адресу admin@main.com.ua с теме! fastmail и текстом письма "Test fastmail alias ...". Как можно заметить, для просмотра значения псевдонима необходимо использо вать вызов команды alias с передачей имени псевдонима. Для просмотра полногош ска всех псевдонимов и их значений используется вызов команды alias без аргумен- тов. Для удаления псевдонима используется команда unalias: %unalias fastmail %fastmail fastmail: Command not found. He обошлось без различий и в установке внешнего вида командной строки запрой В отличие от других рассмотренных интерпретаторов, в csh/tcsh переменная оболочи носит другое имя: prompt (а также prompt2 и prompt3). Для установки использует команда set. При этом разрешено использовать подстановки команд с помощью си» вола обратной кавычки "ч". В csh/tcsh присутствует большое количество символм подстановки, которые позволяют просто и кратко настроить командную строку ба применения подстановки команд, например: %set prompt="%U%n@%m%u%B[%/]%b:%h%# " informex@mobile[/var]:149> cd - informex@mobile[/home/informex]:150> Здесь %U — начало строки с подчеркиванием, %u — окончание подчеркивав, %п— имя пользователя, %т — краткое имя машины (полное задается через %М), %в- повышение контраста шрифта, %Ь — окончание контрастного выделения, %/ — полны! путь к рабочему каталогу, %h — номер текущей команды в истории команд, %# — символ, меняющийся в зависимости от привилегий пользователя в системе: если просто! пользователь, то ">", иначе — "#". Остальные символы подстановки описаны в справочном руководстве man csh или man tcsh в разделе описания переменных оболочки. В целом, больше никаких замечаний по использованию и настройке командных интерпретаторов не будет. Переходим к рассмотрению основ написания сценариев. татору, например man sh ИЛИ man csh. ОСНОВЫ ПРОГРАММИРОВАНИЯ Программирование заключается в написании определенного набора инструкций дм выполнения той или иной задачи (или набора задач). В более глубоком смысле — эи
Основы программирования 153 написание программ или сценариев с помощью доступных средств для последующего их использования. Существует множество языков программирования, каждый из которых имеет свои преимущества и недостатки, но целью их существования все равно остается упрощение решения сложных задач. Пользователям FreeBSD предоставляется возможность писать программы и сценарии на множестве языков программирования, в том числе на С, C++, Object Pascal, Fortran, Assembler, Perl и др. Однако в контексте данной книги необходимо рассмотреть языки, позволяющие быстро создавать небольшие сценарии для решения системных задач. В данном случае язык С отпадает по причине сложности изучения для начинающих и громоздкости полученных программ. Рассмотрение Perl требует написания отдельной книги, поскольку научиться программировать на этом языке за 10 дней невозможно ©. Но не будем гадать, какой язык лучше, — мы рассмотрим только программирование на SHELL (для оболочек Bourne). Краткий обзор программирования на SHELL Почему мы остановились именно на SHELL? Этот язык очень прост для изучения в контексте использования возможностей оболочки, с его помощью легко автоматизировать работу любого пользователя (в первую очередь, администратора) и сэкономить время. В данном подразделе мы кратко рассмотрим программирование для оболочки sh/bash. Самым простым примером программы на SHELL является конвейер. Да, именно так! Конвейер — это простая программа на SHELL (сами конвейеры были рассмотрены ранее, и потому подробно останавливаться на них мы не будем). Вывод данных Рассмотрим пример простейшей программы на SHELL (листинг 5.7). Для простоты описания каждая строка будет помечена номером (в тексте данных номеров, естественно, нет). Листинг 5.7. Простейшая программа на SHELL "Hello, World" 1: #!/bin/sh 2: 3: # /hello.sh i: echo "Hello, World" Кроме вывода данных, в данном подразделе мы рассмотрим также оформление программ, написанных на SHELL. Согласно третьей строке, данный файл должен быть создан в корне файловой системы (если у вас есть такие права) под именем hello. sh. Сама третья строка является комментарием (все комментарии в файле начинаются с символа "#". Исключением является только первая строка, которая не относится к комментарию — последовательность символов "#!" обозначает, что за ней следует полный путь к исполняемому файлу интерпретатора, в котором должен выполниться написанный сценарий. К примеру, если это /bin/sh, то файл hello, sh будет выполнен как сценарий Bourne Shell, если же будет указано /usr/ local /bin/bash, то — как сценарий Bash. В случае использовании Perl первая строка примет вид /usr/bin/perl. Обратите внимание на то, что пути могут быть ошибочными. Узнать верные пути к файлам позволит команда whereis. Как читатель уже понял, строка, описывающая интерпретатор для выполнения сценария, указывается самой первой. Но это— не обязательное условие. Рассмотрим два варианта запуска сценариев на выполнение. Первый — с указанием интерпретатора, который будет обрабатывать файл: > sh /hello.sh Hello, World
154 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Данный вариант не требует наличия строки, указывающей на файл интерпретанц для обработки сценария. Более того, такой вариант не требует установленного бита"« ecutable" для файла сценария. Во втором случае сценарий можно запустить по имени файла сценария, находясь том же каталоге, или же указав относительный/абсолютный пути, находясь в другом i талоге. При этом должны выполняться два условия: пользователь должен иметь при исполнять данный файл, и файл должен содержать строку с путем к исполняемому фа| лу интерпретатора: > /hello.sh /hello.sh: Permission denied. > chmod +x /hello.sh > /hello.sh Hello, World Вторая строка в листинге 5.7 — пустая. Пустые строки можно использовя в любом месте программы — они не влияют на ход исполнения сценария. Четвертая строка листинга позволяет вывести данные на стандартное устройств вывода с помощью команды echo. По окончании вывода данная команда автоматиад ски выполняет переход на новую строку. Если команду echo указать без аргументов,! будет выведена пустая строка. В случае использования аргументов следует помнить, чк текстовые данные должны быть заключены в "кавычки", иначе, при наличии внутри ни символа пробела или табуляции, они будут восприниматься как несколько разных аргу ментов. Хотя в рассмотренном примере не была явно указана команды выхода из про граммы, она будет подставлена автоматически, а ее значением будет код завершена последней команды. Для явного указания используется команда exit с кодом заверив ния, например: exit О Код завершения позволяет вызывающей программе узнать результат выполнен» программы и, в зависимости от его значения, выполнить те или иные действия. В после дующих примерах мы будем явно указывать команду exit с необходимым кодом я вершения. Следует запомнить, что код завершения 0 всегда обозначает успешное за вершение программы. Вместо команды echo мы могли бы использовать команду print f. Эта команд более гибкая в использовании и позволяет форматировать выводимую строку на сво усмотрение. Следует обратить внимание на то, что после вывода данных она не выпол няет перехода на новую строку. В случае использования команд printf и exit программа из листинга 5.7 прима вид, соответствующий листингу 5.8. Листинг S.H. Программ» из листинга* ;7 с ислояьаотанием команд prints wWit v #!/bin/sh # /hello.sh printf "Hello, World\n" exit 0 Символ обратной косой "\" — управляющий и указывает, что следующий за ни символ имеет специальное значение. В данном примере последовательности \n com ветствует символ новой строки. Без указания данной специальной последовательности! результате выполнения программы hello, sh с использованием команды printf и был бы выполнен переход на новую строку, и командная строка запроса оказалась & непосредственно после вывода команды, что не очень эстетично: > /hello.sh Hello, World#
Основы программирования 155 Перечислим управляющие символы: \а — звуковой сигнал, который подается на системный динамик; \Ь — вывод символа "Backspace"; \с — подавление вывода всей подстроки, следующей за данным управляющим символом, включая другие управляющие символы; \е — вывод спецсимвола "ESC" (в наборе ASCII — Oxlb); \f — разрыв страницы — при выводе на печать позволяет осуществить печать нового листа, на терминале — прокрутить содержимое на один экран (перевод строки и прокрутка экрана таким образом, что новая команда будет вводиться в первой строке терминала); \п — переход на новую строку; \г — возврат каретки (переход курсора к первому символу строки) — с его помощью можно создать "бегущую строку", когда на терминале постоянно меняется текст в одной строке; \t — установка символа горизонтальной табуляции (просто табуляция); \v — печать символа вертикальной табуляции; \\ — символ косой черты; \ ' — символ одинарной кавычки; \" — символ двойной кавычки; \0nnn — печать символа из набора ASCII по его восьмеричному значению. Использование переменных Ранее в этой главе были рассмотрена работа с переменными среды и оболочки. Использование переменных при написании программ командного интерпретатора (сценариев) несколько отличается от использования в самой оболочке, но их назначением остается хранение изменяемых данных. Чем же отличается применение переменных среды и оболочки (фактически — сценария) при написании сценариев и при использовании в самой оболочке? Главным образом, областью видимости: переменные сценария видны только самому сценарию в момент его выполнения, а переменные среды — всем остальным сценариям в текущий момент работы в среде. Следует отметить, что все переменные при написании программ командного интерпретатора хранятся как строки, а с переменными, которые представлены как числа, можно производить арифметические операции. При использовании переменных у многих возникает вопрос о том, как их правильно именовать. Действительно, в разных языках программирования присутствуют свои замечания по этому поводу, но практически всегда применяется следующее правило: имя переменной может содержать буквы, цифры и символ подчеркивания, но при этом не может начинаться с цифры. Относительно регистра символов мы не будем приводить никаких правил — это дело вкуса, однако имена переменных среды все-таки желательно писать прописными символами. Примеры имен переменных: myvar, icounter, tmp_text, i2 и т.п. Итак, для инициализации переменной в сценарии ей необходимо присвоить значение (невозможно присвоить переменной пустое значение). При этом заранее объявлять тип и имя переменной не обязательно. Например, для объявления переменной icounter и присвоения ей значения, равного единице, используется следующая команда: icounter=l Следует обратить особое внимание на использование пробелов! Имя переменной, знак равенства и значение должны быть размещены вплотную, без промежуточных разделительных символов (пробел или табуляция). Пробел или табуляция могут находиться только перед именем переменной или после ее значения.
156 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK После объявления переменной к ее значению можно получить доступ по имен с предшествующим знаком доллара $. Рассмотрим пример с выводом текста программу и результатом ее выполнения: > more /hello.sh #!/bin/sh uname=informex printf "Hello, $uname\n" exit 0 > /hello.sh Hello, informex В некоторых случаях подставлять имя переменной в виде $uname не желательно, так как это может привести к некорректному поведению программы. Рекомендуем все- гда заключать имена переменных в фигурные скобки { }, например, $ {uname}. В противном случае, может произойти примерно следующее: > more /hello.sh #!/bin/sh object=pencil printf "One $object, but a lot of $objects\n" exit 0 > /hello.sh One pencil, but a lot of Данная программа будет работать правильно только в том случае, если заключил имена переменных в фигурные скобки: > more /hello.sh #!/bin/sh object=pencil printf "One ${object), but a lot of ${object}s\n" exit 0 > /hello.sh One pencil, but a lot of pencils Для тех, кто хочет использовать значение одной переменной в качестве значении другой, следует запомнить, что имя переменной, которой будет присвоено новое значение (слева от знака "="), должно быть указано без ведущего знака $, а имя переменной, соответствующей присваиваемому значении (справа от знака "="),—со знаком $. Присваивать переменной разрешено не только переменную, но и переменную с другим! данными. Рассмотрим следующий пример: > more /hello.sh #!/bin/sh object=pencil objects="${object}s" printf "One ${object}, but a lot of ${objects)\n" exit 0 ' > /hello.sh One pencil, but a lot of pencils С помощью знакомой нам подстановки команд при использовании обратного апострофа " *" переменной можно присвоить результат выполнения другой команды. В качестве примера создадим простое приложение, которое выводит приветствие пользователю, запустившему программу: > more /hello.sh #!/bin/sh ulogin='whoami' uname='finger ${ulogin} | grep " ${ulogin} " | cut -f 3 -d ":""
Основы программирования 157 echo "Hello,${uname}" exit 0 > /hello.sh Hello, Charlie Root Ввод данных Разобравшись с применением переменных, можно приступить к рассмотрению ввода данных, а точнее — получения значения со стандартного устройства ввода и присвоения его некоторой переменной. Заметим, что данные могут быть получены не только в результате ввода пользователем с клавиатуры, но также и из файла. За ввод данных отвечает поток STDIN. Для чтения из этого потока используется команда read. Обращаем внимание на то, что команда read при передаче ей одного имени переменной воспринимает весь входящий поток как целую строку даже при наличии символов пробела или табуляции. По этой причине при вводе можно не заботиться о правильном использовании кавычек: > more /hello.sh #!/bin/sh printf "Input you name: " read uname printf "Hello, ${uname}\n" exit 0 > /hello.sh Input you name: Alexander Hello, Alexander Другое дело, когда команде read было передано несколько имен переменных подряд. В таком случае каждый пустой символ будет разделителем, и введенные значения будут последовательно присваиваться указанным переменным. Например: > more /hello.sh #!/bin/sh printf "Input your name, surname, and additional information: " read uname usurname add printf "\nHello, ${uname} ${usurname}\n" printf "Other information: ${add}\n" exit' 0 > /hello.sh Input your name, surname, and additional information: Alexander Didok ^Birth - July 19 1980 Hello, Alexander Didok Other information: Birth - July 19 1980 Как можно заметить, первая переменная приняла значение Alexander, вторая — Didok и третья — всю оставшуюся часть введенной строки. О том, как получать данные из файла, будет рассказано в отдельном подразделе, так как этот вопрос подразумевает использование циклов, которые будут рассмотрены чуть позже. К одному из вариантов ввода данных можно отнести передачу аргументов в программу при ее вызове в командной строке. Таких аргументов может быть до девяти (в некоторых интерпретаторах — как правило, поддерживающих стандарт POSIX — разрешено использование и большего количества аргументов). В ходе выполнения программы значения аргументов командной строки доступны через специальные переменные $1, $2, ... $ 9. Существуют и другие специальные переменные. Например, $ @ — это вся строка аргументов, $#— количество переданных аргументов, $0 — имя
158 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK сценария, $? — код возврата последней выполненной команды, $* — все аргументу как одна строка (заключены в одни общие кавычки) и т.д.: > more hello.sh #!/bin/sh echo "Command: $0 $*" exit 0 > /hello.sh testl test2 test3 Command: /hello.sh testl test2 test3 Выполнение арифметических операций Поскольку командный интерпретатор хранит все значения переменных в виде строк, над ними невозможно производить арифметические операции стандартными методами. Однако это вполне возможно с помощью подстановки команд, а точнее — благодаря команде ехрг. Общий формат этой команды имеет следующий вид (разделяющие пробелы обязательны): ехрг число операция число В случае использования нечисловых данных в результате выполнения команды ехрг будет получен строковый результат с описанием ошибки. л Разрешено использовать пять арифметических операций: + — сложение; вычитание второго числа из первого; * —умножение; / — деление первого числа на второе (остаток будет отброшен, "округление до наименьшего целого"); % — получение остатка от деления (модуль деления). При использовании некоторых из этих операций символы, которые в интерпретаторе имеют специальное значение (например, * — замена любой последовательности ю любых символов), необходимо экранировать обратной косой "\". Для того чтобы в вызовах команд можно было воспользоваться именем переменной, ее следует предварительно экспортировать. Рассмотрим несколько примеров использования команды ехрг в сценариях и полученный результат: > more /hello.sh #!/bin/sh export varl="expr 2+2' export var2="expr 4 \* 3' printf "varl=${varl}\nvar2=${var2}\n" echo var3=,expr $varl + $var2~ exit 0 > /hello.sh varl=4 var2=12 var3=16 Кроме выполнения арифметических операций, команда ехрг используется для ре- шения логических задач, проверки равенств и сравнения строк. К таким операции можно отнести операции сравнения: = (равно), ! = (не равно), > (больше) и < (меньше! Результатом выполнения такой операции будет 0, если условие не выполняется, и 1,ес-
Основы программирования 159 ли выражение истинно. При этом не следует забывать об экранировании символов > <, гак как в интерпретаторе они используются в качестве операции перенаправления. Рассмотрим небольшой пример использования операций сравнения: > more /hello.sh H!/bin/sh echo "2+3+4=3*3?:" 'expr 2+3+4=3\*3' echo "4 > 3 ?:" 'expr 4 \> 3' echo "4 < 3 ?:" "expr 4 \< 3' echo -n "V'Hello my friend!\" - V'Hello my friends!\" ?: " echo "expr "Hello my friend!" = "Hello my friends!"' # true (1), # false (0) exit 0 > /hello.sh 2+3+4=3*3?: 1 4 > 3 ?: 1 4 < 3 ?: 0 "Hello my friend!" = "Hello my friends!" ?: 0 Кроме команды expr, в системе FreeBSD присутствуют команды be и test. Они описаны в справочном руководстве, и здесь мы их рассматривать не будем. Упомянем только то, что утилита be используется для выполнения сложных операций над числами с плавающей точкой (и не только). В целом, be — это язык программирования математических операций. Утилита test используется для сравнения данных по заданным критериям и применяется в управляющих конструкциях, к рассмотрению которых и перейдем. Управляющие конструкции Само собой разумеется, что все рассмотренные выше примеры не могут найти реального применения в системе, поскольку не принимали никаких решений, а лишь четко следовали указаниям пользователя. Всю мощь программирования в SHELL (как и в любом другом языке программирования) представляют управляющие конструкции, к которым относятся циклы и условия. С их использованием поведение программы будет меняться в зависимости от различных условий. Циклы Нередко бывает так, что один и тот же фрагмент кода программы приходится повторять несколько раз до тех пор, пока некоторое выражение не станет истинным или перестанет быть истинным. Чаще всего это происходит при обработке массивов данных, например, при последовательном чтении файлов с выполнением определенных действий с каждой новой строкой. Такая конструкция и называется циклом. В языке SHELL существует несколько разновидностей циклов, что приближает его к языкам высокого уровня. Типы циклов различаются по характеру выхода из них: одни могут быть прерваны, так и не выполнив никаких действий, другие же выполняют как минимум одну операцию. Наибольшая проблема при использовании циклов— неправильное задание условия выхода, что может привести к зацикливанию программы. В языке SHELL используются три различные конструкции циклов: while, until и for. Цикл while Суть цикла while состоит в том, что блок заключенных в него операторов выпол- | няется до тех пор, пока условие остается истинным (не станет ложным). Общий формат конструкции while выглядит следующим образом:
160 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK while условнаяКоманда do команда done Обращаем внимание на то, что в первую очередь проверяется результат условно! команды, и только в том случае, если он истинен, будет выполнен блок команд, заключенный между do и done (тело цикла). Если с первой же попытки условная команда возвращает ложное значение, блок команд выполнен не будет. Пример программы, использующей цикл while, представлен в листинге 5.9. Листинг 5.9. Пример вывода всех чисел от единицы до введенного пользователем с использованием цикла while ; #!/bin/sh printf "Vvedite chislo: " read chislo i=l while [ $i -le $chislo ] # line 5: test do printf $i" " i='expr $i + 1' done echo exit 0 Результат выполнения программы из листинга 5.9 при введенном числе 20 буди следующий: > ./cicle.sh Vvedite chislo: 20 1 2 3 4 5 б 7 8 9 10 11 12 13 14 15 16 17 18 19 20 В данной программе, кроме стандартных операций вывода данных, использованш команды ехрг и команды выхода из программы, появился новый тип команды. Это- команда text в условии цикла while (пятая строка листинга). Команда test позволяет определить истинность выражения, заключенного в квадратные скобки (между скобкой и условным выражением обязательно должен стоять пробел). В данном примере использовалось сравнение -1е (истинно, если первый операнд меньше или равен второму). Кроме этого сравнения, существует ряд других. некоторые из которых перечислены в табл. 5.1. Таблица 5.1. Список некоторых операций сравнения утилиты test Описание Истина,:еслип1 равно п2 Истина, если nl не равно п2 Истина, если nl больше п2 Истина, если nl больше или равно п2 Истина, если nl меньше п2 Истина, если nl меньше или равно п2 Истина, если строки si и s2 идентичны Истина, если строки si и s2 не идентичны Истина, если числовые.значения символов в строке si меньше, чем: в строке s2 Истина, если строка si следует после s2 на основе сравнения числовых значений их символов Операция nl -eq n2 nl -ne n2 nl -gt n2 nl -ge n2 nl -It n2 nl -le n2 si = s2 si != s2 si < s2 si > s2
Основы программирования 161 Итак, программа из листинга 5.9 последовательно в цикле увеличивает на единицу значение переменной $i от 1 до введенного пользователем. Как только значение $i станет больше введенного пользователем числа (условие цикла ложно), управление будет передано команде, следующей за оператором done. Цикл until Цикл until является прямой противоположностью циклу while. To есть, он позволяет выполнять блок команд до тех пор, пока условие ложно и не станет истинным. Формат конструкции until схож с форматом конструкции while: until условнаяКоманда do команда done В целом, циклы while и until взаимозаменяемы и по результату не отличаются. Единственное что необходимо изменить, кроме имени, — это условие цикла на противоположное по смыслу. К примеру, пятая строка из листинга 5.9 должна будет принять следующий вид: until [ $i -gt $chislo ] # line 5: test Команда shift Прежде, чем перейти к рассмотрению цикла for, разберемся с командой shift, с помощью которой можно добиться аналогичного результата. Команда shift позволяет обрабатывать произвольное число аргументов, введенных в командной строке при вызове сценария. Рассматривая ввод данных, мы уже упоминали о некоторых специальных переменных: $*, $# и т.д. Так вот, если требуется последовательная обработка всех аргументов командной строки, а их количество заранее не известно, то на помощь приходит команда shift. Эта команда выполняет сдвиг аргументов на одну позицию влево с удалением значения первой переменной. Фактически, при сдвиге удаляется переменная $1, и переменная $2 становится вместо нее переменной $1. То же самое происходит и с остальными переменными. Рассмотрим следующий простой пример использования команды shift: > more shift.sh #!/bin/sh until [ $# -eq 0 ] do echo "You have value equal $1 now. 'expr $# - 1' params remain" shift done exit 0 > ./shift.sh 1 3 5 56 You have value equal 1 now. 3 params remain You have value equal 3 now. 2 params remain You have value equal 5 now. 1 params remain You have value equal 56 now. 0 params remain Ранее мы упоминали, что некоторые интерпретаторы имеют возможность доступа только к девяти аргументам командной строки. Так вот, использование команды shift позволяет обойти это ограничение. Напишем программу, которая будет суммировать все аргументы командной строки, независимо от количества введенных аргументов:
162 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK > more shift.sh #!/bin/sh suinm=0 until [ $# -eq 0 ] do suinm=,expr $suiran + $1" shift done echo $summ exit 0 > ./shift.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 91 Еще один распространенный вариант использования команды shift —для пои довательной обработки всех файлов, имена которых введены как аргументы при вызм сценария из командной строки. С командами, предназначенными для работы с файлам мы еще не знакомы, поэтому для данного варианта пример рассматривать не будем. Для того чтобы выполнить сдвиг на количество позиций больше одной, необхода указать их число пропускаемых сдвигов в команде shift, например: shift 2 Цикл for Третий тип циклической конструкции в SHELL — это for. Данный цикл поли стью отличается от конструкций, рассмотренных ранее. Здесь не задается условие, и торое может принимать значение "истина" или "ложь". Вместо этого, цикл for основ на повторении блока операторов для каждого аргумента в заданном списке. При каждо следующей итерации переменная, заданная в условии цикла, принимает следующ значение из списка аргументов. Цикл будет продолжаться до тех пор, пока не будетi пользован каждый аргумент из списка. После выполнения всех итераций цикла упри ление передается команде, следующей за оператором done. Общий формат цикла for: for имяПеременной in аргумент1 аргумент2 ... аргументп do команда done Рассмотрим пример измененной программы на SHELL для суммирования аргумя тов командной строки с применением цикла for: > more for.sh #!/bin/sh summ=0 for chislo in $* do surom='expr $suinm + $chislo' done echo $sunim exit 0 > ./for.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 91 Использование в условиях циклов операторов ££ (И) и | | (ИЛИ) В случае применения циклов while и until можно задавать несколько услои одновременно с использованием операторов && и | |. Суть данных операторов заклн?|
Основы программирования 163 яся в том, что выражение, объединенное с помощью &&, будет истинным только тогда, югда оба операнда истинны, а выражение, объединенное с помощью | |, — когда хотя бы один из операндов истинен. Выход из цикла. Использование условий trv.su false Иногда в программировании используются так называемые бесконечные циклы, или циклы, которые всегда удовлетворяют условию. Данные циклы довольно просто создать с помощью условных команд true и false. Выход из таких циклов происходит по команде break. Кроме безусловного прерывания выполнения цикла, существует также команда continue безусловного перехода на новый виток выполнения (с пропуском оставшихся невыполненных команд в теле цикла). Таким образом, следующая конструкция: while true do команда done будет выполняться бесконечно вплоть до момента, когда будет выполнена команда break. Вышесказанное справедливо и для цикла until: until false do команда done Для прерывания программы с бесконечным циклом можно воспользоваться комбинацией клавиш Ctrl-C (Ctrl-Break). В действительности, такие циклы прерываются благодаря возможности внутри цикла задавать условные конструкции, в которых и размещать команду exit. Перейдем к их рассмотрению. Условные конструкции Для того чтобы программа могла "принимать решения", в ней необходимо применять условные конструкции. Большинство оболочек предоставляют удобные конструкции if-then, case и их расширения. Рассмотрим вкратце те конструкции, что предоставляет язык SHELL в интерпретаторах семейства Bourne. Конструкция if-then Наиболее простой конструкцией принятия решения является конструкция if- then. Она позволяет, в зависимости от некоторого условия, пропустить выполнение блока команд или же выполнить его. Синтаксис данной конструкции следующий: if командаУсловие then команда команда fi • Что в данном случае означает командаУсловие? Интересный вопрос! Ранее уже отмечалось, что каждая команда возвращает код завершения (значение переменной $?). Так вот, именно на его основании конструкция if-then и "принимает решение". Если командаУсловие возвращает код успешного завершения (0), то выполняется блок после оператора then и далее — за f i. В противном случае, блок команд между then и fi игнорируется, и выполняется переход к команде, следующей за f i. Как видим, все довольно просто.
164 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Простой пример использования конструкции if-then: > cat if.sh #!/bin/sh printf "Vvedite chislo bolshe 10: " read chislo if [ $chislo -le 10 ] then echo "Oshibka!!!" fi exit 0 > ./if.sh Vvedite chislo bolshe 10: 6 Oshibka!!! > ./if.sh Vvedite chislo bolshe 10: 23 > Во многих случаях такой вариант принятия решения не подходит. Но не стоит ра страиваться, существует еще несколько более развитых условных конструкций. Р« смотрим их. Конструкция if-then-else Часто бывает так, что в зависимости от истинности или ложности условия необ» димо выполнить различную последовательность команд. Такую возможность предо тавляет конструкция if-then-else, значительно расширяющая гибкость конструкт if-then. Синтаксис данной конструкции следующий: if командаУсловие then команда команда else команда команда fi В данном случае, при истинности командыУсловия будет выполнен блок the иначе — блок else. Как видим, в любом случае будет выполнен какой-либо блок (еа блок не состоит из пустой команды — двоеточия :). В качестве примера использования конструкции if-then-else расширим тен программы из предыдущего подраздела (if-then): > cat if.sh #!/bin/sh printf "Vvedite chislo bolshe 10: " read chislo if [ $chislo -le 10 ] then echo "Oshibka!!!" else echo "Vvedeno chislo ${chislo}, kotoroe bolshe 10" fi exit 0 > ./if.sh Vvedite chislo bolshe 10: 6 Oshibka!!! > ./if.sh Vvedite chislo bolshe 10: 234
Основы программирования 165 Vvedeno chislo 234, kotoroe bolshe 10 Отметим, что разрешено вложение условных конструкций. В некоторых случаях возникает необходимость проверки большего числа условий. Эту задачу можно решить и с помощью последовательного использования (или вложения, в зависимости от поставленных задач) конструкций if-then-else, однако существует гораздо более пропой вариант: оператор elif (в других языках известен как else if или elseif). Структура конструкции при этом выглядит следующим образом: if командаУсловие then команда команда elif командаУсловие then команда команда elif командаУсловие then команда команда fi В данном случае вначале проверяется условие в операторе i f, и если оно истинно, выполняется блок then (после чего управление передается команде за оператором f i). Если же условие if ложно, то проверяется условие в первом операторе elif. Если данное условие истинно, то выполняется блок then, следующий за истинным условием вплоть до следующего оператора elif или f i, после чего управление также передается следующей команде после оператора f i. В противном случае проверяется следующее условие elif и т.д. Обращаем внимание на то, что если не будет найдено ни одного истинного условия, то не будет выполнено ни одного блока команд. Если требуется выполнить некоторые команды при отсутствии истинного значения, то можно воспользоваться блоком else. Естественно, его следует включить в конструкцию if-then-elif. Рассмотрим простой пример использования вышеупомянутой конструкции: > cat if.sh #!/bin/sh printf "Vvedite chislo bolshe 10 i menshe 100: " read chislo if [ $chislo -le 10 ) then echo "Oshibka!!! Chislo ${chislo} <= 10" elif [ $chislo -ge 100 ] then echo "Oshibka!!! Chislo ${chislo} >= 100" else echo "Vvedeno chislo $(chislo), kotoroe > 10 i < 100" fi exit 0 > ./if.eh Vvedite chislo bolshe 10 i menshe 100: 5 Oshibka!!! Chislo 5 <= 10 > ./if.eh Vvedite chislo bolshe 10 i menshe 100: 123 Oshibka!!! Chislo 123 >= 100 > ./if.eh Vvedite chislo bolshe 10 i menshe 100: 56 Vvedeno chislo 56, kotoroe > 10 i < 100
166 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Конструкция case Вместо последовательного применения if-then-else или их множественно! вложения (или варианта el if где одна переменная проверяется на различные значени намного проще применить конструкцию case: case переменная in шаблон) команда команда;; шаблон2) команда команда;; *) команда команда;; esac Данная конструкция последовательно проверяет значение перемененной на com ветствие шаблону (могут применяться специальные символы). В случае совпадения ш полняются команды вплоть до двойного символа ";;" (ограничитель блока комащ Если ни один шаблон не подошел, будут выполнены команды для шаблона *, которн необходимо разместить в самом конце конструкции case (не обязателен). Заметим, 41 всегда выполняется только один блок команд: первый встретившийся, даже если сущ ствует несколько шаблонов, которым удовлетворяет значение переменной. Обращаем внимание на то, что возможно связывание различных шаблонов, если и соответствует одинаковый набор команд. Для этого используется символ вертикальна черты ("|"),разделяющей различные шаблоны: шаблон1 | шаблон2) команда команда;; Нередко оператор case используется для задания интерактивных вопросов поли вателю. В таких случаях никто не может точно сказать, какой регистр символов пользе ватель будет использовать. Для решения такого опроса используются конструкции, ш подобие [уУ] [еЕ][sS] I [yY]. Пример использования конструкции case будет рассмотрен чуть пои в подразделе, посвященном функциям. Оператор esac сообщает о завершении коно рукции case. Работа с файлами Вызывать другие программы для манипуляции файлами довольно неудобно. Таи неправильно ожидать, что пользователь программы додумается перенаправить резул таты ее работы в какой-либо файл или укажет необходимый файл в командной строк По этой причине программа должна уметь сама открывать файлы, считывать инфорю цию или записывать ее. Для этого в SHELL нет специальных функций, а работа с фай лами реализована с помощью стандартных потоков ввода STDIN, вывода STDOUTi ошибок STDERR. Для того чтобы открыть тог или иной поток, необходимо воспользоваться команд! exec с указанием направления (ввод/вывод) и файла ввода/вывода. Например, перею правление вывода информации в файл /tmp/file.txt может выглядеть следующи образом (программа суммирования чисел, введенных как аргументы командной строю и записи результата во внешний файл): > cat out.sh #!/bin/sh
• summ=0 for chislo in $* do summ="expr $summ + $chislo' done exec > /tmp/file.txt echo $summ Основы профаммирования 167 exit 0 > ./out.sh 10 20 30 40 > cat /tmp/file.txt 100 i Для понимания того, как получить информацию из внешнего файла, рассмотрим 'следующий пример: > cat in.sh #!/bin/sh for FNAME in $* do exec < ${FNAME} while read line do echo $line done done exit 0 > ./in.eh /tmp/file.txt .profile 100 i # $FreeBSD: src/etc/root/dot.profile,v 1.20 1999/08/27 23:24:09 peter Exp $ # PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr /XllR6/bin export PATH H0ME=/root export HOME TERM=$(TERM:-cons25) export TERM PAGER=more export PAGER Коды завершения Ранее мы упоминали, что код завершения 0 всегда обозначает успешное завершение программы. Все другие коды завершения, как правило, указывают на ошибочное завершение программы. Напоминаем, что код завершения предыдущей команды хранится впеременной $?: I # ps aq I ps: illegal option — q ! usage: ps [-aCcefHhjlmrSTuvwXxZ] [-0 fmt | -o fmt] [-G gid[,gid...]] [-M core] [-N system] [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]] ps [-L] # echo $? 1 Используя значение данной переменной, можно изменять поведение вызывающей программы. Но давайте прежде определимся не с тем, как использовать коды заверше-
168 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK ния, а как их устанавливать. В первую очередь, стоит упомянуть, что любая комац сценария устанавливает код завершения так же, как и любая другая программа оболо ки. При этом программа при завершении возвращает или код завершения, установив ный командой exit, или же по умолчанию принимается код завершения последней и полненной команды сценария. Рассмотрим пример программы, в которой устанавливается несколько кодов заве) шения в зависимости от различных условий: > more exit.sh #!/bin/sh for FNAME in $* do if [ -r $<FNAME} ] then echo "File ${FNAME} found" else echo "File ${FNAME} not found" exit 1 fi if 'ш ${FNAME}' then echo "... and deleted" else echo "... and not deleted" exit 2 fi done exit 0 > ./exit.sh /tmp/nofile File /tmp/nofile not found > echo $? 1 > ./exit.sh /tmp/file File /tmp/file found ... and deleted > echo $? 0 > ./exit.sh /tmp/ File /tmp/ found rm: /tmp/: is a directory ... and not deleted > echo $? 2 Как видим, в зависимости от различных условий выполнения программы, меняете код завершения. Если файл был найден и успешно удален, то код завершения будет0- успешное завершение. Если файл не был найден, то будет возвращен код завершения] если же файл найден, но попытка его удаления не увенчалась успехом, то будет уст» новлен код завершения 2. Именно благодаря такому поведению рассмотренной программы, другие прогрл мы, вызывающие ее, могут быть написаны для принятия различных решений в свое поведении в зависимости от кода завершения. Функции Все языки программирования позволяют описывать функции, благодаря которы можно объединить множество команд в одну именованную группу и затем вызвать) по имени. Формат описания функций в SHELL прост и имеет следующий синтаксис: ,
Основы программирования 169 имяФункции () ( команда команда } Благодаря возможности создания функций, программу можно сделать более структурируемой и читаемой, уменьшить размер программного кода. Кроме того, можно изменять поведение программы, только изменяя функции. Рассмотрим следующий пример: > cat fune.eh #!/bin/sh accept () ( while true do printf "Remove ${FNAME)? (y/n): " read ans case $ans in [yY]) return 0;; [nN]) return 1;; *) echo "Please, type у or n";; esac done } for FNAME in $* do if accept then if 'rm ${FNAMET then echo "File ${FNAME) deleted" else echo "File $(FNAME) not found" fi else echo "File ${FNAME) not deleted" fi done exit 0 > le /tmp password qwe > ./£une.eh /tmp/paesword /tmp/qwe /tmp/nofile Remove /tmp/password? (y/n): у File /tmp/password deleted Remove /tmp/qwe? (y/n): n File /tmp/qwe not deleted Remove /tmp/nofile? (y/n): у rm: /tmp/nofile: No such file or directory File /tmp/nofile not found > Is /tmp qwe Как видим, благодаря написанию отдельной функции для подтверждения удаления файла, намного упростился код самой программы: он стал гораздо более читабельным. Представьте себе, как бы выглядела реализация подобной задачи при отсутствии возможности создавать функции? Обращаем особое внимание на тот факт, что переменные внутри программы доступны также и всем ее функциям.
170 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Команда trap При написании программы на SHELL нельзя гарантировать, что другой пользователь, который будет использовать ее, не нарушит ее правильную работу прерывание!) (послав некоторый сигнал завершения через kill). Также нельзя гарантировать, что при выполнении программы сеанс не будет аварийно завершен, или что в системе не произойдет сбой. Как застраховаться от подобных случаев? Как пользователю запретить посылать запросы на прерывание работы программы или удалить временные файлы, созданные программой во время работы и удаляемые по окончании ее работы? Для этого интерпретатор использует команду trap (перехват события). Общий формат данной команды следующий: trap команда списокСигналов В FreeBSD имеется 15 сигналов, которые можно послать любому процессу, и которые можно перехватить. Исключение составляет сигнал под номером 9: он предназначен для тех случаев, когда программа не отвечает на другие сигналы прерывания работы процесса и используется, или когда программа фактически находится в "зависшем" состоянии. При получении данного сигнала любая программа должна моментально прекратить работу. Как правило, при выполнении некоторых операций в программе потребуется застраховаться только от нежелательных действий пользователя по прекращению работы. К таким сигналам относятся: 1 — обрыв сеанса (HUP); 2 — прерывание пользователем (INT, по нажатию <Ctrl+C>); • 3 — выход (QUIT); 15 — стандартный сигнал прекращения работы kill (TERM). Вышеупомянутый вариант работы с промежуточными файлами и есть основной случай, когда необходимо застраховаться от подобных действий. Но сперва напишек программу, которая отображает текстовое сообщение о завершении своей работы при посылке одного из перечисленных ранее сигналов. Код программы на SHELL и результат ее выполнения имеют следующий вид: > more trap.sh #!/bin/sh trap 'echo "Quit after user inerrupt"; break1 1 2 3 15 while true do done exit 0 > ./trap.sh "CQuit after user inerrupt Данная программа входит в бесконечный цикл, который можно прервать по нажатию комбинации клавиш <Ctrl+C>. Обращаем внимание на то, что бесконечный цикл прерываем, однако при установке перехвата с помощью trap его можно сделать практически бесконечным. Такое произойдет, если после вывода текстового сообщения не установить явно операцию прерывания цикла break или выхода из программы exit (предпочтительнее). Для запрета завершения программы по нажатию комбинацш <Ctrl+C> необходимо просто установить следующий перехват (без каких либо команд): trap '' 2 Для того чтобы программа не прерывалась при обрыве сеанса связи пользовател!, необходимо установить следующий перехват: trap : 1
Основы программирования 171 Следует также упомянуть, что команды должны быть заключены в одинарные или парные кавычки, при этом, командам, заключенным в одинарные кавычки, в отличие от команд, заключенных в парные кавычки, нельзя передать переменные сценария. К примеру, следующая команда не будет иметь смысла, так как вместо $FNBASE не будет подставлено значение данной переменной: trap 'rm /tmp/$FNBASE.*; exit" 1 2 3 15 Правильно будет записать так: trap "rm /tmp/$FNBASE.*; exit" 1 2 3 15 Обращаем внимание на то, что перехват для каждого сигнала может быть только один и хранится в специальной таблице. Вызов команды, установленной с помощью trap, происходит только в момент прерывания по определенному сигналу. На этом рассмотрение программирования на SHELL закончим. Более подробная информация может быть найдена в справочном руководстве по интерпретатору. Язык обработки шаблонов AWK Программирование на SHELL полезно для написания программ, предназначенных для решения сложных и повторяющихся задач. При этом для простой обработки текстовых данных SHELL использовать не рекомендуется, так как это занимает много времени и не оправдывает затраченных усилий. В то же время, существует несколько утилит, позволяющих довольно просто описать обработку сложных текстовых данных. Некоторых из них мы рассмотрели в главе 4, "Основы работы в системе. Базовые команды", сейчас же поговорим об очень популярном и мощном языке обработки шаблонов AWK. Что же такое AWK? Существуют разные трактовки данного понятия. Для одних это просто команда поиска и преобразования текста, более мощная, чем grep/egrep (не обладает функциями преобразования текста), для других же — довольно серьезный язык программирования (с мощными функциями по обработке текстовых данных). Более правильно назвать AWK фильтром, поскольку он не имеет встроенной возможности открытия/изменения/сохранения файлов, а работает только с файлами, указанными в командной строке при вызове. Данная утилита возникла в результате объединения возможностей редактора sed и программы поиска grep. Обращаем внимание на то, что справочное руководство по AWK довольно маленькое, но при этом существует много книг, описывающих его возможности. Язык AWK получил широкое распространение, благодаря своей простоте, удобству вызова и возможности обрабатывать сложные массивы текстовых данных командами, состоящими всего лишь из нескольких строк. При этом утилите awk (программа, реализующая возможности языка AWK) можно передать весь текст программы как из командной строки, так и описать его в файле, который затем передать на вход утилиты с помощью специального ключа. Об этом — чуть позже... Итак, первое, что необходимо запомнить, — awk производит сканирование входящего потока и над каждой строкой, удовлетворяющей заданному образу (шаблону) производит определенные, строго описанные действия по преобразованию текста с передачей результата в стандартный поток вывода. При этом исходные файлы с обрабатываемыми данными не модифицируются. Запомните также то, что строка может содержать максимум 256 символов. Рассмотрим структуру программы на языке AWK, так как она имеет строгое описание. Структура программы на языке AWK Любая программа на языке AWK состоит из набора операторов (или правил), имеющих следующий вид:
172 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK шаблон (действие) шаблон (действие) В некоторых (частных) случаях, шаблон или действие могут быть опущены: правило, принимающее вид (действие), будет выполняться для всех строк, № зависимо от шаблона (так как шаблон не был указан); правило принимающее вид шаблон позволяет просто вывести список неизмененных строк, которые удовлетворяют заданному шаблону (шаблон может принимал вид регулярного выражения; выражения отношения; быть комбинацией образцов; или же быть словами BEGIN и END). Шаблоны рассматривались выше, но что же в понятиях AWK обозначает действие? Действие в контексте языка AWK — это вывод или печать, операция присваивания, вызов некоторой встроенной функции или же управляющая структура. Действие можи состоять из списка последовательно записанных операторов, разделенных символом";' (в одной строке), переводом строки или закрывающей скобкой. Каждая строка при сканировании рассматривается как состоящая из полей, разделенных некоторым специат- ным, заранее известным символом (по умолчанию, пробел). При рассмотрении SHELL мы познакомились со специальными переменными вида $0-59. Такие же переменные присутствуют и в AWK, однако формируются они несколько иначе. Каждая такая переменная позволяет ссылаться на поле сканируемой строки. Таким образом, получаем, что переменная $1 ссылается на первое поле в строке, $2 — на второе поле и т.д. Переменная $0 позволяет обратиться ко всей строке целиком. Следует обратить внимание на то, что сканируемая строка ограничена не только по длине, но и по количеству полей, на которые ее можно разбить, а точнее — кажда строка может содержать максимум 100 полей. Перейдем к рассмотрению простейших примеров использования awk. К примеру, будем сканировать некоторый входной файл awkl следующего формата (поля разделены символом пробела): Surname Initials Year Age Содержимое данного файла представлено в листинге 5.10 (AWK допускает испольг зование комментариев, которые, как и в SHELL, начинаются со знака "#")- Листинг 5.10. Пример входногочрайла awfci для обработки с помощью awk . Ivanov I.I. 1980 50 Petrov A.V. 1979 40 Sidorov 3.K. 1979 40 Starchenko O.N. 1970 60 Marchenko J.M. 1998 23 В качестве первого примера рассмотрим простую программу, позволяющую просто вывести все содержимое файла без каких-либо изменений. Добиться такого результата можно с помощью первого из вышеупомянутых частных случаев написания правил (только действие, без упоминания шаблона). Итак: # awk '(print)' awkl В данном примере была использована операция print для вывода информации. Как видим, на вход утилиты awk в одинарных кавычках был передан текст программы, состоящей из одного действия, а для обработки — файл awkl из листинга 5.10. В случае отсутствия в записи правила действия, по умолчанию будет выполнена операция print. Таким образом, можно написать простую программу поиска всех
Основы программирования 173 строк, удовлетворяющих некоторому шаблону (второй частный случай написания правил) следующим образом: # awk Vko/' awkl Starchenko O.N. 1970 60 Marchenko J.M. 1998 23 Данная программа выводит все строки, в которых есть подстрока "ко". Обратите внимание на то, как был записан шаблон. Немного позже мы более подробно рассмотрим, как задаются шаблоны, и их сложные вариации. Заметим, что следующий пример корректно работать не будет: # awk '/ко/ {)' awkl Такая программа всегда вернет пустой результат. Это обусловлено наличием фигурных скобок, которые требуют явного указания предпринимаемых действий, и опера- KHirprint в данном случае не будет подставлена автоматически. Рассмотрим еще один простой пример для исследования возможностей по преобразованию строк. Операция print может принимать аргументы, заключенные в скобки и перечисленные через запятую (при печати будут разделены символом пробела). Итак: # awk '/ко/ {print("Hello",$1)}' awkl Hello Starchenko Hello Marchenko Как видим, данная программа находит все строки, содержащие подстроку "ко", и выводит только содержимое первого поля с Предшествующим словом "Hello". Кроме рассмотренных примеров, отображающих структуру программы на языке AWK, необходимо упомянуть о возможности использования специальных операторов BEGIN и END. Оператор BEGIN используется в самом начале профаммы и позволяет определить начальные установки, а оператор END используется в самом конце программы и позволяет задать действия, выполняемые по окончанию обработки входящих данных. Общий формат профаммы на AWK при условии использования данных операторов примет следующий вид: BEGIN (действие} шаблон (действие} шаблон (действие} END (действие} Тем не менее, создавать профаммы с указанием нескольких шаблонов в одной строке, конечно же, не очень удобно и зачастую — затруднительно. Кроме того, это приводит к путанице и возникновению ошибок. По этой причине рассмотрим варианты вызова профамм на AWK. Вызов AWK Вызывать профаммы на языке AWK можно тремя способами, с первым из которых ны уже немного познакомились, но все же повторим еще раз. Итак, первый и простейший вариант вызова: awk [-Fc] 'текст программы на языке AWK' [файл ...] В данном случае текст профаммы заключен в одинарные кавычки и представлен в вызове команды awk как аргумент. Возможна опция вызова -Fc, где с — стандартный разделитель полей. Указывать входной файл не обязательно. Кроме того, для фильтрации одной и той же профаммой за один проход можно указать более одного файла. Поскольку указывать входной файл для обработки необязательно, можно передашь содержимое некоторого файла на вход утилиты с помощью конвейера. К примеру.
174 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK вызов следующей команды аналогичен одной из той, которые использовались выше пр изучении структуры программы на AWK: # cat awkl I awk '{print)' Файл для фильтрации также можно передать на вход утилиты и с помощью опера ции перенаправления: # awk '/ko/ {print}' < awkl Для того чтобы показать отличия в вызове одной и той же программы для одной входного файла, но при использовании различных разделителей полей, рассмотрим с» дующий пример: ft awk '/ko/ {print($1)}' awkl Starchenko Marchenko # awk -F. '/ko/ {print($1)}' awkl Starchenko О Marchenko J Первая команда примера выводит первые поля для строк, содержащих подстроц "ко". Вторая команда аналогична первой, за исключением разделителя, что привода к совсем другому результату. Причина, по которой результат получился именно в таки виде, станет ясна, если строки поля разбить по символу точки: Поле 1 •„, Поле 2 Поле 3 Starchenko О N - 1970 60г Marchenko J . М " 1998 23 Вот, в общем-то, и все, что касается первого варианта вызова. Второй формат вызова AWK Второй формат вызова часто используется при решении сложных задач и в техсл) чаях, когда команду необходимо часто запускать на выполнение. Этот вариант подразу мевает сохранение текста программы в файле на диске. Формат вызова следующий: awk [-Fc] -f ФайлСТекстомПрограммы [файл ...] В данном случае флаг -f указывает на то, что программу на языке AWK необход! мо извлечь из файла, путь к которому указан в качестве аргумента сразу же последа ного флага. Пример использования данного варианта вызова: ft more sample.awk /ko/ {print("Worker:",$l,"\tI I\t","Age:",$4)} ft awk -f sample.awk awkl Worker: Starchenko I| Age: 60 Worker: Marchenko " || Age: 23 Третий формат вызова AWK Третий вариант вызова основан на втором и заключается во включении в фа с программой на AWK sh-подобной строки, указывающей на оболочку, в которой буд производиться обработка сценария. В данном случае в качестве оболочки будет выл пать утилита awk. Для запуска такого сценария нет необходимости указывать команду awk с параш ром -f в командной строке — достаточно просто вызвать файл сценария и передать его вход список обрабатываемых файлов. Единственное замечание: как и любой друг sh-подобный сценарий, сценарий на awk должен иметь соответствующие устанга прав запуска для пользователя.
Основы программирования 175 Следующий пример иллюстрирует преобразование предыдущего файла программы на AWK для запуска в качестве сценария оболочки awk: fl more sample.awk К!/usr/bin/awk -f /ko/ {print("Worker:",$1,"\tI |\f \ "Age:", $4) } # chmod +x sample.awk # ./sample.awk awkl Worker: Starchenko I| Age: 60 Worker: Marchenko II Age: 23 Теперь можно перейти к рассмотрению основополагающих вопросов при изучении любого языка программирования: к использованию переменных и выражений. Использование переменных и выражений в AWK Как и в случае с SHELL, переменные в AWK являются динамическими, то есть такими, которые создаются в момент первого обращения к ним. В то же время, существенным отличием является наличие типизации переменных: в AWK переменные могут быть целыми числами, числами с плавающей запятой или строками символов. Тип переменной определяется в контексте ее использования. Кроме того, важно отметить, что в AWK возможно использование одномерных массивов и псевдо-многомерных массивов, сформированных на основании одномерных массивов. В AWK существует несколько переменных, которые имеют специальное значение и устанавливаются по ходу выполнения программы. В целом, можно выделить две группы переменных: предопределенные и задекларированные в самой программе. Значения для предопределенных переменных устанавливаются утилитой awk в процессе запуска и выполнения программы на языке AWK. Обращение к переменным происходит по имени без специальных ведущих символов, как это реализовано в SHELL. Список предопределенных переменных с их описанием представлен в табл. 5.2. Таблица 5.2. Список предопределенных переменных в awk Имя переменной Описание FS Разделитель полей на входе (по умолчанию принимает значение пробела или символа табуляции). Ранее мы рассмотрели, как изменить значение данной переменной с помощью флага -Fc при вызове утилиты awk nf Количество полей в текущей обрабатываемой строке (записи) NR * Порядковый номер текущей обрабатываемой строки из общего числа строк для всех обрабатываемых файлов FNR Порядковый номер текущей строки в текущем файле filename Имя обрабатываемого в данный момент входного файла данных RS Разделитель строк на входе (по умолчанию, символ \о — newline) ofs Разделитель полей на выводе (по умолчанию совпадает со значением переменной FS) 0RS Разделитель строк на выводе (по умолчанию совпадает со значением переменной rs) "Л 0FMT Формат вывода чисел (пб умолчанию %. бд). О формате вывода чисел будет сказано чуть позже &RGC Количество аргументов командной строки (данная переменная получает значение во время запуска утилиты awk) uRGV Массив аргументов командной строки environ Массив переменных среды
176 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Всем другим переменным (не предопределенным) пользователь может присваива свои начальные значения. Значением по умолчанию будет нуль или пустая строка (чи фактически, одно и то же). Мы уже упомянули, что переменные могут быть числами, числами с плавают точкой, строками символов или массивами. Так вот, утилита awk (интерпретатор язьл AWK) рассматривает любую переменную как строковую до тех пор, пока не возник» необходимость выполнить над ней некоторые специфические операции. Если значен! переменных числовые, но выполняется операция конкатенации (пробел), а числа рас сматриваются как простые строки. В то же время, если вместо пробела будет указав операция суммирования (обозначается символом "+"), то переменные будут рассматр! ваться как числа с плавающей запятой. Для правильного понимания рассмотрим еле дующий пример: # more samplel.awk {myvar=$3 $4; print myvar} # awk -f samplel.awk awkl 198050 197940 197940 197060 199823 # more sample2.awk {myvar=$3+$4; print myvar} # awk -f sample2.awk awkl 2030 2019 2019 2030 2021 На что же следует обратить внимание при использовании арифметических опер» ций? В первую очередь, если одна из переменных в выражении не может быть пр« ставлена в виде числа, то она не будет участвовать в операции. Если все элементы в и ражении при использовании арифметической операции не могут быть представлен в качестве числа, то результатом будет нуль. Проиллюстрируем это следующими прв мерами: И awk 'BEGIN (myvar=15+ll; print myvar)' 26 # awk 'BEGIN (myvar="15"+ll.54; print myvar}' 26.54 # awk 'BEGIN {myvar=15+"eleven"; print myvar}' 15 # awk 'BEGIN (myvar="fifteen"+"eleven"; print myvar}' 0 Теперь, что касается массивов... Массив, как и любая другая переменная, создает! в момент его первого использования. В качестве индекса массива может выступать га бое ненулевое значение или строка. Массивы в AWK являются ассоциативными, то ео| такими, для которых отсутствует понятие индекса, а обратиться к элементам мовд только по совпадению имени индекса — фактически, для работы с элементами масс! всегда необходимо знать имена индексов. К примеру, массив day в AWK может выгл деть следующим образом: day [Jan][15] = Sun day [Jan][16] = Mon day [Jan][17] = Tue
Основы программирования 177 Массивы часто используются для выполнения некоторых вычислений и хранения промежуточных данных для однотипных строк файла, в которых могут повторяться определенные поля. К примеру, рассмотрим программу на AWK, которая подсчитывает количество пользователей в системе (по файлу /etc/passwd), использующих тот или иной интерпретатор. Первым в примере показан конвейер из трех объединенных команд для выполнения той же цели. Итак, результат будет иметь следующий вид: # more /etc/passwd I grep /usr/sbin/nologin I wc -1 18 # more sample.awk BEGIN (FS = ":"} ishells[$7]++} END {print(shells["/usr/sbin/nologin"])} # awk -f sample.awk /etc/passwd 18 Единственное, что может показаться новым, — это использование операции ++, которая присутствует практически во всех современных языках программирования и обозначает пошаговое увеличение текущего значения переменной на единицу (инкремент). Раз уж мы затронули тему операций, доведем ее до логического завершения. В языке AWK существуют следующие операции (подобно, как и в языке С): = — простая операция присвоения значения переменной; -= — уменьшение текущего значения переменной на указанное число (например, выражение i-=3 при i равном 7 уменьшит значение переменной i до 4); += — увеличение текущего значения переменной на указанное число (например, если i=4, то после операции i+=4 значением переменной i будет число 8); *= — умножить и присвоить; /= — разделить и присвоить; %= — разделить и присвоить остаток от деления; +, -, *, /, % — простые математические операции; ++ — увеличение на единицу; уменьшение на единицу; <, <=, ==, !=, >=, > — операции сравнения чисел (если оба значения являются числами) или строк; !, |, && — логические операции: отрицание, логическое "ИЛИ", логическое "И" соответственно; операция конкатенации строк, для которой используется символ пробела. Селекторы Не пугайтесь этого названия. Скорее всего, вы с селекторами уже сталкивались, но они назывались как-то иначе. Селектор — это расширение шаблона, позволяющее определять более строгие условия фильтрации записей (по отдельным полям). В любом песте, где может быть применен шаблон, может найти применение и любой селектор. В качестве селектора может выступать шаблон, выражение или их комбинация. Селекторы отличаются от простых шаблонов наличием в них переменных, ссылающихся на отдельные поля. При этом сам шаблон может остаться таким, как и прежде, зато поиск на совпадение подстрок будет более точным. Селектор в виде шаблона имеет следующий формат: $Н-/шаблон/ $N!-/шаблон/ $Н!=="шаблон" При этом первый селектор читается как "поле с номером N соответствует шаблону Шаблон/", а второй селектор — как "поле с номером N не соответствует шаблону
178 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK /шаблон/". Третий селектор позволяет задать точное совпадение поля с шаблоном.( ращаем внимание на то, что пробелы в шаблоне не игнорируются, а используются) уточнения шаблона. Рассмотрим следующий пример: # awk '$l~/ko/ (print)' awkl Starchenko O.N. 1970 60 Marchenko J.M. 1998 23 # awk '$l!~/ko/ {print}' awkl Ivanov I.I. 1980 50 Petrov A.V. 1979 40 Sidorov S.K. 197 9 4 0 # awk '$l=="Petrov" {print}' awkl Petrov A.V. 1979 40 Кстати, никто не мешает использовать в селекторе переменную $0 (вся строка! одно поле), что равнозначно заданию простого шаблона: ft awk '$0~/ 197/ {print}' awkl Petrov A.V. 1979 40 Sidorov S.K. 1979 40 Starchenko O.N. 1970 60 В качестве примера для ознакомления с селекторами, представленных в виде вц жения, рассмотрим следующую программу. Она выводит список пользователей из ф ла /etc/passwd, для которых UID не совпадает с GID, а идентификатор больше 1001 ft awk -F: '$3!~$4 && $3>1000 {print}' /etc/passwd ftpuser:*:1002:80:User fi:/home/ftpuser:/usr/local/bin/bash ftpshell:*:1003:80:User &:/home/ftpshell:/usr/bin/myshell.pi Таким образом, с помощью селекторов можно без труда задавать довольно ело ные критерии отбора строк. Но и это еще не предел. В шаблонах разрешено исполн вать регулярные выражения, еще более точно задавая критерии отбора. В шаблоне) пускается использовать выражения следующего вида: /ла/ — поле (или вся запись) начинается с символа а (требуется точное совп< ние символа; малые и прописные буквы различаются), например: # awk '$W*S/ {print}' awkl Sidorov S.K. 1979 40 Starchenko O.N. 1970 60 /a$/ — поле заканчивается символом а, например: # awk '$3~/0$/ (print}' awkl Ivanov I.I. 1980 50 Starchenko O.N. 1970 60 # awk '$3-/70$/ (print}' awkl Starchenko O.N. 1970 60 [abc] — поле содержит любой из перечисленных символов, например: # awk '$l~/[ikj/ (print)' awkl Sidorov S.K. 197 9 4 0 Starchenko O.N. 1970 60 Marchenko J.M. 1998 23
Основы программирования 179 [а-р] — поле содержит любой символ из указанного диапазона. При этом можно задавать несколько диапазонов и не только, перечисляя их через запятую. Например: # awk '$W[a-c]/ {print}' awkl Ivanov I.I. 1980 50 Starchenko O.N. 1970 60 Marchenko J.M. 1998 23 # awk *$l-/[a-c,S]/ {print}' awkl Ivanov I.I. 1980 50 Sidorov S.K. 1979 40 Starchenko O.N. 1970 60 Marchenko J.M. 1998 23 ■ Символ * позволяет указать, что регулярное выражение может входить 0 и более раз. Данное регулярное выражение практически не находит применения, поскольку приводит к путанице. Например, $1~/ап*/ возвратит тот же результат, что и $1~/а/. Аналогично, селектор $1~/[a-c,S*] / не отличается от $1~/[а- c,S) /. Тем не менее, это очень удобный способ быстро и просто задать фильтр в случае, наподобие следующего: # more awk2 aaaabvvvv aaaabbbbvvvv aaaacvwv aaaaccccww aaaadvvvv aaaaddddvvvv aaaavwv aaaaqqqq # awk *$Wa[d,c]*v/ (print}' awk2 aaaacww aaaaccccvwv aaaadvvvv aaaaddddvvvv aaaavwv • Символ + позволяет указать, что регулярное выражение должно появиться как минимум один раз. Ярким примером в данном случае будет программа для входного файла из предыдущего примера: # awk '$Wa[c)+v/ {print}' awk2 aaaacvwv aaaaccccww ■ Символ ? позволяет указать, что регулярное выражение не входит или входит только один раз, например: # awk '$l~/a[d,c]?v/ {print}' awk2 aaaacww aaaadvvvv aaaavwv • ab | cd — читается как "ab или cd", например: # awk '$l-/AIv|nko/ {print}' awkl
180 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Ivanov I.I. 1980 50 Starchenko O.N. 1970 60 Marchenko J.M. 1998 23 Для группирования регулярных выражений используются скобки, например: « awk '$3-/19(7[0,9])$/ {print} • awkl Petrov A.V. 1979 40 Sidorov S.K. 1979 40 Starchenko O.N. 1970 60 Описание блока действий До этого мы рассматривали простой блок действий, который, как правило, о из одной функции вывода print. Тем не менее, AWK является, в некоторой мере, ком программирования, и, в действительности, блок действий может быть го| сложнее и включать даже циклы и условия. В нем можно описать такие действия присваивание выражений, использовать операторы управления и вывода, а также bi вать встроенные и собственные функции. Вкратце рассмотрим, какие операторы упр ления применяются в AWK. Простейшие операторы К простейшим можно отнести следующие операторы: exit — позволяет завершить выполнение программы next — указывает на переход к обработке следующей строки, управление nej ходит на начало awk-программы next file — указывает на переход к обработке следующего файла, управлм переходит на начало awk-программы break — выход из цикл а continue — переход к следующей итерации цикла print — вывод результата выражения printf — форматированный вывод результата выражения delete — используется для удаления одного элемента массива или всех элей тов массива Структурные операторы Структурные операторы позволяют задать логическое поведение программы. Бз годаря им, программа может принимать решения по заданным условиям или же выла нять определенные действия в цикле. Структурные операторы практически полносп аналогичны соответствующим операторам языка С. Общий формат структурных опер торов имеет следующий вид (каждый структурный оператор указан в отдельной стр ке): if (условие) (операторы} [else (операторы}] while (условие) {операторы} do {операторы} while( условие ) for (выражение; условие; выражение) {операторы} for (индекс in имя_массива) {операторы} Рассмотрим несколько простых примеров. Во-первых, с помощью структурно! оператора if можно избавиться от описания шаблонов или селекторов, задав в качестве условия: # awk '{if <$0~"ko") {print}}' awkl Starchenko O.N. 1970 60 Marchenko J.M. 1998 23
Основы программирования 181 lawk '{if ($0~"ко") {print) else {print("Record",FNR,"falls short of 4>to the query")})' awkl Record 1 falls short of to the query Record 2 falls short of to the query ' Record 3 falls short of to the query Starchenko O.N. 1970 60 Marchenko J.M. 1998 23 Пример использования циклов: lawk 'BEGIN {ORS=" ") {for(k=NF;k>0;k—) {print $k){print RS})' awkl 50 1980 I.I. Ivanov 40 1979 A.V. Petrov 40 1979 S.K. Sidorov 60 1970 O.N. Starchenko 23 1998 J.M. Marchenko Данная программа выводит гюля файла в обратном порядке. При этом в самом начале изменено значение переменной ORS на символ пробела, чтобы весь результат выдавался в одну строку, а не каждое поле в новой строке. Для того чтобы строка при выводе была разделена должным образом на записи, мы добавили действие {print RS}, выполняемое по окончании обработки каждой записи. Для того чтобы удалить пробелы вначале большинства строк? можно применить утилиту sed, подключив ее с помощью конвейера. Ввод и вывод данных Ранее мы уже упоминали о невозможности программы на AWK открывать файлы или сохранять вывод в файл. Эти действия должны быть жестко заданы пользователем при вызове интерпретатора awk. Рассмотрим'подробнее некоторые аспекты передачи файлов на вход программы для обработки и сохранения результатов в файл. При вызове утилиты awk можно задать для обработки более одного файла. Для этого их имена должны быть перечислены через пробел. Каждый файл при этом обрабатывается последовательно в том порядке, в котором был указан в командной строке. Обращаем внимание на то, что в зависимости от имени обрабатываемого файла можно менять и поведение самой программы. Для этого необходимо воспользоваться переменной FILENAME. Пример ее использования для изменения поведения программы: $ more awk3 A.A. Didok 26 1980 I.A. Didok 29 1977 Y.V. Lazutikov 17 1989 # more samplel.awk BEGIN {YEAR=2006} {fieldl=$l; field2=$2; field3=$3; field4=$4) FILENAME=="awk3" {fieldl=$2; field2=$l; field3=$4; field4=$3) {print("Worker:",fieldl,field2,RS," Age:",YEAR-field3)} it awk -f samplel.awk awkl awk3 Worker: Ivanov I.I. Age: 26 Worker: Petrov A.V. Age: 27 Worker: Sidorov S.K. Age: 27 Worker: Starchenko O.N. Age: 36 Worker: Marchenko J.M. Age: 8 Worker: Didok A.A.
182 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Age: 2 6 Worker: Didok I.A. Age: 29 Worker: Lazutikov Y.V. Age: 17 Из примера видно, что, несмотря на различный формат файлов awkl и awk} зультат их обработки оказался одинаковым в силу особенностей формата файла awl Для того чтобы вывести результат не на экран, а в файл, необходимо воем ваться операцией перенаправления вывода — других вариантов нет: # awk -f samplel.awk awkl awk3 > awkresult Функции В завершение рассмотрим перечень функций, возможных к использованию вА и то, как самому их создавать. Итак, язык AWK имеет набор встроенных функций выполнения многих хорошо известных в других языках программирования опер) Как и в других языках, эти функции подразделяются на типы в зависимости от во щаемых данных. В AWK можно выделить следующие типы: строковые, систеш математические функции. Строковые функции Строковые функции позволяют как обрабатывать строковые данные, так и иа зовать их для получения другого типа информации. Функция length length)[s]) Данная функция возвращает длину строки s или длину записи $0, если s опуч Пример использования: # awk ' (print (length($0) "с:",$0)Г awkl 19с: Ivanov I.I. 1980 50 19c: Petrov A.V. 1979 40 20c: Sidorov S.K. 1979 40 23c: Starchenko O.N. 1970 60 22c: Marchenko J.M. 1998 23 Функция substr substr(s, m [, n]) Возвращает подстроку, которая начинается в позиции m строки s с длиной mi мум п символов. Если п опущено, то возвращается оставшаяся часть строки s, нач с позиции т. Пример использования: # awk '(print substr($1,1,5)}' awkl Ivano Petro Sidor Stare March Функция index index (s, t)
Основы программирования 183 Возвращает стартовую позицию подстроки t в строке s при условии, что подстрока Подержится в строке s. В противном случае будет возвращено значение, равное нулю. Функция match match(s, r) Возвращает позицию в строке s, с которой начинается последовательность, удовлетворяющая регулярному выражению г. Если такой последовательности нет, то возвращается значение, равное нулю. В результате выполнения данной функции будут установлены значения для переменных RSTART и RLENGTH. Пример использования: # more samplel.awk { if (match($l, /ko/)>0) { print("/ko/ at position",RSTART ":",$0) } else { print("Not found /ko/:",$0) } ) # awk -f samplel.awk awkl Not found /ko/: Ivanov I.I. 1980 50 Not found /ko/: Petrov A.V. 1979 40 Not found /ko/: Sidorov S.K. 1979 40 /ko/ at position 9: Starchenko O.N. 1970 60 /ko/ at position 8: Marchenko J.M. 1998 23 Функция split split(s, a [, fs)) Разбивает строку s на части, которые затем присваивает элементам массива а (а(1], а [2] ... а [п]) и возвращает количество элементов массива п. Разбиение строки ■ выполняется в соответствии с регулярным выражением fs. Если регулярное выражение f s было опущено, то в качестве разделителя строки используется значение пере- ненной FS. Массив а перед разбиванием строки s автоматически очищается. Пример использования: # more samplel.awk ( split($0, arr, /о/) for (i in arr) (print arr[i]} ) # awk -f samplel.awk awkl v I.I. 1980 50 Ivan v A.V. 1979 40 Petr r v S.K. 1979 40 Sid O.N. 1970 60 Starchenk J.M. 1998 23 Marchenk Функция sub sub(r, t [, s])
184 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Данная функция используется для поиска подстроки в строке s, удовлетворяю регулярному выражению г, и замены найденной последовательности на строку t. 3 на производится только один раз. При этом функция возвращает количество прои денных замен (фактически, — 1) или 0 (не было замены). Если строка s опущена, то дет использоваться значение переменной $0. Пример использования: # awk '(sub(/о/,"О");print}' awkl IvanOv I.I. 1980 50 PetrOv A.V. 1979 40 SidOrov S.K. 1979 40 StarchenkO O.N. 1970 60 MarchenkO J.M. 1998 23 Функция gsub gsub(r, t [, s]) Данная функция используется подобно предыдущей sub, но, в отличие от нее, полняет не одну (первую) замену найденной подстроки, а заменяет все подстроки, yj летворяющие регулярному выражению г. Так же как и при использовании sub, би возвращено количество произведенных замен, а в случае отсутствия строки t испол ется переменная $0. Пример использования: # awk '(gsub(/9/,l)gsub(/0/,2);print}' awkl Ivanov I.I. 1182 52 Petrov A.V. 1171 42 Sidorov S.K. 1171 42 Starchenko O.N. 1172 62 Marchenko J.M. 1118 23 Функция sprintf sprintf(fmt, expr, ...) Данная функция возвращает сформированную строку для отображения спи ехрг в соответствии с заданным форматом fmt. Например: mobile# more samplel.awk (print(sprintf("%14s %s %4d %2.2f", $1, $2, $3, $4))} mobile* awk -f samplel.awk awkl Ivanov I.I. 1980 50.00 1979 40.00 1979 40.00 1970 60.00 1998 23.00 Функция tolower tolower(str) Возвращает копию строки str с буквами, преобразованными в строчные. При использования: # awk '{print(tolower($0)))' awkl ivanov i.i. 1980 50 petrov a.v. 1979 40 sidorov s.k. 1979 40 starchenko o.n. 1970 60 marchenko j.m. 1998 23 Petrov Sidorov Starchenko Marchenko A S О J V К N M
Основы программирования 185 Функция toupper toupper(str) Возвращает копию строки str с буквами, преобразованными в заглавные (прописные). Пример использования: t awk '(print(toupper($0))}' awkl IVANOV I.I. 1980 50 PETROV A.V. 197 9 4 0 SIDOROV S.K. 1979 40 STARCHENKO O.N. 197 0 60 MARCHENKO J.M. 1998 23 Системные функции К системным функциям относится только одна. Она имеет следующий формат вызова: system(cmd) Данная функция выполняет команду cmd и возвращает код завершения программы. Если команда cmd заключена в кавычки, то, кроме кода завершения, будет выведен и результат выполнения команды. Пример использования: # echo I awk 'END (print system("finger "whoami"")}' Login: root Name: Charlie Root Directory: /root Shell: /bin/csh Last login Mon Jan 9 04:02 (EET) on ttyvO New mail received Tue Jan 17 03:07 2006 (EET) Unread since Sat Dec 24 03:11 2005 (EET) No Plan. 0 Математические функции В awk имеются следующие арифметические функции: ехр {ехрг) — возвращает значение экспоненциальной функции; log (ехрг) — возвращает значение натурального логарифма от ехрг; sqrt (ехрг) — извлекает квадратный корень из ехрг; sin(expr) —возвращает значение синуса от ехрг (в радианах); cos' (ехрг) — возвращает значение косинуса от ехрг (в радианах); ■ atan2 (у, х) — возвращает значение арктангенса от у/х (в радианах); int (ехрг) — округляет число ехрг до целого значения; rand () — возвращает случайное число в интервале (0-1); srand ( [ехрг] ) — устанавливает новое начальное значение для генератора случайных чисел. При этом функцией будет возвращено предыдущее установленное значение. Если не указать значение ехрг, то для генерации используется текущее время в секундах. Эта функция позволяет при каждом запуске программы всегда получать случайную неповторяющуюся последовательность значений для функции rand (). Перед тем как вызывать функцию rand, рекомендуется всегда вызывать и функцию srand. Написание собственных функций Наконец, в программах awk можно определять собственные функции и затем использовать их в блоке действий. Для определения собственной функции применяют следующий формат объявления:
186 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK function имяФункции(список параметров) { список инструкций } Внутри тела функции можно использовать локальные переменные, которые дш ны быть описаны в списке параметров, но отделены от них более, чем одним пробел Например: function MyFunction(i,j, a,b,c) # i, j являются параметрами # a, b и с являются локальными для функции переменными { } Вызов функции может иметь следующий вид: {MyFunction(43,61)) Обратите особое внимание на тот факт, что между именем функции и скобкой си раметрами не должно быть пробелов. Пример сложной программы на AWK В заключение рассмотрим пример сложной программы на AWK, в которой испои зуется собственная функция comm (листинг 5.11). Заметьте, что эта программа, по сут выполняет роль синтаксического анализатора для некоего несуществующего псеад языка программирования, похожего на Pascal. Листинг 5.11. Пример синтаксического анализатора на языке AWK . j # cat analiz BEGIN { program=0; r_var[l)="integer"; r_var[2]="real"; r_var[3]="byte"; r_var[4]="string"; r_var[5]="long"; r_var[6]="file"; r_var[7]="word"; r_word[l]="as"; r_word[2]="var"; r_word[3]="begin"; r_word[4]="}"; r_word[5]="<"; r_word[6]="write"; r_word[7]="for"; r_word[8]="else"; r_word[9]="in"; r_word[10]="if"; r_word[ll]="then"; r_word[12]="do"; r_word[13]="while"; r_word[14]="case"; ) function comm(strstr)(print NR,":",$0,"\t",strstr) $l=="var" && NF==1 { if (program==l) {comm("# ERROR. Local var is unavaileble!");exit} else (coramC'l started VAR block"); var=l) } $1~/л[А-г,а-2,_]/ && $2=="as" && NF==3 ( if (var==0) ( comm("# ERROR! Define variable only in VAR block") ,-exit ) else { typeOK=0; nameOK=0; wordnameOK=l; varnameOK=l; for (i in r_var){if (r_var[i]==$3){typeOK=l;break)) for (i in r_var){if (r_var[i]==$l)(varnameOK=0,-break)) for (i in r_word)(if (r_word[i]==$l){wordnameOK=0;break}} if (mvar[$l]<l){nameOK=l} if ((typeOK==l)ii(nameOK==l)&&(wordnameOK==l)«S(varnameOK==l)) {mvar[$l]=l;comm("# define" $0)) else {comm("# ERROR! Variable is defined or unknown type"); exit;
■ Основы программирования 187 ^йгзЩЩШШйие - .*'••••?£ /W:--*№'r -, , " l-z - >' . -. :ТТТ lo=="P && NF==1 { I if (var==l &6 program==0){ var=0; comm("# end of VAR block"); ' 1 else { if (program==l){program=0; comm("# end of program")) else {comm("# ERROR. == Unknown error ==");exit} ) ) $l=="begin" && $0=="begin" && NF-l { if (var==l) {comm("# ERROR. Variable block is not closed.");exit} else {comm("# started main block"); program=l) ■I .?l-/A(\/\/)/ {comm("# COMMENT:" $0)} $i-/A[A-Z,a-z,_]/ && $2=="-" s& $3~/A" && "$ is *[0-9,a-z,A-Z] || *[0-9}/ И NF==3 { corom("# statement" $0) > :$l==n:" && length($2)>l &£ $3-/A [A-Z, a-z,_] / { comm("# internal command: " $0) ) I cat src_prog_err var i as integer ;.| Ibegin ■■ i = "hello" ' к as word : print к ') I awk -f analiz erc_prog_err 1 : var # started VAR block i : i as integer # define i as integer 3 : } # end of VAR block ;< : begin # started main block 5 : i = "hello" # statement i = "hello" ( : к as word # ERROR! Define variable only in VAR block I eat arc_prog var i as integer b as string _i as integer // _i as word // a as lsd // for as integer ) begin b = "hello" i = 1 : print i : print b )
188 Глава 5. Командные интерпретаторы, сценарии и язык обработки шаблонов AWK Листинг 5,11. Окончание # awk -f analiz src_prog 1 : var # started VAR block 2 : i as integer # define i as integer 3 : b as string # define b as string 4 : _i as integer # define _i as integer 5 : // _i as word # COMMENT:// _i as word 6 : // a as lsd # COMMENT:// a as lsd 7 : // for as integer # COMMENT:// for as integer 8 : } # end of VAR block 9 : begin # started main block 10 : b = "hello" # statement b = "hello" 11 : i = 1 # statement i = 1 12 : : print i # internal command: : print i 13 : : print b # internal command: : print b 14 : } # end of program Язык AWK постоянно подвергается изменениям, и, возможно, в некоторых версиях системы программы будут вести себя не так, как того хотел бы читатель. Может быть, в конкретной версии утилиты awk не будут реализованы некоторые функции, или наоборот — появятся новые, отличные от описанных в данном разделе. Во избежание возможных проблем перед написанием программ на AWK просмотрите системное справочное руководство для конкретной версии awk с помощью команды man awk. В ЗАКЛЮЧЕНИЕ... В данной главе была более подробно изучена работа с командными интерпретаторами — и не только аспекты их настройки, но и написание довольно развитых приложений на внутреннем языке SHELL. Кроме того, был рассмотрен популярный язык обработки шаблонов AWK, с помощью которого можно создавать небольшие, но мощные приложения для фильтрации и преобразования текстовых файлов.
ЧАСТЬ II УПРАВЛЕНИЕ ОПЕРАЦИОННОЙ СИСТЕМОЙ FREEBSD Для успешного использования системы FreeBSD необходимо не только уметь ее устанавливать и понимать принципы работы и программирования в среде. Успешное использование подразумевает также и знания в области администрирования, начиная от управления учетными записями пользователей, работы с файловой системой и настройки процесса запуска приложений, и заканчивая обновлением системы и установкой/удалением приложений. В данной части книги мы попытаемся, насколько это будет возможно, пролить свет на перечисленные вопросы.
190 Глава 6. Пользователи и управление учетными записями ГЛАВА 6. ПОЛЬЗОВАТЕЛИ И УПРАВЛЕНИЕ УЧЕТНЫМИ ЗАПИСЯМИ Будет не лишним еще раз упомянуть о том, что операционная система FreeBSD являеп многопользовательской. С этим связано очень много вопросов, имеющих отношен» к управлению пользователями. Хотя сразу оговоримся: не следует путать системы, и торые только называются многопользовательскими, с теми, которые являются таковым на самом деле. Многопользовательская система — это не та система, которая устанм лена у вас дома, а "папа-мама-я" со своими неповторяющимися настройками являют ее отдельными пользователями. Многие и по сей день считают Windows 96/98/МЕ мпо гопользовательскими, хотя к таковым из семейства Windows можно отнести только сю темы, основанные на технологии NT. Мы не будем сильно углубляться в понятие многопользовательской системы — от метим только, что реальная многопользовательская система обладает следующий свойствами: одновременная работа различных пользователей (как локально так и удален» в сети); возможность каждого пользователя от своего имени запускать процессы нарту с процессами других пользователей; возможность разграничивать доступ к ресурсам для различных пользователей; предоставление каждому пользователю возможности безопасно хранить свои да» ные и т.д. С учетом всего перечисленного, становится понятно не только то, какую систем) можно назвать многопользовательской, но и то, насколько она сложна в настройке. Итак, очевидно, что в многопользовательской системе самое важное понятие—зп пользователь, а основная работа администратора по управлению пользователями » ключается в правильном разграничении прав и доступа к ресурсам. Кроме пользовате лей, в системе FreeBSD существуют такие понятия как группа (для группирования пользователей по типу выполняемых задач и правам доступа) и класс (для определения т литики безопасности пользователей, прав доступа, разрешений на использование ресурс сов и т.п.). В контексте данной главы мы рассмотрим различия между учетными зал» сями пользователей, а также затронем вопросы управления пользователями и группам! Кроме того, будет показано, что такое классы, и как с их помощью ограничивать под зователей. ПОНИМАНИЕ УЧЕТНЫХ ЗАПИСЕЙ В системе FreeBSD есть несколько типов пользователей: обычные, псевдопользоватад и суперпользователь root. В целом, управление псевдо- и обычными пользователям практически ничем не отличается, так как псевдопользователи являются всего лишы* раниченными обычными пользователями без права интерактивного входа в систему, А вот пользователь root, несмотря на настройки среды, присущие обычным пользой
Понимание учетных записей 191 гелям, имеет ряд преимуществ, включая неограниченные возможности даже там, где они напрямую ограничены. Но давайте рассмотрим все по порядку и подробнее. Сразу же затронем некоторые используемые здесь понятия. Например, чем отличается имя пользователя от учетной записи? Под именем пользователя мы будем подразумевать некоторое слово, которое идентифицирует пользователя в пределах одной системы, и, как правило, — это не имя человека, а некая уникальная последовательность символов. Учетная запись — это запись в базе данных пользователей о конкретном пользователе системы. Учетная запись пользователя доступна по имени пользователя или UID (Universal Identifier — уникальный идентификатор пользователя). Учетная запись пользователя содержит много полей, в том числе: имя пользователя; UID; GID (Group Identifier — главная группа пользователя); размещение домашнего каталога; оболочка пользователя; возможно, полное имя пользователя, телефон, адрес и т.п. Обратите внимание на то, что все данные пользователя идентифицируются не по его имени, а по U1D. Это связано с тем, что имя пользователя можно при желании изменить, и если привязка будет основана на имени, то существует риск потери доступа пользователя к большинству своих данных. Более того, можно создать несколько пользователей с одним идентификатором (с помощью утилит pw и chpass, рассмотренных в данной главе ниже), но с различными именами, паролями, домашними каталогами и оболочками (различные учетные записи). К тому же, такой пользователь присутствует в системе по умолчанию: пользователь toor (имя root наоборот). Такие решения применяются довольно редко: только в тех случаях, когда необходимо другому пользователю дать полные права доступа к файлам другого. Также это приемлемо в тех случаях, когда необходимо передать работу пользователя, ушедшего в отпуск, другому сотруднику без предоставления пароля первого и доступа к его учетной записи. Идентификаторы UID могут принимать значения от 0 до 65535 (максимальное количество пользователей в одной системе). При работе с учетными записями пользователей мы столкнемся еще с такими понятиями как последнее время изменения пароля и время истечения действия учетной записи. Первое из них основано на том факте, что система FreeBSD может заставлять пользователей периодически изменять свои пароли. Именно благодаря наличию соответствующего поля в учетной записи пользователя, система понимает, когда необходимо предложить изменить пароль. Заметим, что по умолчанию возможность контроля времени истечения действия пароля отключена. О том, как ее включить, будет рассказано в разделе, посвященном классам. Понятие истечения срока действия учетной записи основано на возможности заранее определить время блокирования учетной записи. Это может потребоваться, например, в том случае, когда новый сотрудник проходит испытательный срок — администратор в целях безопасности может установить при создании учетной записи день ее блокирования, соответствующий дню окончания испытательного срока. Теперь администратору нет необходимости заботиться о том, будет ли человек по окончанию испытательного срока принят на работу или уволен — запись автоматически заблокируется. Если потребуется, в дальнейшем ее можно разблокировать и сделать постоянной. Еще один вариант: пользователь увольняется из компании. Но что, если через пару месяцев он захочет вернуться обратно (такое бывает, и не редко)? В таком случае лучше учетную запись этого пользователя не уничтожать, а просто заблокировать (установить день блокировки на последний рабочий день). Третий пример — применяемый при хостинге: пользователь заплатил за услуги на год и получил учетную запись. По истечении года запись должна быть автоматически заблокирована во избежание работы пользователя в системе без продления оплаты. Давайте теперь более глубоко разберемся в типах пользователей, о которых мы упомянули в начале раздела.
192 Глава 6. Пользователи и управление учетными записями Суперпользователь root Любая многопользовательская система должна иметь возможность управлеш пользователями, и только ограниченный круг лиц должен быть допущен к тащ управлению. В системах Windows такой пользователь обычно носит имя Administrator (Администратор), в Novell Netware — это superuser. В UNIX-систем в том числе и FreeBSD, — это пользователь root. Именно учетная запись для пользок теля root является той записью, доступ к которой отделяет системного администратор от простых пользователей. Данная учетная запись, как и Administrator для Window не должна принимать участия в повседневных задачах, таких как редактирование доку ментов, работа с почтой, запуск графической среды и др. Почему так? Пользователь root не имеет ограничений при работе в системе, пе- этому любая программа, запущенная от его имени, может запросто нарушить стабиль ность системы и привести к полному ее краху. При этом пользователь даже не обяэг тельно целенаправленно "ломает" систему — множество программ имеют ошибп в реализации. Если вы не занимаетесь в данный момент управлением системой, то луг ше воспользуйтесь учетной записью непривилегированного пользователя, что позволт обезопаситься от случайного уничтожения важных данных. Многие пользователи на домашних компьютерах не следуют этим правила В результате — постоянные жалобы на сбои и переустановка "системы с нуля". Hoi этого не всегда бывает недостаточно. Даже при выполнении системных задач по упраа лению системой необходимо быть очень внимательным, проверять все вводимые ко манды, все символы (вспомните ранее упомянутые экранизацию и символы подсташ ки), находиться не в "сонном" или усталом (да-да, именно этот фактор часто являета роковым при потере информации) состоянии. Как и при установке системы, администратору рекомендуется создавать отдельной пользователя для своей обычной, повседневной работы. О том, как создавать пользою телей, мы расскажем чуть позже в этой же главе. Обращаем внимание на тот факт, что для входа пользователя с привилегиями roc: не обязательно выходить из системы, более того — такой вариант даже не рекомендует ся. Для получения прав суперпользователя из-под своей учетной записи можно восшш зоваться утилитой su. Перед тем как получить неограниченные права root с помощи su, должны быть выполнены два условия: во-первых, пользователь должен принадо- жать группе wheel (о группах мы поговорим в конце главы); во-вторых, он должен ввести на запрос утилиты su пароль для пользователя root. Как видим, система повышения привилегии имеет двойную защиту: в первую очередь, необходимо знать парои учетной записи пользователя из группы wheel, и только затем необходимо пройти гр верку паролем для пользователя root: %su Password: # ПРИМЕЧАНИЕ Некоторые администраторы1 предпочитают использовать утилиту sudb, которая зволяет распределять права пользователя ^oot между пользователями. При пользователям предоставляется часть прав, а не неограниченный доступ (как щ получается при использовании стандартной утилить! su). По умолчанию, даннй программа отсутствует в системе FreeBSD и может быть установлена с помощи набора пакетов с дистрибутивного компакт-диска или гТР*сервера, а также с поме} щью системы портов из каталога /usr/ports/security/sudo. Набор пакетов] система портов рассматривается в главе 9. "Установка и обновление сторонних npi ложений".
Понимание учетных записей 193 Обратите особое внимание на то, что система FreeBSD, по умолчанию, защищена ш прямого входа пользователя root с помощью удаленной терминальной сессии, хотя ланное свойство и можно отменить (каким образом — мы промолчим, как говорится, "от греха подальше"). Единственная проблема — по умолчанию не защищен физический терминал, и любой пользователь, получивший к нему доступ, может напрямую пойти как root. Во избежание этого, внесите изменения в файл /etc/ttys для устройств ttyv0-ttyv8, изменив слова secure на insecure: ttyvO "/usr/libexec/getty # Virtual terminals ttyvl "/usr/libexec/getty Pc" ttyv2 "/usr/libexec/getty Pc" ttyv3 "/usr/libexec/getty Pc ttyv4 "/usr/libexec/getty ttyv5 "/usr/libexec/getty ttyv6 "/usr/libexec/getty ttyv7 "/usr/libexec/getty ttyv8 "/usr/XllR6/bin/xdm Второй аспект безопасности для суперпользователя root — периодическое изменение его пароля. Несмотря на все меры безопасности, принятые в системе, постоянное вменение пароля — ключ к спокойному сну. В-третьих, не следует забывать о том, что процессы, запущенные от имени root, имеют право вмешиваться в работу других процессов, прерывать их работу и вносить вменения в любые конфигурационные файлы системы. Исходя из этого, для запуска дабых процессов, которые не управляют работой системы, а только отвечают за опре- ренные задачи, по возможности, используйте учетные записи системных пользователей. Хотя большинство программ, по умолчанию, и запрещают свой запуск от имени пользователя root, некоторые из них позволяют при определенных настройках работать от имени суперпользователя. К примеру, Web-сервер Apache, который рассмотрен я третьей части книги, при установке в системе может быть настроен на возможность работы от имени root, хотя по умолчанию эта возможность отключена (и лучше не пылитесь ее активизировать, если дорожите своим сервером). Рс" PC" Рс" Рс" Рс" Рс" Рс" Рс" -nodaemon" cons25r cons25r cons25r cons25r cons25r cons25r cons25r cons25r xterm on on on on on on on on off insecure insecure insecure insecure insecure insecure .insecure insecure insecure Системные (псевдо-) пользователи Системные пользователи (или, как их еще называют, "псевдопользователи", поскольку у них нет ни оболочки, ни домашнего каталога) предназначены, как правило, ря запуска системных служб (например, почтового сервера или сервера Web-страниц). Благодаря тому, что каждый сервис может запускаться и работать от имени некоторого псевдопользователя, достигается должный уровень безопасности (процесс не может помешать работе другого процесса и владеет файлами, на которые есть права только у него, обезопасив себя от непредвиденного вмешательства в процесс его работы), а с по- иощью классов можно установить ограничение по потребляемым системным ресурсам. Обращаем внимание на то, что некоторые процессы все же работают от имени суперпользователя root, нарушение их нормальной работы может повредить систему и шлется серьезной проблемой при обеспечении безопасности сети (данные вопросы бу- лут подробнее рассмотрены в третьей части книги). Возможно, читатель уже сталкивался с некоторыми псевдопользователями. В различных версиях системы и при различных конфигурациях их количество может вменяться. Большинство стандартных псевдопользователей FreeBSD перечислено «табл. 6.1.
194 Глава 6. Пользователи и управление учетными записями Таблица 6.1. Список большинства системных пользователей FreeBSD Ими системного пользователя bin daemon Описание Пользователь для запуска простых программ Пользователь, от имени кртррого.работает множество систем слухи* (Например, сервер печати) operator Пользователь, который имеет право обращаться к большинству j ройств. Как правило, используется для операций обслуживания i темы (останов, перезагрузка, создание резервных копий данных) tty Пользователь с правом доступа на запись к устройству терминала kmem С использованием данной учетной записи программы могут полу* доступ к памяти ядра. К таким программам относятся fstat' netatat games Псевдопользоаатёль для игр и их файлов news Используется программами подсистемы новостей, наподобие Userc man Используется для подсистемы страниц справочной системы man sshd Используется для запуска ,сл>ок€ защищенного терминального сое нения с помощью SSH 'г -" amrasp Пользователь для работы подсистемы Sendmail Submission: mailnull Пользователь слу>кб Sehdmail bind Пользователь, от имени которого рабдтает защищенная служба, менных имен DUS pop Пользователь для запуска.служб, обеспечивающих работу по лр< колу POP '. ' ""•< www Пользователь, от имени1 которого' работают дочерние процессы Щ сервера ' nobody Пользователь без каких-либо прав и привилегий в системе' Некоторые псевдопользователи не рекомендуемы для запуска определенных сл> К таким пользователям можно отнести nobody. Это связано, по большей части, с что запуск нескольких различных служб под одним псевдопользователем привои к накоплению файлов, принадлежащих данному пользователю, что снижает безоп ность системы в целом. К примеру, взлом одной службы, работающей под пользой лем nobody, предоставит доступ взломщику ко всем другим файлам данного польза теля и процессам, запущенным от его имени. Кстати, относительно процессов... Обратите внимание на то, что процессы, ка файлы, принадлежат пользователям и группам. Процесс одного пользователя не ми получить доступ к процессу другого пользователя системы, если только это не проце запущенный от имени пользователя root. Обычные пользователи системы Вот мы и добрались до обычных пользователей системы. Итак, обычные учета записи пользователей предназначены для предоставления доступа пользователей в а тему с персональными настройками интерфейса, предоставлением места для хранен личных данных и т.д. Каждый пользователь системы должен иметь свою учетную! пись, что предотвращает возникновение непредвиденных ситуаций, наподобие исчез! вения важных документов или изменения внешнего вида рабочей среды. Помимо эта предоставление каждому пользователю системы своей учетной записи позволяете! темному администратору следить за действиями пользователей, предотвращать неся ционированный доступ к данным и почте, а также попытки нарушить нормальную] боту других пользователей системы. На основе учетных записей для пользователей а темный администратор также распределяет права доступа к общим ресурсам и т.п
Управление учетными записями пользователей 195 УПРАВЛЕНИЕ УЧЕТНЫМИ ЗАПИСЯМИ ПОЛЬЗОВАТЕЛЕЙ Зная назначение различных типов учетных записей, можно переходить к изучению основ управления. К управлению учетными записями (не пользователями!) относятся операции создания, модификации и удаления оных из системы. К управлению пользователи относится управление учетными записями, домашними каталогами пользователей, настройками оболочек по умолчанию, предоставлением прав доступа или ограничением них прав и многое другое. Для управления пользователями в первую очередь необходимо знать основы управ- кния учетными записями, понимание того, что изменяется в системе при добавлении вменении или удалении учетной записи, какие файлы отвечают за хранение данных и ааролей, а также системные утилиты, с помощью которых можно осуществлять управ- кние. Перечень таких утилит с их кратким описанием представлен в табл. 6.2, а более подробно они рассмотрены в соответствующих разделах этой же главы. Таблица 6.2. Список системных утилит для управления учетными записями в системе FreeBSD Имя утилиты Краткое описание: adduser Наиболее простая й рекомендуемая к использованию начинающим администраторам ytVmwTa добавпенйя новы* пользователей а систему ■rmusex Простая и удобная утилита; удаления из системы пользователей и связанных с ними данных pw Очень мощная и гибкая утилита по добавлению и удалению пользователей, а также изменению любой информации, связанной с учетными записями. Рекомендуется к использованию в сценариях и опытными системными администраторами vipw Профамма безопасного изменения файла с учетными записями пользователей. Вызывает текстовый редактор. Не рекомендуется к использованию начинающими пользователями ,chpass, Простая утилита для изменения дополнительной (и не только) инфор- chfn, chsh мации о пользователе. passwd Простая утилита для изменения паролей Не станем также скрывать, что практически все управление учетными записями лользователей в системе FreeBSD сводится к изменению всего лишь нескольких файлов. Вначале рассмотрим эти файлы, а затем перейдем к рассмотрению вопросов управления учетными записями. Файлы учетных записей пользователей Возможно, система FreeBSD удивит многих "юниксоидов" своими особенностями хранения списка учетных записей. Действительно, FreeBSD (как и все BSD-системы) вэтом плане особенна, и отличается от принципов заложенных в других UNIX- сисгемам, и Linux-клонах (которые также имеют собственный "взгляд" на принципы хранения подобной информации). В первую очередь, отметим, что файл /etc/passwd в системе FreeBSD имеет чис- to символическое значение для обратной совместимости со всеми UNIX-системами и не используется утилитами управления учетными записями, кроме случаев его синхрони- щии с теми файлами, которые действительно используются, и вывода пользователям юформации о других пользователях. Это обусловлено наличием более широких возможностей по управлению учетными записями, а точнее— блокировками и использо- аанием классов. Вместо /etc/passwd, главным текстовым файлом, содержащим пол-
196 Глава 6. Пользователи и управление учетными записями ный объем необходимых полей, является /etc/master, passwd (впрочем, его пользование носит отчасти символический характер). При добавлении пользователей или их удалении, а также модификации парам соответствующие изменения вносятся как в файл /etc/passwd, так и в /etc/master.passwd — при этом последний гораздо важнее. Файл содержит м дельной строке на каждую учетную запись, а все поля записи разделяются симм двоеточия ":". Количество полей в файлах различно. Файл /etc/passwd имеет общий 1Л формат: username:password:uid:gid:coments:homedirectory:shell Поле username — это имя пользователя (то, которое будет использовано при торизации в системе); поле uid — уникальный идентификатор пользователя. ПРИМЕЧАНИЕ FreeBSD позволяет для одной систей^ создать 65535 уникальных пбльзрвай Несколько идентификаторов из этого количества строго зарезервированы. &щ очередь, это относится к суперпользователю ruot, уникальный идент,ификатО| торого всегда равен 0. Во-вторых, идентификаторы от 1 до loo О должны быть, своёны системным пользователям (в других системах — от 1 до 100). Иденти| торам выше 1000 соответствуют записи обычных пользователей системы (иски ние составляет только пользователь nobody с уникальным идентификато 65534). Поле gid — это уникальный идентификатор главной группы пользователя. Гру и их идентификаторы хранятся в файле /etc/group, который будет рассмотрен в деле, посвященном группам пользователей. Поле comments, возможно, кому-то покажется незначительным, однако, наса деле, это не так. Оно используется многими утилитами (в том числе, finger), дли вода информации о пользователе и, что немаловажно, — почтовыми программами формирования имени пользователя в заголовке письма. В данном поле разрешены волы пробела, а запятые играют роль разделителей подполей, которые используюта кой программой как chpass. С ее помощью можно задать для пользователя теле| адрес и другую информацию. О полях homedirectory и shell уже было более, чем достаточно да в предыдущих главах. Что касается поля password, то мы его оставили напоследм спроста. В файле /etc/passwd пароль в этом поле отсутствует, и вместо него и указывается символ звездочки "*". Примеры записей в файле /etc/passwd: root:*:0:0:Charlie &:/root:/bin/csh toor:*:0:0:Bourne-again Superuser:/root: daemon:*:1:1:Owner of many system processes :/root:/usr/sbin/nologir nobody:*:65534:65534 unprivileged user:/nonexistent:/usr/sbin/nolo? ftpshell:*:1003:80:User &:/home/ftpshell:/bin/csh Пароль (и то — в зашифрованном виде) можно найти только в ф /etc/master .passwd. Длина зашифрованного пароля меняется в зависимости or бранного метода шифрования. Символ звездочки в поле пароля говорит о том, что и зователь не может быть допущен к системе через парольную проверку (системная у ная запись или заблокированная учетная запись пользователя). Формат записей в(\ /etc/master .passwd имеет следующий вид: username : password: uid: gid: class : chng: exp: coments : homedirectory: shell
Управление учетными записями пользователей 197 Здесь мы видим три новых поля: class, chng и ехр, которые характерны только щ BSD-систем (в некоторых системах присутствуют аналогичные решения, реализо- шные несколько иначе). Поле class используется для указания класса пользователя, чем мы поговорим чуть позже. Поле chng регулирует время до истечения срока дей- гаия пароля, а поле ехр определяет время истечения срока действия учетной записи. Йри значении 0 оба эти поля означают "не ограничено". Что касается прав доступа к файлам, то это, наверное, наиболее важный вопрос. Обращаем особое внимание на то, что изменение стандартных прав доступа может прийти к снижению стойкости системы к взлому или к несанкционированному доступу Некоторых пользователей к данным других пользователей. Итак, файл /etc/passwd имеет права доступа 644 (владелец— пользователь wot), что позволяет любому пользователю системы просматривать его содержимое. Файл /etc/master.passwd доступен только пользователю root с правами 600 (то Г, просматривать и изменять его может только root). Обратите внимание на используемый метод шифрования паролей. Пароли, зашифрованные по методу MD5 на сегодня небезопасны, так как существуют алгоритмы обитого преобразования хэша в строку, которая будет иметь такой же хэш. По этой принте для хранения паролей рекомендуется использовать метод BLF (Blowfish), который Кжа не имеет алгоритма обратного преобразования хэша в подходящую строку. Но р— не тема данной главы. Примеры записей из файла /etc/master.passwd (с примерами использованием Ккоторых из рассмотренных полей): ftpuser:$l$cOPqE/fc$J0/YCBqZelZ/BbyQeQFBM0:1002:80::0:1138114277:User: Whome/ftpuser: /us r/local/bin/bash f tpshell:$l$bn9LtrKU$nyESF8KJWKx8y/olKB6z6.:1003:80:standard:0:0:User: Whome/f tpshell: /bin/csh А теперь вспомним о том, что в начале мы говорили о частичном использовании файлов /etc/passwd и /etc/master.passwd системными утилитами. Так вот, действительности вся информация хранится в базах данных, которые представлены Системе FreeBSD файлами /etc/pwd.db и /etc/spwd.db. Эти файлы автоматиче- ои обновляются при любом изменении информации об учетных записях пользователей {помощью утилиты pwd_mkdb. Файлы /etc/pwd.db и /etc/spwd.db используются 1ля поиска пользователей соответствующими утилитами, а также вывода дополнитель- Юй информации о пользователе. Некоторые системные администраторы даже используют утилиту pwd_mkdb для (учного обновления базы данных пользователей, внося изменения в файл •/etc/master.passwd в любом текстовом редакторе с последующим выполнением гоманды: # pwd_mkdb master.passwd Обратите внимание на то, что файлы /etc/passwd и /etc/master.passwd тком случае стают рассогласованными (содержат различную информацию). В таких оучаях рекомендуется использовать утилиту vipw, которая запускает редактор по умолчанию для редактирования файла /etc/master.passwd и при сохранении внесенных изменений в момент выхода синхронизирует как файл /etc/passwd (в ручном режиме— команда pwd_mkdb -p), так и файлы баз данных. Вот и все, что касается файлов учетных записей пользователей, их формата, прав доступа и методов внесения изменений. Переходим к вопросам, имеющим отношение [(управлению учетными записями.
198 Глава 6. Пользователи и управление учетными записями Добавление пользователей Для добавления пользователей в систему используется несколько утилит и спои бов. В первую очередь, наиболее удобными и распространенными являются утилии adduser и pw. Некоторые администраторы позволяют себе добавлять пользоватак в систему путем редактирования файла учетных записей пользователя с обновление базы данных (см. предыдущий подраздел). Добавлением пользователя в систему можа также считать изменение пользователем root имени пользователя в утилите chpass что приводит к созданию новой учетной записи, но с тем же уникальным идентифин тором что и "редактируемый" пользователь. Впрочем, подобные ухищрения — не до этой книги ©. Не будем также забывать, что добавлять пользователей в систему можк только, обладая правами суперпользователя root. Утилита adduser Итак, наиболее простым вариантом добавления нового пользователя в систему m ляется использование утилиты adduser. Эта утилита позволяет, кроме добавления не обходимых записей в файлы паролей и групп, также создать домашний каталог полыо вателя, скопировать файлы настройки по умолчанию (dot-файлы), создав так называв мый "скелет домашнего каталога" с помощью файлов из каталога /usr/share/skel Утилита adduser также может создать для пользователя почтовое сообщение с привет ствием и указанием некоторых команд, которыми можно воспользоваться для настрой ки учетной записи. Обращаем внимание на отличия в использовании adduser в различных версия FreeBSD. Это связано с тем, что утилита, на самом деле, является простым сценарием,i ее содержимое можно в любой момент просмотреть и даже переписать "под себя". Hi дело даже не в этом. В системе FreeBSD 4.x данная утилита была написана на языке Ря а, начиная с FreeBSD 5.x и старше, она реализована с использования языка SHELL (рассматривается в главе 5). В первую очередь, рассмотрим использование adduser в системе FreeBSD до 54 версии, так как это должно предваряться операцией настройки конфигурации, котора заключается в создании конфигурационного файла /etc/adduser.conf. Настроит утилиты автоматически предлагается при ее первом запуске (точнее, всякий раз при от> сутствии конфигурационного файла), а также в любой момент позже после запуси с указанием параметра -config_create, если необходимо переопределить настроит Для того чтобы добавить новых пользователей, утилита adduser должна вызыватыа без аргументов (то есть, нет смысла указывать в командной строке имена пользовате- лей, которых необходимо создать, — утилита сама по ходу работы запросит данную информацию). По окончании процесса настройки конфигурации утилита сразу же з* просит добавить пользователя в систему. Пример настройки adduser и добавления пользователя testuser представлен в листинге 6.1. Лис^нг&Л. Пример, настройки у/Н*лит!*аадцв*г/Я^ в систем # adduser /etc/adduser.conf: No such file or directory Use option ''-silent'' if you don't want to see all warnings and ^questions. Check /etc/shells Check /etc/master.passwd Check /etc/group Usernames must match regular expression: ["[a-zO-9 ][a-zO-9 -]*$]:
Управление учетными записями пользователей 199 м. . .■■"' ' г-~-. ■ ' " ) ' ' ' '—" . ■ - i i».^. .1 Листинг 6:1.Окончание *•* -' ^* /.,-ч- ■> > "^ *у biter your default shell: csh date no sh tcsh [sh]: csh Your default shell is: csh -> /bin/csh Enter your default HOME partition: [/home]: Copy dotfiles from: /usr/share/skel no [/usr/share/skel]: Send message from file: /etc/adduser.message no [/etc/adduser.message] : Ose passwords (y/n) [y]: Srite your configuration to /etc/adduser.conf? (y/n) [y]: Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct Ъапу input. enter username [л[a-z0-9_][a-z0-9_-]*$]: testuser Enter full name []: some user for testing Enter shell csh date no sh tcsh [csh]: Enter home directory (full path) [/home/testuser]: Did [1000] : Enter login class: default []: Login group testuser [testuser]: Login group is testuser''. Invite testuser into other groups: guest no Ino]: Enter password [ ] : Enter password again []: Name: testuser Password: **** Fullname: some user for testing Did: 1000 Gid: 1000 (testuser) Class: Groups: testuser HOME: /home/testuser Shell: /bin/csh OK? (y/n) [y] : Added user ''testuser'' Send message to ''testuser'' and: no root second_mail_address [no]: some user for testing, your account ''testuser'' was created. Have fun! See also chpass(l), finger(1), passwd(l) Add anything to default message (y/n) [n]: Send message (y/n) [y]: Copy files from /usr/share/skel to /home/testuser [Add another user? (y/n) [y] : n \ Goodbye! Таким образом, мы настроили утилиту adduser на использование по умолчанию оболочки csh; задали директорию, в которой будут создаваться домашние каталоги пользователей (оставили значение по умолчанию); согласились на создание "скелета домашнего каталога" копированием dot-файлов из каталога /usr/share/skel; согласились на создание сообщения с приветствием пользователя. Также мы указали, что
200 Глава 6. Пользователи и управление учетными записями утилита должна запрашивать установку пароля пользователю. После настройки мы ср зу же смогли добавить пользователя testuser с параметрами по умолчанию. При да бавлении пользователя был создан его домашний каталог, установлен пароль, отослая сообщение приветствия, и создана группа, имя которой совпадает с именем пользовав ля, а пользователь автоматически был в нее включен (главная группа пользователя). В системах FreeBSD старше 5.0 утилита adduser не требует обязательного конф» гурирования. Она задает вопросы, администратор отвечает, и на основании его ответа запускается сценарий добавления пользователя с помощью утилиты pw. Если необх» димо, можно создать конфигурационный файл. Также утилита adduser в старших версиях FreeBSD "понимает" много опций командной строки и может быть вызвана в ко мандном, а не интерактивном режиме. Пример добавления пользователя в FreeBSD 6.0 представлен в листинге 6.2. Листинг 6.2.. Пример добавления пользователя С'помощьюутйлиты adduser ж систем^ # adduser Username: testuser Full name: user for test Uid (Leave empty for default): Login group [testuser]: Login group is testuser. Invite testuser into other groups? []: Login class [default]: Shell (sh csh tcsh ksh bash pure-ftpd myshell.pl nologin) [sh]: csh Home directory [/home/testuser]: Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username Password Full Name Uid Class Groups Home Shell Locked testuser + + + + * user for test 1004 testuser /home/testuser /bin/csh no OK? (yes/no): yes adduser: INFO: Successfully added (testuser) to the user database. Add another user? (yes/no): no Goodbye! Более подробную информацию об использовании утилиты adduser в системах старше FreeBSD 5.0 можно получить в справочном руководстве man adduser. Утилиту pw, используемую для добавления пользователей, мы рассматривать не будем. Оговоримся только, что это — довольно мощный инструмент, который требует особого внимания и понимания происходящего. Как правило, утилита pw используется опытными пользователями, а также в сценариях (см. справочное руководство man pw). Добавление нового пользователя с существующим UID Ранее мы уже упоминали случаи, когда необходимо добавить пользователя с повторяющимся идентификатором UID, теперь же покажем, как это сделать практически. Наиболее простой способ — добавить пользователя с помощью команды pw useradd, четко указав идентификатор через опцию -и с дополнительной опцией -о. Без опции
Управление учетными записями пользователей 201 -о утилита pw откажется производить добавление пользователя с повторяющимся идентификатором. Рассмотрим простой пример добавления с помощью утилиты pw пользователя testuser2, дублирующего пользователя testuser с идентификатором UID, равным 1004: # pw usershow testuser testuser:*:1004:1004:user for test:/home/testuser:/bin/csh # pw useradd testuser2 -u 1004 -s /bin/sh -c "testuser doubler" -g 4>testuser -d /home/testuser2 -o -h 0 password for user testuser2: # more /etc/passwd I grep testuser testuser:*:1004:1004:user for test:/home/testuser:/bin/csh testuser2:*:1004:1004:testuser doubler:/home/testuser2:/bin/sh Заметим, что при этом не будет создан домашний каталог /home/testuser2, даже если указать опцию -к для копирования dot-файлов, и его придется создавать вручную. Второй способ добавления пользователя с повторяющимся идентификатором U1D — с помощью утилиты chpass (которая будет рассмотрена ниже). Рассмотрим соответствующий пример (полужирным шрифтом выделены вносимые изменения): > chpass testuser #Changing user information for testuser. Login: testuser3 Password: $l$qGkTYL18$P15cg3I.aVAW.WsXkl50X. Uid [#]: 1004 Gid [# or name]: 1004 Change [month day year]: Expire [month day year]: Class: standard Home directory: /home/testuser3 Shell: /bin/csh Full Name: user for test Office Location: Office Phone: Home Phone: Other information: /etc/pw.rWwk2L: 15 lines, 346 characters, chpass: user information updated > more /etc/passwd I grep testuser testuser:*:1004:1004:user for test:/home/testuser:/bin/csh testuser2:*:1004:1004:testuser doubler:/home/testuser2:/bin/sh testuser3:*:1004:1004:user for test:/home/testuser3:/bin/csh В случае использовании chpass для дублирования пользователя для него невозможно установить пароль, и он будет совпадать с паролем первого пользователя. Изменение паролей описано ниже. Удаление пользователей Пользователи приходят и уходят, а следовательно для них необходимо не только создавать, но и удалять учетные записи. Несвоевременное удаление пользователя из системы может привести к несанкционированному доступу к данным извне (некоторые обиженные бывшие сотрудники предпринимают попытки навредить компании, в которой они недавно работали). Как же удалить учетные записи пользователей в системе FreeBSD? Наиболее часто для этого используются утилиты rmuser и pw.
202 Глава 6. Пользователи и управление учетными записями Утилита rmuser Для удаления пользователей из системы обычно используют утилиту rmuser. Он позволяет удалить не только учетную запись пользователя из базы данных, но и другую информацию, связанную с этим пользователем. Обращаем внимание на то, что rmuser может удалить сразу несколько пользователей, если передать их утилите в виде списки, разделенными символом пробела. Если утилита вызывается без указания имени польз» вателя в командной строке, то она потребует ввода имен пользователей при запуске. Утилита rmuser выполняет следующие операции: удаляет все записи пользователя из файла планировщика задач crontab, если таковые задачи присутствуют; удаляет задачи, поставленные командой at, принадлежащие пользователю; уничтожает все процессы, принадлежащие пользователю, с помощью сигнала SIGKILL; удаляет запись для пользователя из файла паролей; удаляет домашний каталог пользователя, в случае если он принадлежит пользователю; при этом удаляются также и все символические ссылки; удаляет принадлежащую пользователю входящую почту из каталога /var/mail; удаляет все файлы, принадлежащие пользователю, из каталогов с временными файлами (/tmp, /var/tmp и /var/tmp/vi . recover); удаляет имя пользователя из всех групп в файле /etc/group, к которым принадлежал пользователь; также удаляется пустая группа, имя которой совпадает с именем удаляемого пользователя (если такая существует); удаляет все потоки сообщений, освобождает сегменты общей памяти и семафоры, принадлежащие пользователю. Обратите внимание на то, что с помощью утилиты rmuser невозможно удалить учетную запись для пользователя root: # rmuser root rmuser: user (root) has uid 0. You may not remove this user. И это вполне объяснимо, так как исчезновение записи для пользователя root фактически означает крах операционной системы. Обращаем также внимание на то, что по умолчанию используется интерактивный режим удаления пользователя, который позволяет подтвердить удаление учетной записи и домашнего каталога. Пример такого удаления в системе FreeBSD 4.11: # rmuser testuser Matching password entry: testuser:01V4 9BwGnk5vQ:1000:1000::0:0:some user for testing:/home/testuser:/bin/csh Is this the entry you wish to remove? у Remove user's home directory (/home/testuser)? у Updating password file, updating databases, done. Updating group file: (removing group testuser — personal group is empty) done. Removing user's home directory (/home/testuser): done. Removing user's incoming mail file /var/mail/testuser: done. Removing files belonging to testuser from /tmp: done. Removing files belonging to testuser from /var/tmp: done. Removing files belonging to testuser from /var/tmp/vi.recover: done. В системе FreeBSD 5.x/6 результат запрос несколько меньше: # rmuser testuser
Управление учетными записями пользователей 203 Matching password entry: testuser:*:1004:1004::0:0:Test:/home/testuser:/bin/csh Is this the entry you wish to remove? у Remove user's home directory (/home/testuser)? у Removing user (testuser): mailspool home passwd. Для получения полного вывода выполняемых действий в FreeBSD 5.x/6 необходимо воспользоваться опцией -v: # rmuser -v testuser Matching password entry: testuser:*:1015:1015::0:0:User &:/home/testuser:/sbin/nologin Is this the entry you wish to remove? у Remove user's home directory (/home/testuser)? у Removing crontab for (testuser):. Removing at(l) jobs owned by (testuser): 0 removed. Removing IPC mechanisms. Terminating all processes owned by (testuser): -KILL signal sent to 0 processes. Removing files owned by (testuser) in /tmp: 0 removed. Removing files owned by (testuser) in /var/tmp: 0 removed. Removing mail spool(s) for (testuser): /var/mail/testuser. Removing user (testuser) (including home directory) from the system: Done. Для того чтобы проигнорировать подтверждающий запрос на удаление учетной записи и домашнего каталога, утилиту rmuser следует вызывать с опцией -у. Утилита pw Для удаления пользователя можно также воспользоваться утилитой pw. Для этого ее необходимо вызвать с аргументом userdel, указав имя или уникальный идентификатор пользователя: pw userdel usernameluid Тем не менее, данная команда не удалит пользовательский домашний каталог по умолчанию. Все, что будет удалено, — это почтовые файлы, принадлежащие пользователю, и запланированные задания crontab. Также будут удалены рабочие задания, запущенные командой at от имени удаляемого пользователя, но при условии, что уникальный идентификатор не используется другой учетной записью (вспомним о том, что может существовать несколько пользователей с одним и тем же уникальным идентификатором). Для того чтобы удалить домашний каталог пользователя, необходимо воспользоваться опцией -г. Но и в этом случае не все так просто. Во-первых, может быть другая учетная запись, для которой данный каталог также будет домашним; во-вторых, будут удалены только те файлы и символические ссылки, владельцем которых является удаляемый пользователь. При удалении каталогов учитывается, содержат ли они файлы: если в каталоге остались не удаленные файлы, то каталог удален не будет. Пример удаления учетной записи пользователя с помощью pw мы рассматривать не будем, так как в случае использования этой утилиты при успешном выполнении операции удаления на экран никакой информации не выдается.
204 Глава 6. Пользователи и управление учетными записями Изменение учетных записей Добавление и удаление пользователей — дело повседневное и не особо трудное. То же самое можно было бы сказать и о внесении изменений в учетные записи, если бык одно обстоятельство: некоторые операции изменения учетных записей могут выполни сами пользователи. Изменять учетные записи можно с помощью нескольких утилит: уже знакомой т pw, менее мощной chpass и утилиты изменения паролей passwd. Конечно же, можно воспользоваться и другими утилитами, например vipw, однако они менее "прозрачны" в использовании. Об использовании утилиты pw для изменения учетных можно узнап в справочном руководстве man pw, здесь же мы рассмотрим только использование утилит chpass и passwd. Использование chpass для изменения информации Утилита chpass/chfn/chsh позволяет в интерактивном или командном режии изменить ограниченное количество информации о пользователе в базе данных польм- вателей, в том числе оболочку, полное имя, персональную информацию. Суперпользо ватель root дополнительно может изменять также дату блокирования учетной записи дату истечения времени использования пароля, путь к домашнему каталогу и другую информацию. При этом, если простой пользователь системы может изменить только свою информацию, то суперпользователь — информацию любого пользователя. Запуск утилиты chpass в интерактивном режиме вызывает редактор, содержаще информацию о пользователе в формате: ОписаниеПоля: Данные Как только пользователь выходит из редактора с сохранением измененной информации, она обновляется в базе данных учетных записей. Рассмотрим следующий пример изменения информации о пользователе testuser самим пользователем: %pw usershow testuser testuser:*:1004:1004:user for test:/home/testuser:/bin/csh %chpass ((Changing user information for testuser. Shell: /bin/csh Full Name: Test User ' Office Location: 3 floor Office Phone: (8044)333-33-33 Home Phone: (8044 95)11111 Other information: itsupport /etc/pw.m4yYmQ: 7 lines, 188 characters. Password: chpass: user information updated %pw usershow testuser testuser:*:1004:1004:Test User,3 floor,(8044)333-33- 33, (804495)11111,itsupport:/home/testuser:/bin/csh ния системы FreeBSD версии старше 5.0 и не суперпольэователем root. В случае вызова от имени суперпользователя утилита chpass принимает следующий вид:
Управление учетными записями пользователей 205 > chpass testuser ^Changing user information for testuser. Login: testuser Password: $l$ttnlijcg$XHleI66JX0PQ6jJyG4rZXl Uid [#]: 1004 Gid [# or name]: 1004 Change [month day year]: Expire [month day year]: Class: Home directory: /home/testuser Shell: /bin/csh Full Name: Test User Office Location: 3 floor Office Phone: (8044)333-33-33 Home Phone: (804495)11111 Other information: itsupport Кроме того, изменять информацию о пользователях суперпользователь может с помощью утилиты vipw (для этого требуются прекрасные знания структуры файла /etc/master.passwd). Более подробную информацию можно найти в справочном руководстве man chpass. Использование passwd для изменения пароля Для изменения пароля пользователем или администратором используется утилита passwd. В принципе, это, практически, единственный вариант изменения пароля пользователем (есть несколько нестандартных способов изменить пароль, однако это уже — не вопрос правильного управления системой FreeBSD). При изменении пароля утилита passwd ведет себя по-разному для суперпользователя и обычного пользователя. Во-первых, обычный пользователь может изменить пароль только себе самому, во-вторых, для установки нового пароля он должен ввести старый пароль. Суперпользователь не имеет таких ограничений и может изменять пароли любому пользователю системы без запроса на ввод старого пароля пользователя. Вот как выглядит изменение пароля для обычного пользователя в системе FreeBSD 6.0 (FreeBSD 4.x после успешного изменения пароля выводит дополнительную информацию): %passwd Changing local password for informex Old Password: New Password: Retype New Password: % В том случае, если пароль изменяется суперпользователем, он должен указать имя пользователя, которому будет изменен пароль. Если суперпользователь изменяет пароль сам себе, то имя можно не указывать. Пример для системы FreeBSD 6.0: # passwd testuser Changing local password for testuser New Password: Retype New Password: Получение информации о пользователе Иногда требуется узнать некоторую информацию о пользователе. Каждый раз просматривать файл /etc/passwd неудобно, тем более, если пользователей в системе ты-
206 Глава 6. Пользователи и управление учетными записями сячи. Для быстрого получения информации используется простая команда finger, Пример ее использования для отображения информации о пользователях testuserl root: %finger testuser Login: testuser Name: Test User Directory: /home/testuser Shell: /bin/csh Office: 3 floor, (8044)333-33-33 Home Phone: (804495)11111 Never logged in. No Mail. No Plan. I %finger root Login: root Name: Charlie Root Directory: /root Shell: /bin/csh Last login Mon Jan 23 04:39 (EET) on ttyvO New mail received Wed Jan 25 03:07 2006 (EET) Unread since Sat Dec 24 03:11 2005 (EET) No Plan. Еще один интересный вариант — использование утилиты pw. Например: %pw usershow testuser -P Login Name: testuser #1004 Group: testuser #1004 ! Full Name: Test User Home: /home/testuser Class: Shell: /bin/csh Office,: 3 floor Work Phone: (8044)333-33-33 Home Phone: (804495)11111,itsupport Ace Expire: [None] Pwd Expire: [None] Без опции -Р данная команда просто выведет строку для учетной записи без паром из файла/etc/master.passwd: %pw usershow informex informex:*:1001:0::0:0:Olexa:/home/informex:/bin/csh КЛАССЫ Услышав слово "классы" в памяти сразу всплывает школа, ряд парт, прилежно одетьк школьники и строгий учитель, тайком надкусывающий мел ©. У тех же, кто занимаете! объектно-ориентированным программированием, это до боли знакомое слово вызывай совсем другую ассоциацию: контейнер для группирования логически объединенной совокупности данных и методов их обработки, позволяющий ограничить доступ к некого рым из заключенных в нем элементов. В системе FreeBSD понятие класса можно сош» тавить с обоими вышеупомянутыми понятиями. Класс в FreeBSD позволяет группировать пользователей (не путать с группами) IK принадлежности к классу, и ограничивать данный класс по различным критериям, н* пример, по времени использования процессора, по количеству выделяемой памяти, по правилам составления паролей и т.д. С помощью классов можно правильно распределить нагрузку или в целом уменьшить общую нагрузку на систему. Кроме ограничения классов, существует также ограничение на дисковый ресурс однако данное понятие не включено в класс, так как реализуется на уровне файлом! системы (квотирование дисков). Квотирование дисков рассмотрено в главе 8, поев» щенной основам управления файловыми системами и дисковым пространством. Итак, классы FreeBSD... Для их определения в системе предназначен фаШ /etc/login.conf. Каждая его строка (не считая пустых строк и комментариев) оп» сывает один класс. Первое слово в строке — это и есть имя класса. Имя класса моя!
Классы 207 иметь синонимы и описание, отделенные друг от друга вертикальной чертой "|" (например, standard|simpleuserlStandard User Class). Все имена должны быть записаны в нижнем регистре и не должны содержать пробелов и знаков табуляции, кроме последней записи в имени класса, которая выступает в роли описания. За именем класса следуют два символа двоеточия ":", которые являются разделителями полей, причем каждое поле в записи класса должно быть ограничено символами ":" с обеих сторон (то есть, между двумя соседними полями мы получаем по два двоеточия "::", а в конце записи класса — одно). Количество полей может широко варьироваться: от одного до нескольких десятков. Строку записи класса можно разрывать символом обратной косой "\" между полями и переносить остальную часть описания класса на новую строку. В конфигурации по умолчанию для простоты чтения на новую строку переносится каждое поле. Фактически, каждый класс имеет набор характеристик, и, присваивая класс пользователю, мы определяем для него все характеристики класса. Даже если пользователю класс не назначен явно, он будет присвоен ему по умолчанию. Таким классом является default. Что собой представляют поля записи или характеристики класса? Характеристика— это пара имя=эначение, где имя однозначно определяет характеристику, а значение — произвольная строка символов, смысл которой меняется в зависимости от характеристики. Некоторым характеристикам достаточно определить только их имя в классе без присвоения определенного значения. В данном контексте пример определения класса standard может иметь следующий вид: standard I Standard User Class:\ :copyright=/etc/COPYRIGHT::welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\ :path=~/bin /bin /usr/bin /usr/local/bin:\ :manpath=/usr/share/mah /usr/local/man:\ :nologin«»/var/run/nologin: \ :cputime=lh30m: \ :datasize=8M:\ :vmemoryuse=100M::stacksize=2M:\ :memorylocked=4M::memoryuse=8M:\ :filesize=8M:\ :coredumpsize=8M::openfiles=24:\ :maxproc=32::requirehome:\ :passwordtime=90d::umask=002:\ :ignoretime@::tc=default: Обращаем внимание на то, что недостаточно просто определить класс в файле /etc/login, conf. Подобно тому, как это происходит с файлами паролей, система и системные утилиты работают не с текстовым файлом, а с файлом базы данных. В данном случае, это файл /etc/login, conf .db. Для его создания необходимо воспользоваться утилитой cap_mkdb, выполняя после каждого изменения файла классов следующую команду: # cap_mkdb /etc/login.conf Теперь относительно характеристик... Их существует несколько: одни определяют ограничения на ресурсы, другие устанавливают характеристики среды по умолчанию, третьи определяют правила авторизации в системе. Класс, по умолчанию, не накладывает никаких ограничений на используемые ресурсы. При ограничении ресурсов (помощью класса необходимо помнить, что это — жесткие ограничения: пользователь яе может превысить ограничения на ресурсы, а только уменьшить. Текущее ограниче- we на ресурсы называется "мягким ограничением" и устанавливается самим пользователем или приложением. Следует помнить, что ограничения, как правило, влияют не на самого пользователя и его работу в системе, а на приложения, которые он запускает.
208 Глава 6. Пользователи и управление учетными записями Рассмотрим перечень и краткое описание некоторых характеристик для наложении ограничений на ресурсы, среду и возможность авторизации. I coredumpsize I Данная характеристика накладывает ограничение на максимальный размер файдМ core, который могут генерировать программы. Естественно, файлы core подчинЛ ются ограничениям, накладываемым файловой системой (например, квоты). Вя многих случаях необходимо ввести некоторый автоматический способ контроля размеров файлов, генерируемых программами без участия пользователя. Если щ пользователей очень ограничена квота на дисковое пространство, то имеет смысл установить значение данной характеристики в 0 во избежание неконтролируемого переполнения файловой системы. cputime Характеристика, задающая максимальное количество потребляемого времени центрального процессора, которое может использовать пользователь и его приложении, В случае превышения указанного предела времени процессы автоматически уничтожаются ядром системы. Стоит обратить внимание на то, что данная характеристика накладывает ограничения не на процент загрузки процессора, а только на вреш монопольного использования процессорного времени. filesize Данная характеристика задает максимальный размер файла, который может открыть пользователь. Это может оказаться дополнением к дисковым квотам, которые определяют общее количество файлов, принадлежащих пользователю, и их суммарный размер. login-backoff Количество неверных попыток входа в систему, после которого будет включена функция задержки запроса авторизации. По умолчанию, это число принимает в системе значение 3. login-retries Количество неуспешных попыток авторизации в системе, после которого любая попытка входа будет заблокирована. Значение по умолчанию равно 10 попыткам. maxproc Максимальное количество отдельных процессов, которые могут быть одновременно запущены пользователем. Следует обратить внимание на то, что в это число необходимо включить все фоновые процессы, и процессы, запущенные другими процессами. Не стоит устанавливать слишком жесткие офаничения, поскольку даже вход в систему уже запускает несколько процессов от имени пользователя, а некоторые профаммы могут запускать десятки параллельно выполняемых процессов (например, команда make). memoryuse Максимальный объем памяти, который может быть занят всеми процессами пользователя. Сюда входит как использование основной памяти, так и swap. openfiles Характеристика, указывающая на максимальное количество файлов, которые могут быть открыты процессами пользователя. passwdformat Алгоритм шифрования нового или измененного пароля пользователя. По умолчанию, данный параметр принимает значение md5, но может также принимать значе-
Группы пользователей 209 ния des или blf (рекомендуемый). Обратите внимание на то, что используемый метод шифрования паролей должен быть указан также в файле /etc/auth.conf для возможности использования такого пароля при авторизации в системе. passwordtime Используется для установки следующей даты напоминания о необходимости изменении пароля. sbsize Офаничение потребляемого пользователем объема сетевой памяти. Может быть использовано для офаничения количества сетевых соединений во избежание возможности использования DoS-атаки. stacksize Описывает максимальный размер стека одного процесса. Обратите внимание на то, что данный параметр не накладывает офаничения на размер используемой процессом памяти. requirehome Характеристика, которая требует обязательного наличия домашнего каталога у пользователя для возможности его входа в систему. vmemoryuse Максимальное количество используемой виртуальной памяти одним процессом. Более подробный перечень можно найти в справочном руководстве can login, conf. В завершение затронем некоторые особенности использования ряда специальных классов и аспекты, которые необходимо учитывать при использовании классов вообще. В первую очередь, процессам, запускаемым rc-сценариями при старте системы из каталога /etc, автоматически назначается класс daemon. Если существуют пользователи X-Window, то необходимо заранее учесть, что таким пользователям потребуются мини- шьные офаничения на ресурсы и большое количество одновременно запускаемых приложений. Никогда не накладывайте офаничения сверх необходимого, но, в то же время, не оставляйте неофаниченное количество ресурсов пользователям во избежание ^употребления их использованием. Также обращаем внимание на то, что некоторые офаничения устанавливаются не еа пользователя в целом, а на процесс. В связи с этим, можно предоставить пользователе довольно много прав, поскольку фактически его права все равно довольно сильно Офаничены. К примеру, Офаничение на количество открытых файлов действует не на пользователя, а на каждый процесс, запущенный от имени пользователя. ГРУППЫ ПОЛЬЗОВАТЕЛЕЙ \fpynna — это простой список пользователей, объединенных под одним именем. Каждая фуппа идентифицируется по своему уникальному имени и уникальному идентификатору группы GID. Так же как и в случае с пользователями, идентификаторы GID могут принимать значения от 0 до 65535. Группы являются неотъемлемой частью системы безопасности FreeBSD. Ядро системы для определения доступа к объектам использует как идентификатор пользователя, ик и идентификатор фуппы. Стоит отметить, что пользователь может иметь только «дин идентификатор фуппы, который описан в учетной записи. Этот идентификатор мисывает главную фуппу пользователя. Кроме главной фуппы, пользователь может водить и в другие фуппы.
210 Глава 6. Пользователи и управление учетными записями Список имен групп, соответствующих идентификаторов и пользователей, входящи в группы, можно найти в файле /etc/group. Отметим, что файл /etc/group — едия ственный описывающий группы. Никаких баз данных, связанным с ним, нет. Форма) данного файла довольно прост: это четыре поля, разделенных двоеточиями ":". Перв» поле описывает имя группы, второе — пароль группы, третье — уникальный идентификатор группы, четвертое — список пользователей, входящих в группу, в котором в к» честве разделителя используется запятая: wheel:*:0:root,informex www:*:80:ftpuser,ftpshell testuser:*:1004: Редактирование файла /etc/group, как правило, выполняют не вручную, хотя никакой проблемы в таком редактировании нет (если быть осторожным). Более безопасно для этого использовать утилиту pw, которая позволяет как добавлять, так и удалято группы. Рассмотрим пример добавления группы husers с просмотром информации о ней: # pw groupadd husers # pw groupshow husers husers:*:1005: В данном случае утилита сама определила необходимый идентификатор для группы (1005), который наверняка не совпадает с другими идентификаторами групп (что может возникнуть при ручном редактировании файла /etc/group). Для редактировании списка пользователей группы необходимо воспользоваться аргументом groupmod, а список пользователей, включаемых в группу, указать с помощью опции -М: # pw groupmod husers -M informex,testuser, testuser2 # pw groupshow husers husers:*:1005:informex,testuser, testuser2 Обратите внимание на то, что список групп в файле /etc/group является неполным. Это связано с тем, что при указании главной группы для пользователя при его создании пользователь не добавляется к списку групп. Да и группа, имя которой совпадает с именем пользователя, не обязательно должна присутствовать в файле групп. Утилита pw работает только с файлом /etc/group, в результате возможно неправильное представление о том, какие пользователи действительно входят в группу. С файлом паролей работает утилита id, которая позволяет просмотреть все группы, к которым принадлежит пользователь, в том числе и главную. Пример ее использования: # id testuser uid=1004(testuser) gid=1004(testuser) groups=1004(testuser), 1005(husers) Обратите внимание на то, что группа testuser отдельно указана в поле gid и отдельно — в поле groups. Отметим также, что включение пользователя в группу wheel позволяет такому пользователю получить права суперпользователя с помощью команды su. Включение пользователя в группу operator позволит ему выключать и перезапускать систему, а также производить архивацию данных. Напоследок укажем, что группы позволяют многим пользователям совместно владеть некоторыми файлами, а пользователю-владельцу более гибко регулировать права доступа к своим файлам. В целом, концепция групп в системе FreeBSD подобна другим системам за исключением того, что группы в FreeBSD не могут содержать другие группы.
Каталоги с файлами конфигурации системы 211 ГЛАВА 7. ОСНОВЫ УПРАВЛЕНИЯ СИСТЕМОЙ Что следует понимать под основами управления системой FreeBSD? В первую очередь, умение правильно настраивать конфигурационные сценарии (rc-файлы). Во-вторых, умение настраивать систему журнальных файлов (поддержка log-файлов), умение планировать выполнение определенных задач с помощью планировщика сгоп и at. Сюда же относится вопрос управления процессами. Возможно, информация данной главы покажется с первого прочтения "размытой" и не совсем понятной, но по ходу изучения остальных глав представленный материал будете все больше и больше проясняться. Если же оставить его без рассмотрения сейчас, то все дальнейшие попытки понять остальное могут оказаться тщетными. То, что описано в этой главе, — путь к эффективному управлению системой. КАТАЛОГИ С ФАЙЛАМИ КОНФИГУРАЦИИ СИСТЕМЫ Система, FreeBSD содержит несколько стандартных каталогов конфигурации. Каталоги конфигурации содержат в себе ряд файлов и подкаталогов, которые отвечают за поведение системы. К таким каталогам можно отнести: • „ /etc — основной каталог конфигурации системы; как правило, в нем размещены конфигурационные файлы, от которых полностью зависит система; /etc/defaults — каталог, в котором размещены версии системных конфигурационных файлов по умолчанию; /etc/bluetooth — каталог для конфигурационных файлов Bluetooth (FreeBSD 5.x и старше); /etc/mail — конфигурационные файлы для системы Sendmail (подробно рассмотрены в главе, посвященной работе с почтовыми серверами); /etc/namedb — файлы конфигурации для сервера DNS BIND (named); также содержит файлы зон; /etc/ppp — каталог для конфигурационных файлов для работы с протоколом РРР и подобных ему (к примеру, РРРоЕ); /etc/rc. d — системные стартовые сценарии в FreeBSD 5.x и старше; • /etc/ssh — каталог конфигурации протокола SSH (OpenSSH); /usr/local/etc — пользовательские конфигурационные файлы (то есть, конфигурационные файлы для приложений, установленных администратором); могут содержать другие подкаталоги в зависимости от установленных приложений (когда приложение настраивается более, чем одним конфигурационным файлом); /usr/local/etc/rc.d — сценарии запуска и останова для установленных администратором приложений. Конфигурационные файлы некоторых из этих каталогов мы рассмотрим в текущей главе, остальные — в соответствующих главах книги.
212 Глава 7. Основы управления системой Каталог /etc Каталог /etc содержит основную конфигурацию системы, необходимую для ее» грузки и работы. Первым делом, когда начинается настройка системы, вы заходите в к» талог /etc и изменяете там необходимые файлы. Понимание структуры этого каталога размещенных в нем файлов и их назначения, правил их корректной настройки — верный путь к совершенствованию. По сути, понимание каталога /etc — это понимание работы самой системы. Возможно, придется потрать много времени на просмотр и изучение всех содержащихся в нем файлов, но можем уверить: время не будет потрачено напрасно. К слову, многие файлы из каталога /etc подробно рассматриваются в других главах, более подробно описывающих работу с той или иной частью системы. Изучение каталога /etc также станет хорошим подспорьем для понимания каталога /usr/ local/etc. Некоторые файлы из каталога /etc находятся и в каталоге /etc/defaults, который используется для задания настроек по умолчанию. Смысл настройки системы как раз, в основном, и заключается в переопределении параметров, заданных в конфигурационных файлах из каталога /etc/defaults через конфигурационные файлы каталога /etc. При этом файлы в каталоге /etc/defaults не должны никогда изменяться, а только использоваться для просмотра настроек по умолчанию и списка параметров. Все файлы каталога /etc рассмотреть мы не сможем и не будем — часть из них будет описана в других разделах главы или в других главах книги, и потому здесь также не рассматривается. Некоторые файлы присутствуют только в определенных версиях системы, а в других версиях не используются, размещены в других каталогах или требуют, в случае необходимости, создания вручную. Сценарии конфигурации /etc/rc Во время запуска система (до момента запуска приложений) запускает сценарий /etc/rc. В различных версиях FreeBSD этот файл отличается содержимым и принципом работы. Так, в системе FreeBSD 4.x он единолично отвечает за запуск большинства системных служб (например, монтирует дисковые устройства, настраивает сетевые интерфейсы и другие устройства), а также выполняет другие важные задачи для приведения системы в работоспособное состояние. В FreeBSD 5.x и старше принято использовать другой вариант файла /etc/rc. Теперь его задача — выполнить сценарии из каталога /etc/rc. d. По сути, практически ничего не поменялось — просто файл /etc/rc был разбит на отдельные составляющие по службам или задачам, которые теперь хранятся в отдельных файлах в каталоге /etc/rc. d. Если раньше для изменения поведения системы требовалось редактировать громоздкий файл, то теперь просто создается новый файл в каталоге /etc/red, который затем приводится к некоему стандартному виду, а сценарий /etc/rc позаботится об его выполнении при следующем запуске системы (можно запускать сценарии и вручную во время работы системы). Кроме того, в каталоге /etc присутствует еще несколько сценариев конфигурации, имена которых начинаются с гс, например, re. firewall. В различных версиях FreeBSD набор таких файлов меняется. Фактически, они постоянно исчезают и появляются в каталоге /etc/red. Перечислим некоторые из файлов гс. (большинство присутствует только в системе FreeBSD 4.x): /etc/rc.atm Данный сценарий настраивает сетевую службу ATM. /etc/rc.disklesslи/etc/rc.diskless2 Если FreeBSD используется для бездисковой загрузки по протоколу ВООТР, то будет запущен этот сценарий. Бездисковая загрузка требует отдельного рассмотрения, так как является сложной и нетривиальной задачей.
Каталоги с файлами конфигурации системы 213 /etc/firewall Сценарий, который содержит базовую настройку для брандмауэра ipf w. Этот файл можно использовать в качестве примера для создания своей конфигурации ipfw. /etc/rc.firewall6 Сценарий, содержащий настройки ipfw для пользователей, которые используют протокол IPv6. • /etc/rc.i386 Сценарий, который используется любыми системами архитектуры х86 (Intel PC) при загрузке для настройки специфических опций (например, настройки консоли). /etc/rc.isdn Сценарий на тот случай, если используется встроенная поддержка ISDN (цифровая сеть комплексного обслуживания). /etc/rc.network Если этот сценарий присутствует, то он отвечает за настройку сетевой среды (в том числе запускает другие описанные здесь сценарии /etc/rc. *) /etc/rc.network6 Сценарий, отвечающий за настройку сетевой среды в случае использования протокола IPv6. /etc/rc.serial Этот сценарий устанавливает оптимальные настройки для последовательных интерфейсов, например, портов или терминалов. Это обусловлено тем, что последовательные интерфейсы всегда настроены по умолчанию, однако могут работать не так, как необходимо. /etc/rc.syscons Небольшой сценарий, устанавливающий параметры для терминала, хранителя экрана, наборов клавиатуры и другие настройки, связанные с выводом информации на терминал. /etc/rc.sysctl Сценарий, который позволяет установить (изменить значения по умолчанию) переменные ядра, перечисленные в файле /etc/sysctl. conf (описан ниже в этой же главе). Все перечисленные сценарии никогда не изменяются вручную. Фактически, это даже является ошибкой — существуют другие способы изменить поведение системы. В действительности, изменить работу сценариев /etc/rc можно с помощью основных файлов конфигурации /etc/defaults/rc.conf и /etc/rc.conf, при этом изменяется только последний, а первый используется для задания списка переменных и их значений по умолчанию. Файлы /etc/defaults/rc.conf И/etc/rc.conf Кроме громоздкого файла /etc/rc, когда-то использовался один файл, полностью управляющий его поведением: /etc/rc.conf. При этом он содержал список всех воз- ножных переменных и значения по умолчанию. Настройка системы заключалась в из- яенении значений переменных в этом файле. Поначалу файл /etc/rc.conf был небольшим и проблем с его ведением не возникало, затем система все более расширялась, расширялся сценарий /etc/rc, а с ним — и конфигурационный файл /etc/rc. conf. В конце концов, его поддержка стала рутинным занятием, администраторы допускали
214 Глава 7. Основы управления системой Щ все больше ошибок в его настройке, что приводило к неудобствам при работе с сиен мой. Тогда было принято решение выделить список переменных с их установками щ умолчанию в отдельный файл в каталоге /etc/defaults, а в /etc/rc. conf хранив только их переопределения. Как следствие, файл /etc/rc. conf в большинстве систаи небольшой и содержит нестандартные установки, а по умолчанию — пуст. I Если необходимо выяснить список переменных по управлению системой и назни ценные им значения по умолчанию, можно просмотреть содержимое файла /etc! defaults/rc.conf или вызвать страницу справочного руководства man rc.conl При этом обращаем внимание на то, что все переменные в данном файле сгруппировши по службам и типу, прчем некоторые из них являются простыми переключателями, по зволяющими или запрещающими рассматривать другие установки из данной груш Например, в следующем фрагменте: firewall_enable="NO" # Set to YES to enable firewall functionality firewall_script="/etc/rc.firewall" # Which script to run to set up the %>firewall firewall_type="UNKNOWN" # Firewall type (see /etc/rc.firewall) firewall_quiet="NO" # Set to YES to suppress rule display firewall_logging="NO" # Set to YES to enable events logging firewall_flags="" # Flags passed to ipfw when type is a file первая переменная, установленная в значение NO, означает, что все остальные перемен- ные не будут рассматриваться, но как только вы измените его на YES с помощью файи /etc/rc. conf, будут использованы значения всех остальных переменных группы. Перейдем непосредственно к рассмотрению файла /etc/rc.conf. В первую оче редь, предупредим, что простое копирование файла /etc/defaults/rc.conf повер! /etc/rc.conf с последующим редактированием — первый шаг к ошибке. Второе- изменение значения переменной-переключателя в файле /etc/rc.conf переопредел» ет только текущее значение, все остальные связанные переменные группы будут ю пользоваться согласно файлу /etc/defaults/rc.conf. Как это отражается на практике? Предположим, мы добавили следующую строку в файл конфигурации: inetd_enable="YES" Этим мы изменили значение для указанной переменной. Теперь во время стари системы будет запускаться сервис суперсервера inetd. Однако в конфигурации по умолчанию установлены еще и такие переменные: inetdjprograra="/usr/sbin/inetd" inetd_flags="-wW -С 60" Первая переменная задает путь к исполняемому файлу сервиса. Вторая строка позволяет определить опции, с которыми будет запущен сервис. Если их значения устраивают, то можно оставить все как есть, иначе потребуется скопировать необходимую строку в файл /etc/rc.conf и установить другое значение. Например, строки, задающие запуск суперсервера inetd и переопределяющие опции в файле /etc/ re, conf, могут принять следующий вид: inetd_enable="YES" inetd_flags="-wW -С 60 -с 200" Пример конфигурационного файла /etc/rc.conf представлен в листинге 7.1. Листинг 7.1. Пример конфигурационного файла/ate/ro.aoriie j apm_enable="yes" font8xl4="cp866-8xl4" font8xl6="cp866-8x16" font8x8="cp866-8x8" inetd enable="YES"
Каталоги с файлами конфигурации системы 215 Листинг7.1.Окончание ■ ..-■: ■■ '%■;". ■ ;■:-*--; -. х- ----у ■ ■•'..- . ■•- -^н/:" '•/..[ keymap="ru. koi8-r" diousechar_start="3" moused_enable="YES" moused_f lags="" inoused_port="/dev/psmO" moused_type="auto" saver="logo" linux_enable="YES" scrnmap="koi8-r2cp8 66" sendraa i l_enabl e= " У Е S " sshd_enable="YES" usbd_enable="YES" pccard_enable="YES" pscard_ifconfig="YES" hostname="mobile.altersys-ua.com" ifconfig_epO="inet 192.168.0.200 netmask 255.255.0.0" defaultrouter="192.168.0.1" firewall_enable="YES" firewall_type="CLIENTn apache_enable="YES" mysql_enable="YES" pureftpd_enable="YES" Обратите внимание на то, что некоторые строки из этого файла полностью совпадают с соответствующими строками из файла /etc/defaults/rc.conf. Иногда это используется администраторами, если значение некоторой переменной постоянно меняется со стандартного на какое-либо другое, а также в тех случаях, когда администратор хочет быть уверен, что некоторый сервис включен. Возможно, читатель обратил внимание на то, что последние три строки в листин- ге7.1 нестандартны по отношению к файлу /etc/defaults/rc.conf. Это связано с появлением новой технологии работы с rc-сценариями для программ, устанавливаемых из портов или пакетов, — rcNG (будет рассмотрена в этой же главе чуть позже). В файле конфигурации системы разрешено использовать комментарии. Комментарии должны начинаться с символа решетки "#" и могут быть размещены как в начале новой строки, так и в любом другом месте, например, после описания переменной и ее значения: # Сетевые настройки hostname="mobile.altersys-ua.com" # имя машины ifconfig_epO="inet 192.168.0.200 netmask 255.255.0.0" # настройка сети defaultrouter="192.168.0.1" # шлюз по умолчанию # Запуск приложений на основе технологии rcNG apache_enable="YES" # запускать Web-сервер Apache mysql_enable="YES" # запускать сервер баз даных MySQL Еще одной возможностью, часто применяемой в конфигурационном файле, является включение внешних файлов с описанием конфигурации. Это возможно благодаря тому, что конфигурационный файл считывается с помощью sh. Для включения внешних файлов необходимо поставить в начале строки точку, а затем — пробел и полный путь к включаемому файлу. Эта возможность нередко используется на компьютерах, где часто приходится изменять конфигурацию по строгим правилам. Предположим, в юмпании есть две независимые сети, с различными настройками, и один компьютер постоянно включается то в одну, то в другую сеть. Каждый раз изменять множество строк утомительно и не имеет смысла — можно пойти более простым путем: создать два файла, соответствующие той или иной сети, к которой подключен компьютер, и
216 Глава 7. Основы управления системой подключить их как внешние файлы с описанием конфигурации. При этом строку i ключения внешнего файла конфигурации для сети, к которой компьютер в данный^ мент не подключен, следует закомментировать: # more /etc/rc.conf mousechar_start="3" saver="logo" font8x8="cp8 66-8x8" font8xl4="cp866-8x14" font8xl6="cp866-8x16" scrnmap="koi8-r2cp8 66" keymap="ru.koi8-r" linux_enable="YES" sendmail_enable="YES" sshd_enable="YES" usbd_enable="YES" inetd_enable="YES" #. /etc/rc.conf.netlO . /etc/rc.conf.netl92 # more /etc/rc.conf.netlO ifconfig_lncO="inet 10.10.10.1 netmask 255.0.0.0" hostname="mobile.main.com.ua" defaultrouter="10.0.0.1" # more /etc/rc.conf.net192 ifconfig_lnc0="inet 192.168.0.250 netmask 255.255.255.0" hostname="mobile.altersys-ua.com" defaultrouter="192.168.0.1" Теперь, подключаясь к другой сети, достаточно закомментировать подключен! одного внешнего файла и снять комментарий с другого, после чего перезапустить си тему. Файл /etc/rc. local В случае FreeBSD 5.x и старше, в каталоге /etc/red можно найти сценар! local, просмотрев который становится понятно, что его работа заключается в поиа файла /etc/rc.local и его исполнении при старте системы. Кроме того, сценар! local ищет файл /etc/rc. shutdown, local и выполняет его при завершении раб| ты системы. Пользователи системы FreeBSD 4.x могут найти подобную запись в сцен рии /etc/rc. Каково же назначение этих файлов и почему они отсутствуют по умолчании Раньше именно файл /etc/rc. local обеспечивал запуск требуемых приложений! время загрузки системы, но по причине появления множества стандартных конфигур ционных файлов необходимость в его использовании просто отпала. Тем неменее, hi смотря на устарелость и отсутствие по умолчанию, никто не запрещает использовя файл /etc/rc. local и сегодня. Его можно создать самостоятельно и записать любь команды, которые требуется запустить, а также добавить в файл /etc/rc. shutdown local команды корректного завершения исполнения программ перед завершением р боты системы. Тем не менее, в случае использования файла /etc/rc. local под большим вопр сом остается безопасность системы. Это обусловлено тем, что все перечисленные в ш команды будут выполнены от имени пользователя root. По этой причине использовя /etc/rc. local не рекомендуется. Файл приветствия /etc/motd /etc/motd — это файл приветствия пользователей, входящих в систему. Вне размещаются все сообщения и информация, которую необходимо донести пользоват
Каталоги с файлами конфигурации системы 217 лям во время начала работы с системой. Как правило, в /etc/motd размещается предупреждение о последствиях неправомерного использования системы и т.п. Данный файл можно изменить в любом текстовом редакторе. Следует учесть, что не все пользователи обязательно будут видеть одно и то же содержимое /etc/motd при входе в систему, поскольку для определенных классов пользователей (в файле /etc/login, conf) можно назначить в качестве файла приветствия при входе другой файл, в том числе и отсутствующий в действительности. Файл /etc/sysctl. conf Файл /etc/sysctl.conf очень похож на /etc/rc. conf. Он позволяет установить значения для переменных ядра в виде variable=value. Указанные значения применяются после перевода системы в многопользовательский режим с помощью утилиты sysctl (см. страницу справочного руководства man sysctl). ПРИМЕЧАНИМЕ С помощью файла /etc/syscti. conf можно установить не все переменные ядра. Утилита sysctl позволяет оптимизировать работу системы за счет оптимизации использования той или иной подсистемы ядра (например, дисковой подсистемы), хотя, по большому счету, говорить об оптимизации с помощью sysctl не совсем корректно, поскольку общее назначение этой утилиты — изменить состояние переменных ядра, что может вполне привести и к ухудшению работы. Пример файла /etc/sysctl.conf, настроенного на выключение протоколирования фатальных ошибок программ и разрешение Linux-программам определять, что они спускаются под FreeBSD, будет выглядеть следующим образом: kern.Iogsigexit=0 compat.linux.osname=FreeBSD compat.linux.osrelease=5.4-RELEASE Более подробная информация содержится на странице man sysctl. conf. Конфигурационный файл /etc/syslog. conf для службы ведения журналов системных сообщений sysiogd Утилита sysiogd постоянно находится в памяти и предназначена для перехвата и передачи системных сообщений на консоль, в журнальный файл, на другие компьютеры или пользователям в зависимости от конфигурации (журнальные файлы по умолчанию хранятся в каталоге /var/log). Поведение утилиты sysiogd определяется конфигурационным файлом /etc/ syslog.conf, в котором просто указаны типы системных сообщений, службы, создающие сообщения, и действия над перехваченными системными сообщениями. Типы сообщений и службы, как правило, стандартизированы. К примеру, существуют следующие типы сообщений (в порядке убывания от строгого до незначительного): emerg, alert, crit, err, warning, notice, info и debug. Список служб также строго ограничен, это: auth, authpriv, console, cron, daemon, ftp, kern, lpr, mail, mark, news, ntp, security, syslog, user, uucp и от localO до 1оса17. ВНИМАНИЕ! Названия имен типов и служб должны записываться только прописными буквами, ^.^МУ..!^ФИ.!Ж?У.И„°^Ы.И Фаил чувствителен к регистру символов. Перед типом сообщения можно использовать несколько спецификаторов, таких как !, <, > и =. Они позволяют более точно указывать, что необходимо сохранять в журнале. По умолчанию, применяется спецификатор =>, то есть, перехватываются все сообщения
218 Глава 7. Основы управления системой данного типа и уровнем выше. Установка спецификатора ! указывает на инвертор ние. Фактически, значение !info можно заменить на <info. Указание !=info позв^ ляет перехватывать все типы сообщений, кроме info, a =infо — сообщения тол типа info. Каждый сервис системы может генерировать сообщения определенного типа, kqi рые перехватываются службой syslogd и записываются в требуемый журналы» файл согласно конфигурации. Файл конфигурации по умолчанию представлен в лис re 7.2. Листинг 7.2. Конфигурационный файл/ate/Byslog.eoo£ g системе FhaeBSD 5.4 *.err;kern.warning;auth.notice;mail.crit /dev/console *.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err 4>/var/log/messages security.* /var/log/security auth.info;authpriv.info /var/log/auth.log mail.info /var/log/maillog lpr.info /var/log/lpd-errs ftp.info /var/log/xferlog cron.* /var/log/cron *.=debug /var/log/debug.log *.emerg * ! startslip *.* /var/log/slip.log !ppp *. * /var/log/ppp.log Первая строка в этом файле означает, что все сообщения типа err от любой слу* бы, сообщения ядра типа warning, сообщения по авторизации типа notice, а таюю сообщения crit от почтовых утилит будут выводиться в файл устройства системно! консоли, то есть, — на первую физическую консоль /dev/console. Вторая строка позволяет сохранять в файле /var/log/messages основную част» системных сообщений, поэтому данный файл является, по сути, главным журнальный файлом FreeBSD. Третья строка позволяет перехватывать и записывать в файл /var/log/security все сообщения защиты. Согласно четвертой строке, информационные сообщения об авторизации пользователей в системе сохраняются в файле /var/log/auth. log. Из пятой строки следует, что все информационные сообщения почтовых программ можно найти в журнальном файле /var/log/maillog и т.д. Конфигурационный файл из листинга 7.2 немного урезан по сравнению с оригинальным файлом, а точнее — убраны комментарии. В комментариях размещался текст, описывающий возможность перенаправления сообщений на другие компьютеры и не только. Перенаправить сообщение можно: в файл или на определенное устройство по файлу устройства — для этого следует указать путь к файлу, например, /var/log/messages; службе syslogd на другом компьютере в сети по его имени, указав перед ним символ "@", например, @mobile.altersys-ua.com; при этом должна быть включена поддержка сетевой службы syslogd; на терминал зарегистрированному пользователю или пользователям — достаточно указать имя пользователя, или список имен пользователей, разделенный запятыми; указание символа "*" позволяет выводить сообщение всем пользователям (пример — десятая строка листинга 7.2 для * . emerg); с помощью внешней утилиты через конвейер; например, для отправки системных сообщений по почте на адрес infoOmain. com. ua используют запись: | "mail info@main.com.ua"
Каталоги с файлами конфигурации системы 219 Более полную информацию по этому вопросу можно найти на страницах man syslog. conf и man syslogd. Файл /etc/newsyslog.conf Постоянная работа системы привела бы к переполнению раздела /var за счет постоянно разрастающихся журнальных файлов в каталоге /var/log. В действительности, этого не происходит за счет наличия утилиты newsyslog, которая периодически запускается планировщиком сгоп. За управление утилитой newsyslog отвечает конфигурационный файл /etc/newsyslog.conf. Суть работы newsyslog заключается в определении времени архивирования и перегруппировки журнальных файлов, а также удалении устаревших упакованных log- файлов. Благодаря ей, можно наблюдать, как каждые сутки создается новый файл /var/log/messages, а старый упаковывается в файл под именем messages. 0.bz2 (нли ему подобным). На следующий день журнальный файл будет создан заново, а старый упакован в файл messages. О .bz2, при этом прежний файл с этим именем будет переименован в messages. I.bz2. Файлы упаковываются с помощью утилит bzip2 (флаг J) или gzip (флаг Z). Что собой представляет файл /etc/newsyslog. conf и как с его помощью управлять утилитой ротации журнальных файлов? Все довольно просто: каждая строка позволяет задать журнальный файл, который должен инспектироваться по различным критериям (например, сколько максимально может храниться файлов, когда происходит ротация по времени или по размеру, какие дополнительные операции необходимо при этом выполнить). Строки разбиты на поля: logf ilename — имя файла для инспектирования; owner:group — права доступа к файлу по пользователю и группе (можно использовать как имена, так и идентификаторы); mode — используется для контроля и установки прав доступа для файла и архивной копии; count — количество хранимых архивных копий (не включая текущий журнальный файл); size — максимальный размер файла в килобайтах, при достижении которого необходимо выполнить ротацию; when — время ротации файла; flags —дополнительные опций ротации. Пример файла /etc/newsyslog. conf представлен в листинге 7.3. Листинг 7.3. Конфигурационнь1Й файл /»tCL/inewsyelog. conf в системе FreeBSD 5.4 t logfilename [/pid file] [sig num] /var/log/all.log /var/log/amd.log /var/log/auth.log /var/log/console.log /var/log/cron /var/log/daily.log /var/log/debug.log /var/log/kerberos.log /var/log/lpd-errs /var/log/maillog /var/log/messages /var/log/monthly.log /var/log/pflog /var/run/pflogd.pid /var/log/ppp.log [owner root: :group] network mode 600 644 600 600 600 640 600 600 644 640 644 640 600 640 count size 7 7 7 5 3 7 7 7 7 7 5 12 3 3 * 100 100 100 100 * 100 100 100 * 100 * 100 100 when @T00 * * * * @T00 * tf * @T00 * 3M1D0 » * flags J J J J J JN J J J J J JN JB J
220 Глава 7. Основы управления системой Листинг 7.3. Окончание /var/log/security /var/log/sendmail.st /var/log/slip.log /var/log/weekly.log /var/log/wtmp /var/log/xferlog root:network '.: л':'' 600 640 640 640 644 600 •-., •- 10 10 3 5 3 7 100 * 100 1 * 100 * 168 + $W6D0 ■ В I I JN 1 0O1TO5 В | * J | Расскажем подробнее об использовании полей size, when и flags. Если в noi size или when указан символ звездочки "*", то это поле будет проигнорировано (м| спектирование по данному критерию не выполняется). Естественно, одновременное i пользование "*" по обоим критериям для одной записи лишено смысла. Особенности задания времени в поле when Рассмотрим представлении времени в поле when. Существует два подхода к указ» нию времени: по стандарту ISO8601 через символ @ и задание периодического выпои нения в определенное время дня, дня недели или месяца через символ $. По стандарту ISO время задается в следующем формате: @[[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]] Таким образом, если сегодня 14-е марта 2006 года, то эту дату можно задать следующим образом (после символа # размещен комментарий, который необходимо убрать при использовании в реальной системе): 02ОО6О314ТОООООО 0О6О314ТОООООО 0О314ТОООООО 014ТОООООО @Т000000 @тоооо @тоо @14Т @т # # # # # # # # # полночь полночь полночь полночь полночь полночь полночь полночь полночь 14 марта 2006 14 марта 2006 14 марта текущего года 14-го числа текущего месяца текущего дня чекущего дня текущего дня 14-го числа текущего месяца текущего дня Когда необходимо задать не четкое, а периодическое выполнение ротации по времени суток, дню недели или месяца, используется символ $, после которого можно указать число в следующих форматах: [Dhh], [Ww[Dhh] ], и [Mdd[Dhh] ], где hh — час дня в 24-хчасовом формате (0...23); w — порядковый день недели (0...6), где 0 обозначает воскресение, а 6 — субботу; dd — число месяца (1 ...31). Поскольку месяцы имеют неодинаковое количество дней, для случая, когда необходимо указать последний день месяца, используется буква L или 1. Несколько примеров задания времени ротации в поле when: $D0 — ротация каждую ночь в 00:00 (можно использовать @Т00); 5W0D21 — ротация каждую неделю в воскресенье в 21:00; $W5D1 — ротация каждую неделю в пятницу в 01:00; $M5D12 — ротация 5-го числа каждого месяца в 12:00 (аналогично 0О5Т12) Использование флагов в поле flags Рассмотрим опциональное поле flags. В нем можно указать один или несколько символов, которые изменяют процесс ротации журнальных файлов. Для каждого файла задаются собственные флаги. Можно использовать следующие флаги (неполный список): в — позволяет указать что журнальный файл имеет двоичный или какой-то специальный формат — по умолчанию, утилита ротации вставляет в журнальный
Каталоги с файлами конфигурации системы 221 файл перед ротацией текстовое сообщение; использование данной опции означает, что информационное сообщение добавлено не будет; . с — указывает на необходимость создания файла в случае его отсутствия; D — указывает утилите newsyslog установить флаг UF_NODUMP; G — указывает, что имя журнального файла является шаблоном; утилита newsyslog должна выполнять ротацию всех файлов, подпадающих под данный шаблон, с учетом настроек и других опций; j — указывает на необходимость бережного отношения к дисковому пространству и упаковке файлов с помощью утилиты bzip2; N — указывает, что нет необходимости в наличии процесса, которому необходимо сообщить о ротации файлов; • w — если используется совместно с флагом z или J, то указывает на необходимость дождаться завершения процесса упаковки предыдущего файла прежде, чем начать новый процесс уже для этого файла; z — указывает на необходимость компрессии журнального файла при ротации с помощью утилиты gzip; Более подробную информацию по этому вопросу можно найти на страницах nan newsyslog и man newsyslog. conf. Другие файлы Перечислим другие файлы каталога /etc: aliases — список почтовых псевдонимов; символическая ссылка на mail/ aliases; csh. cshrc, csh. login, csh. logout — конфигурационные файлы для командного интерпретатора csh/tcsh; exports — список каталогов для экспортирования по NFS; dhclient. conf — конфигурационный файл для утилиты dhclient; fstab — список устройств для монтирования на этапе загрузки системы или вручную по упрощенной схеме; ftpusers — список пользователей, которым запрещен вход в систему по протоколу FTP (для даемона f tpd); group — список групп пользователей; hosts — список соответствия IP-адресов и имен машин; login. conf — список классов и их описание; make. conf — настройки для утилиты make; master. passwd — текстовая база данных пользователей формата FreeBSD; nsmb. conf — конфигурационный файл для smbfs; passwd — текстовая база данных пользователей; • profile — конфигурационный файл для оболочек sh, bash, ksh; protocols — список сетевых протоколов; pwd. db — база данных пользователей; resolv. conf — файл настройки порядка просмотра серверов DNS; services — список привязки сервисов к протоколам; shells — список разрешенных командных интерпретаторов; spwd. db — база данных пользователей формата FreeBSD; ■ ttys — настройки терминала. Остальные файлы уже были или будут рассмотрены в других главах книги. Более подробную информацию ищите в соответствующих разделах справочного руководства. Использование сценария /etc/rc в FreeBSD 5.x Поговорим подробнее об изменениях в сценарии /etc/rc и новом каталоге /etc/red, появившихся в версии FreeBSD 5.1. Большинство файлов каталога
222 Глава 7. Основы управления системой /etc/red предназначены для запуска/останова/перезапуска основных сервисов. И можно управлять с помощью параметров start, stop и restart. Например, си дартный сервис sshd может быть перезапущен следующей командой: # /etc/rc.d/sshd restart Эта процедура аналогична и для всех остальных сервисов. Естественно, что серв сы обычно запускаются автоматически во время старта системы, как определи в /etc/rc.conf. Например, даемон inetd при запуске выполняется простым доба лением следующей строки в /etc/rc. conf: inetd_enable="YES" Если в файле присутствует строка inetd_enable="NO", тогда следует простои менитб N0 на УЕЭ.Поскольку система re. d предназначена для запуска/останова серв сов во время запуска/отключения системы, стандартные параметры start, stop restart будут работать только при условии, что установлена соответствующая пере менная в файле /etc/rc.conf. Например, рассмотренная выше комац /etc/rc.cd/sshd restart будет работать только в том случае, если переменна sshd_enable в файле /etc/rc. conf установлена в значение YES. Для выполнения сценариев независимо от установок в /etc/rc.conf параметр! start, stop или restart необходимо указывать с префиксом force. Например, дл перезапуска сервиса sshd независимо от установок в файле /etc/rc. conf выполни! следующую команду: # /etc/rc.d/sshd forcerestart Для быстрой проверки состояния переменной в файле /etc/rc.conf достаточм запустить соответствующий сценарий с параметром rcvar. Например, проверка пере менной для сервиса sshd выполняется следующей командой: # /etc/rc.d/eehd rcvar # sshd $sshd_enable=YES Для того чтобы определить, запущен ли сервис, существует параметр status. H* пример, для проверки того, запущен ли сервис sshd, выполните такую команду: # /etc/rc.d/sshd status sshd is running as pid 381. Для перезагрузки сервиса используется параметр reload. Перезагрузка в данной случае означает попытку отправить сервису сигнал, вызывающий перезагрузку конфигурации. Как правило, это подразумевает отправку сервису сигнала SIGHUP. Работа многих сервисов системы зависит от корректной работы других сервисоа Например, сервисы NIS и другие, основанные на протоколе RPC, могут не запуститьц пока не загрузится rpebind (portmapper). Для решения этой проблемы в начале каждого сценария в комментарии включается информация о зависимостях. Для разбора таких комментариев и определения порядка запуска приложений используется утилит! reorder. В начало каждого стартового сценария должны быть включены следующие строки комментариев: PROVIDE — задает имя сервиса, предоставляемого этим сценарием; REQUIRE — список сервисов, необходимых этому сервису; данный сценарий будя выполнен только после указанных сервисов; BEFORE — список сервисов, зависящих от данного сервиса; этот сценарий будет запущен до указанных сервисов; KEYWORD — FreeBSD или NetBSD — используется для функций, зависящих от версии системы.
Каталоги с файлами конфигурации системы 223 Используя этот метод, администратор может просто контролировать порядок запуска системных сервисов. Более подробную информацию об использовании /etc/rc и сценариев из каталога /etc/red можно найти на страницах man re и man rc.subr. Планировщик задач cron, файлы crontab Обслуживание сервера практически невозможно без планирования выполнения определенных задач в заданное время. Для этой цели в системе FreeBSD используется утилита cron. Она работает в фоновом режиме и постоянно проверяет файл /etc/crontab и каталог /var/cron/tabs в поиске пользовательских файлов crontab. Файлы crontab содержат информацию об определенных функциях, которые сервис cron должен выполнить в указанное время. Утилита cron использует два разных типа конфигурационных файлов: системный (/etc/crontab) и пользовательский (из каталога /var/cron/tabs). Все различие между этими двумя форматами заключается в шестом поле. В системном файле шестое поле — это имя пользователя, с правами которого будет запущена команда. Это позволяет запускать команды из системного crontab от имени любого пользователя. В пользовательском файле шестое поле содержит запускаемую команду, и все команды запускаются от имени и с привилегиями пользователя, создавшего файл crontab. Пользователи, кроме root, не имеют права изменять системный файл crontab. При этом пользователь root может использовать собственный crontab, как и любой другой пользователь. Он будет отличаться от системного файла /etc/crontab шестой строкой. Поскольку существует системный crontab, обычно не требуется создавать пользовательский crontab для root, хотя это и рекомендуется делать. Давайте рассмотрим содержимое системного файла /etc/crontab (листинг 7.4). Йиетинг7^|Шпйёр'сЬайНа^!1^/^Ш^аШ'~ " '' ■" ' " ■'■'-, .^rrv.-'," ■• '■ f /etc/crontab - root's crontab for FreeBSD » i $FreeBSD: sre/etc/crontab,v 1.32 2002/11/22 16:13:39 torn Exp $ I 1) SHELL=/bin/sh 12) PATH=/etc:/bin:/sbin;/usr/bin:/usr/sbin H0ME=/var/log • 3) ♦minute hour mday month wday who command » 14) '/5 * * * * root /usr/libexec/atrun • 5) jdaily root /usr/local/bin/wwwstat В приведенном листинге мы добавили несколько комментариев для ориентации, скомментариев и начнем. 1. Как и в большинстве файлов настройки FreeBSD, символ # обозначает начало комментария. При этом комментарии не могут находиться в той же строке, что и команда, иначе они будут восприняты как часть команды. Пустые строки игнорируются. 2. В самом начале файла задаются переменные окружения. Знак = используется для задания переменных окружения. Если переменная для оболочки (SHELL) не задана, то утилита cron будет использовать оболочку по умолчанию, то есть sh. Если не задана переменная PATH, то значение по умолчанию не будет установлено, и все пути к файлам должны быть полными. Если не задана пе-
224 Глава 7. Основы управления системой ременная НОМЕ, то утилита сгоп будет использовать домашний каталог соответствующего пользователя. 3. В каждой строке системного crontab всего семь полей. Minute — вреи в минутах, когда будет запущена команда; hour — то же самое, но в часяс mday — день месяца; month — месяц; wday — день недели. Все эти пои должны быть в числовом формате, время — в двадцатичетырехчасовом ис числении. Поле who имеет специальное назначение, и позволяет определил пользователя, с правами которого должна быть запущена команда. Когда пользователь устанавливает собственный файл crontab, он не указывал этот параметр. Последний параметр — command. Он указывает команду, которая должна быть запущена в указанное время. 4. Предпоследняя строка определяет параметры, описанные выше в пункте 3, В данном случае задано значение */5, и несколько символов *. Символ звездочки означает "первый-последний", и может быть интерпретирован как "каждый", например, каждый час, каждый день, каждую минуту и.т.д. Таким образом, для представленной в примере строки команда at run вызываете) пользователем root каждые пять минут независимо от дня или месяца. 5. Последняя строка определяет возможность использования сокращенной записи для времени запуска приложения. Существует несколько зарезервированных способов символической записи времени (табл. 7.1). Таблица 7.1. Способы символической записи времени Строка записи Описание @ reboot Запустить один раз во время старта системы * @уеаг1у Запустить один раз в году (О Oil*) Gannually Совпадает с Gyearly Gmonthly Запускать каждый месяц (0 pi**) Gweekly Запускать на каждой неделе:(0 0**0) ©daily Запускать один раз в день (0 0 * * *■)■'• ©midnight Аналогично edaily 0hourly Запускать каждый час (о * * * *) Команды могут принимать любое количество параметров, однако команды, состоящие из нескольких строк, должны быть объединены символом обратной косой V Для пользовательских файлов crontab применимы все описанные правила — исключение составляет только отсутствие шестого поля, то есть, имени пользователя. Для установки пользовательского crontab, вначале в любом редакторе создается файл соответствующего формата, а затем используется утилита crontab. Обычно она запускается так: % crontab crontabfile В представленном примере crontabfile — это имя пользовательского файла crontab, который только что был создан. В утилите crontab существует параметр -1 для просмотра установленных файлов crontab: % crontab -l SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log 0 * * * * /usr/local/bin/myapp Если для редактирования своего файла crontab требуется использовать саму утилиту crontab, то для этого необходимо применить следующую команду: % crontab -e
Каталоги с файлами конфигурации системы 225 В результате выполнения этой команды откроется текстовый редактор, в котором «обходимо сформировать файл для периодического выполнения команд. Пользователь root может использовать данную команду для редактирования пользовательского фай- [mcrontab любого пользователя. Например, следующий вызов позволит суперпользо- 'вагелю отредактировать crontab-файл пользователя informex: # crontab -e -u informex Файл crontab, сформированный/измененный таким образом, станет доступным уже через минуту. Для удаления своего файла crontab используется команда i crontab -r Залуск заданий с помощью команды at Раз уж мы рассмотрели утилиту сгоп, упомянем также и о команде at, которая по- моляет выполнить однократный запуск задания. Первый вариант ее использования — постановка заданий из командной строки. В данном случае необходимо просто указать |Лосле имени команды at время запуска заданий и нажать клавишу <Enter>. При этом ;утшшта перейдет в интерактивный режим, где в каждой новой строке потребуется вве- !сги команду, которая будет выполнена в ранее указанное время. Как только ввод команд мвершен, следует просто нажать сочетание клавиш <Ctrl+D>, и задания будут помещены в очередь. Например: # at 15:08 /usr/local/bin/app Job 2 will be executed using /bin/sh # at 4am tomorrow /usr/bin/backup -sys -mysql -www Job 3 will be executed using /bin/sh Для просмотра списка поставленных заданий используется утилита atq: # atq Date Thu Mar 16 15:08:00 EET 2006 Fri Mar 17 04:00:00 EET 2006 Для удаления — утилита atrm: # atrm 2 Второй вариант постановки заданий в очередь основан на передаче утилите at через опцию -f имени файла, содержимое которого будет в запланированное время прочитано и запущено с помощью командного интерпретатора sh: # at -f /home/scripts/batch.sh midnight March 20 2006 Job 4 will be executed using /bin/sh « atq Date Owner Queue Job# Mon Mar 20 00:00:00 EET 2006 root с 4 Обратите внимание на то, что выполнение заданий, поставленных в очередь с помощью утилиты at, происходит не точно по графику. Это связано с тем, что проверка и апуск заданий происходит по умолчанию каждые 5 минут с помощью команды atrun, запуск которой также запланирован в файле /etc/crontab. Настройка приложений, каталог /usr/local/etc Приложения, которые устанавливаются с помощью системы портов или из набора пакетов обычно имеют свои конфигурационные файлы, со своим собственным синтак- Owner Queue Job# root с 2 root с 3
226 Глава 7. Основы управления системой сисом. Очень важно хранить эти файлы отдельно от конфигурационных файлов системы, чтобы ими можно было легко управлять с помощью средств управления пакетами; Для этого было введено соглашение, что файлы приложений устанавливаются в катали /usr/local/etc. В том случае, если приложению требуется большое количестве конфигурационных файлов, для их хранения создается подкаталог. Вместе с портами и пакетами обычно устанавливаются и примеры конфигурационных файлов, которые, как правило, имеют расширение .default. Если конфигурационных файлов для установленного приложения не существует, их можно создать пугём копирования файлов .default. Запуск приложений пользователя До появления технологии rcNG приложения должны были помещать стартовый сценарий в каталог /usr/local/etc/rc.d, который затем читался сервисом инициализации системы init. Сценарии этого каталога выполнялись в ходе последующи стадий запуска системы. Практически все сценарии должны соответствовать определенным правилам, которые зависят от версии FreeBSD. Каждый сценарий должен иметь расширение . sh я быть выполняемым. Еще одним требованием является наличие опции start для запуска приложения и опции stop для его останова. Пример простого стартового сценария арр. sh представлен в листинге 7.5 Листинг 7.5. Пример стартового сценария^ [ #!/bin/sh echo -n ' арр1 case "$1" in start) /usr/local/bin/арр i r stop) kill -9 'cat /var/run/app.picT echo "Usage: "basename $0' (start|stop)" >&2 exit 64 t i esac exit 0 Как видим, этот сценарий поддерживает опции start и stop для приложения арр. Его можно также использовать для запуска и останова приложения вручную, а не только в автоматическом режиме при запуске/останове системы. Например, для запуска можно воспользоваться следующей командой: # /usr/local/etc/rc.d/app.sh start С появлением новой технологии rcNG запуск приложения зависит от наличия некоторых дополнительных опций в главном конфигурационном файле системы /etc/ re. conf. Теперь только от самого сценария запуска зависит, поддерживает он данную возможность или нет. Однако практически каждый день очередной порт меняется таким образом, чтобы поддерживать rcNG. Использование технологии rcNG Сегодня, когда система FreeBSD поддерживает технологию rcNG, настраивать запуск приложений стало более удобно. Благодаря определенным ключевым словам, при-
Процессы, даемоны и сигналы 227 ложения теперь можно настроить для запуска после других указанных сервисов, например, named. Также можно разрешить передачу дополнительных опций через файл rc.conf вместо жесткого их описания в стартовых сценариях. Простой сценарий с использованием технологии rcNG может выглядеть следующим образом: #!/bin/sh # # PROVIDE: app # REQUIRE: DAEMON # BEFORE: LOGIN # KEYWORD: FreeBSD shutdown # Define these app_* variables in file /etc/rc.conf # # DO NOT CHANGE THESE DEFAULT VALUES HERE « app_enable=${app_enable-"NO"} app_flags=${app_flags-""} app_pidfile=${app_pidfilew"/var/run/app.pid"} . /etc/rc.subr name="app" rcvar=~ set_rcvar" command="/usr/local/bin/app" load_rc_config $name pidfile="$(app_pidfile}" start_cmd="echo V'Starting ${name).\"; /usr/bin/nice -5 ${command} •b$(app_f lags} $(command_args}" run_rc_command "$1" Этот сценарий гарантирует, что приложение app будет запущено перед сервисом login, но после сервиса daemon. Он также предоставляет метод для создания и отслеживания файла идентификатора процесса (pid). Для запуска данного приложения требуется поместить следующую строку в файл /etc/rc. conf: app_enable="YES" Этот новый метод также позволяет легко работать с аргументами командной строки, включать стандартные функции из файла /etc/rc. subr и упрощает конфигурирование с помощью файла /etc/rc. conf. ПРОЦЕССЫ, ДАЕМОНЫ И СИГНАЛЫ Ни для кого не секрет, что система FreeBSD является многозадачной, а это означает, что одновременно может быть запущено несколько программ. Каждая программа, работающая в некоторый момент времени, называется процессом. Каждая запускаемая команда порождает как минимум один процесс. Существует также несколько системных процессов, которые запущенны все время и поддерживают функционирование системы. Каждый процесс имеет свой уникальный номер, называемый process ID, или просто PID, и, подобно файлам, у каждого процесса есть владелец и группа владельца. Данные о владельце и группе процесса используются для того, чтобы определить, какие файлы и устройства могут быть открыты данным процессом с учетом прав на файлы.
228 Глава 7. Основы управления системой Кроме того, большинство процессов имеют родительский процесс. Например, при запуске команды из оболочки оболочка является процессом, и запущенная команда также является процессом. Для каждого запущенного таким путем процесса оболочка будет являться родительским процессом, за исключением одного специального процесса inic, который всегда является первым процессом, а его PID всегда равен 1. Процесс init запускается автоматически ядром во время загрузки FreeBSD. Мониторинг процессов и производительности Для просмотра работающих в системе процессов используются две команды: ps и top. Команда ps используется для получения списка запущенных процессов и может показать их PID, сколько памяти они используют, команду, которой они были запущены и т.д. Команда top показывает запущенные процессы, используемый объем памяти, процессорное время и постоянно обновляет экран, что позволяет наблюдать за работой компьютера в реальном времени. Команда ps по умолчанию показывает только принадлежащие пользователю процессы. Например: t %ps PID 460 663 тт р0 рО STAT Ss R+ TIME COMMAND 0:00.06 -csh (csh) 0:00.00 ps Из примера видно, что листинг, выводимый командой ps, организован в несколько колонок: PID — идентификаторы процессов (значения PID назначаются с 1 до 99999 и опять с начала, как только последнее число будет превышено); тт — терминал, на котором запущена программа; STAT — состояние программы; time — количество времени центрального процессора, использованное программой; заметим, что это — не время, прошедшее с начала запуска программы, поскольку многие программы затрачивают много времени на ожидание некоторого события перед тем, как занять время процессора; COMMAND — команда, которой была запущена программа. Следует отметить, что формат вывода в рассмотренных колонках может видоизменяться с помощью множества различных опций утилиты ps. Один из наиболее популярных наборов опций — aux. Опция а определяет отображение информации обо всех запущенных процессах, а не только о тех, которыми владеет текущий пользователь: %ps a PID ТТ STAT TIME COMMAND 460 р0 Ss 0:00.12 -csh (csh) 703 pO T 0:00.01 ее qwe 750 pO R+ 0:00.00 ps a 438 vO Is+ 0:00.01 /usr/libexec/getty Pc ttyvO 439 vl Is+ 0:00.01 /usr/libexec/getty Pc ttyvl 440 v2 Is+ 0:00.01 /usr/libexec/getty Pc ttyv2 441 v3 Is+ 0:00.01 /usr/libexec/getty Pc ttyv3 442 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4 443 vS Is+ 0:00.01 /usr/libexec/getty Pc ttyv5 444 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6 445 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7 Опция и задает отображение имени пользователя, владеющего процессом, и информации об используемой памяти. Опция х показывает информацию о даемонах (рассказано далее):
Процессы, даемоны и сигналы 229 %ps х PID 459 460 703 751 ТТ ?? р0 рО рО STAT S Ss Т R+ TIME COMMAND 0:01.28 sshd: informexSttypO 0:00.12 -csh (csh) 0:00.01 ее qwe 0:00.01 ps x (sshd) Результат работы утилиты top немного напоминает листинг, выдаваемый утилитой ps, однако в действительности позволяет увидеть "живую" картину по изменению потребления ресурсов и т.п. Пример ее работы может выглядеть следующим образом: last pid: 768; load averages: 0.00, 0.00, 0.00 up 0+01:39:01 16:11:18 21 processes: 1 running, 19 sleeping, 1 stopped CPU states: 0.0% user, 0.0% nice, 1.2% system, 11.3% interrupt, 87.5% idle Hem: 6224K Active, 4892K Inact, 13M Wired, 9936K Buf, 93M Free Swap: 487M Toral, 487M Free PID 459 386 405 460 257 456 768 390 703 442 438 439 444 441 443 445 381 440 426 239 182 USERNAME informex root root informex root root informex smmsp informex root root root root root root root root root root root root PRI 96 96 8 20 96 4 96 20 96 5 5 5 5 5 5 5 96 5 109 110 20 NICE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SIZE 6152K 3456K 1364K 2280K 1324K 6136K 2304K 3356K 1620K 1288K 1288K 1288K 1288K .1288K 1288K 1288K 3384K 1288K 1444K 516K 1192K RES 3284K 2800K 1060K 1784K 892K 2896K 1572K 2696K 1244K 952K 952K 952K 952K 952K 952K 952K 2480K 952K 1080K 356K 64 8K STATE select select nanslp pause select sbwait RUN pause STOP ttyin ttyin ttyin ttyin ttyin ttyin ttyin select ttyin select select pause TIME 0:01 0:01 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 WCPU 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% CPU 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% COMMAND sshd sendmail cron csh syslogd sshd top sendmail ее getty getty getty getty getty getty getty sshd getty inetd devd adjkerntz Листинг разбит на две чести. Заголовок (первые пять строк) содержит PID последнего запущенного процесса, среднее значение загрузки системы, время работы системы с момента последней перезафузки и текущее время. Вторая строка заголовка содержит количество запущенных процессов, третья — состояние процессора (загрузка). Четвертая и пятая строки соответствуют объему занятой памяти и файла подкачки. Вторая часть листинга разбита на несколько колонок, содержащих информацию, напоминающую утилиту ps: PID, владелец, время процессора, объем используемой памяти, командная строка и др. Отображение использования памяти разбито на две колон- га: первая содержит общий объем (сколько памяти необходимо процессу), а вторая — резидентный (количество памяти, используемой в данный момент). Из представленного примера видно, что утилита ее (edit) требует приблизительно 1,6 МБайт памяти, при этом в текущий момент ею используется только 1,2 МБайт. По умолчанию, утилита top автоматически обновляет экран через каждые две се- гунды, но это значение можно изменить с помощью опции -s: % top -s 1 ( ... }
230 Глава 7. Основы управления системой Даемоны и сигналы Когда какая-либо программа (например, текстовый редактор) используется в щ минале, то ею можно легко управлять: открывать и изменять файлы, закрывать прило жение и т.д. Все это доступно, потому, что программа соединена с терминалом. В ота чие от таких программ, существуют и другие, разработанные без поддержки интерфейс пользователя, которые отсоединяются от терминала при первой же возможности авто магически. Это — и Web-сервер, который целый день отвечает на запросы из сети, FTP-сервер, позволяющий работать с файлами на сервере. При этом им не требуете вмешательства извне. Такие приложения называются даемонсши или сервисами. Существует соглашение, по которому имя программы, которая обычно запускаете как даемон, заканчивается на символ d. В BIND — это named, для Web-cepBql Apache — httpd и т.д. Некоторые программы не придерживаются данного соглашенм к примеру, почтовый даемон для Sendmail называется sendmail. Нередко администратору системы приходится взаимодействовать с процессам даемонов и с другими процессами. Это возможно сделать с помощью сигналов, которь посылаются определенному процессу по его имени или PID. Существует несколько раз личных сигналов, при этом одни из них строго описаны и имеют специальное назначе ние, другие же могут обрабатываться приложением на свое усмотрение и должны бьп описаны в документации к нему. Обратите внимание на то, что пользователь может по сылать сигналы только тем процессам, владельцем которых он является, в отличие я пользователя root, который может посылать сигнал любому процессу. В некоторых случаях FreeBSD также посылает сигналы приложениям. Если прило жение написано плохо и пробует обратиться к области памяти, к которой оно не долж» обращаться, FreeBSD передает соответствующему процессу сигнал нарушения сегмен тации (SIGSEGV). Если приложение использует системный вызов alarm, чтобы полу чить уведомление по истечении определенного периода времени, ему будет отправли сигнал Alarm (SIGALRM) И Т.д. Для завершения работы процесса могут использоваться два сигнала: SIGTERMi SIGKILL. При этом сигнал SIGTERM — это корректный способ завершить любой про цесс; при его получении процесс закрывает любые файлы, которые он мог открыть,! завершает операции, которые он производил во время получения сигнала завершения,! только затем завершает работу. В некоторых случаях процесс может проигнорироват sigterm, например, если выполняет задачу, которая не может быть прервана. Сигнал SIGKILL не может быть проигнорирован процессом и прерывает его работ) в любом случае, даже если вследствие этого произойдет нарушение данных, с которым работал процесс. Довольно часто используются также сигналы SIGHUP, SIGUSR1 и SIGUSR2. Эп сигналы общего назначения, и различные приложения реагируют на них по-разному Предположим, мы изменили файл конфигурации Web-сервера Apache и теперь хоти каким-то образом уведомить о необходимости перечитать конфигурацию. Можно поя ностью остановить httpd и запустить его заново, но это приведет к кратковременно остановке сервера, которая может быть во многих случаях нежелательна. Большинстй даемонов написаны так, чтобы при получении сигнала SIGHUP просто перечитыват файлы конфигурации, поэтому вместо уничтожения и запуска httpd можно просто по слать сигнал SIGHUP. Поскольку нет стандартного способа реагирования на этот сиг нал, различные даемоны будут вести себя по-разному. Для отправки сигнала используется утилита kill. Передача сигнала процессу со стоит из нескольких шагов: определение PID процесса и посылка сигнала процессу п его PID. Пример передачи сигнала SIGHUP процессу inetd после изменения конфиг) рационного файла /etc/inetd. conf может выглядеть следующим образом: # ps ax I grep inetd 426 ?? Is 0:00.01 /usr/sbin/inetd -wW -С 60 # kill -s HUP 426
Процессы, даемоны и сигналы 231 Обратите внимание на то, что выполнять представленные операции следует справами пользователя root. Если сигнал был успешно передан процессу, то утилита kill завершится без каких-либо предупреждений. В других случаях может возникнуть ситуация отсутствия прав отправки сигнала, неправильного указания номера процесса и т.п. Для удаления всех процессов по их имени существует утилита killall. Работа с ней подобна работе с утилитой kill. Единственным отличием является необходимость указывать процесс не по PID, а по имени, напримеру: # killall -HUP inetd Для управления процессами существует еще несколько утилит, например, renice или nice. Эти утилиты позволяют управлять приоритетом процесса: renice изменяет приоритет уже работающего приложения, a nice запускает приложение с указанным приоритетом. Пример их использования может выглядеть следующим образом: # nice -15 find / -name "*" > /find.txt & [2] 1138 # top I grep find 1138 root -8 -15 1324K 848K biord 0:01 42.54% 4.05% find # renice 10 459 1138: old priority -15, new priority 10 Более подробную информацию о рассмотренных утилитах можно найти на страницах справочного руководства man ps, man top, man kill, man killall, man nice Kman renice.
232 Глава 8, Файловые системы — управление и мониторинг ГЛАВА 8. ФАЙЛОВЫЕ СИСТЕМЫ — УПРАВЛЕНИЕ И МОНИТОРИНГ Понимание файловой системы является ключевым вопросом для всех операционных систем, и FreeBSD — не исключение. В данной главе будет дано общее понимание файловых систем в FreeBSD. описана работа с различными типами дисков, а также рассмотрен процесс восстановления поврежденной файловой системы, резервного копирования данных и их восстановления. Кроме того, будет показано, как шифровать данные, и кратко затронут вопрос работы с RAID-массивами. Для правильного понимания предоставленной здесь информации необходимо разбираться в общих понятиях файловой системы, рассмотренных в главах 2 и 4, поскольку такие вопросы как структура и назначение каталогов, именование дисков, использование DD-режима, основы монтирования разделов и т.п. в данной главе не затрагивают вообще или упоминаются только кратко. Кроме того, необходимы также познания в настройке ядра (этот вопрос рассмотрен в главе 10, "Настройка ядра системы"). Для начала, затронем общие вопросы, имеющие отношение к файловым системам, — возможно, самый простой материал этой главы. ФАЙЛОВЫЕ СИСТЕМЫ - ОБЩИЕ ВОПРОСЫ Прежде всего, определимся с понятием файловой системы, которое имеет два различных определения. В первую очередь, — это структура, которая используется для организации, именования и хранения файлов. Второе понятие определяет файловую систему как общую объединенную структуру, организованную с использованием различных устройств с различными типами файловых систем. В нашей книге мы будет использовать оба определения: файловая система как тип хранения данных (первое определение) и как общая файловая структура (второе определение). Операционная система FreeBSD позволяет работать с различными типами файловых систем (файловая система компакт-дисков, NTFS, FAT, EXT2FS и т.д.) и различными носителями данных (флоппи-дисководы, компакт-диски, диски DVD, стримеры, жесткие диски, flash-устройства и т.п.). Для правильной работы со всем этим "добром" операционная система имеет ряд встроенных возможностей и утилит. Попробуем разобраться во всем этом по порядку. Типы поддерживаемых устройств и их имена Для всех перечисленных выше устройств в системе FreeBSD присутствуют драйверы и файлы устройств, позволяющие обращаться к устройствам с помощью соответствующих драйверов. Перечислим наиболее распространенные типы устройств по именам драйверов (табл. 8.1).
Файловые системы — общие вопросы 233 Таблица 8.1. Список имен устройств, наиболее часто используемых с FreeBSD Тип устройства (носителя) Имя драйвера Флоппи-дисковод fd IDE CD-ROM acd Жесткие диски IDE ad. Жесткие диски SCSI, flash-устройства, da Iomega Zip и Jazz SCSI CD-ROM cd Нестандартные CD-ROM-устройства mcd (Mitsumi CD-ROM) scd (Sony CD-ROM) mated (Panasonic CD-ROM, отсутствует в некоторых версиях системы) Стримеры SCSI sa Стримеры IDE ast Перечень из табл. 8.1 далеко не полный (к примеру, не перечислены устройства RAID), имена драйверов могут изменяться в различных версиях системы (например, в версиях системы FreeBSD до 4.Х жесткие диски IDE именовались как wd). Разделы в системе FreeBSD Ранее уже говорилось о различиях в подходах в именовании разделов в FreeBSD и других операционных системах. В первую очередь определимся с общим понятием разделов и затем перейдем к особенностям FreeBSD. Итак, раздел — это некоторая часть жесткого диска, которая воспринимается операционной системой как отдельное устройство (логически). В системах DOS и Windows жесткий диск разбивается на несколько разделов различного типа: основной и дополнительный разделы. Для одного жесткого диска существует определенные ограничения, например, разделов может быть только четыре, при этом все они могут быть или основными, или несколько основных и один дополнительный. Дополнительный раздел используется для обхода ограничения на количество разделов. Он может быть разбит на несколько логических дисков, которые будут представлены в системе как отдельные логические устройства наряду с разделами. В системе FreeBSD диск также можно разбить только на четыре раздела, что в действительности является ограничением BIOS, а разделы называются ачайсами. Применяется двухуровневый подход к разбиению дисков. Первый уровень — это четыре раздела (или слайса, в терминологии FreeBSD), которые напрямую адресуются из BIOS. Второй уровень — это непосредственно разделы (в терминологии FreeBSD), с которыми и работает система. Разделы позволяют отделить различные по назначению часта файловой системы: например, один раздел — для программ, второй — для пользовательских данных, третий — для хранения временных файлов и т.д. ВНИМАНИЕ! Такая разница в терминологии касается только жестких дисков и файловой системы UFS (BSD). К примеру, основной раздел DOS (файловая система FAT) в терминологии FreeBSD также будет именоваться разделом, а не слайсом. Каждый раздел FreeBSD (далее просто раздел) имеет свое имя, которое позволяет обращаться к его данным. Повторим еще раз правила именования разделов. Первый IDE-диск на первом контроллере будет носить имя adO, а его первый слайс (раздел BIOS) — adOsl. Раздел для корневой файловой системы / будет именоваться adOsla, раздел swap (виртуальная память) — adOslb и т.д.
Не лишне будет напомнить, что диски в системе FreeBS© нумеруются с нуля (0), щ пример daO, а слайсы (разделы BJOS) —с единицы (1), например, d'aOsi. Раздев именуются символами от а до h, к примеру, daOsla, Один слайс может иметь! восьми разделов (фактически, —только.до семи, так как одно ими раздела зарезер! вировано для адресации всего слайса). ' Сам по себе возникает вопрос о том, как в FreeBSD именуются не UFS-разделы. Ответ на этот вопрос не так уж и прост, и дать его, пожалуй, лучше на примерах. Наиболее характерный пример — именование основных разделов и логических дисков дополнительного раздела DOS. Предположим, нам необходимо использовать диск, который имеет один основной и один дополнительный раздел DOS с двумя логическими дисками. Предположим также, что диск установлен ведущим на втором IDE-контроллере. Тогда к основному разделу можно обратиться по имени ad2sl, а к логическим дискам в дополнительном разделе — по именам ad2s5 и ad2s6. Как читатель уже, наверное, понял, обращение к логическим дискам дополнительного раздела происходит так же как и к основным разделам, но только начиная с числа 5 (в номере слайса). Визуальный пример для сравнения имен DOS-разделов в системе DOS/Windows и FreeBSD представлен на рис. 8.1. DOS/Windows °^?й FreeBSD i С:\ D:\ Е:\ Рис. 8.1. Сравнение именования DOS-разделов в системах DOS/Windows и FreeBSD При обращении к файловой системе устройств, которые не предполагают разбиение на разделы (флоппи-дискеты, компакт-диски и т.п.) используются краткие имена, например, для первого флоппи-носителя — f dO, для первого носителя компакт дисков — acdO. Обращаем внимание на то, что при именовании таких устройств номер устанавливается в порядке определения, а не как для жестких дисков — по расположению на шине, хотя порядок определения и зависит от расположения. К примеру, первое и единственное устройство считывания компакт-дисков, расположенное на втором IDE- контроллере, будет именовано как acdO, а не acd2 или acd3. Если же установить дополнительный привод компакт-дисков на первом IDE-контроллере, то второй привод будет доступен уже не как acdO, а как acdl. Мониторинг использования файловых систем Эффективно управлять файловой системой невозможно без средств контроля ее использования и постоянным мониторингом свободного и занятого объема дисковых мас- Допопнитапьный раздел ad2sl ad2s5 ad2s6
Файловые системы — общие вопросы 235 ивов. Отчасти этот вопрос можно обойти, переложив контроль использования диско- ux массивов на саму операционную систему с помощью средств установки квот. Но и Икая автоматизация не означает, что мониторинг необходимо прекратить. Файловая система, какого бы большого объема она ни была, имеет свойство переполняться, что приводит к неприятным последствиям, начиная от невозможности входа Пользователей в систему, необходимости перевода системы в однопользовательский режим для исправления проблемы, и заканчивая потерей данных (случай довольно редкий, но бывает и такое). Конечно, все зависит от переполненного раздела, а квотирование можно установить не на все разделы. Именно во избежание проблем с системой рекомендуется создавать несколько разделов. В таких случаях переполнение раздела сданными пользователей не нарушит работу самой системы, и его можно будет увеличить без существенных изменений в конфигурации. В то же время, переполнение системных разделов не приведет к нарушению целостности пользовательских данных. Частый мониторинг использования файловых систем позволяет избежать указанных выше проблем и вовремя отреагировать на необходимость "чистки" или увеличения объема дискового пространства. Для подобного мониторинга, как правило, исполь- эуются две системные утилиты: это df и du. Рассмотрим их... Утилита df Утилита df — неотъемлемый спутник системного администратора. Она позволяет вывести информацию обо всех подключенных разделах и просмотреть процент их заполнения (использования). Возможно, этой утилитой придется пользоваться ежедневно для контроля активности заполнения дискового массива пользователями, перед и после иждой установкой нового программного обеспечения и т.п. Пример использования утилиты df в системе FreeBSD 5.4 (для систем 5.x и старше характерно наличие записи devf s и отсутствие procf s): # df -He Filesystem /dev/adOsla devfs /dev/adOsle /dev/adOslf /dev/adOsld /dev/acdO total Size 260M 1.0k 260M 1.8G 260M 564M 3.2G Used 37M 1.0k 12k 697M 627k 564M 1.3G Avail 202M OB 239M 1000 238M 0B 1.7G Capacity 15% 100% 0% 41% 0% 100% 44% Mounted on / /dev /tmp /usr /var /cdrom В данном случае мы вызывали утилиту с ключом -Н, что обозначает представление выводимой информации в наиболее понятном и читабельном виде (разбивка на килобайты, мегабайты, гигабайты и т.д.). Без данного ключа команда df выведет объем разделов в блоках по 512 байт. Ключ -с позволяет в последней строке (метка total) вывести также общий объем всех разделов, их использования и свободного пространства. Каждая строка листинга (кроме некоторых специальных строк) содержит информацию об отдельных слайсах или разделах, путь к файлу устройств которых отображен вполе Filesystem, а точка монтирования — в поле Mounted on. Поле Size содержит общий объем файловой системы, поле Used — используемый объем, а поле Avail— количество свободного пространства. Поле Capacity позволяет увидеть процент заполнения файловой системы. Для рассмотренного примера файловая система /dev/adOslf, точкой монтирования которой является каталог /usr, имеет общий объем 1,8 Гбайт, из которых 697 Мбайт заполнены, а один гигабайт свободен и доступен для записи. Таким образом, использование раздела /usr составляет 41 %.
236 Глава 8. Файловые системы — управление и мониторинг Утилита du Команда df не позволяет узнать, кто же заполнил свободное место в разделе и вел к переполнению дискового пространства. Кроме того, с ее помощью невозмои подсчитать суммарный размер файлов в каталоге (или в каталогах). Для таких це можно воспользоваться еще одной утилитой: du. Данная утилита имеет несколько! ций, позволяющих подсчитывать заполненное пространство по различным критери например, вывести суммарный объем данных в каталоге, объем данных по всем поди талогам первого уровня относительно указанного или текущего каталога, объемы всем подкаталогам в отдельности и т.д. Как и в случае утилиты df, du может выводи объем в указанных единицах: килобайты, мегабайты и т.д. Суть работы утилиты du: ключается в рекурсивном проходе по всем каталогам и суммировании объема, занима мого файлами и каталогами. Рассмотрим несколько примеров использования утилиты du. Первый случай: не ходимо подсчитать и вывести в удобном для чтения формате объем, занимаемый лами в подкаталогах каталога /usr: # du 27М 13М 32М 92К 17М 683М 14М 187М 704М 758М LOG 126М 180К 2. OK 2. OK 241M 2. OK 3.7G -h -dl /usr /usr/bin /usr/include /usr/lib /usr/libdata /usr/libexec /usr/local /usr/sbin /usr/share /usr/src /usr/XHR6 /usr/ports /usr/compat /usr/games /usr/obj /usr/.snap /usr/home /usr/tmp /usr В данном примере опция -h позволяет выводить размеры в удобочитаемом форм* те. Для вывода объема в мегабайтах используйте опцию -га. Опция -dl позволяет задать глубину рекурсии (при выводе) равную единице. Последним пунктом выведея суммарный объем. Второй пример использования: подсчитать только суммарный объем каталога: # du -hs /home/ 241М /home/ Обратите внимание на то, что по умолчанию, если не задан формат вывода объема, будет выполнен подсчет в килобайтах. Команде du можно передать несколько каталогов для подсчета, при этом можно вывести суммарный объем, занимаемым данными каталогами (опция -с): # du -hcs /usr/local /usr/ports /usr/src 6ЭЗМ /usr/local LOG /usr/ports 704M /usr/src 2.4G total i Более подробную информацию об использовании утилиты du и ее опциях можно! найти в справочном руководстве man du.
Файловые системы — общие вопросы 237 Монтирование и демонтирование разделов Как уже было отмечено в главе 4, перед использованием ресурсов, размещенных на одличных устройствах данных, необходимо произвести подключение файловой системы к точке монтирования. Данная процедура называется монтированием. После того вк ресурс был использован и стал ненужным, его можно отключить, или размонтиро- ить. При этом одни файловые системы монтируются по разделам, а другие — целиком, (зависимости от типа файловой системы и типа устройства. Ранее мы не сталкивались (необходимостью монтирования разделов, если не считать процесса установки системы, описанной в главе 2. | Прежде всего, необходимо затронуть различные варианты монтирования разделов, поскольку данная процедура довольно нетривиальна для различных типов устройств и файловых систем. Самый простой вариант — переполнение раздела, когда его необхо- рио расширить с помощью другого неиспользуемого раздела или нового диска. Следует отметить, что знание последовательности монтирования файловой системы иляется обязательным для всех пользователей, непосредственно обслуживающих систему. Без этого невозможно использовать сетевые ресурсы, компакт-диски, флоппи- аскеты, и даже Flash-память типа USB Mass Storage! Напоминаем, что все подключенные файловые системы на различных носителях представлены в виде ветвей одной фай- девой системы и становятся как бы ее неотъемлемой единицей на время использования, при этом визуально нельзя определить, с каким устройством в данный момент вы работаете. Для монтирования и размонтирования различных файловых систем используются утилиты mount и umount соответственно. | Команда mount | Команду mount всегда было довольно сложно описывать. Попытаемся упростить ж изучение на простом примере расширения объема переполненной файловой системы. [Наиболее реальный случай — системный администратор не создает отдельную файло- [|ую систему для хранения пользовательских данных, что часто приводит к переполнению файловой системы под меткой /usr (напоминаем, что если для /home нет отдельно выделенного раздела, то пользовательские данные хранятся в каталоге /usr/home, a /home является символической ссылкой на него). В определенный момент мы замечаемого в разделе /usr практически не осталось свободного места, а, воспользовавшись ртилитой du, приходим к выводу, что слишком много данных в каталоге /usr/home. Врезультате недолгих размышлений принимается решение выделить отдельный диск т хранения пользовательских данных. Мы устанавливаем диск в систему, создаем раздел (создание раздела описано ниже в этой же главе) и ... Следующий шаг — подключение раздела к точке монтирования /home. Напоминаем, что /home в данный момент — просто символическая ссылка, а точка монтирования кегда должна быть каталогом (может содержать данные, которые будут скрыты при понтировании и появятся снова в случае демонтирования). Для исправления данной ситуации необходимо удалить символическую ссылку (все данные в каталоге /usr/home останутся нетронутыми) и создать в "корне" каталог /home. Предположим, новый установленный диск является ведомым и размещен на первом IDE-контроллере вместе со старым диском. Тогда имя нового диска будет adl, а соз- йнный раздел на новом диске будет называться adlsla. Для того чтобы смонтировать даный раздел к каталогу /home, необходимо воспользоваться командой mount. Дания команда используется для любого типа файловой системы, но в зависимости от по- аеднего меняются опции монтирования. В случае использования файловой системы UFS в простейшем случае никаких опций указывать не нужно — применяется самый простой вариант монтирования. Для описанного нами случая команда mount будет вы- твдеть следующим образом:
238 Глава 8. Файловые системы — управление и мониторинг # mount /dev/adlsla /home Если все прошло успешно, и никаких ошибок не возникло, можно принимать га здравления: файловая система /home готова к использованию. Для того чтобы убедил ся в том, что файловая система смонтирована, воспользуемся командой df: # df Filesystem /dev/adOsla devf s ■/dev/adOsle /dev/adOslf /dev/adOsld /dev/adlsla lK-blocks 253678 1 253678 1801214 253678 40622596 Used 35744 1 10 680942 680 4 Avail 197640 0 233374 976176 232704 37372786 Capacity 15% 100% 0% 41% 0% 0% Mounted on / /dev /tmp /usr /var /home He забудьте перенести старые данные пользователей из каталога /usr/hoa в /home. Наиболее просто это сделать с помощью утилиты tar, например: # cd /usr/home # Is ftpshell ftpuser informex tt tar -czf /home/usr.tgz * # cd /home # tar -xzf usr.tgz # rm usr.tgz # Is ftpshell ftpuser informex Рассмотренный пример довольно примитивен, но позволяет быстро ввести читатед в курс дела, на практике же использование команды mount несколько сложнее. Во первых, мы не рассмотрели опции монтирования, и во-вторых, не описали возможны проблемы, с которыми читателю не раз придется столкнуться. Что касается проблем, то они могут возникать по различным причинам, начиная в невнимательности самого пользователя системы или незнания правил именования, и » канчивая ошибками файловой системы. Сообщение "unknown special file or file system1 указывает, как правило, на отсутствие файла устройства для указанной файловой сиси мы в каталоге /dev. Чаще в данном случае можно получить сообщение "No such file» directory", которое появляется в случае отсутствия файла устройства или точки монто рования. Подобные сообщения — следствие невнимательности пользователя. Проблематичными могут стать сообщения "Operation not permitted" или "Incof rect super block", появление которых зачастую обусловлено серьезными нарушениям в файловой системе. Но о том, как решать проблемы с файловой системой, будет сказ» но в этой главе чуть позже, сейчас же рассмотрим подробнее использование утапии mount. , Как мы уже выяснили из примера, наиболее простой вариант вызова утилиты имее следующий формат: # mount deviceName mountPoint где deviceName — путь к файлу устройства, a mountPoint — точка монтировали (каталог). Но, на самом деле, даже это — не самый простой вариант команды mount так как в случае использовании файла /etc/fstab можно опустить и точку монтири вания. При вызове команды mount можно использовать ряд опций. К примеру, следую щий вызов позволит смонтировать все файловые системы, описанные в фай» /etc/fstab, которые не имеют установленной опции noauto и не смонтировав в данный момент: # mount -a
Файловые системы — общие вопросы 239 Опция -d позволяет эмулировать монтирование файловой системы без окончательного вызова системной функции mount. Используется, как правило, в целях отладки шесте с опцией -v. Для того чтобы указать расположение используемого файла fstab, можно воспользоваться опцией -F, передав ей путь к файлу. В то же время опция -f позволяет форсировать монтирование файловой системы даже в случае, когда та повреждена и не может быть смонтирована обычным способом. Впрочем, подобное использование этой Опции очень не рекомендуется, так как может еще больше повредить файловую систему. В общем случае, опция - f используется для понижения статуса файловой системы из режима "чтение-запись" в режим "только для чтения". Для монтирования файловой системы в режиме "только для чтения" необходимо указывать опцию команды -г (то же самое можно сделать с помощью флага ro/rdonly для опции -о, рассмотренной ниже). Опция -р позволяет вывести информацию о смонтированных разделах в формате, подобном формату файла fstab, а опция -v — вывести подробную информацию о каждом разделе. Например: # mount -p /dev/adOsla / ufs rw 1 1 devfs /dev devfs rw 0 0 /dev/adOsld /usr ufs rw 2 2 # mount -v /dev/adOsla on / (ufs, local, fsid 20b98843ff04e352) devfs on /dev (devfs, local, fsid OOff000202000000) /dev/adOsld on /usr (ufs, local, soft-updates, fsid 6fcffa42c8107684) Следующая опция имеет огромное значение при монтировании файловых систем, отличных от UFS, — опция -t f iletype, где f iletype указывает на тип файловой системы, которая будет смонтирована. По умолчанию, используется тип ufs, поэтому для такого типа файловых систем опцию -t можно не указывать. В случае же использовании компакт-дисков, жестких дисков с файловой системой NTFS, FAT и других типов ценная опция обязательна. Обращаем внимание на то, что при этом разрешается использовать список файловых систем, разделенных запятой. Такой вариант монтирования применяется, если указана рассмотренная выше опция -а (монтировать все файловые системы), при этом список типов файловых систем указывает, какие файловые системы необходимо смонтировать, а какие проигнорировать. Отметим, что перед типом файловой системы можно указать префикс по (например, nouf s), чтобы проигнорировать при монтировании все файловые системы типа ufs и другие в списке. Например, команда ft mount -a -t nonfs,ufs смонтирует все файловые системы, перечисленные в файле /etc/fstab, тип которых отличается от NFS и UFS. Обратите внимание на то, что для файловых систем, неизвестных ядру, будет вызываться соответствующая утилита из каталога /sbin под именем mount_<fstype>, где <fstype> — тип файловой системы. Эти утилиты можно использовать для монтирования файловых систем указанного типа без применения опции -t. Список таких утилит немного изменяется от версии к версии, расширяясь И счет дополнения новых типов файловых систем. К примеру, в FreeBSD 6 он выглядит следующим образом: # Is /sbin/mount* /sbin/mount /sbin/mount_cd9660 /sbin/mount_devfs /sbin/mount_ext2fs /sbin/mount_fdescfs /sbin/mount_linprocfs /sbin/mount_mfs /sbin/mount_msdosfs /sbin/mount_nfs /sbin/mount_nfs4 /sbin/mount_ntfs /sbin/mount nullfs /sbin/mount_procfs /sbin/mount_reiserfs /sbin/mount_std /sbin/mount_udf /sbin/mount_umapfs /sbin/mount unionfs
240 Глава 8. Файловые системы — управление и мониторинг Пример использования одной из перечисленных утилит: It mount_cd9660 /dev/acdO /mnt # Is /mnt autorun.inf icon.ico loader reactos readme.txt Следующая опция -w — монтирование файловой системы в режиме "чтение запись". Отдельно необходимо рассмотреть использование опции -о (options), которая принимает различное количество аргументов, разделенных запятой, позволяющих гибко управлять монтированием файловой системы. Рассмотрим некоторые аргументы, используемые наиболее часто: acls — включить систему ACL для данной файловой системы; async — все операции с файловой системой будут производиться в асинхронном режиме (данный режим довольно опасен для использования); noasync — значение по умолчанию, запись данных происходит в асинхронном режиме, а метаданных — в синхронном; sync — все операции файловой системы будут производиться в синхронном режиме; force — аргумент, позволяющий заменить опцию -f, то есть, форсировать понижение режима с "чтение-запись" к "только для чтения", даже если есть открытые файлы; noatime — при выполнении операции чтения файла не обновлять время послед-' него доступа к файлу (эта опция применяется для больших и загруженных массивов данных для ускорения выполнения файловых операций; может применяться только к локальным файловым системам); noauto — файловая система с данной опцией будет игнорироваться при монтировании командой mount -а; поехес — запретить исполнение двоичных файлов для указанной файловой системы — этот параметр часто используется для повышения безопасности системы, например, для таких разделов как /tmp, /var, а иногда — даже и для /home (он не защищает от запуска сценариев; в действительности, его назначение — запретить запуск файлов в разделах, содержащих бинарные файлы других операционных систем, которые могут повредить систему); nosuid— запретить установку битов setuid и setgid для указанной файловой системы (используется в целях повышения безопасности); nosymfollow — не переходить по символическим ссылкам данной файловой системы; го — монтировать файловую систему в режиме "только для чтения" (заметим, что в такой файловой системе не сможет производить изменения даже суперпользователь root); union — новая возможность, появившаяся сравнительно недавно — позволяет использовать объединенную файловую систему: при монтировании файловой системы к каталогу, где присутствуют другие файлы, они будут видны и доступны для использования совместно с файлами смонтированной файловой системы; при этом новые данные будут всегда записываться в смонтированную файловую систему; пример такого монтирования: # Is /usr/local/ bin include lib libexec sbin www etc info libdata man share # mount -o union /dev/adlsla /usr/local # Is /usr/local/ bin ftpuser informex etc include lib ftpshell info libdata libexec man sbin share www
Файловые системы — общие вопросы 241 • update — указывает на необходимость изменения статуса уже смонтированной файловой системы, подобно вызову опции -и, описанной ниже. Опция -и позволяет обновить статус уже смонтированной файловой системы, как и параметр update для опции -о. Пример использования: # mount -p /dev/adOsla devfs /dev /dev/adOslf /dev/adOsle /dev/adOsld /dev/adlsla # mount -u -o 4 mount -p /dev/adOsla devfs /dev /dev/adOslf /dev/adOsle /dev/adOsld /dev/adlsla / devfs /usr /tmp /var /home ufs rw ufs ufs ufs ufs rw rw rw rw rw ro /dev/adlsla /h / devfs /usr /tmp /var /home ufs rw ufs ufs ufs ufs rw rw rw rw ro 1 0 2 2 2 2 1 0 2 2 2 2 □me 1 0 2 2 2 2 1 0 2 2 2 2 Обращаем особое внимание на тот факт, что большинство опций и параметров утилиты mount не подходят для использования с утилитами /sbin/mount_*. Более подробная информация о работе с некоторыми из дополнительных утилит монтировании будет предоставлена в данной главе ниже, остальную информацию можно найти на страницах справочного руководства. Команда mount подробно описана на странице san mount. Обратите внимание на то, что эту команду в большинстве случаев целесообразно использовать совместно с файлом /etc/f stab. Команда демонтирования umount Любую файловую систему необходимо когда-либо демонтировать. К примеру, компакт-диск без демонтирования невозможно извлечь из считывающего устройства, отключение flash-устройства без демонтирования может привести к потере данных на нем. Демонтирование всех файловых систем производится автоматически при нормальном останове/перезапуске операционной системы. Вызов команды довольно прост: ей необходимо передать имя устройства или точку монтирования файловой системы для ее демонтирования, например: # umount /cdrom ПЛИ # umount /dev/adlsla При может оказаться, что файловую систему демонтировать невозможно, и будет получено сообщение "Device busy". Такое сообщение появляется в случае использования файловой системы. Под использованием файловой системы понимается как наличие открытых файлов, так и пребывание пользователя в одном из каталогов устройства, при этом последний вариант, как правило, самый распространенный. Перед демонтированием файловой системы не забывайте выходить за ее пределы (например, в "корень" /). Многие файловые системы невозможно демонтировать на протяжении всей работы системы (например, /usr или /var). Для того чтобы обойти подобное ограничение, необходимо перейти в однопользовательский режим. Есть и еще один вариант — небезопасный: использовать форсирование демонтирования файловой системы с помощью опции -f, хотя использовать ее не рекомендуется, так как это может привести к ошибкам в файловой системе вплоть до потери данных. Не забывайте также, что при форсированном демонтировании раздела /home пользователи могут потерять свои данные,
242 Глава 8. Файловые системы — управление и мониторинг с которыми работают в текущий момент. Если необходимо демонтировать этот ращ попросите пользователей завершить свою работу, а еще более простой вариант — nq вести систему в однопользовательский режим. Если требуется выяснить, с какими ф лами работают пользователи в данный момент, воспользуйтесь утилитой lsof из на( рапортов /usr/ports/sysutils/lsof. Для демонтирования всех файловых систем, перечисленных в файле /etc/fstai используйте опцию -а. При этом, чтобы проигнорировать попытки демонтироваи корневой файловой системы, необходимо использовать опцию -А. Подобно комад mount, у команды umount есть опция -t, с помощью которой можно задать файлои системы, подлежащие демонтированию, по типу. Обратите внимание на то, что команда umount используется для демонтирован! всех типов файловых систем, независимо от того, какой утилитой они были смонтир ваны. Более подробная информация о команде umount доступна на страна man umount. Файл /etc/fstab В рассмотренном выше случае использовалось монтирование файловой систем вручную, но не будем же мы всякий раз при загрузке системы повторять операцию м тирования вручную. Это требует хорошей памяти, да и не имеет смысла. Процесс м тирования файловых систем можно автоматизировать или просто упростить. Для это предназначен файл /etc/fstab, однако в случае его использования необходимо ж применение команд mount и mount_* для "неродных" файловых систем, что буд описано ниже. Пример содержимого файла /etc/fstab представлен в листинге 8.1. Jj^cb^tSJ . Примйй Фа^а б&аШШ, # Device /dev/adOslb /dev/adOsla /dev/adOsle /dev/adOslf /dev/adOsld /dev/acdO Mountpoint none / /tmp /usr /var /cdrom FStype swap uf s uf s uf s ufs cd9660 Opt sw rw rw rw rw ro, ions noauto Dump 0 1 2 2 2 0 Pass! 0 1 2 2 2 0 В целом, формат файла /etc/fstab несложен: каждая его строка позволяет од сать одну файловую систему и разделена на шесть полей, каждое из которых описа в комментарии в первой строке файла (см. листинг 8.1). В первом поле указано имя устройства, которое требуется смонтировать. Второ поле задает каталог, который будет использоваться в качестве точки монтированн Третьим полем обязательно следует тип файловой системы, который будет исполы ваться при вызове команды mount. Четвертое поле для различных файловых систем будет выглядеть по-разному: ов позволяет передать опции команду монтирования. В связи с тем, что различные упщ ты монтирования имеют различные опции, полностью описать формат данного поля и просто, и этот вопрос будет разбит на несколько подвопросов, часть из которых буя рассмотрена в других главах (например, см. главы по NFS и Samba). Как правило, о щие опции — го (только для чтения), rw (чтение-запись), sw (файл подкачки), noaut (не монтировать автоматически во время старта системы) и др. Пятое поле задает частоту дампов файловой системы с помощью утилиты dum Если это поле не заполнено, то по умолчанию подставляется значение, равное нулю (i производить резервное копирование файловой системы). О резервном копирован» восстановлении и зеркалировании будет сказано ниже в этой же главе. Шестое поле позволяет задать порядок проверки дисков во время старта систем Как правило, такая проверка выполняется в случае сбоя системы, некорректного щ запуска или извлечения устройства без размонтирования. Для таких устройств как пр воды компакт-дисков или разделы swap в подобной проверке нет необходимости, ш
Файловые системы — общие вопросы 243 скольку они не подвержены повреждениям вследствие неправильного размонтирования или их содержимое несущественно для правильной работы системы — для них значение шестого поля в файле /etc/ f stab следует установить в ноль (0). А вот корневому разделу / (и только ему) всегда по умолчанию соответствует значение 1, что позволяет ему быть первым разделом для проверки. Все остальные разделы имеют значение 2 и более. При этом следует помнить, что несколько файловых систем с равными значениями рассматриваемого поля, если это позволяет оборудование, будут проверяться одновременно. Как мог заметить читатель, никаких сложностей в формате файла /etc/f stab нет, и, учитывая познания в работе с командой mount и ее аналогами mount_* из каталога /sbin, подробно описывать третье и четвертое поля нет смысла. Что касается автоматического монтирования файловых систем и монтирования в ручном режиме, то все файловые системы, для которых не установлена опция noauto, на основании файла /etc/fstab будут смонтированы автоматически при старте системы после проверки командой fsck. При загрузке в однопользовательский режим, как известно, монтируется только одна файловая система — корневая. Для того чтобы смонтировать все остальные используется простая команда mount -а, рассмотренная ранее. Заметим, что при описанных файловых системах в файле fstab нет необходимости использовать mount_* утилиты при ручном монтировании с указанием точки монтирования, так как они будут автоматически использоваться командой mount в зависимости от типа файловой системы. Еще один "плюс" — отсутствие необходимости каждый раз указывать опции монтирования и имя монтируемого устройства при вызове команды mount для описанных в файле устройств. К примеру, устройство /dev/acdO из листинга 8.1 будет смонтировано в каталог /cdrom только для чтения следующей простой командой: # mount /cdrom Обращаем особое внимание на то, что файловые системы, которые могут отсутствовать в момент загрузки системы, обязательно необходимо описывать с опцией noauto, что позволит системе не останавливаться на безуспешных попытках смонтировать их. Это в первую очередь касается ресурсов NFS, приводов компакт-дисков, флоппи-дискет и flash-устройств типа USB Mass Storage. Более подробную информацию по использованию файла /etc/fstab можно найти в справочном рукрводстве man fstab, а также отчасти ниже в этой главе. Монтирование "неродных" файловых систем Наверное, многие читатели до этого пользовались другими операционными системами, и, естественно, все данные хранятся на носителях, тип файловой системы которых отличается от стандартной файловой системы FreeBSD. Отсюда возникает естественный вопрос: что делать с этими разделами и как "достучаться" до своих данных хотя бы для чтения. Можем всех обрадовать: система FreeBSD имеет встроенную поддержку большого количества популярных файловых систем. При этом одни файловые системы включены прямо в стандартное ядро (стабильные, могут использоваться без всякой опаски), другие же — только как модули, но могут быть при необходимости описаны в файле ядра. При этом файловые системы, не включенные в стандартное ядро, следует использовать с некоторой осторожностью— особенно те, у которых есть встроенная поддержка безопасности (например, EXT2FS или NTFS). Работать с такими файловыми системами рекомендуется в режиме "только для чтения". Рассказывать, какие же файловые системы поддерживает FreeBSD, мы не будем. Во-первых, для этого достаточно просмотреть список утилит монтирования. Во-вторых, их количество растет с каждой новой версией системы, а иногда поддержка некоторых типов файловых систем исключается.
244 Глава 8. Файловые системы — управление и мониторинг Для любителей "форточек" или файловые системы Windows (FATA/FAT) Первым пунктом безоговорочно станет самая популярная файловая система FAT, Ее популярность обусловлена не только повсеместным распространением технологи! MS-DOS и Windows, но и возможностью ее использования на флоппи-дискетах (в такои виде можно использовать и UFS, но это — редкий случай). За все типы FAT (в том числе и ее расширения — VFAT) отвечает модуль MSDOSFS и утилита /sbin/mount_msdosf s (в старых версиях системы это может быть утилита /sbin/mountmsdos). Эта утилита имеет несколько простых опций: -L — отвечает за локальную кодовую таблицу (по умолчанию, ISO 8859-1); -w — задает таблицу конвертирования (практически не используется в случае с новой утилитой mount_msdosf s и в будущем может быть убрана из нее); -D (отсутствует в mountmsdos) — позволяет задать кодовую страницу MS-DOS, используемую для конвертирования имен файлов. Кроме того, полностью отличается список аргументов опции -о. Их три: longnames — включает возможность просмотра файлов в формате длинных имен Windows 95 (по сути — информация из VFAT); shortnames — включает возможность показывать файлы только в старом стиле MS-DOS, то есть, в формате 8.3; nowin95 — используется для полного отключения возможности просмотра и использования расширенной информации о файлах в стиле Windows 95. Простой пример использования утилиты mountmsdosf s: # mount_msdosfs -L ru_RU.KOI8-R -D CP866 /dev/adlsl /mnt В данном случае мы предполагаем, что на диске (первый ведомый диск, первый основной раздел) используется кириллическая кодовая страница СР866, которую мы конвертируем при отображении файлов с помощью KOI8-R. Естественно, для отображенш кириллических символов в именах файлов придется немного повозиться, а точнее — изменить настройки среды. Покажем решение на рабочем примере (обратите внимание на установку переменных среды): # mount_msdosfs -D CP1251 -L ru_RU.KOIB-R /dev/adlsl /mnt # Is /mnt 1386 INF000.SWP Recycled ????????????? ????? ????? # setenv LANG ru_RO.KOI8-R # setenv MM_CHARSET KOI8-R # cd /mnt # Is 1386 INF000.SWP Recycled Администратор Новая папка # cd Администратор/ # Is Application Data PrintHood Мои документы Cookies Recent Рабочий стол Local Settings SendTo Шаблоны NTUSER.DAT Главное меню ntuser.dat.LOG NetHood Избранное ntuser.ini # Is Мои\ документы/ Мои рисунки Пример записи в файле /etc/fstab для автоматического монтирования этого раздела во время старта системы с возможностью записи данных будет выглядеть следующим образом: /dev/adlsl /mnt msdos rw,-DCP1251,-Lru RU.KOI8-R 0 0
Файловые системы — общие вопросы 245 Более подробная информация по монтированию разделов FAT/VFAT размещена (справочном руководстве man mount_msdosfs. Новые "форточки" или работа с файловой системой NTFS Файловая система NTFS также поддерживается системой FreeBSD, но в довольно ираниченной форме. В первую очередь, следует помнить, что разделы данного типа ре- юмендуется использовать в режиме "только для чтения", а для режима "чтение-запись" существует много ограничений. Прежде всего, это касается использования опции -С для «ерекодировки имен файлов Unicode с использованием локального набора символов. Как только эта опция включена при монтировании, обязательно включите режим "только для чтения". При включенной записи существуют также следующие ограничения: ■ файл должен быть нерезидентным и не должен содержать неинициализированных областей; • имя файла не должно содержать многобайтных символов; ■ сжатие файлов не поддерживается. Самый простой и наиболее часто используемый вариант монтирования файловой системы NTFS может быть описан следующим примером: # mount_ntfs /dev/adlsl /mnt Обращаем внимание на появление специальных файлов, начинающихся с символа V. Эти файлы присутствуют в любом разделе NTFS, но в системах Windows NT не вдны: V Is /mnt $AttrDef $BadClus $Bitmap $Boot $Extend $LogFile $MFTMirr $Secure $UpCase $Volume AUTOEXEC.BAT BOOTSECT.DOS Bootfont.bin Запись в файле /etc/fstab для автоматического монтирования данного раздела оудет иметь следующий вид (только для чтения, без поддержки Unicode): /dev/adlsl /mnt ntfs ro О О Более подробная информация содержится на страницах справочного руководства пап mount_ntfs. "Пингвины всех стран — слетайтесь!" или использование EXT2FS Кстати, призыв к "пингвиноидам" перейти на систему FreeBSD вполне реалисти- кн, и не только по причине того, что FreeBSD имеет встроенную поддержку ядра Linux, но и потому, что ко всему прочему присутствует поддержка файловой системы EXT2FS, используемой большинством операционных систем, основанных на ядре Linux.. Кроме того, поддержка данного типа файловой системы весьма стабильна и не ызывает проблем. Если операционная система не имеет загружаемого файла модуля Ш EXT2FS, то необходимо включить ее поддержку на уровне ядра (об этом речь пой- CONFIG.SYS Documents and Settings 10.SYS Inetpub MSDOS.SYS NTDETECT.COM Program Files System Volume Information WINNT boot.ini ntldr pagefile.sys
246 Глава В. Файловые системы — управление и мониторинг дет в главе 10, "Настройка ядра системы"). Если модуль присутствует, тогда можно просто воспользоваться следующей командой: # mount_ext2fs /dev/adlsl /mnt Обратите внимание на то, что данная утилита почти не имеет особых опций и практически совпадает в использовании с рассмотренной ранее командой mount. Использование флоппи-дискет Любая файловая система, на первый взгляд пустая, содержит определенную информацию. А информация занимает место. Именно по этой причине для флоппи-диски наиболее оптимальным вариантом будет использовать файловую систему FAT (А вы пробовали в Windows NT отформатировать дискету под NTFS? Ну и как, довольны результатом? ©) или FreeBSD UFS. Как правило, имя устройства для работы с дискетой— это /dev/fdO или /dev/fdl; на другие устройства вида /dev/fdNs или /dev/fdN.xxx (N— цифра, s — символ, ххх - число) не обращайте особого внимания— они используются для других целей. В зависимости от типа файловой системы на дискете, монтирование будет производиться одной из следующих команд: # mount_msdoafs /dev/fdO /mnt # mount /dev/fdO /mnt Для систем FreeBSD 4.x первая из представленных выше команда примет вид: # mount_msdos /dev/fdO /mnt Какой бы невинной на первый взгляд ни казалась дискета, она может доставить много хлопот невнимательному пользователю системы, вплоть до зависания. Такая ситуация может возникнуть при смонтированной в режиме "чтение-запись" дискете, физически защищенной от записи. Любая утилита в данном случае будет считать, что на диск можно записывать данные, а в результате такой попытки может возникнуть ошибка ввода/вывода. Монтирование подобных устройств необходимо выполнять в режиме "только для чтения". Также не следует забывать о размонтировании флоппи-дискеты перед ее извлечением. Использование Flash-устройств Довольно близким по использованию к флоппи-дискетам могут оказаться Flash- устройства USB. Их файловая система выбирается в зависимости от предпочтений пользователя, но, как правило — это FAT/VFAT. Размонтирование необходимо выполнять в обязательном порядке прежде извлечения устройства из USB-порта. За поддержку Flash-устройств USB (далее будем применять понятие UMS — производное от USB Mass Storage) отвечает драйвер umass, который, как и все остальные необходимые драйверы, содержится в конфигурации по умолчанию. Список остальных устройств представлен следующими устройствами: scbus, da, pass, uhci, ohci. usb. Обратите внимание на то, что некоторые из этих драйверов можно безболезненно исключить из конфигурации для работы UMS, но желательно этого не делать. Например, зачем нужны устройства scbas и da? Проблема заключаете! в том, что umass использует SCSI таким образом, что все устройства хранения данных, подключенные к шине USB будут видны как SCSI-устройства, а точнее — с помощью драйвера da. Устройства uhci и ohci выбираются в зависимости от типа чипсета USB. Можно оставить поддержку обоих устройств, если нет подробной информации или нет необходимости в пересборке ядра. Если требуется поддержка USB 2.0, то добавьте устройство ehci. He забудьте также добавить строку usbd_enable="yes" в конфигурационный файл системы /etc/rc. conf. Если все настройки были выполнены верно (или не были сделаны вообще по причине отсутствия необходимости в том), можно подключить UMS-устройство.
Файловые системы — общие вопросы 247 результате на консоли, в журнальном файле /var/log/messages и при использова- ки утилиты dmesg можно увидеть приблизительно такой текст (меняется в зависимого! обустройства): umassO: SanDisk Corporation Cruzer Micro, rev 2.00/0.20, addr 2 daO at umass-simO bus 0 target 0 lun 0 daO: <SanDisk Cruzer Micro 0.2> Removable Direct Access SCSI-2 device daO: l.OOOMB/s transfers daO: 122MB (250879 512 byte sectors: 64H 32S/T 122C) Просмотреть список всех устройств на шине SCSI, в том числе и UMS-устройств, юзаоляет утилита camcontrol, например: # camcontrol devlist <SanDisk Cruzer Micro 0.2> at scbusO target 0 lun 0 (daO) Теперь, в зависимости от файловой системы на устройстве хранения данных, можно выполнить его монтирование соответствующей командой. Например, рассмотрим понтирование и просмотр списка файлов некоторых каталогов на Flash-устройстве (файловой системой FAT и кириллическими именами: t mount_msdosfs -D CP1251 -L ru_RU.KOI8-R /dev/daOsl /mnt t Is /mnt Delphi2005 FreeBSD MCAfee ????.txt ?????? # setenv LANG ru_RU.KOIff-R « setenv MM_CHARSET KOI8-R I Is /mnt Delphi2005 FreeBSD MCAfee Другое файл-txt tt Is /mnt/Delphi2005/ CD Delphi2005.doc Delphi2005.xls Projects pics 8 umount /mnt И не забудьте обязательно размонтировать файловую систему перед извлечением Flash-устройства. Можно добавить следующую строку в файл /etc/f stab: /dev/daOsl /mnt/flash msdos noauto,rw,-DCP1251,-Lru_RU.KOI8-R 0 0 Теперь монтирование Flash-устройства можно производить простой командой: il mount /rant/flash Дополнительную информацию можно найти на странице справки man umass. Использование приводов CD-ROM Использование приводов CD-ROM несколько проще. Во-первых, большинство из ж не позволяют извлекать компакт-диск без предварительного размонтирования, что фактически исключает вариант нарушения стабильности системы (приводы CD-ROM меют возможность извлечения дисков аварийным путем, что может дестабилизировать тему). Во-вторых, CD-ROM имеют свою файловую систему CD9660, для которой «FreeBSD присутствует поддержка на уровне ядра и утилита mount_cd9660 из набора (каталоге /sbin. Не имеет значение, используется ли CD-ROM на шине IDE, SCSI или USB — изме- иется только название драйвера. Наиболее простой вариант — монтирование IDE CD- ЮМ. Имя драйвера для данного типа устройств — acd, таким образом, к содержимому идиске можно обратиться через /dev/acdO (/dev/acdl и т.д.) в системах FreeBSD h и старше, а в FreeBSD 4.x и более ранних версиях — через /dev/acdOc (/dev/acdlс и т.д.). Утилита mount_cd9660 в последних своих модификациях позволяет указывать вблицу перекодировки для имен файлов в Unicode в случае использования расширения Joist. Пример монтирования CD с применением расширения Joliet (включено по умол-
248 Глава 8. Файловые системы — управление и мониторинг чанию) и таблицей перекодировки KOI8-R (не забудьте назначить соответствую™ значения глобальным переменным LANG и MM_CHARSET): ■ i # mount_cd9660 -С KOI8-R /dev/acdO /mnt В # Is /mnt Щ 09.01.2003 ■' 1 ' 100OLYMP ' ME45210306_UpdateTool.exe ' Microsort MapPcint 2002 North America - Disci (321MB).exe OSJJpdate | Recover4all Professional v2.2 i Vinyl_AudioCodec_V510b.zip | Без Имени-l.psd Без MMeHM-2.psd Без HMeHM-3.psd Без ТЛмени-А .psd kaspersky_avp.jpg sdat4351.exe winrik Монтирование диска с отключенной поддержкой Joliet будет иметь следующий и (формат имен — 8.3, Unicode-символы заменяются символами "_"): # mcunt_cd9660 -j /dev/acdO /mnt mobilett Is /mnt 09_01_20 2.psd .psd microsor.exe sdat4351.exe 1 3.psd kaspersk.jpg os_updat vinyl_au.zip lOOolymp 4.psd me452103.exe recover4 winrik Обращаем внимание на то, что в системах FreeBSD 5.x и старше в каталоге /de можно обнаружить файлы вида acdXtOl, acdXt02 и т.д. (в системе FreeBSD 4.x их» обходимо вручную создать с помощью сценария /dev/MAKEDEV). По их количеси в системе можно определить, сколько дорожек (сессий) присутствует на диске (мульт сессионные или Audio-CD). Использование Audio-CD не подразумевает их монтирование. Для работы с таю типом компакт-дисков существуют другие утилиты, например, cdcontroi для пр слушивания аудиодорожек, dd — для их копирования на локальный диск в форма *. wav и некоторые другие утилиты. Более подробная информация может быть получена на страницах справочного pj ководстватап mount_cd9660, man acd, man 4 cd и др. Добавление дисков — разметка и форматирование Для того чтобы что-то монтировать, необходимо это "что-то" иметь или создан В данном подразделе речь пойдет именно о создании дисковых разделов. Предположи! в компьютер уже установлен жесткий диск, который будет найден системой при ел дующем ее запуске. Предположим также, что это — IDE-диск, расположенный на пе[ вом контроллере как ведомый. В таком случае мы получаем доступ к нему через уст ройство /dev/adl: # Is /dev/adl* /dev/adl
Файловые системы — общие вопросы 249 Первым делом, нам потребуется создать слайс (или слайсы) на данном диске, и заем разбить их на разделы FreeBSD. Напоминаем, что слайс в данном случае совпадает понятием раздела BIOS. Для создания слайсов и разделов в системе FreeBSD присутствует несколько методов. Какой из них использовать — выбирать читателю. Первый ктод основан на использовании давно знакомой нам утилиты /stand/sysinstall, меющей простой интерфейс управления дисками и не только. Второй метод основан на «пользовании стандартных утилит командной строки, которые, в принципе, использует при своей работе также и sysinstall. Первым делом, немного вспомним утилиту sysinstall (практически полностью рассмотрена в главе, посвященной установке системы) и то, как с ее помощью работать (дисками, слайсами и разделами. Затем перейдем к утилитам командной строки, которые в большинстве случаев могут оказаться для читателя новыми. Простота управления с помощью утилиты sysinstall Утилита sysinstall позволяет пользователю практически полностью абстрагироваться от выполнения сложных задач по настройке системы в командной строке, предоставляет интуитивно понятный интерфейс и не заставляет запоминать множество нашими и параметров утилит. Все, что необходимо для начала работы с ней, — это выполнить команду /stand/sysinstall. В появившемся меню перейдите к пункту Configure и выберите его. Затем найдите пункт Fdisk и выберите его. В результате должен появиться запрос на выбор диска для манипуляций над ним (рис. 8.2) — выберите горой пункт adl (для описанного выше случая) или тот, который необходимо редактировать в вашем случае. Please select the drive, or drives, on which you wish to perform this operation. If you are attempting to install a boot partition on a drive other than the first one or have multiple operating systems on your machine, you will have the option to install a boot manager later. To select a drive, use the arrow keys to move to it and press ISPflCE] or [ENTER]. To de-select it, press it again. Use [TAB] to get to the buttons and leave this menu [ ] . adG ПВНШ ШЙ 0ШЯШ Cancel Рис. 8.2. Выбор диска для управления (редактирования) с использованием утилиты sysinstall После завершения выбора появится главное окно утилиты FDISK Partition Editor (эта утилита должна быть известна читателю по главе 2). Создадим один слайс на весь диск, нажав клавишу <А> или <С>, оставив все значения по умолчанию без изменения. После этого нажмите клавишу <W> для сохранения изменений и записи информации о Слайсах на диск. На поставленный вопрос ответьте положительно, после чего появится ипрос на установку главной загрузочной записи для диска. Поскольку мы добавляем новый диск к работающей системе, нет необходимости заботиться о загрузочной записи, поэтому выберите пункт None, или Standard (если необходимо перезаписать главную загрузочную запись). Если запись изменений будет удачной, то на экране появится сообщение, представленное рис. 8.3.
250 Глава 8. Файловые системы — управление и мониторинг Wrote FDISK partition information out successfully. Рис.6.3. Сообщение об удачной записи изменений на диск утилитой FDISK (sysinstall) После этого можно выйти из утилиты FDISK (нажатие клавиши <Q>). Если требуется удостовериться в том, что действительно был создан необходимый слайс, выйдите полностью из утилиты и просмотрите каталог /dev на наличие соответствующих имея устройств: # Is /dev/adl* /dev/adl /dev/adlsl /dev/adlslc В меню утилиты sysinstall есть пункт Label (ниже пункта Fdisk), который позволяет пользователю перейти в режим редактирования меток (и разделов) FreeBSD Disklabel Editor. В данном режиме можно создавать разделы, изменять их параметры и указывать точку монтирования (в данном случае автоматическое монтирование не будет настраиваться, как и не будут вноситься изменения в файл /etc/f stab). Напоминаем, что каждый раздел имеет свою метку (от а до h, исключая с, которая позволяет адресовать весь слайс), а количество разделов не может быть больше восьми, Если диск не будет использоваться как системный, можно применить любую метку раздела, но если на него будет установлена система, тогда необходимо позаботиться о том, чтобы первый раздел носил метку а (в нашем случае получается adlsla). Метка b всегда используется только под раздел подкачки swap. В нашем случае создадим один раздел на весь слайс. Для этого нажмите клавишу <С> и подтвердите указанный размер. На вопрос о типе файловой системы выберите пункт FS (A file system) и введите точку монтирования как /mnt (для примера). Для того чтобы сохранить внесенные изменения, необходимо обязательно нажать клавишу <W>. На поставленный вопрос ответьте YES (иначе изменения не будут сохранены). После всех описанных операций можно выйти из утилиты Disklabel Editor (нажатием клавиши <Q>) и самой утилиты sysinstall, и проверить, что для созданного раздела появилось устройство в каталоге /dev: # Is /dev/adl* /dev/adl /dev/adlsl /dev/adlslc /dev/adleld Теперь можно вручную монтировать новую файловую систему или же "прописать" автоматическое монтирование в файле /etc/f stab, но данный вопрос уже не из этой темы. По выходу из утилиты sysinstall и при условии, что в качестве точки монтирования для нового раздела был указан существующий каталог, этот раздел уже будет смонтирован. Примите поздравления: с помощью утилиты sysinstall только что был создан новый слайс и раздел для нового диска. Но, как правило, таким способом пользуются новички FreeBSD. Более опытный пользователь для этих целей будет использовать утилиты командной строки. Использование утилит командной строки В случае использования утилит командной строки есть множество возможностей и вариантов создания слайсов и разделов. Первым делом, необходимо позаботиться об очистке списка разделов (слайсов) нового диска, фактически — стереть всю информацию о возможной разметке диска. Для этого, как правило, используется утилита dd: # dd if=/dev/zero of=/dev/adl bs=lk count=l 1+0 records in
Файловые системы — общие вопросы 251 1+0 records out 1024 bytes transferred in 0.000795 sees (1288233 bytes/sec) После удаления всей информации о разметке необходимо инициализировать новый иск — записать новую информацию о разметке диска. Для этого используется утилита (disk. Создадим с ее помощью новый и единственный слайс adlsl на весь диск, а иже запишем стандартный код загрузки (информация нулевого сектора): # fdisk -s /dev/adl fdisk: invalid fdisk partition table found fdisk: read_sO: Unknown error: 0 # fdisk -BIv /dev/adl ******* Working on device /dev/adl ******* fdisk: invalid fdisk partition table found parameters extracted from in-core disklabel are: cylinders=1040 heads=16 sectors/track=63 (1008 blks/cyl) Figures below won't work with BIOS for partitions not in cyl 1 parameters to be used for BIOS calculations are: cylinders=1040 heads=16 sectors/track=63 (1008 blks/cyl) Information from DOS bootblock is: 1: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 63, size 1048257 (511 Meg), flag 80 (active) beg: cyl 0/ head 1/ sector 1; end: cyl 15/ head 15/ sector 63 2: <UNUSED> 3: <UNUSED> 4: <UNUSED> # fdisk -s /dev/adl /dev/adl: 1040 cyl 16 hd 63 sec Part Start Size Type Flags 1: 63 1048257 0xa5 0x80 Данная утилита, по сути, аналогична утилите FDISK Partition Editor из sysin- stall. В рассмотренном примере первая и третья команда позволяют просмотреть список слайсов на диске. Поскольку диск не имеет такого списка до разметки, в первый раз угалита вывела только сообщения об ошибках. Во второй раз при попытке просмотреть список слайсов утилита вывела информацию о наличии одного слайса FreeBSD, занимающего весь объем диска (тип 0ха5 — это тип слайса FreeBSD, известного в десятичной счислении под номером 165). После создания слайса есть два варианта последующих действий: отформатировать весь слайс adlsl и использовать его полностью как один единственный раздел (обращение через adlsl) — самый простой вариант; слайс разделяется на разделы или же полностью отводится под один раздел (обращение к разделу через adlsla или другую метку) — этот вариант применяется чаще и подобен процессу в утилите sys ins tall. Первый вариант реализуется просто: необходимо просто сформировать файловую систему с помощью утилиты newf s и затем смонтировать для использования в любую точку монтирования (команды начинаются с символа %): % newfs /dev/adlel /dev/adlsl: 511.8MB (1048256 sectors) block size 16384, fragment size 4>2048 using 4 cylinder groups of 127.97MB, 8190 blks, 16384 inodes. super-block backups (for fsck -b #) at: 160, 262240, 524320, 786400
252 Глава 8. Файловые системы— управление и мониторинг % bsdlabel /dev/adlsl # /dev/adlsl: В partitions: # size offset fstype [fsize bsize bps/cpg] c: 1048257 0 unused 0 0 # "raw" part, 4>don't edit % mkdir /mnt/adlsl % mount /dev/adlsl /nmt/adlsl % Is /mnt/adlsl . snap ВАЖНО! В версиях FreeBSD 4.x и Free$£l5 5.0 вместо bsdlabel используйте утилшц diskiabei. В более новых версиях операционной системы FreeBSD рекомендуется! использовать утилиту bsdlabel, при этом в ней .отсутствует несколько опций. Этот вариант используется, когда заранее известно, что необходимо создать только один раздел на весь диск. Теперь рассмотрим второй вариант, в котором мы подойдем к решению той же проблемы (один раздел на весь слайс) с другой стороны. При использовании данного варианта необходимо позаботиться о разметке слайса на разделы. Эта операция выполняется с помощью утилиты bsdlabel (в предыдущем примере использовалась для вывода списка разделов). Прежде всего, выполните следующую команду: # bsdlabel -В -w /dev/adlsl auto Она позволяет выполнить автоматическую разметку слайса и записать стандартный загрузочный код. В результате в каталоге /dev должно появиться новое устройство adlsla. Следующий этап — это или форматирование раздела adlsla с помощью утилиты newf s, или попытка переразметить слайс на свое усмотрение и затем произвести форматирование необходимых разделов. Для первого варианта используйте следующую команду: # newfs /dev/adlsla /dev/adlsla: 511.8MB (1048240 sectors) block size 16384, fragment size 4>2048 using 4 cylinder groups of 127.97MB, 8190 blks, 16384 inodes. super-block backups (for fsck -b #) at: 160, 262240, 524320, 786400 после чего можно использовать этот раздел для хранения данных. Второй вариант заключается в повторном вызове утилиты bsdlabel в режиме редактирования, которая открывает текстовый редактор, где предстоит определить имена будущих разделов, их размеры и другие параметры (команда начинается с символа %): % bsdlabel -e # /dev/adlsl: 8 partitions: # size а: 1048241 с: 1048257 /dev/adlsl offset fstype 16 unused 0 unused [fsize bsize bps/cpg] 0 0 0 0 # "raw" part, don't edit Приведем содержимое текстового окна к следующему виду (размер слайса принят равным 511 Мбайт): # /dev/adlsl: 8 partitions: # size offset fstype [fsize bsize bps/cpg]
Файловые системы — общие вопросы 253 О unused О О О unused 0 0 # "raw" part, don't edit * unused 0 0 после чего сохраним изменения и выйдем из редактора. Что означают все эти строки и столбцы? Первые три строки не подлежат изменению, как и строка, описывающая метку с:. К слову, данные о метке с: помогут не сбиться и правильно разбить слайс на разделы (поле size для данной метки указывает суммарное количество секторов слайса, которые можно использовать под разделы). Итак, каждая отдельная строка, начиная с четвертой, описывает отдельный раздел. Все строки разбиты на семь столбцов. Первый столбец # позволяет указать метку раздела, в конце метки необходимо установить символ двоеточия (":")• Второй столбец size позволяет задать размер раздела в секторах, килобайтах (к), мегабайтах (м), гигабайтах (G), процентах от свободного пространства, оставшегося от суммы размеров всех предыдущих разделов (%), или же задать использование всего оставшегося пространства после разделения (*). Предыдущий пример можно записать и так: # /dev/adlsl: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 300M 0 unused 0 0 c: 1048257 0 unused 0 0 # "raw" part, don't edit d: 100% * unused 0 0 Третье поле offset задает смещение в секторах от начала слайса и указывает начальный сектор раздела. Можно посчитать его самостоятельно (номер последнего сектора предыдущего раздела + 1, начальный сектор предыдущего раздела + его размер «секторах и т.п.), но рекомендуется устанавливать здесь символ звездочки ("*"), что позволяет утилите bsdlabel самой правильно подсчитать и подставить необходимое значение. Утилита bsdlabel при автоматическом разделении слайса на разделы может задать смещение для раздела с меткой а: равным 16. При этом подстановка для других разделов смещения через *, скорее всего, приведет к ошибке. Учитывайте этот фаю* при создании разделов. Четвертое поле fstype указывает на формат файловой системы. Чаще всего используется запись 4.2BSD, но можно оставить и запись unused, поскольку утилита форматирования разделов newf s внесет изменения в список разделов, записав корректное значение. Что касается трех последних полей, то отметим только, что указывать эти значения необходимо только для типа файловой системы 4.2BSD. В других случаях оставьте нули или ничего не вводите — утилита форматирования разделов сама внесет корректные значения (это будет показано немного позже). Если вы записали неверные данные, запутались, у вас ничего не выходит, и вы хотите начать все сначала — выполните следующие две команды и снова перейдите к редактированию списка разделов: # dd if=/dev/zero of=/dev/adlsl bs=lk count=l # bsdlabel -B -w /dev/adlsl auto | После того список разделов отредактирован, и работа с утилитой завершена, «каталоге /dev должны появиться соответствующие устройства, например: # Is /dev/adl* /dev/adl /dev/adlsla /dev/adlsld a: 300M c: 1048257 d:
254 Глава 8. Файловые системы — управление и мониторинг /dev/adlsl /dev/adlslc Теперь можно воспользоваться утилитой форматирования файловой систа newf s, чтобы эти устройства можно было использовать в системе: # newfs /dev/adlsla /dev/adlsla: 300.0MB (614400 sectors) block size 16384, fragment size 4>2048 using 4 cylinder groups of 75.02MB, 4801 blks, 9664 inodes super-block backups (for fsck -b #) at: 160, 153792, 307424, 461056 # newfs /dev/adlsld /dev/adlsld: 211.8MB (433856 sectors) block size 16384, fragment size 4>2048 using 4 cylinder groups of 52.97MB, 3390 blks, 6784 inodes super-block backups (for fsck -b #) at: 160, 108640, 217120, 325600 Затем можно смонтировать файловые системы и проверить их на доступность возможность записи данных. Кроме "стандартной" разметки файловой системы мож попробовать разметить диск для эксклюзивного (опасного) режима доступа, называем го "Dangerous Dedicated". В этом режиме все разделы диска не будут видны из друп операционных систем, более того — для большинства из них этот диск будет виден п неразмеченный. Как бы там ни было, вкратце разберемся, как размечать диск для использования и в эксклюзивном режиме. Во-первых, сотрем всю информацию о таблице разделов: # dd if=/dev/zero of=/dev/adl bs=lk count=l Затем, пропустив инициализацию слайсов с помощью утилиты fdisk, попытаем автоматически разметить диск: # bsdlabel -В -w adl auto После автоматической разметки отредактируем вручную таблицу разделов, подоб но случаю с разделами слайса: # bsdlabel -e adl # /dev/adl: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 50% 0 unused 0 0 c: 1048576 0 unused 0 0 # "raw" part, don't edit d: 50% * unused 0 0 ft Is /dev/adl* /dev/adl /dev/adla /dev/adlc /dev/adld После того как диск размечен в эксклюзивном режиме, можно переходит к форматированию файловой системы и использованию разделов: # newfs /dev/adla /dev/adla: 256.0MB (524288 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 64.02MB, 4097 blks, 8256 inodes. super-block backups (for fsck -b #) at: 160, 131264, 262368, 393472 # newfs /dev/adld /dev/adld: 256.0MB (524288 sectors) block size 16384, fragment size 2046 using 4 cylinder groups of 64.02MB, 4097 blks, 8256 inodes. super-block backups (for fsck -b #) at: 160, 131264, 262368, 393472
Файловые системы — общие вопросы 2SS На этом вопрос добавления дисков в систему, их разметки и форматирования можно завершить. Более подробную информацию можно найти на станицах справочного руководства man fdisk,man bsdlabel, man newf s и т.п. Запись оптических носителей Мы вынесли этот вопрос в подраздел, посвященный разметке дисков и их форматированию, неспроста. Запись оптических дисков — это также отчасти форматирование файловой системы. Просто такая файловая система связана с понятием дорожек. Дорожки оптических носителей представляют собой последовательность данных, которые читаются также последовательно. Запись оптических носителей (в данном случае мы будем рассматривать вопрос записи CD) — это весьма популярный на сегодняшний день вопрос, так как эта технология все более и более вытесняет использование флоппи- дискет для переноса или хранения информации. Но вернемся к практической записи CD. Во-первых, наверное, не стоит напоминать, что CD используют свою файловую систему ISO9660, вопрос использования которой мы уже рассмотрели ранее в этой главе. Для записи же нам придется установить в систему специальные утилиты, позволяющие создавать файл данных *.iso с файловой системой ISO9660 из указанного дерева каталогов компьютера или копированием другого CD в такой же файл. Такой файл, как правило, называется ISO-образом (полная копия данных на CD). И только после создания такого файла можно воспользоваться стандартной утилитой записи burned (для ATAPI-устройств) или нестандартной утилитой cdrecord из набора sysutils/cdrtools (см. главу 9, "Установка и обновление сторонних приложений") для записи на устройства USB или SCSI. ЗАПИСЬ DVD В данном разделе мы не будем рассматривать работу с DVD— этот вопрос довольно сложен в связи с распространением большого количества форматов и практической невозможностью проверить «запись на каждом из них. Скажем только, что для записи DVD необходимо использовать утилиты из набора sysutils/dvd*rw- tools и sysutils/cdrtools. Создание образа Для создания файла ISO-образа воспользуемся утилитой mkisof s из того же набора sysutils/cdrtools. Предположим, что файлы, которые необходимо записать на CD-диск, собраны в каталоге /tmp/cdr, a ISO-образ будет создан в файл /tmp/image. iso. В таком случае самый простой вызов и результат работы утилиты mkisof s будет приблизительно таким: # mkisofs -о /tmp/image.iso /tmp/cdr 12.50% done, estimate finish Wed Mar 25.03% done, estimate finish Wed Mar 37.50% done, estimate finish Wed Mar 50.02% done, estimate finish Wed Mar 62.51% done, estimate finish Wed Mar 74.98% done, estimate finish Wed Mar 87.50% done, estimate finish Wed Mar Total translation table size: 0 Total rockridge attributes bytes: 0 Total directory bytes: 16384 Path table size(bytes): 132 Max brk space used 13aa4 40010 extents written (78 MB) # 11 /tmp/image.iso -rw-r--r— 1 root wheel 81940480 Mar 1 01:24 /tmp/image.iso 1 1 1 1 1 1 1 01 01 01 01 01: 01: 01: :23: :24: :24: :24: :24: :24: :24: :58 :13 :29 :43 :50 :51 :53 2006 2006 2006 2006 2006 2006 2006
256 Глава 8. Файловые системы — управление и мониторинг Первая команда из представленного листинга создала файл /tmp/image.isj с файловой системой ISO9660. В результате записи этого файла на CD-диске будет по лучена копия каталога /tmp/cdr. Но не все так гладко как хотелось бы. В первую очередь, вспомним, что файлова система ISO9660 имеет ограничения на имена файлов. Вызов утилиты mkisofs, и& пользованный в представленном выше примере, преобразует все неподходящие имен! файлов и каталогов на свое усмотрение согласно стандарту. Файлы с именами, которьи в результате урезания стали непригодными для использования на CD-диске, будут просто исключены. В таком случае на помощь придут расширения формата, к примеру, Rock Ridge, Joliet или HFS. Любое из этих расширений можно включить с помощью опций утилиты mkisofs, чтобы обойти ограничения файловой системы ISO9660. Так, опция -R включает поддержку расширения Rock Ridge (используется в UNIX- системах), опция - J — расширения Joliet (наиболее подходящее для систем Windows),a опция -hf s — расширения HFS (используется в MacOS). Обратите внимание на то, что для создания диска с игнорированием любых ограничений файловой системы ISO9660, но при условии использования такого CD только в системах FreeBSD, можно использовать опцию -и. Для просмотра полученного ISO-образа до того как он будет записан на CD используйте следующую последовательность команд для FreeBSD 5.0 и старше (должна быть активна поддержка устройства md): # mdconfig -a -t vnode -f /tmp/image.iso -u 0 # mount -t cd9660 /dev/mdO /mnt/virtcd Для систем FreeBSD 4.x монтирование ISO-устройства будет выглядеть несколько иначе (необходима поддержка устройства vn): # vnconfig -e vnOc /tmp/image.iso # mount -t cd9660 /dev/vnOc /mnt/virtcd К примеру, так будет выглядеть содержимое ISO-образа, созданного в примере ранее (то есть, без поддержки расширений): # Is /mnt/virtcd/antiviru/ adaware mcafee_v stinger # Is /mnt/virtcd/antiviru/stinger/ s_t_i_n_.exe s_t_i_n_•0Pt Как можно заметить, имена файлов несколько урезаны. А вот как будет выглядеть образ, созданный с использованием расширения Rock Ridge (или Joliet): # Is /mnt/virtcd/Antiviruses/ AdAware McAfee_VS Stinger # Is /mnt/virtcd/Antiviruses/Stinger/ s_t_i_n_g_e_r.exe s_t_i_n_9_e_r•°Pt Разница налицо... Кроме указанных расширений, довольно часто находит применение опция -Ь, задающая расположение загрузочного образа при создании загрузочного CD. В качестве аргумента для этой опции следует использовать путь к загрузочному образу относительно корня файловой системы на CD. По-умолчанию, утилита mkisofs создает образ, размер загрузочного образа для которого будет равен строго 1200, 1440 или 2880 Кбайт (режим эмуляции). Однако некоторые загрузчики не используют режим эмуляции, и тогда необходимо дополнительно использовать опцию -no-emul-boot. В соответствии с описанием, если загрузочный образ для диска находится по пути /tmp/cdr/boot/bootcd, тогда образ файловой системы можно создать следующей командой: # mkisofs -R -no-emul-boot -b boot/booted -o /tmp/image.iso /tmp/cdr
Файловые системы — общие вопросы 257 В целом, утилита mkisof s имеет довольно много опций, которые позволяют тонко настроить создание ISO-образа. Более подробную информацию об ее использовании иожно найти на странице справочного руководства man mkisof s. Копирование CD в образ Кроме создания своего ISO-образа, существует возможность полностью скопировать содержимое CD с данными в файл образа как для дальнейшей его записи на CD, так и для использования на компьютере через виртуальный диск (как было показано ранее). Создание копии диска позволяет полностью сохранить структуру и загрузочную информацию оригинального компакт-диска. Для этой цели используется стандартная утилита dd. Для копирования CD с использованием устройства acdO в образ image, iso в каталог /tmp используется следующий вызов (для систем FreeBSD 5.x и старше): # dd if=/dev/acdO of=/tmp/image.iso bs=204 8 В случае системы FreeBSD 4.x в качестве устройства используется его имя с символом с в конце для обозначения доступа ко всему диску, например, /dev/acdOc. Запись CD Итак, образ создан. Но как записать его на диск? Более простой операции, наверное, нет во всем процессе создания/записи CD-дисков. Как уже упоминалось выше, для ATAPI-устройств будем использовать стандартную утилиту burned, поставляемую встандартном наборе утилит системы. Самый простой вариант записи данных выглядит следующим образом: # burned -f /dev/acdO data /tmp/image.iso fixate При этом, образ /tmp/image.iso будет записан как файловая система на устройство /dev/acdO в режиме data (диск с данными), с записью таблицы ТОС для возможности получения доступа к CD-диску после записи (диск будет "закрыт" для дальнейшей записи). Утилита burned проста в использовании и имеет незапутанную и простую страницу помощи в справочном руководстве, и потому надеемся, что особых проблем с ее использованием не возникнет. Что касается не ATAPI-устройств, здесь дело обстоит несколько иначе — стандартными утилитами не обойтись. Но, если в системе уже установлен набор sysutils/cdrtools, то беспокоиться не о чем — в нем присутствует утилита cdrecord, использование которой еще проще, чем в случае с burned. Все, что необхо- рмо, — указать устройство записи и ISO-образ: # cdrecord dev=l,5,0 image.iso Для определения устройства, которое будет применено для записи CD-диска, используется следующая команда: # cdrecord -scanbus Более подробная информация находится на страницах справочного руководства. Запись данных, минуя ISO-образ, или Backup-CD Операционная система (а точнее, утилита burned) позволяет записывать на CD необработанные данные, то есть, данные не в формате ISO9660. Как правило, такая возможность используется для создания резервных копий (потому мы и назвали раздел как Backup-CD). Доступ к таким данным возможен только в самой системе FreeBSD, без монтирования (поскольку диск не будет содержать стандартную для него файловую
258 Глава 8. Файловые системы — управление и мониторинг Щ систему ISO9660), и только с помощью утилиты, которая "понимает" формат файлаЛ писанного на диск. щ Первым делом необходимо определиться с утилитой для создания файла, запнЛ ваемого на CD. При создании резервных копий обычно используется утилита tar (Л раздел "Создание резервных копий и восстановление"). В таком случае команда запЛ данных файла /var/backup/backup.tgz на CD с использованием устройства аса с максимальной скоростью будет выглядеть следующим образом: ■ # burned -f /dev/acdO -s max data /var/backup/backup.tgz fixate I Для доступа к данным необходимо воспользоваться утилитой tar: I # tar xzf /dev/acdO I Выполнять эту операцию следует без монтирования устройства acdO, а данные Ц дут распакованы в текущий каталог. Копирование и запись Audio-CD Процесс создания и записи Audio-CD несколько отличается от Data-CD. В даннш случае нет необходимости создавать промежуточные образы в формате ISO9660. До копирования Audio-CD потребуется извлечение аудиодорожек в отдельные файлы, ело следующей их записью на новый CD. Обратите внимание на различный подход к изв.™ чению аудиоданных с различных типов устройств, то есть, при использовании ATAPI SCSI/tlSB используются различные способы. Первым делом разберемся с извлечением дорожек с устройств ATAPI. В даннш случае каждая аудиодорожка будет видна как отдельное устройство в каталоге /de в виде acdXtNN, где X — порядковый номер устройства, а NN — порядковый нот трека (аудиодорожки), при этом первый трек будет записан как 01, а не 1, например acdOtOl или acd0tl9. Для систем FreeBSD 4.x файлы данных устройств необходим создать с помощью утилиты MAKEDEV: # cd /dev # sh MAKEDEV acdOtOl ( ... и так далее для каждого трека ... ) Как только эти устройства появились, можно приступать к копированию трека (в FreeBSD 5.x и старше, возможно, будет виден только один такой трек, но при коп» ровании первого все остальные будут автоматически обнаружены). Для копированш треков при использовании устройств ATAPI применяется уже знакомая нам утилита dd При извлечении аудиоданных нам придется использовать размер блока, равны] 23S2. Таким образом, порядок копирования первых трех треков примет следующий щ (само собой, информация о результате копировании у читателя будет другой): # dd ifs/dev/acd0t01 of=»/tmp/trackl.cda bs=2352 16063+0 records in 16063+0 records out 37780176 bytes transferred in 44.707402 sees (845054 bytes/sec) # dd if»/dev/acd0t02 of«/tmp/track2.cda bs-2352 11390+0 records in 11390+0 records out 26789280 bytes transferred in 37.530775 sees (713795 bytes/sec) # dd if=/dev/acd0t03 of»/tmp/track3.cda be-2352 ( ... > После копирования всех треков можно записать их на диск с помощью утилитЧ burned. При этом необходимо указать, что записывается именно Audio-CD (команд audio перед списком треков) и обязательно "закрыть" диск (команда fixate): # burned -f /dev/acdO -s 4 audio trackl.cda track2.cda ... fixate
Файловые системы — общие вопросы 259 При использовании SCSI-устройств как для извлечения, так и для записи аудиоданных необходимо применять утилиты из набора sysutils/cdrtools: cdda2wav и cdrecord. Как можно догадаться из названия, утилита cdda2wav извлекает данные cAudio-CD и сохраняет их в формате WAV, AU, CDR или RAW. Пример использования, когда каждый трек записывается в отдельный файл в формате WAV: # cdda2wav -Dl,2,0 -В -Owav Устройство считывания данных может быть обнаружено командой: # cdda2wav -scanbus Для записи всех wav-файлов из каталога /tmp воспользуйтесь следующей командой: # cdrecord dev=l,2,0 -v -dao -useinfo /tmp/*.wav Проверка и восстановление поврежденных файловых систем Никто не застрахован от сбоев в работе системы. В одних случаях они вызваны некорректным поведением пользователей, в других — физическим влиянием извне, например, отключением питания. В зависимости от состояния системы в момент сбоя, последствия могут быть плачевными или же не вызвать даже учащения пульса. Но как бы там ни было, даже без явных признаков потери информации или частичного повреждения данных, проверка целостности файловых систем —обязательный пункт, который всегда должен выполняться перед монтированием. В различных операционных системах присутствуют различные утилиты для проверки файловых систем на наличие ошибок. Например, пользователям систем Windows хорошо знакома утилита ScanDisk (Windows 9x/ME) или chkdsk.exe (Windows NT/2000/2003). Для пользователей систем Unix/Linux такой утилитой будет f sck, которая по умолчанию во время старта системы проверяет файловые системы, перечисленные в файле /etc/f stab, для которых в шестом полем указано значение, отличное от нуля. Также можно запускать проверку вручную для любого дискового устройства из каталога /dev. Автоматическая проверка несколько упрощена (запускается с опцией -р, режим preen) и заключается в проверке на присутствие метки clean для разделов и других несложных ошибок файловой системы. Для определенных видов нарушений целостности файловой системы режим preen (очистка) не подходит. В таких случаях утилита fsck завершает свою работу, сообщая об аварийном состоянии файловой системы и требованием запустить специальную утилиту для данного типа файловой системы. Последние версии утилиты fsck работают в двух режимах: сначала запускается приоритетный режим проверки файловых систем, который определяет, должна ли проверка происходить во время последовательного запуска операционной системы или же может быть выполнена в фоновом режиме, после выполнения всех операций загрузки. При обнаружении в файловых системах, которые проверяются в процессе запуска, неисправимых ошибок в режиме чистки система будет переведена в однопользовательский режим для ручного запуска проверки и исправления ошибок специализированной утилитой (например, fsck_ffs или fsck не в режиме preen). Файловые системы, состояние которых не влияет на приведение системы в работоспособное состояние, будут проверены в фоновом режиме. ВНИМАНИЕ! пускать проверку файловой системы в ручном режиме практически никогда не потребуется. И все же, даже при отсутствии йвных повреждений, время от времени Ё!.?.м.е.н.дУе^...в^п.ол.н.5!!г.ь П0ЛНУЮ проверку«всех файловых, систем вручную.
260 Глава 8. Файловые системы — управление и мониторинг На основании чего утилита проверки дисков определяет состояние файловой си темы? Для файловой системы UFS (FFS) эта возможность основана на понятии суш блоков. Суперблок содержит, наверное, наиболее важную информацию о файловой а теме, именно поэтому при ее создании утилита разметки создает несколько копий q перблоков, разбросанных по всей файловой системе. На основании суперблока моя получить доступ к файловой системе, так как именно в нем хранится информацм блоках данных и индексных дескрипторах. Прежде, чем происходит запись данных, су перблок помечается как "грязный" (unclean) и только после завершения всех операцй записи снова возвращается в состояние "чистый" (clean). Состояние clean для супер блока означает, что все операции записи данных были завершены успешно, и файлов система находится в стабильном состоянии. Файловая система с суперблоком в соста нии clean по умолчанию не проверяется. Рассмотрим этапы проверки файловой системы с помощью утилиты f sck, находа щейся в состоянии unclean, а также порядок проверки файловой системы вручим режиме (в любом состоянии). В первую очередь обращаем внимание на то условие, чп перед ручной проверкой файловой системы ее необходимо размонтировать или загру зить систему в однопользовательском режиме. Данное условие немаловажно, посколы) можно столкнуться с непредсказуемыми ситуациями, если файловая система будет н» ходиться в постоянном изменении при проверке и исправлении ошибок. Если файлом система помечена как clean, обойти данную ситуацию и проверить ее полностью мох но с помощью опции -f. Для проверки одной файловой системы используется следующий формат вызова: fsck [опции] /dev/<devame> где [опции] — возможный список опций утилиты fsck, a <devname> — имя файл устройства для проверки. Этапы проверки файловых систем с помощью утилиты fsck В системе FreeBSD утилита fsck проходит пять этапов проверки файловой системы. 1. Проверка блоков и размеров (Check Blocks and Sizes). 2. Проверка имен путей (Check Pathnames). 3. Проверка связности (Check Connectivity). 4. Проверка счетчика ссылок в индексных дескрипторах (Check Reference Counts). 5. Проверка свободных блоков и индексных дескрипторов (Check Су! groups). По умолчанию, на каждом из пяти этапов программа может исправлять множество ошибок без участия пользователя, но в некоторых случаях она требует вмешательства, задавая вопрос о необходимости внесения изменений или игнорирования ошибки. Длл большей автоматизации используйте при вызове утилиты fsck вручную опцию -у, которая отвечает на все запросы утилиты положительно. Если требуется такое же поведение утилиты в автоматическом режиме проверки файловых систем, добавьте следующую строку в конфигурационный файл системы /etc/rc. conf: fsck_y_enable="YES" Первый этап заключается в проверке индексных дескрипторов на наличие неправильных записей. Сюда можно отнести следующие случаи: наличие в индексном дескрипторе неверных битов, определяющих тип файла; в индексном дескрипторе записан меньший размер файла, чем тот размер, который он занимает на самом деле; другие подобные ошибки блоков данных и их размеров.
Файловые системы — общие вопросы 261 Второй этап заключается в проверке имен путей. Его суть заключается в удалении/исправлении записей о каталогах, для которых повреждены индексные дескрипторы и других случаев несоответствия записей в индексных дескрипторах и соответствующих каталогах; также удаляются/исправляются индексные дескрипторы, для которых не выделено пространство. Третий этап заключается в обнаружении ошибок в каталогах, на которые нет ссылок. Появление каталога lost+found происходит именно на этом этапе. В него помещаются записи обо всех неверно размещенных каталогах. Четвертый этап основан на информации второго и третьего этапов и заключается в проверке файлов, для которых нет ссылок. Если имя файла неизвестно, то данный файл помещается в каталог lost+found. Если на заданный утилитой вопрос ответить шрицательно, то "безымянный" файл данных будет удален (пустые файлы удаляются без запроса). На данном этапе проверяются также файлы, для которых количество ссылок не совпадает с записанным количеством ссылок в его индексном дескрипторе. После того как работа утилиты завершена, можно просмотреть список файлов и каталогов Blost+f ound и, при необходимости, переименовать их и скопировать в требуемый каталог. Те файлы и каталоги, которые не нужны, можно удалить. Пример отображения ошибок найденных на данном этапе: UNREF FILE 1=96815 OWNER=mysql MODE=100600 SIZE=0 MTIME=Feb 25 18:07 2006 CLEAR? Пятый этап — наиболее простой. Все, что происходит, — проверка таблицы свободных блоков и неиспользованных индексных дескрипторов. В принципе, процесс исправления автоматизирован, но в ручном режиме запуска f sck будет задан дополнительный вопрос на разрешение записи исправлений. В результате будет выведена общая информация о количестве файлов, использованных и свободных блоков и проценте фрагментации (на это значение можно не обращаться внимания, поскольку файловая система FreeBSD, в силу своей реализации, практически не подвержена фрагментации). Пример работы утилиты f sck после некорректно завершенной работы системы во время записи данных на диск может выглядеть следующим образом (простой вариант "повреждения"): # fsck -t ufs /dev/adlsl ** /dev/adlsl ** Last Mounted on /home ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Cyl groups FREE BLK COUNT(S) WRONG IN SUPERBLK SALVAGE? [yn] у 22 files, 3736 used, 247007 free (31 frags, 30872 blocks, 0.0% fragmentation) ***** FILE SYSTEM MARKED CLEAN ***** ***** FILE SYSTEM WAS MODIFIED ***** Обращаем внимание на то, что "убить" файловую систему в FreeBSD практически невозможно. Как правило, такое случается при аппаратном сбое контроллера диска или неправильной работе утилиты, которая может привести к повреждению данных, неправильно записывая их на диск. Еще более надежной будет файловая система при включенном расширении Soft Updates, о которой мы поговорим немного позже. Сейчас же следует рассмотреть очень важный вопрос восстановления суперблоков.
262 Глава 8. Файловые системы — управление и мониторинг Режим восстановления суперблоков Серьезным повреждением файловой системы является повреждение суперблою, размещенного в начале раздела. Если после сбоя не удается смонтировать файловую систему, а утилита f sck не может исправить ошибку при стандартной проверке или не запускается — не нужно сразу же впадать в панику. Так как суперблок является важной частью файловой системы, то всегда существует несколько его копий, разбросанных по всему диску. Обязательная первая резервная копия суперблока всегда размещена в начале 32-го сектора для UFS1 и в начале 160-го сектора для UFS2. Утилита f sck пытается восстановить суперблок именно из него, копируя его на место стандартного. Как только такая операция будет выполнена, файловая система стает пригодной для монтирования. Если произошел серьезный сбой, и был утерян суперблок и из 32-го (160-го) сектора, существует возможность указать утилите fsck_ffs расположение другой копии суперблока с помощью опции -Ь. Например, следующая команда будет пытаться восстановить суперблок из сектора 262368 в разделе adOsle: # fsck_ffs -b 262368 -у /tmp Для того чтобы узнать расположение всех копий суперблоков можно воспользоваться командой newf s с флагом -N (желательно записать данные параметры до того как произойдет сбой и затем использовать по необходимости в случае сбоя). "Живой" пример просмотра списка суперблоков и использования одного из них при проверке диска утилитой f sck_f f s для файловой системы UFS2 представлен в листинге 8.2. Листинг 6.2. Пример восстановление файловой системы с использованием^ тивного суперблока в■y$$ifa-£u<&j5£m И, получения информации о рас- положении суперблоков с помощью утилиты паке» . ,■ ,■ # newfs -N /dev/adOsle /dev/adOsle: 256.0MB (524288 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 64.02MB, 4097 blks, 8256 inodes. super-block backups (for fsck -b fr) at: 160, 131264, 262368, 393472 # fsck_ffs -b 262368 -y /tmp Alternate super block location: 262368 ** /dev/adOsle ** Last Mounted on ** Phase 1 - Check Blocks and Sizes +* Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Cyl groups SUMMARY BLK COUNT(S) WRONG IN SUPERBLK SALVAGE? yes 6 files, 6 used, 126833 free (33 frags, 15850 blocks, 0.0% fragmentation) UPDATE STANDARD SUPERBLOCK? yes ***** FILE SYSTEM WAS MODIFIED ***** Как видно из примера, утилита использует суперблок при проверке и в конце проверки/исправлений также запрашивает перезапись стандартного суперблока его копией из указанного сектора. В большинстве случаев пользователь не сталкивается с необходимостью перезаписи суперблоков — вероятность4подобной ситуации крайне мала. К тому же с каждым годом файловая система все более совершенствуется и становится
Файловые системы — общие вопросы 263 вактически неуязвимой. К таким усовершенствованиям можно отнести выход UFS2 и Ешологию Soft Updates, к рассмотрению которой и перейдем. ' Технологии записи метаданных. Soft Updates Существует несколько технологий записи метаданных, с одной стороны — синенные и асинхронные, с другой — их разновидности. Метаданные — это, к примеру, тдексные дескрипторы или каталоги, то есть, данные, которые в действительности указывают на расположение реальных блоков данных. Наиболее распространенной ста- Втехнология синхронной записи метаданных, при этом данные загоняются в кэш и за- т асинхронно записываются на диск. В это время система ожидает, когда данные бу- цут реально записаны на диск из кэша, и только затем записывает метаданные на диск. Гаким способом достигается надежность: сбой в системе не нарушает ранее записанных негаданных, а файл успевает или не успевает записаться, что не особо важно в данном иучае. Такую ошибку без труда находит утилита проверки файловой системы, и по необходимости исправляет ее. Кроме надежности, явно заметна и простота данной технологии, хотя и за счет по- тери времени, так как метаданные довольно часто пишутся на диск в нагруженной сис- гсме (любое изменение файловой системы вызывает обновление метаданных). Особенно это заметно при удалении каталогов с большим количеством файлов или при восста- Ювлении данных из архивных копий. Для решения проблемы потери времени при синхронном обновлении метаданных южно воспользоваться технологией асинхронного обновления метаданных, которая йлючается при монтировании файловой системы командой mount с помощью опции ■о async. В данном случае, как данные, так и метаданные сначала записываются в кэш «только затем — на диск. При этом, естественно, пользователь заметит явное ускорена при работе с файловой системой, поскольку метаданные и данные будут записы- нггься на диск с определенной задержкой. "Плюс" — в визуальной скорости при работе с данными и простоте реализации даной технологии. Большой же "минус" — ненадежность файловой системы, исполь- |ующей эту технологию, и большая вероятность потери данных при сбое. Состояние истемы после сбоя непредсказуемо. В лучшем случае, будет потеряна часть данных, |худшем — файловая система будет находиться в таком хаотическом состоянии, что утилита f sck не сможет исправить ошибки и восстановить потерянные цепочки данных, а может даже окончательно нарушить целостность данных. В результате придется издавать файловую систему заново, и восстанавливать данные из резервных копий. Однако решение нашлось и на этот раз. Оно заключается в протоколировании протейной области. Такая технология была названа журналированием и заключается кинхронном обновлении метаданных, но в отдельную область диска. Позже они пере- иещаются в ту область, в которой должны быть. Поскольку область протоколирования (данном случае — это небольшая часть диска с последовательным доступом, достигался эффект минимального движения головки, что позволяет явно увеличить скорость рботы с данными, несмотря на тот факт, что метаданные все же пишутся на диск син- JfOHHO. Данная технология обладает только одним недостатком: запись обновленных мета- рнных происходит дважды: в начале — в специальную область протоколирования, и атем — в необходимое место. В связи с этим, технология протоколирования не всегда нет положительный результат, а иногда даже — нежелательный. В то же время, при Ы все незавершенные операции по обновлению метаданных могут быть просто и бы- про отменены, что позволяет ускорить процесс загрузки системы на этапе восстановлена целостности файловой системы. Для FreeBSD была разработана несколько иная система для ускорения работы [метаданными и уменьшения риска потери данных — технология, названная "Soft Up- toes". Она основана на следующем принципе: все незавершенные обновления метадан- №х остаются в памяти и записываются на диск в упорядоченном виде. В таком случае
264 Глава 8. Файловые системы — управление и мониторинг при обновлении метаданных более поздние обновления добавляются в конец к пред» дущим метаданным, если они находятся в памяти и не записаны на диск. Таким обр£ зом, все операции над метаданными выполняются в памяти перед тем, как будут записаны на диск. В то же время данные гарантированно не могут быть записаны на дискщ метаданных. Что же происходит после сбоя, и почему практически невозможно столкнута с ситуацией краха файловой системы? В технологии Soft Updates существует понятие отката, в результате которого считается, что все операции, не записанные на диск, не происходили. Фактически, диск находится в том состоянии, в котором он находился не- задолго до сбоя (около одной минуты). Данные, которые были вовремя записаны на диск и для которых были записаны также и метаданные, будут без проблем находитьа там, где и положено. Выделенные ресурсы, которые заполнены неполными данными или не заполнены в целом, будут помечены как используемые, но при этом утилита f sck все такие ресурсы освободит. Кстати, файловая система с поддержкой Soft Updates может быть смонтирована после даже без проверки — достаточно использовать форсирование монтирования тоигд -f. Все же, проверка необходима, чтобы потерянные ресурсы не "забивали" дисковое пространство. Именно для этого и была разработана фоновая проверка дисков, когда все разделы с поддержкой Soft Updates монтируются в "грязном" состоянии и могут использоваться пользователями. В то же время, система запускает фоновую проверку все» таких разделов для освобождения неиспользуемых ресурсов. Все файловые системы, которые не используют Soft Updates, требуют проверки в обычном режиме. Несмотря на сложность реализации данной технологии, она нашла широкое применение, и последние версии FreeBSD включают ее практически для всех разделов еще на этапе установки системы. Широкое распространение обосновано скоростью работы с метаданными, которая сопоставима со скоростью обновления метаданных при асинхронном режиме, не говоря уже о сравнении с журнальными файловыми системами, наподобие Ext3fs, применяемыми в Linux-системах. Большим "минусом" Soft Updates являются высокие требования к ресурсам — особенно к памяти. Большие и неприятные казусы могут возникнуть в ситуации, когда файловая система может скоро полностью "забиться". Первый вариант: данных было записано больше, чем существует свободного места на диске. При этом может наблюдаться ситуация 101-105% заполнения диска. Другая проблема: одновременно происходит удаление большого количества данных и запись. В таких случаях пользователь может видеть свободное пространство, которого в тот момент еще нет на диске. К тому же, может оказаться непривычной ситуация, когда после сбоя при записи данных пользователь не обнаружит потерянных цепочек в каталоге lost+found, так как утилита проверки просто удалит такие цепочки. А теперь прейдем к более практическим вопросам. Для начала выясним, как узнай, какие файловые системы используют Soft Updates. Для этого необходимо воспользоваться утилитой mount: # mount /dev/adOsla on / (ufs, local) devfs on /dev (devfs, local) /dev/adOsle on /tmp (ufs, local, soft-updates) /dev/adOslf on /usr (ufs, local, soft-updates) /dev/adOsld on /var (ufs, local, soft-updates) /dev/adlsl on /home (ufs, local, soft-updates) При создании файловой системы с помощью утилиты newf s необходимо добавить опцию -и для включения Soft Updates на этапе форматирования файловой системы (листинг 8.3).
Квотирование файловых систем 265 Листинг 8.3. Пример создания файловой системы с поддержкой Soft Updates f newfs -02 -U /dev/adlsl /dev/adlsl: 511.8MB (1048256 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 127.97MB, 8190 blks, 16384 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 262240, 524320, 786400 Опция -и в команде newfs появилась только в версии FreeBSD 4.5 Кроме того, включать и отключать поддержку Soft Updates можно в любой момент времени практически для всех файловых систем. Для этого используется утилита tunef s (применяется и в других случаях, но в данный момент нас интересует только Soft Updates). При этом не забудьте размонтировать файловую систему, иначе ничего не получится. Утилита tunef s используется для "тонкой" настройки файловой системы и увеличения производительности. Итак, размонтировав файловую систему, можно включить и отключить поддержку Soft Updates, указав при этом файловую систему по точке монтирования или имени устройства следующим образом: # tunefs -n enable /home tunefs: soft updates set # tunefs -n disable /dev/adlsl tunefs: soft updates cleared Напоминаем, что использовать данную технологию необходимо осторожно (хорошо еще, что ее нельзя установить для корневого раздела /). В загруженных разделах, где хранятся важные данные, данное расширение рекомендуется не включать. Без проблем его можно использовать для таких разделов как /tmp или /var, а вот относительно использования в разделе /usr следует хорошо подумать. На этом завершим рассмотрение Soft Updates и вопросов проверки и восстановления поврежденных файловых систем. КВОТИРОВАНИЕ ФАЙЛОВЫХ СИСТЕМ Пользователи в больших компаниях, "дорвавшись" до серверного пространства, начинают хаотически "забивать" его разной ненужной информацией, наподобие фильмов, копий компакт-дисков с игрушками, каталогов установленных игрушек и т.п. В результате их необдуманных действий возрастает нагрузка на аппаратную часть серверов во время синхронизации каталогов или суточного создания резервных копий файлов. Еще больше головной боли добавит администратору исчерпание дискового пространства. После "разборок" он начинает без предупреждения чистить данные пользователей и в своем рвении может случайно уничтожить важные пользовательские данные. Кто же не прав? И пользователи и администратор. С точки зрения пользователей, неверен подход к дисковому пространству, с точки зрения администратора — непредусмотрительность возникновения подобных ситуаций. Различные операционные системы в помощь администратору предоставляют великолепное средство виртуального ограничения дискового пространства: установка квот. Квотирование — это возможность операционной системы, которая при необходимости может быть включена в любой момент и отвечает за ограничение использования дискового пространства по объему, количеству файлов или другому критерию для каждого пользователя в отдельности или для группы пользователей в пределах одной файловой системы. Возможность установки квот присутствует и в системе FreeBSD. Наиболее
266 Глава 8. Файловые системы — управление и мониторинг часто квотирование используется на файловых серверах для ограничения данных пользователей и хостинг-серверах, где каждый лишний мегабайт дискового пространства стоит денег. Настройка квот кому-то может показаться довольно сложным процессом, для других же не вызовет проблем. К примеру, автор книги научился правильно пользоваться квотами только с третьего раза ©. Первый "прокол" (это было в 1999 году) заключался в незнании формата файла /etc/f stab (да-да, он нам опять понадобится). Итак, в первую очередь необходимо включить поддержку квотирования на уровне ядра, которая по умолчанию в него не включена. Для этого необходимо включить в конфигурационный файл ядра следующую строку: options QUOTA после чего собрать новое ядро и установить его в системе (см. главу 10, "Настройка ядра системы"). Однако перезагружать систему после включения опции поддержки квот в ядро спешить не нужно. Для включения глобальной поддержки квот потребуется еще добавить в конфигурационный файл системы /etc/rc. conf следующую строку: enable_quotas="YES" После включения данной опции будет также включена другая опция, которая при каждой загрузке системы проверяет целостность квот (соответствие данных в базах квот с данными файловой системы) для каждой файловой системы с помощью утилиты quotacheck. Такая проверка занимает довольно продолжительный период времени, что может привести к задержке загрузки системы даже на несколько часов. Если такое поведение системы недопустимо, то данный шаг можно пропустить; для этого добавьте в файл /etc/rc. conf следующую строку: check_quotas="NO" Следующим шагом на этапе включения поддержки квот является внесение изменений в файл /etc/f stab. Редактирование это файла является обязательным шагом — квотирование включается только для тех файловых систем, для которых будут явно указано использование квот на уровне пользователей, групп или для обеих этих категорий. Для включения квот на файловую систему по пользователям необходимо добавить в поле опций опцию userquota, для включения квотирования по группам — опцию groupquota, а для включения квот по пользователям и группам — необходимо включить обе опции. В качестве примера представим три строки, которые показывают, как включить любой вариант квотирования из указанных выше для раздела /home: /dev/adOslg /home ufs rw,userquota 1 2 /dev/adOslg /home ufs rw,groupquota 1 2 /dev/adOslg /home ufs rw,userquota,groupquota 1 2 После этого можно перезапустить систему для загрузки нового ядра с поддержкой квот и автоматического создания нулевых файлов квот для каждой файловой системы, которые были заданы в файле /etc/fstab. Файлы квот хранятся в "корне" файловой системы, для которой было включено квотирование. Таким образом, для раздела, смонтированного к точке монтирования /home, файлы квот будут находиться именно в каталоге /home. Файлы квот имеют имена quota. user для пользовательских квот и quota. group для групповых квот. Изменять расположение файлов квот не рекомендуется. Если файлы квот не были созданы во время загрузки системы, то запустите команду quotacheck с указанием точки монтирования. Например, для раздела /home с установленным квотированием по пользователям: # quotacheck /home quotacheck: creating quota file /home/quota.user
Квотирование файловых систем 267 После этого можно проверить правильность работы подсистемы квот с помощью утилиты quota: # quota -v Disk quotas for user root (uid 0): Filesystem usage quota limit grace files quota limit grace /home 50 0 0 2 0 0 Эта утилита позволяет просмотреть информацию о разделах, для которых установлена опция квотирования, а также подробную информацию об использовании данного раздела текущим пользователем и опциях квотирования для него. Вывод перечисленной информации подтверждает правильность подготовки системы к настройке квот для пользователей (или групп). Еще одним способом для проверки правильности настройки подсистемы квот является вызов утилиты mount без параметров: # mount /dev/adOsla on / (ufs, local) devfs on /dev (devfs, local) /dev/adOsle on /tmp (ufs, local, soft-updates) /dev/adOslf on /usr (ufs, local, soft-updates) /dev/adOsld on /var (ufs, local, soft-updates) /dev/adlsl on /home (ufs, local, with quotas) Файловые системы, для которых была установлена опция квотирования и присутствуют файлы квот, будут обозначены как "with quotas". Следующим шагом является непосредственно установка квот для пользователей (или групп). В контексте данной главы будем рассматривать установку квот по пользователям. Установка квот осуществляется с помощью утилиты edquota, но прежде, чем ее использовать, необходимо разобраться с типами ограничений и их отличиями. В первую очередь, запомним, что существуют два типа ограничений: по объему дискового пространства (или квотирование по блокам) и по количеству файлов (аточнее — индексных дескрипторов). Каждый из этих типов можно использовать по отдельности, а можно и объединить их. Любой из двух типов ограничений делится на подкатегории: мягкое и жесткое ограничение. Жесткое ограничение всегда выполняется и не может быть превышено. Таким образом, при превышении указанного лимита использования дискового пространства система блокирует дальнейшее выделение ресурсов. Рассмотрим следующий пример: жесткое ограничение для пользователя на использование 3000 блоков. Предположим, пользователь уже использовал 2900 блоков и теперь пытается записать файл, занимающий 2S0 блоков. Данная операции закончится неудачно, файловая система заблокирует такую запись. В то же время, пользователь сможет еще записать файл в 100 блоков. Мягкое ограничение не запрещает пользователю превысить установленный лимит использования ресурсов файловой системы, но только на определенный период времени. Данный период времени называется периодом отсрочки и по умолчанию равен семи дням. Если пользователь в период отсрочки постоянно превышает установленное мягкое ограничение, то оно при превышении лимита времени превращается в жесткое и для пользователя будет заблокировано дальнейшее выделение ресурсов файловой системы. Для сброса данного ограничения пользователю необходимо вернуться к отметке, меньшей, чем мягкое ограничение. Период отсрочки можно изменить с помощью команды edquota -t. Итак, рассмотрев типы ограничений, перейдем непосредственно к вопросу установки квот. Рассмотрение его на примере для пользователя ftpshell как по объему дискового пространства (то есть, по блокам), так и по количеству индексных дескрипторов. Для начала, запомните, что утилита edquota вызывает текстовый редактор, который задан переменной среды EDITOR, потому, прежде всего, позаботьтесь об установке подходящего редактора. В нашем случае мы воспользуемся редактором edit (ее).
268 Глава 8. Файловые системы — управление и мониторинг Самый простой случай установки квоты — для одного пользователя. При этом потребуется только передача имени пользователя в виде аргумента для утилиты edquots: # edquota ftpshell Quotas for user ftpshell: /home: kbytes in use: 18, limits (soft = 0, hard = 0) inodes in use: 9, limits (soft = 0, hard = 0) Прежде всего, обратите внимание на то, что блоком данных для утилиты edquota в данный момент является 1 Кбайт. В старых версиях FreeBSD по умолчанию указывался объем в блоках по 8 Кбайт. Тогда вместо "kbytes in use" использовался текст "blocks in use". Теперь что касается остальной информации... В первой строке отображается информация о том, какому пользователю в данный момент мы изменяем установки квот. Затем для каждой файловой системы, для которой включены квоты, будет выведено по две строки. В нашем случае квотирование включено только для одной файловой системы, смонтированной как /home. Первая строка используется для установки квот по объему, вторая — для установки квот по количеству файлов (индексных дескрипторов). Каждую строку можно разделить на два поля: информационное, рассказывающее о текущем использовании файловой системы, и поле установки мягких и жестких ограничений. Установка квот заключается в изменении значений для soft и hard, для которых значение 0 означает отсутствие ограничений. Установим данному пользователю мягкое ограничение по объему в 10 Мбайт (10240 Кбайт) и жесткое в 20 Мбайт (20480 Кбайт). Ограничение на файлы установим в 1000 и 2000 соответственно. Тогда окно редактора будет содержать такой текст (полужирным шрифтом выделены внесенные изменения): Quotas for user ftpshell: /home: kbytes in use: 18, limits (soft = 10240, hard = 20480) inodes in use: 9, limits (soft = 1000, hard = 2000) При выходе из редактора с сохранением изменений ограничения сразу же будут применены для указанного пользователя. Проверить это можно с помощью утилиты quote следующим образом: # quota -v ftpshell Disk quotas for user ftpshell (uid 1002): Filesystem usage quota limit grace files quota limit grace /home 18 10240 20480 9 1000 2000 Попробуем записать несколько файлов в домашний каталог пользователя под его учетной записью так, чтобы выйти за пределы установленного мягкого лимита, и затем просмотрим результат работы утилиты quote: # quota -v ftpshell Disk quotas for user ftpshell (uid 1002): Filesystem usage quota limit grace files quota limit grace /home 15042* 10240 20480 7days 42 1000 2000 Обратите внимание на то, что данные в поле usage отмечены звездочкой *. Это и есть обозначение того, что пользователь вышел за пределы своего мягкого ограничения. Также изменились данные в первом поле grace, которые теперь показывают количество дней до установки мягкого ограничения как жесткого. ПРИМЕЧАНИЕ Ч ^-vx* тял - ^ "к* ^>"^>*'- - '• s '4^.-.^Sfc>; Утилита quota может использоваться1 тблвко для проКёрки квот для' отдельны)! пользователей, групп или файловой системы. Трлько суперпользователь системы может просмотреть квоты для все* пользователей-и групХ а простые пользователи могут просмотреть квоты только для себя или своей группы.
Квотирование файловых систем 269 Опция -v необходима для просмотра всех файловых систем с включенными квотами, даже если пользователь не использует их. Для просмотра общей статистики по всем пользователям, группам и файловым системам с включенными квотами следует использовать утилиту repquota. Пример — в листинге 8.4 (можно использовать только с правами суперпользователя). Обозначение +- используется для отображения выхода поль- мвателя за пределы мягкого ограничения. Листинг 8 А. ( repquota »•* Report User toot informex ftpshell ftpuser Пример использования -v -a for user quot i i i i i i + i used 50 20 15044 18 УТИЛИТЫ; repquota as on /home (/dev/adlsl) Block limits soft 0 0 10240 0 hard 0 0 20480 0 grace "7 days ":.- ■ '"".'":::*■*■ used 2 10 43 9 "' File soft 0 0 1000 0 limits hard 0 0 2000 0 grace В системах с большим числом пользователей, устанавливать для каждого квоту по отдельности — задача довольно затруднительная. Для таких случаев утилита edquota предоставляет возможность использовать прототипы для установки квот диапазону пользователей по их идентификаторам UID. В качестве прототипа может выступать любой пользователь с установленной квотой. Заметим, что при установке квот диапазону пользователей разрешено указывать UID несуществующих .на данный момент пользователей. Прототип указывается с помощью опции -р, где в качестве аргумента необходимо указать имя пользователя. Общий формат вызова имеет вид: edquota прототип начальныйию-последнийию К примеру, распространим настройки квот пользователя ftpshell на всех пользователей с UID от 1000 до 1100. Вызов команды будет иметь следующий вид: A edquota -p ftpshell 1000-1100 После этого результат работы утилиты repquota будет соответствовать листин- гу8.5. jhcniHr 8.5. Результат работы утилиты r^pqtfbt* послераспространения настроек квот пользователя ftpshell ~ - ' "'.ч~' ': ■ ♦ repquota -v -a •** Report for user quotas on /home (/dev/adlsl) Block limits User used soft hard grace used soft hard grace toot informex ftpshell +- 15044 10240 20480 7days ftpuser Просмотрим установки квот для нового пользователя newuser, добавленного по- ,ме распространения настроек с помощью прототипа: I pw user add newuser -u 1010 -с "new user" -d /horae/newuser -s Ъ/bin/csh -m -k /usr/share/skel # quota -v newuser Disk quotas for user newuser (uid 1010) : Filesystem usage quota limit grace files quota limit grace /home 18 10240 20480 9 1000 2000 Как видим, квоты были применены ранее для еще не существующего пользователя, по может быть использовано системным администратором для упрощения админист- used 66 20 15044 18 soft 0 10240 10240 10240 hard 0 20480 20480 20480 used 2 10 43 9 File soft 0 1000 1000 1000 limits hard 0 2000 2000 2000
270 Глава 8. Файловые системы — управление и мониторинг рирования сервера, а конкретнее — добавления новых пользователей в систему безоп ски, что новый пользователь будет использовать файловые ресурсы сверх положенного, Установка ограничений на группы фактически ничем не отличается, кроме необходимости указания в утилитах edquote и quote опции -д. Отключение квот можно выполнить несколькими способами. Во-первых, по пользователям или группам — черв снятие ограничений, а точнее — установку значений для soft и hard в нули. Второ! способ — отключение по файловым системам с помощью файла /etc/fstab (удал» ние опций userquota и groupquota). Третий способ отключения— глобальный,* рез установку опции enable_quotas="NO" в файле /etc/rc. conf. Более подробную информацию по квотам можно найти на страницах справочного руководства man edquota, man quota. Для работы с подсистемой квот операционки система FreeBSD также предоставляет такие утилиты как quotaon, quotaoff quotacheck, с которыми читателю, возможно, никогда работать не придется, ноозш- комиться с ними не помешало бы. Их подробное описание можно также найти на страницах справочного руководства. На этом рассмотрение подсистемы квот можно считать завершенным. Надееми, что наличие описанной выше возможности не раз спасет читателя от непредвиденного переполнения файловой системы ненужными пользовательскими данными и ручного ж удаления. ШИФРОВАНИЕ ФАЙЛОВОЙ СИСТЕМЫ Пользователи операционных систем Windows 2000/XP наверняка слышали и использовали возможность файловой системы NTFS5 по шифрованию данных (на уровне каталогов). Система FreeBSD имеет подобную возможность по защите данных от несанкционированного доступа, но на уровне целого диска или раздела. При этом защита реализована на уровне файловой системы и привязана ко многим параметрам компьютер! таким образом, что попытка "достучаться" к данным в зашифрованном разделе, переставив его на другой компьютер, практически невозможна. Следует также заметить, что шифрование диска не спасает от несанкционированного доступа к данным на диске га сети или при работе на "родном" для диска компьютере. Такие защиты должны был установлены с помощью других технологий, входящих в состав системы, например права на файлы по пользователям, установки ACL (Access Control List) или MAC (Mandatory Access Control). Шифрование файловой системы позволяет обезопасить данные в случае переноса диска на другой компьютер, где злоумышленник может иметь неограниченные правам ресурсы, и таким образом скопировать данные без, всяких ограничений и использовать на свое усмотрение. ПРИМЕЧАНИЕ Возможность шифрования файловой сисТе^ьтпоявКлась толь FreeBSD вере^ 5.0 и[присут^уег во всех более п^ Технология защиты данных жесткого диска через шифрование в FreeBSD называется GBDE (GEOM Based Disk Encryption — шифрование диска на уровне GEOM). Таки система шифрования отличается от аналогичной системы, присутствующей в Windows 2000/2003, в первую очередь своей "прозрачностью" и простотой, поскольк) в данном случае шифрование происходит в целом по всей файловой системе, а не по отдельным файлам или каталогам. Также система GBDE более устойчива к попыткам добраться до данных раздела за счет присутствия нескольких барьеров защиты. Но и она имеет свои недостатки. В первую очередь, система GBDE шифрует содержимое секторов диска только при помощи 128-битного алгоритма AES (каждый сектор шифруется различными ключами), а другие алгоритмы не поддерживаются. Во-
Шифрование файловой системы 271 вторых, в определенные моменты времени при записи данных в сектор в действительности происходит запись в два сектора, при этом сбой системы или потеря питания приведет к потере данных. Фактически, эта система должна использоваться в стабильной среде, где вероятность потери питания сведена к минимуму. При переходе на новую версию системы нет гарантий, что формат хранения данных в новой реализации подсистемы GEOM не изменился, а из этого следует, что придется создать резервные копии всех данных в зашифрованном разделе. Настройка системы и создание зашифрованного диска Как и при использовании подсистемы квот, для возможности использования шифрования содержимого разделов по GBDE необходимо внести изменения в ядро системы. Напоминаем, что шифрование разделов поддерживается в версиях системы старше пятой и не включено в ядро по умолчанию. Измените конфигурационный файл ядра, добавив следующую строку: options GEOM_BDE после чего пересоберите ядро и установите его в систему. Вносить какие-либо изменения в главный конфигурационный файл системы /etc/rc.conf на данном этапе нет необходимости. Перезапустите систему для загрузки нового ядра, после чего можно переходить к созданию зашифрованного диска. Предположим, раздел, который будет шифровать система, уже подключен. Предположим также, что данный раздел будет располагаться на диске adl и называться adlsl (единственный раздел, слайс FreeBSD). Монтировать данный раздел будем в каталог /crypto. Но прежде вкратце опишем пошагово процесс создания и подключения нового зашифрованного устройства. Итак, последовательность такова: 1. Выбор каталога для хранения файлов блокировки, его создание в случае необходимости. 2. Инициализация диска (создание файла блокировки) заданием его параметров и ключевой фразы. 3. Подсоединение диска специальным образом для возможности обращения к нему через подсистему шифрования GBDE. 4. Создание новой файловой системы с помощью команды newf s. 5. Монтирование новой файловой системы для ее использования через специальное устройство *. bde. Рассмотрим теперь данный процесс подробнее. Итак, прежде чем начинать инициализацию зашифрованного диска, необходимо создать каталог, в котором система будет хранить файлы блокировки GBDE. Файлы блокировки содержат информацию, которая необходима для доступа к зашифрованному разделу. Утрата файлов блокировки чревата полной потерей информации о расшифровке данных раздела. Для каждого зашифрованного раздела требуется один отдельный файл блокировки GBDE. Предположим, файлы блокировок мы будем хранить в каталоге /etc/gbde. Создаем необходимый каталог следующей командой: # mkdir /etc/gbde По-умолчанию, операционная система ищет файлы блокировки в каталоге /etc. Для изменения такого поведения системы внесем следующую строку в файл /etc/rc. conf: gbde lockdir="/etc/gbde"
272 Глава 8. Файловые системы — управление и мониторинг Следующим и обязательным шагом на пути создания зашифрованного раздела я» ляется его инициализация. Для этого используется команда gbde с аргументом init. Инициализация выполняется только один раз для раздела. Для нашего случая она будет выглядеть следующим образом: # gbde init /dev/adlsl -i -L /etc/gbde/adlsl.lock При этом будет запущен текстовый редактор, в котором вам придется, как правило, поменять значение только одного параметра: sector_size с 512 на 2048 (листинг8.6, полужирным шрифтом выделена измененная строка). Листинг 8.6. Содержимое интерактивного редаитора.параметров инициализации за- - шифрованного диска • • . ' -' ■ . # SFreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp 5 # # Sector size is the smallest unit of data which can be read or written. # Making it too small decreases performance and decreases available space. # Making it too large may prevent filesystems from working. 512 is the # minimum and always safe. For UFS, use the fragment size # sector_size = 2048 # # Start and end of the encrypted section of the partition. Specify in # sector numbers. If none specified, "all" will be assumed, to the # extent the value of this can be established. # #first_sector = 0 #last_sector = 2879 #total_sectors = 2880 # # An encrypted partition can have more than one key. It may be a good idea # to make at least two keys, and save one of them for "just in case" use. # The minimum is obviously one and the maximum is 4. # number_of_keys = 4 # # Flushing the partition with random bytes prevents a brute-force attack # from skipping sectors which obviously contains un-encrypted data. # NB: This variable is boolean, if it is present it means "yes" even if # you set it to the value "no" # #random_flush Если требуется пропустить вызов интерактивного редактора параметров инициализации, удалите опцию -i в вызове команды gbde. Этого делать не рекомендуется при работе с файловыми системами UFS и UFS2, так как в них принято использовать секторы размером 2048. По окончании редактирования параметров сохраните изменения в выйдете из редактора. Будет дважды предложено задать ключевую фразу, используемую для шифрования данных. Чем сложнее будет эта фраза, тем меньше возможности недоброжелателю получить доступ к данным. Фактически, уровень защиты данных зависит от сложности ключевой фразы. Пропустить запрос ключевой фразы можно, задав ее в строке вызова инициализации зашифрованного раздела с помощью опции -Р: # gbde init /dev/adlsl -i -L /etc/gbde/adlsl.lock -P somepassphrase
Шифрование файловой системы 273 После того как была завершена работа с утилитой gbde, в каталоге /etc/gbde будет создан файл блокировки adlsl. lock: # 11 /etc/gbde/ total 2 -rw 1 root wheel 16 Feb 20 18:18 adlsl. lock Рекомендуется создать резервную копию этого файла, так как без него пользователь не сможет получить доступ к зашифрованным данным. После создания файла блокировки и инициализации устройства можно подключить раздел к системе. Подключение зашифрованного раздела аналогично аппаратному подключению диска к системе и должно выполняться всякий раз перед монтированием данного раздела. Для подключения используется команда gbde с аргументом attach, при этом пользователю необходимо ввести ключевое слово, заданное при инициализации зашифрованного раздела: # gbde attach /dev/adlsl -1 /etc/gbde/adlsl.lock Enter passphrase: * Обратите внимание на то, что при вводе правильного ключевого слова (и только втаком случае) в каталоге устройств /dev появится новое специальное устройство, используемое для доступа к зашифрованному разделу, содержащее расширение . bde: # Is /dev/adl* /dev/adl /dev/adlsl /dev/adlsl.bde После того как новое устройство подключено к системе и видно в каталоге /dev, можно приступить к созданию зашифрованной файловой системы на нем. Данный шаг выполняется обязательно и только один раз: при первом подключении устройства до того, как начнете его использовать. Создание файловой системы на защищенном разделе ничем не отличается от создания файловой системы для простого раздела, то есть — спомощью утилиты newf s. Поскольку создание разделов с файловой системой формата UFS2 происходит значительнее быстрее, чем UFS1 рекомендуется использовать опцию -02, которая, начиная cFreeBSD 5.1, используется по умолчанию. Итак, создадим зашифрованную файловую систему формата UFS2 с поддержкой Soft Updates следующей командой: # newfs -О -02 /dev/adlsl.bde /dev/adlsl.bde: 505.8MB (1035776 sectors) block size 16384, fragment "!>size 2048 using 4 cylinder groups of 126.45MB, 8093 blks, 16192 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 259136, 518112, 777088 He забывайте, что работать необходимо только с использованием специального устройства /dev/*.bde, которое доступно после подключения раздела с помощью файла блокировки. Последним шагом на пути к зашифрованному диску будет проверка его доступности через монтирование к каталогу /crypto: # mkdir /crypto # mount -v /dev/adlsl.bde /crypto /dev/adlsl.bde on /crypto (ufs, local, soft-updates, writes: sync 2 async 0, reads: sync 1 async 0, fsid 0dl2fa43c8724c9c) Проверим доступность зашифрованной системы с помощью команды df: # df Filesystem lK-blocks Used Avail Capacity Mounted on /dev/adOsla 253678 55022 178362 24% /
100% 0% 46% 1% 0% /dev /tmp /usr /var /crypto 274 Глава 8. Файловые системы — управление и мониторинг devfs 110 /dev/adOsle 253678 12 233372 /dev/adOslf 1801214 763834 893284 /dev/adOsld 253678 1598 231786 /dev/adlsl.bde 501486 4 461364 Для проверки того, что данные будут защищены и недоступны, попробуйте запи-: сать их в этот раздел (если до этого раздел adlsl использовался, то они могут был. первое время доступны при монтировании раздела напрямую через /dev/adlsl). Затем размонтируйте его (обязательно до отключения), отключите через утилиту gbde с аргументом detach (данная операция подобна физическому отключению устррйста и удалит из каталога /dev файл устройства adlsl.bde) и попытайтесь смонтирован через /dev/adlsl: # echo "text file on crypted disk" > /crypto/somefile.txt # more /crypto/somefile.txt text file on crypted disk # umount /crypto # gbde detach /dev/adlsl # mount /dev/adlsl /crypto mount: /dev/adlsl on /crypto: incorrect super block Как видите, монтирование раздела по стандартному варианту не проходит. Не поможет в данном случае и утилита проверки и исправления ошибок fsck: # fsck -f /dev/adlsl fsck: Could not determine filesystem type Предположим также, что кто-то извлек ваше устройство и определил, что файловая система зашифрована. Что будет при попытке ее ре-инициализации. Имитируем такую ситуацию: # cd /etc/gbde/ # mv adlsl.lock adlsl.lock.backup # gbde init /dev/adlsl -i -L /etc/gbde/adlsl.lock -P passphase ( ... } # 11 /etc/gbde/ total 4 -rw 1 root wheel 16 Feb 20 22:58 adlsl. lock -rw 1 root wheel 16 Feb 20 22:53 adlsl.lock.backup # gbde attach /dev/adlsl -1 /etc/gbde/adlsl.lock -p passphase # Is /dev/adl* /dev/adl /dev/adlsl /dev/adlsl.bde # mount /dev/adlsl.bde /crypto mount: /dev/adlsl.bde on /crypto: incorrect super block # fsck -t ffs /dev/adlsl.bde ** /dev/adlsl.bde Cannot find file system superblock ioctl (GCINFO): Inappropriate ioctl for device fsck_ffs: /dev/adlsl.bde: can't read disk label # gbde detach /dev/adlsl Как видим, и в таком случае использовать зашифрованную файловую систему невозможно, более того — это невозможно даже в случае, когда ключевые слова совпадут! Для доступа к данным на диске требуется оригинальный файл блокировки: # gbde attach /dev/adlsl -1 /etc/gbde/adlsl.lock.backup -p passphase # mount /dev/adlsl.bde /crypto # Is /crypto FreeBSD_03.doc ch2.09.KernelConfig.doc ch3.DNS_IPv6_addon.doc about.DA.doc ch2.10.BuildWorld.doc ch3.E-Mail.doc
Шифрование файловой системы 275 chl.glava0-2.doc ch2.glava6.Users.doc ch3.FTP.doc chl.glava3.doc ch3.Apache.doc ch3.NFS.doc chl.glava4.doc ch3.DDNS.doc ch3.NIS.doc chl.glava5.doc ch3.DHCP.doc ch3.NetworkBase.doc ch2.08.PortsPackage.doc ch3.DNS.doc ch3.SAMBA.doc На рассмотренном примере мы увидели, как монтировать существующие зашифрованные файловые системы. Из этого следует, что защищенную файловую систему необходимо обязательно подключать и только затем разрешено ее монтировать. Не забывайте всякий раз перед монтированием файловой системы проверять ее на предмет существования ошибок с помощью утилиты fsck. Последовательность подключения зашифрованного раздела такова: 1. Подключение файловой системы через систему GBDE — требуется ввод ключевого слова (пароля). 2. Проверка на ошибки (обязательно указание типа файловой системы) с помощью утилиты fsck: # fsck -t ffs /dev/adlsl.bde * * * * * * * * ** * * ** 22 /dev/adlsl.bde Last Mounted on /crypto Phase 1 - Check Blocks and Sizes Phase 2 - Check Pathnames Phase 3 - Check Connectivity Phase 4 - Check Reference Counts Phase 5 - Check Cyl groups files, 3736 used, 247007 free (3 frags, 30872 blocks, 0.0% %> fragmentation) 3. Монтирование файловой системы командой mount через специальное устройство * .bde. Отключение зашифрованной файловой системы состоит из двух шагов: 1. Размонтирование файловой системы командой umount. 2. Отключение зашифрованного диска через систему GBDE. Как видим, специфика использования зашифрованных разделов не позволяет производить их автоматического монтирования стандартными средствами системы. Потребуется написать сценарий, причем для полной автоматизации в нем необходимо будет указать пароль, что уже является проблемой. В связи с этим, использовать данную систему для большинства разделов, наличие которых необходимо фактически постоянно (например, /home) недопустимо или теряет смысл. Кроме проблем с автоматическим монтированием, подсистема GEOM имеет проблему в совместимости с некоторыми системными утилитами или другими подсистема- пи. Сюда относится и утилита sysinstall, которая аварийно завершает работу при обнаружении подключенных устройств GBDE, и подсистема Vinum, которая не совместима с упомянутыми устройствами. Более подробную информацию по этому вопросу можно найти на страницах справочного руководства man 4 geom, man 4 gbde и man gbde. Также следует знать, что «системе FreeBSD6.0 появилась новая подсистема шифрования разделов под названием GELI. По обслуживанию она очень напоминает GBDE: фактически необходимо только заменить утилиту gbde на geli, а также использовать не * .bde a * .eli устройства из каталога /dev. Возможность ее использования включается в ядро следующими строками: options GEOM_ELI device crypto
276 Глава 8. Файловые системы — управление и мониторинг В GELI включены следующие нововведения, отсутствующие в GBDE: возможность использовать специализированного оборудования для шифрование поддержка нескольких алгоритмов шифрования (AES, Blowfish и 3DES); возможность шифрования корневого раздела файловой системы, а также испои зования для временных разделов и swap-разделов; возможность использования двух независимых ключей. Более подробно использование GELI описано на странице man geli. СОЗДАНИЕ РЕЗЕРВНЫХ КОПИЙ И ВОССТАНОВЛЕНИЕ Вопрос создания резервных копий (backup) не совсем относится к работе с файлом! системой, тем не менее, существует множество причин, по которым он рассматривает» именно в этой главе. Наверное, наиболее важный фактор сохранности данных — этою правильная работа с дисками, не постоянное обслуживание системы, а именно создание резервных копий данных. Мы уже не раз повторяли, что никто не застрахован от сбои системы, никто не застрахован от выхода из строя дисков, никто не застрахован й взлома системы и удаления всех важных данных, но можно застраховать себя от исч» новения данных в упомянутых случаях за счет постоянного создания и хранения в № дежном месте их резервных копий. Благодаря созданию резервных копий большинство системных администраторе! остаются на своей должности в компании при сбоях в питании, после поражения систен вирусами или "смерти" массива данных, ведь именно они несут на себе основную ответственность за потерю данных. Не финансовый директор, и не директор 1Т-отдещ которые не поставили задачу или не предоставили финансы и условия для создания системы резервирования данных, а системный администратор! Кстати потеря информации может произойти и в результате тривиальной ошибки пользователя или самого системного администратора, удалившего случайно файл шш каталог. Ко всему прочему, еще одна необходимая мера безопасности — создание ко пий конфигурационных файлов. Это позволит в случае неправильного изменения конфигурации быстро вернуть все на свои места, а в случае сбоя системы — быстро привести ее в работоспособное состояние. Утилиты создания резервных копий В данном разделе попытаемся разобраться с утилитами, которые предоставляя операционная система FreeBSD своим пользователям. Наиболее распространенным! являются dump/restore, tar, dd, cpio и pax. Выбор наиболее подходящей утилиты зависит от конкретного случая . Утилиты dump и restore Наиболее распространенным и надежным способом создания резервных копий является использование традиционных утилит dump/restore. Эти утилиты связаны с уровнями Dump, которые мы рассматривали при изучении файла /etc/fstab. Утилита dump используется для создания резервных копий, а утилита restore — для их восстановления. Для использования утилиты dump необходимо иметь внешнее устройство, на которое можно производить запись. Как правило, это магнитная лента (стример), внешний жесткий диск и т.п., то есть, — любое устройство, на котором может содержаться файловая система и которое поддерживается операционной системой. Но при этом помните что монтировать такое устройство перед выполнением операции создания резервно! копии не нужно.
Создание резервных копий и восстановление 277 Моп Маг 13 13:12:54 2006 the epoch Наиболее явное преимущество утилиты dump — возможность создавать резервные юпии и затем обновлять только изменившиеся файлы, что позволяет сэкономить про- иранство на ленте и время создания резервной копии. Несмотря на такое поведение, «действительности утилита работает не на уровне файлов или каталогов, а на уровне Исковых блоков. Заметим также, что утилита dump позволяет создавать копию всей ! лиловой системы, а не ее отдельной части или каталога. При этом необходимо учесть, по резервная копия для корневой файловой системы не будет содержать файлы каталогов /home, /usr и т.д., для которых используются отдельные разделы или диски. Рассмотрим пример создания резервной копии для корневой файловой системы / «устройство /dev/adl. Обратите внимание на то, что нет необходимости размечать, форматировать или выполнять какие-либо другие операции над новым устройством, ис- шмьзуемым для дампа резервной копии. Итак, команда будет выглядеть следующим (бразом: # dump -Oua -f /dev/adl / DUMP: Date of this level 0 dump DUMP: Date of last level 0 dump DUMP: Dumping /dev/adOsla (/) to /dev/adl DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 42420 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: DUMP: 42887 tape blocks on 1 volume DUMP: finished in 15 seconds, throughput 2859 KBytes/sec DUMP: level 0 dump on Mon Mar 13 13:12:54 2006 DUMP: Closing /dev/adl DUMP: DUMP IS DONE В данном случае опция -0 отвечает за копирование на первом уровне (полное кодирование всех данных), опция -и означает запись информации о файловой системе, Я»вне дампа и времени создания резервной копии в файл /etc/dumpdates, а опция -а позволяет автоматически подобрать необходимый размер томов архива азавнсимости oj устройства (для жесткого диска должен быть только один том). Файл /etc/dumpdates используется для определения того, какие файлы необходимо обно- шть при инкрементном резервном копировании. Для инкрементного резервного копирования необходимо просто изменить уровень цампа, к примеру (данный вариант использования не имеет смысла, так как будут затерты все предыдущие данные на устройстве /dev/adl в силу специфики самого устройства): # dump -lua -f /dev/adl / DUMP: Date of this level 1 dump: Mon Mar 13 13: DUMP: Date of last level 0 dump: Mon Mar 13 13: DUMP: Dumping /dev/adOsla (/) to /dev/adl DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 24 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: DUMP: 26 tape blocks on 1 volume DUMP: finished in less than a second DUMP: level 1 dump on Mon Mar 13 13:59:12 2006 DUMP: Closing /dev/adl DUMP: DUMP IS DONE 59: 12: 12 54 2006 2006 Как понимать уровни дампа? Говоря в двух словах, они управляют тем, какие фай- и необходимо обновлять при инкрементном копировании. К примеру, если произво-
278 Глава 8. Файловые системы — управление и мониторинг дится дамп на втором, а затем на третьем уровне, то будут обновляться только те ф лы, которые изменились с момента копирования на втором уровне. Если произвсс дамп на первом уровне, то будут обновлены все файлы, которые обрабатывались втором, третьем и всех уровнях выше. Нулевой уровень дампа означает полное копир вание всех файлов, независимо от всех остальных уровней. Теперь, что касается восстановления данных с помощью утилиты restore В первую очередь, эта утилита имеет два режима работы: интерактивный и неинтер! тивный. Первый режим используется для частичного восстановления (например, коп был удален файл или каталог с данными), а второй — для полного восстановления (и пример, при замене вышедшего из строя устройства хранения данных). Обратите т мание на то, что в любом случае восстановление будет выполнено в тот каталог, из и торого производится вызов утилиты: # restore -rf /dev/adl Пример интерактивного режима: # restore -if /dev/adl restore . cshrc > Is compatS .profile dev/ COPYRIGHT dist/ bin/ boot/ cdrom/ restore restore ./root: .cshrc restore restore restore restore restore restore etc/ home@ kernel > cd root > Is .history .klogin > add .cshrc > add .history > add .klogin > add .login > add .profile > extract . log kernel.GENERIC kernel.old mnt/ modules/ modules.old/ proc/ in .profile root/ sbin/ sdata/ stand/ stream/ sys@ tmp/ usr/ var/ You have not read any tapes yet. If you are extracting just a few files, start with the last volume and work towards the first; restore can quickly skip tapes that have no further files to extract. Otherwise, begin with volume 1. Specify next volume #: 1 set owner/mode for '.'? [yn] n restore > q В целом, это только минимальные знания о возможностях утилиты, более подро{ ная информация находится на страницах справочного руководства man dump man restore. Использование tar Кто не слышал о файлах *. tar и подобных ему (*. tgz, * . tar. *)? Да, большм ство исходных файлов и пакетов приложений поставляются "скрепленными" и упаи ванными утилитой tar и одной из утилит сжатия данных. Утилита tar ранее преди значалась для записи на ленту файлов и каталогов, а не файловых систем как утили dump. Кроме того, она работает на уровне файлов и каталогов. Таким образом, запись ленту корневого каталога / запишет файлы всех смонтированных в данный мома файловых систем.
Создание резервных копий и восстановление 279 На сегодняшний день утилита tar используется не только для записи на ленты, но ив файл на смонтированном устройстве. Именно таким вариантом мы и воспользуемся. Самый простой пример создания tar-файла для каталога /usr на внешнем устройстве /dev/adlsle, смонтированном в каталог /buckup, будет иметь следующий вид: # tar -c£ /backup/adO.usr.tar /usr Здесь опция -с указывает создать архив, а опцией -f задается имя файла, в который будут записаны данные. После имени файла можно перечислить файлы и каталоги, которые необходимо поместить в архивную копию. Но создавать "чистый" tar-файл сегодня не имеет смысла — он занимает практически столько же места, сколько и данные в нем: fl du -sk /usr 210420 /usr # 11 /backup/adO.usr.tar -rw-r—r— 1 root wheel 208168960 Mar 13 13:52 /backup/adO.usr.tar Для уменьшения конечного файла с резервной копией данных используется один из доступных методов сжатия, например, для compress и gzip соответственно: # tar -cZf /backup/adO.usr.compress.tar /usr # tar -czf /backup/adO.usr.tar.gzip /usr Посмотрите, какая разница между размерами файлов: # 11 -tr /backup total 366768 -rw-r—г-- 1 root wheel 208168960 Mar 13 13:52 adO.usr.tar -rw-r—r— 1 root wheel 99890857 Mar 13 14:03 adO.usr.compress.tar -rw-r—r— 1 root wheel 67313133 Mar 13 14:04 adO.usr.tar.gzip Можно применять и другие утилиты компрессии. Более подробно об этом рассказывается в справке к утилите tar. Для извлечения файлов из архива вместо опции -с необходимо применять опцию -х (extract) при этом указывается каталог для извлечения файлов (через опцию -С), иначе файлы будут извлечены относительно текущего каталога, например: # tar -xf /backup/adO.usr.tar -С /backup # Is /backup/usr bin games include libdata local sbin src compat home lib libexec obj share Если при создании архива использовался один из методов сжатия, то его необходимо указать и при извлечении файлов: # tar -xzf /backup/adO.usr.tar.gzip -C /backup Кстати, утилита tar поддерживает инкрементное копирование. Более подробную информацию можно найти на странице man tar. Другие утилиты Кроме описанных утилит иногда применяются cpio, dd (для создания полной копии раздела в файл) или pax, но доля их использования значительно меньше. Выбрать наиболее подходящую утилиту можно, ознакомившись с документацией к каждой из них. К слову, существует несколько коммерческих и бесплатных продуктов, которые обладают дополнительными возможностями (например, планированием периодичности создания резервных копий или работой на уровне "клиент/сервер"). В случае стандартных утилит, для планирования автоматического периодичного создания "бэкапа" данных необходимо воспользоваться стандартными утилитами сгоп или at.
280 Глава 8. Файловые системы — управление и мониторинг ПРОГРАММНЫЙ RAID Рассмотрим кратко программный RAID. Как правило, чаще всего для его организации используется драйвер объединенного диска CCD или подсистема Vinum. Почему же сегодня так распространены программные RAID-массивы, несмотря на широкое использование аппаратных RAID? Ответ на этот вопрос, как всегда, упирается в баланс характеристик "цена-скорость-надежность". Программный RAID— это наиболее дешевм решение по объединению дисков в один массив. При этом мы рискуем потерей надежности и скорости. Как правило, малые и средние компании не могут позволить себе купить дорогое устройство за несколько тысяч или десятков тысяч долларов. В таком случае выбор падает именно на программную реализацию. Использование технологии CCD В этом подразделе мы, в качестве примера, опишем настройку трех дисков IDE размером 40 Гбайт каждый, которые подключены к компьютеру совместно с системным диском на свободных шинах стандартных IDE-контроллеров. Это позволит еще больше минимизировать затраты, так как отпадает необходимость в покупке дополнительных IDE-контроллеров, хотя вариант "по одному диску на один IDE-контроллер", наверное, наиболее подходящий для создания программного RAID-массива с использованием технологии CCD. При этом мы рассмотрим вариант использования всех трех дисков дщ создания чередующегося RAID и двух дисков для создания "зеркального" RAID-1. Итак, после приобретения и установки дисков в систему проследите за тем, чтобы система нашла и распознала каждый из них. Если подключение прошло без проблем,! перейдем к рассмотрению драйвера CCD. Драйвер ccd позволяет объединить несколько идентичных дисков в одну файловую систему (программный RAID). Для того чтобы можно было воспользоваться этой технологией, требуется включить ее поддержку в ядре системы (по умолчанию отсутствует). В системе FreeBSD 4.x для этого следует добавить следующую строку в конфигурационный файл ядра: pseudo-device ccd 4 Для FreeBSD 5.x и старше необходимо просто добавить строку: device ccd Соберите и установите новое ядро как описано в главе 10, "Настройка ядра системы", после чего перезапустите систему. Кроме сборки ядра, можно воспользоваться модулем geom_ccd, установив его автоматическую загрузку совместно с файлом ядра, добавив в /boot/loader. conf следующую строку: geom_ccd_load="YES" Так как программный RAID будет создаваться средствами FreeBSD, нет необходимости видеть разметку дисков другими операционными системами, поэтому мы будет использовать диски для RAID в эксклюзивном режиме доступа. Перед тем как инициализировать устройство ccd, необходимо в отдельности инициализировать (разметить) каждый установленный жесткий диск, как и в любом другом случае. Для этого воспользуемся утилитой disklabel или bsdlabel (для последних версий системы) в автоматическом режиме: # bsdlabel -w /dev/adl auto # bsdlabel -w /dev/ad2 auto # bsdlabel -w /dev/ad3 auto В результате мы получим по две новые метки в каталоге /dev для каждого диска, к примеру — /dev/adla, /dev/adlc и т.д. для системы FreeBSD 5.x и старше.
Программный RAID 281 В случае использования системы FreeBSD 4.x и утилиты disklabel потребуется ще один (промежуточный) этап по разметке дисков вручную, а фактически — по доведению одного раздела на каждом диске, так как в данной версии системы утилита jisklabel не создает в автоматическом режиме метку других разделов, кроме метки с: (весь диск): # disklabel -e adl # disklabel -e ad2 # disklabel -e ad3 Немодифицированная разметка для каждого из дисков в данном случае будет иметь приблизительно следующий вид: # /dev/adx: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 83886080 0 unused 0 0 # "raw" part От нас требуется добавить одну метку (для раздела), например, а: для дальнейшего использования драйвером ccd. Можно полностью скопировать разметку с: для исполь- ювания в метке а:, если предполагается использовать весь раздел под RAID, при этом следует заменить тип unused на 4 . 2BSD. Почему мы в данном случае используем сло- ю"если"? Это обусловлено тем, что мы можем использовать под RAID все доступное пространство на дисках, а можем и оставить на каждом из дисков пространство для использования в других целях (например, под swap или /tmp). Далее предполагается, что иы используем под RAID все доступное пространство. Итак, изменим разметку для каждого диска, приведя ее к следующему виду: ft /dev/adx: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 83886080 0 4.2BSD 0 0 c: 83886080 0 unused 0 0 # "raw" part В системе FreeBSD 4.x не забудьте также создать файл устройства ccdO с исполь- мванием сценария MAKEDEV: # cd /dev # sh MAKEDEV ccdO Как только все предварительные операции по подготовке дисков выполнены, можно переходить к следующему этапу — инициализации RAID через устройство ccdO. Ранее мы предполагали рассмотреть процесс создания двух разных массивов RAID: зер- «ального и чередующегося. Рассмотрим каждый вариант в отдельности, начиная с "зеркального" массива RAID-1. "Зеркало" или RAID-1 Создание зеркального RAID — традиционный способ повышения надежности диенового массива. В самом простом варианте для этого требуются только два диска, на которые параллельно записываются одинаковые данные. В случае отказа одного из дисков данные остаются на другом, который продолжает работать в нормальном режиме (при Епользовании технологии CCD ситуация выглядит несколько иначе). Таким образом, за счет 100%-й избьггочности, мы получаем простоту в реализации и восстановлении данных после выхода из строя одного из дисков. Создание "зеркала" выполним в разделах adla и ad2a с помощью утилиты cedconf ig. Эта утилита принимает несколько опций, первая из которых — имя конфискуемого ccd-устройства, вторая — размер единицы блока данных в количестве доковых блоков (при размере дисковых блоков в 512 байт получаем, что размер еди- щцы в 128 займет 65536 байт), третья — тип RAID-массива. За ними следует список
282 Глава 8, Файловые системы — управление и мониторинг устройств, объединяемых в массив. Итак, команда создания "зеркала" в нашем слу для системы FreeBSD 5.x и старше примет следующий вид: # ccdconfig ccdO 128 CCDF_MIRROR /dev/adla /dev/ad2a ПРИМЕЧАНИЕ В случае использования т&ёш Ft&e&U 4.X епШУ&? жьпёнтутля устройеИ ccdO на ccdOc. . 1 Обратите внимание на тип RAID-массива (в нашем случае это будет CCDFMIRR011 можно также использовать число 6). После того как устройство ccdO сконфигурируй но, можно отформатировать файловую систему командой newf s (результат — в лин тинге 8.7). I Листинг 8.7. Форматирование "зеркального" codO, каждый диск которого в отдельное! имеет размер 40 Гбайт ; | # newfs ccdO /dev/ccdO: 40959.9MB (83885952 sectors) block size 16384, fragment size 20« using 223 cylinder groups of 183.77MB, 11761 blks, 23552 inodes, super-block backups (for fsck -b #) at: 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, { ... ) 83173952, 83550304 Обратите внимание на то, что, несмотря на сообщение о форматировании устройп ва ccdO с размером одного дискового устройства из массива, будет параллельно отфор матировано два зеркальных устройства с идентичным расположением суперблоков одинаковым типом файловой системы. Теперь можно смонтировать созданную файловую систему в необходимую tomij монтирования и использовать зеркало для своих нужд: # mount /dev/ccdO /mnt/mirror # Is /mnt/mirror . snap Обращаем внимание на то, что массив ccdO необходимо инициализировать кажды) раз при загрузке системы. Более того, данную операцию необходимо автоматизирован для возможности автоматического монтирования раздела с помощью файл /etc/fstab (этот вопрос вынесен в отдельный подраздел, так как его решение аналогично и для случая создания чередующегося массива). Восстановление данных в случа сбоя одного из дисков "зеркала" рассматривается ниже, в подразделе "Восстановлена массива". Чередующийся массив (RAID-0) Кроме "зеркала", драйвер CCD позволяет создавать чередующийся массив без контроля четности. В этом случае все данные разбиваются на блоки, которые записывания на отдельные диски. За счет возможности параллельного доступа к дискам, такой массив данных позволяет в несколько раз увеличить скорость работы с данными. Несмотр! на свою простоту и преимущества в скорости доступа, RAID-0 не является отказоустойчивой технологией. Для создания такого массива в вызове утилиты eddconf ig вместо CCDF_MIRR08 необходимо указать попе или 0: # ccdconfig ccdO 64 none /dev/adla /dev/ad2a /dev/ad3a Как и в случае с "зеркалом", для чередующегося массива также необходимо указан список устройств для объединения. При этом устройств может быть от двух и более (в
Программный RAID 283 нашем примере мы использовали три раздела). После того как было сконфигурировано ccdO-устройство, можно произвести форматирование файловой системы с помощью утилиты newf s и смонтировать в необходимый каталог (пример —в листинге 8.8). ]1цстанг8.8. Пример форматирования и монтирования чередующегося массива RA1D-0 У newfs /dev/ccdO /dev/ccdO: 122879.9MB (251658048 sectors) block size 16384, fragment size 2048 using 669 cylinder groups of 183.77MB, 11761 blks, 23552 inodes. super-block backups (for fsck -b #) at: 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, ( ... \ 250274240, 250650592, 251026944, 251403296 II mkdir /mnt/stripe it mount /dev/ccdO /mnt/stripe 1 Is /mnt/stripe/ .snap Как и для зеркального массива, при загрузке системы необходима процедура инициализации чередующегося массива, о чем сказано ниже. Обращаем внимание на то, что чередующийся массив без контроля четности не предусматривает возможности доступа к данным в случае выхода из строя одного из дисков. Возможно объединить две описанные выше технологии за счет создания "зеркала" для чередующихся массивов — для этого необходимо выполнить операции из подраздела о создании "зеркала", но использовать 4, 6, 8 и т.д. разделов в составе массива. Так, например, для 6-ти разделов получим два зеркальных "страйпа" по три диска в каждом. Более подробную информацию по этому вопросу можно найти на страницах системной справки man ccdHman ccdconfig. Автоматическая конфигурация и монтирование разделов CCD Как и в случае с любым другим устройством с данными, необходимо иметь возможность автоматического монтирования файловой системы устройства ccd. Но при этом следует учесть, что всякий раз при запуске системы придется заново выполнять конфигурирование устройства ccd. Для автоматизации этого процесса необходимо создать файл /etc/ccd. conf, в котором в каждой строке описывается конфигурация устройств драйвера ccd. Естественно, написать данный файл не составит труда и вручную, но для упрощения этой операции можно воспользоваться специальной опцией утилиты ccdconfig, например: # ccdconfig -g > /etc/ccd.conf Что же теперь будет происходить при старте системы? Если в системе присутствует файл /etc/ccd.conf, то стартовый сценарий /etc/rcd/ccd выполнит команду ccdconfig -с, которая автоматически сконфигурирует все устройства, описанные в вышеупомянутом файле. После этого можно внести изменения в файл /etc/fstab для автоматического монтирования файловой системы на этапе загрузки системы. К примеру, для ccdO запись может выглядеть следующим образом: /dev/ccdO /mnt/mirror ufs rw 2 2 He забывайте, что при загрузке системы в однопользовательский режим, сценарии нз /etc/red не выполняются и для монтирования ccd-разделов придется вручную выполнить команду: # ccdconfig -С Кроме автоматического конфигурирования и монтирования ccd-устройств, рассмотрим также вопрос восстановления данных для зеркальных массивов (чередующий-
284 Глава 8. Файловые системы — управление и мониторинг ся массив RAID-0 не предусматривает возможности восстановления и доступности ш сива после сбоя или сгорания одного из дисков массива). Восстановление массива Затронем некоторые вопросы относительно восстановления данных при сбое ода го из дисков массива. В целом, технология CCD не предусматривает восстановлен!» однако имеет смысл упомянуть о некоторых важных аспектах, связанных именно с к пользованием зеркального массива. В первую очередь, в данном случае нет потери данные. При первых ошибках ил в случае выхода из строя диска не стоит впадать в панику. "Зеркало" предусматривн параллельную запись идентичных данных на два диска и это означает, что на одно диске будут находиться ваши данные. В данном случае все заключается только в св<к временной операции резервного копирования. Что делать, если проблема была обнару жена при перезагрузке системы и устройство ccd при этом не создано? При ошибка или отсутствии одного из дисков массива нельзя инициализировать устройство со) В данной ситуации необходимо внести изменения в файл инициализации /etc/ ccd. conf, а точнее — раздел работающего дискового устройства установить первым! списке, а затем установить новый жесткий диск вместо старого неработающего. Напри мер, если ранее файл /etc/ccd. conf был таким: ccdO 128 6 /dev/adla /dev/ad2a то при выходе из строя и замене диска для устройства adl его содержимое потребуете привести к следующему виду: ccdO 128 6 /dev/ad2a /dev/adla Данная операция не предусматривает синхронизации данных на дисках (с перш из списка на второй), но позволяет сконфигурировать устройство ccdO и выполнить ре зервное копирование, после чего необходимо будет полностью пройти операцию ин» циализации и форматирования зеркального массива. Что касается использования чередующегося массива: просили скорость — получил полное отсутствие отказоустойчивости. Тому же, кто интересуется вопросом автоматического восстановления данных ш зеркальных массивах или чередованием с контролем четности и надежной отказоусто& чивостью, следует разобраться в подсистеме Vinum. Эта подсистема позволяет воздо вать виртуальные диски, при этом достигается гибкость, производительность и надежность. Система Vinum, как и CCD, позволяет создавать не только массивы RAID-0 к RAID-1, но также RAID-5 и комбинации всех перечисленных типов дисковых массивов. Подсистема Vinum Как можно было заметить из описания драйвера CCD, созданием массива диски (виртуальный диск) можно решить несколько проблем, с которыми сталкиваются многие пользователи более-менее больших систем. Это и проблема недостаточно большого объема дискового пространства, и скорости доступа/записи данных на диск. При этом, не смотря на факт постоянного увеличения размеров дисков, пропорционально повышаются и требования к дисковому пространству и к скорости обработки данных. Относительно скорости обработки данных следует напомнить, что скорость передачи информации по сети на порядок обогнала скорость самых быстрых дисков. Конечно, не следует забывать, что система FreeBSD имеет более-менее дружественный под ход для наращивания дискового пространства за счет возможности монтирования новык дисков на любом уровне иерархии, где в идеальном случае каждому каталогу можно сопоставить отдельный раздел. Но такой подход будет несколько неудобен, так как заранее неизвестно, сколько необходимо выделить пространства тому или иному каталогу.
Программный RAID 285 Относительно пропускной способности стоит напомнить, что даже довольно быстрые диски при больших нагрузках и большом количестве одновременных запросов не иогут обеспечить необходимую скорость обработки, что вытекает из физических свойств и ограничений дисковых устройств (вращающиеся пластины и подвижная головка для считывания данных). Но речь пойдет не о физических характеристиках. Мы уже увидели один простой способ решения подобных проблем. Но как же быть с надежностью хранимых данных? Как повысить отказоустойчивость? Ведь скорость доступа и размер массива для многих адач не являются самыми важными характеристиками. Сегодня все больше и больше поднимается вопрос целостности данных, возможности автоматического восстановления данных массива при потере одного из дисков или возможности продолжения работы с данными во время замены вышедшего из строя диска. При использовании CCD для построения "зеркала" существует возможность досту- оа к данным при выходе из строя одного из дисков, но установка нового диска требует полного пересоздания массива, что, в свою очередь, требует еще одного промежуточного дискового массива для хранения резервной копии перед тем как пересоздать "зерка- ю". К тому же, зеркальный массив довольно накладен с точки зрения финансов, поскольку требует вдвое больше дисков из-за 100%-й избыточности. Вторым камнем преткновения является пропускная способность и скорость обработки данных — не будем ибывать, что запись полностью идентичных данных производится одновременно на несколько дисков. Для решения всех поставленных задач на программном уровне в системе FreeBSD применяется менеджер дисковых томов Vinum, который представляет собой виртуальный дисковый драйвер. Наиболее интересный вариант его использования — технология RAID 5-го уровня, в которой предусмотрена избыточность за счет потери в объеме, равном одному поддиску набора. При этом на каждом диске последовательно сохраняется контрольная сумма (четность) по блокам данных на других дисках. Поясним это на простом примере. Предположим, у нас есть три диска, объединенных в RAID-5. Первый блок данных будет записан на первый диск, второй — на второй диск, а на третьем диске будет записан блок с информацией о четности. Затем блоки данных будут записаны на первый и третий диски, а блок с информацией о четности — на второй. Преимущества данной технологии налицо: возможность автоматически восстановить данные на замененном диске по данным на других дисках, возможность продолжать полноценную работу смассивом при отсутствии одного из дисков, прекрасная скорость чтения данных, не- шьшая избыточность (всего один диск). Минусом является небольшая скорость записи данных и потеря информации при выходе из строя одновременно двух дисков. Иерархия объектов Vinum Тому, кто раньше работал с аппаратными реализациями технологии RAID, большинство понятий должно быть уже известно. Если же нет, рассмотрим вкратце все уровни иерархии объектов рассматриваемой системы. Но прежде хотим довести до све- хния читателя, что подходить к данному вопросу следует несколько абстрагировано: попытайтесь отойти от стандартных понятий, принятых при работе с дисками в системе FreeBSD. Итак: Основополагающим объектом подсистемы Vinum является том (volume). Именно том представляет собой целостный виртуальный диск, который сопоставим с физическими дисками в системе FreeBSD или же устройством ccdX если попытаться провести аналогию с драйвером CCD. Том не имеет ограничений по размеру- • В свою очередь, тома образуются из наборов (plex), каждый из которых представляет полное адресное пространство тома, к которому принадлежит. Если проводить аналогию с драйвером CCD, то набором можно считать один из разделов
286 Глава В. Файловые системы — управление и мониторинг диска (но в Vinum нет понятия разделов) при использовании "зеркала". Как мода догадаться, именно на уровне наборов реализуется избыточность томов (как правило, используется один или два набора). Относительно отсутствия понятия разделов в Vinum стоит отметить, что построе- ние наборов на основе стандартных разделов FreeBSD накладывало бы множество проблем и ограничений. В связи с этим в Vinum введено абстрактное понятие поддисков (subdisk), которые выступают строительным инструментом для наборов и представляют собой некую непрерывную область раздела (который в понятиях Vinum именуется приводом). Поддисков может быть неограниченное количество, то есть раздел FreeBSD можно разделить на множество абстрактных поддисков Vinum. Понятие приводов (drive) вынесем также отдельным пунктом. Привод в Vinum- это ни что иное, как простой раздел FreeBSD. Как уже отмечалось выше, привод может содержать неограниченное количество поддисков и имеет в начале зарезервированную область для хранения информации о конфигурации Vinum. Благодаря такому подходу к разделению объектов, Vinum обладает следующей функциональностью: размеры жестких дисков не влияют на размер наборов (набор может состоять га множества поддисков Vinum) и, следовательно, на размер томов; избыточность, которая основана на связывании нескольких наборов в томе, каждый из которых является полной копией тома; при этом количество наборм в томе ограничено восемью; производительность для разных случаев достигается за счет установки различных1 подходов к организации наборов: конкатенацией (сцеплением), когда пространство поддисков используется последовательно, или чередованием, когда данные разбиваются по поддискам блоками по размеру страйпов. Последний вариант накладывает некоторые ограничения на поддиски: одинаковый размер и минимальное количество равно двум поддискам. Выбор организации набора Как определить необходимый подход к организации набора — сцепление или чере*| дование? Рассмотрим более подробно некоторые "за" и "против" использования обой вариантов. Сцепленные наборы Сцепленные наборы обладают достаточной гибкостью при использовании, так как] они могут содержать любое количество поддисков, и что немаловажно — различного] размера. Большим преимуществом является возможность расширения тома "налету"»] счет добавления дополнительных поддисков. К тому же, сцепленные наборы требует] меньших затрат по процессорному времени. В то же время, они довольно чувствители ны к нагрузке в одной области тома, при которой только один из дисков (или несколько1 первых, на которых присутствуют данные) принимает на себя всю нагрузку, а остальные в это время бездействуют из-за отсутствия данных на них. Наборы с чередованием Основным преимуществом наборов с чередованием (ранее рассматривали как RAID-0) является равномерное распределение нагрузки по дискам; более того — при правильно подобранном размере блока данных (страйпа) нафузку можно практически! идеально уравнять. Но как мы помним еще с рассмотрения CCD, RAID-0 обладает of ромным количеством недостатков. В первую очередь — все поддиски должны имеп] одинаковый размер. Добавление поддиска "на лету" невозможно.
Программный RAID 287 Начальная настройка на использование Vinum По умолчанию, поддержка Vinum не включена в стандартное ядро GENERIC. Но »не означает, что необходимо такую поддержку включать редактированием конфигу- ционного файла ядра и установкой новой версии ядра. Если же кому-то необходим кой вариант, добавьте следующую строку в конфигурационный файл: device vinum Наиболее простой, надежный и рекомендуемый вариант активации подсистемы inum — загрузка модуля ядра. При этом нет необходимости также и явно использовать манду kldload (будет рассмотрена в главе 10), так как утилита работы шртуальным диском vinum делает это сама автоматически при запуске, если не обнашивает поддержки подсистемы Vinum в ядре. Для автоматического запуска подсис- мы Vimun еще на этапе загрузки системы, до того как будут монтироваться файловые гстемы, необходимо добавить следующую строку в конфигурационный файл itc/rc. conf: start_vinum="YES" Эта строка позволит подгружать модуль Vinum и конфигурацию всех объектов «фигурации, что позволит автоматически на этапе загрузки системы проверять тома I ошибки и автоматически монтировать их для использования. Во время загрузки inum происходит считывание конфигурации томов с одного из приводов. Поскольку «приводы в нормальной ситуации содержат одинаковые данные о конфигурации, то ктически не имеет значения, с какого именно привода она будет загружена. Если жвод недоступен или содержит ошибки, система автоматически выберет привод подходящей конфигурацией и использует его. Подготовка дисков и создание конфигурации Следующий шаг — выбор дисков, которые будут использоваться системой Vinum. нашем случае мы будем снова использовать те же диски, что и при рассмотрении яйвера CCD, то есть, три диска: adl, ad2 и ad3 no 40 Гбайт каждый, с размерами вделов, равными всему объему слайсов. операции с дисками и подсистемой Vinum, рассмотренные в этом подразделе, вводились в среде операционной системы FreeBSD 4.11. Это было вызвано поенным "падением" операционной системы FreeBSD версии 5.4 при попытке соз- 1гмассив или при включенной опции автозагрузки модуля vinum. ко в конфигу- цюнном файле /etc/rcconf, не говоря уже о невозможности сохранить или осить информацию о конфигурации массивов на дисках., Автор книги не облада- йнформацией о причинах такого поведения FreeBSD 5.4 и не может гарантиро- Ь^0.в„в£Р?ия.х. системы 5х и старше /читателя не возникнет таких же проблем. Первым делом, необходимо инициализировать диски (создать слайсы) с помощью Илиты fdisk. Для этого выполним следующие команды для каждого из дисков (при- крдля конкретного случая): /dev/adl ******* /dev/ad2 ******* /dev/ad3 ******* S fdisk * * # * * * * 1! fdisk ## * * * * * i fdisk ******* -BI /dev/adl Working on device -BI /dev/ad2 Working on device -BI /dev/ad3 Working on device
288 Глава 8. Файловые системы — управление и мониторинг ■ Затем разметим их с помощью утилиты disklabel (bsdlabel), к прими в автоматическом режиме: # disklabel -В -w /dev/adlsl auto # disklabel -B -w /dev/ad2sl auto tt disklabel -B -w /dev/ad3sl auto I Затем в обязательном порядке необходимо вручную изменить разметку каждо ' слайса для всех дисков, отредактировав тип файловой системы для раздела е: (или и ' метки, которую определил читатель) с unused на vinum, приведя разметку, наприт > к следующему виду: ( ... ) 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 83875302 0 unused 0 0 # (Cyl. 0 - 5220*! e: 83875302 0 vinum # (Cyl. 0 - 5220*! Изменение типа файловой системы необходимо для того, чтобы утилиты рабт с дисками и разделами правильно воспринимали их или игнорировали, в зависимости! реализации самой утилиты. После того как были определены разделы, которые факт чески выступают в качестве приводов Vinum, можно переходить непосредствен к описанию конфигурации дисковых массивов. Такая конфигурация, как правило, со дается заранее в текстовом файле, который затем передается на вход утилите vinumч рез команду create и содержит описание всех объектов Vinum. Начальная конфигур ция может также создаваться интерактивно с помощью утилиты vinum и ее кома concat, mirror и stripe, но используется довольно редко по причине малой гиб» сти. Обращаем внимание на то, что копия конфигурации после передачи утилите virv. сохраняется в начале каждого раздела (привода Vinum), которые обновляются кавд раз при изменении состояния томов, а после перезапуска системы или подсисты Vinum восстанавливаются из этой области. Кстати, данная область занимает 265 сей ров в начале каждого раздела, который используется в Vinum как привод, что означа необходимость учитывать данный факт при указании размеров поддисков. Фактичш имея диск на 40 Гбайт, вы не сможете разбить его на два поддиска размером 10 30 Гбайт. Рассмотрим подробно формат файла конфигурации, и процесс конфигурирован! массивов. Итак, конфигурационный файл для Vinum — это простой текстовый фай описывающий объекты Vinum, такие как привод, том, набор и поддиск. Запись каждо объекта дана в отдельной строке в произвольном порядке, но для большей читабелыи сти все записи форматируются в соответствии с конфигурацией, что будет показа! позже. В некоторых случаях при записи объектов требуется указывать размеры. Размер з дается в различных единицах измерения, на выбор пользователя. Для обозначения ел ниц измерения используются следующие символьные обозначения: s — указывает, что значение задано в секторах по 512 байт; к — указывает, что значение задано в килобайтах (Ik = 1024 байта); m — указывает, что значение задано в мегабайтах (1 m = 1048576 байт). g — указывает, что значение задано в гигабайтах (lg= 1073741824 байта). Так, к примеру, 9 Гбайт можно записать как 9д, 9216m, 9437184 k ш 18874368s. Конфигурационный файл может содержать только четыре типа записей — по о ному типу на объект. Рассмотрим эти типы.
Программный RAID 289 Типы записей Запись типа drive Как понятно из названия, запись типа drive описывает привод Vinum и соответст- те его разделу диска. Каждый привод должен быть именован для использования данного имени в конфигурации, к примеру, drivel или virtdisk4. Имя привода указы- юется непосредственно после слова drive. Также обязательно должен быть задан раздал диска с типом файловой системы vinum после слова device, например, device /dev/ad2sle, в соответствие которому и ставится описываемый привод. Пример описания трех приводов для нашего случая с тремя дисками может иметь следующий вид: drive sdiskl device /dev/adlsle drive sdisk2 device /dev/ad2sle drive sdisk3 device /dev/ad3sle Запись типа volume Запись volume используется для определения тома. Единственным требуемым параметром является имя, которое следует непосредственно после слова volume. Кроме имени, могут использоваться также другие опции, такие как plex (добавляет набор пому), readpol (задает правило чтения для тома) и setupstate (позволяет проигнорировать состояние несогласованности наборов в томе после создания тома). Пример определения тома может быть следующим: volume myvolume Запись типа plex Запись plex позволяет определять наборы. Единственным обязательным параметром такого типа записи является метод организации набора, который указывается после шючевого слова org. Методов существует только три: concat, striped и raid5. При тгом, в зависимости от выбранного метода организации набора, меняется условие необ- мдимости указания параметра "размер блока". В случае использования метода concat (называть размер блока (полосы) запрещено, в остальных случаях указывать размер ш обязательно. Задавать набору имя в явном виде не обязательно, так как система Vinum автомати- «ски сгенерирует имя набора из имени тома и суффикса . рХ, где X — номер набора игоме, начиная с нуля. Для задания имени необходимо использовать ключевое слово name, например, name myvolume. pO. Кроме этого, запись plex позволяет указать том, к которому будет добавлен набор. [Дня этого используется ключевое слово volume. Обратите внимание на то, что в случае «указания данного параметра, текущий набор будет отнесен к последнему объявлен- »му в конфигурации тому. Также к набору можно добавить поддиск с указанного смешения с помощью ключевого слова sd, но такая возможность практически не использу- стся. Пример описания набора: plex name myvolume.pO org striped 27 9k Запись типа sd (subdisk) Последний тип записи sd (subdisk) позволяет определять поддиски. Минимальны- ш требованиями при его описании являются имя привода, на котором он будет распо- агаться, и его размер. Имя привода задается с помощью ключевого слова drive, раз- кр— ключевым словом length. Указание размера, равного 0, означает использование иго доступного (не занятого под другие поддиски) пространства привода.
290 Глава 8. Файловые системы — управление и мониторинг Как и для набора, имя подписка указывать не обязательно — оно будет автом; ски создано добавлением суффикса . sX к имени набора, где X — номер подписка боре, начиная с нуля. Если имя задается вручную, то необходимо использовать км вое слово name. Для указания набора, к которому будет принадлежать данный подциск, использ; ся ключевое слово plex (следует заметить, что по умолчанию подциск принадла последнему определенному набору). Кроме указанных опций, можно использовать же ключевое слово plexof f set для указания начального смещения подписка в набо| если смещение не указано, Vinum выделяет место после предыдущего диска, еслт был определен, или с начала сплетения в противном случае. Ключевое ело driveoffset используется для задания смещения подписка на приводе, а они retryerrors указывает, что подциск не должен отключаться в случае возникновеи невосстановимых ошибок (по умолчанию, при их возникновении система Vinum деле весь подциск недоступным). Пример определения поддиска может иметь следующий вид: sd name myvolume.p0.s0 length lOg drive sdiskl Пример конфигурационного файла Разобравшись в записях, которые используются в конфигурации, создадим тексп вый файл /etc/vinum.conf", который будем использовать для создания RAI массивов (листинг 8.9). к ПРИМЕЧАНИЕ Имя этогб фййпё не обяаатеШйадоШнЬ б]ыггь^&цк. conf и располагаться в i ЛОКГ./etc. Листинге.». Пример конфигурационного файла для системы Vinum drive sdiskl device /dev/adlsle drive sdisk2 device /dev/ad2sle drive sdisk3 device /dev/ad3sle volume stripe plex name stripe.pO org striped 270k sd name stripe.pO.sO length lOg drive sdiskl sd name stripe.pO.si length lOg drive sdisk2 sd name stripe.p0.s2 length lOg drive sdisk3 volume raid plex name raid.pO org raid5 128k sd name raid.pO.si length 29g drive sdiskl sd name raid.p0.s2 length 29g drive sdis-k2 sd name raid.p0.s3 length 29g drive sdisk3 Разберемся в этой конфигурации более подробно. Мы используем три физически диска по 40 Гбайт каждый, на которых ранее определили по одному разделу. Первьк три строки файла позволяют определить три привода по 40 Гбайт, которые связага с разделами дисков. Имена приводов: sdiskl, sdisk2 и sdisk3. Именно на них буду| определены поддиски, из которых собраны наборы. Но об этом чуть позже. После определения приводов мы задали создание тома с именем stripe. Сразу Ж1 после определения тома задано создание набора с именем stripe.р0, метод организм ции набора — striped. Данный набор мы определили без указания тома, к которому он принадлежит, и по описанным ранее правилам он автоматически будет применев к тому stripe. Заметим, что блок данных в нашем случае задан размером в 270 Кбайт (указание размера для striped обязательно).
Программный RAID 291 После строки создания набора stripe следует определение трех поддисков, кото- епринадлежат данному набору: поддиски с именами stripe.pO. sO, stripe.pO. 1и stripe. pO. s2. Размер всех поддисков равен 10 Гбайт. Каждый поддиск опреде- № на отдельном приводе (напоминаем, что вычислять остаток свободного пространства приводах по правилу "общий объем привода минус сумма объема всех подписи—неверно). Итак, в результате у нас есть один набор с именем stripe.pO, который является Йдом 0-го уровня с чередованием; метод организации данного набора предполагает, во данные записываются на него равномерными блоками на каждый диск. Размер на- lopa равен 30 Гбайт (три подписка по 10 Гбайт). Данный набор является единственным томе stripe. При выходе из строя любого из поддисков мы потеряем все данные набора и тома, (ля решения этой проблемы рекомендуется использовать RAID-10 ("зеркало" поверх IAID-0). Данная технология предусматривает создание нескольких (как правило, двух) гркальных наборов в томе. Тогда при выходе из строя одного из наборов все данные ианутся на втором наборе тома. Пример конфигурации, реализующий такой подход, кисет иметь следующий вид: drive sdiskl device /dev/daOsle drive sdisk2 device /dev/dalsle drive sdisk3 device /dev/da2sle drive sdisk4 device /dev/da3sle volume mstripe plex name mstripe.pO org striped 270k sd name mstripe,p0.sO length 20g drive sdiskl sd name mstripe.pO.si length 20g drive sdisk2 plex name mstripe.pl org striped 270k sd name mstripe.pl.sO length 20g drive sdisk3 sd name mstripe.pl.si length 20g drive sdisk4 При создании "зеркал" учитывайте необходимость размещения наборов на различие приводах (физических дисках), чтобы при отказе одного из приводов не были поте- шы оба набора одновременно. Размер тома mstripe будет равен 40 Гбайт (хотя сум- 1 размеров всех поддисков или наборов будет равна 80 Гбайт), так как зеркалирование [ебует 100%-й избыточности. Теперь, что касается остальной части конфигурационного файла из листинга 8.9. tyoKa: volume raid ивволяет определить еще один том с названием raid. В этом томе определен также пин набор raid.pO с методом организации данных raid5. О технологии RA1D-5 бы- в сказано выше, поэтому останавливаться на данном вопросе не будем — напомним шько, что минимальное количество поддисков для такого набора равно трем, и все они доены иметь одинаковый размер. Что касается размера поддисков в наборе, то также доено быть понятно, почему он составляет не 30, а 29 Гбайт (можно было указать и шегабайтах, выделив, таким образом, больше места под поддиски или указав значение, рное нулю, для использования всего доступного объема). Обратите внимание на то, что размер набора raid. pO будет не 87 Гбайт, а только в, что вытекает из теории по технологии RAID-5. Как и для "зеркала" следует обратить имание на расположение поддисков в наборе: все они должны располагаться на раз- иных физических носителях, что отвечает условию надежности и отказоустойчиво- % Создание объектов После того как конфигурация была создана и сохранена в файле, ее необходимо пе- яать на вход утилите vinum. Утилита vinum используется для многих задач по
292 Глава 8. Файловые системы — управление и мониторинг управлению системой Vinum и поддерживает довольно много команд. В данном случ нас интересует команда create. Эта команда позволяет полностью применить конф j гурацию, описанную во внешнем файле, и вывести результат на экран. Пример того,1 вызывается утилита vinum с командой create, представлен в листинге 8.10. . ^ _ Листинг 8.10. Пример создания объектов Vinum с использованием конфигурации из внешнего файла /еtc/vinum.conf )t vinum vinum -> 3 drives: D sdiskl D sdisk2 D sdisk3 create /etc/vinum.conf State: up Device /dev/adlsle State: up Device /dev/ad2sle State: up Device /dev/ad3sle Avail: 1018/40954 MB (2il Avail: 1018/40954 MB (2» Avail: 1018/40954 MB [2% 2 volumes: V stripe V raid 2 plexes: P stripe.pO P raid.pO S RS State: State: State: State: up down up init Plexes: Plexes: Subdisks: Subdisks: 1 1 3 3 Size: Size: Size: Size: 29 58 29 58 GB GB GB GB 6 subdisks: S stripe.pO.sO S stripe.pO.si S stripe.p0.s2 S raid.pO.si S raid.p0.s2 S raid.p0.s3 vinum -> quit State: State: State: State: State: State: up up up empty empty empty PO: PO: PO: PO: PO: PO: 0 270 540 0 128 256 В kB kB В kB kB Size: Size: Size: Size: Size: Size: 9 9 9 29 29 29 GB GB GB GB GB GB Содержимое этого листинга вполне очевидно. Вначале выводится список диска (D), затем — список томов (V), после — список наборов (Р), и в самом конце — спим поддисков (S). В результате выполнения команды vinum было создано три привоз: в состоянии up размером в 40954 Мбайт каждый; 2 тома, один из которых (stripel сразу же находится в состоянии up и доступен для использования, его размер 29 Гбайт и содержит один набор. Второй том (raid) находится в состоянии down, чтс вызвано необходимостью провести инициализацию Наборов прежде его использованш и состоит из одного набора. Размер тома raid составляет 58 Гбайт. Количество набо ров — только два, и их размеры совпадают с размерами томов, к которым они принад лежат. При этом набор stripe .pO находится в состоянии up, а набор raid.pO ожид* ет инициализации. О дисках рассказывать не будем — все и так понятно. Хотелось бы отметить, что команда create из утилиты vinum позволяет получил более подробную информацию обо всех созданных объектах. Для этого необходимо использовать флаг -v: # vinum create { ... } -v /etc/vinum.conf Обратите внимание на то, что созданные объекты сохраняются на дисках и позж их не нужно определять заново. К слову, создание другого конфигурационного файлан создание новых объектов на его основании приведет к их дополнению к уже сущест вующим объектам. При этом следует учесть много факторов, которые могут нарушип нормальную конфигурацию. Так как команда create из vinum аддитивна, ее можно выполнить несколько раз для одной конфигурации, что приведет к созданию множеста одинаковых экземпляров объектов. В подобной ситуации можно сбросить общую ко» фигурацию командой resetconfig. Для восстановления уже существовавших и п|»
Программный RAID 293 ■льно созданных объектов необходимо воспользоваться дампом конфигурации, о создании которого будет рассказано позже. 1 Альтернативными для к create являются команды concat, stripe и mirror. 'Эти команды позволяют в интерактивном режиме создавать различные типы томов. Команда concat позволяет создать сцепленный том, команда stripe позволяет создать винтерактивном режиме чередующийся том, а команда mirror — зеркальный том ти- mRAID-I. Обратите внимание на то, что утилита vinum сама определяет имя тома, ес- ш оно не задано в строке вызова. Более подробная информация находится в справочном руководстве к утилите vinum. Инициализация наборов После создания объектов, некоторые из них требуют инициализации, которая выполняется путем записи на поддиски нулей. Команда vinum init позволяет инициализировать все диски в наборе одновременно путем указания имени набора. Инициализация позволяет гарантировать согласованность данных в наборе. Такую инициализацию i обязательном порядке необходимо выполнять до использования наборов с типом RAID-5, иначе при сбое одного из подлисков может произойти повреждение данных. Для других типов наборов проводить инициализацию не обязательно, но рекомендуется выполнять ее в любом случае. Обращаем внимание на то, что инициализация набора занимает довольно много времени вплоть до часа, в зависимости от размера и скорости дисков, поэтому, по умолчанию, данная операция выполняется в фоновом режиме. Для того чтобы было невоз- иожно выполнить другие команды, при вызове команды инициализации используйте опцию -w (wait). Во время инициализации утилита выводит информационные сообщения о процессе инициализации, а точнее — о начале и окончании инициализации. Процесс инициали- иции для обоих наборов в нашем случае будет выглядеть следующим образом: # vinum vinum -> init stripe.pO vinum -> vinum[258]: initializing subdisk /dev/vinum/sd/stripe.pO.sO vinum[259]: initializing subdisk /dev/vinum/sd/stripe.pO.si vinum[260]: initializing subdisk /dev/vinum/sd/stripe.pO.s2 subdisk /dev/vinum/sd/stripe.pO.si initialized subdisk /dev/vinum/sd/stripe.p0.s2 initialized subdisk /dev/vinum/sd/stripe.pO.sO initialized vinum -> init raid.pO vinum -> vinum[265]: initializing subdisk /dev/vinum/sd/raid.pO.si vinum[266]: initializing subdisk /dev/vinum/sd/raid.pO.s2 vinum[267]: initializing subdisk /dev/vinum/sd/raid.pO.s3 subdisk /dev/vinum/sd/raid.p0.s2 initialized subdisk /dev/vinum/sd/raid.p0.s3 initialized subdisk /dev/vinum/sd/raid.pO.si initialized vinum -> quit It Просмотр списка объектов После инициализации (и в любой другой момент) можно просмотреть список объедав и их состояние с помощью команды list утилиты vinum. Эта команда позволяет указать конкретный объект для получения информации только о нем. Если же аргумент не указать, то будет выведена информация обо всех объектах Vinum. При вызове команды list для тома или сплетения можно использовать также опцию -г для рекур-
294 Глава 8. Файловые системы — управление и мониторинг сивного вывода информации также и обо всех объектах, которые включены в его < Для получения расширенной информации об объектах используйте опцию -v. Для нашего примера конфигурации после операции инициализации наборов i на состояния всех объектов будет такой как показано в листинге 8.11. В данном лис ге мы используем команду list без других опций и аргументов. Листинг 8.11 ■ Пример получения списка всех объектов Vinum и их состояния # vinum list 3 drives: D sdiskl State: up D sdisk2 State: up D sdisk3 State: up Device /dev/adlsle Device /dev/ad2sle Device /dev/ad3sle Avail: 1018/40954 MB № Avail: 1018/40954 MB (2«) Avail: 1018/40954 MB (2«) 2 volumes: V stripe V raid 2 plexes: P stripe.pO P raid.pO State: up State: up S State: up R5 State: up subdisks: stripe.pO.sO stripe.pO.si stripe.p0.s2 raid.pO.si raid.p0.s2 raid.pO.s3 State: State: State: State: State: State: up up up up up up Plexes: Plexes: Subdisks Subdisks PO: PO: PO: PO: PO: PO: 0 270 540 0 128 256 1 1 3 3 в kB kB В kB kB Size Size Size Size Size Size Size Size Size Size 29 GB 58 GB 29 GB 58 GB 9 9 9 29 GB GB GB GB 29 GB 29 GB Сохранение конфигурации, расширенная конфигурация Утилита vinum автоматически сохраняет любые изменения в конфигурации на все дисках-участниках. Помимо этого, она имеет команду saveconf ig, которая использу ется как ручная альтернатива автоматическому сохранению. Как правило, данная ко манда используется в случае возникновения ошибки на этапе запуска, что приводи к отключению любых обновлений конфигурации. В таких случаях необходимо польз» ваться именно данной командой: # vinum saveconfig Обращаем внимание на то, что никто не застрахован от сбоев, тем более — при w пользовании программной реализации технологии объединения дисков RAID. Следуя обезопасить себя от потери конфигурации. Для этого наиболее подходящим варианта будет сохранение полной конфигурации во внешнем файле. Для этого используется команда printconfig утилиты vinum. Ей в качестве аргумента необходимо передан путь к файлу, в котором будет записана полная конфигурация Vinum. К слову, описай» объектов в данном файле несколько отличается от той конфигурации, которая хранита на дисках. Пример: # vinum printconfig /etc/vinum.dump # more /etc/vinum.dump # Vinum configuration of freebsd.altersys-ua.com, 20:26:59 2006 drive sdiskl device /dev/adlsle drive sdisk2 device /dev/ad2sle drive sdisk3 device /dev/ad3sle volume stripe volume raid saved at Fri Mar 10
Программный RAID 295 plex name stripe.pO org striped 540s vol stripe plex name raid.pO org raid5 256s vol raid sd name stripe.pO.sO drive sdiskl plex stripe.pO len 20971440s 'bdriveoffset 265s plexoffset 0s sd name stripe.pO.si drive sdisk2 plex stripe.pO len 20971440s . 'bdriveoffset 265s plexoffset 540s [ sd name stripe.p0.s2 drive sdisk3 plex stripe.pO len 20971440s ^driveoffset 265s plexoffset 1080s sd name raid.pO.si drive sdiskl plex raid.pO len 60617408s driveoffset 4>20971785s plexoffset 0s sd name raid.pO.s2 drive sdisk2 plex raid.pO len 60817408s driveoffset 4>20971785s plexoffset 256s sd name raid.pO.s3 drive sdisk3 plex raid.pO len 60817408s driveoffset ^209717853 plexoffset 512s Как видно из примера, каждый объект такой конфигурации имеет явно описанные иена, все поддиски указываются с полным расположением на приводах и смещением Кгносительно набора. Обратите внимание на то, что в данном файле не указывается состояние объектов, что обосновано невозможностью для пользователя явно указывать юстояние. Создание файловой системы, использование массивов Итак, массивы подготовлены к использованию. На данном этапе, фактически, рабо- В с утилитой vinum завершена. Следующим шагом является создание файловой систе- ны на томе. Однако прежде необходимо рассмотреть вопрос размещения файлов уст- ронств для системы Vinum. Итак, все файлы устройств Vinum располагаются в каталоге /dev/vinum, при jtom, когда Vinum запущен, но не сконфигурирован, в данном каталоге будут только 1ри файла: controld, Control и control. Как только будет создана и применена юифигурация, в упомянутом каталоге появится несколько подкаталогов, названия ко- юрых говорят сами за себя: ■ drive — для хранения файлов приводов; файлы приводов являются ни чем иным как простыми символическими ссылками на устройства разделов дисков (например, sdiskl -> /dev/adlsle); • plex — предназначен для хранения файлов наборов; при этом имена файлов этих псевдоустройств совпадают с именами объектов; sd — для хранения файлов подлисков; vol — для хранения файлов-устройств для томов; здесь присутствует также несколько подкаталогов, назначение которых рассматривать не будем. Кроме подкаталогов появится один или несколько файлов, имена которых совпадают с именами томов, созданных в конфигурации (в нашем случае это raid и stripe). Именно эти файлы и будут использоваться системными утилитами для работы ргомами, и с их помощью будут монтироваться массивы дисков. i Несмотря на то, что работа с томами Vinum похожа на работу с другими дисками, Кнстеме имеется ряд ограничений и замечаний по их использованию. В первую очередь, необходимо помнить, что тома Vinum не содержат таблицу разделов, и, исходя из лого, были изменены некоторые утилиты: к примеру, утилита newf s, которая ранее не югла бы работать с названиями устройств, наподобие /dev/vinum/raid. В системе FreeBSD 4.x для правильной работы этой утилиты необходимо передать ей опцию -v, Вторая указывает, что файл устройства является томом Vinum. Утилита newf s в системе FreeBSD 5.x и старше сама определяет тома Vinum. i Создание файловой системы на томах Vinum визуально практически ничем не отымается от той же операции для стандартных разделов FreeBSD (пример — в листин- Ш2).
296 Глава 8. Файловые системы — управление и мониторинг ■ Листинг 8.12. Пример создания файловой системы на томах Vfnum в системе ■ щ FreeBSD4x % ' ; . ' Щ # newfs -v /dev/vinum/raid■ Warning: Block size and bytes per inode restrict cylinders per group to 89 /dev/vinum/raid: 121634816 sectors in 29696 cylinders of 1 tracks, 4>4096 sectors 59392.0MB in 334 cyl groups (89 c/g, 178.00MB/g, 22528 i/g) super-block backups (for fsck -b #) at: 32, 364576, 729120, 1093664, 1458208, 1822752, 2187296, 2551840, 291638 < - } # newfs -v /dev/vinum/stripe Warning: Block size and bytes per inode restrict cylinders per group to 89 Warning: 240 sector(s) in last cylinder unallocated /dev/vinum/stripe: 62914320 sectors in 15360 cylinders of 1 tracks, 4>4096 sectors 30719.9MB in 173 cyl groups (89 c/g, 178.00MB/g, 22400 i/g) super-block backups (for fsck -b #) at: 32, 364576, 729120, 1093664, 1458208, 1822752, 2187296, 2551840, 2916381, ( - } После этого можно спокойно монтировать данные тома и использовать для свои целей. Обратите внимание на то, что тома Vinum можно монтировать в автоматическо) режиме с использованием файла /etc/f stab (при условии, что запуск системы Vinin настроен в файле конфигурации /etc/rc.conf как было описано ранее). Примерз» писей в файле /etc/f stab для томов raid и stripe: /dev/vinum/raid /sdata ufs rw 2 2 /dev/vinum/stripe /stream ufs rw 2 2 Утилита vinum содержит еще множество команд, рассмотрение которых выходи за рамки этой книги. Обо всех их можно узнать на странице справочного руководств man vinum. Этим вопросом мы завершаем главу, посвященную файловым система», эффективному управлению ими и мониторингу их использования.
Обзор способов установки приложений 297 ГЛАВА 9. УСТАНОВКА И ОБНОВЛЕНИЕ СТОРОННИХ ПРИЛОЖЕНИЙ Несмотря на довольно объемный багаж мощных приложений, с которыми устанавливается система FreeBSD, зачастую без установки дополнительных пакетов программ не обойтись. Это касается как настройки настольных систем для каждодневного использования дома или на работе, так и построения мощного сервера компании. Для того, кто сталкивался с другими операционными системами (исключая системы, подобные DOS или Windows), а также знает и умеет расширять их функциональность за счет установки дополнительного программного обеспечения, данная глава будет "как семечки". Действительно, разработчики FreeBSD, где позаимствовали, а где и создали новые технологии простой и прозрачной установки приложений. Зачастую упоминаются две технологии: набор бинарных пакетов и коллекция портов. Обе тесно связаны между собой и во многом пересекаются, взаимно дополняя или, наоборот, — исключая друг друга. Обе технологии при правильном подходе позволяют всегда иметь достоверную информацию о новых версиях программного обеспечения и обновлять установленные, но устаревшие пакеты. В контексте этой и всех последующих глав, уже установленное в систему приложение может быть названо пакетом вне зависимости от способа установки приложения. 5го связано с ведением единой базы данных установленных приложений при использовании обоих способов установки. В контексте же способа установки приложения понятия пакета и порта будут использоваться отдельно. ОБЗОР СПОСОБОВ УСТАНОВКИ ПРИЛОЖЕНИЙ После всего, что было сказано выше, возникает несколько вопросов. Зачем использовать столько способов установки? В чем преимущества и недостатки каждого? И зачем такие сложности? Рассмотрим особенности каждого из упомянутых способов установки, и попытаемся разобраться, в каких случаях лучше использовать тот или иной способ. И еще... Будет неправильно, если мы не упомянем о возможности использования накетов RPM из Linux, хотя концепция RPM довольно запутанная — в особенности спривязкой этих пакетов к некоторой аппаратной платформе (зачастую— к какой-то версии Linux). К тому же, набор пакетов FreeBSD предоставляет те же возможности, что н система RPM. Рассмотрим классический способ установки приложений из исходных кодов (это стандартный способ установки в других операционных системах семейства UNIX). В несколько "грубом" виде это будет иметь следующую форму. Поиск необходимого приложения и загрузка дистрибутивного файла, содержащего исходные коды. Г
298 Глава 9. Установка и обновление сторонних приложений Распаковка дистрибутивного файла во временную директорию. Формат файла, к» правило, — упакованный tar-файл с использованием gzip, zip или bzipi (*.tar.gz, *.tgz, *tar.bz2, * . zip и т.д.). Поиск описания процесса установки и особенностей установки приложения до используемой операционной системы. Чтение файлов INSTALL, README, FAQ, возможно изучение документации из поддиректории doc/. Подгонка файла Makefile (возможно), запуск сценария . /configure с указанием желаемых параметров установки и последующая компиляция командой make. Установка скомпилированного приложения в систему командой make install. Ну, как вам такой процесс? А ведь иногда его просто не избежать, поскольку некоторые необходимые пакеты отсутствуют в наборе пакетов или дереве портов. Впрочем, на самом деле, не такое уж это и трудное испытание — установка приложения из исходных текстов. Более того, автор "сего произведения" в свое время не пользовался ни пакетами, ни портами, а получал удовольствие от полностью "ручной" установки. Читателю также никто не запрещает пользоваться классическим способом установки (особенно, если некуда девать время), но все же рекомендуется использовать дерево портов для установки из исходных кодов с рекомендуемыми параметрами или же применять пакеты, пропуская тем самым самую продолжительную часть: компиляцию (при этом, однако, теряется возможность задать специфические особенности приложения во время компиляции). Все еще не поняли разницу? Объясним... Итак, пакет— это упакованный файл, содержащий уже откомпилированные копии всех (лучше сказать— основных) команд приложения, конфигурационные файлы, документацию, указания менеджеру установки пакетов целевых каталогов установки, а также изменения, которые требуется внести в систему для правильной работы приложения. Для работы с пакетами в FreeBSD имеется ряд приложений, имена которых начинаются на pkg_ (например, pkgadd или pkg_delete). Их совокупность в целом называется менеджером или диспетчером пакетов. Установка приложения происходит за один шаг: с использованием команды pkg_add. В то же время, порт в системе FreeBSD — это набор файлов, предназначенных для автоматизации процесса загрузки файла с исходными текстами, их распаковки и настройки перед компиляцией, применения последних "патчей" (если такие есть), проведения компиляции и установки приложения из исходных текстов в систему. Порт также поддерживает процесс удаления установленного с его помощью приложения. Фактически, порт позволяет ускорить и автоматизировать классический способ установки приложений. При этом описанные ранее операции будут выполнены с минимальными усилиями. Пользователю также не нужно заботиться о том, где взять файл с исходными текстами приложения. После установки приложения с использованием порта можно создать свой "особенный" пакет и распространять его или использовать для себя, например, на случай переустановки системы для быстрого восстановления всех ранее установленных приложений. Но есть несколько "но", и было бы неправильно о них не упомянуть. Как и RPM из систем Linux, пакеты и порты зависят от библиотек, а библиотеки, как правило, устанавливаются вместе с другими пакетами или портами. Если программа установки обнаруживает зависимость от библиотеки, а библиотека не найдена в системе, то она автоматически пытается прежде всего установить то приложение, в котором содержится требуемая библиотека. При этом иногда происходят казусы, когда установленное приложение уже устарело и не содержит библиотеки, требуемой для установки другого нового приложения. В то же время, новое устанавливаемое приложение содержит запись о том, что требуемая библиотека доступна в другом приложении, и менеджер установки безуспешно пытается его установить (безуспешно, так как требуемое приложение уже установлено, хотя и более старой версии). В таких случаях менеджер установки, как правило, преры-
Обзор способов установки приложений 299 вает процесс установки с сообщением об ошибке. О том, как обойти подобные ситуации будет рассказано позже в соответствующих подразделах главы. Надеемся, что читатель сам сможет сделать вьшод о том, когда и какой способ установки лучше использовать. Для того чтобы ускорить процесс понимания, перечислим преимущества каждого из способов установки. Для пакетов это: Отсутствие процесса настройки и компиляции, что позволяет существенно ускорить интеграцию приложения в систему. Особенно важно учитывать это при установке таких больших приложений как эмулятор Wine, браузер Firefox, графические среды KDE и GNOME, офисный пакет OpenOfTice и др. В маломощных системах компиляция данных пакетов может занять от нескольких часов до нескольких суток. Более того, важно учитывать количество свободного дискового пространства. К примеру, при установке GNOME может потребоваться до 10 Гбайт свободного дискового пространства! Незначительный размер архива с дистрибутивом пакета по сравнению с архивом с исходными текстами того же приложения. К примеру, если пакет для браузера Firefox занимает приблизительно 15 Мбайт, то файл с исходными текстами — более 30 Мбайт. Исходные тексты для приложения OpenOfTice достигают 300 Мбайт, хотя пакет— всего около 100 Мбайт. Как видим, разница существенная. Работа с пакетами проще и не требует знания процесса компиляции, а без знания процесса компиляции и понимания файла Makefile можно запросто "убить" систему. При использовании портов вы получаете следующие преимущества: Доступность исходных текстов приложения, что позволяет: просматривать его, изменять на свое усмотрение, использовать части программного кода в других приложениях (если это позволяет лицензия), применять всевозможные патчи к приложению (доступны только для исходных текстов). Некоторые приложения запрещено распространять в двоичном виде (в виде пакетов), и разрешено — только в виде исходных текстов. В таких случаях приложение невозможно будет найти в списке доступных пакетов. Если есть сомнения насчет безопасности приложения, то можно самому проконтролировать исходные тексты на предмет возможных уязвимостей. Естественно, при этом необходимо быть программистом, и знать язык программирования, на котором написано приложение. Можно по своему вкусу (и на свой страх и риск) изменять параметры компиляции, оптимизировать программы под свой тип процессора, если есть такая возможность. Пакеты же создаются, как правило, с учетом того, что они будут устанавливаться и использоваться на любых типах систем. По этой причине они не оптимизированы и могут даже на мощном компьютере работать "не в полную силу". Пакеты устанавливаются с "вшитым" набором возможностей. Многие приложения (в особенности, служебные, предназначенные для работы на серверах) должны быть установлены с учетом предпочтений пользователя, а такую возможность можно реализовать только на этапе компиляции. К примеру, необходимо включить возможность авторизации в Sendmail no TLS/SSL, или установить Apache с поддержкой HTTPS-протокола, включить использование delay-pools (ограничение скорости загрузки) в прокси-сервере SQUID. В таких случаях полностью оптимизировать приложение "под себя" можно только с помощью портов (исходных текстов). Действительно, существует ряд приложений, для которых есть несколько пакетов, учитывающих тот или иной включенный параметр, но их использование теряет смысл, если присутствует более двух параметров, которые можно определить на этапе компиляции приложения.
300 Глава 9. Установка и обновление сторонних приложений Для каждой версии операционной системы FreeBSD, как правило, приходится! гружать свой особый пакет приложения, система портов же позволяет исполы вать один и тот же файл с исходными текстами как на FreeBSD 4.11 или FreeBS 5.4, так и на FreeBSD 6.0 Как видно из сказанного выше, не следует "зацикливаться" на использовании тол» ко одного способа установки. В каждом конкретном случае необходимо взвесить к "за" и "против" и выбрать наиболее оптимальный вариант. Далее в главе будут подроЗ но рассмотрено использование пакетов и портов. ИСПОЛЬЗОВАНИЕ ПАКЕТОВ В FREEBSD О том, что такое пакеты, мы уже упомянули в предыдущем разделе. Рассмотрим неко торые вопросы, связанные с использованием пакетов (и в некоторой мере — портов) Начнем с размещения устанавливаемых файлов. Ранее вкратце упоминалось, что ва сторонние приложения, которые устанавливаются в систему, должны быть размещен! в иерархии /usr/local. И, действительно, по большому счету так и происходит, хот и не всегда (но об этом — позже). Рассмотрим структуру каталогов в /usr/local, ко торая, скорее всего, будет во многом совпадать со структурой каталога /usr. В подкаталогах sbin/ и bin/ располагаются исполняемые файлы приложений, При этом, в первом из них чаще всего находятся системные файлы (например, даемоны приложений), а во втором — вспомогательные утилиты. В подкаталоге etc/ размещены конфигурационные файлы приложений, подобно системным конфигурационным файлам в каталоге /etc. Здесь есть также важный подкаталог red/, в котором хранятся сценарии управления работой приложений (запуск, перезапуск, останов, тестирование и т.п.). В каталоге include/ хранятся заголовочные включаемые файлы * .h, которые используются при компиляции нового программного обеспечения. В каталоге info/ хранятся информационные файлы, описывающие использование установленных приложений (наподобие системы man). В каталоге lib/ размещены упомянутые ранее разделяемые библиотеки, которые устанавливаются вместе с приложениями. В libdata/ находятся дополнительные файлы различного формата, которые могут использоваться некоторыми приложениями дли своих целей. В libexec/, как правило, располагаются так называемые программы helpers, которые могут использоваться другими приложениями в качестве вспомогательных (например, Web-сервер Apache хранит здесь файлы модулей). Файлы системной справки man находятся в каталоге man/, а не в share/man (как следовало бы из структуры каталога /usr). В директории же share/ расположены общедоступные дополнительные файлы различного формата, применяемые для различных целей приложениями. Здесь же находятся различные примеры конфигурационных файлов и файлы расширенной документации, не вошедшие в системную справку. Некоторые приложения требуют также наличия каталога var/ для хранения временных и журнальных файлов. В принципе, в системе могут находиться и другие каталоги в корне директории /usr/local, но, в общем случае, структура каталогов должна быть подобной описанной выше. Теперь, что касается библиотек в каталоге /usr/local/lib и их применения... Их использование позволяет уменьшить размер исполняемого файла за счет вызова функции из библиотеки вместо включения данной функции непосредственно в исполняемый файл. Такая технология используется практически во всех операционных системах, хотя и отличается реализацией. Для пользователей операционной системы Windows понятной аналогией будут библиотеки DLL, выполняющие ту же функцию.
Использование пакетов в FreeBSD 301 Поиск библиотек осуществляется в каталоге /usr/lib, а затем— в директориях, заданных параметром ldconf ig_paths в файле /etc/rc. conf. Значение по умолчанию^ файле /etc/defaults/rc. conf) имеет вид: ldconfig_paths="/usr/lib/compat /usr/XHR6/lib /usr/local/lib" Другие пути к библиотекам указывайте с осторожностью, и желательно — после указания списка директорий, используемых по умолчанию. Для работы с пакетами в стандартной поставке системы FreeBSD имеются следующие утилиты: pkg_add, pkg_create, pkg_delete, pkg_info, pkg_version и pkgupdate (последняя утилита отсутствует в FreeBSD версии 5.x и старше). Мы рассмотрим каждую из них по мере исследования вопросов управления набором пакетов. Получение списка установленных приложений Как уже упоминалось ранее, пакеты и порты ведут единую базу установленных приложений. Эта база находится в каталоге /var/db/pkg, и содержимое данного каталога можно легко просмотреть простыми системными утилитами, наподобие Is. Для каждого установленного в систему дополнительного приложения имеется свой подкаталог, в котором размещена различная информация о пакете: краткое и полное описание, список файлов, зависимости и т.п. Однако пользоваться стандартными системными командами не удобно, да и нет смысла. Операционная система FreeBSD содержит в своем наборе стандартных программ утилиту pkg_info, позволяющую в удобном виде просмотреть информацию об установленных пакетах. Для просмотра списка всех пакетов, установленных в систему, с кратким описанием каждого из них используется команда pkg_inf о без указания параметров: # pkg_info ORBit2-2.12.4_l High-performance CORBA ORB with support for the С Slanguage aalib-1.4.r5_l An ascii art library apache+mod_ssl-1.3.34+2.8.25 The Apache 1.3 webserver with SSL/TLS Afunctionality aspell-0.60.4_l Spelling checker with better suggestion logic than dispell at-spi-1.6.4 An Assistive Technology Service Provider Interface atk-1.10.3 A GNOME accessibility toolkit (ATK) autoconf-2.59_2 Automatically configure source code on many Un*x ^platforms bash-3,0.16_l The GNU Project's Bourne Again Shell { ... } Для просмотра информации о конкретном пакете необходимо передать его имя в качестве входного параметра утилиты. При этом не забывайте, что имя пакета должно включать в себя и номер версии: # pkg_info bash-3.0.1б_1 Information for bash-3.0.16 1: Comment: The GNU Project's Bourne Again SHell Description: This is GNU Bash, version 3.0. Bash is the GNU Project's Bourne Again SHell, a complete implementation of the POSIX.2 shell spec, but also with interactive command line editing, job control on
302 Глава 9. Установка и обновление сторонних приложений architectures that support it, csh-like features such as history substitution and brace expansion, and a slew of other features. WWW: http://cnswww.ens.cwru.edu/-chet/bash/bashtop.html Полная информация о пакете может быть получена с помощью ключа -v и моли включать в себя описание пакета, список зависимостей и возможных конфликтов, сп* сок всех файлов с контрольной суммой по MD5, сценарий установки и удаления пакт. При использовании ключа -а будет выведена информация обо всех установлен™ в системе пакетах. Впрочем, просмотреть ее вы все равно не успеете ©, так как списм получится весьма длинным даже при малом количестве установленных пакетов и "промчится" на экране за доли секунды. Естественно, в этом случае необходимо использовать конвейер с командой more (less): # pkg_info -a I more Итак, утилита pkg_inf о удобна и полезна тем, что позволяет заранее определить. не установлен ли уже необходимый пакет в системе, и если да, то какой он версии. Определившись с этим вопросом, можно переходить к установке пакета, не опасаясь столкнуться с конфликтом версий. Установка пакетов Если было принято решение об установке нового пакета, то необходимо воспользо ваться утилитой pkg_add. Эта утилита позволяет установить как загруженный пакет, хранящийся на локальном источнике, так и непосредственно из сети Internet. Напомним, что пакеты зависимы от версии системы, поэтому при установке пакета из Internet не рекомендуется указывать полный URL к его файлу. Но об этом — немного позже... Наиболее простой способ установки пакетов— с помощью утилиты sysinstal':, использующей вызов утилиты pkg_add, но данный вариант из-за своих ограниченных возможностей, вероятно, не подойдет для многих пользователей. Но, как бы там ни было, все равно его опишем. Запустите sysinstall, выберите пункт меню Configure ► Packages, и выберите желаемый источник установки. Как правило, это CD/DVD илн FTP. При использовании FTP потребуется выбрать сервер, на котором утилита выполнит поиск доступных пакетов для текущей версии системы. При выборе CD/DVD будет предоставлен список пакетов, присутствующих на CD, по категориям. К СВЕДЕНИЮ. Как правило, после установки системы имя -eft, релиза изменяется по отношению к имени релиза на CD. В данном случае, утилита sysinstall выведет предупреждающее сообщение об отличии версий. Если вы уверенны, что устанавливали систему именно с этого компакт-диска и не обновляли ее.до новой версии, то мржете спокойно проигнорировать предупреждение о несоответствии версий. Обратите внимание на категории приложений. Точно такой же список будет использоваться и в случае работы с деревом портов. Если нет необходимости искать пакет в каждой категории, и точно известно его имя, то выберите категорию АН, в которой перечислен список всех присутствующих пакетов. При выборе пакета (установка [х]) утилита проверит все зависимости и, если таковые присутствуют, выделит для установки также и их (зависимые пакеты помечаются как |D]). После того как выбор устанавливаемых пакетов завершен, можно нажать кнопку Install, после чего при отсутствии конфликтов все пакеты будут установлены.
Использование пакетов в FreeBSD 303 Несмотря на то, что использовать утилиту sysinstall для установки пакетов очень просто и удобно, этот вариант зачастую не приемлем. В этом случае приходится использовать утилиту pkg_add напрямую. Такой вариант подходит, когда точно из- иестно название требуемого пакета, или же пакет уже был загружен с сервера. Также ушитой pkg_add можно воспользоваться, если пакет перед установкой требует ввода дополнительной информации. Для автоматической загрузки с сервера необходимого пакета с известным именем, его распаковки во временный каталог, а также установки и последующего удаления всех промежуточных файлов используется опция -г: # pkg_add -r Зргоху Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6- 4>stable/Latest/3proxy.tbz... Done. # pkg_info I grep Зргоху 3proxy-0.5.lb Proxy servers set (support HTTP(S), FTP, SOCKS, 4>P0P3, TCP & Если данный пакет зависим от других, то они будут также предварительно загружены и установлены. Обратите внимание на то, что утилита pkg_add определила версию операционной системы и загрузила последнюю доступную версию пакета (указывать версию не нужно). Последняя доступная версия пакета не обязательно является последней версией программы, существующей на момент установки пакета. Это связано стем, что до создания пакетов для всех релизов системы проходит некоторое время. Кроме имени пакета, можно указать полный URL к его файлу (например, в случае пакетов приложений, недоступных на официальных источниках), однако делать это не рекомендуется, поскольку загружаемый файл может не соответствовать текущей версии системы, да и гарантировать правильность работы такого приложения никто не сможет. Более подробную информацию о работе с утилитой pkgadd можно получить на страницах справочного руководства man pkg_add. Удаление пакетов Удаление пакетов, наверное, — наиболее простая операция, и о ней, пожалуй, можно сделать только одно замечание: следует помнить, что пакет удаляется по точному имени с указанием версии. Фактически, необходимо указать имя пакета в точности в гам виде, который выдает утилита pkg_info. Команда для удаления пакетов называет- CHpkg_delete. Для примера покажем, как удалить пакет Зргоху, установленный в примере из предыдущего подраздела: # pkg_info I grep Зргоху 3proxy-0.5.1b Proxy servers set (support HTTP(S), FTP, SOCKS, ЪРОРЗ, TCP S # pkg_delete 3proxy-0.5.lb # Как видим, при успешном удалении пакета никакой информации на экран не выводится. Но это — частный случай. Для полного вывода информации о том, что делает утилита pkg_delete, необходимо указать опцию -v. При этом утилита сначала попытается удалить все зависимости удаляемого пакета и проверить, нет ли других зависящих от него приложений. Если были найдены зависимые пакеты, то программа удаления прекратит свою работу. Для форсирования удаления пакета, несмотря на зависимости, используется опция -f.
304 Глава 9. Установка и обновление сторонних приложений Обновление пакетов Самым непредсказуемым и проблематичным вопросом, имеющим отношение к кетам, остается вопрос обновления. Ранее для обновления пакетов использовалась у лита pkgupdate, которая в 5-й версии FreeBSD то появлялась, то исче: в стандартном наборе. В FreeBSD 5.4 и более старших версиях утилита pkg_updai отсутствует. Вместо этого рекомендуется использовать утилиту portupgrade с чом -Р. Эта утилита должна быть установлена отдельно (отсутствует в стандартно ■ системном наборе утилит) и будет рассмотрена в разделе, посвященном дереву портов. , В текущем же разделе мы рассмотрим утилиту сравнения версий pkgversioi E Эта утилита, опять-таки, привязана к дереву портов и позволяет сравнить текущую ji [ тановленную версию приложения с версией в дереве портов. Фактически, для наблюд ? ния за приложениями, требующими обновления, необходимо иметь установленную к< t пию дерева портов, и следить за его постоянным обновлением. Результат, выдаваемы ■, утилитой pkg_version, довольно прост. По умолчанию, он содержит имя установла j ного приложения и его состояние в сравнении с записями в портах: , # pkg_version ' ORBit2 aalib = apache+mod_ss1 aspell at-spi < atk autoconf bash = { ... } Состояние пакета может принимать 6 различных значений: = — версия установленного пакета в данный момент соответствует последне версии приложения в наборе портов; < — установленная версия приложения устарела и может быть обновлена; > — установленная версия пакета более новая, чем та, которая находится в набор портов (такая ситуация возникает, когда дерево портов не обновлялось или вереи установленного приложения появилась и установлена после последней операцн обновления дерева портов); ? — установленный пакет не может быть найден в коллекции портов (скорее все го, порт был переименован или удален из коллекции портов); * — имеется несколько различных версий пакета; ! — установленный пакет был найден в дереве портов, но по необусловленны) причинам утилита pkg_version не может сравнить версии установленного паке та и версии в дереве портов. Для получения более информативного вывода используйте опцию -v. Это позволи увидеть не только текущее состояние пакета и его краткое описание, но и номер hoboI доступной версии приложения: # pkg_version -v ORBit2-2.12.4_l = up-to-date with port aalib-1.4.r5_l = up-to-date with port apache+mod_ssl-l.3.34+2.8.25 = up-to-date with port aspell-0.60.4_l = up-to-date with port at-spi-1.6.4 < needs updating (port has <Ь1.6.6_1) atk-1.10.3 = up-to-date with port autoconf-2.59_2 = up-to-date with port
Дерево портов 305 bash-3.0.16_l = up-to-date with port t ... I Более гибкую систему управления приложениями предоставляет коллекция портов. ДЕРЕВО ПОРТОВ Пакеты — это быстро, удобно, просто, но только на первый взгляд. Во многих случаях использование пакетов — не самый подходящий вариант, особенно если вы — системный администратор. Безусловно, устанавливать такие приложения как OpenOffice, ONOME, KDE, Xmms, Firefox и т.п. лучше с помощью пакетов, поскольку это позволит сократить время и меньше израсходовать дисковое пространство. Однако при установке специализированных приложений, требующих "тонкой" настройки, тщательного плакирования и контроля безопасности, наподобие Sendmail, Apache, MySQL, Samba, Squid «др., лучше воспользоваться набором портов, а фактически— исходными текстами приложений. К всеобщей радости, большинство таких приложений, как правило, не тень громоздкие. О портах и их "плюсах" было уже много сказано выше. Главным их преимущест- юм было и остается упрощение процесса установки приложения из исходных текстов jo такой степени, что иногда кажется, что использовать пакеты намного сложнее. Эта иетодика установки стала настолько популярной, что была перенесена и на другие lBSD-системы. Но не будем утруждать читателя лишними эпитетами и похвалами в ад- рес дерева портов, а перейдем непосредственно к его рассмотрению. Установка и обновление дерева портов Перед использованием коллекции портов ее сперва необходимо установить, что предлагалось еще на этапе установки самой системы (см. главу 2, "Установка FreeBSD"). Если тогда вы отказались от установки коллекции портов, ничего страшного— эту операцию можно выполнить в любое время. Для тех кто забыл, напоминаем, то определить наличие портов в системе можно по присутствию непустого каталога /usr/ports. Для установки коллекции портов есть два пути: с помощью все той же утилиты sysinstall или же с использованием CVSup. В первом случае необходимо запустить утилиту sysinstall, выбрать пункт меню Configure ► Distributions ► ports и нажать пюпку ОК. Далее следует выбрать источник установки и, дождавшись завершения операции копирования, выйти из sysinstall. Второй способ установки коллекции портов — альтернативный, и его желательно использовать только для обновления. Это связано с тем, что полная коллекция портов внимает около 300 Мбайт. Если вам не жалко Internet-трафика, то — вперед! Но все же лучше воспользоваться пакетом портов с дальнейшей актуализацией в случае применения описанного ниже способа. Итак, в первую очередь, необходимо установить пакет net/cvsup-without-gui. Как правило, он всегда присутствует на дистрибутивном диске системы. Затем скопируйте файл /usr/share/examples/cvsup/ports-supfileв каталог/etc: # ср /usr/share/examples/cvsup/ports-supfile /etc/ После копирования отредактируйте файл /etc/ports-supfile. Пример содержимого этого файла представлен в листинге 9.1.
306 Глава 9. Установка и обновление сторонних приложений Листинг S.1. Пример "рабочего"* файла ports-eupf il»! для установки/ббнЬвлёмия к^ '" лекции портов ,'-;,' -' -'" '"'. „'! ■ ' '' I ♦default host=cvsup3.ua.FreeBSD.org ♦default base=/var/db ♦default prefix=/usr ♦default release=cvs tag=. ♦default delete use-rel-suffix ♦default compress ports-all Для параметра host укажите в качестве сервера, используемого по умолчанию, наиболее близкий к вам CVSup-сервер (список серверов есть в справочном руководстве по FreeBSD). После этого можно запускать утилиту cvsup: # cvsup -g /etc/ports-supfile Если коллекция портов не была установлена ранее, то данная команда загрузит самую последнюю версию дерева. В других случаях запуск указанной команды позволяет обновить дерево портов до актуального состояния с учетом всех изменений, произошедших с момента предыдущего запуска. Для простоты и удобства актуализации древа портов добавьте с помощью планировщика задач сгоп процедуру обновления в список запланированных ежедневных задач. Структура каталогов в дереве портов После установки коллекции портов можно перейти в каталог /usr/ports и просмотреть его простую структуру. Структура дерева портов практически совпадает со структурой набора пакетов, но с некоторыми отличиями. В первую очередь в глаза бросаются несколько каталогов, имена которых начинаются с прописных букв. Эти каталоги не являются категориями программ, а обеспечивают работу самой системы портов. Кроме каталогов, вы также увидите несколько файлов информативного характера, за исключением файла Makefile и файлов индексной базы данных INDEX*. Внутри каталогов, представляющих собой категории, находятся подкаталоги, каждый из которых соответствует отдельному приложению. Например, в каталоге ftp/ (категория: утилиты для работы с протоколом FTP) можно найти подкаталог wget/, используемый для установки одноименного приложения wget. Обратите внимание на каталог /usr/ports/distfiles. Он используется как точка хранения дистрибутивных файлов с исходными текстами приложений. При установке приложения поиск дистрибутива будет выполнен в первую очередь именно в этом каталоге. Поиск необходимого приложения Дерево портов содержит очень много приложений, и с каждым днем их список растет все больше. Системному администратору очень сложно отслеживать все изменения в портах, а уж тем более — знать назначение каждого из них. Перед тем как устанавливать приложение необходимо выяснить, для чего оно предназначено, какие имеет возможности и проблемы. В некоторых случаях известно назначение приложения, но неизвестно его название. Существует несколько способов поиска требуемого приложения: С помощью Web-сайта FreshPorts по адресу http: / /www. f reshports. org/. Ha этом сайте отслеживаются изменения в приложениях из дерева портов, при этом он напрямую связан с CVS-хранилищем коллекции портов. Здесь можно зарегистрироваться, выбрать интересующие приложения, и в дальнейшем в случае их изменения вам будут отправляться письма с подробным описанием нововведений.
Дерево портов 307 ■ На Web-сайте проекта FreeBSD всегда содержится и постоянно обновляется список приложений по адресу http://www.freebsd.org/ports/. На этой странице можете выполнить удобный поиск приложения по имени, по категориям, или же просто просмотреть список всех приложений в выбранной категории с их кратким описанием. ■ На Web-сайте FreshMeat по адресу http://www.freshmeat.org содержится список различных приложений с различными критериями поиска. Как правило, этот сайт используется для поиска названия приложения по описанию возможностей с последующим поиском в наборе портов. • Самый распространенный и простои вариант поиска необходимого приложения в портах— использование встроенной в коллекцию портов команды make search. Эта команда позволяет искать приложения как по имени, так и пр ключевом слову. Для ее использования необходимо перейти в каталог /usr/ports для поиска по всей коллекции или в какой-либо подкаталог для поиска в отдельном разделе. Поиск по имени будет выглядеть следующим образом: # cd /usr/ports # make search name=pure-ftpd Port: pure-ftpd-1.0.20_3 Path: /usr/ports/ftp/pure-ftpd Info: A small, easy to set up, fast and very secure FTP server Maint: j@pureftpd.org B-deps: R-deps: perl-5.8.7 WWW: http://www.pureftpd.org/ Как видим, формат поиска по имени приложения имеет следующий вид: make search name=portname В результатах, выдаваемых командой make search, основным является поле Path: — именно в нем указывается каталог, в котором находится сценарий установки приложения. Утилита поиска позволяет увидеть также краткое описание приложения и зависимости от других приложений. Для поиска по ключевому слову используется следующий формат: make search key=keyword Поиск при этом будет выполнен не только в именах приложений, но и в комментариях, описаниях и даже в списке зависимостей: # make search key=RealVNC Port: vnc-4.1.1 Path: /usr/ports/net/vnc Info: Display X and Win32 desktops on remote X/Win32/Java displays Maint: james@now.ie B-deps: expat-1.95.8_3 fontconfig-2.2.3,1 freetype2-2.1.10_1 perils. 8. 7 pkgconfig-O.17.2 xorg-libraries-6.8.2 R-deps: expat-1.95.8_3 fontconfig-2.2.3,1 freetype2-2.1.10_1 libXft- 4>2.1.7 perl-5.8.7 pkgconfig-O.17.2 png-1.2.8_2 xorg-clients-6.В.2 "bxorg-fonts-encodings-6.8.2 xorg-fonts-miscbitmaps-6.8.2 xorg- 4>libraries-6.8.2 xterm-203 WWW: http://www.realvnc.com/ При поиске можно использовать некоторые символы подстановки и регулярные выражения, но такое имя обязательно должно быть экранировано символами кавычек, например:
308 Глава 9. Установка и обновление сторонних приложений # make search name="Awget/*" Port: wget-1.10_2 Path: /usr/ports/ftp/wget Info: Retrieve files from the Net via HTTP and FTP Maint: sf@FreeBSD.org B-deps: gettext-0.14.5 libiconv-l.9.2_l perl-5.B.7 R-deps: gettext-0.14.5 libiconv-l.9.2_1 WWW: http://www.gnu.org/software/wget/wget.html Port: wgetpro-0.1.3 Path: /usr/ports/ftp/wgetpro Info: Wget with "PRO" features Maint: ports@FreeBSD.org B-deps: gettext-0.14.5 gmake-3.B0_2 libiconv-l.9.2_l R-deps: gettext-0.14.5 libiconv-l.9.2_l WWW: http://www.wgetpra.org/ Port: wget4web-1.0 Path: /usr/ports/www/wget4web Info: WWW interface for console wget Maint: sam@brj.pp.ru B-deps: apache-1.3.33_2 expat-1.95.8_3 perl-5.8.7 R-deps: apache-1.3.33_2 expat-1.95.8_3 gettext-0.14.5 libiconv-l.9.2_l <bperl-5.8.7 wget-1.10_2 WWW: http://irodov.nm.ru/wget4web/ Обращаем внимание на то, что строка поиска не чувствительна к регистру симео- лов! Еще один интересный способ поиска каталога, в котором находится сценарий установки приложения, — использование утилиты whereis, которой в качестве параметр) передается имя искомой программы. Эта утилита выводит имя исполняемого файла, № ли приложение уже установлено, или же каталог, в котором, возможно, находится сценарий установки искомого приложения. Единственное замечание: необходимо точно знать название искомой программы. Пример использования этого "экстравагантного" способа: # whereis wget wget: /usr/local/bin/wget /usr/local/man/manl/wget.1.gz ^ /usr/ports/ftp/wget # whereis vnc vnc: /usr/ports/net/vnc В первом случае мы определили, что искомая программа wget уже установлена в системе по пути /usr/local/bin/wget. Во втором случае утилита whereis не нашла установленной программы с именем vnc, но нашла каталог, из которого можно установить искомую программу. Понимание порта Итак, мы нашли порт, перешли в необходимый каталог и увидели в нем несколько файлов, имена которых и от каталога к каталогу не меняются (иногда эти файлы называют "скелетом" порта). Порт состоит из следующих файлов. Makefile — основополагающий файл порта, содержащий различные директивы, в том числе: имя продукта и его версию, путь установки, параметры компиляции, конфликтующие приложения, адрес ответственного человека, информацию о том.
Дерево портов 309 где можно получить дистрибутив с исходными текстами и многое другое. Пример простого файла Makefile представлен в листинге 9.2. Листинг 9.2. Пример простого файла Makefile ^^ .. ,-■ * New ports collection makefile for: yale-tftpd i Date created: Oct 8, 1994 i Whom: pst i I $FreeBSD: ports/ftp/yale-tftpd/Makefile,v 1.19 2005/04/22 09:24:02 vs Exp $ » P0RTNAME= yale-tftpd P0RTVERSION= 3.0 CATEGORIES= -ftp HASTER_SITES= ftp://ftp.cert.dfn.de/pub/tools/net/yale-tftpd/ «AINTAINER= ports@FreeBSD.org C0KMENT= Enhanced tftpd(8) from Yale University and cisco Systems NO_WRKSUBDIR= HAKE_ARGS= ETCDIR=$(PREFIX}/etc BINDIR=${PREFIX}/libexec *>MANDIR=${PREFIX}/man/man HAN8= tftpd.8 MANCOMPRESSED= yes PLIST_FILES= libexec/tftpd pre-build: (cd ${WRKSRC}/classes; ${MAKE}) .include <bsd.port .mk> • distinfo — содержит информацию о файлах, необходимых для сборки, и их размере, а также контрольную сумму по алгоритму MD5 и, возможно SHA256, которая используется для проверки того, что файл не был поврежден во время загрузки. Пример содержимого файла distinfo для порта ftp/wget версии 1.10.2: MD5 (wget-1.10.2.tar.gz) = 795fefbb7099f93e2d346b026785c4b8 SIZE (wget-1.10.2.tar.gz) = 1213056 Каталог files содержит файлы патчей, которые возможно включают поддержку приложением системы FreeBSD, или исправления безопасности, которые необходимо применить для файлов исходных текстов после их распаковки. Патчи — очень простые файлы и содержат только инструкции о том, какие изменения и в каком месте необходимо внести. Кроме патчей, в каталоге files иногда содержатся и другие файлы, необходимые для корректной компиляции порта. ■ рkg-comment — встречается редко; содержит однострочное описание приложения. ■ pkg-descr — файл, содержащий описание программы (как правило, — возможности программы и Web-сайт разработчика). ' pkg-plist — список всех файлов, которые будут установлены. В данном файле также содержатся указания относительно деинсталляции порта. В каталоге порта могут содержаться еще другие файлы (например, pkg-message) I и каталоги (например, scripts), а также могут и отсутствовать все основные файлы «роме Makefile. Напомним, что порт не содержит исходных файлов приложения, а
310 Глава 9. Установка и обновление сторонних приложений только лишь является сценарием по автоматизации установки или удаления прило» ния. Для более полного понимания порта и если хотите научиться их создавать сами- обратитесь к руководству FreeBSD по созданию портов. Установка из портов Итак, требуемый порт найден. Теперь самое время рассмотреть процедуру устанс* ки приложений с помощью коллекции портов. Для установки приложений из портов необходимо получить права суперпользовагё ля root. Это связано с тем, что установку новых приложений должен контролирс аать администратор системы. Кроме того, некоторые из приложений могут изменил работусистемы или же снизитьуровень еегбёздпасности.. Для установки из портов необходимо иметь компакт-диски с дистрибутивами (та называемые PowerPak), или же подключение в сети Internet. В крайнем случае, проси раздобудьте дистрибутивный файл и сохраните его в дистрибутивном каталок /us r/ports/distfiles. Установка приложения должна выполняться в каталоге порта приложения. Для установки используется команда make, которая компилирует программу, и команд! make install, копирующая необходимые файлы в систему и производящая опреда ленные операции по подготовке ее использования. И все? Так просто? На самом дик выполняется намного больше шагов и операций. Рассмотрим это на примере установи программы f tp/wget. Попытаемся выполнить ее компиляцию: # cd /usr/ports/ftp/wget # make ===> Vulnerability check disabled, database not found ===> Extracting for wget-1.10 => MD5 Checksum OK for wget-1.10.tar.gz. => No SHA256 checksum recorded for wget-1.10.tar.gz. ===> wget-1.10 depends on file: /usr/local/bin/perl5.8.7 ===> Patching for wget-1.10 ====> wget-1.10 depends on file: /usr/local/bin/perl5.8.7 ===> Applying FreeBSD patches for wget-1.10 { . .. } ===> wget-1.10 depends on file: /usr/local/bin/perl5.8.7 ===> wget-1.10 depends on shared library: intl - found ===> Configuring for wget-1.10 (...) ===> Building for wget-1.10 (...) # Мы выполнили одну команду make для построения утилиты, а в результате был» произведена проверка контрольной суммы, распаковка, применение патчей, конфигурирование, и только потом— компиляция. Как это понимать? Почему команда make вы- полняет лишние процедуры? В действительности, ответ очень прост. Команда make в дереве портов имеет некоторые особенности, которые определенны в главном файл; сборки приложений /usr/ports/Mk/bsd.port .mk. Эти особенности называются целями команды make. Если ни одна цель не была указана, то применяется цель build- компиляция приложения. При этом указание одной цели может подразумевать выполнение нескольких других, определенных раньше указанной. - found - found - found
Дерево портов 311 Рассмотрим последовательность применения целей. fetch — загрузка дистрибутива при его отсутствии. Может применяться только раз. Если процесс загрузки был прерван, и файл загружен частично, то используется следующая цель. checksum — проверка дистрибутива на целостность с использованием контрольной суммы по MD5 и SHA256 (не обязательно). extract — распаковка дистрибутивного архива приложения в рабочий каталог work/<distname>. • patch — проверка на предмет наличия патчей и их применение к исходному тексту. configure — запуск сценария конфигурирования для подготовки приложения к сборке. На этом этапе определяются функциональные возможности приложения (директива CONFIGURE_ARGS из файла Makefile). • build — непосредственно компиляция продукта. • install — установка скомпилированного продукта в каталог назначения. Таким образом, понятно, что цель checksum выполнит также попытку загрузки дистрибутивного файла, если тот отсутствует или имеет неверный размер. Существуют и другие цели, например: reinstall, deinstall, clean и т.п. Некоторые из них будут рассмотрены ниже в данной главе. Для загрузки дистрибутивов используется утилита fetch. Если требуется использовать сайт, отличный от того, который используется портом для загрузки дистрибутива приложения, измените значение директивы MASTER_SITES в файле Makefile. To же самое, за редкими исключениями, касается практически любой директивы в Makefile. Для определения того, какие цели были выполнены ранее, чтобы пропустить их, — команда make создает специальные файлы вида . <operation>_done. * в каталоге work: # Is work .build_done.wget-1.10._usr_local .patch_done.wget-1.10._usr_local .configure_done.wget-l.10._usr_local wget-1.10 . extract_done.wget-1.10._usr_local С точки зрения операционной системы, приложение, установленное с помощью системы портов, ничем не отличается от приложения, установленного с помощью набора пакетов. Вся информация хранится централизованно в базе данных /var/db/pkg и может быть просмотрена утилитой pkg_info. Также для приложений, установленных спомощью портов, можно использовать утилиту pkg_version для поиска устаревших версий приложений. Освобождение дискового пространства Как вы помните, в начале главы мы упоминали о больших объемах занимаемого дискового пространства при использовании дерева портов. Вернемся к данному вопросу, но несколько в ином ракурсе. Следует учитывать, что для распаковки и компиляции приложения требуется дополнительное дисковое пространство. Даже если есть место для установки самого приложения, его может не хватить для распаковки или компиляции, поскольку при установке приложения создается множество временных файлов. К счастью, в FreeBSD существует возможность автоматического удаления этих временных файлов, поскольку, в противном случае, по прошествии некоторого времени ««лекция портов заняла бы все свободное дисковое пространство. Для этой цели ис-
312 Глава 9. Установка и обновление сторонних приложений пользуется команда make clean, которая удаляет рабочий каталог work для текущего порта и всех портов, связанных с ним. А вот исходные файлы из distf iles придется удалять вручную, что не рекоме» дуется. При обновлении коллекции портов может измениться не версия порта, а номер пересмотра версии, называемый PORTREVISION. В данном случае переустановками обновление приложения не требует загрузки нового файла с исходными текстами. Пе- ресмотренная версия основывается на использовании патчей. И действительно, зачем загружать новый файл с исходными текстами на 30 Мбайт, если изменилось всего лишь несколько тысяч строк? Проще использовать сценарий patch, который будет вносив необходимые изменения в исходные тексты старой версии приложения. Очистку дискового пространства от промежуточных данных компиляции приложения в портах можно выполнить почти на любом уровне иерархии дерева портов. Например, использование команды make clean в каталоге /usr/ports/ftp/wget очистит рабочие файлы только для приложения wget и связанных с ним приложений. Если же ту же самую команду выполнить на уровне /usr/ports/ftp, то будет выполнена "ревизия" и очистка рабочих каталогов для всех приложений в ветке ftp, а также да всех связанных приложений из нее. Использование команды make clean для каталога /usr/ports позволит освободиться от всех рабочих файлов портов, но о том, сколько времени займет такая чистка и как сильно будет загружен жесткий диск, лучше и не думать. На некоторых компьютерах такая операция может занять несколько суток ©. Для более быстрой "чистки" создайте в каталоге /usr/ports и используйте сценарий cleanwork. sh (листинг 9.3). Листинг 9.3. Сценарий быстрого поиска портов с рабочими каталогами work, и Применение ДНЯ них команды maJce clean -<__i . #!/bin/sh # /usr/ports/cleanwork.sh find /usr/ports -name work -print I awk '{gsub("work",""); \ print "cd",$0, ";","make clean")' > /usr/ports/cleanwork sh /usr/ports/cleanwork rm /usr/ports/cleanwork Удаление портов Итак, теперь мы знаем все об установке портов. Отлично, но как же их удалять? Как и в случае с пакетами, удаление портов — весьма простая задача. В данном случае перед удалением приложения, установленного с помощью порта, необходимо перейти в каталог приложения в коллекции портов. Для приложения wget, используемого нами в качестве примера, удаление будет происходить следующим образом: # cd /usr/ports/ftp/wget # make deinstall ===> Deinstalling for ftp/wget ===> Deinstalling wget-1.10 Из примера видно, что удаление выполняется той же утилитой make с указанием цели deinstall. Подобно удалению, можно произвести переустановку пакета. Для этого используется цель reinstall, которую необходимо использовать после удаления порта. Обратите внимание на то, что после очистки рабочей директории командой make clean цель reinstall произведет полную сборку и установку пакета "с нуля". Если приложение после установки из коллекции портов было обновлено пакетом, то команда make deinstall не сработает, и придется воспользоваться утилитой pkgdelete, описанной ранее в разделах, посвященных пакетам.
Дерево портов 313 Обновление приложений с помощью портов Специфика портов такова, что для обновления приложения с помощью коллекции портов потребовалось бы вручную удалять установленное приложение, а затем компилировать и установить новую версию. Именно так приходится обновлять приложения на различных UNIX-системах в случае использования исходных текстов, но для системы FreeBSD все намного проще. Все операции по обновлению приложений можно выполнить одой командой, но для этого прежде необходимо установить одно дополнительное приложение portupgrade из набора системных утилит sysutils/portupgrade. После установки portupgrade необходимо выполнить команду pkgdb -F для построения базы данных приложений. Эта база данных, содержащая перечень установленных портов, будет сохранена в каталоге /var/db/pkg. Для обновления всех приложений используется команда portupgrade -а, но сразу же спешим предупредить, что вэтом случае следует быть крайне осторожным. Что делает утилита portupgrade? В первую очередь, удаляет все рабочие файлы (каталог work) и загружает файл с исходными текстами приложения, а затем распаковывает его и пытается скомпилировать. При успешной компиляции она делает резервную копию версии приложения, установленной в данный момент в системе, после чего удаляет приложение и устанавливает новую версию. В завершение portupgrade опять выполняет очистку рабочих каталогов. Как видим, данная утилита позволяет обновлять приложения практически безопасно. Если вы не хотите обновлять все приложения (и это правильно), то укажите имя приложения после имени утилиты, например: # portupgrade wget Для обновления всех зависимых приложений установите опцию -г: it portupgrade -r wget Как упоминалось ранее, portupgrade рекомендуется также использовать для обновления пакетов. Для этого укажите опцию -Р. При этом будет выполнен поиск паке- га на локальном источнике, а затем — на серверах в Internet. Если поиск окажется неудачным, будет предпринята попытка установить приложение с помощью дерева портов. Для того чтобы порты не использовались, вместо -Р укажите -PP. Если требуется только загрузить исходные коды новой версии приложения без обновления, укажите опцию-F. ' Перед началом работы и в самом конце, утилита portupgrade пытается проверять н вносить соответствующие изменения в базу данных портов с помощью команды pkgdb. Несмотря на это, иногда для проверки целостности рекомендуется запускать команду pkgdb -F вручную. В некоторых случаях без выполнения проверки целостности и обновления зависимостей может произойти сбой обновления приложения. В таких случаях утилита portupgrade сама напомнит о необходимости вручную запустить вышеупомянутую команду, инаЧе обновление портов станет невозможным. Во время работы команды pkgdb не прерывайте ее, так как это может привести к серьезным ошибкам в базе данных. Нерабочие порты Иногда сборка портов завершается неудачно. Причин этому может быть много. Иногда, проблема кроется в зависимостях, иногда— в ошибках исходного кода программы, иногда— в самом порте. При получении ошибки попытайтесь очистить порт от промежуточных файлов и повторить установку. При повторном получении ошибки сделайте следующее. • Попытайтесь самостоятельно исправить порт. В принципе, это несложно. По этому вопросу существует целое руководство. Ошибки могли возникнуть в процессе
314 Глава 9. Установка и обновление сторонних приложений обновления порта, поэтому попытайтесь повторить процедуру обновления пом и установки необходимого приложения через несколько часов. Учтите, что га* нения, произведенные вручную, после обновления дерева портов будут потерщ Попробуйте просмотреть список обсуждения проблем по почте, и в случае otcji ствия описания вашей проблемы отправьте письмо ответственному за порт ел циалисту. Для того чтобы узнать его адрес, воспользуйтесь командой так maintainer. При отправке письма не забудьте указать версию файла Makefili (скопируйте строку, содержащую # $FreeBSD:), а также содержимое прочая установки до возникновения ошибки. Если ответственный специалист не дал и вета на возникшую проблему, "надавите" отправкой сообщения об ошибке с ш мощью утилиты send-pr. В крайнем случае, попытайтесь установить необходимое приложение из наЦ пакетов.
Понимание роли ядра 315 ГЛАВА 10. НАСТРОЙКА ЯДРА СИСТЕМЫ Так сложилось, что пользователи, которые никогда не работали с FreeBSD или работали на поверхностном уровне, почему-то знают, слышали и боятся "сборки нового ядра", хотя сами никогда с этой процедурой не встречались. Объяснить же, откуда появился гакой страх, никто не может. Почему сложилось мнение о сложности настройки и установки нового ядра также никто не знает. Вспоминая свою первую сборку ядра, хочется рассмеяться: на каждом шаге нервное дрожание рук, боязнь переустановки системы заново ("О, это же так ужасно!"), попытка понять, что происходит в тот или иной момент настройки и вопрос: "А зачем мне это?". Но вот обновление выполнено, система перезагружается, нервное постукивание пальцами по столу, несколько секунд ожидания, и система FreeBSD 2.2.8 запустилась — и при том в несколько раз быстрее! С этого момента установка перенастроенной версии ядра становится неотъемлемой и изначальной частью настрой- «FreeBSD. Цель этой главы — навсегда убрать из вашей жизни страх перед установкой нового ядра. ПОНИМАНИЕ РОЛИ ЯДРА В принципе, мы уже упоминали о ядре в начале книги и попытались его кратко описать, но понимаем, что сейчас читатель, скорее всего, не имеет ни малейшего понимания данного вопроса. Честно говоря, точно объяснить, что собой представляет ядро системы, не возьмется большинство администраторов. Но одно ясно наверняка: ядро — самая важная и неотъемлемая часть любой операционной системы, будь то Linux-based, FreeBSD, Windows, MacOS, Novell NetWare, DOS или какая-либо другая. От ядра зависит работа различных устройств, взаимодействие с сетью, производительность системы в целом и т.д. Музыка в колонках звучит только потому, что ядро воспринимает звуковую карту и может корректно с ней обмениваться данными; набирая на клавиатуре текст, вы видите его вывод на экран только потому, что ядро поддерживает работу с клавиатурой и правильно обменивается данными с видеокартой. Для конечного пользователя все кажется довольно простым, хотя на самом деле в системе происходят очень сложные процессы Ядро в FreeBSD — это бинарный файл, который загружается после загрузчика и хранится в памяти до выключения системы. В связи с этим, оно должно быть как можно иеньшего размера. В системе FreeBSD до 5-й версии файл ядра размещался в корне файловой системы и назывался /kernel. Кроме данного файла присутствовала директория /modules, где можно было найти несколько файлов модулей ядра. Модули ядра — это файлы, которые могут быть загружены или выгружены отдельно от "главного" файла ядра. На сегодняшний день ядро FreeBSD стает все более мо- цульным, что позволяет быстро, без перезапуска системы временно расширять его функциональные возможности или подключать некоторые мобильные устройства (на-
316 Глава 10. Настройка ядра системы Ш. пример, сетевые карты PCMCIA или USB-устройства, не требующие постоянном* поддержки ядром). щ В системах старше FreeBSD 5 вы не найдете ни файла /kernel, ни директив /modules. Все ядро и его модули теперь размещаются в каталоге /boot: файл ядраЖ по пути /boot /kernel /kernel, а модули ядра — в самой директоЯ /boot/kernel. ■- ЗАЧЕМ ЕГО ПЕРЕСОБИРАТЬ? I Пересобирать ядро никто не заставляет, к тому же разработчики системы все большей больше переходят от модели монолитного ядра к модели модульного ядра, что позвоЯ ет расширять его функциональные возможности "на лету" (на работающей системе)|Я включать их поддержку добавлением одной строки в файл загрузчика. Но это — вопш сы, касающиеся расширения ядра. А как насчет его уменьшения, оптимизации, исшЯ чения поддержки ненужных устройств или возможностей? Как быть с возможностям которые не предоставлены в виде модуля, или с теми, которые невозможно динамиш ски загрузить в работающей системе (например, поддержка симметричной многопД цессорности SMP)? Вот тут-то и встает вопрос создания своего особого файла ядра! его установки для использования. ■ Ядро, установленное по умолчанию (GENERIC), подходит для большинства систе и позволяет установить и запустить FreeBSD на компьютерах различной конфигуращ (универсальность). Для этого в GENERIC включена поддержка очень большого колич) ства устройств. Естественно, это сказывается на скорости загрузки системы, посколы она пытается каждый раз находить все поддерживаемые устройства, что занимает epei и ресурсы, и на ее производительности в целом, так как при уменьшении размера файл ядра расходуется меньше памяти. Именно конфигурирование и установка "заточении под себя" файла ядра может предоставить постоянную и стабильную поддержку все устройств вашей системы — в том числе и тех, которые не включены в GENERIC. Ken ти, в системе FreeBSD до 5-й версии проверку всех известных устройств ядром можщ отключить, внеся изменения в файл kernel. conf. Да и в целом знание процесса и опыт сборки файла ядра не повредит. Более того- будет очень полезным. Тем более, что без перекомпиляции ядра практически невозмо жен нормальный переход на новую или обновленную версию системы (данный процея рассмотрен в следующей главе). ПОДГОТОВКА К НАСТРОЙКЕ Перед тем как создать собственную конфигурацию ядра, необходимо как можно более точно определить конфигурацию компьютера. Исключение некоторых необходимы! опций или устройств (а иногда и включение лишних) из файла ядра может привесл к неработоспособности системы в целом или же некоторых ее элементов. Поэтому первым шагом должно быть создание списка имеющегося оборудования и используемш ресурсов. Некоторую помощь в создании такого списка может предоставить сама операционная система, отображая перечень найденных устройств в момент загрузки. Весь процесс загрузки системы может быть просмотрен с помощью утилита dmesg. Все устройства, которые находятся в данном списке и которым были выделены ресурсы, должны будут присутствовать в новом ядре системы. В системе FreeBSD 44 версии могут присутствовать дополнительные строки (например, conf ig> en lncOk касающиеся включения и отключения поддержки устройств с помощью UserConfig (cti, главу 4). Конфигурация и установка нового ядра позволяет отключить использование сценария UserConfig (файл /boot/kernel. conf) за счет удаления поддержки не-
Конфигурационные файлы 317 (ужных устройств ядром (те самые, которые были отключены при использовании kerConf ig командой di <devicename>). КОНФИГУРАЦИОННЫЕ ФАЙЛЫ Для начала необходимо упомянуть, что для настройки и установки своего ядра необходимо иметь установленными исходные тексты ядра. Перейдите в директорию usr/src и найдите поддиректорию sys/. He нашли? Значит в вашей системе нет условленных исходных кодов ядра. О том, как и откуда их поставить сказано во второй главе, посвященной установке системы. Наиболее быстро и просто установить исходные коды ядра можно с помощью утилиты /stand/sysinstall.(для FreeBSD 6.0 — /usr/sbin/aysihstall). Запустив Je, пройдите по такому пути от главного меню: Configure ► Distributions ► src ► iys. Выберите. OK, затем снова QIC укажите источник установки (скорее всего, это будет CD/DVD) и дождитесь завершения копирования файлов, после чего можете выйти из программы установки sysinstall. Итак, исходные тексты ядра для архитектуры i386 находятся в директории /usr/src/sys/i368 (можно перейти по пути /sys/i386). Но, как администратора системы, вас должна интересовать несколько другая директория — точнее, поддиректория текущей: conf/. Все изменения в работе ядра будут вноситься именно там. В ней находятся всего несколько файлов, количество и названия которых в различных версиях FreeBSD отличаются. Например, в 4-й версии FreeBSD вы увидите только два файла: GENERIC и LINT. В FreeBSD версии 5.x и выше файлов намного больше. При этом особое внимание следует обратить на исчезновение файла LINT (его можно собрать при необходимости) и появление новых файлов NOTES и РАЕ. В FreeBSD 6 вы не найдете файл 0LDCARD (да и опции из него в 6-й версии системы работать не будут), который «первые появился только в 5-й ветке. Рассмотрим кратко назначение и особенности некоторых из упомянутых файлов. ФаЙЛ GENERIC Напомним, что по умолчанию в системе устанавливается ядро GENERIC. Таким образом, файл GENERIC представляет собой конфигурационный файл ядра, установленного в системе по умолчанию. Его можно открыть в текстовом редакторе и просмотреть список поддерживаемого оборудования и текущие опции. Данный файл не рекомендуется изменять, и на этого есть много разных причин. Просмотрев файл GENERIC, сразу *е станет понятно, почему ядро GENERIC может практически безболезненно использо- иться на любой 1386-совместимой системе, — в нем включена поддержка всех i386- ювместимых процессоров, а также поддержка большинства самых распространенных )стройств. Рассмотрим вкратце формат файла GENERIC (а значит, и формат любого другого конфигурационного файла ядра). Каждая его строка может представлять собой или ключевое слово с набором аргументов (один и более), или же комментарий. При этом комментарий может быть расположен после аргументов в той же строке. Комментарий, как и в большинстве других случаев, начинается с символа "#", за которым любой текст итерируется до конца строки. Ключевых слов немного, но в различных версиях системы их количество и формат использования может меняться. Например ключевое слово csaudo-device не используется в файле ядра для системы FreeBSD 5.x и старше.
318 Глава 10. Настройка ядра системы Щ Набор ключевых слов следующий: ■ machine; I cpu; I ident; W maxusers; I makeoptions; I options; I device; I pseudo-device (до FreeBSD 5.x). I Подробное описание этих ключевых слов и процесса создания собственного файл конфигурации ядра представлено ниже, в подразделе "Создание конфигурационно!? файла ядра". Файл lint Этот файл всегда служил нескольким целям. В первую очередь, он предоставим прекрасное справочное руководство по параметрам из файла GENERIC, так как последний слабо документирован. Вторая цель файла LINT — предоставить список всех под- держиваемых параметров и опций, которые только могут использоваться при написанм собственного файла конфигурации ядра. Многие из этих опций имели экспериментальный характер, что позволяло протестировать возможность их использования в своей системе, или же, столкнувшись с конфликтами, — отказаться. Поскольку ядро 5-й ветки системы было довольно сильно изменено и переписано по сравнению с 4-й (хотя во многом — не очень удачно: например, были проблема в реализации SMP, что повлекло за собой очень быстрый выход FreeBSD 6), то данньЛ файл был изменен и переименован в NOTES. К тому же, его размер существенно умет- шился по причине перемещения параметров настройки драйверов устройств в файл /boot/device.hints для быстрого внесения изменений и динамического применения во время загрузки системы Если требуется получить полный список поддерживаемых опций и параметре) в файле LINT, выполните следующие команды: # cd /usr/src/sys/i386/conf # make LINT Заметим однако, что данный файл — это простой список без какого либо опиши» или дополнительной информации по опциям. Если необходимо просмотреть описанш обратитесь к файлу /usr/src/sys/conf/NOTES, из которого и генерируется файл, LINT. Файл notes Этот файл появился только в 5-й версии системы FreeBSD и полностью заменил использование файла LINT. Фактически, все, что касалось файла LINT, теперь касаета и файла NOTES: в нем перечислены все поддерживаемые опции и параметры для текущей архитектуры с подробным описанием их назначения. Единственным исключением является то, что вы не найдете в нем строк, подобных следующим: device sioO at isa? port IO_COMl flags 0x10 irq 4 device edO at isa? port 0x280 irq 5 iomem 0xd8000 Как упоминалось ранее при рассмотрении файла LINT, параметры настройки драйверов были перенесены в файл /boot/devices . hints.
Конфигурационные файлы 319 # Serial device device device device (COM) ports sioO siol sio2 sio3 Использование /boot/device. hints В системах старше FreeBSD 5.0 используются подсказки о параметрах настройки устройств (device hints). Благодаря такому нововведению, для изменения параметров устройств отпала необходимость полностью пересобирать все ядро. К примеру, если ранее СОМ-порты описывались в файле GENERIC: at isa? port IO_COMl flags 0x10 irq 4 at isa? port IO_COM2 irq 3 at isa? disable port IO_COM3 irq 5 at isa? disable port IO_COM4 irq 9 и любое изменение влекло за собой полную перекомпиляции, то теперь достаточно указать только строку: device sio Все изменения настроек необходимо производить в файле /boot/device.hints, который по умолчанию для СОМ-портов содержит следующие строки: hint.sio.0.at="isa" hint. sio. 0.port="0x3F8" hint.sio.0.flags="0xl0" hint.sio.0.irq="4" hint.sio.l.at="isa" hint.sio.l.port="0x2F8" hint.sio.1.irq="3" hint.sio.2.at="isa" hint.sio.2.disabled="l" hint.sio.2.port="0x3E8" hint.sio.2.irq="5" hint.sio.3.at-"isa" hint.sio.3.disabled="l" hint.sio.3.port="0x2E8" hint.sio.3.irq="9" Эти строки позволяют указать используемую шину, адрес, дополнительные флаги и прерывание для устройства. Все изменения настроек в данном файле вступают в силу после перезагрузки. Если вам не нравится такой подход, и вы желаете статически скомпилировать параметры для драйверов устройств, то просто добавьте следующую строку в конфигурационный файл ядра: hints "GENERIC.hints" Файл рае Для того чтобы решить проблему невозможности использования более 4 Гбайт памяти в компьютерах с большим объемом установленной физической памяти, компания Intel еще в Pentium Pro добавила поддержку 36-разрядной адресации, что позволяет использовать до 64 Гбайт оперативной памяти. Но не все так просто. По крайней мере — при использовании системы FreeBSD. Во-первых, данная опция ограничена возможностью использования только на одном типе процессоров. Во-вторых, она не была как следует протестирована и имеет ряд ограничений по поддержке ядром другого оборудования, включая многие сетевые карты, карты для Wi-Fi, устройства USB, SCSI-контроллеры (список неподдерживаемого оборудования находится в файле РАЕ и отключается опцией nodevice). Фактически, драйверы устройств, не использующие интерфейс busdma, приведут к повреждению
320 Глава 10. Настройка ядра системы информации в ядре. Помимо этого, при использовании такого ядра любой процесс и сможет получить доступ к более чем 4 Гбайт пространства виртуальной памяти. Если необходимо включить поддержку данной возможности, добавьте в файл конфигурации ядра опцию РАЕ: options РАЕ Еще одним неприятным фактом окажется невозможность использования модуле! ядра, потому необходимо также включить следующие строки: device acpi #если необходима поддержка ACPI makeoptions NO_MODULES=yes #не создавать файлы модулей ядра Все описанные ограничения были отображены в файле рае. Файл smp В FreeBSD 5-й версии опция поддержки многопроцессорных систем была вынесет в отдельный файл SMP. По заверению разработчиков, поддержка SMP была существен- но изменена. В действительности же, с поддержкой многопроцессорности у системы FreeBSD наблюдаются проблемы. Только с выходом FreeBSD 6-й версии было разрешено множество проблем в ядре. Файл SMP можно привести к следующему виду: include GENERIC ident SMP-GENERIC options SMP ФаЙЛ OLDCARD Файл OLDCARD, который появился в 5-й ветке FreeBSD, позволял вернуть поддержку устаревших моделей PCMCIA-устройств за счет отключения поддержки новой шины. В FreeBSD 6.0 данный файл был убран, как и поддержка драйверов устройств саге и pcic. Теперь решать проблемы приходится с помощью файла /boot/device. hints и включения некоторых опций ядра в файле /boot/loader, conf. В системе FreeBSD 5-х версий файл OLDCARD имеет следующий вид (урезаны комментарии): cardbus (yenta) bridge ExCA ISA and PCI bridges PC Card (16-bit) bus CardBus (32-bit) bus pecard bus PCMCIA bridge Создание конфигурационного файла ядра Создание собственного конфигурационного файла ядра проще всего начинал с копирования файла GENERIC с последующим его изменением под свои требовании Как правило, имя конфигурационного файла состоит из прописных букв и носит иш машины, для которой собирается ядро (не забывайте, что ядро может собираться на о* ной машине, а использоваться на другой). В нашем примере мы будем использовать иш GATE. Архитектура машины, для которой собирается новое ядро, — i386. Итак, переходим в нужный каталог и создаем новый файл ядра gate копированием файла GENERIC: # cd /usr/src/sys/i386/conf # ср GENERIC GATE include GENERIC ident nodevice #nodevice nodevice nodevice device device OLDCARD ebb pcic pecard cardbus card pcic # # # # # #
Конфигурационные файлы 321 Заметим, что использование файла GENERIC в любом случае — довольно плохая вея. На это существует несколько причин. Во-первых, данный файл, скорее всего, бург заменен новым файлом при обновлении дерева исходных кодов ядра. Также это иохая идея по причине утраты копии "рабочего" конфигурационного файла ядра, с по- 1ю1цью которого можно было бы исправить ошибки (использование для этой цели фай- и NOTES будет не самым удачном решением). Еще лучший вариант— сохранить кон- |вгурационный файл в домашнем каталоге, а в дереве исходных текстов поместить ямволическую ссылку на него: # mkdir -root/kernel # ср GENERIC -root/kernel/GATE # In -s ~root/kernel/GATE После создания файла gate можно переходить непосредственно к его редактирование Рассмотрим подробно файл GATE (копию GENERIC) на примере системы FreeBSD S.4 и то, как его можно изменить под свою конфигурацию. Параметр machine В первую очередь, в любом конфигурационном файле ядра для платформы i386 втретится строка: machine i386 Эта строка позволяет описать архитектуру компьютера, для которой собирается ядро. Кроме i38 6, разрешается использовать следующие значения: alpha, amd64, ia64, рс9В, powerpc И sparc64. Параметр cpu Для описания типа процессора системы используется ключевое слово cpu, которое иожет несколько раз встречаться в конфигурационном файле. Повторное указание данной опции позволяет определить различные типы процессора, когда точно не известно, какой процессор установлен (используйте утилиту dmesg для просмотра вывода ядра во время предыдущей загрузки системы). В любом случае, если это возможно, указывайте только один тип процессора. Это позволит оптимизирует ядро и работу системы в цепом: cpu I486_CPU cpu I586_CPU cpu I686_CPU Обратите внимание, что поддержка процессора I386_CPU практически исключена в последних версиях, а в FreeBSD 6.0 она полностью убрана на уровне ядра и исходных текстов системы. Для установки системы на старом компьютере с процессором Intel (0386 желательно устанавливать версию системы, поддерживающую данный процессор. Параметр ident ident GATE Параметр ident определяет "метку" ядра и должен совпадать с именем файла конфигурации ядра. По умолчанию, здесь используется значение GENERIC, но предполагается, что мы уже изменили его в соответствии с заданными условиями. Это значение всегда выводиться при загрузке ядра, так что всегда можно легко определить, что система работает с ядром GATE, а не GENERIC: I uname -a
322 Глава 10. Настройка ядра системы FreeBSD gate.altersys-ua.com 5.4-RELEASE FreeBSD 5.4-RELEASE #2: Sat Dec 3 15:53:33 EET 2005 informex@gate.altersys- ua.com:/usr/src/sys/i386/compile/GATE i386 Параметр maxusers Важным параметром при настройке конфигурационного файла ядра являете* maxusers. Этот параметр позволяет определить размеры различных системных таблиц что влияет на производительность. Значение данной опции должно приблизительно совпадать с числом пользователей, которые одновременно используют систему: maxusers 200 В последних версиях системы FreeBSD 4.x можно было установить значение, р» ное нулю, что позволяло системе автоматически настроить данный параметр. В системах FreeBSD 5.x и старше данный параметр всегда установлен в 0, если не будет установлено другое значение (в этих системах в файле GENERIC параметр maxuseis отсутствует). Если пользователь хочет вручную управлять значением параметра maxusers, то ему придется добавить этот параметр в конфигурационный файл и установить его значение, равным не менее 4, даже если система будет однопользовательской. Причина* вольно проста: одна из таблиц, использующая данное значение, отвечает за максимам ное количество одновременно работающих процессов, число которых устанавливаете по формуле 20+16*maxusers. Рекомендуется устанавливать значение от 50 до 100,но при этом, если вы столкнетесь в некоторый момент с ошибкой переполнения таблищ процессов, потребуется увеличить значение параметра maxusers и пересобрать ядро. Бытует ошибочное мнение, что данный параметр позволяет управлять максимальным количеством пользователей, которые могут использовать систему, но в действительности это не так. Параметр hints #То statically compile in device wiring instead of /boot/device.hints #hints "GENERIC.hints" # Default places to look for devices. А вот об этом параметре мы уже упоминали в описании файла NOTES. Напомниц что FreeBSD старше 5.0 позволяет использовать систему подсказок для драйверов устройств. При этом, по умолчанию, используется файл /boot/device.hints, ар компиляции "подсказок" статически в ядро необходимо снять комментарии с параметр! hints. Параметр makeoptions makeoptions DEBUG=-g По умолчанию, данная строка или закомментирована, или целиком отсутствует в конфигурационном файле ядра. Ее включение позволяет активизировать генерирование отладочной информации во время сборки ядра и включить в файл довольно много расширенной информации для последующей отладки. Включение опции makeoptions также приводит к созданию довольно большого файла ядра. Если в отладке ядра ил в написании собственных модулей нет необходимости, а также если диск недостаточ» велик для хранения "тяжелых" файлов, то включать данную опцию не следует. Параметр options options SCHED 4BSD
Конфигурационные файлы 323 Данной строкой начинается большой блок описания функциональных возможно- кйсистемы. Опция options позволяет воспользоваться традиционным планировщи- ш FreeBSD. Для повышения производительности системы при большой загруженно- 1И можно включить планировщик ULE, специально разработанный для SMP, но рабо- вощий также и на однопроцессорных системах. В случае, если вы хотите попробовать цнный планировщик, замените упомянутую строку на следующую: options SCHED_ULE НИМАНИЕ! анировщик SCHEDJJLE может не работать или работать некорректно в системах eBSD 5.x. В связи с этим было принято решение как можно скорее перейти на пьзование системы FreeBSD 6, в которой были исправлены проблемы с данным аметром и поддержкой SMP в целом. options INET Поддержка возможности использования сети. Даже если не планируется использо- шъ сеть в любом ее проявлении (Ethernet, PPP, SLIP и т.д.), оставьте эту опцию включенной, так как большинство системных утилит требуют поддержки интерфейса joopback. Для включения поддержки протокола IPv6 оставьте в конфигурационном файле цедующую строку: options INET6 Если планируется загрузка системы с жесткого диска, обязательно оставьте сле- 1ующую строку, которая включает поддержку файловой системы, используемой iFreeBSD: options FFS # Berkeley Fast Filesystem Для включения поддержки технологии Soft Updates оставьте или включите следующую строку: options SOFTUPDATES # Enable FFS Soft Updates support Технология Soft Updates позволяет увеличить скорость записи информации на диск. Если используется система с дисками с включенной опцией Soft Updates (выводятся ко- иандой mount), то не удаляйте данное определение в конфигурационном файле ядра. Для того чтобы воспользоваться soft-updates для существующих разделов, применяйте едманду tunef s, а при создании новых разделов для включения данной технологии — гоманду newf s с опцией -и. Для поддержки новой технологии, появившейся в FreeBSD 5 — списков контроля юступа ACL для файловой системы UFS2 — установите или оставьте такую строку: options UFS_ACL # Support for access control lists Обратите внимание на то, что при использовании списков ACL ранее данный параметр нельзя отключать, иначе будут изменены права на доступ к файлам самым непред- шзуемым способом. Если достаточно оперативной памяти и необходимо увеличить скорость дисковых операций при использовании больших каталогов, оставьте следующую опцию: options UFS_DIRHASH # Improve performance on big directories Отключение данной опции рекомендуется только на тех системах, где файловые операции практически не выполняются (например, шлюз в Internet).
324 Глава 10. Настройка ядра системы options MD_ROOT # MD is a potential root device Вышеуказанная строка включает поддержку использования дисков в памяти корневой файловой системы. Следующие три параметра отвечают за возможность использования сетевой фа1 вой системы (Network File System, NFS): options NFSCLIENT # Network Filesystem Client options NFSSERVER . # Network Filesystem Server options NFS_ROOT # NFS usable as /, requires NFSCLH Если поддержка NFS не нужна и вам не приходится монтировать разе с файлового сервера, можете эту опцию смело отключить. Использование следующей опции для поддержки файловой системы MS-DOS вольно спорно: options MSDOSFS # MSDOS Filesystem В действительности все довольно просто и банально: если вам не нужна поддер автоматического монтирования раздела FAT во время загрузки системы, то можете опцию отключить. Ее отключение в конфигурационном файле ядра не обозначает, вы не сможете монтировать DOS-разделы или использовать эмуляторы си DOS/Windows как MTools или Wine. Подобно предыдущему случаю, назначение следующей опции — поддержка 4 ловой системы ISO9660 для компакт-дисков, что требуется крайне редко: options CD9660 # ISO 9660 Filesystem Обратите внимание на то, что сам по себе использовать CD можно, поскольку обходимый модуль будет автоматически загружаться в момент его монтирования. К му же, для прослушивания AUDIO CD поддержка ISO9660, как и монтирование устр ства, не требуется options PROCFS # Process filesystem Использование данной опции, скорее всего, потребуется только в FreeBSD 4.x, как новые версии не используют виртуальную файловую систему процессов. В на версиях системы практически все приложения были адаптированы для работы без [ держки файловой системы PROCFS. Помимо этого, если включается PROCFS в сиси FreeBSD 6.0, то потребуется включить и следующую опцию (отсутствует в FreeB 4.x): options PSEUDOFS # Pseudo-filesystem framework Для возможности поддержки большого количества разделов на одном диске пользуйте следующую опцию (иначе отключите ее): options GEOM_GPT # GUID Partition Tables. Обязательная опция для всех версий операционной системы FreeBSD: options COMPAT_43 # Compatible with BSD 4.3 Ее отключение может привести к странным ошибкам при работе некоторых при жений. Для поддержки работы приложений в системе FreeBSD 5.x, собранных в предь щих версиях системы и использующих старые интерфейсы, вызовов, укажите в кон гурационном файле такую строку: options COMPAT_FREEBSD4 # Compatible with FreeBSD4 Данная опция рекомендуема к использованию на всех системах платформы i3l alpha.
Конфигурационные файлы 325 При использовании устройств SCSI необходимо какое-то время для их определения Верационной системой. Для задания времени ожидания используется следующая оп- р: options SCSI_DELAY=15000 # Delay (in ms) before probing SCSI По умолчанию, данная опция принимает значение, равное 15 секундам. Если не пользуется ни одного SCSI устройства, то можно эту строку просто проигнорировать, щучше всего изменить ее значение на 5 и менее секунд для ускорения запуска системы. Если используется отладка, то для возможности трассировки процессов с помощью шиты ktrace потребуется следующая строка в файле ядра options KTRACE # ktrace(1) support Следующая опция необходима, как правило, при использовании графического ин- ффейса: options SYSVSHM # SYSV-style shared memory Она предоставляет поддержку разделяемой памяти System V. Если вы точно не уве- ены в ее необходимости, то лучше оставьте. Для поддержки сообщений и семафоров System V используйте следующие строки: options SYSVMSG # SYSV-style message queues options SYSVSEM # SYSV-style semaphores Использование данных параметров практически никак не скажется на размере ядра, ютому их можно оставить. Для просмотра списка процессов, применяющих технологии lyslem V, воспользуйтесь командой ipcs -p. Для некоторых приложений может потребоваться поддержка расширений реально- «времени из 1993 POSIX. Для этого включите строку: options _KPOSIX_PRIORITY_SCHEDULING В конфигурационном файле ядра присутствует еще несколько опций, которые мы «будем рассматривать. После набора описания опций следует больший набор описали различных поддерживаемых устройств. Параметр device Для того чтобы разрешить использование набора APIC для распределения преры- аний при использовании как однопроцессорных, так и многопроцессорных систем вданном случае — обязательно), используйте следующую строку: device apic # I/O APIC При использовании многопроцессорной системы не забудьте добавить строку: options SMP Как правило, для любой системы придется оставить следующие строки: device isa device eisa device pci Первая строка должна присутствовать обязательно, поскольку все современные ПК впользуют шину ISA даже если нет слотов для плат расширения ISA. Вторая опция не- йходима при работе с материнской платой с поддержкой EISA. Данная опция включает (вдержку автоопределения и настройки устройств, расположенных на шине EISA. По- иедняя опция включает поддержку шины PCI, без которой сегодня не обходится прак- лчески ни одна система. Данная опция позволяет включить не только автоопределение юогветствующих устройств, но и проксирование из шины PCI в шину ISA.
326 Глава 10. Настройка ядра системы device device device device device atadisk ataraid atapicd atapifd atapist Для включения поддержки контроллера флоппи-дисков оставьте или включите с* дующую строку: device fdc Поддержка всех устройств АТА и ATAPI задается следующей строкой в конфи^ рационном файле: device ata Помимо этого для поддержки дисков АТА, дисковАТА RAID, приводов АТАР CDROM, флоппи-приводов и ленточных приводов (стримеров) ATAPI используйте ол ну из следующих строк (или все вместе, если это необходимо): # АТА disk drives # АТА RAID drives # ATAPI CDROM drives # ATAPI floppy drives # ATAPI tape drives Устройства АТА должны нумероваться. По умолчанию, нумерация происходит динамически, но при желании можно включить статическую нумерацию с помощью следующей строки: options ATA_STATIC_ID # Static device numbering После этого следует блок с описанием SCSI-контроллеров: device ahb # EISA АНА1742 family device ahc # AHA2940 and onboard AIC7xxx devices device ahd # AHA39320/29320 and onboard AIC79xx devices device amd # AMD 53C974 (Tekram DC-390(T)) device isp # Qlogic family device mpt # LSI-Logic MPT-Fusion device ncr # NCR/Symbios Logic device sym # NCR/Symbios Logic (newer chipsets + those of 'ncr'l device trm # Tekram DC395U/UW/F DC315U adapters device adv # Advansys SCSI adapters device adw # Advansys wide SCSI adapters device aha # Adaptec 154x SCSI adapters device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60. device bt # Buslogic/Mylex MultiMaster SCSI adapters device ncv # NCR 53C500 device nsp # Workbit Ninja SCSI-3 device stg # TMC 18C30/18C50 Удалите строки с описанием тех устройств, которые отсутствуют в системе. Если же нет ни одного SCSI-контроллера, и используется исключительно IDE, удалите вышеупомянутые строки полностью. Далее следует блок с описанием устройств, использующих SCSI: # SCSI bus (required for SCSI) # SCSI media changers # Direct Access (disks) # Sequential Access (tape etc) # CD # Passthrough device (direct SCSI access) # SCSI Environmental Services (and SAF-TE) Удалите строки для тех устройств, которые отсутствуют в системе, а при использовании IDE удалите вышеупомянутые строки полностью. Однако следует иметь в виду, device device device device device device device scbus ch da sa Cd pass ses
Конфигурационные файлы 327 *го в системе могут находиться устройства, использующие подсистему SCSI, не являясь ври этом устройствами SCSI. К таким устройствам относится umass, использующий IISB, но требующий поддержки SCSI (в частности,— поддержку устройств scbus и da). Прежде чем удалить поддержку SCSI, просмотрите список необходимых поддер- юваемых устройств, и убедитесь, что они не требуют наличия поддержки подсистемы SCSI. Только при отсутствии таковых можете полностью удалить поддержку SCSI. После описания SCSI-контроллеров и устройств следует блок описания различных «онтроллеров RAID. При этом одни требуют наличия интерфейса SCSI, другие же работают "сами по себе": # RAID controllers interfaced to the SCSI subsystem device amr # AMI MegaRAID device arcmsr # Areca SATA II RAID device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID device ciss # Compaq Smart RAID 5* device dpt # DPT Smartcache III, IV - See NOTES for options device hptmv # Highpoint RocketRAID 182x device iir # Intel Integrated RAID device ips # IBM (Adaptec) ServeRAID device mly # Mylex AcceleRAID/eXtremeRAID device twa # 3ware 9000 series PATA/SATA RAID # RAID controllers device aac # Adaptec FSA RAID device aacp # SCSI passthrough for aac (requires CAM) device ida # Compaq Smart RAID device mix # Mylex DAC960 family device pst # Promise Supertrak SX6000 device twe # 3ware ATA RAID Если нет никаких RAID-устройств, то можно смело исключить их поддержку из [Конфигурационного файла ядра. Для возможности использования АТ-клавиатуры или мыши PS/2 ядро должно поддерживать контроллер клавиатуры. Если в системе установлена и используется такая иавиатура или мышь, включите следующую строку: device atkbdc # AT keyboard controller Для поддержки АТ-клавиатуры и мыши PS/2 необходимо отдельно указать сле- цующие строки (или какую-то одну строку в соответствии с текущей конфигурацией): device atkbd # AT keyboard device psm # PS/2 mouse Если в системе установлен контроллер VGA (тот же ISA VGA), обязательно в конфигурационный файл включите следующую строку для поддержки соответствующего драйвера: device vga # VGA video card driver Тому, кто когда-либо работал с операционными системами Windows, наверное, пришлись по душе различные красочные заставки во время загрузки. Так вот, FreeBSD также поддерживает такую возможность, и пользователю совсем необязательно каждый раз созерцать на экране только бегущие текстовые строки во время запуска системы. Но об этом — в другом разделе (подробности см. в файле /boot/defaults/ loader.conf). Для поддержки такой возможности необходимо указать следующую строку: device splash # Splash screen and screen saver support
328 Глава 10. Настройка ядра системы В операционной системе FreeBSD 4.x используется другое ключевое слово для ого сания данного устройства и других подобных псевдоустройств: pseudo-device splash Для поддержки карт AGP и APG GART включите следующую строку в: device agp ВНИМАНИЕ! Следующий параметр является обязательным! device npx Данная строка позволяет включить использование прх — интерфейса к модулю операций с плавающей точкой. При этом может применяться как аппаратный сопроцессор (если он есть), так и программная эмуляция (в случае отсутствия аппаратной под держки). Если вы где-нибудь, когда-нибудь встретите или услышите информацию о том, что данный параметр можно удалить (а автор книги слыхал такие "истории"), рассмейтесь этому "специалисту" в лицо и отправьте его на курсы повышения квалификации (за его счет, разумеется). Далее следуют два параметра, связанных с управлением питанием. Первый отвечает за поддержку системы АРМ (Advanced Power Management), которая часто использу ется в ноутбуках, но отключена в версиях FreeBSD 5.x и выше (но есть поддержи ACPI). Второй параметр включает поддержку таймера управления энергопотреблением. Данное устройство используется как в случае использования АРМ, так и для ACPI. device device apm pmtimer Затем следует описание для устройств PCCARD, иначе называемых устройствами PCMCIA (используются в ноутбуках): # cardbus (yenta) bridge # PC Card (16-bit) bus # CardBus (32-bit) bus Обратите внимание на то, что многие устаревшие модели ноутбуков не будут работать при такой поддержке в ядре. Именно по этой причине в FreeBSD был создан файл OLDCARD, рассмотренный ранее. Возможно, сетевая PCMCIA карта заработает при замене этих строк следующими: device device device ebb pecard cardbus nodevice nodevice nodevice device device ebb pecard cardbus card pcic # # # # # cardbus (yenta) bridge PC Card (16-bit) bus CardBus (32-bit) bus pecard bus PCMCIA bridge Такая строка описывает СОМ-порты и в комментариях не нуждается: device sio # 8250, 16[45]50 based serial ports Для поддержки работы параллельного порта в конфигурационном файле должны присутствовать следующие строки: device device ррс ppbus # Parallel port bus (required) При этом первая позволяет описать интерфейс параллельного порта на ISA-шине, а вторая — саму шину параллельного порта.
Конфигурационные файлы 329 Следующие строки позволяют использовать параллельный порт для различных нужд, в том числе — для возможности подключения и использования принтера, для использования TCP/IP поверх параллельного порта, для возможности подключения привода Iomega ZIP и других целей: device lpt # Printer device plip # TCP/IP over parallel device ppi # Parallel port interface device # Iomega ZIP-drive, requires scbus and da device vpo В следующем блоке расположены описания различных сетевых карт как для шины ISA, так и для PCI. Их перечень слишком обширен, чтобы приводить его здесь. Упомянем только, что большинство сетевых карт требуют поддержку шины МИ, которая включается следующей строкой в конфигурационном файле: device miibus # Mil bus support Следом за сетевыми картами идет список устройств Wi-Fi: device device device device device wlan an awi wi wl # # # # « 802.11 support Aironet 4500/4800 802.11 wireless NICs. BayStack 660 and others WaveLAN/Intersil/Symbol 802.11 wireless NICs. Older non 802.11 Wavelan wireless NIC. Обращаем внимание на то, что первая строка из представленных выше должна присутствовать, если есть хотя бы одна из следующих в списке ниже. Затем идет блок псевдоустройств, с некоторыми из которых мы уже встречались (например, splash). Описывать назначение каждого их них мы не будем, поскольку, по большому счету, с большинством из них работать не придется: device mem # Memory and kernel memory devices # необходим для графического интерфейса device io # I/O device, # Обязательный параметр для безопасности системы device random # Entropy device # Обязательный параметр при наличии сетевой карты device ether # Ethernet support # Поддержка SLIP - можно удалить, если нет необходимости использовать device si # Kernel SLIP # Поддержка РРР на уровне ядра. Больше рекомендуется использовать # ррр на пользовательском уровне, реализованном через tun device ррр # Kernel PPP # Поддержка РРР на пользовательском уровне. Имеет более широкие # и гибкие возможности, чем ррр на уровне ядра device tun # Packet tunnel. # Псевдотерминал для telnet и других подобных приложений # Используется также xterm и emacs device pty # Pseudo-ttys (telnet etc) При описании последнего параметра в FreeBSD 4.x необходимо указать количество создаваемых устройств pty. Также в данной системе используется ключевое слово pseudo-device для описания всех вышеупомянутых "устройств" (как и следующих). # обязательный параметр, следует указывать даже # когда не планируется работа с сетью device loop # Network loopback # псевдоустройство для поддержки дисков, размещенных в памяти device md # Memory ''disks*'
330 Глава 10. Настройка ядра системы # включение поддержки тунелирования IPv6 через IPv4 и обратно, # а также IPv6 через IPv6 и IPv4 через IPv4 device gif # IPv6 and IPv4 tunneling # Устройство для перехвата пакетов и перенаправления даемону # трансляции IPv4/IPv6 device faith # IPv6-to-IPv4 relaying (translation) При использовании следующего параметра следует быть осторожным: device bpf # Berkeley packet filter Это фильтр пакетов Беркли. Данное устройство позволяет перевести интерфейс в promiscuous-режим для перехвата всех пакетов в широковещательной сети. Затем дай ные пакеты могут быть сохранены или просмотрены утилитой tcpdump. Включеюк данного параметра может серьезно снизить безопасность сети, особенно при использо" вании незащищенных сетевых протоколов (ftp, telnet, rlogin и т.д.). Но данное устрой» во требуется также и в случае применения в сети сервера DHCP для автоматическо! выдачи IP-адресов клиентским машинам (поддержка bpf должна присутствовать как и серверах, так и на стороне клиента). В самом конце конфигурационного файла описываются устройства USB и FireWire: # UHCI PCI->USB interface # OHCI PCI-XJSB interface # EHCI PCI-XJSB interface (USB 2.0) # USB Bus (required) # USB Double Bulk Pipe devices # Generic # "Human Interface Devices" # Keyboard # Printer # Disks/Mass storage - Requires scbus and da # Mouse # Diamond Rio 500 MP3 player # Scanners # USB support device device #device device ♦device device device device device device device device device # USB Ethernet, device device device device device device uhci ohci ehci USD udbp ugen uhid ukbd ulpt uroass ums urio uscanner requires aue axe cdce cue kue rue mn # ADMtek USB Ethernet # ASIX Electronics USB Ethernet # Generic USB over Ethernet # CATC USB Ethernet # Kawasaki LSI USB Ethernet # RealTek RTL8150 USB Ethernet # FireWire support device firewire device sbp device fwe # FireWire bus code # SCSI over FireWire (Requires scbus and da) # Ethernet over FireWire (non-standard!) Думаем, что их рассматривать и описывать смысла нет — комментарии говорят сами за себя. Главное — не удалить устройства, от которых зависит работа других устройств. В конце конфигурационного файла ядра принято добавлять другие необходимые устройства (например, звуковые карты). Подробную информацию о настройке конфигурационного файла ядра и дополнительных параметрах можно найти в файле NOTES, а также в справочном руководстве. Пример полного конфигурационного файла ядра представлен в листинге 10.1.
Конфигурационные файлы 331 4нг 10.1. Пример рабочего 1юнфй системы FreeBSD'ШЖ на ноугоУке IBM ThinkPad бОбЕ jachine cpu ident i386 I68 6_CPU MOBILE options options options options options options options options options options options options options options options options options options options SCHED_4BSD INET FFS SOFTUPDATES UFS_ACL UFS_DIRHASH MD_ROOT MSDOSFS CD9660 COMPAT_4 3 COMPAT_FREEBSD4 SYSVSHM SYSVMSG SYSVSEM # 4BSD scheduler # InterNETworking # Berkeley Fast Filesystem # Enable FFS soft updates support # Support for access control lists Improve performance on big directories # MD is a potential root device # MSDOS Filesystem # ISO 9660 Filesystem # Compatible with BSD 4.3 [KEEP THIS!] # Compatible with FreeBSD4 # SYSV-style shared memory # SYSV-style message queues # SYSV-style semaphores KPOSIX PRIORITY SCHEDULING KBD_INSTALL_CDEV AHC_REG_PRETTY_PRINT AHD_REG_PRETTY_PRINT ADAPTIVE GIANT # install a CDEV entry in /dev # Print register bitfields in debug # output. Adds ~128k to driver. # Print register bitfields in debug # output. Adds ~215k to driver. # Giant mutex is adaptive. device device device device device device device device options apic isa eisa pci fdc ata atadisk atapicd # I/O APIC # ATA disk drives # ATAPI CDROM drives ATA_STATIC ID # Static device numbering device device scbus da # SCSI bus (required for SCSI) # Direct Access (disks) I atkbdcO controls both the keyboard and the PS/2 mouse device atkbdc # AT keyboard controller device atkbd # AT keyboard device psm # PS/2 mouse device device device vga splash sc # VGA video card driver # Splash screen and screen saver support device device device agp npx pmtimer # support several AGP chipsets » PCCARD (PCMCIA) support nodevice ebb nodevice pecard # cardbus (yenta) bridge # PC Card (16-bit) bus
332 Глава 10. Настройка ядра системы Листинг 10.1. Окончание nodevice device device device card pcic cardbus # CardBus (32-bit) bus # 8250, 16[45]50 based serial ports device device device device ppc ppbus lpt ppi # PCI Ethernet NICs. device miibus device ep # Pseudo devices. device device device device device device device # USB support device device device device device device device device loop mem io random ether pty md uhci ohci usb ugen uhid umass sound snd mss # Parallel port bus (required) # Printer # Parallel port interface device # Mil bus support # Etherlink III based cards # Network loopback # Memory and kernel memory devices # I/O device # Ethernet support # Pseudo-ttys (telnet etc) # Memory "disks" # UHCI PCI->USB interface # OHCI PCI->USB interface # USB Bus (required) # Generic # "Human Interface Devices" # Disks/Mass storage - Requires scbus and da СБОРКА И УСТАНОВКА НОВОГО ЯДРА Итак, файл конфигурации ядра создан и приведен к необходимому виду. Теперь необходимо его собрать и установить. В целом, это— самый простой этап на пути к использованию лично собранного ядра. Но есть несколько замечаний. В первую очередь, необходимо определиться со способом сборки файла ядра. Таких способов на сегодняшний день существует два: классический и новый. Классический способ используется в том случае, когда в системе установлены только исходные тексты ядра, или же если требуется собрать новое ядро для расширения функциональных возможностей, не обновляя исходные тексты. Второй способ (новый) более предпочтителен в новых версиях системы даже в том случае, если просто требуется расширить функциональные возможности ядра без обновления исходных текстов, и обязательно должен использоваться при полном обновлении системы (см. следующую главу) с помощью команды make buildworld. Использование классического способа Итак, классический способ сборки ядра начинается с выполнения операции конфигурирования ядра. Для этого, находясь в каталоге /usr/src/sys/i386/conf, вое-
Сборка и установка нового ядра 333 пользуйтесь командой conf ig, указав в качестве параметра команды имя конфигурационного файла ядра (например, GATE): # config GATE В различных версиях операционной системы будут отображены различные подсказки к дальнейшим операциям. К примеру, FreeBSD 4.x напомнит о необходимости выполнить перед сборкой и установкой ядра команду make depend. Кроме того, будет выдано напоминание о том, что каталог для сборки ядра находится по пути ../. ./compile/GATE (при условии, что конфигурационный файл назывался GATE) относительно текущего: Don't forget to do a ''make depend'' Kernel build directory is ../.,/compile/GATE При использовании операционной системы FreeBSD 5.x подсказка будет следующей: Kernel build directory is ../compile/GATE Don't forget to do '"make depend'' Обратите внимание на то, что каталог, в котором необходимо собирать ядро изменился! И напоследок, подсказка для FreeBSD 6.0 выглядит так: Kernel build directory is ../compile/GATE Don't forget to do ''make cleandepend; make depend'1 Команда config может и не выполниться. Такое случается, если допустить синтаксическую ошибку в конфигурационном файле или указать имя несуществующего устройства. При этом утилита прекратит свою работу с выводом сообщения об ошибке, номером строки и возможной причиной ее возникновения. Примеры ошибок: в файле была допущена синтаксическая ошибка в 21-й строке (неизвестное ключевое слово): config: GATE:21: syntax error • в качестве аргумента для ключевого слова ери в FreeBSD 6.0 использовалось неизвестное значение I386CPU (поддержка процессора Intel 80386 была исключена в FreeBSD 6.0): GATE: unknown option "I386_CPU" ■ было указано несуществующее имя устройства nodev в качестве аргумента для ключевого слова device: config: Error: device "nodev" is unknown config: 1 errors Если ошибок не было допущено или они были исправлены, можно переходить кследующему шагу: компиляции файла ядра и модулей ядра. Для этого перейдите в необходимую директорию и выполните команду сборки ядра. Например, для сборки ядра GATE в FreeBSD 5.4: # cd ../compile/GATE # make depend { ... ) # make ( - }
334 Глава 10. Настройка ядра системы Если во время сборки ядра произошла ошибка, то ее необходимо искать в первою очередь в конфигурационном файле. Как правило, проблемы на этапе сборки возникая по причине неявных или "глупых" ошибок, которые не носят синтаксический характе) и не могут быть отслежены утилитой config. Например, была исключена строе device wlan, предполагая, что ее наличие в конфигурационном файле излишне,* при этом было оставлено описание для устройства wi, которое требует описания таив и wlan. В данном случае — это "прямой путь" к ошибке на этапе компиляции во вреш выполнения команды make: if_wi.o(.text+0x5b3f): In function "wi_dump_pkt': ../../../dev/wi/if_wi.c:2912: undefined reference to "ieee80211_dump_pkt' *** Error code 1 Это же касается и отключения поддержки шины USB, но включения поддержки какого-либо устройства, использующего данную шину. Если возникает ошибка по друпй причине, и решить ее не получается, обратитесь к разработчикам, или попробуйте найп информацию о возникновении подобной ситуации у других пользователей в списке рассылки. В случае успешного завершения операции сборки ядра можно переходить к последнему шагу: установке нового ядра вместо старого. Для этого просто выполните команду: # make install Установка нового ядра, как правило, занимает немного времени и не вызывает ошибок. В случае версии FreeBSD ниже 5.0, ошибки могут возникнуть при использовании уровня безопасности securelevel с установленным значением 1 или выше, В старых версиях операционной системы для файла ядра устанавливался флаг schg (системно-неизменяемый), и без сброса этого флага файл ядра не мог изменить или перезаписать даже пользователь root. Уровень securelevel, равный или больше 1, не позволяет изменять значение для данного флага, поэтому придется запустить систем)1 в однопользовательском режиме и там продолжить установку нового ядра или же временно опустить уровень безопасности до значения 0 или -1. Использование нового способа Новый способ сборки ядра требует наличия установленных исходных кодов всей системы, а не только ядра, и обязательно должен применяться при полном обновлении системы во избежание возникновения ошибок в работе системных утилит, зависящих от ядра (к примеру, ps, top или vmstat). После создания/изменения своего конфигурационного файла ядра перейдите в каталог /usr/srcn выполните команду сборки ядра следующим образом: # cd /usr/src # make buildkernel KERNCONF=GATE При этом в качестве значения для KERNCONF необходимо указать имя конфигурационного файла того ядра, которое необходимо собрать. Если сборка произошла без ошибок, выполните установку следующей командой: # make installkernel KERNCONF=GATE При этом для системы FreeBSD 5.0 и старше новое ядро будет записано в каталог /boot/kernel/ под именем kernel, и в том же каталоге будут созданы модули ядра. Старое ядро будет перемещено в каталог /boot/kernel. old/. В системе FreeBSD4,x новое ядро будет записано в файл /kernel, а файлы модулей ядра— в каталог /modules. Старое ядро будет сохранено в файле /kernel.old, а модули ядра, соответственно, перемещены в каталог /modules . old.
Загрузка альтернативного ядра 335 После перезагрузки системы будет использоваться новое ядро. Обращаем особое внимание на возможные проблемы при загрузке нового ядра. В случае их возникновения есть возможность зафузить старое ядро. Подробнее об этом — в разделе "Загрузка альтернативного ядра" данной главы. Создание файлов устройств Данный вопрос касается только тех версий операционной системы, которые не используют технологию devf s, позволяющую автоматически и прозрачно для пользователя создавать файлы устройств. Технология devf s появилась только в FreeBSD 5.O. Итак, для правильной работы системы с устройствами недостаточно просто включить их в конфигурационный файл ядра. Практически для всех устройств в каталоге /dev должен находиться специальный node-файл, который служит связующим звеном между приложениями и ядром. Для создания таких файлов нельзя просто воспользоваться любой утилитой, наподобие touch. В том же каталоге находится специальный сценарий MAKEDEV, который и используется для создания всех файлов устройств. Первый раз данный сценарий автоматически запускается на выполнение еще во время установки системы для всех устройств, включенных в ядро GENERIC. В дальнейшем наличие необходимого файла в каталоге /dev и запуск его на выполнение придется контролировать самому. Как же пользоваться сценарием MAKEDEV и как задавать имя создаваемого файла? Предположим, в ядро следующей строкой была добавлена поддержка звуковой карты: device snd После установки нового ядра необходимо проверить наличие необходимых файлов в каталоге /dev, и, если их там нет, воспользоваться следующей командой для их создания: # cd /dev # sh ./MAKEDEV sndO Эта же процедура должна выполняться для любого другого типа устройств, которые были впервые добавлены в ядро. Существует более простой способ создания файлов устройств. Если точное имя файла устройства неизвестно, то просто выполните команду: # cd /dev # sh ./MAKEDEV В таком случае сценарий MAKEDEV сам определит и создаст файлы для всех устройств, поддерживаемых текущим ядром. Обращаем внимание на то, что вы никогда не найдете и не сможете создать файлы в каталоге /dev для таких устройств как сетевые карты или псевдоустройства РРР и SLIP. Это объясняется тем, что только операционная система может иметь доступ к упомянутым типам устройств, и они взаимодействуют по особому принципу. ЗАГРУЗКА АЛЬТЕРНАТИВНОГО ЯДРА В случае возникновения непредвиденных ситуаций во время зафузки нового ядра (например, возникает ошибка "Kernel panic" или же система не может обнаружить присутствующее устройство) можно вернуть систему в стабильное работоспособное состояние, бывшее до установки новой версии ядра. Об этом вкратце рассказывалось в первой части книги, но считаем необходимым напомнить процесс зафузки альтернативного I (старого) файла ядра еще раз.
336 Глава 10. Настройка ядра системы Итак, во время десятисекундного ожидания загрузчиком прерывания выполнена загрузки ядра нажмите любую клавишу, кроме <Enter>, после чего введите командуй* грузки файла ядра и всех модулей unload. Затем можно ввести команду boot /boot/kernel. old/kernel для загрузки предыдущего файла ядра (для систем выше FreeBSD 5.0) или boot /kernel. old (для систем FreeBSD 4.x). ВНИМАНИЕ! Всегда храните как минимум одну копию рабочего ядра. Может случиться, что после неудачной сборки ядра вы снова попытаетесь собрать новое ядро, не сохранив файлы рабочего в данный момент ядра. Это приведет к тому, что при повторной неудачной сборке и установке фактически исчезнет возможность восстановить рабочее состояние системы, поскольку предыдущее (НЕРАБОЧЕЕ!!!) ядро kernel будет записано как kernel.old поверх старого рабочего, а новое нерабочее будет установлено как kernel. Следствие — полная переустановка системы. В системе FreeBSD 5.0 и старше создать копию рабочего ядра kernel довольно просто. Выполните следующие команды: # cd /boot # ср -R kernel kernel.good Теперь у вас всегда будет под рукой как минимум одно рабочее ядро, воспользоваться которым можно в любой момент через загрузчик, введя команду unload и затем— boot /boot/kernel .good/kernel. Для полного возврата работоспособного ядра на место неработоспособного воспользуйтесь командой: # cd /boot # mv kernel.good kernel # cp -R kernel kernel.good В системах FreeBSD 4.x для копирования работоспособного файла используют следующую команду: # cd / # ср kernel kernel.good # ср -R modules modules.good а для восстановления работоспособного ядра следующую последовательность команд: # cd / tt chflags noschg kernel # cp kernel.good kernel # chflags schg kernel He забывайте также о восстановлении модулей ядра, если такая процедура понадобится. ЗАГРУЗКА И ВЫГРУЗКА МОДУЛЕЙ ЯДРА Нередко бывает так, что невозможно определить, какое устройство необходимо включить в конфигурацию ядра, или же требуется быстро подключить устройство, которое не было включено в ядро. Как упоминалось ранее, с выходом новых версий операционной системы FreeBSD ядро все более и более приобретает модульную структуру. При этом одни модули можно загружать только на этапе загрузки системы, а другие — запускать вручную, работая в системе. Для загрузки модуля ядра используется простая команда kldload. В качестве параметра этой команде необходимо передать имя файла того модуля, который необходн-
Загрузка и выгрузка модулей ядра 337 ио запустить. Список доступных модулей можно просмотреть в каталоге /boot/kernel для систем FreeBSD 5.0 и старше. Для FreeBSD 4 список файлов моду- гей можно просмотреть в каталоге /modules. Однако прежде, чем попытаться загрузить желаемый модуль, удостоверьтесь, что он уже не запущен. Для этого используется команда kldstat: У kldstat Id Refs Address Size 1 7 0xc0400000 394954 2 1 0xclb43000 4000 3 1 0xclb5a000 15000 Name kernel logo_saver.ko linux.ko Попробуем запустить модуль snd_sfc>16 и просмотреть, как изменился список: У kldload snd_sbl6 У kldstat Id Refs Address Size 1 11 0xc0400000 394954 2 1 0xclb43000 4000 3 1 0xclb5a000 15000 6 1 0xcle7e000 4000 7 1 0xcle8b000 4000 Name kernel logo_saver.ko linux.ko snd_sbl6.ko snd sbc.ko Читатель, наверное, заметил, что кроме snd_sbl6.ko запустился модуль snd_sbc. ko, требуемый для первого. Для выгрузки данного модуля используйте команду kldunload: У kldunload snd_sbl6 У kldstat Id Refs Address Size 1 7 0xc0400000 394954 2 1 0xclb43000 4000 3 1 0xclb5a000 15000 Name kernel logo_saver.ko linux.ko Загружая и выгружая таким способом различные модули, можно подобрать необходимый модуль для нового устройства, не поддерживаемого текущим ядром. Естественно, что постоянно загружать найденный модуль вручную неудобно и нелогично. Для автоматической загрузки необходимых модулей во время загрузки системы без перекомпиляции ядра необходимо добавить следующую строку в файл /boot/loader. conf: snd_sbl6_load="YES" Список возможных команд для размещения в данном файле находится в файле /boot/defaults/loader.conf. В нем можно найти много других опций, управляющих процессом загрузки ядра и системы в целом, а также позволяющих оптимизировать работу системы.
338 Глава 11. Поддержка системы FreeBSD ГЛАВА 11. ПОДДЕРЖКА СИСТЕМЫ FREEBSD Любая операционная система, чтобы не потерять пользователей и доверие, должна раз* виваться. Кто же будет работать в системе, которая имеет серьезную брешь в безопасности, и проблема никогда не будет разрешена? Именно по этой причине выходят новые версии, и применяются файлы исправлений. Рынок операционных систем переполнен, однако, несмотря на это, с каждым годок появляется все больше и больше различных модифицированных версий, разработка! поддержка которых практически не осуществляется. Многие проекты "умирают", таа' не выпустив следующую версию. Для конечного пользователя такие системы предст» ляют собой некое подобие дешевого "плюшевого мишки", купленного в магазинчике во дворе маленькому ребенку — только чтобы не плакал. Этим "плюшевым мишкой" малыш поиграет несколько дней, потом оторвет ушко, затем глазик отпадет, а починип некому. И попадает мишка в корзину для мусора— вчера был, а сегодня его нет, и никто не вспомнит. Смешно наблюдать такую же ситуацию на рынке систем с открытии кодом. Сколько раз мы слышали об отчаянных энтузиастах, взявшихся за изменение!* кой-то системы и наделавших много шума в уважаемых газетах и журналах? Вот еще немного, и мир увидит "универсальную" систему... А ее все нет. И скажем больше: w будет никогда. Что же действительно должно иметь значение и высокую оценку у пользователей! Красивый интерфейс? Поддержка большинства устройств? Громкое имя? Отчасти эти имеет значение — в различных ситуациях по-своему. Но ведь главное — это поддержи, развитие, обновление, повышение безопасности и отказоустойчивости. Именно такие операционные системы заслужили свое почетное место среди других, и их имена гордо звучат на устах большинства: Solaris, OpenBSD, NetBSD, Linux Debian, Linux Slackwaa FreeBSD, Windows NT/2000... Операционная система, претендующая на популярность, должна иметь удобные средства исправления и обновления, средства расширения своей функциональное™. Именно поддержке системы FreeBSD в актуальном состоянии и посвящена эта глава. Мы затронем вопрос обновления до наиболее последней или безопасной версии. Дя этого, в первую очередь, необходимо рассмотреть философию развития FreeBSD, которая для многих людей до сих пор остается загадкой. ВЕТВИ СИСТЕМЫ Проект FreeBSD не стоит на месте. Каждый день в нем происходят изменения. Кавдй день тысячи программистов по всему миру совершенствуют ее. И любой пользовазд может отслеживать все производимые изменения, так как они в любой момент оби» доступны и могут быть загружены. Какой бы ни была версия системы FreeBSD, для нее всегда существует три разят» ных варианта (ветви) состояния: RELEASE, STABLE и CURRENT. Версия системы обозначается некоторым номером (например, FreeBSD 5.4), а вариант добавляется каксуф- фикс (например, FreeBSD 6.0 STABLE). Зачем такое разделение? Чем эти варианты отличаются друг от друга, и какую щ\ сию лучше использовать? В общих чертах ответ довольно прост. В первую очередь,^
Ветви системы 339 шествует ветвь CURRENT, которая предназначена, по большей части, для разработчике. Когда она становится стабильной работоспособной версией, ей присваивается ста- iyc STABLE. Наиболее стабильный вариант системы, в котором исправлены практически все ошибки и недоработки, — это RELEASE. Этот вариант "замораживается" и распростра- иется как продуктивная (рекомендуемая к использованию) версия системы на CD/DVD. Последующие доработки RELEASE также называются STABLE, так как сам RELEASE не может быть изменен. Обратите внимание на то, что на работающих серверах рекомендуется использовать только вариант системы RELEASE, и пусть читателя не вводит в заблуждение суффикс STABLE — данная версия практически постоянно подвергается изменению (в некоторых случаях — даже больше, чем CURRENT). 1А ЗАМЕТКУ. [рабочих серверах, где требуется стабильная работа системы, используйте толь- ю релизы (RELEASE). Исходные тексты системы на таких компьютерах также сле- jjyeT обновлять до состояния RELEASE. Это позволит свести к нулю риск неработоспособности сервера после обновления. Рассмотрим ветви разработки CURRENT и STABLE подробнее. CURRENT Версии системы FreeBSD-CURRENT — это самые последние рабочие версии исходных текстов FreeBSD, содержащие функциональность, реализованную впервые. Фактически, в данный код включаются незаконченные работы, а также экспериментальные изменения и промежуточные механизмы, которые могут отсутствовать в окончательном официальном релизе системы. Тот, кто хочет использовать версию CURRENT, загружая последние изменения в исходных кодах и компилируя систему, должен быть готов к проявлению сбоев, поскольку никто не гарантирует, что версия CURRENT находится в работоспособном состоянии. Для того чтобы определиться, подходит версия CURRENT или нет, перечислим те фуппы пользователей, которым будет интересно ее использование: • участники проекта FreeBSD, которые постоянно работают над некоторой частью исходных текстов и для которых работа над версией CURRENT является обязанностью; • тестеры текущей версии системы, которые находят и исправляют проблемы в коде для ее более-менее нормальной работы; к данной группе относятся также лица, предоставляющие идеи по развитию проекта и патчи с реализацией предлагаемых возможностей; другие заинтересованные пользователи, которые просто хотят знать о текущем состоянии разработок и иметь доступ к исходным текстам. В некоторых случаях они могут дать свои рекомендации по развитию проекта. При этом следует не забывать, что вариант FreeBSD-CURRENT не должен использоваться на рабочих машинах или серверах, так как, наряду с нововведениями, которые, возможно, кому-то очень сильно нужны, присутствует огромное количество ошибок (и никто не даст гарантии, что вы с ними не столкнетесь, а вероятность такого столкновения довольно высока). Не используйте данную версию в том случае, когда в версии вашей системы была обнаружена ошибка, от которой вы "страдаете", и она была исправней в CURRENT-версии. При использовании текущей разрабатываемой версии не следует надеяться на по- нощь и консультации. Разрабатываемая версия не подлежит поддержке, и консульта-
340 Глава 11. Поддержка системы FreeBSD ции, как правило, не проводятся (если вы не один из официальных разработчиков). Есй вы хотите получать помощь и поддержку, используйте официальный релиз. Тот, кто решится на использование версии CURRENT, должен, во-первых, подписаться на список рассылки f reeipsd-current и cvs-all (причем, это — не проси рекомендация, а обязательное условие). Во-вторых, необходимо загружать полноста все изменения в исходных текстах системы, а не отдельную часть, поскольку много части исходного кода зависимы от других обновлений в других частях исходных текстов системы. STABLE Версия FreeBSD-STABLE является ветвью разработки, из которой позже формируют официальные релизы. В нее вносятся только те изменения, которые были ранее внесены и протестированы в CURRENT. Но это не означает, что данная версия системы m содержит ошибок, поскольку она все еще находится в процессе разработки и не может быть использована как продуктивная. Рассмотрим, кому же нужен (или не нужен) вариант STABLE. Тому, кто принимает участие в проекте FreeBSD (в частности, относительно выпуска нового релиза системы), необходимо отслеживать именно FreeBSD-STABLE. При этом следует заметить, что от- слеживать исправления, имеющие отношение к безопасности, не обязательно. Для данного случая предпочтительнее использовать бюллетени по безопасности для текущее версии системы, которые постоянно появляются и описывают решение проблем с безопасностью. Также следует не забывать, что пользователей STABLE-варианта намного больше, чем CURRENT. Это приводит к постоянному обнаружению ошибок, что влечет за собой более частое изменение исходных текстов для данной версии. Исходя из вышесказанного, использование FreeBSD-STABLE на рабочих сервера! не рекомендуется, так же как и использование версии CURRENT. В заключение опять подведем итог: как системный администратор вы должны помнить, что на рабочих машинах и серверах следует использовать только официальную версию RELEASE. При обновлении системы до новой версии рекомендуется использовать диск с релизом и бинарное обновление системы — это наиболее безопасный и надежный способ. Мы же рассмотрим обновление системы из исходных текстов. ОБНОВЛЕНИЕ СИСТЕМЫ Обновление системы всегда содержит долю риска. Наиболее простой и безопасный способ обновления системы — от релиза к релизу с использованием компакт-диска через расположенный на нем sysinstall. Это и есть бинарное обновление системы, которое протекает наиболее безболезненно. Вся процедура обновления сопровождается подсказками и комментариями. Обратите внимание на то, что необходимо использовать не sysinstall установленной системы, а запуститься с компакт-диска и выполнять бинарное обновление уже с него. Обновление с использованием исходных кодов несколько сложнее и не всегда завершается успешно. Приблизительно, обновление системы из исходных текстов заключается в обновлении самих исходных текстов и выполнении следующей последовательности команд: # make buildworld # make buildkernel # make installkernel # reboot Затем следует загрузка в однопользовательском режиме с последующим выполнением команд:
Обновление системы 341 # mergemaster -p it make installworld it mergemaster # reboot Данный пример установки несколько утрирован и не всегда может выглядеть именно так. Это, скажем так, — взгляд на процесс обновления системы, представляющий процесс установки в общих чертах и позволяющий начинающему пользователю сориентироваться, а специалисту — вспомнить общий план. Далее мы рассмотрим каждый шаг вотдельности с учетом возможных ошибок и проблем, а также описанием их решения. Синхронизация кода Разработчики системы создали несколько способов синхронизации файлов с исходными кодами системы и самыми последними версиями исходных кодов для любой версии FreeBSD. К основным способам синхронизации относятся СТМ, анонимный CVS и CVSup. Все они имеют свои преимущества и недостатки, но наиболее удобным, простым и безопасным методом является CVSup, который мы и рассмотрим. О том, как установить и использовать систему CVSup было рассмотрено ранее в главе 9, посвященной установке дополнительного программного обеспечения. Но при этом не была рассмотрена система именования различных версий системы, так как порты независимы от версии. При синхронизации же исходных файлов системы именование версий в контексте CVSup наиболее важно, поскольку мы должны заранее четко определить, до какой версии будем обновлять систему, и получить исходные файлы именно для нее. Рассмотрим этот вопрос более подробно. Дескрипторы RELENG Для указания версии исходных файлов системы в конфигурационном файле системы CVSup используются специальные дескрипторы. Если для набора портов для этого использовалась точка ".", указывающая на самое последнее состояние, то для исходных файлов используются дескрипторы, начинающиеся с префикса RELENG_. ЖДЕНИЮ. Указание точки *.' в качестве дескриптора для нвбораисходных текстов позволяет указать основную ветвь разработки, называемую FreeBSD-CURRENT. После RELENG_ указывается номер версии системы и, возможно,— суффикс RELEASE. Указание суффикса RELEASE позволяет синхронизировать исходные тексты системы до того состояния, в котором они распространяются с продуктивной версией системы и для каждой версии имеют неизменное состояние ("заморожены"). В качестве примера дескрипторов для релизов можно привести следующие: • RELENG_5_4_0_RELEASE — дескриптор для FreeBSD 5.4; ■ RELENG_4_11_0_RELEASE — дескриптор для FreeBSD 4.11; ■ RELENG_3_5_0_RELEASE — дескриптор для FreeBSD-3.5. Для указания промежуточного (STABLE) состояния исходных кодов системы необходимо опустить суффикс RELEASE и последнюю цифру версии. К тому же, внекоторых случаях можно опустить и вторую цифру, что позволяет привести исходные файлы системы при синхронизации к самой последней STABLE-версии. Примерами дескрипторов могут служить следующие: • RELENG_6 — дескриптор для FreeBSD 6.X, известной как FreeBSD 6-STABLE; • RELENG_5 — дескриптор ветви разработки FreeBSD 5.X, известной как FreeBSD 5-STABLE;
342 Глава 11. Поддержка системы FreeBSD RELENG54 — дескриптор для FreeBSD 5.4, используемый только для испра ний безопасности и других критических исправлений в релизе 5.4; RELENG411 — дескриптор для релиза FreeBSD 4.11, используемый только и\ исправлений безопасности и других критических исправлений в релизе 4.11. Процесс синхронизации Итак, выбрав необходимый релиз можно приступать к настройке системы CVSupa синхронизацию исходных текстов. Исходные тексты хранятся в каталоге /usr/src,! доступны в том случае, если были установлены из дистрибутива. Если исходные текста не установлены, ничего страшного — система CVSup загрузит все сама. Единственные неприятный момент — это объем загруженной информации. Для его уменьшения рек» мендуется первоначально установить дерево исходных текстов из дистрибутивного № точника. Второй пункт — настройка конфигурационного файла для CVSup. Как упомни» лось ранее, в системе присутствуют файлы примеров настройки. Проще всего скопировать один из них (обычно используется файл stable-supf ile) в каталог /etc и олтл- дактировать в соответствии со своими запросами. Так и сделаем: # ср /usr/share/examples/cvsup/stable-supfile /etc Приведем файл /etc/stable-supf ile к следующему виду: *default host=cvsup3.ua.FreeBSD.org ♦default base=/var/db ♦default prefix=/usr ♦default release=cvs tag=RELENG_6 ♦default delete use-rel-suffix ♦default compress src-all При этом не забудьте установить в поле *default host= предпочтительный сервер с исходными текстами, а в поле *default release=cvs tag=— правильны!! дескриптор версии системы в конкретном случае. Строка src-all позволяет указан: загружать или синхронизировать все дерево исходных текстов системы, (другие строки позволяют загрузить отдельные компоненты, которые присутствуют в данном файле до его редактирования). ВНИМАНИЕ! Несмотря на возможностьЩШШь^ттопьюч такая проф дура не рекомендуется. Как правило; полная пересборка системы в. этом случае если и возможна, то вызовет проблемы в работе, вплоть до потери информации Выполнив следующую команду, получаем исходные тексты той версии, которую указали с помощью соответствующего дескриптора: # cvsup -g /etc/stable-supfile Connected to cvsup3.ua.FreeBSD.org Updating collection src-all/cvs ( ... ) Finished successfully Кстати, если дескриптор был указан неверно (точнее, отсутствует), то может возникнуть ситуация, когда все дерево исходных текстов системы будет просто удалено. Можно использовать одну и ту же команду для обновления как исходных текстов, так и дерева портов. Для этого внесем изменения в файл /etc/make, conf, а точнее, добавим следующие строки:
Обновление системы 343 # CVSup SUP_UPDATE= yes SUPFLAGS= -g -L 2 SUPHOST= cvsup3.ua.FreeBSD.org SUPFILE= /etc/stable-supfile PORTSSUPFILE= /etc/ports-supfile Теперь для обновления дерева исходных файлов системы достаточно перейти вкаталог /usr/src и выполнить команду make с целью update: # cd /usr/src It make update >» Running /usr/local/bin/cvsup Parsing supfile "/etc/cvsupfile" Connecting to cvsup3.ua.FreeBSD.org Connected to cvsup3.ua.FreeBSD.org Server software version: SNAP_16_lh Negotiating file attribute support Exchanging collection information Establishing multiplexed-mode data connection Running Updating collection src-all/cvs { ... } Можно также перейти в каталог /usr/ports и выполнить ту же команду make update. 1> выполнения обновления дерева'Йсхрдных текстовое помощью CVSup необходимо иметь настроенное соединение.с Internet. Настройка подключения к сети опи- ^в^етьей .части книги.;.,,..;,. .. ,* Напоминаем, что обновлять системные файлы до некоторой версии релиза, как и саму систему с таким набором исходных текстов можно только один раз. Второй раз обновлять смысла не имеет, так как релиз — это "замороженная" версия. Для более частого обновления до выхода следующего официального релиза рекомендуется использо- игь текущую стабильную версию для данной версии системы. Например, если у уста- вовлена система версии FreeBSD 5.4, то использовать рекомендуется дескриптор RELENG_5_4 до выхода FreeBSD 5.5 RELEASE. С выходом новой версии системы FreeBSD 5.5 можно будет один раз обновить исходные тексты с помощью дескриптора RELENG_5_5_0_RELEASE с последующим обновлением системы, а затем перейти к использованию дескриптора RELENG_5_5. Стоит отметить, что упростить процесс обновления можно еще и за счет добавления команды обновления в список запланированных еженедельных заданий. Конечно, можно обновлять и ежедневно, но это, как правило, необходимо только в том случае, если вы являетесь разработчиком или тестером для ветви CURRENT. ФаЙЛ /usr/src/UPDATING После обновления исходных текстов и прежде, чем, что-либо делать дальше, прочтите файл /usr/src/UPDATING. В нем содержится очень важная информация о воз- иожных проблемах, а также указан порядок запуска определенных команд. Информация в этом файле представлена в хронологическом порядке и содержит важные изменения «процессе сборки. Как минимум, необходимо прочитать всю информацию, начиная стой даты, когда в последний раз производилось полное обновление системы.
344 Глава 11. Поддержка системы FreeBSD Как правило, в файле /usr/src/UPDATING содержатся сведения о выполняемых действиях после обновления системы (например, как правильно внести измененм в конфигурационные файлы из каталога /etc). Подготовка к обновлению системы Итак, дерево исходных текстов синхронизировано, и файл UPDATING изучен. Теперь следует выполнить несколько рекомендуемых и обязательных операций. Во- первых, — создать резервные копии наиболее важных файлов и каталогов в системе, Если речь идет о сервере предприятия, то необходимо иметь резервный сервер, хранящий полную копию пользовательских данных. Наиболее простым же вариантом будет перенос всей важной информации на магнитные и оптические носители. Не забывайте, что десять удачных процедур обновления системы еще не говорят о том, что все будет хорошо и на одиннадцатый раз. Также держите при себе загрузочную дискету или компакт-диск. В случае, когда система отказывается запуститься после обновления, они могут стать незаменимыми помощниками. Перед обновлением системы до версий CURRENT или STABLE следует обязательно подписаться на список рассылки. Помните: никто не будет отвечать на вопросы, которые уже были рассмотрены раньше, или решать проблемы, если было заранее известно, что сборка системы в данном случае приведет к сбою. Да, и запомните: никогда не пользуйтесь командой make world. В последних версиях системы эта команда убрана, и потому с ее помощью нельзя выполнить никаких действий по обновлению системы. Вместо этого пользователь получает сообщение об ошибке с напоминанием о небезопасности использования такого способа, а также информацией о том, как обойти данное ограничение и все-таки обновить систему с помощью команды make world. Кто бы и где бы ни говорил, что использовать эту команду безопасно, не обращайте на это внимания и применяйте более надежный способ, описанный здесь и в файле UPDATING (последний вариант наиболее правильный, поскольку нет никаких гарантий, что через год порядок обновления системы не изменится). Мы рассмотрели операции, рекомендуемые перед обновлением. Теперь перейдем к более важным вопросу подготовки системы перед обновлением, которые при определенных условиях могут оказаться обязательными. Настройки в файле /etc/make. conf В файле /etc/make.conf содержатся настройки, управляющие поведением утилиты make в том или ином случае использования. Благодаря установке некоторых опций в данном файле, можно значительно ускорить работу обновленной системы. Большинство опций (в закомментированном состоянии) можно найти в файле /usr/share/ examples/etc/make, conf, а для FreeBSD 4.X— в файле /etc/defaults/ make. conf. Для того чтобы воспользоваться данными опциями, при следующей сборке системы необходимо их определить в файле /etc/make. conf, сняв комментарии. Обычно устанавливают следующие опции (в различных версиях системы имена параметров могут отличаться): CFLAGS= -О -pipe NO_PROFILE= true Помимо этого, можно также установить следующие три опции: CPUTYPE?= pentium2 NO_GAMES= true NO_INET6= true Первая позволяет указать тип используемого в системе процессора для оптимизации кода под него. Известные типы процессоров перечислены в файле make.conf.
Обновление системы 345 Вторая опция позволяет отключить компиляцию и установку набора приложений для италога /usr/games, а третья — отключить компиляцию и установку утилит и биб- шотек для работы с IPv6, если в такой возможности нет необходимости. Проверка совместимости файлов из каталога /etc Данная операция, хотя и редко, но все же бывает необходима. Как известно, ката- юг /etc содержит наиболее важную часть конфигурации системы. Кроме того, в нем находятся сценарии, запускаемые во время старта системы и приводящие ее в полное рабочее состояние. Некоторые из конфигурационных файлов и сценариев изменяются ог версии к версии. При этом установка системы в некоторых случаях не может быть завершена, если некоторые их этих файлов не были изменены. К таким файлам следует, «первую очередь, отнести /etc/group и /etc/passwd. В первом хранится список групп, а во втором — список пользователей. Если данные файлы не приведены в должное состояние, то на этапе установки некоторые операции не смогут быть выполнены, и процесс установки прерывается {сообщением об ошибке. К примеру, в новой версии системы появилась новая служба, работающая от имени некоторого псевдопользователя, который ранее в системе отсутствовал. Во время установки системы может быть предпринята попытка создать структуру каталогов для данной службы, которая окажется неудачной, так как каталоги должны принадлежать псевдопользователю, отсутствующему на момент установки. Возможно, у читателя возник вопрос: "Почему программа обновления системы не вносит изменения в конфигурационные файлы автоматически?". Дело в том, что мы выполняем обновление системы, а не установку заново — конфигурация не должна быть затронута. Как же выйти из этой неприятной ситуации? Выход довольно прост: сравните список групп из файла /usr/src/etc/group со списком групп в текущем файле групп. Если в новом файле присутствуют группы, которых нет у вас, скопируйте соответствующие строки. Неприятной ситуацией может оказаться изменение названий некоторых групп, что может привести к путанице, поэтому при сравнении обращайте особое внимание на номера групп. Иногда может потребоваться добавление новых пользователей, но такие случаи файне редки. К тому же, в руках пользователей есть очень удобная утилита itergemaster, позволяющая выполнять сравнение необходимых файлов и безболезненно изменять их содержимое для успешного обновления системы. Для того чтобы сравнить необходимые файлы до начала установки, необходимо вызвать ее с опцией -р: # mergemaster -p В случае очень старой системы (версии меньше FreeBSD 4.6), утилита Biergemaster может не поддерживать опцию -р. Тогда воспользуйтесь следующей командой: # /usr/src/usr.sbin/mergemaster/mergemaster.sh -p Данная утилита сравнит необходимые файлы и при необходимости запросит внести вменения. Рекомендации по переходу в однопользовательский режим В системе, как правило, одновременно работает много пользователей, запущены различные процессы. Выполнение компиляции системы в однопользовательском режиме позволит освободить ресурсы, что повысит скорость компиляции. Кроме того, следует не забывать, что обновление системы затрагивает множество системных файлов, файлы библиотек и т.д., и потому запуск обновления системы, находящейся в состоянии активного обслуживания запросов пользователей и процессов, может иметь пагубные последствия. В связи с этим, прежде, чем начать процесс компиляции файлов или, в I крайнем случае, — перед обновлением, перезапустите систему и войдите в однопользо- I вательский режим.
346 Глава 11. Поддержка системы FreeBSD Для быстрого перехода в однопользовательский режим без перезагрузки можно в полнить следующую команду от имени пользователя root: # shutdown now Если вы решили полностью перезагрузить систему (это требуется после установи нового ядра), используйте команду boot -s в приглашении загрузчика, а после вх<м в систему обязательно выполните следующие команды: # fsck -p # mount -u / # mount -a -t ufs # swapon -a Первая команда выполняет проверку файловых систем, вторая — перемонтируй файловую систему в режиме чтения/записи. Следующие команды необходимы для мои тирования всех файловых систем формата UFS из файла /etc/fstab и включен» файла подкачки. Компиляция системы Компиляция исходных файлов системы перед обновлением — наиболее продолжи тельная операция. В зависимости от различных факторов, на различных моделях кш пьютеров при использовании исходных текстов различных версий компиляция можп занимать от одного часа до 5-8 часов. Кроме компиляции исходных текстов самой сю темы, потребуется выполнить компиляцию и установку нового ядра. Очистка каталога Если система собирается впервые из исходных текстов, то данный подраздел меда пропустить, в противном же случае на него следует обратить особое внимание. При ви полнении команды make world все объектные файлы размещаются в каталогах внутри директории /usr/obj, структура которой напоминает структуру каталога /usr/src Так вот, все файлы из этого каталога необходимо удалить во избежание проблем щ последующей сборке системы. Более того, это также позволит ускорить процесс сборм системы. Удаление файлов из директории /usr/obj может протекать не очень гладко, по- скольку для некоторых их них могут быть установлены флаги системной неизменносл scsh, и для их удаления сперва необходимо снять этот флаг. Для удаления таких файлов используется следующая последовательность команд: # cd /usr/obj # chflags -R noschg * # rm -rf * Для систем, работающих на уровне защиты securelevel выше 0 необходимо временно понизить данный уровень или же перезапустить систему в однопользовательском режиме. Выполнение команды make buildworld Для компиляции исходных текстов первым делом требуется перейти в каталог /usr/src и выполнить команду компиляции: # cd /usr/src # make buildworld При вызове команды make ей, кроме цели buildworld, можно передать некоторые параметры и установить переменные. К примеру, для ускорения процесса сборки
Обновление системы 347 файлов за счет запуска нескольких процессов сборки используется следующий вызов (пример для четырех процессов): I make -j4 buildworld При этом данный вызов будет иметь успех не только в многопроцессорных, но и iоднопроцессорных системах. В некоторых случаях сборка системы с использованием параллельных процессов может завершиться неудачно, но такая ситуация очень маловероятна. Для установки некоторых переменных, имеющих значение на этапе выполнения команды make, кроме их определения в файле /etc/make, conf, можно воспользоваться следующим форматом вызова (учтен также и вызов четырех параллельных процессов компиляции): « make -j4 -DNO_PROFILE=true buildworld В данном случае мы отключили компиляцию библиотеки профилирования. Процесс компиляции рекурсивно проходит по подкаталогам /usr/src, собирая размещенные в них исходные тексты и сохраняя результат сборки в каталоге /usr/obj. В том случае, если во время компиляции возникнет ошибка, обратите внимание на ее код. Коду ошибки 11 обычно соответствует проблема с оборудованием. Завершение утилиты с кодом 1, скорее всего, указывает на ошибку в исходных текстах. Попытайтесь удалить содержимое каталога /usr/obj вручную и запустить процесс заново. При получении той же ошибки, опять синхронизируйте исходные тексты (возможно, они были синхронизированы в момент изменения дерева на сервере). В крайнем случае, просмотрите список рассылки: не описана ли в нем данная ситуация. Сохранение описания процесса сборки При обновлении системы рекомендуется сохранять всю информацию, выводимую на экран при выполнении команды make world. Это позволит просмотреть процесс сборки системы, и в случае необходимости обнаружить место ошибки. Подобные листинги могут пригодиться, когда для определения причины ошибок потребуется обратиться к другим специалистам. Для сохранения описания процесса сборки проще всего воспользоваться утилитой script, передав ей в качестве параметра имя файла для хранения. Утилита script позволяет перехватывать весь вывод на экран и записывать его в указанный файл. Запускать данную утилиту необходимо непосредственно перед тем, как переустанавливать систему и выходить из нее по окончании данной процедуры (или по мере обнаружения ошибки) с помощью команды exit: # script /var/log/makeworld-'date "+%Y-%m-%d"'.out Script started, output file is /var/log/makeworld-2005-12-19.out # make world ( .'.. ) # exit exit Script done, output file is /var/log/makeworld-2005-12-19.out He сохраняйте файл вывода в кэталбгё, к§го|)Ый: мЬйкет бьгть пёрейпйсай илиочйг (Цен при следующей перезагрузке' системы (например., "l tmp). Используйте дляэтого Домашний каталог пользователя root, каталог журнальных файлов /var/iog или каталог временных файлов /var/tmp..
348 Глава 11. Поддержка системы FreeBSD Обновление ядра После компиляции исходных текстов системы и до их установки отдельно потребуется компиляция и установка обновленного ядра. И это — не просто рекомендация, t в большинстве случаев — обязательное условие, без выполнения которого некоторые системные утилиты просто откажутся работать. К тому же, это позволит максимально оптимизировать систему в целом. Самый простой, безопасный и надежный способ — это компиляция и установка ядра GENERIC. Несмотря на то, что данное ядро может не поддерживать некоторые вида оборудования, оно в любом случае позволит запустить систему и пересобрать ядро с поддержкой необходимого оборудования позже. Итак, напомним, что процесс сборки ядра при сборке системы должен выполнятьм с использованием нового способа, а не традиционного (более подробная информации содержится в предыдущей главе). Для GENERIC воспользуйтесь следующей последовав тельностью команд (находясь в том же каталоге /usr/src): # make buildkernel # make installkernel или же: # make kernel Для сборки своего собственного ядра воспользуйтесь командами: # make buildkernel KER№ONF=MYKERNEL # make installkernel KERtiCO№=MYKERNEL где MYKERNEL соответствует имени конфигурационного файла ядра. Следует обратии особое внимание на то, что ядро, собранное таким способом, не гарантирует работоспособность системы. Если вы впервые собираете ядро, или же не совсем уверенны в правильности своих действий, рекомендуем совместить установку обновленного ядра GENERIC и своего. Для этого на системах старше FreeBSD 5.0 выполните следующую последовательность команд: # make kernel # ср -R /boot/kernel /boot/kernel.GENERIC # cp -R /boot/kernel.old /boot/kernel.PREV # make buildkernel KERNCONF=MYKERNEL # make installkernel KERNCONF=MYKERNEL Теперь в каталоге /boot/kernel .GENERIC всегда будет находиться резервна! копия обновленного ядра GENERIC для новой версии системы, в каталога /boot/kernel— последняя собранная и установленная, а в каталоге /boot/ kernel. PREV — текущая версия ядра, используемая в момент сборки системы (у* она-то точно рабочая). Более подробной настройка, компиляция и использование ядрз рассматривается в предыдущей главе. После сборки и установки новых файлов ядра необходимо перезагрузитьм в однопользовательский режим. Это необходимо как для проверки работоспособности, установленного файла ядра, так и для безболезненной установки новой версии системы, Перезапустите систему командой shutdown -r now и в момент паузы загрузчика нажмите любую клавишу, кроме <Enter>, для перехода в командный режим, после чего введите boot -s. Если система загрузилась удачно, то можно переходить к следующему этапу обновления системы. В противном случае попытайтесь загрузиться с использованием резервного ядра (если вы воспользовались описанной выше рекомендацией по установи нового ядра вместе с ядром GENERIC, попытайтесь загрузить систему! с использованием последнего). В крайнем случае, загрузите предыдущее работоспосо£'
Обновление системы 349 к ядро. Оно наверняка будет работать, поскольку до этого момента, кроме обновления цра, больше никаких изменений в систему внесено не было. При удачной загрузке можно переходить к следующему пункту, оставаясь в однопользовательском режиме (рекомендуется). Если во время подготовки к обновлению системы была пропущена команда mergemaster -p, то сейчас— самое время ее запустить. Важно также упомянуть, что запуск системы в однопользовательском режиме потребует ручного монтирования всех разделов и раздела для файла подкачки. Все ко- ианды, которые необходимо выполнить после запуска системы в однопользовательском режиме перед началом обновления, перечислены выше в подразделе "Рекомендации по переходу в однопользовательский режим". Установка системы Установка системы — этап простой и быстротечный, выполнение которого практически не вызывает проблем (особенно, если все предыдущие этапы были пройдены успешно). Итак, находясь в однопользовательском режиме, перейдите в каталог /usr/src и выполните команду установки: # cd /usr/src # make installworld Обратите внимание на то, что параметры, указываемые при компиляции системных файлов, необходимо также указать и при установке. Хотя это касается и не всех параметров. Например, параметр параллельной компиляции - j не может использоваться для команды make installworld. После этого все бинарные файлы системы и ядро должны быть совместимы и представляют собой новую версию системы. Единственное, что осталось сделать на этапе обновления системы — проверить соответствие конфигурационных файлов и при необходимости обновить их. Для этого опять-таки используется команда mergemaster. Обратите внимание на то, что пропуск выполнения команды mergemaster -p после компиляции исходных текстов может привести к невозможности полного обновления системы. При этом система может оказаться в неустойчивом состоянии, будучи обновленной частично, хотя, в принципе, и будет работоспособной. Выполнение mergemaster после обновления Установка новой версии системы (обновление) не изменяет ряд конфигурационных файлов, а в системе FreeBSD 4.x также необходимо изменить некоторые файлы устройств. Раньше процедура обновления конфигурационных файлов занимала очень много времени и требовала прекрасных знаний системы. Даже опытные администраторы допускали серьезные ошибки. Но с появлением сценария mergemaster все стало намного проще (хотя, конечно, от ошибок и сейчас никто не застрахован). Как бы там ни было, на всякий случай создайте полную копию каталога /etc в /etc. old, и только после этого приступайте к обновлению конфигурационных файлов и сценариев: # ср -R /etc /etc.old # mergemaster -i Обратите внимание на то, что теперь утилиту mergemaster следует запустить {параметром -i. В результате требуемые к обновлению конфигурационные файлы будут скопированы из набора исходных кодов в каталог /var/tmp/temproot, после чего
350 Глава 11. Поддержка системы FreeBSD будет выполнено пофайловое сравнение с содержимым каталога /etc и некоторым другими. Если будут найдены файлы с различиями, то утилита отобразит их перечет с помощью утилиты dif f, а в конце предложит выполнить одно из действий: удалил временный файл (текущий оставить без изменений), установить новый файл поверх те кущего (замена), объединить два файла по определенным критериям или же опять про смотреть различия в файлах. По умолчанию, вариант не выбран — все просто остаета как есть: в файл изменения не вносятся, а временная копия файла не удаляется. В случае, если будет выбрано объединение файлов, утилита mergemaster перехо дит в расширенный режим сравнения с помощью утилиты sdif f. При этом текущий файл будет отображен слева, а новый временный — справа. В зависимости от того, какую часть требуется оставить в новом объединенном файле (из текущего файла или и временного), пользователь выбирает соответствующую клавишу. Например, нажал* клавиши <1> позволит использовать левую часть вывода утилиты sdiff, а клавиш! <г> — правую. Нажатие клавиши <h> позволяет вывести справку по командам. По » вершении сравнения утилита позволяет просмотреть результирующий файл и запрашивает разрешение на его установку. По окончании сравнения файлов утилита запрашивает подтверждение на удаление каталога /var/tmp/temproot и всех файлов в нем. Выбор по умолчанию — не удалять указанный каталог (можно будет вернуться к сравнению файлов позже, если было проигнорировано внесение изменений в некоторьк файлы). В случае возникновения каких-либо проблем, помните, что у вас всегда есть резервная копия конфигурационных файлов в каталоге /etc. old. Завершающая перезагрузка системы После удачного завершения установки системы и сравнения файлов с использованием утилиты mergemaster можно перезапустить систему: # shutdown -r now Если читатель правильно следовал всем пунктам, описанным в данной главе, то перезагрузка должна пройти безболезненно. После загрузки системы убедитесь, что ва служебные сервисы удачно запустились, проверьте также правильность работы утилит top или ps. Выполните команду uname -s и удостоверьтесь, что у установлена корректная версия системы. Примите поздравления! Правда, не все так страшно, как казалось вначале?
ЧАСТЬ III РАБОТА В СЕТИ И БЕЗОПАСНОСТЬ СИСТЕМЫ Любая машина, выполняющая роль сервера, в конечном результате должна быть подключена к сети — как минимум, локальной. При этом обязательным условием интеграции в сеть станет повышение устойчивости к попыткам взлома. Кроме защиты сервера, необходимо также позаботиться о настройке сетевых сервисов, которые будут обслужишь клиентские запросы. В данной части книги будут раскрыты основные аспекты настройки сетевых приложений и общей безопасности системы при ее использовании «сетевой среде.
352 Глава 12. Настройка сетевой среды ГЛАВА 12. НАСТРОЙКА СЕТЕВОЙ СРЕДЫ Как правило, начинающим пользователям FreeBSD (как и любой другой UNIX подобной системы) довольно сложно разобраться во всех возможностях и последовательности настройки сетевой среды. В действительности же сложного очень мало: ва довольно просто, но этого "просто" очень много ©. Данная глава поможет разобратш в процессе начальной настройки сетевой среды (да-да, именно начальной), а также в работе с беспроводными технологиями (настройка клиента сети WI-FI и рабоч с Bluetooth) в системе FreeBSD. ПЕРВОНАЧАЛЬНАЯ НАСТРОЙКА СЕТИ Подготовка к настройке Для быстрой и правильной настройки сетевой среды необходимо заранее спланиро вать все этапы и определить необходимые параметры. Определитесь заранее, как минн- мум, со следующими параметрами: Аппаратные сетевые устройства, их количество и производитель (набор микросхем). Как правило, одной сетевой картой укомплектованы простые серверы или клиентские компьютеры. Большинство специфических хостов содержат два и более сетевых интерфейсов, реализуя таким образом различные специфические задачи маршрутизации, разделения на подсети, безопасности. Все сетевые устройства должны поддерживаться операционной системой на уровне ядра. Дл каждого из них существует некая аппаратная метка, которой сопоставлено иш в системе FreeBSD. Несколько различных, но подобных устройств могут носип одно имя (метку), например f хр (для большинства сетевых карт от Intel) или rl (сетевые карты с чипом от RealTek). Если в системе установлено несколько ода наковых сетевых карт, то метки отличаются числом в порядке обнаружения системой (порядок определяется физическим расположением на шине, поэтому всегда одинаков). Но даже если в системе только одно устройство, к метке добавда ется число 0. Имя машины. Каждый хост в сети должен иметь уникальное имя, которое желательно выбирать до установки системы. Любая машина, даже не содержащая физически ни одного сетевого устройства, имеет сетевое имя (если его не установив вручную, то оно будет определено как значение по умолчанию). Имя домена. Если компьютер будет работать в сети с настроенным сервером DNS, то необходимо определить, на каком уровне иерархии находится данныИ хост, и установить соответствие между именем и IP-адресом как в базе данньа DNS, так и на самом компьютере. Например, для машины mobile в домене altersys-ua.com полное имя DNS будет выглядеть как mobile.altersys ua.com. IP-адреса для всех сетевых интерфейсов. Для полноценной работы в сети (TCP/IP), каждая сетевая карта должна иметь как минимум один IP-адрес,
Первоначальная настройка сети 353 В противном случае, ее практическое использование невозможно и лишено смысла. Пример IP-адреса (IPv4): 192.168 . 0.1. • Маска подсети (в случае использования IPv4). При установке IP-адреса система пытается установить некое стандартное значение маски подсети (например, для IP-адреса класса С будет предложена маска класса С: 255.255.255.0). Если это значение не подходит, его можно изменить на этапе установки IP-адреса. ■ IP-адрес шлюза по умолчанию. Возможно, в вашей организации по некоторым причинам сеть разбита на подсети (как маской подсети, так и с помощью других методов). Для возможности связи с машинами в других подсетях необходимо указать шлюз, который будет заботиться о правильном перенаправлении пакетов машинам, находящимся вне данной сети. Это касается также и перенаправления трафика в сеть Internet. ■ IP-адреса всех серверов, необходимых для нормальной работы машины (серверы NIS, DNS, NFS, SMB, FTP, WWW и т.п.). Рассмотрим перечисленные параметры подробнее. Сетевые карты Обычно настройка сетевой среды начинается с определения количества сетевых гарт и настройки операционной среды на их использование в случае, если они не включены в ядро по умолчанию. Как известно, в ядро по умолчанию включены самые популярные и наиболее часто используемые устройства. Это касается и сетевых карт, поэто- иу, прежде всего, определите, тип и производителей установленных сетевых плат. Запишите модель и тип интерфейса (PCI, ISA или PCMCIA). Посмотрите, находятся ли они в списке поддерживаемого оборудования и включены ли в ядро по умолчанию для шией версии FreeBSD (от версии к версии список увеличивается, и несколько меняется состав устройств, включенных в ядро по умолчанию). Как правило, большинство сетевых карт — это платы PCI, поскольку этот стандарт сегодня наиболее популярен и ирост в настройке (шина выполняет автоматически настройку всех необходимых параметров, таких как IRQ, DMA и т.п.). Некоторые карты выпускаются в формате устройств PCMCIA, благодаря чему их можно использовать в портативных компьютерах. Если оказалось, что карта поддерживается, проверьте, включена ли она в ядро. Для й68-совместимых компьютеров путь к файлу ядра выглядит как /usr/src/sys/ i386/conf /GENERIC. Для систем FreeBSD версии до FreeBSD 5.0 RELEASE полный список всего поддерживаемого оборудования можно найти в файле /usr/src/sys/ i3B6/conf/LINT, а для версий старше FreeBSD 5.0 — в файле /usr/src/sys/ i3S6/conf/NOTES. Если точно не известно, какое именно имя подойдет для той или иной модели сете- юй карты, то можно воспользоваться справочным руководством. К примеру, для устройств rl такую информацию можно получить следующим образом: localsrvtt man rl RL(4) FreeBSD Kernel Interfaces Manual RL(4) NAME rl — RealTek 8129/8139 Fast Ethernet device driver SYNOPSIS device miibus device rl DESCRIPTION ( ... )
354 Глава 12. Настройка сетевой среды HARDWARE Adapters supported by the rl driver include: 'v о Accton "Cheetah" EN1207D (MPX 5030/5038; RealTek 8139 clone) \ о Allied Telesyn AT2550 о Allied Telesyn AT2500TX о Belkin F5D5000 о BUFFALO(Melco INC.) LPC-CB-CLX(CardBus) о Compaq HNE-300 о CompUSA no-name 10/100 PCI Ethernet NIC о Corega FEther CB-TXD о Corega FEtherll CB-TXD о D-Link DFE-530TX+ о D-Link DFE-538TX (same as 530+?) о D-Link DFE-690TXD о Edimax EP-4103DL CardBus о Encore ENL832-TX 10/100 M PCI о Farallon NetLINE 10/100 PCI о Genius GF100TXR, о GigaFast Ethernet EE100-AXP о КТХ-9130ТХ 10/100 Fast Ethernet о LevelOne FPC-0106TX о Longshine LCS-8038TX-R о NDC Communications NE100TX-E о Netronix Inc. EA-1210 NetEther 10/100 о Nortel Networks 10/100BaseTX о OvisLink LEF-8129TX о OvisLink LEF-8139TX о Peppercon AG ROL-F о Planex FNW-3800-TX о SMC EZ Card 10/100 PCI 1211-TX о SOHO(PRAGMATIC) UE-1211C Если сетевая карта популярна и имеет интерфейс PCI, то скорее всего, будет достаточно просто подключить ее к системе — и она будет успешно обнаружена и настроена. Если поддержка подключенной карты включена в ядро, то при загрузке системы отобразится примерно следующая информация: IncO: <PCNet/PCI Ethernet adapter> port 0xl080-0xl0ff irq 18 at device 17.0 on pciO IncO: Attaching PCNet/PCI Ethernet adapter IncO: [GIANT-LOCKED] IncO: Ethernet address: 00:0c:29:c7:4a:73 IncO: if_start running deferred for Giant IncO: PCnet-PCI v Как видно из этого примера, ядро удачно определило модель сетевой карты, В противном случае (если карта присутствует в списке поддерживаемого оборудования) существует два способа включить поддержку: Пересобрать ядро для постоянной статической поддержки драйвера сетево! карты. Возможно, потребуется указать дополнительные параметры. Обратите» к справочному руководству для конкретной карты. Загрузить модуль ядра сетевой карты. Для этого используется утилита kldload. Но заметим, что не для всех устройств имеется драйвер в виде модум. В любом случае, предпочтительней пересобрать ядро.
Первоначальная настройка сети 355 После того как новое ядро было пересобрано и установлено, нет необходимости издавать файл устройства. При этом даже в операционной системе FreeBSD 5.x (с ее поддержкой DEVFS), файл доступа к сетевой карте не появится. Файлы сетевых устройств по стандартам сетевого взаимодействия Беркли не нужны. Сетевые интерфейсы могут быть доступны только ядру! А что делать, если мы установили новую карту, перезапускаем систему и не видим, что она была обнаружена? В первую очередь, необходимо проверить, было ли пересобрано ядро для поддержки этой сетевой карты. Если карта присутствует в списке, то проверяем, не отключили ли мы некоторые параметры в BIOS (например, может быть отключено использование некоторого IRQ, необходимого для данной сетевой карты). Если и здесь все в порядке, то проверьте установки BIOS в настройках PnP (Plug-and-Play). В крайнем случае, может помочь подключение карты к другому интерфейсу (бывает и такое ©). Кроме того, возможно, просто не хватает свободного IRQ для нового устройства или же плата неработоспособна (проверьте ее на другой системе). Несколько слов о картах для шины ISA. Как правило, для ISA-карт необходимо задать вручную некоторые параметры. При этом, если в наличии две одинаковые карты, настройка займет довольно много времени, поскольку одну из этих карт придется заранее перенастроить с помощью перемычек или DOS-утилиты. В системе FreeBSD версий 5.x можно использовать дополнительные возможности по настройке устройств ISA. Это реализовано с помощью файла /boot/device.hints. В нем можно указать заранее, где система должна обнаружить устройство: hint.Inc.0.at="isa" hint.lnc.0.port="0x300" hint.Inc.0.irq="7" hint.Inc.0.drq="0" hint.lnc.1.at="isa" hint.Inc.1.port="0x280" hint.Inc.l.irq="10" Настройка интерфейсов. Использование ifconfig После того как интерфейс был обнаружен в системе, можно приступать к непосредственной его настройке для правильной работы в сети. Если интерфейс присутствовал в системе во время установки системы, то, скорее всего, все необходимые параметры уже были настроены. Но даже после того как система установлена, при добавлении нового сетевого устройства никто не мешает использовать программу /stand/ sysinstall. При этом есть одно очень важное "но": утилита sysinstall — не очень-то гибкое средство настройки, тем более что оно не позволяет сразу же увидеть результат изменений. Что еще хуже, иногда ее использование может очень сильно сбить предыдущие настройки (например, удалить псевдонимы). По этой причине удобнее использовать какие-либо специализированные утилиты и редактировать конфигурационные файлы системы вручную. Подобно тому как в Windows и других операционных системах существуют утилиты просмотра подробной информации о сетевых интерфейсах и их настройках, FreeBSD имеет мощные средства получения полной информации. Таким средством, в первую очередь, является утилита ifconfig. ifconfig (от "interface config")— это мощное средство просмотра и изменения сетевых настроек без перезагрузки системы. Для вывода списка сетевых интерфейсов системы и полной информации об их текущей настройке используется команда ifconfig -а как показано в листинге 12.1.
356 Глава 12. Настройка сетевой среды Листинг 12.1. Вызов команды ifconfig для получения подробной информации о сиЯ вых интерфейсах системы _2 т- ■ Щ localsrv# ifconfig -a I IncO: flags=108843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 I inet 192.168.0.2 netmask OxffffOOOO broadcast 192.168.255.255 I ether 00:0c:29:c8:0a:ee I lncl: flags=108843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 I inet 10.0.0.1 netmask OxffOOOOOO broadcast 10.255.255.255 I ether 00:0c:29:c8:0a:f8 I plipO: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 I loO: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 I inet 127.0.0.1 netmask OxffOOOOOO Рассмотрим подробно содержимое данного листинга. В первую очередь, обратик внимание на список отображенных устройств (используйте сокращенную команду ifconfig -1): IncO — первый сетевой интерфейс; lncl — второй сетевой интерфейс; pi ipO — сетевой интерфейс для TCP/IP поверх параллельного порта; 1о0 — виртуальный интерфейс сетевого замыкания (loopback). Как видим, каждый интерфейс имеет некое имя, состоящее из имени драйвера и порядкового номера (по обнаружению на шине при инициализации). Например, lncl- это вторая обнаруженная сетевая карта с драйвером Inc. Как правило, такой тип именования присущ BSD-системам, в то время как в Linux все интерфейсы именуются ш ethO, ethl и т.д. Для всех интерфейсов установлено некоторое количество флагов, информирующих о текущем состоянии. К примеру, флаг UP говорит о том, что интерфейс lncl в данный момент включен и находится в рабочем состоянии. В том случае, когда интерфейс отключен, эта же строка будет иметь следующий вид: # ifconfig -L lncl lncl: flags=108802<BROADCAST,SIMPLEX,MULTICAST^ mtu 1500 inet 10.0.0.1 netmask OxffOOOOOO broadcast 10.255.255.255 ether 00:0c:29:c8:0a:f8 Как видим, флаг UP отсутствует. Для включения и отключения интерфейса используются команды: # ifconfig lncl up # ifconfig lncl down Вместо lncl подставьте требуемое в вашем случае значение. Заметьте, что флаги отображается в верхнем регистре, а команды включения/отключения интерфейсов н^ обходимо вводить в нижнем (это касается также имен интерфейсов и опций). В том случае, если интерфейсу был назначен IP-адрес (например, inet 10.0.0.1), маска подсети (netmask OxffOOOOOO), широковещательный адрес (broadcast 10. 255 . 255.255), то при запуске системы он будет автоматически устанавливаться в состояние UP. Теперь перейдем к описанию непосредственной настройки интерфейсов на использование TCP/IP с помощью утилиты ifconfig. Напомним, что после перезапуска системы, все значения настроек будут сброшены. Обращаем внимание на то, что ifconfiq желательно использовать, находясь непосредственно за физической консолью (то есть, не через терминальную сессию ssh или telnet), поскольку любое неверное изменение сетевых параметров может привести к разрыву связи. Заметим также, что использование утилиты ifconfig возможно только с привилегиями пользователя root. После изме-
Первоначальная настройка сети 357 кния параметров и тестирования, в случае успеха внесите изменения в файл /etc/ re.conf, о чем речь пойдет чуть позже. Для установки или изменения IP-адреса, воспользуйтесь следующей командой: # ifconfig lncl 10.0.1.1 ИЛИ # ifconfig lncl inet 10.0.1.1 При этом 10.0.1.1 — это сам IP-адрес, a lncl — интерфейс, которому будет присвоен данный адрес. Заметим, что существует некоторое множество IP-адресов, зарегистрированных для использования в тех или иных сетях. Таким образом, при установке адреса, начинающегося с 10., маска подсети будет автоматически установлена BOxff 000000, а широковещательный адрес будет иметь вид 10.255.255.255. Это — гак называемая сеть класса А. При установке IP-адреса, начинающегося с 192. хх. хх., будет установлено значение маски, равное OxffffffOO, а широковещательный адрес примет вид 192.хх.хх.255. Это — сеть класса С. Если необходимо установить иное значение маски подсети и широковещательного адреса, то они должны быть указаны явно: # ifconfig lncl inet 192.168.2.2 netmask 255.0.0.0 # ifconfig -L lncl lncl: flags=108843<UP,BROADCAST,RUNNING, SIMPLEX,MULTICAST> mtu 1500 inet 192.168.2.2 netmask OxffOOOOOO broadcast 192.255.255.255 ether 00:0c:29:c8:0a:f8 В данном случае сетевая маска отображается в шестнадцатеричном формате (начинается с Ох), однако вводить ее можно в десятичной или в шестнадцатеричной форме (для перевода чисел из десятичной формы в шестнадцатеричную удобно использовать утилиту be, установив переменные ibase=10 и obase=16), а также в виде символьной последовательности. Символьная последовательность в данном случае — это ранее определенное имя некой подсети, сохраненное в файле /etc/networks (листинг 12.2). Листинг 12.2. Содержимое файла /ato/n*t,w6r|ca \ $FreeBSD: sre/etc/networks,v 1.3 1999/08/27 23:23:42 peter Exp $ @(#)networks * 1 Your Local Networks Database * your-net 127 your-netmask 255.255 nylocallO 255 5.1 (Berkeley) 6/30/90 # your comment # subnet mask for your-net # subnet mask for lO.x.x.x \ \ Your subnets \ subnet 1 subnet2 127.0.1 127.0.2 aliasl alias2 # comment 1 # comment 2 Широковещательный адрес устанавливают с помощью опции broadcast. Когда указывается маска подсети, широковещательный адрес вычисляется и устанавливается автоматически, однако указывать широковещательный адрес без указания маски подсети не рекомендуется во избежание проблем при работе в сети. Рассмотрим следующий пример (широковещательный адрес охватывает намного больше, чем позволяет маска подсети, установленная по умолчанию): # ifconfig lncl inet # ifconfig lncl inet 192.168.2.2 broadcast 192.255.255.255
358 Глава 12. Настройка сетевой среды lncl: flags=108843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST^ mtu 1500 inet 192.168.2.2 netmask OxffffffOO broadcast 192.255.255.255 Некоторые сетевые карты могут содержать несколько типов сетевых разъемов. Как указать, какой из них использовать? Для этого служит опция linkx, где х — число от) (по умолчанию) до 2. Иногда (но крайне редко) может потребоваться изменить значение максимального размера пакета данных MTU (Maximum Transmission Unit), который по умолчанию дан всех Ethernet устройств равен 1500. Как правило, изменять данное значение для сетевых карт на компьютерах в локальной сети, скорее всего, не понадобится. Изменения могут потребоваться исключительно в низкоскоростных сетях. Для изменения значения MTU используйте следующий формат команды ifconf ig: # ifconfig lncl mtu 1234 Утилита ifconfig имеет много других дополнительных опций, однако их.использование в большинстве случаев не потребуется. Если же вы столкнетесь с проблемами при настройке, или сетевая карта будет отказываться "видеть" сеть, обращайтесь к справочному руководству по драйверу устройства (например, man ер) и непосредственно к справке по самой программе ifconfig (man ifconfig). IP-псевдонимы Серверы, которые используются для размещения сайтов, нередко имеют не только несколько имен, но и несколько IP-адресов. В таких случаях необходимо иметь возможность устанавливать для одной сетевой карты несколько дополнительных IP-адресов. О том, как присваивать их при загрузке системы, будет рассказано позже. Прежде всего необходимо разобраться с некоторыми ограничениями, которые при этом накладываются. Как известно, каждый IP-адрес присваивается одному МАС-адресу, и ничто не мешает присвоить несколько IP-адресов. При попытке присвоении одинакового IP-адреса с одинаковыми масками подсети различным сетевым картам система назначит этот ад* рее только одному интерфейсу, а все остальные не будут иметь IP-адреса вообще. Для установки IP-псевдонима какому-либо интерфейсу необходимо в самом конце команды i f conf ig указать дополнительный параметр alias: # ifconfig lncl inet 10.0.1.1 netmask 255.255.255.255 alias # ifconfig lncl lncl: flags=108843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST^ mtu 1500 inet 10.0.0.1 netmask OxffOOOOOO broadcast 10.255.255.255 inet 10.0.1.1 netmask Oxffffffff broadcast 10.0.1.1 ether 00:0c:29:c8:0a:f8 Обратите особое внимание на маску подсети. Если для карты уже установлен IP- адрес из подсети, в которую необходимо включить новый IP-адрес, то обязательно требуется использовать маску подсети 255.255.255.255, иначе могут возникнуть серьезные проблемы при работе в сети. В противном случае, используйте ту маску подсети, которая описывает сеть для нового IP-адреса. Рассмотрим пример установки нескольких псевдонимов (предполагается, что ранее уже был установлен один адрес 192.168.0.200 с маской подсети 255.255.0.0): # ifconfig epO inet 192.168.0.201 netmask 255.255.255.255 alias # ifconfig epO inet 10.10.10.1 netmask 255.0.0.0 alias # ifconfig epO inet 10.10.10.2 netmask 255.255.255.255 alias # ifconfig epO epO: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.200 netmask OxffffOOOO broadcast 192.168.255.255 inet 192.168.0.201 netmask Oxffffffff broadcast 192.168.0.201 inet 10.10.10.1 netmask OxffOOOOOO broadcast 10.255.255.255
Первоначальная настройка сети 359 inet 10.10.10.2 netmask Oxffffffff broadcast 10.10.10.2 ether 00:01:03:B2:5c:41 Напомним, что после перезагрузки данные настройки будут сброшены, потому sслучае успеха позаботьтесь о правильном и своевременном обновлении файла /etc/rc. conf в соответствии с вашими требованиями к сетевой среде. Использование утилиты ping Правильное использование утилиты if conf ig — еще не залог успешной работы Сети. FreeBSD, как мы знаем, — довольно мощная операционная система, многогранная в настройках безопасности, маршрутизации и т.п. В связи с этим, может так случиться, по по мере настройки и постнастройки сетевой среды все будет работать не так, как ожидалось в начале. Потому перед добавлением записей в файл /etc/rc. conf (или же после добавления, но в случае возникновения ошибок), рекомендуется проверить, достигнут ли требуемый результат, и если не достигнут, — определить причины. Проблемы иогут возникнуть как в связи с человеческим фактором (не усмотрел, сонливость, уста- иость), так и технические (не перенастроена маршрутизация, неправильно настроен шлюз, ранее настроенные правила брандмауэра IPFW не были откорректированы в свя- w с изменениями настроек сетевой среды). В этом случае пригодится присутствующая практически в любой операционной системе утилита ping, отсылающая специальные пакеты протокола ICMP другой машине в сети. Независимо от того, получил компьютер ответ от удаленного хоста или нет, он продолжает предпринимать попытки передачи пакетов, а в самом конце выдает статистику обмена: время отклика, процент потерь пакетов и другую служебную информацию. Что с помощью программы ping можно узнать в момент настройки сетевой среды? В первую очередь, — доступность машин в локальной сети относительно данного хоста, что говорит об успешности настройки системы. Предположим, к примеру, что в нашей сети (маска 255.255.0.0) есть компьютер с IP-адресом 192.168.0.1, и в данный момент мы пытаемся настроить другой компьютер, установив ему IP-адрес 192.168.1.1. Покажем, как в данном случае может возникнуть ошибка и устраним ее. v, Предположим, мы устанавливаем IP-адрес следующей командой: # ifconfig IncO inet 192.168.1.1 Затем мы пытаемся "пропинговать" другой хост: » ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1): 56 data bytes ping: aendto: No route to host ping: sendto: No route to host ЛС — 192.168.0.1 ping statistics 2 packets transmitted, 0 packets received, 100% packed loss # Как видим, компьютер с адресом 192.168.0.1 недоступен. В данном случае сообщается, что машина находится вне локальной сети. Это обусловлено тем, что команда ifconfig установила маску сети класса С, поскольку она не была задана вручную, а "пингуемый" компьютер находится в другой подсети. Данное сообщение может поя- иггься также в том случае, если не определен маршрут по умолчанию или же просто отключен кабель. Ниже представлен пример информации, выданной командой ping в случае, когда компьютера с запрашиваемым IP-адресом нет в сети (например, он выключен): I ping 192.168.1.2 PING 192.168.1.2 (192.168.1.2): 56 data bytes
360 Глава 12. Настройка сетевой среды ping: sendto: Host is down I ping: sendto: Host is down I ping: sendto: Host is down I ping: sendto: Host is down I ЛС I 192.168.1.2 ping statistics 4 packets transmitted, 0 packets received, 100% packet loss Если используется настроенный брандмауэр IPFW, то после изменения сетевых наг строек может быть получено следующее сообщение от утилиты ping: # ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1): 56 data bytes ping: sendto: Permission denied ping: sendto: Permission denied ping: sendto: Permission denied ping: sendto: Permission denied ЛС 192.168.0.1 ping statistics 4 packets transmitted, 0 packets received, 100% packet loss Скорее всего, в данном случае просто запрещен весь трафик, или же определено другое правило, не позволяющее отправлять некоторые пакеты с данного IP-адреса. После настройки на использование DNS утилита ping может быть использована для проверки корректности настройки клиента или сервера DNS: # ping main.com.ua ping: cannot resolve main.com.ua: Host name lookup failure Настройка маршрутизации. Шлюзы Для того чтобы компьютер имел возможность обращаться к машинам, расположенным в другой сети (или просто по другую сторону некоторого шлюза), в нем должен быть реализован какой-то механизм определения маршрута. Данный механизм называется маршрутизацией. При этом для того, чтобы соединиться с некоторым адресом назначения (destination), необходимо в первую очередь получить связь со шлюзом (gateway). В качестве адреса назначения может выступать отдельный хост, целая сеть или же так называемый маршрут по умолчанию (default route), используемый в тех случаях, когда не подходят другие маршруты (например, хост не был найден в локальной сета с использованием широковещательной рассылки). В качестве шлюзов могут выступать отдельные хосты, интерфейсы или же МАС-адреса (например, как в коммутаторах второго уровня). Утилита if conf ig не предназначена для работы с "глобальными" сетевыми параметрами, а адрес шлюза не привязан к какому-либо сетевому интерфейсу. Шлюз — это и есть маршрут по умолчанию. Тем не менее, система FreeBSD предоставляет широкие возможности по настройке маршрутизации, о которых более подробно будет рассказано в главе 13. Для установки маршрутов используется утилита route. Сразу отметим, что это — довольно сложная утилита, в которой может запутаться даже опытный администратор, но, по большей части, это обусловлено сложностью настройки самой маршрутизации. Прежде всего, выясним как получить текущее состояние таблицы маршрутизации. Для этого используется утилита netstat с ключом -г, однако ее использование в таком виде нередко приводит к замедлению настройки маршрутизации, поскольку она дли всех адресов пытается найти соответствие имени. Для того чтобы пропустить поиск соответствия имен, будем использовать ключ -гп. Просмотрим данные, выдаваемые командой netstat:
Первоначальная настройка сети 361 mobile* netstat Routing tables Internet: Destination default 127.0.0. 1 192.168.0/16 192.168.0.1 -rn Gateway 192.168.0.1 127.0.0.1 link#3 00:20:18:5(6:d0:70 Flags UGSc UH UC UHLW Refs 13 1 2 15 Use 0 54 0 92 Netif epO loO epO epO Expire 1196 192.168.255.255 f f: f f: f f: f f: f f: f f UHLWb 1 77 epO В данном примере уже установлен маршрут по умолчанию (это видно и по адресу назначения, и по установленным флагам), поэтому давайте разберемся с назначением некоторых флагов (табл. 12.1). Таблица 12.1. Некоторые флаги в выходных данных утилиты netstat -r Флаг Описание 0 Актуальный маршрут (UP) £ Посылать все пакеты для указанного адреса назначения (Destination) на указанный шлюз (Gateway), который, в свою очередь, сам определяет дальнейший путь пакетов s Статический маршрут (static), установленный вручную, а не автоматически сгенерирован самой системой .с Маршрут по умолчанию для указания машины, имеющей прямое соединение с внешним миром н Адресом назначения является некий отдельный хост с Клонированный маршрут (clone) — то есть, такой, который был сгенерирован на основе маршрута, указанного для груплы.подключенных машин 1 Маршрут, включающий ссылку (link) на аппаратный МАС-адрес в качестве шлюза и Маршрут был автоматически сконфигурирован на основе маршрута локальной сети (WasCloned) в Маршрут представляет собой широковещательный адрес Отсюда видно, что запись для адреса назначения default активна, является статически установленной, а все пакеты, для которых не найден маршрут, передаются по адресу 192.168 . 0.1. Машина с этим адресом сама решает, куда направить пакеты дальше, чтобы они достигли адреса назначения. В колонке Netif указывается интерфейс, с которым связан маршрут. Как видно из примера использования утилиты netstat, существует маршрут для адреса 127 .0.0.1 (localhost), к которому все пакеты проходят через интерфейс 1о0 (loopback). Весь трафик для данного адреса передаваться по сети не будет. Теперь можно перейти к установке маршрута по умолчанию. В первую очередь, обращаем внимание на то, что производить любые манипуляции с утилитой route рекомендуется, находясь в локальной сети или за физической консолью, в противном случае есть риск потерять связь с удаленным хостом. Изменения настроек маршрутизации производятся моментально, как и при работе с утилитой if conf ig, однако при перезагрузке системы исчезают. В данной главе будут рассмотрены только две команды: route add (установка маршрута) и route delete (удаление маршрута). При этом следует учитывать, что )тилита route не контролирует правильность введенных значений, потому есть веро- пность установки ошибочного или фиктивного маршрута. В первую очередь, необходимо удалить запись текущего маршрута по умолчанию, итолько затем установить новое значение. Например: # route delete default delete net default
362 Глава 12. Настройка сетевой среды # route add default 192.168.0.1 add net default: gateway 192.168.0.1 Обратите внимание на особенности использования сценария /etc/netstart,№ торый выполняется при запуске системы и отвечает за инициализацию сетевой среду (об этом речь пойдет ниже в этой главе). При его использовании вручную могут в» никнуть некоторые казусы. Если был установлен новый маршрут вручную необходим выполнить сценарий /etc/netstart, то все параметры будут взяты из файл /etc/rc. conf. Таким образом, все настройки, произведенные вручную и не сохраненные в конфигурационном файле, будут утеряны и заменены настройками из файа /etc/rc.conf. Более подробно настройка маршрутов и настройка системы FreeBSD для работ' в качестве шлюза (маршрутизатора), будет описана в главе 13. Файл /etc/rc.conf t Выше были рассмотрены различные утилиты и средства настройки сетевой средыi диагностики сетевого взаимодействия, результат работы которых "сбрасывался" пося перезагрузки системы или в результате использования сценария /etc/netstart. Пц этом было неоднократно упомянуто о необходимости внесения изменений в фай: /etc/rc.conf, который можно легко отредактировать в любом текстовом редакторе Кратко рассмотрим, какие из рассмотренных ранее настроек сети могут и должны хр* ниться в этом файле. В первую очередь речь пойдет об определении IP-адресов для их автоматической назначения интерфейсямчв процессе загрузки системы. Обращаем внимание на то, чт» в файле /etc/defaults re. conf присутствует только один более-менее подходящи! пример: установка IP-адреса для интерфейса 1о0. Итак, для каждого отдельного интерфейса параметры устанавливаются с испольда ванием строки вида: ifconfig_<ifname>X;'"<nepe4Hc^eHHe опций>" где <ifname> — имя драйвера интерфейса, X— порядковый номер, <перечислеим опций> — строка, подобная той, которая передавалась утилите if conf ig. Например, строка файла /etc/rc.conf для интерфейса ерО с адреса! 192 .168 . 0 . 200 и маской подсети 255.255 .0.0 будет выглядеть следующим обр» зом: ifconfig_epO="inet 192.168.0.200 netmask 255.255.0.0" Для назначения IP-адреса какому-либо интерфейсу с использованием протокой DHCP необходимо просто указать в качестве значения слово "DHCP". Например: ifconfig_lncl="DHCP" При этом указывать шлюз по умолчанию или DNS-серверы, как правило, не понадобится. К тому же, для корректной работы самой сети настройка на использованй DNS не обязательна, хотя и будет рассмотрена ниже в этой главе. После перезапуска системы в директории /var/db/ должен появиться фай dhclient. leases, в котором содержится информация о настройках интерфейсовв использование DHCP:
Первоначальная настройка сети 363 J more /var/db/dhclient.leases lease { interface "lncl"; fixed-address 192.168.0.27; option subnet-mask 255.255.0.0; option routers 192.168.0.1; option dhcp-lease-time 604800; option dhcp-message-type 5; option dhcp-server-identifier 192.168.0.1; option domain-name-servers 192.168.0.1; option dhcp-renewal-time 300; option dhcp-rebinding-time 453600; option netbios-node-type 4; renew 1 2005/6/27 12:31:19; rebind 6 2005/7/2 18:26:53; expire 1 2005/7/4 12:26:53; } \ 4 Более подробно настройка системы на использование DHCP (как клиента, так и сервера) рассматривается в главе 22, "Использование DHCP". Теперь напомним о том, что с помощью утилиты ifconfig мы можем временно шючить интерфейсы во время работы системы (например, при проведении профилак- ических работ). Отключить интерфейсы (или, точнее, — перечислить те из них, которые должны быть включены и настроены при загрузке системы во время инициализации сетевой среды) можно, переопределив значение опции network_interfaces (файле /etc/rc.conf, которая по умолчанию имеет значение "auto". Этому значению соответствует включение всех настроенных интерфейсов во время запуска системы. Если интерфейсов очень много, и по какой-то причине необходимо оставить на продолжительное время включенными только некоторые, то перечислите их, разделив символом пробела как в представленном ниже примере (для наглядности здесь показа- вы параметры для всех сетевых карт): network_interfaces="lncl 1о0" ifconfig_lo0="inet 127.0.0.1" ifconfig_lncO="inet 10.0.0.1 netmask 255.0.0.0" ifconfig_lncl="inet 192.168.0.2 netmask 255.255.0.0" В результате, после перезапуска системы мы получим следующие выходные дан- «ыеутилиты ifconfig: # ifconfig IncO: flags=108802<BROADCAST,SIMPLEX, MULTICAST> mtu 1500 ether 00:0c:29:c8:0a:f8 lncl: flags=108843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST^ mtu 1500 inet 192.168.0.2 netmask OxffffOOOO broadcast 192.168.255.255 ether 00:0c:29:c8:0a:ee plipO: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST^ mtu 1500 loO: flags=804 9<UP,LOOPBACK,RUNNING,MULTICAST^ mtu 16384 inet 127.0.0.1 netmask OxffOOOOOO Из этого примера видно, что только два интерфейса имеют установленный флаг UP: incl и 1о0, — что и требовалось получить. Теперь, что касается настройки IP-псевдонимов... Для этого необходимо использо- еть запись следующего вида: ifconfig_<ifname>X_alias#="<nepe4M^eHMe опций>" W<ifname>— имя драйвера интерфейса, X— порядковый номер интерфейса, # — порядковый номер псевдонима (начиная с 0), «^перечисление опций>— строка, по-
364 Глава 12. Настройка сетевой среды добная той, которая передавалась утилите ifconfig, но без указания параметра alii в конце. В качестве примера рассмотрим запись из файла /etc/rc.conf, описывающя IP-псевдоним для сетевого интерфейса ерО: ifconfig_epO_aliasO="inet 192.168.0.201 netmask 255.255.255.255" Записи IP-псевдонимов должны начинаться с aliasO и далее— в порядке воэрк тания номера с шагом 1. Процесс настройки будет прерван, как только встретится я сутствующий, но ожидаемый псевдоним, даже если далее идут правильно оформлении записи (порядок записей не имеет значения, главное— наличие непрерывного man равного 1). Так, в представленном ниже примере отсутствует запись для alias3: # more /etc/rc.conf I grep ifconfig_lnc0 ifconfig_lncO="inet 192.168.0.2 netmask 255.255.0.0" ifconfig_lnc0_alias0="inet 192.168.0.3 netmask 255.255.255.255" ifconfig_lnc0_aliasl="inet 192.168.0.4 netmask 255.255.255.255" ifconfig_lnc0_alias2="inet 192.168.0.5 netmask 255.255.255.255" ifconfig_lnc0_alias4="inet 192.168.0.6 netmask 255.255.255.255" ifconfig_lnc0_alias5="inet 192.168.0.7 netmask 255.255.255.255" # /etc/netstart devd already running? (pid=237). IncO: flags=108843<UP,BROADCAST,RUNNING, SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.2 netmask OxffffOOOO broadcast 192.168.255.255 inet 192.168.0.3 netmask Oxffffffff broadcast 192.168.0.3 inet 192.168.0.4 netmask Oxffffffff broadcast 192.168.0.4 inet 192.168.0.5 netmask Oxffffffff broadcast 192.168.0.5 ether 00:0c:29:c8:0a:ee loO: flags=804 9<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::l%lo0 prefixlen 64 scopeid 0x4 inet 127.0.0.1 netmask Oxff000000 Additional routing options:. Для того чтобы определить шлюз, используемый по умолчанию, в файл /etc/ re. conf необходимо добавить одну строку с указанием адреса шлюза: defaultrouter="192.168.0.1" В результате, файл /etc/rc. conf может принять следующий вид: network_inter^aces="epO loO" ifconfig_epO=ninet 192.168.0.200 netmask 255 . 255.. 0 . 0" ifconfig_ep0_alias0="inet 192.168.0.201 netmask 255.255.255.255" ifconfig_epO_aliasl="inet 10.0.0.1 netmask 255.0.0.0" ifconfig_ep0_alias2="inet 10.0.1.1 netmask 255.255.255.255" defaultgateway="192.168.0.1" Имя компьютера. Поиск соответствия имен и адресов Каждому компьютеру, независимо от того, настроен он на взаимодействие с сеты» или нет, необходимо назначить имя. Как правило, это делается еще на этапе установи системы при конфигурировании сетевых интерфейсов (иначе машина после запускабу дет иметь короткое имя "Amnesiac"). Однако выбираемое имя очень сильно зависит я сети и машин в ней. В первую очередь это обусловлено тем, что в одной сети не мои быть машин с одинаковыми именами. Во-вторых, есть два типа имен: короткое (вя просто имя хоста) и полное имя (DNS-имя машины). На сегодняшний день практичесц все сети используют иерархическую систему именования, известную как DNS (подро&
Первоначальная настройка сети 365 «ее о DNS читайте в главе 20, "Сервер имен DNS"). Настройка имени компьютера должна соответствовать уровню иерархии хоста в системе DNS. Узнать полное имя компьютера можно с помощью следующих команд: # uname -n mobile.altersys-ua.com # hostname mobile, altersys-ua.com # hostname -s mobile Для установки короткого имени (если отсутствует DNS) используйте команду It hostname short_host_name При наличии DNS воспользуйтесь то# же командой, однако в качестве параметра укажите полное имя: # hostname full.dns.hostname При этом учтите, что данная команда устанавливает имя только до перезапуска системы. Для того чтобы определить для компьютера постоянное имя, необходимо внести соответствующие изменения в файл /etc/rc.conf: строку вида hostname="short. or. full. hostname", например: hostname="mobile" # установка короткого имени хоста hostname="mobile.altersys-ua.com" # установка полного DNS-имени К слову, если записать именно так, как указано в примере выше, то будет использовано последнее значение (в связи с последовательным чтением записей в файле /etc/rc. conf) Файл /etc/hosts Вот мы и подошли к вопросу поиска соответствия имен компьютеров и IP-адресов. Совершенно очевидно, что символические последовательности удобнее набора чисел. В давние времена (на заре появления сетей) все соответствия хранились в одном файле, который активно используется в локальных сетях и по сей день. К тому же, использовать этот файл не просто рекомендуется — он должен всегда присутствовать в системе по причинам, указанным ниже. Итак, файл /etc/hosts является довольно простым по структуре, и состоит из набора записей соответствия IP-адресов и имен. Данный файл используется совместно cDNS и NIS, отвечая за сопоставление имен и IP-адресов, не перечисленных в базах данных упомянутых служб. Этот файл очень часто содержит записи, дублирующие DNS-записи. Это одновременно и хорошо, и плохо. Хорошо тем, что не приходится постоянно обращаться по сети для получения соответствий, если приоритетным является использование файла /etc/hosts. Плохо потому, что для локальной сети базу данных DNS можно вести и на одном компьютере (хотя желательно иметь вторичный сервер имен), а за содержимым файла /etc/hosts необходимо следить на каждой машине вотдельности (если не используется для этого NIS). Что может произойти, если вдруг сервер DNS будет временно приостановлен, файл /etc/hosts содержит устаревшие соответствия, а за определение имен отвечал имен- носервер DNS (смотрите порядок просмотра в файле /etc/host, conf)? "Криминального" — ничего, однако может уйти немало времени на поиски ответа на вопрос: "Что случилось? Я не могу соединиться с машиной client23. У меня там рабочие файлы. Проверьте, может кабель поврежден?" ©. Смешно, но неопытный администратор может прийти в замешательство (опытный просто не будет использовать файл /etc/hosts щи определения имен в сети, а сервера DNS будет два). Но не будем отвлекаться на подобную "лирику" и рассмотрим сам файл.
366 Глава 12, Настройка сетевой среды Как же сопоставлять IP-адреса и имена? Очень просто. Каждая строка в фай /etc/hosts — это запись для одного IP-адреса. Каждому IP-адресу можно постам в соответствие одно и более имен, при этом реальное имя называется официальв) именем машины, а остальные — псевдонимами. Первым в записи указывается \?-щ далее следует перечисление имени и псевдонимов (если необходимо). Все элементы! деляются друг от друга пробелом или табуляцией. В файле /etc/hosts разрешеной пользовать комментарии, которые начинаются с символа "#". Таким образом, однаа пись имеет следующий формат: IP_address official_host_name alias alias ... Пример реального файла /etc/hosts показан в листинге 12.3. Листинг 12.3. Пример файла /«to/hoaf 0:0:1 localhost localhost.altersys-ua.com 127.0.0.1 localhost localhost.altersys-ua.com 192.168.0.200 mobile mobile.altersys-ua.com 192.168.0.1 gate gate.altersys-ua.com 192.168.0.2 localsrv localsrv.altersys-ua.com 192.168.0.10 altersrv altersrv. altersys-ua.com 192.168.0.111 virtual virtual.altersys-ua.com Настал момент разъяснить причины обязательного присутствия данного файл в системе. Файл /etc/hosts должен присутствовать во время запуска для сопоста ления всех IP-адресов локального хоста с соответствующими именами. Это относите в первую очередь к записи 127.0.0.1 localhost— так называемый интерфей loopback. Данный интерфейс присутствует всегда и позволяет машине выполнять!» обходимые первоначальные сетевые задачи по настройке и тестированию TCP/IP в об ход реальных сетевых интерфейсов. Наличие псевдонимов не обязательно, однако может упростить некоторые задач! Если в сети для всех компьютеров, из которых некоторые выполняют специфически! задачи (локальный FTP-сервер, NFS-сервер и т.д.), используется шаблон именована (например host01-host02-...-host99), то пользователям будет удобнее обращали к ним по псевдонимам. Например, NFS-серверу можно задать псевдоним nfsserver, DNS-серверу — nsl, шлюзу в Internet — gate. Однако отметим, что DNS-сервер таюй позволяет задавать псевдонимы, которые будут видны всем клиентам DNS. Файл /etc/resolv.conf Этот "загадочный" файл, как правило, по умолчанию в системе отсутствует. Фай /etc/resolv.conf описывает домен компьютера, или же порядок поиска маши в различных доменах. Также в нем можно указать список DNS-серверов. В правильно настроенной среде присутствие этого файла не обязательно, если ж вам все-таки необходимы специфические настройки, то создавайте его вручную. Фор- мат файла /etc/resolv. conf Довольно прост — в некотором смысле он, может был* даже проще файла /etc/hosts, потому что содержит меньше записей ©. Файл /etc/resolv. conf представляет собой список из строк, каждая из которьи определяет одну опцию. Опция представляет собой запись вида ключевое_словс значение, где ключевое слово всегда стоит первым и отделяется от значения символ» ми пробела или табуляции. Ключевых слов существует только пять: nameserver; domain; search; sortlist; options.
Первоначальная настройка сети 367 Оговоримся, что использование опций search и domain совместно невозможно: или указать их обе, то будет использована только последняя из указанных. Ключевое слово nameserver служит для перечисления IP-адресов серверов имен. Серверы будут опрашиваться в порядке их описания в файле /etc/resolv. conf, однако при этом их количество ограничено тремя. Если первый сервер не отвечает в за- даный срок, то считывается адрес второго сервера имен, и на запросы отвечает именно он. При этом важно отметить, что если сервер доступен, но не отвечает на DNS-запрос, он считается работоспособным, и следующий сервер из списка опрашиваться не будет. Ключевое слово domain описывает домен, в котором находится компьютер. Эта ипись используется крайне редко, поскольку в имени компьютера уже присутствует имя домена, к которому он принадлежит. Ключевое слово search задает список доменов для поиска компьютера, заданного коротким именем. Значением данного ключевого слова может выступать один или несколько доменов. Чаще используется построчное перечисление доменов для поиска. Рассмотрим пример записи в одну строку и в несколько строк: search altersys-ua.com main.com.ua mshome^local * - search altersys-ua.com search main.com.ua search mshome.local При запросе nslookup mobile, сначала будет произведен поиск компьютера (именем mobile.altersys-ua.com. Если соответствия не будет найдено, то затем выполняется поиск mobile .main. com. ua, и наконец — mobile .mshome. local. Ключевые слова sortlist и options используются довольно редко, поэтому мы их рассматривать не будем. За подробной информацией обращайтесь к справочному руководству man resolv.conf. Пример полноценного файла /etc/resolv. conf представлен в листинге 12.4. iHimiHr 12.4. Пример файла/■to/raBolv.odnf ".'■'" - '.'. Search altersys-ua.com search main.com.ua «earch mshome. local nameserver 192.168.0.1 nameserver 192.168.0.254 nameserver 127.0.0.1 Изменять файл /etc/resolv.conf можно в любое время без перезапуска системы. Все изменения сразу же вступают в силу. Это вызвано тем, что содержимое этого файла считывается всякий раз заново при каждом запросе. Если используется DHCP, то изменение файла /etc/resolv. conf не требуется — сервер DHCP сам позаботится о передаче подобной информации клиенту. Клиент DHCP, в свою очередь, формирует файл /etc/resolv. conf в соответствии с полученными значениями. Файлы /etc/host.confи/вtc/nsswitch.conf Файл /etc/host.conf уже неоднократно упоминался ранее. Его содержимое очень простое — все пара строк (листинг 12.5). ттнг 12.S. Пример файла /«to/boat.доп£ ИЗ FreeBSD4.И ISFreeBSD: src/etc/host.conf,v 1.6 1999/08/27 23:23:41 peter Exp S (Сперва пробовать использовать файл /etc/hosts bsts I Затем опрашивать DNS-севрера соответственно из файла /etc/resolv.conf bind I Если есть сервер YP/NIS, можно снять коментарий для использования nis
368 Глава 12. Настройка сетевой среды В файле /etc/host. conf определяется приоритет использования того или инсп сервиса при поиске соответствия имен и IP-адресов хостов. По умолчанию, здесь всеш вначале указан строка hosts, что означает "первым использовать файл /etc/hosts" Второй записью, как правило, является bind, что, естественно, означает "использован вторым опрос DNS". На сегодняшний день использование данного файла уходит в щ шлое. С появлением пятой версии системы FreeBSD рекомендуется использовать бол* гибкую систему, построенную на файле /etc/nsswitch. conf (листинг 12.6). Листинг 12.6. Содержимое файла /etc/nsswitch .oonf no умолчанию в FreeBSD 5.x group: compat group_compat: nis hosts: files dns networks: files passwd: compat passwd_compat: nis shells: files Как можно заметить из примера, представленного в листинге 12.6, (J nsswitch .conf поддерживает не только перечисление сервисов сопоставления именг IP-адресов (строка hosts : files dns) в порядке их использования, но также позво ляет задавать порядок поиска в различных базах данных групп, пользователей и т. Каждая запись в таком файле содержит название базы данных, после чего следует пер числение источников в порядке их использования, отделенных друг от друга пробелами Кроме того, каждый элемент в списке может иметь дополнительные условия, укал* вающие на то, как в том или ином случае использовать следующий элемент в списке Рассмотрим список поддерживаемых по умолчанию (остальные могут быть добавлен! как дополнительные библиотеки) источников просмотра данных (табл. 12.1) и баз данных (табл. 12.2). Таблица 12.1. Список предустановленных источников для использования в фай ле /etc/nsswitch.conf Источник Описание files Просмотр по стандартным локальным файлам, как, например, /etc/hosts^ /etc/passwd, /etc/group; /etc/shells ons Использовать систему доменных имен (DNS) i nis Использовать информационную службу NIS/YP compat Включить поддержку использования '+/-' в файлах баз данных passwd* group. Если используется такой источник, то он должен быть единствен» ным в списке (остальные перечисляются в базе group_compat ига passwd_compat) Напомним, что при добавлении соответствующих библиотек в систему могут использоваться и другие источники. Например, добавив в директорию /lib библиотек) libnssldap. so можно будет использовать источник ldap. Таблица 12.2. Список баз данных, используемых в файле /etc/nsswitch.conf База данных Используемая библиотечная функция языка С (см. справку man 3 function_name) group Getgrent j hosts . Gethostbyname' """■:■*:'-.:?■':■=: ■■ \ networks Getnetbyname ■} passwd Getpwent " >й' I shells Getusershell ""'"''.''i?'"^'' .-,. Я Отметим, что каждый вызов при проходе по источникам (табл. 12.1) возвращает некий код статуса. В зависимости от этого кода (табл. 12.3) можно определить дальнейшй
Первоначальная настройка сети 369 действие (табл. 12.4), например, продолжить перебор, повторяя попытки найти соответствие, или же прервать процесс. Таблица 12.3. Возвращаемые коды статуса, используемые в файле /etc/nsswitch.conf Статус Описание ■success Запрашиваемый элемент-был успешно найден not found , Запрашиваемый элемент не был, найден в текущем источнике .tryagain Источник в данный момент занят, и, возможно, ответит при повторном запросе unavai 1 Источник не отвечает или же содержит поврежденное содержимое Таблица 12.4 Список действий, возможных при получении любого из кодов статуса Действие Описание continue Попробовать испольэовать/следующий источник в списке return Прервать процесс и вернуть текущий код статуса Рассмотрим формат файла /etc/nsswitch.conf более подробно. Этот файл состоит из записей, при этом каждая новая запись начинается с новой строки (одну запись можно также разделить, используя символ разрыва "\", и таким образом продолжить список в новой строке). В файле /etc/nsswitch.conf можно использовать комментарии, которые начинаются с символа "#". Запись начинается с имени базы данных, отделенного от остальной части строки двоеточием ":". Затем следует перечень источников. Каждый элемент перечня источников может содержать список критериев (условий). При этом критерий следует сразу же за элементом и заключен в квадратные скобки " [ ]". Критерий — это код статуса и действие при его получении, разделенные знаком равенства "=". Для каждого элемента списка можно описать несколько критериев, заключенных в одни скобки. Критерии по умолчанию — success=return, а для всех остальных кодов статуса — continue. Таким образом получаем: [success=return notfound=continue tryagain=continue unavail=continue] Обращаем внимание на то, что все элементы в записи зависимы от регистра символов! Также важно помнить, что в случае отсутствия файла /etc/nsswitch. conf или же при неправильных данных в списке источников любой базы данных будет использоваться значение files за следующими исключениями: для group будет использоваться значение compat; для group_compat — nis; для hosts — files dns; для passwd—compat; для passwd_compat — nis. Стартовый сценарий /etc/netstart Ранее уже несколько раз упоминался сценарий /etc/netstart, однако его действительное назначение так и не было разъяснено. Как правило, пользователю не обязательно знать о наличии этого файла в системе. Более того, его можно даже удалить, если вас, например, смущает его название ©. Но, как правило, это принесет вам огромное количество проблем и неудобств. Файл /etc/netstart выполняется на этапе загрузки системы и отвечает за запуск всех сетевых служб. Заметим, что раньше этого файла не было в системе вообще, и администратору приходилось самому заботиться о запуске всех служб, создавая собственные сценарии. Теперь с появлением файла /etc/netstart эта проблема решена.
370 Глава 12. Настройка сетевой среды Заметим также, что в различных версиях системы содержимое данного файла № жет отличаться. Так, например в FreeBSD 4.x и FreeBSD 5.x эти файлы несравним в принципе. Ранее файл /etc/netstart просто отслеживал изменения в файле /etc/rc. conf и переопределял записи из файла /etc/default/rc. conf, после чей он запускал сценарии /etc/rc.pcoard и /etc/rc. network (а также, если включен поддержка IPv6, — и /etc/rc. network6). Данный файл был введен для запуска сетевой среды в однопользовательском режиме, однако затем начал применяться также и просто для внесения изменений в сетевой среду без полного перезапуска системы или запуска необходимых сервисов последов} тельно вручную. При этом он позволяет избежать конструкций, построенных синтаи чески неправильно. Заметим, что пользоваться сценарием /etc/netstart удаленно не рекомендует В первую очередь обратите внимание на следующее: если был изменен маршрут и умолчанию или IP-адрес или же неправильно изменены настройки брандмауэра в фаля /etc/rc. firewall, то запуск данного сценария приведет к потере связи и "завис* нию" рабочих процессов в оперативной памяти. Настоятельно рекомендуется использовать его при настройке сетевой среды только с терминала. Обращаем также внимание не использование файла /etc/netstart в системе FreeBSD 5.x, поскольку в этой вереи его формат претерпел значительные изменения: теперь в нем находится упорядочений список запускаемых сценариев (например, pecard, ipfw, hostname и др.), распою женных в директории /etc/red/. Согласно новому соглашению размещения стартовых сценариев, файлы в дирето рии /etc/rc. d/ не обязательно должны заканчиваться на . sh (смотрите man red). Другие файлы В системе присутствует еще несколько файлов, принимающих участие в общ» процессе конфигурирования сетевой среды. Кратко рассмотрим их назначение. /etc/ethers Файл ethers является базой данных адресов Ethernet. Как правило, его используют при работе с бездисковыми терминалами с применением rarpd (например, для установки системы SUN Solaris на компьютер без CD-привода) или при попытках администраторов защититься от подмены IP-адресов пользователями, применяя при этом проверку соответствия IP- и МАС-адресов для разрешения клиенту доступа к какой-либо службе. По умолчанию файл /etc/ethers в системе отсутствует. Файл содержит информацию об известных адресах Ethernet (МАС-адреса) машин в сети в следующем виде: <МАС-адрес> <ИмяМашины> [#<Комментарий>] Обратите внимание на то, что имена машин должны быть определены в файле /etc/hosts. МАС-адреса записываются в коде ASCII в формате hh: hh: hh: hh: hh: hh, где hh — шестнадцатеричное число от 00 до FF. Пример файла/etc/ethers: 00:01:03:82:5C:41 mobile 00:03:31:2B:11:4A client21 # Sergey's machine /etc/services Каждая служба прикладного уровня TCP/IP имеет номер порта на транспортной уровне. Файл /etc/services содержит информацию о связи сервисов (well known set vices) с сопоставленным статическим номером порта (well known port number). Для описания каждого сервиса выделяется одна строка, которая должна содержал следующие данные:
Первоначальная настройка сети 371 <ОфициальноеИмяСервиса> <Порт>/<ИмяПротокола> [<Псевдоним>] (#<Комментарий>] Например: smtp 25/tcp mail #Simple Mail Transfer Все элементы записей разделены символом пробела или табуляции — только <Порт> и <ИмяПротокола> разделяются символом косой черты "/" и являются цель- дам элементом (например, 21 /tcp). Некоторые службы используют как протокол UDP, их и TCP — для них создаются по две записи (отдельно для каждого протокола), например: domain domain 53/tcp #Domain Name Server 53/udp #Domain Name Server Файл /etc/services создается во время установки системы. /etc/protocols Заголовок каждого IP-пакета содержит однобайтовый идентификатор протокола крхнего уровня (поле PROTOCOL). В системе FreeBSD еще при установке создается файл /etc/protocols, который содержит список соответствий имен протоколов и их гомеров. Данный файл, как правило, не требует редактирования — более того, его редактирование может привести к ошибкам в работе стека TCP/IP, поскольку при загрузке системы к нему обращаются большинство сетевых даемонов. В данном файле содержатся записи в следующем формате: <ОфициальноеИмяПротокола> <НомерПротокола> <Псевдоним> [#<Комментарий>] Поля записей разделены символами пробела или табуляции. Комментарии начинаются со знака "#". Пример файла /etc/protocols в системе FreeBSD 5.3: I # Internet protocols I # $FreeBSD: src/etc/protocols,v 1.19 2004/03/08 22:03:27 mlaier Exp $ # from: @(#)protocols 5.1 (Berkeley) 4/17/89 # # See also http://www.iana.org/assignments/protocol-numbers i # internet protocol, pseudo protocol hop-by-hop options for ipv6 internet control message protocol internet group management protocol gateway-gateway protocol IP encapsulated in IP (officially ST2 datagram mode (RFC 1819) transmission control protocol ip 0 ^number (thopopt 0 iemp 1 igmp 2 ggp 3 ipencap 4 V'lP' ') st2 5 tcp 6 IP HOPOPT I CMP IGMP GGP IP-ENCAP ST2 TCP # # # # # # # # /etc/hosts.allow Данный файл является конфигурационным файлом системы TCP Wrappers и пред- шначен для ограничения доступа с определенных адресов к определенным сервисам встемы. В нем указан список правил, разрешающих или запрещающих доступ с опре- ренного адреса или множества адресов к указанной службе (представленной именем
372 Глава 12. Настройка сетевой среды ' исполняемого файла службы). Заметим, что реализация TCP Wrappers в FreeBSD, eo личие от других операционных систем, игнорирует содержимое фай /etc/hosts.deny. Рассмотрим фрагмент, описывающий правила доступа к FTP-серверу (FTP поя щена глава 18, "Сервер FTP"): ftpd : localhost : allow ftpd : .good.user.org : allow ftpd : ;bad.user.org : deny ftpd : ALL : allow Это пример наиболее распространенных записей. Они имеют следующий формат <даемон> : <адрес> : <действие> Здесь, <даемон> — имя даемона; в поле <адрес> может находиться имя хоста, D адрес или адрес IPv6 в квадратных скобках; поле <действие> принимает значега allow ("разрешить") или deny ("отказать"), при этом перебор правил производится)) первого совпадения, после чего оно применяется, а процесс поиска прекращается. Помимо вышеупомянутых, существует еще несколько параметров, которые пред» тавляют дополнительные возможности контроля. Например, параметр twist позволив запретить соединение и при этом выполнить заданный сценарий, выведя сообщение! разрыве соединения: ALL : ALL \ : severity auth.info \ : twist /bin/echo "You are not welcome to use %d from %h." При попытке соединения с портами любого даемона, не описанного ранее в фай.1! /etc/hosts. allow, будет выдано сообщение "Connection closed by remote host" ("Co единение закрыто удаленным хостом"). Для запрета соединения без отправки ответа вызывающей стороне служит парами) spawn, который также может использоваться для запуска сценариев (или стандартны системных утилит). Рассмотрим пример, в котором будут отклоняться запросы на соединение к любом ранее не описанному даемону, а пользователю root — передаваться почтовое сообщ- ние "ATTENTION" о попытке соединения: ALL : ALL \ : spawn (/bin/echo "%u@%h[%a] attempted to access %d" | \ /usr/bin/mail -s "ATTENTION" rout) & \ : deny В результате, при попытке получения доступа к sshd удаленный пользователык получит никаких сообщений о причине разрыва связи, а пользователь root получит письмо приблизительно такого содержания: From root@mobile.altersys-ua.com Mon Jun 27 12:21:46 2005 Date: Mon, 27 Jun 2005 12:14:09 +0300 (EEST) From: Olexa <root@mobile.altersys-ua.com> To: root@mobile.altersys-ua.com Subject: ATTENTION unknown@informex[192.168.0.1] attempted to access sshd По умолчанию, файл /etc/hosts, allow начинается с записи вида ALL : ALL ; allow, которая разрешает любому хосту доступ к любому сервису — при этом даль нейший просмотр правил не происходит (как упоминалось ранее, перебор выполняете до первого совпадения). Для того чтобы можно было воспользоваться системой TCF Wrappers, данную строку необходимо закомментировать или удалить.
Первоначальная настройка сети 373 Более подробную информацию о файле /etc/hosts. allow можно найти на стра- ицах справочной системы man 5 hosts_access, атакжетап 5 hosts_options. /etc/hosts. equiv Скорее всего, с файлом /etc/hosts.equiv работать не придется. Он содержит (лисок имен доверенных хостов (trusted remote hosts). Пользователям, которые входят систему с доверенных хостов с использованием любой r-утилиты (например, rsh или rlogin), не нужно будет вводить пароль (если для данного пользователя есть запись филе /etc/passwd). Простой формат записи для хоста в этом файле имеет вид: <ИмяМашины> [<ИмяПользователя>] Пример содержимого данного файла представлен в листинге 12.7. [Ьстмнг 12.7. Пример файла /etc/hosts.equiv [ - ' ISFreeBSD: src/etc/hosts.equiv,v 1.4 1999/08/27 23:23:41 peter Exp $ I Iccalhost saformex. altersys-ua . com iltersys.main.com.ua adm tjITDEP Более подробная информация по этому вопросу содержится на странице man 5 ssts. equiv справочного руководства. /etc/dhclient.conf Файл /etc/dhclient. conf является конфигурационным для приложения illiclient. По умолчанию, он содержит только комментарии. Как правило, изменения птотфайл не вносятся, поскольку настройка утилиты dhclient по умолчанию подхо- |нт для большинства пользователей. За более подробной информацией обращайтесь гглаве 22, "Использование DHCP". /etc/inetd.conf Файл /etc/inetd.conf является главным конфигурационным файлом суперсервера inetd, который может управлять соединениями с некоторыми сервисами, определяя, какой программе предназначен запрос на соединение и запуская ее. Таким образом достигается уменьшение общей нагрузки на систему. Каждая строка в конфигурационном файле /etc/inetd. conf представляет собой йпись, описывающую параметры запуска для разрешенных сервисов (даемонов). Для отключения сервисов достаточно закомментировать строку записи, добавив в ее начале символ комментария "#". Формат записей таков (список полей): Имя Сервиса Тип Сокета Протокол (wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max- ^child-per-ip]]] Пользователь[:Группа][/login-клас] Полный Путь К Файлу Даемона Аргументы Даемона Все эти поля должны быть записаны в одну строку и разделены символами табуляции или пробела. Обратите внимание на то, что некоторые поля в записи являются не- йвательными, однако, если они будут включены в запись, то используются без симво- юв разделения. Например: finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
374 Глава 12. Настройка сетевой среды НАСТРОЙКА IPv6 Наверное, ни для кого не секрет, что существует новая улучшенная версия протокола (IPv6), однако, несмотря на это, большинство компьютеров до сих пор используютпр» токол IPv4, стандарт которого был принят еще в 1981 году и опубликован в RFC 791 с тех пор практически не менялся). В начале 1990-х годов с развитием IT-индустрии быстро начало уменьшаться с» бодное адресное пространство. При этом обозначились две основные проблемы: Нехватка адресов. Данная проблема была решена введением понятия маски подсетей и разделением сетей на публичные (Internet) и частные (Private), а так» применением технологии NAT (Network Address Translation). Увеличение таблиц маршрутизации. Проблема, не решенная до сих пор при кг пользовании IPv4. Для поиска путей решения этих проблем в 1992 году была создана рабочая груши IPng WG (IP next generation Working Group). В 1995 году был сформирован и опублико- ван в RFC 1883 пакет предложений, получивший название IPv6 (IP version 6). Протоки IPv6 оставил основные принципы IPv4 неизменными — это и дейтаграммный методрт боты, и фрагментация пакетов, и возможность установки времени жизни пакета (тепер! называется максимальным числом прыжков). Система FreeBSD включает эталонную реализацию IPv6, поэтому нет никаких № раничений по поводу использования этого протокола в данной операционной систем В текущем разделе будут рассмотрены особенности самого протокола IPv6, а также по- рядок конфигурирования системы FreeBSD для его использования. Особенности протокола IPv6 Сразу же отметим, что протокол IPv6 решает обе проблемы, упомянутые ранее ди протокола IPv4: Применение 128-битного адресного пространства. Это означает, что теоретически доступно 3.4028236692093846346337460743177е+38 адресов (вместо 42949672И в IPv4). Маршрутизаторы хранят в таблицах только агрегированные адреса сетей, что по- зволяет уменьшить средний размер таблицы маршрутизации до 8192 записей. Однако разработчики нового протокола на этом не остановились. Помимо решени проблем IPv4, были добавлены новые возможности. Перечислим некоторые усовершенствования в IPv6: Изменен формат заголовка. Вместо четырнадцати полей, как было в IPv4, теперь присутствуют только восемь. При этом три поля вошли в новый заголовок под но выми названиями. Поле TOTAL LENGTH стало называться PAYLOAD LENGTH, я было изменено его назначение: теперь оно обозначает длину полезных данных вместо просто полной длины заголовка. Поле TIME TO LIVE переименовано в hop LIMIT, и теперь обозначает не время жизни пакета в секундах, а срок жизни пакета по числу допустимых прыжков. Поле PROTOCOL, определяющее, к какому транспортному протоколу принадлежат данные в теле пакета, переименовано в NEXT HEADER и может расширяться (то есть, включать по необходимости дополнительные заголовки). Особый интерес представляют новые поля в заголовке пакета: поле PRIO и четырехбитовое поле FLOW LABEL. Первое из них попку ляет задать уровень приоритета пакетов, а второе обеспечивает потоковую обработку. Поля SOURCE ADDRESS И DESTINATION ADDRESS изменили расположение и длину, которая теперь составляет 128 бит для каждого поля. Автоматическая настройка IP-адресов.
Настройка IPv6 375 ■ Встроенная система шифрования, аутентификации, безопасности (IPsec, IP Security), а также улучшенная поддержка качества обслуживания (QoS, Internet Quality of Service). ■ Поддержка групповой адресации ("один к нескольким из множества"). 1 Присутствие обязательных адресов множественной рассылки. ■ Мобильный IP — мобильный хост может напрямую связываться с другими узлами без участия базовой сети как посредника. • Механизм преобразования адресов IPv6 в IPv4. ■ Расширяемость протокола. Переход от полностью детализированного описания протокола к протоколу, который разрешает поддержку дополнительных функций. Адресация в IPv6 Протокол IPv6 допускает три типа адресов: одноадресные (Unicast), групповые toycast) и многоадресные (Multicast). Адреса Unicast (или однонаправленные адреса) являются, наверное, наиболее из- (стными. Этот тип адресов идентифицирует единственный интерфейс, и при правиль- з построенной сети пакеты с таким типом адреса приходят на единственный интер- ейс. Однако в действительности существует несколько форм Unicast-адресов: для гло- мьных коммуникаций используются глобальные провайдер-ориентированные (Рго- ider Based) однонаправленные адреса, внутри подсетей — локальные (Local-Use) одно- шравленные адреса. Адреса Anycast являются альтернативными Unicast-адресами (синтаксически неот- ичимыми друг от друга) и используются только маршрутизаторами. Данный тип паке- )в является новшеством в IP-адресации. Адреса такого типа, как и Unicast, также адре- (тот группу интерфейсов, при этом пакеты доставляются только на один ближайший «гласно метрике маршрутизатора) интерфейс. Иногда данный тип адресов еще назы- иот кластерными (Cluster). Адреса Multicast идентифицируют группу интерфейсов. Пакеты с таким адресом оставляются на все интерфейсы, входящие в группу многоадресного вещания. Обращаем внимание на то, что адреса Multicast в IPv6 подобны широковещатель- ым адресам в IPv4 (х.х.х.255), а сами широковещательные (Broadcast) адреса, как тако- №, здесь отсутствуют. В протоколе IPv4 для использования в специальных целях присутствуют зарезерви- шанные адреса. В протоколе следующего поколения IPv6 таких адресов намного вльше. Они перечислены в табл. 12.5 (см. RFC-3513). Таблица 12.5. Список зарезервированного пространства адресов IPv6 специального назначения М адрес Длина в Описание -Примечания битах :: 128 бит без; описания ■ Подобен 0.0.0.0 в IPv4, Используется, чтобы указать, ято адрес не присвоен.,Не , . . может использоваться как адрес назначения rtl 126 бит Loopback- " Подобен,-JL27. 0, 0.1 в IPv4. Не адрес ' может бкть'присвоен никакому 'интерфейсу «00:xx:xxixx:xx 96 бит встроенный, в ,,1Рг4-совмеетимый адрес IPv6", TEv6 адрес Младшие 32 бита содержат адрес IPv4 IPv4 ::FF:xx:xx:xx:xx 96 бит адрес IPv6, Младшие 32 бита содержат адрес .-■■:■■.-. отображенный IPv4. Используется для хостов, на IPv4 ' не поддерживающих IPv6
376 Глава 12. Настройка сетевой среды Таблица 12.5. Окончание IPv6 адрес Длина в Описание Примечания битах FE80::-FEB:: 10 бит link-XocaL Подобен loopback-адресу в ГРт( FEC0::-FEF:: 10 ;бит . site-local FF:: 8 бит Групповой_ - адрес 001 3 бит global - - uni.cast Поддержка QoS Протокол IPv4 поддерживал QoS, используя другие протоколы, например, DiffSa (протокол дифференцированных услуг) или IntServ (протокол интегрированных услуг Протокол IPv6 имеет встроенную поддержку QoS (RFC 2990). Это достигается, блап даря наличию четырехразрядного поля PRIO в заголовке IPv6. Именно оно позволщ источнику при отправке данных указывать необходимый уровень приоритета для одш пакетов относительно других. Существует два диапазона значений приоритета: пе[ вый — диапазон значений от 0 до 7 — используется для управления перегрузкой; втс рой — диапазон значений от 8 до 15 — используется для трафика, пакеты которого ш сылаются с постоянной скоростью (то есть, даже в случае перегрузки канала они пер даются без отсрочки). Встроенная поддержка безопасности Протокол IPv6 имеет два встроенных механизма, которые позволяют обеспечивэт безопасность соединения. При этом они могут использоваться как по отдельности, так вместе. Первый из них называется "Authentication Header" (RFC-1826) и является рас ширением заголовка. Он обеспечивает аутентификацию и строгую целостность IP дейтаграмм. Это достигается, благодаря добавлению к IP-дейтаграмме дополнительно) информации, которая вычисляется из всех неизменяемых при передаче полей (и hi только полей IP-заголовка). Второй механизм также является расширением IP-заголовка и называется "Encapsit lating Security Payload" (RFC-1827). В отличие от предыдущего, он отвечает за целост ность и конфиденциальность 1Ру6-дейтаграмм. Это достигается, благодаря шифровании данных и замене исходных. При этом могут шифроваться как данные транспортного уровня, так и вся IP-дейтаграмма. Несмотря на свою простоту, данный механизм до вольно гибок и алгоритмически независим. Автоматическая настройка Автоматическая настройка была введена для упрощения процедуры конфигурирс- вания и включения компьютера в сеть Internet. Как минимум, автоматическая настроив предусматривает способность получать уникальный IP-адрес и адрес маршрутизатора В первую очередь, интерфейс пытается присвоить локальный однонаправленный адрес, который справедлив только для той подсети, к которой подключен компьютер. При этом в качестве начальной части адреса будет использован префикс формата Local-Us IPv6 Unicast Address (или, если быть точнее, — Link-local), а в качестве остальной част будет использовано какое-нибудь уникальное число (как правило, МАС-адрес сетевое карты). После этого система пытается проверить уникальность данного адреса в Intern^ и в том случае, если он окажется неуникальным, будет выбран другой адрес, подобра» ный случайным образом. В более сложном варианте компьютер также определяет адрес маршрутизатора (посылает запрос обнаружения). Если маршрутизатор обнаружен, то локальный адрес №
Настройка IPv6 377 врфейса будет сформирован в соответствии с адресом найденного маршрутизатора, «противном случае будет предпринята попытка поиска DHCP-сервера и установки ди- имического адреса. Как читать адреса IPv6 При первом взгляде на 1Ру6-адрес можно прийти в ужас. Если вид МАС-адреса отпугивает даже для самого стойкого администратора, то что уж говорить об "этом". Итак, каноническая форма адреса IPv6 представляется в виде х: х: х: х: х: х: х: х, где иждому "х" соответствует 16-битовое шестнадцатеричное число. Например, полная запись некоторого адреса IPv6 может иметь следующий вид: FEDC:BA98:7 654:3210:FEDC:BA98:7 654:3210 Иногда, в адресе могут присутствовать строки, полностью заполненные нулями. Одна такая последовательность может быть сокращена до "::". Кроме того, несколько имущих нулей (до трех) на одно 16-битовое шестнадцатеричное число могут быть опущены. К примеру, адрес аааа: : 23: f в канонической форме имеет вид: аааа:0000: 0000:0000:0000:0000:0023:ffff Есть еще один способ записи 1Ру6-адреса, при котором последние 32 бита записываются в десятичном виде и представляют собой 1Ру4-адрес с точками "." в качестве разделителей. К примеру, запись ffff: :192.168.0.200 в канонической форме имеет вид: ffff: 0000:0000:0000:0000:0000:с0а8:00с8 ш в чаще используемом виде (как отображает, например, утилита if conf ig): ffff::c0a8:c8 Существует также соглашение о записи автоматически настроенных локальных адресов, которые генерируются на основе МАС-адреса (реализация IPv6 от КАМЕ). Припер записи для IP-адреса, автоматически сформированного на основании МАС-адреса сетевой карты ерО, и присвоенного данному интерфейсу может выглядеть следующим образом: fe80: :201:3ff:fe82:5с41%ер0 Использование IPv6 в FreeBSD На данный момент существует несколько способов подключения системы FreeBSD цругим хостам в 1Ру6-сетях: ■ подключиться к экспериментальной сети бЬопе (бЬопе. net); • использовать туннелирование IPv6 в IPv4; • получить сеть IPv6 от провайдера; • воспользоваться портом /usr/ports/net/freenet6 в случае коммутированного соединения. Итак, необходимо получить IP-адрес и префикс, а затем настроить маршрутизацию iDNS. Прежде чем приступить к непосредственной настройке, проверьте, поддержива- етли система IPv6 на уровне ядра. Если используется ядро GENERIC (по умолчанию), го можете не беспокоиться — система, начиная с версии FreeBSD 4.0, имеет встроенную поддержку IPv6. В противном случае, потребуется проверить, не были ли ранее удалены некоторые "ненужные" строки из файла ядра. Наиболее важна запись: options INET6 # IPv6 communications protocols
378 Глава 12. Настройка сетевой среды ■ Эта запись позволяет системе использовать протокол IPv6 в "чистом" виде. Одни этого, как правило, недостаточно: найти провайдера, напрямую поддерживающего IPifl довольно сложно (особенно для стран СНГ ©). По этой причине в ядро придется вод! чить также поддержку IP-туннеля. Для этого в файле ядра должны присутствовать ся дующие строки (после их добавления ядро необходимо пересобрать): I device tun # Packet tunnel. device gif It IPv6 and IPv4 tunneling device faith # IPv6-to-IPv4 relaying (translation] Настройка клиента сети IPv6 После проверок и подготовительных процедур необходимо внести некоторые изш нения в файл /etc/rc. conf. Если предполагается использовать компьютер в качесп клиента сети IPv6, то просто добавьте следующую строку: ipv6_enable="YES" Затем, если существует известный IPv6-aapec (например, 3f ff: 3f ff :3fff 3f f f: : 2), то для того, чтобы присвоить его интерфейсу (например, IncO), необходим выполнить следующую команду: # ifconfig IncO inet6 3fff:3fff:3fff:3fff::2 prefixlen 64 Проверим доступность другого хоста в сети, "пропинговав" его: # ping6 -с 2 3fff:3fff:3fff:3fff::1 PING6(56=40+8+8 bytes) 3fff:3fff:3fff:3fff::2 —> 3fff:3fff:3fff:3fff::1 16 bytes from 3f f f: 3f f f: 3f f f: 3fff: : 1, icmp_seq«0 hlim=64 time=3.644ia 16 bytes from 3f f f: 3f f f: 3f f f: 3f f f: : 1, icmp_seq=l hlim=64 time=0.894ni 3fff:3fff:3fff:3fff::1 ping6 statistics 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/std-dev - 0.894/2.269/3.644/1.375 ms Если хост оказался доступным, можно внести изменения в файл /etc/rc.conl Для автоматической настройки интерфейса на использование во время загрузки сисп мы добавьте следующую строку (изменив адрес на действительный в вашем случае): ipv6_ifconfig_lnc0="inet6 3fff:3fff:3fff: 3fff: : 2 prefixlen 64" Для записи маршрутизатора по умолчанию, добавьте в файл /etc/rc. conf cj» дующую строку (естественно, изменив адрес шлюза): ipv6_defaultrouter="3fff:3fff:3fff:3fff: :1" При этом ручная установка 1Ру6-маршрута по умолчанию может иметь следующй вид: # route add -inet6 default -interface lncl add net default: gateway lncl или # route add -inet6 default 3fff:3fff:3fff:3fff::1 add net default: gateway 3fff:3fff:3fff:3fff::1 Данный способ является самым простым и больше подойдет для использован» в локальной сети, поскольку большинство провайдеров до сиих пор не предоставляв доступ в сеть IPv6 напрямую. Но как же выйти во внешний мир? Рассмотрим другие» рианты использования IPv6— более реалистичные на сегодняшний день— на при»! pax создания туннелей IPv6-b-IPv4.
Настройка IPv6 379 Freenet6 В действительности, для работы в сети IPv6 также необходимо официально получить неповторяющийся адрес. Хотя столкнуться с такой ситуацией, наверное, довольно трудно в таком большом адресном пространстве, для нормальной работы необходимо получить официальный адрес или пространство адресов, а также адрес конечной точки туннеля. В случае если официально получать адресное пространство в данный момент нет необходимости, существует возможность получать доступ с использованием динамически выделяемых адресов. Это проще всего. Да и настройка не вызывает практически никаких проблем. Самым быстрым и простым способом получения IPv6-aflpeca и создания туннеля шляется система Freenet6 (www. freenet6.net). Для ее использования в первую очередь необходимо установить программу TSP Client (TSP — Tunnel Setup Protocol). Эта программа автоматически получает адрес с сервера и создает туннель к серверу Freenet6. Ее можно найти на сайте Freenet6 (второй шаг в процессе регистрации) или же установить из коллекции портов /usr/ports/net/f reenet6. Далее необходимо решить: будете ли вы анонимным пользователем или же хотите пройти процедуру регистрации. Программа TSP Client будет работать в обоих случаях, однако регистрация позволяет получать адрес с префиксом /4 8 (вместо /64 как для анонимного пользователя), который не изменяется при изменении адреса IPv4 (то есть, закрепляется за пользователем). После прохождения процедуры регистрации вы получите идентификатор пользователя (выбиваете сами) и пароль (получите по почте). Для установки программы TSP Client из набора портов выполните следующую последовательность команд: # cd /usr/ports/net/freenet6 # make install clean В случае успешного выполнения этих команд все необходимые программы и конфигурационные файлы будут установлены в системе. Стартовый сценарий freenet6.sh будет расположен в директории /usr/local/etc/rc.d. Прежде чем его использовать, необходимо создать конфигурационный файл tspc.conf (смотрите страницу справочного руководства man tspc. conf) в директории /usr/local/etc и добавить несколько строк в файл /etc/гс. conf. Отметим, что можно просто скопиро- ить и отредактировать пример конфигурационного файла: # ср /usr/local/9hare/examples/freenet6/tspc.conf.sample Wusr/local/etc/ tspc.conf Приведем файл tspc.conf приблизительно к такому виду как показано в листинге 12.8. Пистанг 12.8. Пример конфигурации tsp_dir=/usr /local auth_method=any client_v4=auto ♦Если вы - зарегистрированный пользователь, установите свой ID и пароль ii3erid=<Bama учетная запись на сервере Freenet6> passwd=<Bam пароль> server=broker. freenet6.net t I Для анонимного соединения используйте id, равный anonymous, и пустой пароль tuserid=anonymous <passwd= ♦server=anon. freenet6.net »
380 Глава 12. Настройка сетевой среды Листинг 12.8. Окончание template=tspc-freebsd retry_delay=30 tunnel_mode=v6anyv4 if_tunnel_v6v4=gif0 if_tunnel_v6udpv4=tunl proxy_client=no keepalive=yes keepalive_interval=30 syslog_facility=DAEMON syslog_level=INFO В конфигурационный файл /etc/rc. conf добавим следующие строки: freenet6_enable="YES" freenet6_flags="-f /usr/local/etc/tspc.conf" Теперь, независимо от того, зарегистрированный вы пользователь или анонимный,] можно выполнить следующую команду для получения IPv6-aflpeca (при этом компью-1 тер должна иметь выход в сеть Internet): # /usr/local/etc/rc.d/freenet6.sh start Starting freenet6. tspc - Tunnel Setup Protocol Client v2.1.1 Initializing (use -h for help) Connecting to server with reliable udp Got tunnel parameters from server, setting up local tunnel Going daemon, check tspc.log for tunnel creation status Получив такой результат, можете быть уверены в том, что вы стали полноправным членом сообщества пользователей IPv6. Однако для контроля (а также, если вдруг возникли проблемы) можете просмотреть журнальный файл, в котором отображаются все сообщения об успешном получении адреса или о возникших проблемах: # more /usr/local/etc/rc.d/tspc.log 2005/07/01 20:54:35 tspc: tspMain: tspc - Tunnel Setup Protocol Client %>v2.1.1 2005/07/01 20:54:35 tspc: tspMain: Initializing (use -h for help) 2005/07/01 20:54:35 tspc: tspMain: Connecting to server with reliable udp 2005/07/01 20:54:40 tspc: tspSetupTunnel: Got tunnel parameters from 4>server, setting up local tunnel 2005/07/01 20:54:40 tspc: tspStartLocal: Going daemon, check tspc.log 4>for tunnel creation status 2005/07/01 20:54:41 tspc: tspSetupInterface: Your IPv6 address is 4>2001:05c0:8fff:fffe:0000:0000:0000:2e2d Помимо этого, в системе будет создан туннельный интерфейс (gifX или tunX), параметры которого можно просмотреть с помощью утилиты if conf ig: # ifconfig plipO: flags=10885KUP,POINTOPOINT, RUNNING, SIMPLEX, MULTICAST> mtu 1500 loO: flags=804 9<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask Oxff000000 inet6 ::1 prefixlen 128 inet6 fe80::l%lo0 prefixlen 64 scopeid 0x2 epO: flags=884 3<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::201:3ff:fe82:5c41%ep0 prefixlen 64 scopeid 0x3 i inet 192.168.0.200 netmask OxffffOOOO broadcast 192.168.255.255
Настройка IPv6 381 ether 00:01:03:82:5c:41 tunl: flags=805KUP,POINTOPOINT, RUNNING, MULTICAST> mtu 1280 inet6 fe80::201:3ff:fe82:5c41%tunl prefixlen 64 scopeid 0x4 inet6 2001:5c0:8fff:fffe::2e2d —> 2001:5c0:8fff:fffe::2e2c "bprefixlen 128 Opened by PID 573 В данном случае, как видно из журнального файла, а также выходных данных утилиты ifconfig, в системе был создан туннельный интерфейс tunl с 1Руб-адресом 2001:5cO:8f ff: fffe: :2e2d. Конечная точка туннеля IPv6-b-IPv4 имеет адрес 2001:5cO:8fff: ff fe: :2е2с. Если вы— зарегистрированный пользователь, то полученный 1Ру6-адрес будет закреплен за вами, в противном случае он будет меняться при каждом создании туннеля. Чтобы окончательно удостовериться в том, что вы имеете доступ к сети IPv6, проще всего "пропинговать" какой-нибудь удаленный хост, зная, что он имеет установленный IPv6-aflpec. Это можно сделать следующим образом: # ping6 -с 2 www.kame.net PING6(56=40+8+8 bytes) 2001:5с0:8fff:fffe::2e2d —> 2001:200:0:8002:203:47ff:fea5:3085 16 bytes from 2001:200:0:8002:203:47ff:fea5:3085, icmp_seq=0 hlim=53 "btime=659.285 ms 16 bytes from 2001:200:0:8002:203:47ff:fea5:3085, icmp_seq=l hlim=53 "btime=639.338 ms — www.kame.net ping6 statistics 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 639.338/649.312/659.285/9.973 ms Существует также еще один, довольно экстравагантный способ проверки, для реализации которого в системе должен быть установлен сервер X-Window (XFree86 или X.ORG), а также браузер страниц, поддерживающий IPv6. В принципе, такая поддержка есть и в браузере Konqueror (стандартный для оболочки KDE), и в Epiphany (стандартный для оболочки GNOME). С их помощью можно зайти на сайт www. kame. net и увидеть ползущую черепашку. Если черепашка не двигается, значит что-то не так. бЬопе Как быть пользователям, которые имеют пул статических IP-адресов и хотят иметь такой же статический пул 1Ру6-адресов, чтобы предоставлять доступ к своим Web- серверам или к серверу DNS пользователям сети IPv6? Для таких пользователей существует еще один, наиболее популярный способ: подключение к бЬопе. Для начала, посетите сайт www.6bone.net и просмотрите условия подключения (http://www.6bone.net/6bone_hookup.html). Пройдя регистрацию, просмотрите существующие точки подключения и обратитесь за инструкциями по подключению. В результате вам могут предоставить данные, необходимые для настройки туннеля GRE (интерфейс gif). Описывать данный процесс мы не будем, а вместо этого рассмотрим настройку системы FreeBSD на использование туннеля с интерфейсом gif. Прежде всего, перечислим используемые метки: ■ 0UR_IN_IPv4_ADDR — внешний 1Ру4-адрес компьютера; ■ REMOTE_IN_IPv4_ADDR — адрес IPv4 удаленного хоста, с которым будет создан туннель; ■ 0UR_TUNNEL_lPv6_ADDR — назначенный вам 1Ру6-адрес для использования при подключению к туннелю; • REMOTE_TUNNEL_IPv6_ADDR — предоставленный 1Ру6-адрес удаленной стороны, с которым будет создан туннель и который будет выступать в качестве шлюза IPv6.
382 Глава 12. Настройка сетевой среды Теперь, используя вышеупомянутые метки, опишем процесс создания туннели В первую очередь, необходимо создать интерфейс gif 0, а затем установить для нега! необходимые параметры (замените перечисленные выше метки реальными значенм-j ми), и не забыть установить маршрут по умолчанию: # ifconfig gifO create # ifconfig gifO gifO: flags=8010<POINTOPOINT,MULTICAST^ mtu 1280 it ifconfig gifO tunnel OUR_IN_IPv4_ADDR REMOTE_IN_IPv4_ADDR it ifconfig gifO inet6 OUR_TUNNEL_IPv6_ADDR REMOTE_TUNNEL_IPv6_ADDR •feprefixlen 128 В самом конце не забудьте установить маршрут одним из следующих способов: # route add -inet6 default -interface gifO # route add -inet6 default REMOTE_TUNNEL_IPv6_ADDR В более реалистичном случае это может выглядеть следующим образом: # ifconfig gifO create # ifconfig gifO gifO: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 # ifconfig gifO tunnel 82.83.84.1 200.201.202.1 # ifconfig gifO inet6 2001:5c0:8fff:fffe::2e2d 4>2001:5c0:8fff:fffe::2e2c prefixlen 128 # ifconfig gifO gifO: flags=805KUP, POINTOPOINT, RUNNING, MULTICAST^ mtu 1280 tunnel inet 82.83.84.1 —> 200.201.202.1 inet6 2001:5c0:8fff:fffe::2e2d —> 2001:5c0:8fff:fffe::2e2c 4>prefixlen 128 inet6 feBO::201:3ff:fe82:5c41%gif0 prefixlen 64 scopeid 0x4 # route -n add -inet6 default -interface gifO add net default: gateway gifO Для того чтобы проверить, удачно ли было выполнено создание туннеля, можно "пропинговать" адрес многоадресного вещания ff02: :l%gif0 и получить два ответ на один запрос (второй ответ приходит от удаленной конечной точки туннеля): # ping6 -с 2 ff02::l%gif0 PING6(56-40+8+8 bytes) fe80::201:3ff:fe82:5c4l%gif0 —> ff02::l%gif0 16 bytes from fe80::201:3ff:fe82:5c41%gif0, icmp_seq=0 hlim=64 time=l.375 ms 16 bytes from fe80::2a0:a5ff:fe4b:c96%gif0, icmp_seq=0 hlim=64 4>time=338.420 ms(DUP!) 16 bytes from fe80::201:3ff:fe82:5c41%gif0, icmp_seq=l hlim=64 time=0.612 ms ff02::l%gif0 ping6 statistics 2 packets transmitted, 2 packets received, +1 duplicates, 0.0% packet loss round-trip min/avg/max/std-dev =- 0.612/113.469/338.420/159.065 ms Проверку работоспособности маршрута по умолчанию (и доступности сети) можно выполнить с помощью утилиты traceroute6 или увидеть в браузере ползущую черепашку на сайте www.kame.net: # traceroute6 www.kame.net traceroute6 to www.kame.net (2001:200:0:8002:203:47ff:fea5:3085) from 2001:5c0:8fff:fffe::2e2d, 64 hops max, 12 byte packets 1 2001:5c0:8fff:fffe::2e2c 355.228ms 325.821ms 331.844ms { ... } 13 gr2000.k2.wide.ad.jp 645.268 ms 638.416 ms 635.288 ms 14 orange.kame.net 645.322 ms 639.569 ms 655.336 ms
Настройка устройств Wi-Fi 383 Если все прошло успешно, сохраните настройки в файле /etc/rc. conf: gif_interfaces="gifO" gifconfig_gifO="OUR_IN_IPv4_ADDR REMOTE_IN_IPv4_ADDR" ipv6_ifconfig_gifO="OUR_TUNNEL_IPv6_ADDR REMOTE_TUNNEL_IPv6_ADDR 'bprefixlen 128" ipv6_defaultrouter="REMOTE_TUNNEL_IPv6_ADDR" Автоматическая настройка хостов При рассмотрении особенностей протокола IPv6 была упомянута возможность ав- гоматической настройки 1Ру6-адресов. За распространение маршрутов и автоматиче- скую настройку хостов отвечает даемон rtadvd. Для его запуска необходимо добавить несколько строк в файл /etc/rc. conf на хосте, отвечающем за распространение маршрута. В первую очередь, следует позаботиться об автоматическом запуске самого дае- иона, поэтому добавим строку: rtadvd_enable="YES" На следующем шаге укажем интерфейс, на котором будет выполняться запрос маршрутизатора IPv6. Для того чтобы задать использование интерфейса ерО, добавьте вфайл /etc/rc. conf следующую строку: rtadvd_interfaces="epO" Даемон rtadvd может работать только на шлюзе, потому необходимо также включить возможность перенаправления пакетов IPv6, добавив следующую строку в конфи- |урационный файл г с. conf: ipv6_gateway_enable="YES" После внесения необходимых изменений в главный конфигурационный файл системы необходимо создать конфигурационный файл для rtadvd. Этот файл, по умолчанию, должен находиться в директории /etc под названием rtadvd. conf. Его структура проста, как и настройка. Пример файла /etc/rtadvd. conf для интерфейса ерО и префикса размещения 3ffe: 501: ffff: 1000: : (/64) представлен в листинге 12.9. Листинг 12.8. Пример конфигурационногофайла /«tc/rtadvd.cong для интерфейса арО ерО:\ :addrs#l:\ :addr="3ffe:501:ffff:1000::":prefixlen»64:together: Теперь любой клиент сети с включенной поддержкой IPv6 (строка ipv6_enable="YES" в файле /etc/rc.conf), но не выступающий в роли шлюза IPv6, автоматически получит IPv6-aflpec на основании префикса размещения и МАС- гщреса сетевой карты. Вручную запустить опрос поиска шлюза (чтобы не перезапускать ииента) с автоматической настройкой интерфейсов можно с помощью утилиты rtsol: # rtsol -a Настройка DNS Настройка DNS-сервера на работу с адресами IPv6 рассмотрена в главе 20. НАСТРОЙКА УСТРОЙСТВ WI-FI Все более и более популярными становятся беспроводные устройства для связи компьютеров в локальной сети. Это позволяет обойти ограничения, накладываемые использо-
384 Глава 12. Настройка сетевой среды ванием сетевого кабеля. Кроме того, это более удобно, благодаря отсутствию "вози' с тем же кабелем. Операционная система FreeBSD может использоваться в качели клиента беспроводной сети, а в некоторых случаях также и в качестве точки дрсщ (Access Point). В этой книге настройка FreeBSD, как точки доступа, описана не будеп связи с редкостью применения такого решения, а также проблемой поддержки таив устройств самой системой. Описание настройки системы FreeBSD в качестве точки д» тупа можно найти в FreeBSD Handbook (Advanced Networking). Большинство точек доступа— это независимые устройства с независимой коф гурацией и своим собственным IP-адресом. Как правило, они настраиваются с отделы» го компьютера с использованием кабеля Ethernet или USB. Таким образом, в локально»" сети, построенной на беспроводной технологии, может присутствовать один ПК с сете- вой картой Ethernet специально для настройки точки (или точек) доступа. В данном разделе будет принято, что точка доступа — это отдельное устройство!!! компании Global Sun Technology (модель 802.11 АР GL2411АР), описание настройки к» торого как отдельного устройства не рассматривается (каждое устройство может имен собственные утилиты настройки). В качестве клиентской системы использовалась вер сия FreeBSD 5.3 RELEASE. Устройство беспроводной связи на клиентской машине- SENAO Wireless PC Card SL-2011 CD (IEEE 802.11b совместимое), имеющее возмо* ность WEP-шифрования (64- и 128-bit). Несколько слов о беспроводной технологии Wi-Fi — аббревиатура от Wireless Fidelity (дословный перевод — "беспроводна точность"). Для передачи данных в беспроводных сетях используется частота 2,4 ГГн Беспроводные сети описываются различными стандартами, но все они относите к стандартам IEEE 802.11 (наиболее распространены варианты стандартов 802.1 It 802.11b и 802.1 lg). Существование нескольких вариантов стандарта обусловлено тек что многие компании "на заре" возникновения беспроводных сетей экспериментировав ли с протоколом IEEE 802.11 с целью увеличения скорости передачи данных. В результате было принято только несколько стандартов: 802.11а, 802.11b и 802.1 lg со скор» стями 54 Мбит/с, 11 Мбит/с и 54 Мбит/с соответственно. Стандарт беспроводных сетей был разработан в конце 1990-х годов и одобрен только! 1999 году. В стандарте 802.11 рассматривается два основных варианта архитектуры беспро водных сетей (на МАС-уровне): ad-hoc и режим инфраструктуры (Infrastructure Mode). Первый вариант — самый простои и часто называется IBSS (Independent Basic Service Set), (i позволяет организовывать сети в режиме "peer-to-peer" ("точка-точка"). В данном режим! связь между рабочими станциями устанавливается непосредственно по принципу "каждый с каждым". При этом не требуется создание общей сетевой инфраструктуры. Каждая рабочая станция оснащена простым беспроводным адаптером, однако при этом ощущается о» новной недостаток такого режима: ограниченный диапазон действия сети и невозможного подключения к сети другого типа (например, к корпоративной кабельной сети или Internet В режиме инфраструктуры станции взаимодействуют между собой не напрямую,! через точку доступа. Точка доступа взаимодействует с устройствами, находящимися в радиусе своего действия, и выполняет в беспроводной сети роль концентратора (подобно тому, как это происходит в кабельных системах). Устройства пользователей по» этом напрямую друг с другом не связываются. Рассматривается два режима взаимодействия с точками доступа: BSS (Basic Service Set) и ESS (Extended Service Set). В первом варианте (BSS) присутствует только одна точка доступа, и все станции связываются между собой только через нее (точка доступа может иметь подключение к внешней сети, выполняя в таком случае роль моста). Be втором варианте (ESS) строится целая инфраструктура из нескольких сетей BSS, а то*' ки доступа взаимодействуют между собой, позволяя таким образом передавать веса трафик от одной сети к другой. Заметим, что точки доступа могут соединяться мщ< собой с помощью кабельной сети или радио-мостов.
Настройка устройств Wi-Fi 385 Каждая беспроводная сеть имеет свое имя, которое называется идентификатором «проводной сети SSID (ESSID). Идентификатор SSID— это строковое значение данной максимум 32 символа, которое служит для разделения двух и более различных беспроводных сетей в одной местности. Каждый клиент беспроводной сети также имеет установленный SSID, который определяет, в какую беспроводную сеть он входит (если шиента установлен SSID, равный OEM, то он может получить доступ к точке доступа 1гаким же SSID). Все беспроводные устройства имеют понятие канала (Channel). Существует четырнадцать доступных каналов. Канал, используемый по умолчанию, зависит, как правило, от страны. На ступень ниже ... Для доступа к среде передачи данных в сетях Wi-Fi применяется метод множественного доступа с контролем несущей и уклонением от столкновений (CSMA/CA), что очень сильно напоминает технологию доступа, реализованную в сети Ethernet, где используется метод множественного доступа с контролем несущей и обнаружением столкновений (CSMA/CD). Как видно из названия, единственное отличие между этими иумя методами заключается в том, что вместо обнаружения столкновений использует- слтехнология уклонения от них. Перед передачей данных станция в первую очередь отправляет специальное сообщение RTS (Ready To Send), трактуемое как готовность узла к отправке данных. Принимающая станция, получив сообщение RTS, отправляет в ответ сигнал CTS (Clear To Send), сообщая о готовности приёма информации. Затем передающая станция отсылает вакет данных, а приёмная станция — кадр АСК, подтверждая безошибочный прием. Вслучае неполучения кадра АСК попытка передачи пакета данных повторяется. Таким образом, вероятность возникновения столкновений минимизируется с помощью четырехступенчатого протокола передачи данных (4Way handshake). Настройка клиента Рассмотрим порядок настройки беспроводной сети в режиме BSS (один клиент FreeBSD и одна точка доступа). Настройка точки доступа опущена, однако приведем условленные параметры (а также их изменения, в зависимости от примера). Примем, что наша точка доступа имеет IP-адрес 192.166 .1.1, а значение подсети равно 255 .255 .0.0. Имя точки доступа — GL2411AP. Идентификатор беспроводной сета SSID установлен в значение BSDNET. Используется шестой канал (по умолчанию). Значение RTS Threshold равно 2312. Режим работы точки доступа (Operation Mode) — "Access Point". Оговоримся также, что точка доступа соединена кабелем Ethernet с персональным компьютером, имеющим IP-адрес 192 .168 . 0.1 (подсеть 255.255.0.0). Проверьте наличие поддержки беспроводного адаптера в файле ядра. Ядро FreeBSD S3(/sys/i386/conf/generic) по умолчанию содержит следующие строки: # Wireless NIC cards device wlah # 802.jl • support device an # Aifonet 4500/4800, 802.11 wireless NICs. device awi # BayStack 660 and others device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs. #device wl # Older non 802.11 Wavelan wireless NIC. Система FreeBSD 4.11 не имеет записи device wian, а запись для драйвера wi шетбыть найдена в файле /sys/i386/conf/LiNT. Просмотрите список поддер- юеаемого оборудования с помощью справочного руководства (например, man wi). Большинство адаптеров правильно опознаются системой, но все-таки мы настоя- иьно рекомендуем: узнайте при приобретении адаптера, какие операционные системы
386 Глава 12. Настройка сетевой среды его поддерживают. Например, беспроводные адаптеры компании Zyxel до сих пор не поддерживаются системой FreeBSD. Поддержка большинства адаптеров (кроме старт устройств wl) уже встроена в ядро системы по умолчанию— это относится ко к FreeBSD 4.x (и более ранним версиям), так и ко всем последующим версиям системы. Для начала удостоверимся в том, что система правильно определила адаптер. Как в прежде, используем для этого уже знакомую утилиту if conf ig: mobile* ifconfig -a plipO: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST> ratu 1500 loO: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST^ mtu 16384 inet 127.0.0.1 netmask Oxff000000 wiO: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 ether 00:02:6f:01:03:a5 media: IEEE 802.11 Wireless Ethernet autoselect (none) ssid "" stationname "FreeBSD WaveLAN/IEEE node" channel -1 authmode OPEN powersavemode OFF powersavesleep 100 rtsthreshold 2312 protraode CTS wepmode OFF weptxkey 1 Итак, наш адаптер был успешно опознан системой. Теперь необходимо настроить его в соответствии с параметрами беспроводной сети (без шифрования). Установим адаптеру fP-адрес 192.168.1.2И взглянем на результат: mobile» ifconfig wiO inet 192.168.1.2 netmask 255.255.0.0 ssid BSDNET mobile» ifconfig -L wiO wiO: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.1.2 netmask OxffffOOOO broadcast 192.168.255.255 ether 00:02:6f:01:03:a5 media: IEEE 802.11 Wireless Ethernet autoselect (DS/llMbps) status: associated ssid BSDNET 1:BSDNET stationname "FreeBSD WaveLAN/IEEE node" channel 6 authmode OPEN powersavemode OFF powersavesleep 100 rtsthreshold 2312 protmode CTS wepmode OFF weptxkey 1 К слову, в конкретном рассматриваемом случае (то есть, при построении беспроводной сети BSS) указывать SSID не обязательно... Адаптер, находящийся в пределах радиуса действия одной точки доступа, автоматически устанавливает его SSID даже без явного указания. Таким образом, аналогичный результат можно получить с помощью следующей команды: mobile# ifconfig wiO inet 192.168.1.2 netmask 255.255.0.0 В результате наше беспроводное устройство будет автоматически включено и настроено на работу в сети с SSID BSDNET. Заметим, что было установлено значение channel б. Если в вашем случае значения канала в точке доступа и у клиента различны, то потребуется добавить в команде ifconfig опцию вида channel <channel_number>, в противном случае устройства не будут видеть друг друга. В результате настройки на работу с точкой доступа для сети с SSID BSDNET наш компьютер mobile (клиент беспроводной сети) будет виден для компьютера с IP- адресом 192.168.0.1,к которому подключена точка доступа: mobile» ping -с 2 192.168.1.1 PING 192.168.1.1 (192.168.1.1): 56 data bytes 64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time-11.269 ms 64 bytes from 192.168.1.1: icmp_seq=l ttl=64 time«10.230 ms 192.168.1.1 ping statistics
Настройка устройств Wi-Fi 387 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 10.230/10.750/11.269/0.519 ms mobile* ping -c 2 192.168.0.1 PING 192.168.0.1 (192.168.0.1): 56 data bytes 64 bytes from 192.168.0.1: icmp_seq=0 ttl=128 time=8.222 ms 64 bytes from 192.168.0*1: icmp_seq=l ttl=128 time=10.209 ms 192.168.0.1 ping statistics 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 8.222/9.215/10.209/0.994 ms Если при выполнении команды ping вы столкнулись с отсутствием ответа, или же при попытке обращения к удаленному компьютеру отсутствует связь, внимательно изу- игге выходные данные команды ifconfig, а точнее — значение поля status. В случае правильной настройки вы увидите строку: status: associated В противном случае (status : no carrier), что-то неправильно в настройке (например, включено WEP-шифрование), или же точка доступа вне поля видимости. Ого- юримся, что в случае построения беспроводной сети вида "точка-точка" (ad-hoc), в вы- юве команды ifconfig необходимо просто использовать опцию mediaopt (передачей параметра adhoc как показано в следующем примере (в случае использования опции mediaopt прежде обязательно должна быть указана опция media): ifconfig wiO inet 192.168.1.2 netmask 255.255.0.0 ssid BSDNET media "bDS/HMbps mediaopt adhoc В случае успеха не забудьте сохранить настройки в файле /etc/rc. conf: ifconfig_wi0="inet 192.168.1.2 netmask 255.255.0.0 ssid BSDNET channel 6" Шифрование WEP Использование беспроводной сети без шифрования небезопасно и может привести [включению в сеть нежелательных пользователей (которые случайно или преднамеренно окажутся в радиусе действия точки доступа). Шифруя данные в беспроводной ceil, вы усложняете возможность перехвата или прослушивания данных. Наиболее распространенными способами шифрования данных между точкой доступа и клиентами шляются протоколы WEP (Wireless Encryption Protocol) и IPSEC. При этом WEP аппа- ftmo поддерживается большинством беспроводных устройств. Протокол WEP является попыткой обезопасить использование беспроводных сетей йаппаратном уровне, однако он практически сразу же был взломан, поскольку поддается "вскрытию" довольно просто и быстро. Как правило, этот протокол шифрования не пень помогает, если необходимо передать секретные данные. Однако, как бы там ни было, мы рассмотрим именно протокол WEP. Прежде всего оговорим, что ключ шифрования прописывается в точке доступа, а клиенты должны знать его для возможности связи и передачи данных. Предположим, что в точке доступа было установлено значение WEP-ключа 0x1122113311, тогда на шентской беспроводной машине необходимо ввести приблизительно такую команду: mobile» ifconfig wiO inet 192.168.1.2 netmask 255.255.0.0 ssid BSDNET twepmode on wepkey 0x1122113311 mobile! ifconfig -L wiO wiO: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST^ mtu 1500 inet 192.168.1.2 netmask OxffffOOOO broadcast 192.168.255.255 ether 00:02:6f:01:03:a5 media: IEEE 802.11 Wireless Ethernet autoselect (DS/llMbps) status: associated
388 Глава 12. Настройка сетевой среды ssid BSDNET 1:BSDNET stationname "FreeBSD WaveLAN/IEEE node" channel 6 authmode OPEN powersavemode OFF powersavesleep IOC rtsthreshold 2312 protmode CTS wepmode MIXED weptxkey 1 wepkey 1:40-bit В результате успешного выполнения команды ifconfig, поле status примет значение associated, a wepmode вместо OFF примет значение MIXED. В противное случае, проверьте корректность команды и параметров ключа. К слову, используйте более сложный ключ, чем представленный в рассмотренном выше примере. Если в результате выполнения данной команды существует возможность обращаться к другим машинам в сети, не забудьте сохранить параметры настроек в файле /etc/rc.conf: ifconfig_wiO="inet 192.168.1.2 netmask 255.255.0.0 ssid BSDNET wepmode 4>on wepkey 0x1122113311" Обратите внимание на то, что в данном случае ключ хранится на локальном компьютере в незашифрованном виде. Для обеспечения более надежной и безопасной связи используйте шифрование по протоколу IPSEC (об использовании IPSEC будет рассказано в главе 13). НАСТРОЙКА BLUETOOTH Введение в технологию Bluetooth — беспроводная технология для организации сетевого взаимодействии широкого круга устройств на небольшом расстоянии (до 10 метров). На сегодняшний день существуют устройства, с которыми можно взаимодействовать на расстояниях до 100 метров. Технология Bluetooth использует частоту 2,4 ГГц, которая не подлежит лицензированию, и стала настолько популярной, что реализована большинством крупнейший компаний-производителей средств телекоммуникации: Sony Ericsson, Nokia, Motorola, IBM, Toshiba, Apple и др. Как правило, сети на основе Bluetooth состоят из портативных устройств, таких как мобильные телефоны, ноутбуки, клавиатуры, принтеры. Технология Bluetooth намного превзошла другую беспроводную технологию Wi-Fi — и не только из-за своей дешевизны, но и благодаря намного большему числу возможностей (например, передане файлов и голоса, эмуляции последовательных портов). Однако популярность также имеет и негативные последствия, и одно из них — угроза кражи личной информации или вывод мобильных устройств из рабочего состояния. Технология Bluetooth берет свое начало в лаборатории Ericsson Mobile Communications в 1994 году, где были начаты эксперименты по созданию локальных радиосоединений с минимальным потреблением энергии. После продолжительного периода разработки был опубликован окончательный стандарт: частота 2.4 ГГц, дальность действия 10-100 метров, скорость до 723.2 Кбит/с (2.1 Мегабит в спецификации EDR), одновременное соединение с семью другими устройствами. Несмотря на использование аутентификации, шифрования, контроля QoS, технология Bluetooth так полностью и не лишилась уязвимостей в системе безопасности. Использование Bluetooth в FreeBSD Поддержка технологии Bluetooth появилась только с выходом новой версии FreeBSD 5.0 и реализована на основе технологии Netgraph (man netgraph). Больший-
Настройка Bluetooth 389 пво USB-модулей Bluetooth поддерживаются драйвером ngubt, который мы и будем усматривать в связи с поддержкой Bluetooth-устройств в FreeBSD. В качестве Bluetooth-устройства примем MSI Bluetooth Dongle (MS-6970). Поддержка Bluetooth в FreeBSD еще довольно плохо реализована. Можно сказать, что с большинством портативных устройств наладить нормальную и полноценную связь не удастся. Как правило, большинство проблем связано со службами передачи данных. Сложности могут возникнуть также с мобильными устройствами с русской "прошивкой" (невозможно перейти в поддиректории и получить/передать файлы), устройствами с защитой доступа к структуре каталогов и др. Надеемся, что свыходом следующих версий FreeBSD эти проблемы будут устранены. Если вы решились на использование стека Bluetooth, реализованного в системе FreeBSD, то приготовьтесь к затяжной "войне", на которую уйдет немало нервов и времени, проведенного с чашечкой.кофе в недрах Internet в поисках решения проблемы. Так, автор книги столкнулся с невозможностью отправки данных с мобильного устройства на компьютер с системой FreeBSD 5.3, при этом проблема заключалась явно в модуле ядра, потому что после обновления ядра до версии FreeBSD 5.4 исчезла сама собой. Как следствие, некоторые описанные здесь возможности были реализованы только с новой версией (FreeBSD 5.4). Драйвер устройств Bluetooth представлен в системе в виде модуля ядра, поэтому леред подключением USB-устройства необходимо позаботиться о загрузке необходимого драйвера в ядро. Если предполагается, что устройством Bluetooth придется пользоваться нечасто, то просто выполните команду: It kldload ng_ubt В противном случае, желательно автоматически загружать модуль ядра на этапе загрузки системы. Для этого необходимо добавить в файле /boot/loader. conf строку вида: ng_ubt_load="YES" После этого можно смело подключать устройство. На консоль будут выведены приблизительно такие строки (зависят от устройства): # ubtO: Micro Star International product 0x6970, rev 1.10/5.25, addr 2 ubtO: Micro Star International product 0x6970, rev 1.10/5.25, addr 2 ubtO: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk- out=0x2 ubtO: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc- out=0x3; wMaxPacketSize=49; nframes=6, buffer size=294 Однако для правильной работы устройства этого еще не достаточно. Необходимо впустить сам стек Bluetooth. Для этого используется сценарий rc.bluetooth, который находится в директории /usr/share/examples/netgraph/bluetooth/. Скопируйте его в удобную директорию, например в /etc: It cp /usr/share/examples/netgraph/bluetooth/rc.bluetooth /etc/ Теперь этот сценарий необходимо запускать всякий раз при использовании USB- ]стройства Bluetooth, а также желательно — перед извлечением этого устройства из системы. Для запуска re. bluetooth используйте следующую команду: It /etc/rc.d/rc.bluetooth start ubtO BD_ADDR: 00:0c:76:4 В:lc:40 features: Oxff Oxff Oxf 00 00 00 00 00
390 Глава 12. Настройка сетевой среды <3-Slot> <5-Slot> <Encryption> <Slot offset> ■ <Timing accuracy> <Switch> <Hold mode> <Sniff mode> ■ <Park mode> <RSSI> <Channel quality> <SCO link> I <HV2 packets> <HV3 packets> <u-law log> <A-law log> <CVSD> I <Paging scheme> <Power control> <Transparent SCO data> Щ Max. ACL packet size: 192 bytes I Number of ACL packets: 8 1 Max. SCO packet size: 64 bytes I Number of SCO packets: 8 I Каждый раз загружать и выгружать стек вручную не очень-то разумно, поэтому wl заботимся об автоматизации этого процесса. Поскольку поддержка Bluetooth реализоа на только в FreeBSD старше 5-й версии, то лучше всего использовать даемон devd,w торый следит за событиями, происходящими на уровне ядра, и запускает необходимы! пользовательские процессы (man devd). Добавим в файл конфигурации /etc/devd. conf строки из листинга 12.10. Листинг 12.10. Автоматизация процессазапуска и останова отека Bluetooth при подом динении и отсоединении USB-устройства с использованием даемонаает attach 100 { device-name "ubt[0-9]+"; action "/etc/tc.bluetooth start $device-name"; >; detach 100 ( device-name "ubt[0-9]+"; action "/etc/rc.bluetooth stop $device-name"; J2 В файле re. bluetooth содержатся строки для загрузки нескольких дополнитель ных модулей ядра, и выполняются операции, необходимые для инициализации инщ фейса НС1 и протокола L2CAP. Интерфейс HCI Интерфейс HCI (Host Controller Interface) отвечает за управление менеджером № единений и контроллером передатчика, а также за доступ к информации о состоянии оборудования. Таким образом, этот интерфейс предоставляет унифицированный мета доступа к возможностям Bluetooth в плане передачи данных. Уровень HCI компьютер обменивается данными и командами с "прошивкой" HCI устройства Bluetooth. Более подробно интерфейс НС1 описан в справочном руководстве (man ng_hci). Для каждого устройства Bluetooth создается один узел hci. В качестве имени узла используется <devicename>hci, например ubtOhci. Этот узел подключается к узлу драйвера устройства (входящий поток) и к узлу L2CAP (исходящий поток). Для выполнения операций, связанных с HCI, используется утилита hccontrol, Наиболее распространенной операцией поначалу может оказаться обнаружение (inquiry) в радиусе досягаемости доступных устройств, которые должны поддаваться обнаружению (discoverable). Как правило, обнаружение устройств занимает пару секувд, Если устройства отсутствуют в радиусе действия или же не поддаются обнаружению,то будет получен следующий результат: # hccontrol -n ubtOhci inquiry Inquiry complete. Status: No error [00] Как видно из примера, список устройств пуст, однако статус указывает на отсутствие ошибок. Если устройство находится в радиусе достижимости, то, скорее всего, оно просто не было переведено в режим обнаружения. Большинство устройств не позволи- ют долго находиться в таком режиме, и автоматически его отключают по прошествии
Настройка Bluetooth 391 некоторого небольшого промежутка времени. В случае успешного обнаружения выходные данные утилиты hccontrol будут выглядеть примерно так: # hccontrol -n ubtOhci inquiry Inquiry result, num_responses-=l Inquiry result #0 BD_ADDR: 00:04:3e:64:8d:db Page Scan Rep. Mode: 0x1 Page Scan Period Mode: 00 Page Scan Mode: 00 Class: 12:01:10 Clock offset: 0x762a Inquiry complete. Status: No error [00] Из этого списка, скорее всего, понадобится только первый параметр BD_ADDR — уникальный адрес устройства Bluetooth (по аналогии с МАС-адресом сетевых устройств). Именно этот адрес необходим для дальнейшей работы с устройством, а режим обнаружения на удаленном устройстве больше не понадобится. Теперь доступ можно получить в любой момент по уникальному адресу (если на удаленном устройстве не будет отключена поддержка самого Bluetooth). Для удобства в системе FreeBSD предусмотрена возможность использования файла hosts для сопоставления адресов устройств Bluetooth и строковых псевдонимов. Этот файл находится в директории /etc/bluetooth (листинг 12.11). Листинг 12Л1. Пример файла /«to/bl\retgotJ^ji.ogfcg 1 Bluetooth Host Database » BD_ADDR Name [ aliasO aliasl ... ] ff:ff:ff:00:00:00 localhost local # Magic sdpd address 00:0a:28:44:a9:64 motorola # Motorola e398 00:O4:3e:64:8d:db hp # HP iPAQ Pocket PC hl940 00:Of:de:bf:4a:89 sony # Sony Ericsson T630 OQ:60:57:c2:65:dc nokia # Nokia 3660 Теперь можно получить имя, назначенное удаленному устройству Bluetooth, как по уникальному адресу, так и по назначенному псевдониму: # hccontrol -n ubtOhci remote_name_request 00:0а:28:4 4:а9:64 BD_ADDR; 00:0а:28:44:а9:64 Name: Motorola E396 # hccontrol -n ubtOhci remote_name_request hp BD_ADDR: hp Name: PocketPC Заметим, что имя компьютера будет иметь формат fullhostname (devicename), например, mobile.albersys-ua.com (ubtO). Для изменения имени можно воспользоваться командой: mobile* hccontrol -n ubtOhci change_local_name "mobile" mobile* hccontrol -n ubtOhci read_local_.name Local name: mobile Если компьютеру требуется назначить отличное от стандартного и постоянное Bluetooth-имя, то измените одну строку в файле /etc/rc. bluetooth (старое значение «комментировано): ${hccontrol} -n ${dev}hci change_local_name ""hostname -s~-$(dev}" I I 4>exit 1 # $(hccontrol} -n ${dev}hci change_local_name ""uname -n' ($(dev})" м 4>exit 1
392 Глава 12. Настройка сетевой среды Теперь компьютер, ранее определявшийся по Bluetooth как mobile.altersys- ua.com (ubtO), будет именоваться просто mobile-ubtO. Утилита hccontrol имеет довольно много возможностей по управлению устр* ствами Bluetooth. Их описание можно найти в справочном руководстве или с помощи команды hccontrol help. Рассмотрим только некоторые из самых распространению команд (исключая описанные ранее). Как известно, устройства Bluetooth могут соединяться по принципу "точка-точка" или "точка ко многим". Для просмотра текущих соединений используется команда следующего вида: # hccontrol -n ubtOhci read_connection_list Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State motorola 41 ACL 0 MAST NONE О О OPEN Заметим также, что можно создать соединение с устройством следующей командой: # hccontrol -n ubtOhci create_connection motorola BD_ADDR: motorola Connection handle: 41 Encryption mode: Disabled [0] Обратите внимание на идентификатор соединения (поле Handle). Если необходимо вручную разорвать данное соединение (что делать не рекомендуется, поскольку неактивные соединения разрываются автоматически), то идентификатор можно использовать следующим образом: # hccontrol -n ubtOhci disconnect 41 Connection handle: 41 Reason: Connection terminated by local host [0x16] Протокол L2CAP Протокол L2CAP предназначен для предоставления ориентированных на соединение (и без соединения) услуг по работе с данными для протоколов более высокого уровня с возможностью мультиплексирования, сегментации и повторной сборки операций,! также абстракции групп. Протокол L2CAP позволяет протоколам высокого уровня! приложениям передавать и принимать пакеты данных размером до 64 Кбайт. Для каждого устройства Bluetooth создается по узлу Netgraph типа 12сар. С помощью этого протокола можно проверить доступность удаленного устройств! Bluetooth. Для этого используется утилита 12ping. Проверим доступность устройства: # 12ping -a motorola -с 4 44 bytes from motorola seq_no=0 time=42.513 ms result=0 44 bytes from motorola seq_no=l time=29.604 ms result=0 44 bytes from motorola seq_no=2 time=37.429 ms result=0 4 4 bytes from motorola seq_no=3 time=42.180 ms result=0 Заметим, что не все устройства возвращают данные, и потому в ответе может был указано 0 bytes —это вполне нормальное явление. Раз уж мы вспомнили о диагностике, затронем также простую и удобную утилит) просмотра статистики о соединениях Bluetooth — btsockstat: # btsockstat Active L2CAP sockets PCB Recv-Q Send-Q Local address/PSM Foreign address CID State cle5a700 0 0 00:0c:76:48:lc:40/3 motorola 67 OPEN Cle7c600 0 0 * /3 * 0 LISTEN cle5a900 0 0 * /1 * 0 LISTEN Active RFCOMM sessions L2PCB PCB Flag MTU Out-Q DLCs State cle5a700 clb87e00 0 127 0 Yes OPEN
Настройка Bluetooth 393 cle7c600 clb6fa80 0 127 0 No LISTEN Active RFCOMM sockets PCB Recv-Q Send-Q Local address Foreign address Chan DLCI State clab7b80 0 0 00:0c:76:48:lc:40 motorola 9 18 OPEN clb87d00 0 0 * * 9 0 LISTEN Аутентификация Так сложилось, что по умолчанию связь в FreeBSD при использовании Bluetooth не проходит аутентификацию, и потому любое устройство может получить доступ к другому устройству, зная его адрес. Это может стать причиной несанкционированного доступа к вашим данным. Некоторые мобильные и портативные устройства имеют встроенное ограничение, которое не позволяет обращаться к ним без прохождения процесса аутентификации. В любом случае, поддержка аутентификации — вещь необходимая. Обычно, проще всего проводить аутентификацию с помощью PIN-кода. PIN-код представляет собой строку длиной в 16 символов. Для установки соединения необходимо на обоих устройствах ввести одинаковый код, в результате чего сгенерирован так называемый ключ связи (сеанса). Заметим, что PIN-код не выступает в роли ключа для шифрования — это просто код подтверждения сеанса связи обеими сторонами. При установке следующего сеанса связи PIN-код не запрашивается, а будет использоваться ранее созданный ключ. Если ключ будет удален или потерян, то подбор пары повторится сначала. Кстати, описанная процедура называется подгонкой пары (pairing of devices). Кроме PIN-кода может использоваться шестнадцатеричный ключ длиной в 32 символа. Итак, с тем, как работает аутентификация, мы разобрались, но как же настроить ее в системе FreeBSD? Для этого служит даемон hcsecd, который по умолчанию использует конфигурационный файл /etc/bluetooth/hcsecd. conf. Данный файл состоит из блоков описания, которые начинаются с ключевого слова device. Описание устройств заключено в фигурные скобки {}. Рассмотрим пример файла /etc/bluetooth/hcsecd. conf (листинг 12.12). Листинг 12.12. Пример файла/atc/biuetooth/hcsecd. conf i Format: ♦ device { t option value ; » ) I i Possible options and values ♦ Options Values t _ II bdaddr xx:xx:xx:xx: xx:xx ; - remote device BD_ADDR ( name "any char" ; - to set user friendly device name ♦ key 0x11223344 | nokey ; - to set link key for the device I pin "secret" | nopin ; - to PIN code for the device » I Default entry is applied if no better match found » It MUST have 00:00:00:00:00:00 as bdaddr device 1 device { bdaddr name key pin { bdaddr name key 00:00:00:00:00:00; "Default entry"; nokey; nopin; 00:0a:28:44:a9:64; "Motorola E398"; nokey;
394 Глава 12. Настройка сетевой среды Листинг 12.12. Окончание pin "1213"; I device I bdaddr 00 : 04:Зе:64:8d:db; name "PocketPC"; key nokey; pin "123456"; I device { bdaddr 00:60:57:c2:65:dc; name "Nokia"; key nokey; pin "1111"; } Как видно из листинга 12.12, необходимо указать уникальный адрес устройства PIN-код (или ключ). Поле name указывать не обязательно. В файле присутствует запио Default entry, используемая по умолчанию в том случае, когда нет другой запис для удаленного устройства Bluetooth. Если вы не хотите, чтобы посторонние люди могли просто так получить доступ к вашему компьютеру, используя возможное!» Bluetooth, измените значение ключа или PIN-кода для записи Default entry. Для запуска системы аутентификации Bluetooth выполните простую команду: # heseed Теперь, при попытке установить связь с вашим компьютером, например, со стороны устройства Motorola E398, буден запрошен PIN-код. Без его правильного ввода сеанс связи будет прерван. Однако для использования возможностей Bluetooth запуска описанных служб ещ не достаточно. На данный момент мы рассмотрели только обнаружение нашей систему FreeBSD в сети Bluetooth, создание "пустого" соединения и аутентификацию. Протокол обнаружения служб SDP Не секрет, что Bluetooth предоставляет возможность использования тех или иных служб. При этом каждое устройство может поддерживать строго определенных набор служб. Протокол обнаружения служб SDP (Service Discovery Protocol) позволяет выполнить поиск услуг, предоставляемых тем или иным устройством, и определить их характеристики. При этом среди характеристик для каждой службы присутствует ее тип, механизм использования и необходимый протокол. На уровне SDP происходит обмен информацией между сервером и клиентом SDP. При этом сервер — это приложение, которое содержит список всех поддерживаемых служб и их параметры, а клиент— приложение, запрашивающее список служб или информацию об определенной службе. Заметим, что сам сервер SDP не обслуживает никаких запросов от клиентов и не предоставляет механизмов для их использования — он служит только как информаци- онный сервис для обнаружения предоставляемых услуг. Для обслуживания тех или иных запросов от клиента на сервере должен быть запущен отдельный процесс для каждого сервиса. Процесс получения полного списка услуг называется обзором (browsing). Как правило, обзор осуществляется, когда неизвестно, какие услуги предоставляет удаленна устройство. Для полного обзора используется команда sdpcontrol -a <deviceaddress> browse. Просмотрим результат ее работы для мобильного устройства Motorola E398:
Настройка Bluetooth 395 # sdpcontrol -a motorola browse Record Handle: 00000000 Service Class ID List: Service Discovery Server (0x1000) Protocol Descriptor List: L2CAP (0x0100) SDP (0x0001) Bluetooth Profile Descriptor List: Service Discovery Server (0x1000) ver. 1.0 { ... } Record Handle: 0x00010008 Service Class ID List: OBEX Object Push (0x1105) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 8 OBEX (0x0008) Bluetooth Profile Descriptor List: OBEX Object Push (0x1105) ver. 1.0 Record Handle: 0x00010009 Service Class ID List: OBEX File Transfer (0x1106) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 9 OBEX (0x0008) Bluetooth Profile Descriptor List: OBEX File Transfer (0x1106) ver. 1.0 Иногда, некоторые устройства не выдают список поддерживаемых услуг, тогда необходимо воспользоваться поиском конкретной услуги. Для этого предназначена служ- 3 UUID. Для просмотра списка всех UUID-услуг, воспользуйтесь следующей коман- рй: # sdpcontrol -1 search Usage: Search <Service> ( ... ) Known service names CIP - Common- ISDN Access CTP - Cordless Telephony DUN - DialUp Networking FAX - Fax FTRN - OBEX File Transfer GN - GN HID - Human Interface Device HSET - Headset LAN - LAN Access Using PPP NAP - Network Access Point OPUSH - OBEX Object Push SP - Serial Port Теперь выполним поиск услуги FTRN на удаленном устройстве:
396 Глава 12. Настройка сетевой среды # sdpcontrol -a motorola search FTRN Record Handle: 0x00010009 Service Class ID List: OBEX File Transfer (0x1106) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 9 OBEX (0x0008) Bluetooth Profile Descriptor List: OBEX File Transfer (0x1106) ver. 1.0 Все это хорошо, но как запустить сервис SDP на локальном компьютере? Очень просто. Для этого служит команда sdpd, работающая в режиме даемона. Для запуска сервера SDP выполните команду: # sdpd После этого можно выполнить обзор услуг, предоставляемых локальным компьютером: # sdpcontrol -1 browse Record Handle: 00000000 Service Class ID List: Service Discovery Server (0x1000) Protocol Descriptor List: L2CAP (0x0100) Protocol specific parameter #1: u/int/uuidl6 1 Protocol specific parameter #2: u/int/uuidl6 1 Record Handle: 0x00000001 Service Class ID List: Browse Group Descriptor (0x1001) Протокол OBEX Протокол OBEX является, наверное, наиболее популярным при использования Bluetooth. Кто из нас не обменивается картинками, музыкой и т.п.? Именно благодаря протоколу OBEX мы имеем возможность обмена данными между Bluetooth- устройствами. Несмотря на большую популярность этого протокола, именно его реализация в FreeBSD приводит к множеству проблем. В первую очередь, отметим, что использование OBEX возможно только после установки пакета obexapp, который можно найти в наборе портов в директории /usr/ports/comms/obexapp. Установите его, прежде чем двигаться дальше (вместе с ним пакетом будет установлен также пакет openobex, /usr/ports/comms/openobex). Пакет obexapp позволяет системе работать в режиме сервера и клиента OBEX. Сначала рассмотрим его работу в режиме сервера. В первую очередь, обязательно необходимо запустить сервер sdpd (раньше, чем сервер OBEX). Во-вторых, необходимо позаботиться о директории, в которой будут храниться все поступающие от других устройств объекты. По умолчанию такой директорией считается /var/spool/obex. Создадим ее (если ее еще не существует): # cd /var/spool (t mkdir obex Затем необходимо запустить сам сервер, указав при этом номер канала RFCOMM.
Настройка Bluetooth 397 RFCOMM — протокол соединения устройств посредством эмулирования последовательных портов поверх протокола L2CAP. В системе FreeBSD протокол RFCOMM реализован на уровне сокетов Bluetooth. При запуске сервера OBEX он позаботиться о регистрации записи сулжбы OBEX Object Push на локальном SDP-сервере. Сам сервер запускается командой: И obexapp -s -С 9 При этом опция -s означает, что приложение obexapp будет запущено в режиме сервера, а опция -С 9 указывает, на каком канале RFCOMM будет зарегистрирована служба OBEX Object Push: # sdpcontrol -1 search OPUSH Record Handle: 0x00000003 Service Class ID List: OBEX Object Push (0x1105) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 9 OBEX (0x0008) Bluetooth Profile Descriptor List: OBEX Object Push (0x1105) ver. 1.0 Теперь вы можете спокойно отправить музыку, изображения, другие типы файлов, а также записи адресной книги с мобильных устройств на компьютер по Bluetooth и увидеть их в директории /var /spool /obex: # cd /var/spool/obex/ # Is 15-06-05_2155.jpg Avensis, Olya.vcf Hora.Valentyn.vcf Info Centr .vcf Mas2.amr Packet hvylyny.vcf Ppk.mid # more Info\ Centr\ .vcf BEGIN:VCARD VERSION:2.1 N:Centr ;Info TEL,-WORK:111 END:VCARD В режиме сервера рекомендуется также указывать дополнительную опцию -S, которая позволяет запустить сервер OBEX в защищенном режиме (chroot) Напомним, что желательно иметь версию системы не ниже FreeBSD 5.4 RELEASE. В версии FreeBSD 5.3 RELEASE возникают проблемы с приемом ОВЕХ-сервером любых объектов, отличных от записей адресной книги (*. vcf), а также ошибки в стеке Bluetooth. На консоли (и в журнальных файлах) могут появиться записи вида: ng_12cap_12ca_receive: ubt012cap - invalid L2CAP data packet. Packet too big, length=671, imtu=132, cid=113 При этом на передающем устройстве объект будет находиться в состоянии начала передачи (0% переданных данных). Rakhunok.vcf UMC-Inform.vcf Uap.Russkiy.vcf VMIRE.MID nochnoj do zor.mid wvim_splashscreen_icq.gif
398 Глава 12. Настройка сетевой среды Теперь поговорим об использовании клиента OBEX. Здесь многие пользователи разочаруются, как и автор книги. Получить доступ к удаленному серверу OBEX нети- то просто (если вообще удастся, о чем и было сказано в начале раздела). Клиент OBEX может как посылать, так и принимать объекты с сервера. При этом номер канала RFCOMM можно получить, указав просто имя службы. Такими именами являются: IrMC. OPUSH и FTRN. Канал можно задать и номером. Пример создания соединения и просмотра списка файлов удаленного устройства: # obexapp -a sony -f -С OPUSH obex> CApability, CD, DElete, Disconnect, Empty, Get, Ls, obex> ls Access Owner Group Size n/a n/a n/a n/a n/a n/a n/a n/a n/a Success, response: OK, Success (0x20) obex> di Success, response: OK, Success (0x20) Modified n/a n/a n/a Mkdir, Put? Name Picture/ Audio/ Video/ Опция -a sony указывает соединиться с устройством sony (имя, взятое из файла /etc/bluetooth/hosts), опция -f указывает работать в режиме просмотра директорий, а опция -С OPUSH определяет канал RFCOMM. При этом также можно использовать опцию -с, которая указывает приложению obexapp работать в режиме клиента. Рассмотрим пример приема с удаленного устройства (PocketPC) визитной карточки vCard по умолчанию: # obexapp -a hp -С OPUSH obex> getdefault get: remote file (empty for default vCard)> get: local file> vCard.vcf Success, response: OK, Success (0x20) obex> di Success, response: OK, Success (0x20) # more vCard.vcf BEGIN:VCARD VERSION:2.1 N:Any;Person FN:Person Any ORG:Company TITLE;CHARSET=UTF-8:some text TEL;HOME;VOICE:+380 (044) ####### TEL;CELL:+380 (050) ####### X-CAT:Business X-IRMC-LUID:0a00280e END:VCARD Отметим, что для работы с удаленным устройством нередко необходимо включить поддержку аутентификации. Для этого используют следующую команду (дм ubtOhci): # hccontrol -n ubtOhci Write_Authentication_Enable 1 Более подробную информацию о работе с приложением obexapp можно найти в справочном руководстве man obexapp. Возможности RFCOMM PPP или "Мобильный Internet" Наверное, большинство пользователей мобильной связи слышали о возможности доступа к Internet как с самого мобильного устройства, так и используя последний в ка-
Настройка Bluetooth 399 кстве модема (USB или СОМ), а некоторые даже стали обладателями Bluetooth- 1юдемов. Так вот, для таких устройств возможен доступа к сети по коммутируемой липни связи DUN (Dial-Up Networking) или с помощью протокола РРР (LAN). Эти воз- южности реализованы в системе FreeBSD и могут использоваться для различных це- йй. например, для доступа к Internet или организации связи между двумя компьютера- mi. Все это возможно, благодаря программам ррр и rf comm_pppd, при этом последняя юзволяет использовать стандартный ррр для RFCOMM-соединений. Даемон r:comm_pppd может выступать как в роли сервера (LAN), так и в роли клиента ILAN/DUN). ЮДСКАЗКА Поскольку работу с протоколом РРР мы еще не рассматривали, по всем возникающим вопросам обращайтесь к главе 14. Доступ в Internet Прежде чем начать использовать РРР, в файле /etc/ppp/ppp. conf должна быть мзлана метка для соединения. Но перед этим отметим, что в файле конфигурации РРР (сдержится метка default, команды которой выполняются в любом случае. Таким образом, если вы уже перенастраивали РРР, то внесенные вами изменения могут привести чвозникновению проблем. Рекомендуем не менять параметры для метки default, a щавать собственные метки для каждого нового соединения. Итак, добавим в конец файла /etc/ppp/ppp. conf метку rfcomm-dialup-umc, аобавив строки, представленные в листинге 12.13. Заметим, что эти строки будут зави- кгьот вашего провайдера услуг Internet (см. комментарии) и типа соединения (CSD — Circuit Switched Data; HSCSD — High Speed Circuit Switched Data или GPRS — General Packet Radio Service). Листинг 12.13. Пример метки rfcomm-dialup-umc в файле /etc/ppp/ppp. conf .используемой для установки соединения с провайдером услуг Internet ути- I; ЛИТОЙ rf СОШШ pppd - ■ .■ .-■■ - ... :£ccmm-dialup-umc: # Обязательная строка enable force-scripts # Настройки провайдера (UMC) set authname set authkey # Телефон набора (зависит от модели телефона и типа # соединения, в данном случае - Motorola и GPRS) set phone "*99#" # Строки AT+CGDCONT=l,\"IP\", V'www.umc.ua\" - предоставлены # провайдером услуг связи для соединения по протоколу # GPRS, могут зависить от операционной системы. # Если в вашем случае нет специальных параметров # предоставленых провайдером, оставьте только AT set dial "ABORT BUSY ABORT NOWsCARRIER TIMEOUT 5 \ \"\" AT+CGDCONT=l,\"IP\", V'www.umc.ua\" OK-AT-OK \ ATE1Q0 OK WdATDWT TIMEOUT 40 CONNECT" set login # Через какое время бездействия разрывать связь set timeout 1B0
400 Глава 12. Настройка сетевой среды Листинг 12.13. Окончание # Запросить параметры DNS провайдера, если локальные ошибочй enable dns # Заменить локальные параметры DNS на переданные от # поставщика услуг Internet, во время установки соединения resolv rewrite # Динамически получить IP-адрес set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 # Установить маршрут по умолчанию. Заметим, что если # уже установлено значение маршрута по умолчанию, то # прежде удалите его, иначе "увидеть мир" будет проблематично| add default HISADDR Теперь осталось только разобраться, что это все означает. Принцип таков: утилш rfcommpppd открывает RFCOMM-соединение к удаленному устройству по его; кальному адресу BDADDR (или псевдониму из файла hosts) на DUN RFC0N канале. Как был сказано ранее, номер RFCOMM-канала будет получен автоматичеси с удаленного устройства Bluetooth через SDP. Кроме того, проверьте наличие поддержки сервиса DUN вашим устройством: # sdpcontrol -a motorola search DUN Record Handle: 0x00010001 Service Class ID List: Dial-Up Networking (0x1103) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 1 Bluetooth Profile Descriptor List: Dial-Up Networking (0x1103) ver. 1.0 Итак, команда создания DUN-соединения будет выглядеть примерно следующм образом: # rfcomm_pppd -a motorola -с -С DUN -1 rfcomm-dialup-umc Здесь, опция -a motorola указывает адрес удаленного RFCOMM-сервера; опцн -с указывает утилите работать в режиме клиента; -с DUN определяет RFCOMM-канщ по которому производится соединение (в данном случае используя имя службы DUN) опция -1 rfcomm-dialup-umc указывает на используемую службой ррр метс) в файле/etc/ppp/ppp.conf. Доступ в LAN В первую очередь необходимо позаботиться о запуске сервера, который открывая RFCOMM-сокет и прослушивает запросы на соединение от удаленных клиентов. Ки только появляется входящий запрос, rfcomm_pppd разветвляется и запускает процеа ррр в режиме "direct" с указанной меткой. Далее работа продолжается поверх соедш ния RFCOMM подобно тому, как это происходит в случае использования последов» тельного порта для соединения с удаленными клиентами. Добавим в конец файла /etc/ppp/ppp. conf описание метки rfcomm-lan- server как показано в листинге 12.14.
Настройка Bluetooth 401 ннг 12.14. Пример метки rfcomm-lan-eerver в файле /etc/ppp/ppp. eonf для использования компьютера с модулем Bluetooth в качестве ведущего сер- вера LAN ^^ [fcoiran-lan-server: set timeout 0 set lqrperiod 10 set ifaddr 10.0.0.1 10.0.0.2 255.255.255.0 enable lqr accept lqr # Отключить любую РРР-аутентификацию. # Bluetooth имеет встроенную систему аутентификации disable pap deny pap disable chap deny chap Далее запустим сам сервер LAN поверх RFCOMM РРР и просмотрим результат ре- тстрации службы Bluetooth LAN в списке службы SDP-сервера. I rfcomm_pppd- -s -С 1 -1 rfcomm-lan-server И sdpcontrol -l search LAN Record Handle: 0x00000004 Service Class ID List: LAN Access Using PPP (0x1102) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 1 Bluetooth Profile Descriptor List: LAN Access Using PPP (0x1102) ver. 1.0 DESCRIPTION Теперь необходимо настроить клиентов. Для этого в конец файла letc/ppp/ppp.conf добавим строки, представленные в листинге 12.15, и запустить r£comm_pppd в режиме клиента. нг12.15. Пример метки rf^bmi^lan-ali*nt в, файле /etc^M>p/pK>.conf для использования компьютера с модулем Bruetooth в качестве клиента rfcomm-lan-client: enable lqr accept lqr set dial set timeout 0 disable iface-alias set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 # Отключить любую РРР-аутентификацию. # Bluetooth имеет встроенную систему аутентификации deny pap disable pap deny chap disable chap Запуск клиента выполняется следующей командой: S rfcomm_pppd -с -С 1 -1 rfcomm-lan-client
402 Глава 13. Вопросы безопасности системы ГЛАВА 13. ВОПРОСЫ БЕЗОПАСНОСТИ СИСТЕМЫ Прочитав название главы, читатель, возможно, возразит: "Как! Вопросы безопасна сти??? Но вы же утверждали, что система FreeBSD является одной из самых защищенных". Да, и мы от своих слов не отказываемся. Но безопасность зависит не только or самой операционной системы, но и от пользователей, а больше всего — от действии системного администратора. Насколько грамотно вы сможете настроить систему! управлять ею, настолько она и будет безопасной. Безопасность операционной система можно сравнить с безопасностью автомобиля: какими бы технологиями он ни был за- щищен, сколько бы подушек безопасности вы не установили, без знаний средств управления и правил дорожного движения вы не сможете защитить ее от влияния внешни; факторов, от столкновений и аварий. Так и система FreeBSD — она может быть надех-J ной защитой для сети и данных, но только в том случае, если вы знаете, как ею упрщ-1 лять, и какие опасности таит "внешний мир". J В этой главе будут кратко рассмотрены некоторые технологии, позволяющие повы-i сить безопасность для учетных записей, устойчивость к взломам для сетевых сервисе»,! безопасность всей сети в целом с помощью межсетевого экрана. Мы также научима! строить надежную виртуальную сеть, рассмотрим безопасную альтернативу ш telnet, а также кратко затронем списки контроля доступа для файловой системы. ЗАЩИТА УЧЕТНЫХ ЗАПИСЕЙ Первый вопрос, который поднимается при повышении безопасности системы, — защита учетных записей пользователей. Как правило, он решается повышением требований к паролям и правильному использованию учетных записей. Второй вариант — истод- зование специальных программ, предоставляющих дополнительную защиту за счет использования сторонних технологий. Защита root и служебных учетных записей Первым делом, необходимо позаботиться о защите учетной записи root. Естественно, большинство систем имеют установленный пароль на учетной записи root и разрешают вход под этой учетной записью из сети, что повышает опасность взлома системы и получения взломщиком неограниченных прав. Проблема на самом деле не в пароле, так как он используется для доступа к консоли в случае сбоя системы. Проблема— в необходимости закрыть возможность использования пароля для пользоватем root при попытке авторизации с удаленного хоста. В первую очередь убедитесь, что псевдотерминалы в файле /etc/ttys перечислены с параметром insecure, что делает невозможным вход на них под пользователеи root напрямую с помощью telnet или rlogin. А вот при использовании других протоколов (например, ssh) необходимо позаботиться об отключении возможности вед суперпользователя напрямую в их конфигурационных файлах. Так, для сервиса sshd проверьте, что в файле /etc/ssh/sshdeonfig присутствует следующая строка:
Защита учетных записей 403 PermitRootLogin no Такие же операции по предотвращению входа под пользователем root необходимо выполнить для ftp и других подобных сервисов. При этом, естественно, администратору необходимо иметь возможность удаленного доступа под суперпользователем. Для этого используются обходные пути. Один из них — использование утилиты su или sudo. При этом необходимо позаботиться о том, чтобы учетные записи, которым разрешено использовать эти утилиты, были надежно защищены. Второй способ защиты — надежные системы авторизации и аутентификации. К таким можно отнести систему Kerberos или S/Key. Второй вопрос, относительно защиты root относится к утилитам, запускаемым от имени данного пользователя. Запомните главный тезис: следует запускать только те сервисы и утилиты, в которых вы действительно нуждаетесь. Больше всего это касается старых приложений сторонних разработчиков, которые имеют уже давно известные бреши. Многим сервисам не требуется работа под root. Многие приложения могут быть запущены в "песочницах" (sandboxes). Песочница — не идеальное решение, но она подходит под модель послойной безопасности: если кто-то сможет взломать сервис, работающий в песочнице, ему потребуется взломать еще и саму песочницу. Чем больше уровней необходимо пройти атакующему, тем меньше вероятность его успеха. Ошибки, позволяющие получать доступ от имени root, находили практически во всех сервисах, запускаемых под root, в том числе и в основных системных. При обслуживании сервера, на который пользователи входят только с использованием ssh, отключите telnet,rsh или rlogin! Кстати, немного паранойи никогда не повредит. Как правило, системный администратор может наращивать безопасность в любом количестве, пока это не влияет на удобство. Шифрование паролей У каждого пользователя системы есть пароль, связанный с его учетной записью. Естественно, эти пароли должны быть известны только пользователю и в некотором смысле — самой операционной системе. Для защиты паролей они шифруются способом, известным как "односторонний хэш", то есть, их можно легко зашифровать по некоторому алгоритму, но нет алгоритма расшифровки. Обратите внимание на то, что сама операционная система не знает пароли пользователей, а только их хэши. К сожалению, единственный способ шифрования пароля при появлении UNIX был основан на DES (Data Encryption Standard), который было запрещено использовать за границами США. Разработчики FreeBSD нашли способ, как оставить обратную совместимость с DES, но перешли на использование по умолчанию другого метода шифрования паролей. Так система FreeBSD пришла к использованию MD5 в качестве метода шифрования по умолчанию. MD5 считался более безопасным, чем DES, поэтому установка DES рекомендуется, в основном, из соображений совместимости. На сегодняшний день использование алгоритма MD5 является небезопасным, но это не проблема для FreeBSD, поскольку эта операционная система позволяет включить шифрование паролей по надежному алгоритму Blowfish (BLF). За шифрование в FreeBSD отвечает библиотека libcrypt. а, которая только с версии FreeBSD 4.4 была изменена для предоставления настраиваемой библиотеки аутентификации по хэшу пароля. На данный момент библиотека поддерживает хэши DES, MD5 и Blowfish. По умолчанию, система FreeBSD до сих пор использует для шифрования паролей алгоритм MD5. Определить, какой метод шифрования используется в FreeBSD в данный момент, не составляет труда, и один из способов — проверка файла /etc/master, passwd. Пароли, зашифрованные в хэш MD5, длиннее, чем те, которые зашифрованы с помощью DES, и всегда начинаются с символов $1$. Пароли, которые начинаются с символов $2а$, зашифрованы с использованием Blowfish. Пароли, зашифрованные с помощью
404 Глава 13. Вопросы безопасности системы DES, не содержат каких-то определенных идентифицирующих символов, короче nij лей MD5 или BLF и закодированы в 64-символьном алфавите, не содержащем симад $. По этой причине относительно короткая строка, которая не начинается с этогой вола, — скорее всего, пароль DES. Формат, используемый для новых паролей, определяется параметр passwdformat в файле /etc/login, conf. Этот параметр может принимать зна* ния des, md5 или Ы f. Кратко рассмотрим процедуру перехода на алгоритм Blowfish. В первую очеред необходимо изменить файл /etc/login, conf, как было сказано ранее, а точнее - параметр passwd_format. Сделаем это для класса по умолчанию default. Находя определение default и заменяем строку : passwd_f ormat=md5: \ на следующую: :passwd_format=blf:\ Затем сохраняем файл и выполняем команду (см. главу 6): # cap_mkdb /etc/login.conf Теперь пароль любого пользователя, класса default при изменении будет заши^ рован с помощью алгоритма Blowfish. Пароли новых пользователей данного ищ также будут шифроваться по упомянутому алгоритму. Более подробную информации можно найти на странице справочного руководства man login. conf. Использование одноразовых паролей Система S/Key — это схема с одноразовыми паролями, основанная на односторов нем хэше. FreeBSD использует хэш MD4 для совместимости, но другие системы № пользуют MD5 и DES-MAC. Система S/Key была частью FreeBSD, начиная с вереи 1.1.5, а начиная с FreeBSD 5.0, S/Key была замещена на OPIE (One-time Passwords h Everything). OPIE по умолчанию использует MD5. В понятиях системы S/Key есть три различных вида паролей. Первый вид—m обычный пароль UNIX или пароль Kerberos (будем называть его "пароль UNIX"). Вт» рой вид — одноразовый пароль, сгенерированный программой утилитой key (S/Kej) или opiekey (OPIE) и принимаемый командами keyinit, opiepasswd и в приглаик- нии login (будем называть их "одноразовыми паролями"). Последний вид паролей- защищенные, которые передаются программам key/opiekey, и которые эти программы используют для создания одноразовых паролей (будем называть их "защищенный паролями" или просто "паролями"). Защищенные пароли не имеют никакого отношения к паролям UNIX — они моГ)Т быть даже одинаковыми, что не рекомендуется. Защищенные пароли S/Key и OPIE Ht ограничены по длине, они могут быть настолько длинными, насколько вы захото Очень часто используются пароли длиной в шесть или семь символов. По большей нити, система S/Key или OPIE работает полностью независимо от системы паролей UNIX. Кроме паролей, существует еще два вида данных, важных для S/Key и OPIE. Пе|> вый, известный как "seed" или "ключ", состоит из двух букв и пяти цифр. Другой, называемый "счетчиком цикла", — это номер от 1 до 100 (500 в случае с OPIE). S/Key создает одноразовый пароль, соединяя ключ и защищенный пароль, и затем применяет шифрование MD4/MD5 столько раз, сколько указано счетчиком цикла и выдает результат в виде шести коротких слов латиницей. Эти шесть слов и есть одноразовый пароль. Система аутентификации хранит последний использованный одноразовый пароль и пользователь аутентифицируется, если хэш вводимого пароля совпадает с предыду! щим паролем. Поскольку используется односторонний хэш, невозможно сгенерирован! следующий одноразовый пароль, если получен предыдущий; счетчик цикла уменьшайся после каждого успешного входа для поддержки синхронизации пользователя с программой login. Когда счетчик цикла уменьшается до 1, S/Key и OPIE должны был инициализированы заново.
Защита учетных записей 405 В каждой из обсуждаемых ниже систем задействованы три программы: key и opiekey — получают счетчик цикла, ключ и защищенный пароль и создают одноразовый пароль или последовательный список одноразовых паролей; keyinit и opiepasswd — используются для инициализации S/Key и OPIE соответственно, а также для смены паролей, счетчиков цикла, или ключей; они принимают защищенный пароль или счетчик цикла, ключ и одноразовый пароль; • keyinfo и opieinfo — проверяют свои файлы (/etc/skeykeys или /etc/opiekeys) и печатают текущий счетчик цикла и ключ вызывающего пользователя. Рассмотрим три вида операций: ■ использование keyinit или opiepasswd через защищенное соединение для первоначальной настройки системы одноразовых паролей или для изменения пароля или ключа; • использование key/opiekey для входа через незащищенное соединение; • использование key или opiekey для генерации набора ключей, которые могут быть записаны или распечатаны для соединения из места, где защищенное соединение недоступно. Первоначальная настройка системы одноразовых паролей Для первоначальной настройки S/Key измените свой пароль или ключ при входе Ереэ защищенное соединение (например, с консоли компьютера или через ssh). Для т используется команда keyinit без параметров после входа под своим именем: Skeyinit Adding informex: Reminder - Only use this method if you are directly connected. If you are using telnet or rlogin exit with no password and use keyinit -s. Enter secret password: Again secret password: ID informex s/key is 99 fr55864 WHEN FORK TIRE NED THEY DEBT Для OPIE вместо этого используется opiepasswd -с: iopiepasswd -с Adding informex: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type "C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID informex OTP key is 499 mo6587 FIN RUSS GWYN FLOG DADE HUFF В приглашениях Enter new secret pass phrase: или Enter secret password:, введите »роль или фразу. Запомните: это — не тот пароль, который будет использоваться для юда — он применяется для генерации одноразовых паролей. Строка "ID" содержит (формацию для конкретного случая: имя пользователя, счетчик цикла и ключ. При юде система запомнит эти параметры, поэтому их не надо запоминать. В последней фоке находится одноразовый пароль, соответствующий этим параметрам и секретно- j паролю, — если вход в систему выполняется сразу, используется этот одноразовый (ЮЛЬ.
406 Глава 13. Вопросы безопасности системы ПРИМЕЧАНИЕ Для инициализации или изменения защищенного пароля через незащищённое № единение потребуется воспользоваться локальной утилитой key или opiekey. По- требуется также установить значение счетчика цикла и задать ключ или использовать сгенерированный. Через незащищенное соединение на удаленном компьютер используйте команду keyinit -s (S/Кёу) или opiepasswd (OPIE). Вход с использованием одноразового пароля Как только S/Key или OPIE настроены, во время входа в систему появится приглашение, подобное следующему: login as: informex s/key 98 fr55864 Password: Или для OPIE: login as: informex otp-mdS 4 98 mo6587 ext Password: ПРИМЕЧАНИЕ У S/Key и OPIE есть полезная особенность; если нажать клавишу <Enter> в пригй* шении на ввод пароля, то включится эхо и можно увидеть то, что вводится. Это мог жет быть очень полезно при попытке ввести пароль вручную. В этот момент потребуется сгенерировать одноразовый пароль, чтобы ввести его в приглашение. Это должно быть сделано на защищенной системе, в которой можно запустить key или opiekey. Этим программам в качестве параметров командной строки требуются значения счетчика цикла и ключ. Их можно скопировать и вставить прямот приглашения login компьютера. Итак, генерирование пароля на защищенной или локальной машине выглядит следующим образом: # key 98 fr55864 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: SLOB DOUG NIB NEST MILT SEEM Для OPIE: # opiekey 498 mo6587 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: TAP HAIL LARD TRAM TRAY SAYS Теперь, когда получен одноразовый пароль, можно продолжить вход в систему: Using username "informex". s/key 98 fr55864 Password: s/key 98 fr55864 Password [echo on]: SLOB DOUG NIB NEST MILT SEEM Last login: Mon Mar 13 15:17:31 2006 from 192.168.0.1
Защита учетных записей 407 \Ъ случае OPIE: Using u'sername "informex". otp-md5 4 98 mo6587 ext Password: otp-md5 498 mo6587 ext Password [echo on]: TAP HAIL LARD TRAM TRAY SAYS Last login: Sat Mar 18 11:32:25 2006 from 192.168.0.1 Создание нескольких одноразовых паролей Иногда можно оказаться в таком месте, где нет доступа к защищенному компьюте- [или к защищенному соединению. В этом случае можно воспользоваться командой еуили opiekey для создания нескольких одноразовых паролей, которые можно расшатать. Например: ikey -n 3 97 fr55864 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: 95: BOLD FLAT ANEW LADY OW HOT 96: COST WHO RICK FELT BOLD SHED 97: JUST HUH SCAN HEWN BETH HAAS j Или для OPIE: i «opiekey -n 10 4 97 mo6587 ] Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. [ Enter secret pass phrase: 488: ONE LEON BAM GOER ROBE LANE 489: EASE NIP GIFT JUDO CHIC ANEW 490: DRAM DUST VEAL JET WASH ARTS 491: BLUE RASH CHUG RAKE AVER SOUR 492: SURF ARID BOOM PIN SLUM BOSE 493: LYON NEAT MANA NARY RITE CON 494: CAR BACH BEAK MALL MEND FILE 495: TEE OH ON GAD WIN SKY 496: WON BABY LOOK DON FRAU RAKE 497: SWAM SAYS ORAL SILK MAC CLOG В данном случае через опцию -п задается количество генерируемых одноразовых рролей, а 97 и 497 — номер счетчика, использовавшийся в последний раз. Не забудьте )шать и ключ. Обратите внимание на то, что пароли печатаются в обратном, по сравнило с обычным использованием, порядке, а каждая строка содержит как счетчик цик- в,так и одноразовый пароль. Ограничение на использование системных паролей Система S/Key может наложить ограничения на использование UNIX-паролей на (сяове имени хоста, имени пользователя, порта терминала или IP-адреса сессии. Эти «раничения можно найти в файле настройки /etc/skey. access или /etc/ opieaccess. Дополнительную информацию о полном формате файла, а также подробной о некоторых предосторожностях, которые должны быть предприняты перед тем и положиться в вопросах безопасности на этот файл, можно прочитать на страницах Яравочного руководства skey. access (opieaccess). Если файл skey.access или opieaccess отсутствует (по умолчанию в системах jreeBSD 4.X), то всем пользователям будет разрешено входить с паролями UNIX. Если файл существует, использование S/Key или OPIE станет обязательным для всех (если рько параметры настройки в файле не указывают другое). В любом случае, пароли
408 Глава 13. Вопросы безопасности системы UNIX разрешены при входе с консоли. Пример файла настройки skey. access, илл^ стрирующий три наиболее распространенные вида параметров настройки: permit internet 192.168.0.0 255.255.255.0 I permit user informex permit port ttydO Первая строка (permit internet) разрешает пользователям, чей IP адрес соответствует заданному значению и маске, входить с использованием паролей UNIX. Эта должно рассматриваться не как механизм безопасности, а как напоминание пользователям, что они работают через небезопасное соединение и должны использовать для аутентификации S/Key. Вторая строка (permit user) позволяет определенным пользователям (в данном случае informex) всегда использовать пароли UNIX. Вообще говоря, это должно применяться только для тех, кто не может использовать программу key (например, если при работе с простых терминалов). Третья строка (permit port)позволяет всем пользователям, вошедшим с определенного терминала, использовать пароли UNIX; этот параметр должен применяться для подключений по dial-up. Формат файла opieaccess очень похож, например строка в нем: permit 192.168.0.0 255.255.0.0 позволяет пользователям, чей IP адрес соответствует указанному значению и маске, входить с паролем UNIX. Если ни одно из правил в файле opieaccess не сработало. поведением по умолчанию является запрет любого входа с использованием не OPIE. Система Kerberos Kerberos — это дополнительная сетевая система/протокол, позволяющая пользователям авторизоваться через защищенные сервисы на защищенном сервере. Такие сервисы как удаленный вход, удаленное копирование, защищенное копирование файлов между системами и другие задачи с высоким риском становятся допустимо безопасными» более контролируемыми. Система Kerberos может быть описана как защищенная внешняя система аутентификации и предоставляет только одну функцию: защищенную аутентификацию пользователей сети. Она не предоставляет функций авторизации (что разрешено делать пользователям) или функции аудита (какой пользователь что делает) После того как клиент и сервер использовали Kerberos для идентификации, они могут зашифровать все соединения для гарантирования собственной безопасности и целостности данных. Следовательно, настоятельно рекомендуется использовать Kerberos с другими методами безопасности, предоставляющими сервисы авторизации и аудита. Протокол Kerberos был создан MIT (Massachusetts Institute of Technology) в качестве решения проблем с безопасностью сети. Он использует стойкую криптографию, так та клиент может идентифицироваться на сервере (и обратно) через незащищенное сетевое соединение. Kerberos — это и имя сетевого протокола аутентификации, и общий термин для описания программ, где он реализован. Текущая версия протокола 5 описана в RFC 1510. Доступно несколько свободных реализаций этого протокола, работающих на множестве операционных систем. MIT, где Kerberos был первоначально разработан, продолжает разрабатывать собственный пакет Kerberos. В США он обычно использовали как криптографический продукт, и в этом качестве попадал под действие ограничение на экспорт. MIT Kerberos доступен в виде порта security/krb5. Heimdal Kerberos — еще одна реализация версии 5, которая разрабатывалась исключительно вне США для обхода экспортных ограничений. Heimdal Kerberos доступе» в виде порта security/heimdal, его минимальный комплект включен в базовую установку FreeBSD. В данном случае мы не будем рассматривать работу с Kerberos — для этого обратитесь к Официальному Руководству по FreeBSD или странице справки man kerberos.
Сетевая защита 409 СЕТЕВАЯ ЗАЩИТА Сегодня наиболее популярным вопросом становится защита системы от внешних посягательств и попыток взлома сетевых сервисов. Для защиты от внешнего воздействия необходимо позаботиться не только о безопасности учетных записей, но и о надежной работе сервисов, о том, как закрыть доступ извне для сервисов, используемых внутри се- ш. Для этого используются различные технологии: межсетевые экраны (брандмауэры), программы ограничения доступа по критериям, сервисы предотвращения вторжений и иломов и т.п. Рассмотрим некоторые из возможностей, предоставляемых FreeBSD. Использование TCP Wrappers Каждый, кто знаком с inetd, возможно когда-то слышал и о TCP Wrappers. Но немногие полностью понимают их пользу в сетевой среде — большинство используют только брандмауэр ipf w. Хотя он применяется очень широко, есть вещи, с которыми брандмауэр не может работать (например, отправка текста обратно вызывающей стороне). Подобные и многие другие операции может выполнять программное обеспечение уровня TCP. Программное обеспечение TCP Wrappers расширяет возможность inetd по поддержке каждого даемона. С ним становится возможным протоколирование, возврат сообщений вызывающей стороне, ограничение подключений внутренней сетью и т.п. Хотя некоторые из этих возможностей могут быть реализованы брандмауэром, TCP Wrappers не только предоставляют дополнительный уровень защиты, но и дают больше контроля над системой, чем это возможно с брандмауэром. Единственное требование для использования TCP Wrappers в FreeBSD — это наличие в /etc/rc. conf параметров запуска inetd -Ww (настройки по умолчанию). Конечно, ожидается также наличие правильной настройки /etc/hosts.allow, но syslogd отправит сообщения в системный протокол, если что-то не так. В простейшей конфигурации политика подключения сводится к разрешению или блокированию в зависимости от параметров, указанных в /etc/hosts, allow. Настройка в FreeBSD по умолчанию заключается в разрешении подключения к любому даемону, запущенному из inetd. Базовая настройка файла hosts . allow обычно имеет формат daemon : address : action, где daemon — имя даемона, который запускается inetd. В поле address может находиться имя хоста, ГР-адрес, или адрес IPv6 (заключенный в квадратные скобки []). Поле action может принимать значения allow или deny, чтобы соответственно разрешать или запрещать доступ. Помните, что поиск правил осуществляется до первого совпадения. При обнаружении совпадения применяется соответствующее правило и поиск прерывается. Существуют и другие параметры, но они будут описаны далее. Простая конфигурация может быть, например, такой: для разрешения соединений по протоколу РОРЗ кдаемону qpopper, в /etc/hosts .allow необходимо добавить следующую строку: qpopper : ALL : allow После добавления этой строки inetd необходимо перезапустить. Как мы уже упоминали, у TCP Wrappers имеются дополнительные параметры, предоставляющие дополнительные возможности контроля над соединениями. Иногда бывает полезно возвращать комментарий определенным хостам или при подключении копределенным даемонам. В других случаях, возможно, потребуется добавить запись в log-файл, или отправить письмо администратору. В определенных ситуациях сервис должен использоваться только для локальных соединений. Все это возможно, благодаря использованию параметров с шаблонами, символами подстановки и путем выполнения здешних команд. Предположим, соединение должно быть запрещено, а о причине необходимо сообщить вызывающей стороне. Как это можно сделать? Соответствующую возможность
410 Глава 13. Вопросы безопасности системы предоставляет параметр twist. При попытке подключения выполняется команда т сценарий, заданные этим параметром. Пример дан в файле /etc/hosts . allow: ALL : ALL \ : severity auth.info \ : twist /bin/echo "You are not welcome to use %d from %h." В этом примере сообщение "You are not welcome to use daemon from hostname' будет возвращено от всех даемонов, которые не были предварительно настроены в файле доступа. Обратите внимание на то, что возвращаемое сообщение обязательно должно быть заключено в кавычки. Можно также использовать параметр spawn. Как и параметр twist, этот параметр подразумевает запрет соединения и может использоваться для запуска команд или сценариев (в отличие от twist, spawn не отправляет ответ вызывающей стороне). Например, следующая конфигурация: fingerd : ALL \ : spawn (/bin/echo %a from %h attempted to access %d >> \ /var/log/failconn.log) \ : deny отклонит все попытки соединения с даемоном fingerd от любого хоста; при этом иш хоста, IP-адрес и даемон протоколируются в файл /var/log/failconn.log. Кроме рассмотренных выше символов подстановки, существует еще несколько символов, полный список которых можно найти на странице справочного руководства man hosts_access. До этого момента в примерах использовался шаблон ALL. Существуют и другие параметры, функциональность которых в дальнейшем может быть расширена. Шаблон ALL соответствует любому даемону, домену или IP-адресу. Другой доступный шаблон — это PARANOID. Он соответствует хосту, IP-адрес которого может быть подделан. Другими словами, paranoid может быть использован для определения действия с хостами, IP-адрес которых не соответствует имени хоста. Например: sendmail : PARANOID : deny В этом примере все запросы на подключения к sendmail от хостов, IP-адрес которых не соответствует имени хоста, будут отклонены. Для того чтобы любая выбраннал конфигурация заработала, в файле /etc/hosts.allow необходимо закомментировать первую строку настройки: #ALL : ALL : allow Более подробная информация содержится на странице man hosts_allow. Использование IPFW Интерес к межсетевым экранам (брандмауэр, firewall) со стороны людей, подключенных к Internet, все более и более возрастает. При этом многие думают, что наличие межсетевого экрана между внутренней и внешней сетью решит все их проблемы безопасности. Это, конечно же, может помочь, однако плохо настроенный межсетевой экран представляет более серьезную угрозу безопасности, чем его полное отсутствие. Межсетевой экран добавляет еще один уровень безопасности, но не может остановить проникновение решительно настроенного взломщика в сеть. Если, понадеявшись на надежность межсетевого экрана, понизить уровень внутренней безопасности системы, это существенно упростит работу взломщика. Система FreeBSD поставляется со встроенными в ядро фильтрами пакетов IPFW, PF и (в последних версиях системы) BPF, однако мы рассмотрим только традиционный брандмауэр IPFW. Но для начала затронем понятие маршрутизатора, так как именно с его использованием, как правило, связывается понятие межсетевого экрана.
Сетевая защита 411 Маршрутизатор — это машина, пересылающая пакеты между двумя или несколько сетями. Маршрутизатор с фильтрацией пакетов запрограммирован на сравнение адого пакета со списком правил перед тем как решить, пересылать его далее или нет. 1мьшинство современных программ обеспечения маршрутизации имеют возможности (иьтрации, и по умолчанию пересылают все пакеты. Для включения фильтров потреби определить набор правил. Для определения того, должен ли быть пропущен пакет, межсетевой экран ищет таборе правило, совпадающее с содержимым заголовков пакета. Как только совпадете найдено, выполняется действие, присвоенное данному правилу. Действие может заточаться в отбрасывании пакета, его пересылке или даже, в отправлении ICMP-сооб- рия по адресу источника. Учитывается только первое совпадение, поскольку правила досматриваются в определенном порядке. Следовательно, список правил можно на- шъ "цепочкой правил". Критерий отбора пакетов зависит от используемого программного обеспечения, но йычно можно определить правила, зависящие от IP-адреса источника пакета, IP-адреса юначения, номера порта источника пакета, номера порта назначения (для протоколов, годдерживающих порты) или даже от типа пакета (UDP, TCP, ICMP и т.д.). Возможности IPFW Программное обеспечение IPFW, поставляемое с FreeBSD, — это система фильтрации и учета пакетов, реализованная в ядре и снабженная пользовательской утилитой на- пройки ipfw. Вместе они позволяют определять и просматривать правила, используете ядром при маршрутизации. Пакет IPFW состоит из двух связанных частей. Межсемой экран осуществляет фильтрацию пакетов. Часть, отвечающая за учет IP-пакетов, пслеживает использование маршрутизатора на основе правил, подобных тем, которые «пользуются в части межсетевого экрана. Это позволяет администратору определять, аапример, объем трафика, полученного маршрутизатором от определенного компьютера, или объем пересылаемого WWW-трафика. Благодаря тому, как реализован IPFW, его можно использовать и на компьютерах, вторые не являются маршрутизаторами для фильтрации входящих и исходящих соеди- кннй. Это особый случай более общего использования IPFW, и в этой ситуации используются те же команды и техника. Включение IPFW в FreeBSD Поскольку основная часть системы IPFW находится в ядре, потребуется добавить мин или несколько параметров в файл настройки ядра, в зависимости от требуемых юзможностей, и пересобрать ядро. Существует четыре параметра настройки ядра, имеющие отношение к IPFW: options IPFIREWALL — включает в ядро код для фильтрации пакетов; • options IPFIREWALL_VERBOSE — включает протоколирование пакетов через syslogd; без этого параметра, даже если задать в правилах фильтрации протоколирование пакетов, это не сработает; • options IPFIREWALL_VERBOSE_LIMIT=10 — ограничивает число пакетов, протоколируемых каждым правилом через syslogd; можно использовать этот параметр, если необходимо протоколировать работу межсетевого экрана, но требуется обезопаситься от возможной DoS-атаки путем переполнения syslog. Когда для одного из правил в цепочке достигается определенный параметром предел, протоколирование для этого правила отключается. Для включения протоколирования потребуется сбросить соответствующий счетчик с помощью утилиты ipfw: # ipfw zero 5000
412 Глава 13. Вопросы безопасности системы где 5000 — это номер правила, для которого необходимо возобновить протоколирование. options IPFIREWALL_DEFAULT_T0_ACCEPT — изменяет правило по умолчанию с deny на allow. Это предотвращает возможное блокирование, если ядро за- гружено с поддержкой IPFIREWALL, но межсетевой экран еще не настроен. Эта параметр также полезен, если используется ipf w в качестве средства от определенных проблем по мере их возникновения. Тем не менее, этот параметр следуя использовать с осторожностью, поскольку он открывает межсетевой экран и изменяет его поведение. ПРИМЕЧАНИЕ Правилом IPFW по умолчанию является deriy ip £xam any to any. Если не добавить других правил во время загрузки для разрешения доступа, то будет заблокирован доступ к серверу с включенным в ядро межсетевым экраном после перезагрузки. Поэтому предлагается указать firewall_type=open в файле /etc/ re. conf при первоначальном добавлении межсетевого экрана до перезагрузки системы, а затем, после тестирования его работоспособности, отредактировать правила в файле /etc/rc. firewall. Дополнительной предосторожностью может быт* первоначальная настройка межсетевого экрана с локальной консоли. Настройка IPFW Настройка программного обеспечения IPFW выполняется с помощью утилита ipf w. Поначалу синтаксис этой команды выглядит очень сложным, но по мере изучент работы с ней вы поймете всю простоту его использования. В настоящее время утилита использует четыре различных категории команд: добавление/удаление (addition! deletion), просмотр (listing), сброс (flushing) и очистка (clearing). Добавление/удаление используется для создания правил, определяющих, как пакеты принимаются, отбрасываются и протоколируются. Просмотр используется для определения содержимого набора правил (называемого еще цепочкой) и счетчиков пакетов (учет). Сброс используется для удаления всех правил цепочки. Очистка используется для обнуления одного или нескольких счетчиков. Изменение правил IPFW Синтаксис этой формы команды таков: ipfw [-N] command num action llog] proto address [param] При использовании этой формы команды доступен флаг -N, определяющий адреса по IP и имена сервисов по номерам при отображении: # ipfw -N add 500 allow tcp from 10.0.0.1 to any 22 00500 allow tcp from 10.0.0.1 to any dst-port ssh Задаваемая команда (command) может быть сокращена до более короткой уникальной формы. Существующие команды: add — добавление правила к списку фильтрации/учета; delete — удаление правила из списка фильтрации/учета. Предыдущие версии IPFW использовали отдельные записи для фильтрации и учета пакетов. Современные версии учитывают пакеты для каждого правила. Если указано значение num, оно используется для помещения правила на определенную позицию в цепочке. В противном случае правило помещается в конец цепочки с номером на 100
Сетевая защита 413 больше, чем у предыдущего правила. С параметром log соответствующие правила выводят информацию на системную консоль, если ядро собрано с опцией IPFIREWALL_VERBOSE. Существующие действия (action): reject — отбросить пакет и отправить в адрес источника ICMP-пакет, сообщающий о недостижимости хоста или порта; allow— пропустить пакет как обычно (синонимы: pass, permit и accept); deny — отбросить пакет; источнику не выдается ICMP-сообщение (пакет не достиг цели); count — обновить счетчик пакета, но не применять по отношению к нему правила allow/deny; поиск продолжится со следующего правила в цепочке. Каждое действие может быть записано в виде более короткого уникального префикса. Могут быть определены следующие протоколы (proto): all — соответствует всем IP-пакетам; icmp — соответствует ICMP пакетам; tcp — соответствует TCP пакетам; udp — соответствует UDP пакетам. Поле адреса (address) формируется в следующем формате: источник адрес/маска [порт] цель адрес/маска [порт] [via интерфейс] ПРИМЕЧАНИЕ Ножно указать порт только с протоколами, поддерживающими порты (UDP и TCP). Параметр via опционален и может содержать IP-адрес или имя домена локального Р-интерфейса, или имя интерфейса (например, IncO). Он настраивает правило на соответствие только тем пакетам, которые проходят через этот интерфейс. Номера интересов могут быть заменены на опциональную маску. Например, ррр* будет соответствовать РРР интерфейсам ядра. Синтаксис, используемый для указания адреса/маски: адрес адрес/маска-биты адрес:маска-шаблон Вместо IP-адреса можно указать существующее имя хоста. Маска-биты — это десятичный номер, указывающий количество бит, которые должны быть установлены вмаске адреса. Например, 192 . 216. 222 .1/24 создаст маску, соответствующую всем адресам подсети класса С (в данном случае, 192.216.222). Маска-шаблон — это IP, который будет логически перемножен с заданным адресом. Ключевое слово any может использоваться для обозначения любого IP-адреса, те — адресов текущего хоста. Номера портов для задания списка портов указываются в следующем формате: порт [,порт [,порт [...]]] Для указания диапазона используется формат: порт-порт Можно также комбинировать указание одного диапазона со списком портов, но щапазон всегда должен указываться первым. Некоторые доступные параметры (param): • frag — срабатывает, если пакет не является первым пакетом дейтаграммы;
414 Глава 13. Вопросы безопасности системы in — соответствует входящим пакетам; out — соответствует исходящим пакетам; ipoptions spec — срабатывает, если заголовок IP содержит перечисленный* рез запятую список параметров, указанных в spec; поддерживаемые параметр IP— ssrr, lsrr, rr и ts; действие отдельных параметров может быть измене» путем указания префикса !; established — срабатывает, если пакет является частью уже установленного TCP-соединения (т.е. если установлены биты RST или АСК); setup — соответствует, если пакет является попыткой установки ТСР-соединега (установлен бит SYN, а бит АСК не установлен); tcpflags флаги — срабатывает, если заголовок TCP содержит список перечио ленных через запятую флагов; поддерживаемые флаги: fin, syn, rst, psh, acki urg; действие правил по отдельным флагам может быть изменено указанием префикса !; icmptypes типы — срабатывает, если тип пакета ICMP находится в списке тише список может быть указан в виде любой комбинации диапазонов и/или отделыгц типов, разделенных запятыми. Обычно используемые типы ICMP: 0 echo reply (ping reply), 3 destination unreachable, 5 redirect, 8 echo request (ping request) И 11 time exceeded. Просмотр правил Синтаксис этой формы команды следующий: ipfw [-а] [-с] [-d] [-e] [-t] [-N] [-S] list Для этой формы команды существует семь флагов: -а — показывать значения счетчиков; -с — просмотр правил в компактной форме; -d — показывать динамические правила в дополнение к статическим; -е — если определен параметр -d, показывать также динамические правилась текшим сроком действия; -t — отображать последнее время срабатывания для каждого правила в цепочке; -N — попытаться разрешить заданные адреса и имена сервисов; -S — отображать набор, к которому принадлежит каждое правило. Если этот фи не указан, заблокированные правила не будут отображены. Сброс правил Команда сброса правил: # ipfw flush Все правила в цепочке будут удалены, за исключением правила по умолчанию, у& танавливаемого ядром (номер 65535). Будьте осторожны при сбросе правил — правщ отбрасывающее пакеты по умолчанию отключит систему от сети, пока разрешающи правила не будут добавлены в цепочку. Очистка счетчиков пакетов Синтаксис для очистки одного или нескольких счетчиков пакетов: ipfw zero [index] При использовании команды без аргумента index будут очищены все счетчики № кетов. Если index указан, операция очистки применяется только к указанному правилу,
Сетевая защита 415 Примеры команд Следующая команда запретит все пакеты с хоста microsoft. com на порт telnet «оста altersys-ua. com: # ipfw add deny tcp from microsoft.com to altersys-ua.com 23 Следующий пример запрещает и протоколирует весь TCP-трафик из сети nicrosof t. com к компьютеру mobile. altersys-ua. com (на любой порт): # ipfw add deny log tcp from microsoft.com to mobile.altersys-ua.com Сохранение конфигурации Как только правила для IPFW определены, можно сохранить их в файле и задать его использование при каждой загрузке системы. По умолчанию, таким файлом является /etc/rc. firewall. Этот файл содержит список предопределенных профилей и изменять его не рекомендуется (используйте его в качестве примера). Если был создан собственный файл /etc/firewall.conf, то можно использовать его, добавив следующие строки в файл /etc/rc. conf: firewall_enable="YES" firewall_script="/etc/rc.firewall" firewall_type="/etc/firewall.conf" Обратите внимание на то, что имя файла используется как шаблон, а сценарий до сих пор установлен как /etc/rc. firewall. Это позволяет указывать в файле firewall. conf правила без указания команды ipfw: add deny tcp from microsoft.com to any add deny tcp from xakep.com to any add allow all from any to www.altersys-ua.com 80 add 65534 allow all from any to any Более подробная информация доступна на странице man ipfw. VPN с использованием IPSEC Рассмотрим один из вариантов создания защищенной сети VPN (Virtual Private Network) между двумя сетями, подключенными к Internet, с использованием шлюзов FreeBSD через псевдоустройство gif и протокол IPSEC. В действительности, вариантов построения безопасной VPN есть довольно много, поскольку стандарта VPN не существует. При соединении FreeBSD и Windows используются одни технологии, при соединении двух машин FreeBSD — другие. Каждая используемая технология имеет свои преимущества и недостатки, но в данном случае мы подобные вопросы затрагивать не будем. Опишем такую конфигурацию, чтобы каждая сеть "видела" компьютеры из другой сети так, как если бы они были непосредственно подключены к тому же самому маршрутизатору. Это означает, что компьютер с адресом 192.168.1.10 может запустить команду ping 192 .168.2 .250 и получить ответ от машины, находящийся за пределами локальной сети. Компьютеры с Windows должны "видеть" компьютеры в другой сети, просматривать сетевые ресурсы и т.д. точно так же, как и для компьютеров влокальной сети. И все это — безопасным способом. Это означает, что трафик между сетями зашифрован. Создание VPN между этими двумя сетями — многошаговый процесс. Этапы создания VPN таковы: 1. Создание "виртуального"' сетевого подключения между двумя сетями через Internet.
416 Глава 13. Вопросы безопасности системы 2. Применение политики безопасности чтобы убедиться, что трафик между двумя сетями "прозрачно" шифруется и расшифровывается, если необходимо. 3. Настройка дополнительных программ на шлюзах FreeBSD, чтобы компьют* ры Windows из одной сети "видели" компьютеры в другой через VPN. Создание виртуального сетевого подключения Предположим, мы работаем на шлюзе первой сети (с публичным адресом 81.82.83. 80 и приватным адресом 192.168.1.1) и запускаем ping 192.168.2.1, то есть хотим достигнуть машину (предположим, с адресом 131.132.133.130) в другой сети по ее приватному адресу. Что должно произойти, чтобы это заработало? Шлюз должен знать, как достичь 192.168.2.1. Другими словами, у него должен быть маршрут к 192 .168 . 2.1. Приватные IP-адреса, такие как диапазон 192.168.х, не адресуются в Internet Каждый пакет, отправляемый на 192.168 .2.1 должен быть "завернут" в другой пакет. Исходным адресом пакета должен быть 81.82.83.80, а адресом назначения — 131.132.133.130. Этот процесс называется инкапсуляцией. Как только пакет достигнет 131.132 .133 .130, его необходимо "разинкапсули- ровать" и доставить к 192 .168 . 2.1. Как можно увидеть, это требует построения туннеля между двумя сетями. Два конца туннеля — это IP-адреса 81. 82.83. 80 и 131.132.133.130. Туннель используетм для передачи трафика с приватными IP-адресами через Internet. В FreeBSD этот туннель создается с помощью устройства generic interface, или gif. Как можно догадаться, интерфейс gif на каждом хосте должен быть настроен с четырьмя IP-адресами: ди для публичных IP-адресов и два для приватных. В ядро обоих компьютеров FreeBSD должна быть встроена поддержка устройства gif. Это можно сделать, добавив строку в конфигурационный файл ядра и пересобра» его на основании обновленного файла: pseudo-device gif # FreeBSD 4.X device gif # FreeBSD 5.X и выше По умолчанию, поддержка gif присутствует в ядре GENERIC. Настройка туннеля — это двухшаговый процесс. Во-первых, необходимо задать сведения о внешнем IP- адресе с помощью gif conf ig (для FreeBSD 4.x), затем — о приватном IP-адресе с помощью if conf ig (используется и для настройки gif в FreeBSD 5.x). Для пониманш разницы в настройке будем в первой сети настраивать VPN с использованием FreeBSD 4.x, во второй — с использованием FreeBSD 5.x. На шлюзе первой сети (192.168.1.1) для настройки туннеля потребуется запустить следующие команды: # ifconfig gifO create # gifconfig gifO 81.82.83.80 131.132.133.130 # ifconfig gifO inet 192.168.1.1 192.168.2.1 netmask 255.255.255.0 # gifconfig gifO gifO: flags=805KUP, POINTOPOINT, RUNNING, MULTICAST^ mtu 1280 inet 192.168.1.1 —> 192.168.2.1 netmask OxffffffOO physical address inet 81.82.83.80 —> 131.132.133.130 На другом шлюзе — подобные команды, но с IP-адресами в обратном порядке: # ifconfig gifO create # ifconfig gifO tunnel 131.132.133.130 81.82.83.80 # ifconfig gifO inet 192.168.2.1 192.168.1.1 netmask 255.255.255.0 # ifconfig gifO gifO: flags=805KUP, POINTOPOINT, RUNNING, MULTICAST^ mtu 1280 tunnel inet 131.132.133.130 —> 81.82.83.80
Сетевая защита 417 inet 192.168.2.1 --> 192.168.1.1 netmask OxffffffOO inet6 fe80::20c:29ff:fe2e:7ff6%gif0 prefixlen 64 scopeid 0x5 Как можно увидеть, был создан туннель между физическими адресами 81.82.83.80 и 131.132.133.130, для тунеллирования разрешен трафик между 192.168 .1.1 и 192.168.2.1. Это также добавляет запись к таблице маршрутизации иаобеих машинах. Можно проверить запись командой netstat -rn: i netstat -rn Routing tables Internet: Destination default 81.82.83/24 81.82.83.1 81.82.83.80 127.0.0.1 192.168.1 192.168.2.1 Gateway 81.82.83.1 link#l 00:80:48:c2 00:0c:29:c7 127.0.0.1 link#2 192.168.1.1 70:ea 4a:73 Flags UGSc UC UHLW UHLW UH UC OH Refs 0 2 2 0 0 0 0 Use 23 0 1420 40 0 0 0 Netif IncO IncO IncO loO Ю0 lncl gifO Expire 1026 Как показывает значение поля Flags, это — маршрут к хосту. Это означает, что иждый шлюз знает, как достичь другого шлюза, но не знает, как достичь остальной тасти соответствующей сети. Эта проблема будет решена. Вероятно, на обеих машинах впущен межсетевой экран, и наша VPN должна его обходить. Можно разрешить весь трафик между двумя сетями или включить правила, защищающие каждый конец соединения от другого. Это сильно упрощает тестирование настройки межсетевого экрана, если разрешается весь трафик через VPN. Защиту всегда можно усилить позже. Если на шлюзах используется ipf w, тогда команда: ipfw add l allow ip from any to any via gifO разрешит весь трафик между двумя сетями VPN без влияния на другие правила межсетевого экрана. Очевидно, потребуется запустить эту команду на обоих шлюзах. Этого достаточно для доступности одного шлюза к другому с использованием локальных адресов. Для проверки на шлюзе с адресом 192.168.1.1 можно запустить: # ping -с 2 192.168.2.1 PING 192.168.2.1 (192.168.2.1): 56 data bytes 64 bytes from 192.168.2.1: icmp_seq=0 ttl=64 time=101.794 ms 64 bytes from 192.168.2.1: icmp_seq=l ttl=64 time=445.348 ms — 192.168.2.1 ping statistics 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 101.794/273.571/445.348/171.777 ms и получить ответ. Аналогично — и на другом шлюзе. Однако, машины в другой сети пока недоступны. Причина — в маршрутизации. Хотя шлюзы и знают, как связаться друг с другом, они не знают, как связаться с сетью за другим шлюзом. Для решения этой проблемы следует добавить статический маршрут на каждом шлюзе. Команда на первом шлюзе будет выглядеть так: # route add 192.168.2.0/24 192.168.2.1 add net 192.168.2.0: gateway 192.168.2.1 Она говорит: "Для достижения хостов в сети 192.168.2.0 отправляйте пакеты хосту 192.168 . 2 .1". Потребуется запустить похожую команду и на другом шлюзе, но садресами 192.168.1.x: # route add 192.168.1.0/24 192.168.1.1 add net 192.168.1.0: gateway 192.168.1.1
418 Глава 13. Вопросы безопасности системы IP-трафик с хостов в одной сети теперь может достичь хосты в другой сети. Надд ном этапе мы выполнили часть задания: создали виртуальную сеть. Но она еще непр* ватная, поскольку пакеты пересылаются между сетями в незашифрованном виде. Ко нечно же, это неприемлемо. В следующем подразделе мы обсудим защиту соединен» между двумя сетями, так что весь трафик будет автоматически шифроваться. Сейчас^ необходимо сохранить конфигурацию: отредактируем /etc/ra. conf на первом шлюзе, добавив следующие строки gif_interfaces="gifO" gifconfig_gif0="81.82.83.80 131.132.133.130" ifconfig_gifO="inet 192.168.1.1 192.168.2.1 netmask 255.255.255.0" static_routes="vpn" route_vpn="192.168.2.0/24 192.168.2.1" отредактируйте /etc/rc. conf на втором шлюзе, добавив следующие строки gif_interfaces="gif0" gifconfig_gif0="131.132.133.130 81.82.83.80" ifconfig_gifO="inet 192.168.2.1 192.168.1.1 netmask 255.255.255.0" static_routes="vpn" route_vpn="192.168.1.0/24 192.168.1.1" добавим в сценарий ipfw на обоих шлюзах правило: ipfw add l allow ip from any to any via gifO Защита соединения с использованием IPSEC Для защиты соединения воспользуется протоколом IPSEC. Теория IPSEC — это протокол, расположенный поверх IP. Он позволяет двум или более хостам связываться защищенным способом. "Сетевой стек" FreeBSD IPSEC основаны реализации КАМЕ, поддерживающей оба семейства протоколов: IPv4 и IPv6. IPSEC состоит из двух субпротоколов: Encapsulated Security Payload (ESP), защищающий данные IP-пакета от вмешательства третьей стороны путем шифрования содержимого с помощью симметричных криптографических алгоритмов (таких как Blowfish, 3DES); Authentication Header (АН), защищающий заголовок IP-пакета от вмешательства третьей стороны и подделки путем вычисления криптографической контрольной суммы и хэширования полей заголовка IP-пакета защищенной функцией хэширования. К пакету добавляется дополнительный заголовок с хэшем, позволяющий аутентификацию информации пакета. Субпротоколы ESP и АН могут быть использованы вместе или по отдельности, в зависимости от обстоятельств. IPSEC может быть использован или для непосредственного шифрования трафии между двумя хостами (транспортный режим), или для построения "виртуальных туннелей" между двумя подсетями, которые могут быть использованы для защиты соединений между двумя корпоративными сетями (туннельный режим). Последний обычно называют виртуальной частной сетью (Virtual Private Network, VPN). Подробную информацию о подсистеме IPSEC в FreeBSD можно найти на странице man ipsec.
Сетевая защита 419 Практика Здесь будут рассмотрены два аспекта настройки: У хостов должен быть способ согласования используемого алгоритма шифрования. Как только хосты "договорятся" об этом, можно говорить об установленном между ними безопасном соединении. • Должен присутствовать механизм определения, какой трафик необходимо шифровать. Конечно, шифровать весь исходящий трафик нет необходимости — достаточно шифровать только трафик, идущий через VPN. Правила, определяющие трафик для шифрования, называются политикой безопасности. Безопасное соединение и политика безопасности поддерживаются ядром и могут (ыть изменены программами пользователя. Однако прежде необходимо настроить под- кржку протоколов IPSEC и Encapsulated Security Payload (ESP) в ядре. Это осуществляйся добавлением в настройку ядра параметров options IPSEC options IPSEC_ESP {последующим перекомпилированием, переустановкой и перезагрузкой. Как и прежде, потребуется сделать это с ядром на обоих шлюзах. При настройке параметров безопасности есть два варианта: можете настроить их вручную для обоих хостов, задав алгоритм шифрования, ключи для шифрования и т.д.; • использовать даемоны, реализующие Internet Key Exchange protocol (IKE), который сделает все сам. Рекомендуется последний вариант (ко всему прочему, это способ более простой). Редактирование и отображение политики безопасности выполняется с помощью утилиты set key, которая используется для настройки таблиц политики безопасности Шратак же как route используется для настройки таблиц маршрутизации ядра. Утилита set key также может отображать текущие параметры безопасности, что, по аналогии, «ответствует netstat -r. В FreeBSD существует множество даемонов для управления параметрами безопас- юсти. Здесь будет описано использование наиболее популярного: пакета racoon, который находится в коллекции портов security/racoon (сейчас доступна новая версия в security/racoon2) и устанавливается обычным способом. Сервис racoon должен работать на обоих шлюзах. На каждом из хостов он настраивается с IP-адресом другого юнца VPN и секретным ключом (на усмотрение, должен быть одним и тем же на обоих шлюзах). Эти два даемона подключаются друг к другу, подтверждают, что они именно те, за (ого себя выдают (используя секретный ключ, заданный вами). Затем даемоны генерируют новый секретный ключ и используют его для шифрования трафика через VPN. Они периодически изменяют этот ключ, так что даже если атакующий "взломает" один и ключей (что теоретически почти невозможно), это ему ничего не даст, так как данный ключ скоро больше не будет использоваться. Настройки racoon находятся в каталоге /usr/local/etc/racoon. Конфигурационный файл /usr/local/etc/racoon/racoon. conf не требует слишком больших изменений. Другим компонентом настройки racoon, который потребуется изме- «ить, является "предварительный ключ". В файле конфигурации определено, что по .молчанию racoon ищет его в файле /usr/local/etc/racoon/psk. txt. Необхо- щмо отметить, что предварительный ключ не используется для шифрования трафика через VPN-соединение. Это — просто маркер, позволяющий даемонам, управляющим иючами, доверять друг другу.
420 Глава 13. Вопросы безопасности системы Файл psk.txt должен содержать строку для каждого удаленного сервера, с кото- рым происходит соединение. В нашем случае оба сервера будут содержать в дашкк файле по одной строке. На первом шлюзе эта строка будет выглядеть следующим обр»- зом: 131.132.133.130 somepass То есть, публичный IP-адрес удаленной стороны, пробел и текстовая строка, которая является секретной фразой для обоих серверов. На втором шлюзе строка будет т глядеть примерно так: 81.82.83.80 somepass То есть, публичный IP-адрес удаленной стороны и та же секретная фраза. Перед» пуском racoon режим доступа к файлу psk. txt обязательно должен быть установл» в 600 (то есть, запись и чтение только для root). Необходимо запустить racoon на обоих шлюзах. Также потребуется добавить пр вила для включения IKE-трафика, передающегося по UDP через порт ISAKMP (Internet Security Association Key Management Protocol). Опять же, они должны быть расположи ны по возможности ближе к началу набора правил. ipfw add 1 allow udp from 81.82.83.80 to 131.132.133.130 isakmp ipfw add 1 allow udp from 131.132.133.130 to 81.82.83.80 isakmp Как только racoon запущен, можно попробовать выполнить ping с одного шлкш на другой. Соединение все еще не зашифровано. Теперь необходимо создать политику безопасности для обоих шлюзов. Как известно, каждый отправляемый IP-пакет имеет заголовок, содержащий и* формацию о пакете. Заголовок включает IP-адреса источника и назначения. Как мы ув знаем, приватные IP-адреса, такие как 192.168 . х. х, не могут появиться в Internet. Они должны быть сначала включены внутрь другого пакета. В этом пакете приватные IP-адреса, источника и назначения заменяются публичными IP-адресами. Подобной инкапсуляцией занимается устройство gif. Но как зашифровать трафик между сетями? Политика безопасности устанавливается с помощью утилиты setkey. В setkey предусмотрен язык определения политики безопасности. Можно или ввести инструкции по настройке с применением стандартного ввода, или использовать параметр -f для задания файла, содержащего эти инструкции. Создадим на первом шлюзе файл /etc/ipsec. conf следующего содержания: spdadd 192.168.1.0/24 192.168.2.0/24 any -P out ipsec 4>esp/tunnel/81.82.83.80-131.132.133.130/require; spdadd 192.168.2.0/24 192.168.1.0/24 any -P in ipsec 4>esp/tunnel/131.132.133.130-81.82.83.80/require; На втором шлюзе создадим файл /etc/ipsec. conf такого содержания: spdadd 192.168.2.0/24 192.168.1.0/24 any -P out ipsec 4>esp/tunnel/131.132.133.130-81.82.83.80/require; spdadd 192.168.1.0/24 192.168.2.0/24 any -P in ipsec "besp/tunnel/81.82.83.80-131.132.133.130/require; Теперь запустим на обоих шлюзах команду: # setkey -f /etc/ipsec.conf В этих файлах команда spdadd указывает утилите setkey добавить правило к бак данных политики безопасности (SPD). Остальная часть строки указывает на то, как» пакеты будут соответствовать политике. 192 .168 .1. 0/24 и 192 .168 . 2 .0/24 — зи IP-адреса и сетевые маски, определяющие сети или хосты, к которым будет применит ся данная политика. В нашем случае мы хотим применить их к трафику между двум
Сетевая защита 421 йстами. Параметр any сообщает ядру, что эта политика должна применяться ко всем икетам. Параметр -Р out сообщает, что эта политика применяется к исходящим паке- ям, параметр -р in — к входящим пакетам, a ipsec — что пакеты будут зашифрована Оставшаяся часть строки определяет, как эти пакеты будут зашифрованы. Используется протокол esp, параметр tunnel показывает, что пакет в дальнейшем будет ин- впсулирован в IPSEC-пакет. Использование 81.82.83.80 и 131.132.133.130 предназначено для выбора используемых параметров безопасности, и, наконец, пара- цетр require разрешает шифрование пакетов, попадающих под это правило. Также потребуется добавить правила к межсетевому экрану для включения прохождения пакетов ESP и IPENCAP в обе стороны. Когда эти пакеты будут получены на удаленном конце VPN-соединения, они будут расшифрованы (используя параметры {«опасности, о которых "договорился" racoon). Затем они будут переданы интерфей- tygif, который "развернет" второй слой, оставив пакет с внутренними адресами, моющий попасть во внутреннюю сеть. Теперь удостоверимся, что пакеты действительно соответствуют политике безопасности. Вначале запустим на втором шлюзе следующую команду: # tcpdump dst host 81.82.83.80 На первом шлюзе запустим команду ping: # ping 192.168.2.1 После небольшой паузы на первом шлюзе должен появиться результат работы ути- шы ping, показывающий доступность второго шлюза. В то же время на втором шлюзе иожно увидеть приблизительно следующий результат работы утилиты tcpdump: 09:55:00.965127 IP 131.132.133.130 > 81.82.83.80: ESP(spi=0x090bb3b5,seq=0x3) 09:55:01.699970 IP 131.132.133.130 > 81.82.83.80: ESP(spi=0x090bb3b5,seq=0x3) 09:55:01.700244 IP 131.132.133.130 > 81.82.83.80: ESP(spi=0x090bb3b5,seq=0x4) 09:55:01.701754 IP 131.132.133.130 > 81.82.83.80: ESP(spi=0x090bb3b5,seq=0x4) Как видим, tcpdump показывает ESP-пакеты. Если попытаться просмотреть их с «араметром -А, то, скорее всего, получится нечто непонятное, поскольку применяется шифрование. Итак, примите поздравления! Мы только что настроили VPN между двумя удаленными сетями с шифрованием по IPSEC. Необходимо выполнить еще одну операцию. Добавим следующие строки в файл /etc/rc. conf на обоих шлюзах: ipsec_enable="YES" ipsec_file="/etc/ipsec.conf" Двух приведенных нами шагов (создание виртуального соединения и защита с использованием IPSEC) должно быть достаточно для настройки и включения VPN. Машины в каждой сети смогут обращаться друг к другу по IP-адресам, и весь трафик через соединение будет автоматически надежно зашифрован. Более подробную информацию можно найти на следующих страницах справочного руководства: man gif, man ipsec, man racoon и man setkey. Использование OpenSSH При использовании протоколов (утилит) telnet или rlogin данные пересылают- а по сети в незашифрованном виде. Перехватчик пакетов, находящийся между клиентом и сервером, может похитить информацию о пользователе/пароле или данные, пере- вваемые через соединение. Для предотвращения этого используется пакет OpenSSH, гагорый предлагает различные методы шифрования. Пакет OpenSSH — это набор утилит, используемых для защищенного доступа удаленным компьютерам. Он может быть использован в качестве замены rlogin.
422 Глава 13. Вопросы безопасности системы telnet и др. Кроме этого, любые другие TCP/IP-соединения могут быть безопасно!)- неллированы через SSH. Работа OpenSSH заключается в шифровании всего сетевою трафика, эффективно предотвращая кражу данных, перехват соединения и другие сетевые атаки. Для включения ssh необходимо добавить следующую строку в конфигурационный файл /etc/rc.conf: sshd_enable="YES" Теперь при следующей загрузке системы будет запущен даемон sshd. Можно запустить его и непосредственно, набрав в командной строке команду sshd. К слову,пакет OpenSSH включен в поставку FreeBSD, начиная в версии 4.0, а его конфигурационные файлы размещаются в каталоге /etc/ssh. При этом файл ssh_conf ig используется для настройки клиента, a sshdconf ig — для настройки даемона. Протокол SSH работает на порту 22. Для создания приватных и публичных ключей используется утилита ssh-keygen Мы не будем рассматривать ее использование, скажем только, что ключи могут был двух типов: RSA и DSA. При этом RSA-ключи используются как для первой, так н дя второй версий протокола SSH, a DSA-ключи — только для протокола второй версии Более подробная информация содержится на странице справочного руководства man ssh-keygen. Для безопасного соединения с удаленным хостом применяется утилита ssh, ис- пользование которой практически ничем не будет отличаться от утилиты telnet: Я ssh 192.168.0.250 The authenticity of host '192.168.0.250 (192.168.0.250)' can't be established. DSA key fingerprint is 89:dl:cf:37:22:06:46:le:03:6a:7e:0c:11:ab:bf:cf. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.0.250' (DSA) to the list of known hosts. Password: Last login: Fri Mar 17 15:53:33 2006 from 192.168.0.1 Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 5.4-RELEASE (GENERIC) #0: Sun May 8 10:21:06 UTC 2005 ( - ) Единственное визуальное отличие: при первом соединении с удаленным хостом, возможно, будет предложено принять публичный ключ (при авторизации по паролю), как показано в примере выше. Заметим, что по умолчанию происходит попытка соединиться с использованием текущей учетной записи. Для подстановки другого имею пользователя (существующего на удаленной стороне) используйте один из следующих вариантов вызова утилиты: # ssh informex@192.168.0.250 # ssh 192.168.0.250 -1 informex Если для соединения с удаленным сервером используется операционная система, отличная от FreeBSD, возможно, придется найти утилиту, позволяющую работать с протоколом SSH. Так, для систем Windows наиболее популярной является утилита PuTTY, распространяемая бесплатно. ЗАЩИТА ФАЙЛОВ В этом разделе мы поговорим только об одной возможности защиты информации на уровне файловой системы: использовании списков контроля доступа ACL (Access Control List).
Защита файлов 423 Использование ACL Система FreeBSD 5.0 и более поздние версии предлагают дополнительную защиту ^Иловой системы с использованием списков контроля доступа файловой системы, ко- ярые расширяют стандартную модель прав UNIX. Возможность использовать ACL пошлет администратору получить преимущество от применения более интеллектуаль- Юй модели безопасности. В случае файловой системы UFS, поддержку ACL необходи- «о включить в ядро следующей строкой в конфигурационном файле ядра: options LJFS_ACL Возможно, этого делать и не придется, потому что поддержка уже включена «стандартное ядро GENERIC. Технология ACL построена на хранении дополнительных атрибутов, встроенных «файловую систему, поэтому будьте осторожны, если когда-нибудь захотите отключить ее поддержку. Кстати, дополнительные атрибуты поддерживаются по умолчанию файловой системой UFS2, но этого не достаточно. Для включения ACL на файловую систему необходимо внести изменения в файл /etc/f stab, а точнее — добавить флаг acls: /dev/adlsld /home ufs acls,rw 2 2 Этот флаг можно сделать постоянным для файловой системы с помощью утилиты tunefs: # tunefs -a enable /dev/adlsld tunefs: ACLs set It mount -a It mount /dev/adOsla on / (ufs, local) devfs on /dev (devfs, local) /dev/adOsle on /tmp (ufs, local, soft-updates) /dev/adOslf on /usr (ufs, local, soft-updates) /dev/adOsld on /var (ufs, local, soft-updates) /dev/adlsld on /usr/home (ufs, local, acls) Последний вариант наиболее предпочтителен по нескольким причинам, из которых основная заключается в невозможности случайного монтирования файловой системы Вез поддержки ACL, что может повлечь проблемы с безопасностью. Файлы и каталоги, Аля которых установлена поддержка ACL, при просмотре прав обозначаются знаком V; I 11 total 12 drwxrwx + 2 root wheel 512 Jan 10 18:16 depot drwxr-xr-x 2 ftpshell www 512 Mar 10 10:12 ftpshell drwxr-xr-x 2 ftpuser ftpuser 512 Dec 13 21:53 ftpuser drwxr-xr-x 2 userl staff 512 Mar 17 16:10 userl drwxr-xr-x+ 2 user2 staff 512 Mar 17 16:11 user2 drwxrwx + 2 informex informex 512 Jan 6 16:17 informex Как видим, каталоги depot, user2 и informex используют ACL. Первый вопрос, лорее всего, будет касаться просмотра списка установленных ACL. Для этого исполь- ]уегся команда getf acl: # getfacl informex Utile:informex iowner:1001 #group:40 user::rwx
424 Глава 13. Вопросы безопасности системы user:root:rwx user:informex:rwx group:: group:www:r-- rnask: : rwx other:: Для изменения ACL используется утилита setfacl. Например, удаление все ACL, кроме тех, которые необходимы для правильной работы, можно произвесл с помощью следующей команды: # setfacl -b informex Установку ACL производите с опцией -т, например: # setfacl -т и:root:rwx,group:www:г—,o:: informex # getfacl informex #file:informex #owner:1001 #group:80 user::rwx user:root:rwx group:: group:www:r-- mask::rwx other:: Таким образом, мы установили на каталог informex следующие права доступ! владелец файла и пользователь root имеют все права (rwx), группа владельца не имея никаких прав на доступ (при этом по UNIX-правам доступ все-таки есть), а вот группе www имеет право на чтение (просмотр), все остальные пользователи не имеют никаив прав доступа. При добавлении пользователя или группы, которые отсутствуют в системе, утилита выдаст ошибку "Invalid argument". В ЗАКЛЮЧЕНИЕ... На этом мы завершаем рассмотрение вопросов, связанных с безопасностью системы. Мы понимаем, что предоставленной информации недостаточно для эффективной защиты системы, однако, по большому счету, эта тема заслуживает целой книги. Целью это! главы было лишь расмотреть возможные варианты повышения безопасности и указал на слабые места системы, требующие тщательного присмотра. Более детальная информация о защите системы может быть найдена в Официальном Руководстве FreeBStya также на странице справочного руководства man security.
Коммутируемый доступ 425 ГЛАВА 14. КОММУТИРУЕМЫЙ ДОСТУП. ШЛЮЗЫ И NAT. СТАТИЧЕСКАЯ МАРШРУТИЗАЦИЯ Кто из нас не слышал слово "dial-up"? Кто не помнит тихий, назойливый свист модема ю время соединения? Ну и кто не знает выражения "провайдер услуг Internet"? Воз- иожно, сегодня таких людей становится все меньше, поскольку коммутируемый доступ выходит из моды, домашние компьютеры подключаются к домашним сетям или к теле- ((юнной линии, но уже с использованием различных стандартов xDSL, некоторым дос- гается выделенная линия. Что же касается компаний, то там уже давно технологии коммутируемого доступа относятся к "каменному веку". Тем не менее, несмотря на это, вопрос использования модемов и телефонных линий все еще остается актуальным. В данной главе мы попытаемся узнать, как использовать РРР в FreeBSD. Кроме тога, будет затронута настройка шлюза, технология преобразования сетевых адресов NAT, атакже статическая маршрутизация. КОММУТИРУЕМЫЙ ДОСТУП Коммутируемый доступ или РРР, в основном, используется для подключения к Internet с помощью модема. В системе FreeBSD для этого существует несколько способов. В первую очередь, — это даемон pppd, встроенный в ядро системы, и утилита ррр, используемая как простое клиентское приложение. Разница между ними проста: ррр уровня пользователя обрабатывает входящие и исходящие данные в пространстве пользователя, а не в ядре. РРР уровня пользователя для связи с внешним миром использует устройство tun, а РРР уровня ядра — устройство ррр. Здесь мы рассмотрим только пользовательский РРР. Далее предполагается, что у читателя присутствует следующее: • Модем или другое подключенное к системе и правильно настроенное устройство, позволяющее подключиться к провайдеру. Заметим, что в FreeBSD используются следующие обозначения для последовательных портов: СОМ1—cuaaO, COM2 — cuaal и т.д. • Учетная запись у провайдера Internet (Internet Service Provider, ISP), с которым устанавливается соединение, используя РРР. ■ Телефонный номер модемного пула провайдера. ■ Имя пользователя и пароль. • IP-адреса одного или нескольких серверов имен. Обычно провайдер дает для этих целей два IP-адреса. Если нет ни одного, можно воспользоваться командой enable dns в файле /etc/ppp/ppp.conf для автоматической настройки списка серверов имен. Эта возможность зависит от наличия поддержки соответствия DNS в реализации РРР провайдера.
426 Глава 14. Коммутируемый доступ. Шлюзы и NAT. Статическая маршрутизация Настройка пользовательского РРР Наиболее простой вариант настройки РРР — воспользоваться пользовательски РРР. В этом случае требуется только наличие поддержки туннельного устройства tun в ядре, через которое и работает пользовательский РРР. Проверим его наличие. Для сш> тем FreeBSD 4.x присутствие устройства tun можно определить по строке pseudo- device tun 1 в конфигурационном файле ядра, используемого в данный момент. Вместо 1 может быть указано и другое число, в зависимости от того, сколько требуета туннельных устройств. В обычной ситуации это только одно устройство tun (/dev/ tunO). В случае FreeBSD 4.x также потребуется выполнить следующие команды: # cd /dev # sh MAKEDEV tunO Затем можно переходить непосредственно к настройке пользовательского РРР, В первую очередь следует отметить, что и ррр, и pppd (реализация РРР уровня ядра) используют файлы настройки, расположенные в каталоге /etc/ppp. Примеры дм пользовательского РРР можно найти в каталоге /usr/share/examples/ppp/. Настройка пользовательского РРР требует редактирования нескольких конфигурационнш файлов, в зависимости от текущих потребностей. То, что будет помещено в эти файлы, зависит в некоторой степени от того, предоставит ли провайдер статический IP-адрк (то есть, один определенный IP-адрес, который будет использоваться постоянно) или динамический (то есть, IP-адрес будет изменяться при каждом подключении к провайдеру). В первую очередь необходимо отредактировать файл /etc/ppp/ppp.conf, содержащие основные настройки. По умолчанию, он уже присутствует в системе. Для каждого конкретного случая его придется немного отредактировать, но сначала рассмотрим подробнее его конфигурацию по умолчанию. Содержимое файла ppp.conf (без строк комментариев) представлено в листинге 14.1. Листинг 14.-1. Пример конфигурационного файла У•tc/ppp/PPP-eonf default: set log Phase Chat LCP IPCP CCP tun command ident user-ppp VERSION (built COMPILATIONDATE) set device /dev/cuaal set speed 115200 set dial "ABORT BUSY ABORT NOWsCARRIER TIMEOUT 5 \ \"\" AT OK-AT-OK ATE1Q0 OK WdATDTWT TIMEOUT 40 CONNECT" set timeout 180 enable dns papchap: set phone PHONE_NUM set authname USERNAME set authkey PASSWORD set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 add default HISADDR Опишем все строки этого файла, но сперва разъясним суть меток default: и papchap:. Конфигурационный файл ppp.conf разделен на секции. Одна из секций является обязательной и выполняется всегда (default)l Другие секции — дополнительные и используются для описания конкретных настроек "под провайдера". В наша) примере такой секцией является papchap. Обратите внимание на то, что метки должны начинаться с новой строки и без отступа. Все остальные строки обязательно должны иметь отступ, как в файле примера.
Коммутируемый доступ 427 Итак: • default: — начинает настройку по умолчанию. Команды этой настройки выполняются автоматически при запуске ррр. ■ set log — включает параметры протоколирования. Когда настройка работает удовлетворительно, эта строка должна быть сокращена до следующей формы во избежание появления слишком больших log-файлов: set log phase tun • ident — указывает РРР как идентифицировать себя на удаленной стороне. РРР идентифицирует себя на удаленной стороне, если возникают проблемы согласования и установки соединения, предоставляя информацию, по которой администратор на удаленной стороне может воспользоваться для решения таких проблем. • set device — указывает устройство, к которому подключен модем. СОМ1 — это /dev/cuaaO, COM2 — это /dev/cuaal. set speed — устанавливает желаемую скорость подключения к модему. Если 115200 не работает (хотя должна работать для любого относительно нового модема), попробуйте 57600 или меньше. set dial — строка дозвона. Пользовательский РРР применяет синтаксис "ех- pect-send", похожий на синтаксис утилиты chat. Информацию о возможностях этого языка можно найти на соответствующей странице справочного руководства. Обратите внимание на то, что эта команда продолжается на следующей строке для улучшения читаемости. Любая команда в ppp.conf может быть продолжена на следующей строке, в конце предыдущей строки указать символ "\". Представленный сценарий в большинстве случаев работоспособен, потому не имеет смысла его изменять. • set redial — этой строки нет в нашем конфигурационном файле, но все же опишем ее. Она определяет количество попыток дозвона, используемых программой РРР в случае, если соединение не может быть установлено сразу, а также интервал между попытками. Пример для трех попыток и одной секунде интервала будет выглядеть следующим образом: set redial 3 1 set timeout — устанавливает предельное время ожидания для соединения. По умолчанию используется значение 180 секунд. При отсутствии входящего или исходящего трафика по истечению указанного времени соединение будет разорвано. При установке значения в 0 соединение не будет разрываться, enable dns — указывает РРР запросить у удаленной стороны сервер имен. При работе с локальным сервером имен эта строка должна быть закомментирована или удалена, так как она переписывает содержимое файла /etc/resolv. conf. ■ papchap: — определяет настройки для провайдера. Имя метки может быть изменено на имя провайдера, чтобы в дальнейшем можно было использовать его для начала соединения. set phone — определяет телефонный номер для провайдера. В качестве разделителя нескольких телефонных номеров можно использовать символы двоеточия ":" или канала "|". Различия между этими двумя разделителями таковы: если требуется перебирать номера, то используйте двоеточие, если же необходимо дозваниваться в первую очередь по первому номеру и использовать другие номера только в том случае, если дозвон по первому завершится неудачно, используйте символ канала. Всегда заключайте номера в списке в кавычки, например, "42222" (особенно, если в нем используются пробелы). Отсутствие кавычек может вызвать простую, но трудно обнаруживаемую ошибку.
428 Глава 14. Коммутируемый доступ. Шлюзы и NAT. Статическая маршрутизация set authname, set authkey — задают имя пользователя и пароль. В случае приглашения login в стиле UNIX эти значения используются командой set login через переменные \U и \Р. При соединении с использованием РАР или CHAP, эти значения используются во время аутентификации, set if addr — устанавливает адрес интерфейса. Первое число 10. О . 0.1/0 необходимо заменить на реальный IP-адрес, выданный провайдером. Если используется динамический адрес, оставьте все как есть. Второе число 10.0.0.2/2 необходимо заменить на адрес шлюза, выданный провайдером. Если провайдер не предоставил адрес, оставьте все без изменений. Остальные числа, как правило, изменять нет надобности, если провайдер не упомянул иное, add default HISADDR — добавляет маршрут по умолчанию. Специальное ело во HISADDR заменяется адресом шлюза. Важно, чтобы эта строка появилась после строки set if addr. Применение пользовательского PPP Для запуска пользовательского РРР с профилем papchap необходимо выполнил следующую команду: # ppp -background papchap Эта команда позволяет в фоновом режиме выполнить набор номера провайдера и создать соединение. В некоторых случаях, когда не проходит РАР- или СНАР-аутенти- фикация, необходимо внести некоторые изменения в конфигурационный файл. Прежде всего, удалите секцию papchat вместе со всеми ее опциями и добавьте такую секцию: ukrtel: set phone "42222" set login "TIMEOUT 10 \ "\ " \ "\ " gin: userl word: passwdl" set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 add default HISADDR где userl и passwdl — имя пользователя и пароль. После внесенных изменений снова попробуйте дозвониться, но уже следующей командой: # ppp -background ukrtel Для разрыва соединения воспользуйтесь командой kill для соответствующегоP1D процесса или просто командой killall ppp. Обратите внимание на то, что, добавив в конфигурационный файл ppp. conf строку allow users вы тем самым разрешите выполнять набор всем пользователям системы, а не только пользователю root. Вызов по требованию Дозвон можно выполнить не только в фоновом режиме сразу после ввода команды РРР, но и в автоматическом режиме по требованию, или же поддерживать постоянное соединение, создавая его при загрузке системы. Для соединения по требованию в команде ppp вместо опции -background необходимо использовать опцию -auto. Теперь соединение будет выполняться автоматически при первом же запросе внешнего соединения. Если необходимо включить режим соединения по требованию на момент загрузки системы, добавьте в файл /etc/rc. conf следующую строку: ppp_enable="YES" Если необходимо выполнить дозвон по описанной ранее секции ukrtel, добавьте также следующую строку:
Коммутируемый доступ 429 ppp_profile="ukrtel" Следует обратить внимание, что в данном случае также открывается доступ всем пользователям локальной сеты, которые используют текущий компьютер в качестве шлюза, через автоматическое включение поддержки технологии NAT (будет описана немного позже). Если такой вариант не подходит, дополните конфигурационный файл /etc/rc.conf следующей строкой: ppp_nat="NO" Можно использовать и такую строку в файле /etc/ppp/ppp. conf: nat enable no Постоянное соединение Для поддержки постоянного соединения (от загрузки системы до ее выключения) впервую очередь необходимо установить в файле ppp.conf значение 0 для параметра set timeout. Затем добавьте следующую строку в файл /etc/rc. conf в дополнение к предыдущим упомянутым строкам и перезагрузите систему: ppp_mode="ddial" Во время загрузки системы сервер автоматически создаст РРР-соединение. Сценарии времени соединения/разъединения Пользовательский РРР умеет выполнять набор команд в момент установки соеди- иения или его разрыва. Для этого используются файлы /etc/ppp/ppp. linkup и /etc/ppp/ppp. linkdown. Синтаксис этих файлов приблизительно следующий: papchap: доп.опция !bg команда_оболочки urktel: доп.опция !bg команда_оболочки Благодаря наличию этих файлов, можно выполнить дополнительную настройку параметров соединения, а также запустить некоторые команды оболочки, например, указать забирать почту при соединении (см. файлы примеров в каталоге /usr/share/ examples/ppp). Больше информации о настройке РРР можно получить на странице Официального Руководства FreeBSD или справочной системы man ppp. Информацию о РРР ядра смотрите на странице man pppd. Настройка РРРоЕ (РРР over Ethernet) С распространением технологии ADSL очень популярным стал вопрос настройки РРРоЕ. Настройка РРРоЕ в FreeBSD проста и не требует никаких дополнительных настроек ядра. Она использует Netgraph. Если поддержка Netgraph не встроена в ядро, она будет динамически загружена утилитой ррр. Настройка РРРоЕ проще, чем настройка пользовательского РРР, и основана на его конфигурационном файле. Пример конфигурационного файла /etc/ppp/ppp. conf для РРРоЕ представлен в листинге 14.2.
430 Глава 14. Коммутируемый доступ. Шлюзы и NAT, Статическая маршрутизация Листинг 14.2. Пример файла /etc/ppp/ppp.oonff для РРРоЕ default: set device РРРоЕ:fxpO:optima set speed sync set mru 1492 set mtu 1492 set ctsrts off enable lqr add default HISADDR set timeout 0 set redial 0 0 nat enable yes nat log yes nat same_ports yes nat unregistered_only yes enable dns optima: set authname userl set authkey passwdl После того как будет создан представленный файл, можно вручную запустить ррр следующей командой: # ррр -ddial optima Для автоматического запуска поддержки РРРоЕ во время загрузки системы внесик следующие строки в конфигурационный файл /etc/rc. conf: ppp_enable="YES" ppp_profile="optima" ppp_mode="ddial" ppp_nat="YES" ppp_user="root" К слову, не забудьте изменить f xpO на имя устройства конкретной Ethernet-карта, подключенной к ADSL-модему. Вместо optima можно использовать любое другое им профиля (как правило, устанавливается по имени провайдера). Иногда провайдер ш указывает необходимое имя сервиса — в таком случае используйте именно его. ШЛЮЗЫ И NAT Система FreeBSD может выступать в качестве шлюза, а также отвечать за преобразование сетевых адресов. Рассмотрим данные вопросы с практической стороны. Настройка шлюза в Internet Шлюз (gateway) — это обычный маршрутизатор, который пересылает пакеты с одного интерфейса на другой. На сегодняшний день практически всегда используега именно это определение шлюза, хотя ранее шлюз описывался как устройство, пересылающее пакеты между сетями различных типов). Как бы там ни было, сегодня поняли шлюза совпадает с понятием маршрутизатора. Итак, FreeBSD, согласно стандартам, по умолчанию не поддерживает пересылку пакетов между интерфейсами, но включить такую возможность не составит труда. Всё, что требуется — добавить только одну строку в конфигурационный файл /etc/ re. conf и перезапустить систему. Упомянутая строка имеет следующий вид:
Шлюзы и NAT 431 gateway_enable="YES" Этот параметр изменит значение переменной ядра net. inet. ip. forwarding 11. Если временно требуется выключить маршрутизацию, можно сбросить это значение в 0. Теперь осталось только настроить клиентов сети на использование данного компьютера в качестве шлюза по умолчанию. К сведению, если шлюз подключен к Internet, и пользователям сети необходимо предоставить к нему доступ, позаботьтесь о настройке NAT как описано далее. Даемон преобразования сетевых адресов natd Технология NAT (Network Address Translation) позволяет подключать к Internet несколько машин с использованием только одного IP-адреса. Все машины сети используют шлюз NAT, который содержит этот адрес у себя на интерфейсе, принимает входящие запросы от компьютеров в локальной сети и отправляет их от своего имени. Ответы также возвращаются на данный адрес, а шлюз NAT решает, кому в локальной сети вернуть ответ. Использование технологии NAT позволяет сэкономить IP-адреса, а также использовать только одну машину для выхода в сеть Internet множества машин, подключенных к ней. За NAT в системе FreeBSD отвечает даемон natd, который принимает входящие IP-пакеты, изменяет адрес отправителя на адрес локальной машины и повторно отправляет эти пакеты в потоке исходящих пакетов. Стоит обратить внимание, что компьютер, реализующий NAT, должен быть шлю- юм, и включать поддержку брандмауэра ipfw. Исходя из этого, для использования natd в ядре должны содержаться следующие настройки: options IPFIREWALL options IPDIVERT Если они не были включены, сделайте это сейчас и установите новое ядро, и только после этого переходите к настройке самого natd. Настройка даемона преобразования соевых адресов не очень сложна, так как система FreeBSD берет практически все настройки "на себя". Достаточно только проконтролировать наличие следующих строк в файле /etc/rc.conf: gateway_enable="YES" firewall_enable="YES" firewall_type="OPEN" natd_enable="YES" natd_interface="epO" natd_flags="" В данном примере мы сделали следующие настройки (по строкам): • разрешили компьютеру выступать в качестве шлюза. Альтернативный способ — выполнить команду sysctl net.inet.ip.forwarding=l; • во время загрузки системы включается использование правил брандмауэра из файла /etc/rc.firewall; • задаем предопределенный набор правил брандмауэра, который разрешает запуск даемона natd (будет запущен через набор правил в файле /etc/rc. firewall); • указываем, через какой интерфейс передавать пакеты (это должен быть тот интерфейс, который "смотрит" в Internet); ■ можно также определить дополнительные параметры, передаваемые при запуске даемону natd. При использовании перечисленных выше параметров из файла /etc/rc.conf во время загрузки будет запущена команда natd -interface epO. Эту команду можно мпустить и вручную. Если для реализации natd набирается слишком много параметров, можно использовать отдельный конфигурационный файл. В этом случае имя на-
432 Глава 14. Коммутируемый доступ. Шлюзы и NAT. Статическая маршрутизация 1 строечного файла должно быть задано путем добавления следующей строки в /е::!| rc.conf: I natd_flags="-f /etc/natd.conf" I В данном случае файл /etc/natd. conf будет содержать перечень конфигурада онных параметров (по одному в строке). Например, это могут быть следующие строки redirect_port tcp 192.168.1.2:21 21 redirect_port tcp 192.168.1.3:80 80 Эти настройки позволяют перенаправлять пакеты, пришедшие на указанные порт указанным машинам локальной сети. Опция redirect_port может использоватш для указания диапазонов портов, а не конкретного порта. Например, определение tcp 192.168.1.20:5000-6000 5000-6000 будет перенаправлять все соединения, принимаемые на портах от 5000 до 6000, на порты от 5000 до 6000 клиенту с адресок 192.168.1.20. За более полной информацией о конфигурационном файле обращайтесь к страншк справки man natd относительно параметра -f. Что касается настройки клиентских машин, то каждой из них должен быть присвоен соответствующий адрес локальной сети, а в качестве маршрутизатора по умолчании должен быть задан внутренний IP-адрес компьютера с даемоном natd. Например, если клиенты client2 и client3 в локальной сети имеют IP-адреса 192.168.1.2» 192.168.1.3. а интерфейс компьютера с natd в локальной сети имеет IP-адрес 192.168.1.1, то шлюзом для клиентов должен быть назначена машина с lP-адресои 192.168.1.1. К слову, если для ipfw используется личный сценарий, в него необходимо добавить следующее правило: add divert natd all from any to any via epO На этом завершим рассмотрение настройки шлюзов и NAT и перейдем к вопросу определения статических маршрутов. СТАТИЧЕСКАЯ МАРШРУТИЗАЦИЯ Нередко приходится настраивать сервер с несколькими маршрутами. Если помните, мы проделали эту операцию в предыдущей главе, когда строили VPN, добавив один статический маршрут vpn. Тогда мы особо не углублялись в вопросы маршрутов — сделаем это сейчас. Итак, определим следующие предпосылки: Машина gate является шлюзом в сеть Internet. Она имеет два интерфейса: один "смотрит" в Internet через выделенную линию (или каким-либо другим способом), а другой — в локальную сеть. При этом маршрут по умолчанию — адрес шлюза на стороне провайдера (например, 81.82.83.1), что позволяет ему соединяла с внешним миром. Второй интерфейс имеет адрес 192.168.1.1/24, и операционная система автоматически добавит маршрут для сети этого класса, так что данный компьютер будет видеть все машины своей подсети, и наоборот. В локальной сети есть еще один шлюз loc2gate. Он также имеет два интерфейса: один "смотрит" в первую сеть 192.168 .1.0/24 с адресом 192.168.1.2.а в качестве маршрута по умолчанию у него указан адрес шлюза в Internet (то есть, адрес gate — 192.168.1.1). Второй интерфейс имеет адрес 192.168.2.1 и "смотрит" в локальную сеть 192.168 .2. 0/24. В данной конфигурации машина gate не сможет достичь второй сети, находящейся за шлюзом loc2gate. Один из способов обхода этой проблемы — добавление ста-
Статическая маршрутизация 433 такого маршрута ко второй сети вручную. Следующая команда добавит маршрут наблице маршрутизации машины gate ко второй сети с адресом 192.168.1.2 foc2gate) в качестве следующего маршрутизатора: t route add -net 192.168.2.0/24 192.168.1.2 Теперь машина gate сможет достичь любого хоста в подсети 192 .168 . 2. 0/24. Если настройка маршрутов прошла успешно, шлюз gate "увидит" машины во второй подсети. Теперь необходимо сохранить изменения в конфигурации системы, поскольку node перезагрузки вся маршрутная информация будет сброшена. Сохранить статический юршрут в конфигурацию системы можно, добавив следующие строки в конфигураци- юныйфайл /etc/rc.conf: static_routes="loc2gate" route_loc2gate="-net 192.168.2.0/24 192.168.1.2" В переменной static_routes можете перечислить через пробел несколько имен юршрутов на свое усмотрение. В примере выше в static_routes указано только од- ю имя маршрута: loc2gate (по названию шлюза). Затем мы добавили переменную route_loc2gate, в которую поместили все параметры дял передачи команде routed ю время запуска FreeBSD. Эти параметры соответствуют той строке, которую мы ис- вользовали при добавлении маршрута вручную. Как было сказано выше, мы можем добавить в static_routes одного имени маршрута, что позволяет создать несколько статических маршрутов. В следующем примере юказано добавление маршрутов для подсетей 192.168. 3.0/24 и 192.168.3.0/24: static_routes="account office" route_account="-net 192.168.3.0/24 192.168.3.1" route_office="-net 192.168.4.0/24 192.168.4.1" Надеемся, вопрос создания статических маршрутов не был сложным для понимания. Кроме добавления статических маршрутов, система FreeBSD поддерживает дина- иическую маршрутизацию с использованием все того же даемона routed, но данный вопрос выходит за рамки этой книги.
434 Глава 15. Работа с почтой (e-mail) ГЛАВА 15. РАБОТА С ПОЧТОЙ (E-MAIL) Ну вот, мы и подошли к тому, ради чего, собственно говоря, и устанавливается большинство серверов. Сегодня очень трудно представить себе Internet без почты, хотя у некоторых понятие "Internet" больше ассоциируется с доступом к Web-сайтам, но на и- мом деле данная технология появилась сравнительно недавно. А вот обмен сообщениями — это одно из первых сетевых решений. К тому же, все UNIX-подобные систш поставляются с предустановленным почтовым пакетом, а вот Web-сервер, как правило, практически всегда необходимо устанавливать отдельно. Система FreeBSD не стала исключением — почтовый сервер становится доступны» сразу же после установки системы. К нашей общей радости отметим, что его можно использовать как полнофункциональный почтовый сервер без внесения существенных изменений, хотя, естественно, — с большими ограничениями и оговорками. По-правдего- воря, настройка почтового сервера всегда считалась и до сих пор считается одной из самых сложных тем. Но мы ведь изучаем FreeBSD, и можем надеяться, что данная сие» ма позволяет существенно упростить процесс настройки. И действительно, настроив почтового сервера в FreeBSD упрощена настолько, насколько это только возможно, чти и будет показано в данной главе. Что же будет рассмотрено? Очень много, начиная от принципов функционировании почтового сервера, протоколов почтового взаимодействия (SMTP, POP, IMAP), настройки клиентских почтовых программ, и заканчивая настройкой сервера на аутентификацию пользователей, защитой от спама (на примере использования пакета SpamAs- sassin) и вирусов (на примере антивирусного пакета ClamAV). Впрочем, тот, кто хояет узнать о настройке почтовых серверов Postfix, Exim или QMail, будет несколько разочарован — глава более посвящена продукту Sendmail, а остальных почтовых серверах будет кратко упомянуто в конце главы. Тем не менее, вопрос замены Sendmail будет рассмотрен практически в самом начале, на этапе изучения управления работой утилит sendmail. ПРОТОКОЛЫ РАБОТЫ С ПОЧТОЙ Для работы с почтой могут использоваться различные протоколы в зависимости от потребностей и задач. Так, для пересылки почтовых сообщений применяется протокол SMTP, а для получения — POP, IMAP или HTTP (с использованием Web-клиента). Попробуем кратко разобраться в назначении, характеристиках, особенностях и отличив некоторых из них. Протокол SMTP Протокол SMTP (Simple Mail Transfer Protocol — простой протокол передачи почты) является одним из самых простых и распространенных протоколов Internet. Егоза- дача— надежная и быстрая доставка сообщений электронной почты от хоста к хосту, При этом схема пересылки значительно отличается от стандартной, где пакет проходит путь от маршрутизатора к маршрутизатору. В данном случае SMTP-сервер клиента непосредственно взаимодействует с SMTP-сервером получателя (такая схема была названа "mail relaying"). Возможность пересылки сообщений с использованием relay-серверм
Протоколы работы с почтой 435 юможна благодаря механизму Mail Exchanger (MX) реализованному в системе DNS. 1ри этом, если необходимо, сообщение можно передавать через большое количество (юмежуточных relay-серверов. Как упоминалось ранее, протокол SMTP — один из самых простых. Наверное, потому он получил столь широкое распространение и популярность (в отличие от UUCP, l)nix-to-Unix Copy Program). Для работы с SMTP используется порт 25. Прежде чем мы усмотрим последовательность доставки сообщения от пользователя к пользователю «(протоколу SMTPK), упомянем основные термины, применяемые при описании поч- юеого взаимодействия. Главным объектом является почтовое сообщение, которое состоит из конверта (еп- islope) и содержимого (data). Конверт содержит адрес отправителя, адрес получателя (ш получателей), а также дополнительную информацию для других служб, принимающих участие в обработке почтовой корреспонденции. Содержимое сообщения состоит из двух блоков: заголовка и тела сообщения. При передаче сообщения участник транзакции, который передает сообщение, носит швание "SMTP-client", а принимающий участник называется "SMTP-server". Любая ишина, которая, так или иначе, принимает участие в процессе передачи сообщения от иного клиента другому, а также поддерживает работу с протоколом SMTP, называется жтом. При этом все хосты, как правило, указываются (именуются) по DNS-именам, а к по адресам. Использовать для указания почтовых хостов IP-адреса не рекомендуется. Почтовые SMTP-серверы, которые организовывают транспортировку сообщений, называются агентами доставки почты (МТА, Mail Transfer Agent). Приложения на принимающей и отправляющей стороне, отвечающие за постановку сообщения в очередь, а также доставку сообщения конкретному пользователю системы, называются лчьзовательскими почтовыми агентами (MUA, Mail User Agent). Ну а почтовый щик—это место хранения почты. Теперь, зная основные понятия, рассмотрим путь прохождения сообщения от отправителя к получателю (рис. 15.1). Возможные промежуточные (relay) SMTP-сереерн Internet SMTP-5*(VW (МТА), получение сообщения Легальное или удаленное (РОРЗ IKW) соединение Пользователь, изздающий сообщение с использованием MUA С^^^5Э Польэоеатель. читающий почту с использованием MUA Рис. 15.1. Схема прохождения электронного сообщения от отправителя к получателю
436 Глава 15. Работа с почтой (e-mail) Не трудно догадаться, что первым делом необходимо создать сообщение. Для этот пользователь использует почтовый агент (MUA). После формирования письма почта- вый агент передает его своему почтовому серверу (на рисунке изображен как SMTP- client) а не сразу же серверу получателя. Такое поведение предоставляет ряд преимуществ, которые будут в той или иной степени затронуты в данной главе. Одно из таю преимуществ заключается в том, что клиенту нет необходимости знать о работоспособности SMTP-сервера получателя в данный момент и ожидать его появления в сети до отправки. Сервер почтового агента ставит сообщение в очередь. Когда SMTP-сервер отправит теля обнаруживает доступность SMTP-сервера получателя, то инициирует соединение, в ходе которого и происходит передача сообщения, хранящегося в очереди. Кстати, уже в данном случае SMTP-client является сервером перенаправления, поскольку отправлял "чужое" сообщение (данный сервер не является ни получателем, ни источником сообщения). SMTP-сервер на принимающей стороне сохраняет сообщение в почтовом ящию пользователя, которому было адресовано сообщение. Получатель может забрать его с помощью почтового агента, инициировав соединение с использованием одного из протоколов получения почты, или же напрямую получив доступ к файлу (директории) почтового ящика. Практически в каждой книге при рассмотрении протокола SMTP приводится при- мер соединения, создания, и отправки сообщения с использованием простой терминальной сессии и команд SMTP, вводимых вручную пользователем. Мы не будем отрывал ся от этой "традиции" и приведем собственный пример, представленный в листинге I5.I (полужирным шрифтом выделены команды, вводимые пользователем с клавиатуры) к частично отображающий схему, изображенную на рис. 15.1. Листинг 15.1. Пример создания и отправка сообщения с помощью telnet ^ # telnet main.com.ua 25 Trying 67.15.24.22... Connected to main.com.ua. Escape character is ,л]'. 220-server22.fastbighost.com ESMTP Exim 4.51 #1 Wed, 10 Aug 2005 12:32:07 4>+0000 220-We do not authorize the use of this system to transport unsolicited, 220 and/or bulk e-mail. HELO mobile.altersys-ua.com 250 server22.fastbighost.com Hello mobile.altersys-ua.com [82.207.59.227] MAIL From: userBaltersys-ua.com 250 OK RCPT To: dest@main.com.ua 250 Accepted DATA 354 Enter message, ending with "." on a line by itself From: usergaltersys-ua.com To: destemain.com.ua Subject: test test message 250 OK id=lE2pnh-0004Jf-Su QUIT 221 server22.fastbighost.com closing connection Connection closed by foreign host. Из листинга видно, что процесс взаимодействия по протоколу SMTP сведен к минимуму и осуществляется с помощью четырехсимвольных команд, вводимьв
Протоколы работы с почтой 437 ^верхнем регистре. Некоторые команды требуют ввода аргументов, которые включайся в заголовок сообщения. Помимо этого, в блоке данных необходимо снова опреде- 1ть заголовки: отправитель, получатель, тема. Само сообщение отделяется от заголов- iпустой строкой и завершается строкой, содержащей знак точки — после ее получе- т сообщение моментально помещается в очередь доставки. Кроме рассмотренных тримере команд, существуют также и другие, которые применяются на практике аген- ами пересылки почты. Наиболее распространенными агентами пересылки почты для FreeBSD являются iendmail, Postfix, Exim и Qmail. Протокол РОРЗ Итак, почта была успешно доставлена на сервер получателя. Как теперь ее может юлучить и прочитать пользователь? Первый вариант, используемый в прошлом и до- впьно часто до сих пор, — это чтение почты прямо на сервере с помощью терминаль- »й сессии или находясь непосредственно за физической консолью. Но удобно ли это? Предположим, сотрудник компании уехал в командировку на месяц в филиал, рас- |моженный в другом городе. Для возможности обмена корреспонденцией можно преградить всех сотрудников пересылать почту на временно созданный ящик в филиале. |1ри этом плюсов практически никаких не наблюдается: временное создание почтового щика (и пользователя) на удаленном сервере, необходимость перенастраивания поль- »вателей в главном офисе и, возможно, даже нарушение политики безопасности финала. Другой способ — предоставить возможность доступа к серверу основного офиса юмпании через терминальную сессию, но при этом снова возникает вопрос о безопас- нсти, если отсутствует виртуальная частная сеть (VPN) с шифрованием. Помимо этого, (годня прямой доступ к файлу почтового ящика пользователя используется, в основ- №i, системными/сетевыми администраторами по служебным причинам. Вместо прямого доступа пользователи применяют доступ к почтовому ящику помощью одного из протоколов загрузки почтовых сообщений. К таким протоколам, первую очередь, относится протокол POP (Post Office Protocol). На данный момент аиболее распространена третья версия— РОРЗ. Появлению подобного протокола вдшествовало быстрое возрастание количества пользователей сети и повышение трепаний к почтовым агентам, а конкретнее — наличие графического интерфейса и ото- 1ржение мультимедиа-содержимого, чего не было в консольных утилитах типа mail он elm. Немаловажной причиной также послужило широкое распространение коммер- кких операционных систем для персонального использования семейства Windows и jiyrax смежных продуктов, которые поначалу были практически несовместимыми для пользования совместно с Unix-системами. Рассмотрим работу с данным протоколом, его основные характеристики и возмож- исти. В первую очередь отметим, что протокол РОРЗ прослушивает порт ПО и был азработан для обработки почты на локальном клиентском компьютере. Это означает, ю клиент периодически запускает почтовую программу, которая, соединившись с сер- фом, определяет наличие новых сообщений, и загружает всю новую корреспонденцию о локальную рабочую станцию, удалив ее из почтового ящика на сервере. Вся даль- гйшая обработка почты (фильтрация, чтение и т.п.) происходит без участия сервера, го позволяет уменьшить нагрузку на сервер за счет минимизации использования его курсов. Это позволяет также уменьшить время доступа к серверу, что особенно акту-
438 Глава 15. Работа с почтой (e-mail) ально для пользователей, использующих коммутируемый доступ с платой за время соединения. По принципу работы РОРЗ подобен SMTP, но требует обязательной авторизации, так как при отправке сообщения практически не имеет значения, кто является автором письма, а вот при получении это крайне необходимо— и в первую очередь для того, чтобы определить, к какому почтовому ящику предоставить доступ клиенту. Обязательная авторизация также необходима для удостоверения в том, что доступ получает именно тот человек, которому и предназначена корреспонденция, а не злоумышленник. При этом можно столкнуться с другой проблемой: все операции в протоколе РОРЗ производятся в открытом ASCII тексте, как показано в листинге 15.2. Однако эта проблема решается за счет включения шифрования TSL/SSL, которое поддерживается большинством РОРЗ-серверов. Листинг 15.2. Результат прослушивания сетевых пакетов На почтовом сервере с поме- щью команды tepdump-Aw Е . . 7 . . @ . . . 1 f.n...V.|..P. D<N . . . USER testeron 12:06:41.292256 IP (tos 0x0, ttl 64y id 3903, offset 0, flags [DF], length: 40) mobile, altersys-ua. com. рорЗ > 192.168.0.1.3174: . [tcp sumo);', 53:53(0) ack 16 win 65535 E..(.?@.@..w n.f.l eP....:.. 12:06:41.295072 IP (tos 0x0, ttl 64, id 3904, offset 0, flags [DF], length: 77) mobile.altersys-ua.com.рорЗ > 192.168.0.1.3174: P [tcp sum ok) 53:90(37) ack 16 win 65535 E..M.@@.@..Q n.f.l eP...l... +OK Password required for testeron. 12:06:41.303261 IP (tos 0x0, ttl 128, id 3030, offset 0, flags [DF], length: 56) 192.168.0.1.3174 > mobile.altersys-ua.com.рорЗ: Р [tcp sum ok] 16:32(16) ack 90 win 17431 E ■ . 8 . . @ . . . 1 f.n...e.|..P.D PASS qwertyuio Для возможности обмена информацией в первую очередь устанавливается TCP- соединение между клиентом и почтовым сервером. Во время соединения сервер выдай приглашение, после чего начинается обмен информацией. В конце соединение закрывается или обрывается со стороны сервера. Как видим, все происходит аналогично случаю с протоколом SMTP. Более того, все команды РОРЗ состоят из предопределенных ключевых слов (длина 3-4 символа) в формате ASCII с возможными аргументами, отделенными от команд одиночным символом пробела. На команды РОРЗ-сервер возвращает ответы в виде индикатора состояния и возможной дополнительной информации. Индикатор состояния принимает только два значения: положительный ("+ОК") и отрицательный ("-ERR"). Вся РОРЗ-сессия разделена на три режима: авторизация (AUTHORIZATION), обмен (TRANSACTION) и обновление (UPDATE). Режим авторизации начинается сразу же после установки соединения с РОРЗ-сервером. В данном режиме клиент должен пройти авторизацию с помощью команд USER и PASS (существует также команда АРОР, которую мы рассматривать не будем). Первой следует команда USER с аргументом- именем пользователя системы. Если пользователь существует, то будет выдан ответ с положительным индикатором состояния. В противном случае, необходимо повторить попытку ввода имени пользователя или выполнить выход с использованием команды QUIT (без перехода в режим "UPDATE"!). После успешного ввода имени пользователя, необходимо ввести пароль с помощью команды PASS. В случае успешной авторизации сервер открывает и блокирует почтовый ящик (га называемый монопольный режим, когда одновременно с почтовым ящиком может ра-
Протоколы работы с почтой 439 • ~—" (отать только один пользователь), а также выводит информацию о количестве сообщений и их суммарном размере. После этого сессия переходит в режим обмена. В данном Икиме может использоваться 7 команд (или 9, что зависит от сервера): ■ stat — позволяет вывести статистическую информацию о количестве сообщений в ящике и их суммарном объеме; • LIST [msg] — позволяет вывести информацию обо всех сообщениях в почтовом ящике, или же, если в качестве аргумента был указан порядковый номер определенного сообщения (msg), — только об указанном сообщении; ■ RETR msg — позволяет получить все содержание сообщения; ■ DELE msg — удаление указанного сообщения с номером msg; • NOOP — команда без явного предназначения; всегда возвращает положительный ответ и не выполняет никаких действий; ) • RSET — позволяет снять метку с сообщений, помеченных на удаление; • QUIT — переход в режим "UPDATE". Дополнительно могут использоваться команды TOP msg n (получить заголовок указанного сообщения msg и первые n-строк содержимого сообщения) и UIDL [msg]. Последний режим — это режим "UPDATE". Он наступает после выполнения команды QUIT в режиме обмена и позволяет освободить все занятые ресурсы и завершить ЮРЗ-сессию. Для иллюстрации рассмотрим пример простого РОРЗ-сеанса (листинг 15.3). Цистинг 15.3. Пример простого РОРЗ-сеадса с помо1№ю ^а1д«€тсоединвнй»по порту lid I telnet altersys-ua.com 110 Trying 192.168.0.200. . . Connected to altersys-ua.com. Escape character is ,A]'. «Ж ready <877.1124185192@mobile.altersys-ua.com> USER testeron ♦OK Password required for testeron. tKSS qwartyuio НЖ testeron has 2 visible messages (0 hidden) in 2323 octets. SIAT ♦OK 2 2323 LIST ЮК 2 visible messages (2323 octets) 1 1551 1 772 BETR 2 ♦OK 772 octets Return-Path: <testeron@mobile. altersys-ua. com> Received: frommobile.altersys-ua.com (localhost [127.0.0.1]) by mobile.altersys-ua.com (8.13.3/8.13.3) with ESMTP id j7G9dbNd0OO874 for <testeron@mobile.altersys-ua.com>; Tue, 16 Aug 2005 12:39:37 +03OO (EEST) (envelope-from testeron@mobile.altersys-ua.com) Received: (from root@localhost) bymobile.altersys-ua.com (8.13.3/8.13.3/Submit) id j7G9db6M000873 for testerondlocalhost; Tue, 16 Aug 2005 12:39:37 +0300 (EEST) (envelope-from testeron) Date: Tue, 16 Aug 2005 12:39:37 +0300 (EEST) from: Tester <testeron@mobile.altersys-ua. com> Hessage-Id: <200508160939.j7G9db6M000873@mobile.altersys-ua.com> To: testeronSmobile. altersys-ua.com
440 Глава 15. Работа с почтой (e-mail) Листинг 15.3. Окончание Subject: test telnet 110 X-UIDL: ()\"!I~D!!(GS"!HmW"! test 2 DELE 2 +OK Message 2 has been deleted. QUIT +OK Pop server at mobile.altersys-ua.com signing off. Connection closed by foreign host. За более подробной информацией о протоколе РОРЗ обращайтесь к документе "RFC-1939 (Post Office Protocol — Version 3)". Наиболее распространенным РОРЗ-сервером является qpopper, установка, настройка и работа с которым будет рассмотрена позже в данной главе. Протокол IMAP Рассмотрим также кратко довольно популярный протокол IMAP (Internet Message Access Protocol — протокол доступа к электронной почте), выступающий как серьезна» альтернатива протоколу POP. В данный момент используется четвертая пересмотренна» версия протокола IMAP — IMAP4revI, или просто IMAP4. В отличие от РОРЗ, протокол IMAP4 имеет довольно сложную реализацию, но и намного больше возможностей. Основная отличительная черта протокола IMAP4 заключается в том, что вся работа с почтовым ящиком выполняется непосредственно на сервере, но выглядит это так, ка» будто вся обработка почты происходит на локальном компьютере, в протоколе же РОРЗ все сообщения загружаются в клиентское приложение и манипуляции происходят непосредственно на стороне клиента. В протоколе IMAP предусмотрено, что все сообщения сохраняются в папках до явного их удаления, но при этом помечаются различными флагами: новое, прочитанное, помеченное для удаления и т.п. Данные флаги позволяют задавать различные критерии для поиска. Из последних упомянутых возможностей протокола IMAP4 вытекает возможность для пользователя получать доступ к своему почтовому ящику с различных компьютеров, как и одновременный доступ к нескольким ящикам. Более подробную информацию о протоколе IMAP4 можно найти в документе RFC- 2060 (описание текущего стандарта IMAP4revl), или обновленном, расширенном и предложенном к стандартизации документе RFC-3501. Большинство самых популярных 1МАР4-серверов можно найти в дереве портов. Наиболее часто используются три из них: cyrus-imapd2, courier-imap и imap-uw. Как правило, они запускаются с использованием суперсервера inetd и поддерживают протокол РОРЗ (устанавливается отдельный исполняемый файл, выполняющий роль РОРЗ- сервера). НАСТРОЙКА SENDMAIL После установки системы в директории /etc/ окажется поддиректория mail/. Это обусловлено тем, что в систему по умолчанию включена программа sendmail, устанавливаемая вместе с самой системой. К тому же, она уже пригодна для использования без внесения изменений, но с ограниченными функциональными возможностями. С широким распространением других МТА (например, Postfix или Exim), политика системы несколько изменилась, и теперь в версиях FreeBSD 5.X на этапе установки системы (в режиме постнастройки) предлагается выбрать желаемый МТА из предоставлен-
Настройка Sendmail 441 «ого списка. Однако, на взгляд автора, программный продукт Sendmail еще будет долго оставаться лидером среди почтовых серверов для системы FreeBSD, расширяя с каждой новой версией свои функциональные возможности. Управление работой sendmail Управление работой системы sendmail, как правило, сводится к изменению стартового сценария /etc/rc.conf и перезапуска системы. Перезапуск системы не обязателен и не желателен. Для запуска, остановки или перезапуска почтового даемона в системе FreeBSD присутствует специальный многофункциональный сценарий. Однако, прежде всего, необходимо разобраться со стартовым сценарием — в нем можно полностью отключить sendmail, запустить его для обработки только локальной почты или же активизировать как полнофункциональный сервер входящей почты (прослушивающий запросы на соединение по порту 25). Итак, для полного отключения sendmail добавьте или измените следующий параметр в файле/etc/rc.conf: sendmail_enable="NONE" В результате после перезапуска системы хост не будет поддерживать обработку почты, при этом следует обратить особое внимание на тот факт, что некоторые программы не смогут нормально функционировать. Полное отключение sendmail необходимо применять только в случае его замены другим МТА. Для нормального функционирования всех системных программ необходимо разрешить sendmail обрабатывать локальную почту. Для этого используется следующая строка в главном стартовом сценарии системы: sendmail_enable="NO" Заметьте, что данная строка не отключает полностью работу системы, как можно было бы подумать. К слову, такая настройка установлена по умолчанию (в файле /etc/defaults/rc.conf). Для возможности запуска полнофункционального почтового сервера, позволяющего принимать и отправлять сообщения от любого адресата нелокального хоста, добавьте в файл /etc/rc. conf строку: sendmail_enable="YES" В действительности, простого изменения сценария /etc/rc.conf еще не достаточно для утверждения, что почтовый сервер работает и работает как необходимо. Sendmail — это большой программный комплекс с довольно большим количеством конфигурационных файлов, которые, так или иначе, оказывают влияние на функциональные возможности. Ранее упоминалось о многофункциональном сценарии, позволяющем запускать, останавливать или перезапускать службу sendmail. Этот сценарий имеет еще много других целей и возможностей, о чем будет сказано чуть позже. Итак, в директории /etc/mail присутствует файл Makefile, предназначенный для упрощения управления sendmail. В начале этого файла находятся комментарии, описывающие его возможности и способы применения. Для остановки работы почтового сервера sendmail необходимо выполнить следующую команду в директории /etc/mail: # make stop Stopping: sendmail sendmail-clientmqueue. Как видно из примера, сценарий сообщает об успешной остановке процессов. Обращайте внимание на результаты выполнения этой команды, поскольку иногда, при не-
442 Глава 15. Работа с почтой (e-mail) правильной настройке sendmail попытка остановки почтовых процессов может дать следующий результат: # make stop Stopping:/etc/rc.sendmail: stop-rata: /var/run/sendmail.pid not found /etc/rc.sendmail: stop-mspq: /var/spool/clientmqueue/sm-client.pid not found Такое поведение при остановке сразу же после изменения конфигурации sendmail и перезапуска должно насторожить. Как правило, проблема заключаете» в неправильной настройке файла sendmail.cf (о данном файле и настройке sendmail будет рассказано далее). Запуск и перезапуск sendmail выполняете» с помощью следующих команд: # make start Starting: sendmail sendmail-clientmqueue. # make restart Restarting: sendmail sendmail-clientmqueue. Обратите внимание, что запуск процессов зависит от значения параметра sendmail_enable в стартовом сценарии /etc/rc.conf. Замена sendmail на другой агент пересылки почты Иногда, в силу различных причин, необходимо изменить МТА, используемый по умолчанию. Причины бывают разные: от простого интереса "попробовать что-нибудь другое" до необходимости получить какие-нибудь особые возможности, которые отсутствуют в стационарном sendmail. Какие бы ни были причины, выполнить замену довольно просто. В первую очередь необходимо установить желаемый "почтовик" из набора портов или пакетов, или же другого источника. Обратите внимание на то, что некоторые из них устанавливаются поверх sendmail, заменяя его системные файлы. Если это так, то дм возврата к стационарному sendmail его придется устанавливать по-новому. Рекомендуем указать при установке нового МТА путь, отличный от стандартного. После установки нового МТА, до его запуска необходимо позаботиться о полной остановке sendmail. Для этого укажите в файле /etc/rc.conf для параметра sendmailenable значение "NONE", после чего остановите необходимые процессы командой make stop в директории /etc/mail/. После настройки нового МТА можно организовать его автоматический запуск во время старта системы. Для этого применяется несколько способов, наиболее распространенный из которых— создание выполняемого сценария с расширением .sh, воспринимающий как минимум команды start и stop в директории /usr/local/etc/rc.d/. Второй способ— изменить сценарий запуска почтового сервера, используемый по умолчанию. Для этого добавьте в файл /etc/rc. conf строку вида: mta_start_script="path_to_script" где path_to_script — путь к сценарию запуска нового агента пересылки почты. Однако иногда бывает необходимо заменить sendmail "незаметно" для системных утилит и других программ, которые могут работать только со стандартным набором, поэтому многие альтернативные МТА (как, например, Postfix) устанавливаются с полностью sendmail-совместимой реализацией интерфейса, а система mailwrapper позволяет сделать замену "прозрачной". Как это происходит? Довольно просто. В действительности, в системе FreeBSD файлы, входящие в набор sendmail, - это символические ссылки на исполняемый файл /usr/sbin/mailwrapper. При вы-
Настройка Sendmail 443 Dee sendmail (или, например, newaliases) в действительности выполняется утилита eilwrapper, которая запускает необходимую утилиту в зависимости от содержимого юнфигурационного файла /etc/mail/mailer, conf. Содержимое данного файла по [молчанию представлено в листинге 15.4. ИстйнгА5Л Содержимое файла /■ WnaiA/mail4r, conf по умолчанию ~~ t ( комментарии удалены \ jendmail /us r /libexec/ sendmail /sendmail send-mail /usr/libexec/sendmail/sendmail Hilq /usr/libexec/sendmail/sendmail tewaliases /usr/libexec/sendmail/sendmail hosts tat /usr/libexec/sendmail/sendmail purgestat /usr/libexec/sendmail/sendmail Теперь, установив новый агент пересылки почты с sendmail-совместимой реализацией командного интерфейса, все, что потребуется, — это изменить содержимое файла /etc/mail/mailer.conf, например, так, как показано в листинге 15.5 (для популяр- юго почтового сервера Postfix). Й№тинг 15.5. Пример файла /•tc/nmil/mailer.aonf при "прозрачной" замене ^ Sendmail на Postfix " ' sendmail /usr/local/postf ix/sbin/sendmail jend-mail /usr/local/postf ix/sbin/sendmail tailq /usr/local/postf ix/sbin/sendmail iewaliases /usr/local/postf ix/sbin/sendmail После внесения соответствующих изменений потребуется только перезапустить истему или остановить текущие процессы sendmail. Как видим, замена стандартного ИТА не представляет особых трудностей и не вызывает проблем. К тому же, в данном иучае автоматический запуск нового МТА во время запуска системы управляется тем К параметром sendmail_enable в файле/etc/rc. conf. Конфигурационные файлы Начиная с версии Sendmail 8.9, изменилось размещение практически всех файлов юстройки. Если ранее они были разбросаны по различным системным директориям »эависимости от операционной системы, то теперь они все и всегда по умолчанию на- годятся в директории /etc/mail/. Напоминаем также, что помимо этой директории «пользуется также директория /var/mail, в которую помещается вся входящая почта цля пользователей. Почтовый ящик пользователя — это простой текстовый файл с именем, совпадающими с именем пользователя, которому принадлежит корреспонденция. Кроме того, в системе присутствует директория /var/spool /mqueue, где временно «ранятся файлы очереди сообщений. В данной директории, как правило, нельзя увидеть (ийлы— они существуют только на момент получения корреспонденции и сразу же Избавляются к файлу почтового ящика получателя: Н pwd /var/spool/mqueue It 11 total 0 # 11 total 384 -rw 1 root » 11 total 27842 -rw 1 root -rw 1 root daemon daemon daemon 376832 Aug 18 14:42 dfj7IBgdUP001973 28486908 Aug 18 14:43 dfj7IBgdUP001973 1032 Aug 18 14:43 qfj7IBgdUP001973
444 Глава 15, Работа с почтой (e-mail) ft 11 total 0 You have new mail. ПРИМЕЧАНИЕ Для просмотра списка сообщений;; стоящих в очереди, более удобно использован утилиту maiiq, входящую в состав Sendmail. Даная утилита предназначена для выполнения диагностики в случае возникновения каких-либо проблемi при доставке.__ Также в системе присутствует директория для очереди исходящих сообщений, которая находится в директории /var/spool/clientmqueue/. В очередь исходящий сообщений, как правило, попадают сообщения, которые не были отправлены с первой попытки. Кроме того, вся информация о работе sendmail (постановка в очередь, отправка, получение и т.п.) хранится в журнальном файле /var/log/maillog, который создается заново каждый день а 00:00 (при этом старый файл архивируется и хранит несколько дней). Рассмотрим более подробно файлы, хранящиеся в директории /etc/mail/, поскольку именно от их содержимого напрямую зависит функциональность sendmail После установки операционной системы до начала настройки системы Sendmail содержимое директории /etc/mail/ будет иметь следующий вид: tt Is /etc/mail Makefile README access.sample aliases aliases.db freebsd.cf freebsd.mc freebsd.submit.cf freebsd.submit.mc helpfile mailer.conf mailertable.sample sendmail.cf submit.cf virtusertable.sample Некоторые из этих файлов, скорее всего, корректировать никогда не придется (например, *.cf), другие же имеют чисто информативное значение (файл readme) ш выступают в роли примеров (* . sample). Часть необходимых файлов в данный момект еще отсутствуют и будут созданы в процессе настройки. Основные конфигурационные файлы Sendmail с кратким описанием их назначения перечислены в табл. 15.1. Таблица 15.1. Перечень конфигурационных файлов системы Sendmail Файл /etc/mail/aliases /etc/mail/access /etc/mail/local-host-names /etc/mail/virtusertable /etc/mail/sendmaii ..cf Краткое описание Файл со списком псевдонимов почтовых ящиков Файл базы данных доступа sendmai l Список-имен хостов (доменов), принадлежащих данному серверу (для которых sendmail принимает' почту) Таблица сопоставления адресов, пользователей и доменов при виртуальном хостинге Основной файл настройки sendmail (не предназначен для редактирования) Основной конфигурационный файл sendmail /etc/mail/freebsd.mc Рассмотрим эти файлы подробнее. Файл псевдонимов /etc/mail/aliases Как упоминалось ранее, для каждого реального (не псевдо-) пользователя системы существует почтовый ящик в директории /var/mail/. Помимо этого, может потребоваться создать несколько псевдонимов, которые будут перенаправлять всю почту реальным пользователям системы на другие почтовые ящики где бы то ни было в Internet, в файлы (с использованием перенаправления) или на вход программ с использованием
Настройка Sendmail 445 йнвейеров. Также можно указывать другие псевдонимы. Для реализации такой возможности используется специальный файл псевдонимов /etc/mail/aliases. Пример пкого файла представлен в листинге 15.6. Как видно из примера, формат файла довольно прост: каждая строка задает отдель- Ьый псевдоним. Первым идет сам псевдоним, затем — двоеточие и символ пробела или Цбуляции, после чего указывается или другой псевдоним (можно задавать список псев- цонимов разделенных запятой), или почтовый ящик (задание списка адресов разделении запятой не будет корректно работать), или перенаправление в файл, или же конвей- q>. нг 15.6. Простой пример файла псевдонимов /etc/mail/aliasaa admin: alex.didok@main.com.ua root: admin, informex BAILER-DAEMON: postmaster postmaster: root ididok: admin yjgutof f: yuriy. jgutof f @altersys-ua. com nospam: /dev/null info: nospam janes: 'nospam bin: nospam Первая строка в файле, показанном в листинге 15.6, создает псевдоним admin, который указывает на удаленный адрес alex.didok@main.com.ua. Вторая строка соз- дает псевдоним root, который пересылает почту пользователям admin и informex. Если данные пользователи найдены в базе данных псевдонимов, то будет использоваться адрес, на который ссылается соответствующий псевдоним, в противном случае, будет выполнен поиск пользователя системы с указанным именем. Таким образом, письмо для root будет отправлено на удаленный адрес alex. didok@main. com. ua и локальному пользователю informex (поскольку записи для данного пользователя нет в базе псев- донимов). В седьмой строке показан пример перенаправления всей почты в файл. В данном иучае вся почта, пришедшая на nospam, info, games и bin будет просто удалена. Для указания псевдонима, перенаправляющего почту внешней программе через конвейер, используйте запись следующего вида: procmail: "| /usr/local/bin/procmail" Каждый раз после изменения файла псевдонимов необходимо пересобирать файл aliases. db. Данный файл используется системой Sendmail для поиска псевдонимов. Собрать новую версию файла можно как минимум тремя способами: • Использовать следующую команду из набора Sendmail: I newaliases /etc/mail/aliases: 10 aliases, longest 29 bytes, 180 bytes total ■ Использовать классическую команду: ft sendmail -bi /etc/mail/aliases: 10 aliases, longest 29 bytes, 180 bytes total • Находясь в директории /etc/mail/, выполнить специфическую для системы FreeBSD "умную" команду make aliases, которая перестраивает файл базы данных псевдонимов /etc/mail/aliases .db только в том случае, если изменилось содержимое файла /etc/mail/aliases: Ьнсти
446 Глава 15. Работа с почтой (e-mail) # make aliases /usr/sbin/sendmail -bi -OAliasFile=/etc/mail/aliases /etc/mail/aliases: 10 aliases, longest 29 bytes, 180 bytes total chmod 0640 /etc/mail/aliases.db Файл /etc/mail/access По умолчанию, любое перенаправление почты (relay) запрещено, начина с Sendmail 8.9. Благодаря этому, достигается защита от спамеров, которые с каждым годом находят все больше путей для забивания почтовых ящиков нежелательной рекламой. Для гибкого управления правилами доступа, которые определяют список имен ил» IP-адресов хостов, имеющих доступ к почтовому серверу, и тип предоставляемого доступа, можно создать файл /etc/mail/access. Данный файл отсутствует в системен) умолчанию, и вместо него можно воспользоваться файлом примера access.sample. Переименуйте и измените данный файл в зависимости от ваших потребностей. Рассмотрим формат файла доступа и распространенные типы доступа на примере файла, представленного в листинге 15.7. Листинг 15.7. Простой пример файла flucTyna/Btc/mail/aocesa системы Sendmail cyberspammer.com ERROR:550 We don't accept spam From:FREE.STEALTH.MAILER@ ERROR:550 Spam not accepted microsoft.com REJECT cleverspamers.com DISCARD From:badboy@main.com.ua REJECT To:everyone@altersys-ua.com DISCARD Connect:localhost RELAY Connect: 192 .168 OK . Из примера видно, что формат файла, в принципе, не сложен, хотя, на самом деде, даже в относительно небольшом файле доступа может "потеряться" и опытный администратор. В примере показаны не все допустимые правила доступа, а только используемые наиболее часто. Рассмотрим их. Правило ОК позволяет принимать все сообщения от указанного хоста даже в тех случаях, когда оно противоречит и не удовлетворяет другим правилам. Таким образом, последняя строка в файле примера позволяет в любом случае принимал сообщения от хостов в сети 192.168.0.0/16. Правило REJECT приводит к отбрасыванию всей входящей почты от указанного хоста. При этом отправитель получает соответствующее сообщение о невозможности отправки или перенаправления письма. Из этого можно сделать вывод, что вся почта от microsoft.com и отдельного отправителя badboy@main.com.ua будет отвергнута еще в момент соединения. Правило discard позволяет фильтровать поступающие сообщения несколько иначе. Например, сообщения, поступившие от cleverspammers.com или да everyone@altersys-ua. com в нашем примере будут приняты, после чего сразу же удалены, так и не поступив в ящик получателя. Данное правило имеет свои "плюсы" и "минусы". Во-первых, отправитель будет думать, что сообщение было доставлено получателю, но с другой стороны сообщение полностью принимает тем самым, израсходуется часть трафика. Правило RELAY разрешает пересылку всей корреспонденции для указанного хоста, и подобно правилу ОК, отменяет другие проверки. Таким образом, для нашего примера локальный хост может пересылать любую почту.
Настройка Sendmail 447 ПРИМЕЧАНИЕ Возможно, читателю покажется странным присутствие записи разрешения пересылки для локального хоста, но ее присутствие желательно— особенно в том случае, юли используется DNS Blacklist^ifpaMMiaT^MOTCT^noMKe). • Правило ERROR: ### error_message позволяет указать свое сообщение ошибки, отображаемое отправителю при попытке соединения. Если отправитель использовал промежуточный relay-сервер, то он получит соответствующее письмо с сообщением об ошибке. ПРИМЕЧАНИЕ Отметим, что ранее можно было указывать просто номер ошибки и поясняющее: сообщение, без слова "ERROR" и т.п., но в данный момент такое решение использовать не рекомендуется. Иногда (хотя и довольно редко) применяются также правила SKIP и DISCARD:message. Их мы рассматривать не будем (за дополнительной информацией обращайтесь к документации системы Sendmail). После того как был создан новый файл доступа и каждый раз при его изменении необходимо генерировать новый файл базы /etc/mail/access . db. Для этого можно использовать стандартную команду I malcemap hash /etc/mail/access.db < /etc/mail/access или же воспользоваться удобной командой # make maps /usr/sbin/makemap hash access.db < access chmod 0640 access.db которую необходимо выполнять, находясь в директории /etc/mail/. Последняя команда отслеживает, .изменилось ли содержимое файла, и только в таком случае перестраивает базу доступа. В отличие от файла псевдонимов, для использования новой версии файла /etc/mail/access .db программой sendraail, последнюю необходимо обязательно перезапустить, воспользовавшись командой make restart. Файл /etc/mail/local-host-names Во многих случаях один хост может обслуживать несколько доменов (виртуальный хостинг). Для того чтобы sendmail мог принимать и правильно обрабатывать входящую почту для каждого из них, необходимо создать файл /etc/mail/local-host- names и указать в нем все имена хостов и доменов, которые принадлежат данному хосту. Обратите внимание на то, что простое добавление некоего домена в данный файл не означает, что соответствующий хост станет принимать почту, предназначенную добавленному домену. Для этого необходима настройка системы имен DNS. Данный файл просто позволяет указать программе sendmail список доменов и имен хостов, которые (Она будет воспринимать как локальные, если будет получено письмо какому-либо поль- ювателю в указанных доменах. Файл /etc/mail/local-host-names представляет собой простой текстовый файл, в каждой строке которого указано полное DNS-имя хоста или домена (листинг 15.8). После его создания или изменения нет необходимости перестраивать файл ',db, как это было для файлов псевдонимов и доступа. Потребуется только перезапустить sendmail командой make restart.
448 Глава 15. Работа с почтой (e-mail) Листинг 15.8. Пример файла/ate/mai-l/loaal-hoBt-nainas *. altersys-ua.com mobile.altersys-ua . com ns.altersys-ua.com mail.altersys-ua.com main.com.ua mail.main.com.ua relay2.main.com.ua altersys.main.com.ua findme.kiev.ua oneuser.com К чему же может привести отсутствие файла /etc/mail/local-host-names в случае, когда он необходим? К примеру, некоторым отправителям будет возвращен ответ подобного содержания: Transcript of session follows 554 5.0.0 MX list for altersys-ua.com. points back to mobile.altersys-ua. com 554 5.3.5 Local configuration error Файл /etc/mail/virtusertable В дополнение к рассмотренному выше файлу, при виртуальном хостинге может понадобиться создать файл /etc/mail/virtusertable, который по умолчанию отсутствует (зато присутствует файл virtusertable. sample). Данный файл позволяя сопоставить виртуальные почтовые домены и адреса с локальными пользователями, псевдонимами из файла aliases, удаленными адресами, файлами или сообщениями об ошибке, что предоставляет возможность гибкой настройки почтовой системы при виртуальном хостинге. Предположим, наш хост обслуживает список доменов из примера, представленного в листинге 15.8. Создадим файл /etc/mail/virtusertable (листинг 15.9) и рассмотрим поведение программы sendmail. Листинг 15.9. Пример файла/eto/mall/viirtusertable _^ webmaster@main.com.ua root @main.com.ua %l@informex.com.ua yjgutoff@altersys.main.com.ua yjgutoff@informex.com.ua webmaster@altersys-ua.com svit2@ua.fm @findme.kiev.ua findme@freemail.kiev.ua admin@oneuser.com oneusercom @oneuser. com error:nouser This user is unknown Итак, первое правило позволяет все письма, пришедшие на адрес webmaster@main.com.ua, доставлять локальному пользователю системы root, или же, если в файле псевдонимов присутствует запись переопределения, — в соответствии с этой записью. Например, в случае использовании файла псевдонимов, представленного в листинге 15.6, письма будут доставляться двум пользователям. Второе правило позволяет сопоставить всем пользователям домена main.com.ua пользователей домена informex.com.ua. Это означает, что письмо, пришедшеем адрес tester@main.com.ua, будет перенаправлено пользователю tester? informex.com.ua и т.д. Заметим, что перебор правил выполняется до первого совпадения, поэтому письмо на адрес webmaster@main.com.ua (первое правило) не будет отправлено также и на адрес webmaster@informex. com.ua. Третье и четвертое правила — это примеры простой пересылки всей корреспонденции на другие адреса. Пятое правило используется довольно часто. Это так называемый "mail collect" ("сборка почты"), когда вся корреспонденция на любой адрес в доменепе-
Настройка Sendmail 449 цсылается на один внешний почтовый ящик. Данное решение применяется многими щипаниями, не желающими самостоятельно поддерживать почтовый сервер. Вместо иого им удобнее в определенные периоды времени извлекать всю почту из одного вешнего ящика и раздавать по различным правилам локальным пользователям сети. Два последних правила из листинга 15.9 могут, на первый взгляд, показаться стран- шми. Спрашивается: зачем выдавать ошибку при попытке отправить сообщение в до- кн oneuser. com для любого получателя, кроме adminGoneuser. com?! Ответ очень фост: это еще одна возможность защитить себя от нежелательной рекламы. Пример ппнбки, отображенной почтовым агентом (Microsoft Outlook Express) при попытке отбавки на любой другой адрес (кроме admin@oneuser.com) в домене oneuser.com вказан на рис. 15.2. {& Outlook Express JSJ При выполнении задач произошли ошибки. Подробнее смотрите список ошибок внизу. i ..ffpbTb i| Птанэрип «Подробно I Задачи Ошибки Ф Не удается отправить сообщение, поскольку сервер отказался принять адрес одного из получателей. В письме был указан адрес: 'admin2@oneuse(.com'. Тема 'adiTiiri2@oneuset.corn'. Учетная запись: 'mobile'. Сервер: '192.168.0.200", Протокол: SMTP, Ответ сервера: '553 5.3.0 <admin2@oneuse(.com>... This usei is unknown'. Порт: 25. Защита (SSL) Нет. Ошибка сервера: 553. Код ошибки: 0х800ССС7Э Успешно выполнено: 0 задач из 1 -Й Рис. 15.2. Сообщение об ошибке, отображаемое почтовым агентом Microsoft Outlook Express Простого создания или изменения файла virtusertable недостаточно. Необхо- щмо позаботиться об обновлении файла virtusertable.db, после чего перезапус- лпъ почтовый сервер. Обновление или создание данного файла осуществляется той же вмандой, что и для access. db в директории /etc/mail/: # make maps /usr/sbin/makemap hash virtusertable.db < virtusertable chmod 0640 virtusertable.db Обратите внимание на то, что для корректной работы виртуального почтового хос- анга необходима правильная настройка DNS. Файл /etc/mail/sendmail.cf Файл /etc/mail/sendmail.cf — это основной конфигурационный файл систе- 1Ы Sendmail. Именно его содержимое определяет общее поведение почтового сервера, пиная от размещения базовых файлов и заканчивая сложными правилами фильтра- ИИ. Когда-то давным-давно каждый администратор сервера должен был знать этот йл практически наизусть и уметь его корректировать, несмотря на всю сложность его ормата. На сегодняшний день необходимость в этом практически отпала. Более того,
450 Глава 15. Работа с почтой (e-mail) редактировать файл /etc/mail/sendmail.cf вручную необходимо только в самых крайних случаях. Данный файл можно скомпилировать из другого конфигурационного файла, благо даря существованию макроязыка т4. При каждом изменении (компиляции) файл /etc/mail/sendmail.cf потребуется полный перезапуск sendmail. При этом, во избежание некоторых проблем, желательно использовать не команду make restart,! следующую последовательность команд: # cd /etc/mail # make stop Stopping: sendmail sendmail-clientmqueue. # make start Starting: sendmail sendmail-clientmqueue. Главный конфигурационный файл /etc/mail/freebsd.mc С того момента, когда для компиляции главного конфигурационного cf-файла начал применяться макроязык т4, настройка sendmail сильно упростилась. Теперь нет необходимости вручную править cf-файл или наиболее подходящий mc-файл из директории исходных кодов Sendmail, вручную компилировать файл sendmail.cf с помощью утилиты т4, а затем устанавливать его поверх старого файла. Для этого достаточно изменить файл f reebsd.mc в директории /etc/mail/ и выполнить несколько дополнительных команд, которые сами сделают все, что нужно. Что из себя представляет файл freebsd.mc? Это— набор команд, переопределяющих стандартные настройки. Все команды задаются в формате языка т4. Последовательность записи команд имеет крайне важное значение. Все команды должны иметь подстроку dnl (delete through newline), которая определяет конец строки, удаляя все символы вплоть до символа новой строки. Таким образом, подстрока dnl в начале строки обозначает начало комментария. Файл freebsd.mc, как правило, начинаете! со строки divert (-1), которая позволяет удалить весь "мусор" в выходном файле. Указание divert (0) позволяет вернуть обычный вывод. Такой прием используется, когда необходимо закомментировать несколько строк текста. Если необходимо закомментировать одну строку, используется dnl. Любой mc-файл должен содержать как минимум два элемента: OSTYPE н MAI LER, — при этом последний должен находиться в mc-файле после первого. Кроме того, в минимальной конфигурации рекомендуется использовать макрокоманду DOMAIN (сразу же после OSTYPE) и список макрокоманд FEATURE (после DOMAIN). Макрокоманда OSTYPE позволяет указать версию используемой операционной системы. С ее помощью определяют пути к другим системным и конфигурационным файлам, а также параметры, строго зависящие от операционной системы (например, журнальная директория или путь к очереди сообщений). Для FreeBSD (в зависимости от версии) используйте одну из следующих макрокоманд: OSTYPE Г freebsd-T) OSTYPEСfreebsd5') Обратите внимание на использование открывающей кавычки "'" в начале и закрывающей кавычки ""' в конце. Отсутствие макрокоманды OSTYPE приводит к следующей ошибке на этапе компиляции cf-файла: *** ERROR: No system type defined (use OSTYPE macro) Макрокоманда DOMAIN позволяет конфигурировать несколько машин в домене одним способом. Макрокоманда DOMAIN (maincom) позволяет подключить файл maincom.m4 из директории /usr/share/sendmail/cf /domain/, созданный преаде описания и содержащий общие стандартные определения для соответствующего доме-
Настройка Sendmail 451 на. В той же директории можно найти ряд примеров описания подобных файлов. Для большинства хостов подойдет следующая макрокоманда: DOMAIN(generic) Система Sendmail предоставляет огромное количество возможностей, но для их реализации необходимо явно внести соответствующие записи в конфигурационный файл. Для этого используется макрокоманда FEATURE. Как правило, достаточно просто объявить использование некоторой возможности с помощью ключевого слова. Иногда также потребуется подстановка аргументов. Список ключевых слов можно просмотреть по именам файлов (убрав расширение т4) в директории /usr/share/sendmail/cf / feature/. Макрокоманда FEATURE в mc-файле имеет следующий формат: FEATURE(keyword) FEATURE(keyword, argument) FEATURE(keyword, argument, argument, ...) Помимо включения возможностей, можно также изменять стандартные опции (например, пути к файлам, параметры соединения, права, ограничения на использование системных ресурсов). Это достигается с помощью локальных макроопределений define: define(macro, value) Рассмотрим использование ранее упомянутой обязательной макрокоманды MAILER. Данная макрокоманда должна быть указана обязательно, поскольку без нее не может быть автоматически включено использование какого-либо транспортного протокола. По умолчанию, определено лишь использование локального метода доставки MAILER (local), но явное определение не помешает. Метод local позволяет включить два агента доставки: local и prog. Первый доставляет почту в почтовый ящик, второй позволяет посылать почту локальным программам. Явного определения требует транспортный протокол SMTP. Для включения его поддержки укажите следующую макрокоманду в файле f reebsd.mc: MAILER(smtp) Заметим, что данной командой включается сразу же четыре агента: smtp — простой SMTP; • esmtp — поддержка расширенного протокола SMTP; smtp 8 — поддержка 8-битного двоичного SMTP-протокола; relay — включение агента пересылки. Нередко используются и другие транспортные агенты, такие как procmail, uucp, maildrop. Если их необходимо включить, то учитывайте следующее: макрокоманда MAILER для них должна следовать после MAILER (smtp). Как правило, общий формат mc-файла имеет следующий вид: divert(-1) # комментарии divert(0) VERSIONID OSTYPE DOMAIN FEATURE local macro definitions MAILER LOCAL_CONFIG LOCAL_RULE_* LOCAL RULESETS
452 Глава 15. Работа с почтой (e-mail) Но есть и исключения: в некоторых случаях до определения возможности FEATURE () должны быть размещены локальные макроопределения define (). Так» исключение используется тогда, когда включаемое расширение зависит от некоторш локальных макроопределений. Например, макроопределение define (PROCMAIL_MAILER_PATH, ...) должно быть описано до объявления FEATURE (local_procmail). Рассмотрим простой пример конфигурационного файла /etc/mail/freebsd.roc (листинг 15.10). Листинг 15.10. Пример конфигурационного фа^а ^»te^teada/gya*bad.mo j divert(-1) # Master Config. INformEx. 2005 # Помощь - /usr/share/sendmail/cf/README divert(0) VERSIONID("$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.29 2003/12/24 <b21:15:09 gshapiro Exp $') OSTYPE(freebsd5)dnl DOMAIN(generic)dnl dnl FEATURE part FEATURE(access_db, "hash -o -T<TMPF> /etc/mail/access')dnl FEATURE(blacklist_recipients)dnl FEATURE(mailertable, "hash -o /etc/mail/mailertable')dnl FEATURE(virtusertable, "hash -o /etc/mail/virtusertable')dnl define(PROCMAIL_MAILER_PATH,/usr/local/bin/procmail)dnl FEATURE(local_procmail)dnl dnl FEATURE(local_lmtp) FEATURE(always_add_domain)dnl FEATURE(relay_based_on_MX)dnl dnl Для использования DNSBL необходимо подписаться, http://mail-abuse.orq/ FEATURE(dnsbl, 'blackholes.mail-abuse.org', '"550 Mail from " 4>$&{client_addr) " rejected, see http://mail-abuse.org/cgi-bin/lookup?" 4>$ & (client_addr}') dnl dnl define part define(PROCMAIL_MAILER_FLAGS,ShPfn)dnl define(PROCMAIL_MAILER_ARGS,procmail -a $h -d $u)dnl define("confCW_FILE', "-o /etc/mail/local-host-names')dnl define('confBIND_OPTS', 'WorkAroundBrokenAAAA*)dnl define!4confNO_RCPT_ACTION', 'add-to-undisclosed')dnl define('confPRIVACY_FLAGS', *authwarnings,noexpn,novrfу')dnl define('confSMTP_MAILER', 'esmtp *)dnl define СconfSMTP_LOGIN_MSG', '$j mailer; $b')dnl DAEMONJDPTIONS('Name=IPv4, Family=inet')dnl dnl MAILER part MAILER(local)dnl MAILER(smtp)dnl MAILER(procmail)dnl После того как был создан особый mc-файл, необходимо скомпилировать cf-файл. Операционная система FreeBSD использует особый упрощенный вариант генерации главного конфигурационного файла для sendmail — с применением все той же знакомой нам утилиты make. Ранее данная команда позволяла создать файл freebsd.cf и затем установить его поверх существующего sendmail. cf. В данный момент процесс
Настройка Sendmail 453 стал более гибким, но и более запутанным, хотя команды не изменились. Итак, в любом случае, первой должна использоваться команда make cf: # make cf cp freebsd.mc mobile.altersys-ua.com.mc /usr/bin/m4 -D_CF_DIR_=/usr/share/sendniail/cf/ /usr/share/sendmail/cf/m4/cf.m4 mobile.altersys-ua.com.mc > 4>mobile.altersys-ua.com.cf cp freebsd.submit.mc mobile.altersys-ua.com.submit.mc /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 mobile.altersys-ua.com.submit.mc > 4>mobile.altersys-ua.com.submit.cf Обратите внимание на полученный результат: создаются новые (скопированные) файлы * .тс и уже из них собираются cf-файлы (все эти файлы содержат в названии полное доменное имя хоста). Если это так, то, скорее всего, данная команда используется впервые. После первого использования команды make c,f редактирование файла /etc/maii/freebsd.mc как правилу, больше не потребуется. При наличии в директории /etc/maii/ тс-файлрв, содержащих полное DNS-имя хоста, утилита лаке проверяет изменения только в них. В дальнейшем работать придется именно с этими файлами, поскольку утилита make будет просто игнорировать изменения в файле freebsd.mc. Второй вариант: после установки нового конфигурационного файла для системы Sendmail удалить все файлы, содержащие полное доменное имя хоста (данный вариант использовать не рекомендуется). Для установки новой конфигурации поверх старой используйте следующую простую команду: # make install install -m 444 mobile.altersys-ua.com.cf /etc/mail/sendmail.cf install -m 444 mobile.altersys-ua.com.submit.cf /etc/mail/submit.cf В стандартной конфигурации Sendlnail поддерживает.работу с протоколом IPv6. Если хост не имеет поддержки,.IPv6, то'желательно исключить или закомментировать СфОКу DAEMGN_0BTI0NS(4Name«$'Py6f- Family«inet6, Mb'd±fiers=Or), распо-. декенную в стандартном орайле freebsd .-mc. Впрогивном случае; на этапе загруз- п операционной системы может возникнуть длительная пауза во время запуска сетевых служб. Особенности настройки DNS Материал этого раздела неразрывно связан с главой 20, "Сервер имен DNS". Для полного понимания данного раздела изучите основные принципы функционирования системы доменных имен. Правильная настройка DNS требуется еще до запуска почтового сервера. Существует множество вариантов конфигурирования DNS для правильной настройки почтового домена. Кто поддерживает домен: ваш хост или хост провайдера? Какова последовательность доставки: сперва проверяется доступность вашего хоста или внешнего, за хранение будет отвечать только внешний хост или только ваш? Все эти и другие вопросы возникают на этапе установки почтового сервера, и от ответа на них в значительной
454 Глава 15. Работа с почтой (e-mail) мере зависит порядок настройки. Иногда, даже после тщательного планирования и пс- следующего внедрения системы в жизнь, могут проявиться незначительные недоработки, которые в лучшем случае выливаются в небольшие неудобства, а в худшем - в серьезные проблемы для компании. Итак, почтовый хост должен быть точно и правильно описан в глобальной систеж DNS. Это позволит без проблем отсылать всю почту на другие хосты. Если компьютер имеет динамический адрес, то никто не гарантирует, что письмо будет доставлено адресату, а вы не получите странный ответ о невозможности определить имя вашей машиюг по IP-адресу. В наш век борьбы со спамом мало кто позволяет принимать рассылку от серверов, не записанных в глобальной системе DMS. Даже имея статический адрес и правильную запись в системе DNS, может оказаться, что некоторые серверы ваш письма отвергнут по другому правилу: попытка отправить письмо от имени пользователя другого домена. Потому, прежде всего, удостоверьтесь в правильной настройке обратного DNS-преобразования имени: (t nslookup main.com.ua redo.com.ua Server: redo.com.ua Address: 217 . 20.163.33#53 Non-authoritative answer: Name: main.com.ua Address: 67.15.24.22 Все было бы прекрасно, если бы почта доставлялась только на основании обратного преобразования. Но не каждый может позволить себе содержать отдельный почтовые сервер для одного домена или выделенную линию, и не у каждого есть стабильный сервер, работающий круглосуточно и бесперебойно. Доставка почты зависит также от наличия и количества МХ-записей (Mail eXchanger) для конкретного домена. Запись Ш позволяет определить хост или список хостов, принимающих почту для домена. При отсутствии МХ-записи в домене почта будет доставляться на адрес, указанный в записи А. Для просмотра списка МХ-записей и приоритета каждой из них, используйте следующую команду: # host altersys-ua.com altersys-ua.com has address 80.81.82.1 altersys-ua.com mail is handled by 10 mobile.altersys-ua.com. altersys-ua.com mail is handled by 20 relay.altersys-ua.com. Из примера видно, что каждому серверу из списка соответствует некий номер. Запись для компьютера с наименьшим номером соответствует тому серверу, который будет получать почту в первую очередь, если он доступен. Если в момент попытки доставить ему почту сервер по любым причинам не доступен, то будет предпринята попытка доставить почту на хост с меньшим приоритетом (больше число). Второстепенные MX- серверы, как правило, называются резервными и хранят почту до того момента, пока не станет доступным сервер с более высоким приоритетом. Как только это происходит, вся почта пересылается ему. Как правило, все резервные МХ-серверы для домена разносятся на различные каналы или поддерживаются различными провайдерами для повышения эффективности н отказоустойчивости. Если вы уверены в безотказности своего почтового сервера и желаете принимать почту только на него, удалите МХ-запись для вашего домена или установите ее так, чтобы она указывала только на ваш сервер. Наиболее часто используета конфигурация с резервными серверами, когда наивысший приоритет имеет почтовый сервер. Рассмотрим примеры описания записей в файлах зон для различных случаев настройки системы DNS, связанных с настройкой почтовой службы. Самый простой пример имеет следующий вид:
Настройка Sendmail 455 IN IN IN MX MX A 10 20 relay.altersys mail 80.81.82.1 main.com.ua. IN MX 10 mail mail IN A 80.81.82.1 При этом вся почта для домена main. com. ua будет настроена на доставку некоему хосту mail с адресом 80.81.82.1 в домене, который описывает файл зоны. Приведем более сложный пример: main.com.ua. IN MX 10 relay.altersys-ua.com. mail В данном случае, в первую очередь будет произведена попытка отправки сообщений для домена main, com.ua некоему хосту с именем relay, altersys-ua. com. и только в том случае, если он недоступен, будет доставлена хосту mail, описанному вэтом же файле зоны. Данный вариант настройки зоны не рекомендуется для реального использования, поскольку существует несколько "подводных камней", обсуждение которых оставим в стороне. Однако отметим, что предпочтительней наивысший приоритет давать хостам, которые может контролировать администратор DNS-зоны. Во- вторых, использовать внешние relay-серверы необходимо с осторожностью, особенно если требуется конфиденциальность всей электронной корреспонденции (об использовании PGP умолчим). Рассмотрим несколько неправильных конфигураций. В первую очередь, это указание на несуществующую ресурсную запись типа А (жирным шрифтом выделена неправильная запись): one.main.com.ua. another.main.com.ua. relay IN IN IN IN MX MX MX A 10 20 10 mail relay relay 80.81. 82.1 В данном примере отсутствует необходимая А-запись для хоста ma i 1 с наивысшим приоритетом доставки для домена one .main. com. ua. Вторая распространенная ошибка— это непосредственное указание IP-адреса в МХ-записи, что уже само по себе неправильно: main.com.ua. IN MX 10 80.81.82.1 Не рекомендуется также использовать канонические имена CNAME для указания принимающего хоста. Это вызывает множественные циклы поиска соответствия имени и адреса и, как следствие, — загруженность сервера. Помимо того, проследите за всей цепочкой прохождения сообщения по различным хостам в различных случаях и удостоверьтесь в отсутствии циклов. Простой пример: first IN MX 10 second second relay first second Данная конфигурация будет работать до тех пор, пока не выйдет из строя сервер relay, на котором накапливалась почта и для хоста first, и для second. В случае недоступности сервера relay почта для обоих хостов будет "зациклена". Мы рассмотрели достаточно простые примеры, связанные с настройкой системы DNS для работы с почтой. В действительности, бывают случаи, где все намного сложнее и запутаннее, и там придется разбираться самим. Более подробно настройка системы DNS рассматривается в главе 20, "Сервер имен DNS". IN IN IN IN IN MX MX A A A 10 20 relay first 80.81. 80.81. 80.81. ,82. 82. .82. ,1 .101 ,102
456 Глава 15. Работа с почтой (e-mail) Дополнительная информация Помимо рассмотренных выше вопросов, могут возникать и другие, которые ветре- чаются реже, но не менее интересны. Без их рассмотрения данная глава была бы недостаточно полным руководством по работе с электронной почтой, а порой даже имела бы информационные "дыры". Использование файлов . forward Кроме главного файла псевдонимов (aliases) и таблицы сопоставления для виртуальных доменов (virtusertables), существует альтернативный способ настройки перенаправления всей входящей почты на другой внешний адрес. Такое решение ими ряд преимуществ: в первую очередь то, что пользователь может сам решать, куда пересылать корреспонденцию и изменять соответствующие настройки, не имея при это» прав привилегированного пользователя root. Для этого в системе должна присутствовать учетная запись для пользователя и домашняя директория. Пользователь на свое усмотрение может создать файл в своем домашнем каталоге с именем . forward и внеси туда строку с внешним адресом, например: # pwd /home/hatemail # more .forward none@none.com Помимо перенаправления на внешний почтовый адрес, можно также использован перенаправление на вход программ, установив в начале строки символ конвейера ("|'l или же в локальный почтовый ящик пользователя (перед именем пользователя необходимо указать обратный слеш "\"). Разрешается перенаправление почты одновременна на несколько адресов. Например: # more -informex/.forward tester@altersys-ua.com \informex "I exec /usr/local/bin/procmail -d archive" При использовании файла . forward следите, чтобы не возникло зацикливание почты. Более подробную информацию по этому вопросу можно найти на странице справочного руководства man forward. Использование procmail Утилита procmail уже была упомянута в ранее в примерах, но ее назначение at объяснялось. Попробуем быстро разобраться в данном вопросе. Итак, утилша procmail— это мощный инструмент фильтрации и сортировки входящей почта в руках умелого администратора (да и рядового пользователя тоже). Подобно файл)' . forward, с помощью procmail можно пересылать сообщения на внешние адреса, сохранять их в файлы или вообще удалять, однако procmail — более гибкий инструмент, поскольку перечисленные операции выполняются по определенным, ранее описанным правилам. Но, прежде всего, данное приложение необходимо установить и интегрирован в почтовый сервер. Процесс установки прост и выполняется без проблем с помощь» набора портов в директории /usr/ports/main/procmail/, где следует запустил команду # make install clean По окончанию установки исполняемый файл будет доступен по адресу /usr/local/bin/procmail., Интеграция выполняется несколькими способами. Первый из них включение в конфигурацию Sendmail (см. листинг 15.10):
Настройка Sendmail 457 * указываем путь к исполняемому файлу define(PROCMAIL_MAILER_PATH,/usr/local/bin/procmail)dnl it включаем поддержку procmail и отключение lmtp FEATURE(local_procmail)dnl dnl FEATURE(1ocal_lmtp) * включаем соответствующий метод доставки MAILER(procmail)dnl Второй способ — добавление поддержки в файл псевдонимов aliases администратором системы или в файл . forward в домашней директории пользователя епомощью следующей строки: "I exec /usr/local/bin/procmail || exit 75" После этого можно приступить к настройке фильтрации почты. Система правил иожет быть описана в общем глобальном файле /usr/local/etc/procmailrc, хотя лисой вариант используется редко. Обычно все правила помещаются самим пользователем в свою домашнюю директорию в файл .procmailrc. Рассмотрим кратко несколько примеров правил фильтрации. Для перенаправления всей почты от некоторого пользователя tester@altersys- ua.com на внешний адрес svitl234@ua. fm используется следующее правило: :0 * "From.*tester@altersys-ua.com ! svitl234@ua.fm Здесь ":" — начало описания нового правила, со знака "*" начинается описание условий, причем каждое условие должно быть помещено в отдельной строке, начинающейся данным символом. Знак восклицания "!" в начале строки указывает на начало списка адресов перенаправления. Для возможности перенаправления почты на внешний ящик с сохранением в локальном необходимо использовать флаг копирования: :0 с * AFrom.*tester@altersys-ua.com ! svitl234@ua.fm :0 * AFrom.*tester@altersys-ua.com ! localuser Как уверяют разработчики системы, такой вариант копирования ресурсоемкий, и потому вместо него рекомендуется использовать следующую форму: :0 с * AFrom.*tester@altersys-ua.com ! svitl234@ua.fm :0 А ! localuser Разрешается вложение условий. Так, например, если необходимо чтобы все сообщения от tester@altersys-ua.com с темой nextpart размером меньше 50 Кбайт перенаправлялись на внешний ящик, а с большим размером — сохранялись локально 8ящике пользователя localuser, то можно написать два отдельных правила, но рекомендуется их объединить следующим видом: :0 * "From.*tester@altersys-ua.com * "Subject:.*nextpart I
458 Глава 15. Работа с почтой (e-mail) :0 * < 50000 ! svitl234@ua.fm :0 ! localuser ) Для записи сообщений в некоторый файл необходимо указать его имя без каких либо специальных обозначений в начале строки. Так, например, для записи всех сообщений с темой "SPAM" в файл /dev/null (а фактически — просто удаление писем) мощно создать следующее правило: :0 "Subject:.*SPAM /dev/null Более подробную информацию о формировании правил и о самой утилите procmail можно найти в справочном руководстве man procmail, man procmailrc и man procmailex. Настройка поддержки TLS/SSL и SMTP-аутентификации Рассмотрим, как можно установить поддержку аутентификации для Sendmail, что даст возможность удаленным пользователям отправлять сообщения через сервер, несмотря на содержимое базы доступа access. Кроме того, затронем вопрос защиты соединения, чтобы передача данных осуществлялась в зашифрованном виде. Эти два вопроса практически всегда рассматриваются вместе, поскольку штатный Sendmail по умолчанию не поддерживает аутентификацию. Для реализации такой поддержки необходимо пересобрать Sendmail из исходных кодов, установив прежде пакет cyrus- sasl2, что и дает возможность решать обе задачи одновременно. Итак, прежде всего необходимо установить пакет cyrus-sasl2-saslauth из дерева портов (директория /usr/ports/security/cyrus-sasl2-saslauth). Данный пакет также устанавливает другой, связанный с ним, — cyrus-sasl2. Описывать процесс установки мы не будем, поскольку, как правило, никаких проблем здесь не возникает - отметим только, что желательно обновить дерево портов, поскольку в нем может оказаться устаревшая версия пакета cyrus-sasl, которую лучше не устанавливать. После установки упомянутого пакета в директории /usr/local/etc/rc.d/ окажется файл сценария saslauthd.sh, отвечающий за запуск необходимых служб. Ди этого отредактируйте файл /etc/rc. conf, внеся в него следующие строки: saslauthd_enable="YES" saslauthd_flags="-a sasldb" shlib_dirs="/usr/local/lib /user/local/lib/sasl2" После этого необходимо перезапустить систему или выполнить следующую команду: # /uar/local/etc/rc.d/aaalauthd.ah start Starting saslauthd. Конфигурационный файл пакета cyrus-sasl2 для поддержки приложения Sendmail имеет путь /usr/local/lib/sasl2/Sendmail.conf. По умолчанию, его в системе не существует даже после установки пакета, и потому его необходимо создать и внести следующие строки: pwcheck_method: saslauthd mectV_list: digest-md5 cram-md5 login plain
Настройка Sendmail 459 Это позволит включить метод аутентификации saslauthd, который в определенных случаях (будут рассмотрены позже) даст программе sendmail возможность проводить аутентификацию пользователей по системной базе пользователей (чтобы не заводить отдельную базу данных пользователей), а в некоторых случаях — по внутренней базе sasldb. В принципе, на этом начальная настройка для поддержки аутентификации завершена, однако для реализации шифрования передаваемых данных по протоколу SMTP потребуется создать сертификаты безопасности. Их принято хранить в директории /etc/mail/certs/. Создадим данную директорию и сертификаты в ней следующими командами (отметим то, что потребуется ответить на несколько промежуточных вопросов): # mkdir -p /etc/mail/certs # cd /etc/mail/certs # openssl req -new -x509 -days 365 -keyout cakey.pem -out cacert.pem Generating a 1024 bit RSA private key ++++++ ++++++ writing new private key to 'cakey.pem' Enter РЕМ pass phrase: Verifying - Enter РЕМ pass phrase: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. Country Name (2 letter code) [AU]:UA State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:Kyiv Organization Name (eg, company) [Internet Widgits Pty Ltd]:AlterSys Organizational Unit Name (eg, section) []:IT Common Name (eg, YOUR name) [ ]:altersys-ua.com Email Address []:it@altersys-ua.com # openssl req -nodes -new -x509 -days 365 -keyout sendmail.pern -out ^sendmail.pem Generating a 1024 bit RSA private key ++++++ ++++++ writing new private key to 'sendmail.pem' You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value. If you enter '.', the field will be left blank. Country Name (2 letter code) [AU]:UA State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:Kyiv Organization Name (eg, company) [Internet Widgits Pty Ltd]:AlterSys
460 Глава 15. Работа с почтой (e-mail) Organizational Unit Name (eg, section) []:IT Common Name (eg, YOUR name) []:altersys-ua.com Email Address []:it@altersys-ua.com # chmod 400 aandmail.pem cacart.pem Обратите особое внимание на пункт "Conution Name": здесь необходимо ввесп полное доменное имя хоста, к которому будут обращаться клиенты. Некоторые почта- вые клиенты отклоняют сертификат с недостоверным именем хоста. Следует также обратить внимание на права доступа к файлам ключей: если они не будут изменены, то, скорее всего, TLS/SSL откажется работать. Теперь можно перейти непосредственно к настройке sendmail. В первую очередк, необходимо отредактировать файл /etc/make. conf, добавив в него следующие строки: # Поддержка SASL2 (cyrus-sasl2) для sendmail SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2 # Поддержка дополнительного SSL-порта SMTPS (465) в sendmail SENDMAIL_CFLAGS+= -D_FFR_SMTP_SSL Теоретически можно было бы отредактировать файл site.config.m4 в директории devtools/Site исходных кодов Sendmail, но этот вариант в системе FreeBSD используется редко. Что означает поддержка дополнительного SSL-порта? Существует два метод включения поддержки защищенного соединения: STARTTLS и TLS. Первый (STARTTLS) позволяет sendmail осуществлять безопасное соединение по стандартному для SMTP порту 25 параллельно с возможностью небезопасного соединения клиентов. Например, популярный и всеми любимый © Microsoft Outlook Express использует именно метод STARTTLS, то есть, для безопасного соединения используется порт 25, как и для стандартного соединения. Второй вариант (TLS) — это выделение отдельного порта (по умолчанию, порт 465), который работает только с защищенным соединением TLS/SSL. Большинство свободно распространяемых и ориентированных на UNIX- подобные системы почтовых клиентов полностью поддерживают соединение ш SMTPS-nopT(465). Для возможности компиляции системы Sendmail с поддержкой SASL2 необходим удостовериться в том, что установлены необходимые исходные тексты. Для этого зайдите в директорию /usr/src/ и проверьте наличие директорий contrib/, lib/ ■ usr.sbin/. Если какой-либо директории нет, установите недостающие исходные тексты с дистрибутивного диска с помощью утилиты /stand/sysinstall. После этого можно переходить к компиляции. Как правило, компиляция sendmail занимает несколько минут даже на очень "слабой" машине. Выполните последовательно следующие команды: # cd /usr/src/usr.sbin/sendmail # make clean # make depend # make # make install Если все прошло без проблем, то удостоверьтесь в том, что sendmail поддерживает SASL и STARTTLS. Для этого воспользуйтесь следующими командами: # sendmail -dO.1 | grep SASL NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PIPELINING SASLv2 AC # sendmail -dO.l I grep STARTTLS SCANF STARTTLS TCPWRAPPERS USERDB XDEBUG "C
Настройка Sendmail 461 Как видим, sendmail поддерживает SASLv2 и STARTTLS, что и требовалось до- гать. Несмотря на это, как и ранее, необходимо внести соответствующие изменения юнфигурационный файл. Добавим в месте описания локальных макроопределений главном конфигурационном mc-файле следующие строки: dnl Установка необходимых параметров для SMTP-аутентификации TRUST_AUTH_MECH('GSSAPI DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl define('confAUTH_MECHANISMS', SCRAM-MD5 DIGEST-MD5 PLAIN LOGIN')dnl define('confDEF_AUTH_INFO', 'CRAM-MD5 DIGEST-MD5 LOGIN PLAIN')dnl dnl Файлы сертификатов и ключей define ГconfCACERT_PATH', '/etc/mail/certs')dnl define("confCACERT', '/etc/mail/certs/cacert.pem')dnl define('confSERVER_CERT', Vetc/mail/certs/sendmail.pem')dnl define('confSERVER_KEY', ч/etc/mail/certs/sendmail.pem')dnl define('confCLIENT_CERT', "/etc/mail/certs/sendmail.pem')dnl define(4confCLIENT_KEY", "/etc/mail/certs/sendmail.pem')dnl dnl Дополнительный TLS-порт 465 DAEM0N_0PTIONS('Port=smtps, Name=TLS, M=s')dnl Если требуется обязательная аутентификация, добавьте в DAEMON_OPTIONS пара- пр 'F=a'. Пересоберите файл sendmail.cf и перезапустите процесс следующей мандой: * cd /etc/mail I make cf Install restart /usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 mobile.altersys-ua.com.mc > mobile.altersys-ua.com.cf install -m 444 mobile.altersys-ua.com.cf /etc/mail/sendmail.cf install -m 444 mobile.altersys-ua.com.submit.cf /etc/mail/submit.cf Restarting: sendmail sendmail-clientmqueue. Теперь, если все прошло успешно и без каких-либо осложнений, sendmail будет одерживать авторизацию и безопасное соединение. Но при этом есть несколько "но"! первую очередь, следует помнить, что SMTP-аутентификация с использованием сис- шой базы пользователей (/etc/spwd.db) может осуществляться только с помощью пода LOGIN или PLAIN, а они не рекомендуемы к использованию. Потому необхо- мо вести параллельно отдельную базу данных пользователей, которым разрешена 1ТР-аутентификация. Создадим для примера одного такого пользователя relay и юстоверимся, что он находится в базе: t saslpasswd2 -с relay Password: Again (for verification): I sasldblistusers2 relay@mobile.altersys-ua.com: userPassword Заметим, что база данных sasldb.db по умолчанию находится в директории sr/local/etc/ и содержит незашифрованный пароль для созданного такой коман- i пользователя. Опишем кратко настройку клиента The Bat! 3.5 для операционной системы Win- iws на использование SMTP-аутентификации и поддержку TLS-соединения без описа- вработы с данной программой, поскольку это выходит за рамки книги. Предположим, уже существует почтовый ящик "RELAY" (relay@altersys- i.com). Для настройки на использование как безопасного соединения, так и SMTP- ргентификации необходимо перейти к свойствам почтового ящика и выбрать вкладку
462 Глава 15. Работа с почтой (e-mail) Транспорт (рис. 15.3). Указать адрес SMTP-сервера (IP или FQDN) и выбрать тип соединения: STARTTLS (порт 25) или TLS (порт 465). *#1 Свойства почтового ящика - RELAY 2£l Общие сведения .^_ f IWWAbU 4l "■■" {Отправкам . w «л Ж^5МТР-серевр: |l92.168.0.200 ■"Щ Общие сведе !' КЯ> FP^W??^| < fcjS *Й Управление почтой {3 Удаление fS Параметры (у Файлы и каталоги t=j-lgl шаблоны Q Новое письмо j j» Ответ \-\Щ{ Пересыпке (о Подтверждение прочп [Щ Сохранение в файл Q Девизы ■С Звук Jjj[ Подключение Заметки Рчат а почты" 1 Аутентификация... 1 | Соединение: {Безопасное на спей, порт (TL5) ^J Порт: |*65 г Получение почты Почт. «ДО» (192.168.0.200 I Прльэооатель: рйау Хвймвут сервера; |б0 сек. Т_ип доставки {Немедленная Г* Совмещенная доставка (получение + отправка) "3 л1_ J ±1. OK I Отмена I Справка I Рис. 15.3. Настройка транспорта (адрес SMTP-сервера, тип соединения, порт) После этого можно нажать кнопку Аутентификация для перехода в окно настройки параметров SMTP-аутентификации (рис. 15.4). f*i Аутентификация при отправке почты 17 |>ут№гтфУ<аиия^ТР"(Й"|=С~г5Й)| W 2<1 i С Использовать параметры получения почты (РОРЗДМАР) (? Использовать указанные ниже параметры С хранить napi«ih e-fcpenci-в» j Цольмввтель: Jrelay Пароль: J*' ip" Требовать безопасную аутентификацию Г" Разразить ббг»эмстрическу?с. аутентификацию (Tpt'&jf тся--Т15) Г" toл>гч*лать H.i [ С Минуты J Г Аутентиуржация "gOP прежде SMTP" OK J Отнеиа | Справка I Рис. 15.4. Настройка параметров SMTP-аутентификации (пользователь, пароль, дополнительные требования) В данном окне необходимо выбрать параметр Аутентификация SMTP (RFC-2554) для возможности настройки соответствующих параметров. Теперь будет доступен выбор параметров. В нашем случае необходимо выбрать пункт Использовать указанные
Настройка Sendmail 463 ■же параметры и в появившихся полях ввести имя пользователя, а также его пароль (м пользователя из базы данных sasldb. Выберите также пункт Требовать безопасно аутентификацию и нажмите кнопку ОК. Все параметры введены, осталось попро- Ьать отправить первое письмо. Желательно отправить его самому себе для проверки иголовков. Сам процесс составления письма опустим. При попытке отправки письма программа The Bat! (как и все остальные почтовые пиенты) сообщите неизвестном сертификате (рис. 15.5). Рис. 15.5. Добавление сертификата в хранилище доверенных Можно просмотреть текущий сертификат, нажав кнопку Просмотр сертиф.. Если по— ваш сертификат, то можно попробовать добавить его. Также можно продолжить Юпытку отправки сообщения без добавления или же отказаться от отправки, если нет (елания доверять данному сертификату. В данном случае примем, что сертификат был цобавлен (чтобы подобный вопрос больше не возникал). Письмо будет отправлено. После отправки письма можно просмотреть историю в окне Журнал работы почто- юго ящика (рис. 15.6). QНеизвестный сертификат СА Нет доверия к корневому 5/MIME ceoitvJwaTy центра сертификации, поскольку его мет о адресной книге доверенных корневых центров сертификат™. Это соединение не может быть секретным. Пожалуйста, сомитес с администратором Вашего сервера Вы можете добавить сертификат в хранилище доверен>ых корневых сертификатов. нажав кнопку "Add to Trusted^. v \ Продолжить? OK 1 Отмена 1 к] Просмотр сертиф, 1 [Добавить к доверенным 1 + Журная работы почтового ящике - RELAY Засрытв 0«ститъ 25.08.2005, 25.08.2005, 1 25.08.2005, 25.08.2005, L 25.08.2005, 2S.08.2005, 25.08.2005, 25.08.2005, 1 25.08.2005, j> 2S.08.2005, | 25.08.2005, Только основные записи 14:22:55: 14:22:55: 14:22:55: 14:22:55: 14:22:55: 14:2,2:55: 14:22:55: 14:22:55: 14:22:56: 14:22:56: 14:22:56: SEND SEND SEND SEND SEND SEND SEND SEND SEND SEND SEND - - - - - - - - - - JSJxJ Отправка почты - писек в очереди: l jj Начинаю приветствие TLS Серийный номер сертификата: C30BEE2E6F27EB5A, алгоритм: R3A (1 Владелец: UA, Some-State, Kyiv, Altecsys, XT, 192.168.0.200, 1 Этот сертификат выдан самим собой. Приветствие TLS завершено Соединение с SHTP сервером прошло удачно Аутентификация (программный CRAK-HDSJ... Отправка письма для relayQalterays-ua.cow Отправлено письмо для celayGalteusys-ua.rom (1821 байт) Соединение завершено - отправлено писем: 1 •*! I iT, ?ис. 15.6. История соединения (TLS-соединение, аутентификация, отправка) Как видим, было успешно пройдено создание защищенного соединения, SMTP- «угентификация и отправка письма. Поскольку письмо было отправлено самому себе, то после его получения можно Чюсмотреть заголовки, добавленные почтовым сервером. Наличие тех или иных заго- ювков также определяет успешность создания безопасного соединения и процесса SMTP-аутентификации. На рис. 15.7 можно увидеть выделенные подчеркиванием поля > конверте письма, говорящие об успешном прохождении аутентификации (authenticated bits=0) и безопасном соединении TLS/SSL (»ersion=TLSvl/SSLv3 cipher=AES256-SHA bits=256 verify=NO).
464 Глава 15. Работа с почтой (e-mail) fl|Просмотр папки Входацие ящика RELAY j*7| -IE. Л Письмо Специальное Переход Криптографии и безопасность Вид 'iy ■ Г* 3 ? У i i£ f $j_p£ £ Q ft nw":l Or: Olexa <reiay@altefsyt-ua.com> (AtoiSys) K0143: ieley@altersys-ua.carn Тема: teri turn-Path: <releygalter3y3-ua.corn> *J Received: Icon lnformex ([192.168.0.1]) .authenticated bita-OI J by mobile.alteraya-ua.com (8.13.3/8.13.3) with ESHTP Id J7PB2ZIV002053 tverslon-TljSvl/SSLvacij^^ fcx<r^avaalteT3y3?!!aTcor^^TPU^2^Tu!^z00^1??o7^^+0300 (BEST) (envelope-fcom relayGalteEgya-ua.cQip) Date: Thu, 25 Лид 2005 14:00:45 +0300 From: Olexa <relayBaltersy3-ua.cora> fj Рис. 15.7. Просмотр заголовков письма (наличие информации о прохождении аутентификации и безопасности соединения) На этом вопроса можно считать исчерпанным. Более подробную информацию можно найти на сайте http: //sendmail. org. Использование sendmail при коммутируемом доступе В наше время еще достаточно часто используется коммутируемый доступ к Internet Скорее всего, такой вид доступа еще надолго останется дешевой альтернативой при доступе во всемирную сеть — и не только из-за низкой стоимости, но также и по причине отсутствия оснований у множества компаний и домашних пользователей для установки постоянного соединения. Такие пользователи также не были обойдены вниманием разработчиков почтовых серверов, которые предоставляют в своих программных продуктах гибкие возможности по настройке сервера с использованием коммутируемого доступа, не стали исключением и разработчики Sendmail. Рассмотрим два частных случая: первый — полнофункциональный почтовый сервер при коммутируемом доступе; второй — использование sendmail только для отправки сообщений с подменой адреса отправителя (masquerade). Первый случай неразрывно связан с использованием вторичного почтового сервера (например, предоставляемого провайдером сети Internet) и соответствующей настройкой системы DNS. Предположим, почтовый сервер mail.main.com.ua отвечает за домен main. com. ua и находится в локальной сети компании. В определенные моменты времени происходит соединение с провайдером сети Internet по коммутируемой линии да отправки всех сообщений, находящихся в очереди, и получения сообщений, пришедших на домен main. com. ua, но доставленных на вторичный сервер mcu. yourisp. net согласно МХ-записям в файле зоны на DNS-сервере. В первую очередь, рассмотрим список МХ-записей в файле зоны для домена main. com. ua: main.com.ua. IN MX 10 main.com.ua. IN MX 20 mcu.yourisp.net. В результате получаем, что в моменты, когда ваш сервер не доступен, вся почта будет доставляться на сервер провайдера согласно конфигурации DNS. Сервер провайдера с приоритетом 20 периодически будет пытаться доставить всю корреспонденцию вашему почтовому серверу (с более высоким приоритетом — 10). Далее необходимо соответствующим образом внести коррективы в главный конфигурационный файл. При первом изменении файла /etc/mail/f reebsd.mc можно было заметить следующие строки: dnl Dialup users should uncomment and define this appropriately ^
Настройка Sendmail 465 dnl define('SMART_HOST', "your.isp.mail.server•) Отредактируем конфигурационный mc-файл, добавив в него следующую строку: define(~SMART_HOST', 'mcu.yourisp.net')dnl йсле чего соберите и установите новую версию файла sendmail. cf, не забыв переза- |устить службы Sendmail. Данная настройка позволит почтовому серверу направлять (юпочту на SMTP-сервер mcu. yourisp.net вместо попыток непосредственной дос- ивки их конечным почтовым серверам получателей (которые в момент попытки от- фавки могут быть недоступными). В данном случае также будет решена проблема [обратным DNS-поиском, поскольку для dialup-пользователей обратные записи, как давило, отсутствуют. Следующий важный пункт — правильная настройка очереди сообщений. Это объ- 1сняется тем, что за время соединения может не произойти проверки очереди сообще- мй. Самым простым решением (но не эффективным и не гибким) является изменение стандартных значений следующих флагов в файле re. conf (а точнее, — времени дос- гавки): sendmail_flags="-L sm-mta -bd -q30m" sendmail_outbound_flags="-L sm-queue -q30m" Как видим, по умолчанию, проверка очереди производится каждые 30 минут. Предположим, что сервер настроен на автоматический дозвон каждый час, разрыв со- иинения происходит автоматически по истечении пяти минут отсутствия передаваемых щных. В такой конфигурации очередь может простаивать несколько часов, поскольку к проверка может не совпадать со временем соединения. Переопределим значение необходимого флага в файле /etc/rc. conf, например, таким образом: sendmail_flags="-L sm-mta -bd -q5m" Теперь проверка будет производиться каждые 5 минут, но данное решение, как было уже упомянуто, не является гибким и эффективным. Более логично и правильно использовать пользовательский сценарий, запускаемый автоматически при установке РРР- соединения (этот вопрос рассматривается в главе 14). Как правило, будет достаточно использовать в данном пользовательском сценарии команду sendmail -q. Второй рассматриваемый случай может быть использован домашними пользовате- ими, у которых есть свой домен или просто почтовый ящик у провайдера, при этом используется стандартный почтовый агент типа Mutt или Mail, не имеющие возможности напрямую работать с удаленными серверами. В данном случае использованием одного senctaail не ограничишься. В первую очередь для получения почты необходимо будет кпользовать стороннюю утилиту типа f etchmail (о ней — чуть позже в этой главе). Предположим, у пользователя есть домен main.com.ua (поддерживает провайдер), и он уже настроил получение всей корреспонденции по протоколу РОРЗ с хоста relay. main. com. ua (который выполняет роль и SMTP-сервера). Предположим также, что имя домашнего хоста — mobile. at. local, а отправлять сообщения необходимо от имени пользователя домена main, com.ua. Конфигурационный файл для sendmail щком случае может соответствовать листингу 15.11. JbcTHHr 15.11. Пример конфигурационного ^|^ И \j_ отложенной отправке '""'' divert (-1) I Master Config. INformEx. 2005 I Помощь - /usr/share/sendmail/cf/README divert (0) VERSIONIDChome dialup') 0STYPE<freebsd5)dnl iIATURE(nouucp, reject) dnl
466 Глава 15. Работа с почтой (e-mail) Листинг 1S.11. Окончание - '.-"-'"- " -.уГ^^К^/"^ ";':^iF ' '.Щ MASQUERADE_AS('main.com.ua')dnl MASQUERADE_DOMAIN('at.local')dnl FEATURE(allmasquerade)dnl FEATURE(masquerade_envelope)dnl FEATURE(nocanonify)dnl define('SMART_HOST','relay.main.com.ua')dnl define('confDOMAIN_NAME','at.local')dnl define('confDELIVERY_MODE','deferred')dnl MAILER(local)dnl MAILER(smtp)dnl Исходя из этого листинга, можно заметить, что мы настроили подмену конвертам- общения и заголовков таким образом, что запись хоста mobile (как и любой другой) в домене at. local при отправке сообщения будет изменяться на main. com. ua. П(Я этом отправка происходит через сервер перенаправления relay.main.com.ua. Обр» тите особое внимание на следующую строку: define('confDELIVERY_MODE','deferred')dnl Это — описание режима отложенной отправки (существует всего четыре режи» отправки). Данный режим позволяет отключить проверку существования записи дм домена получателя в базе DNS при постановке сообщения в очередь. Таким образом,» происходит автоматический набор номера модемом в случае настройки соединения I» запросу. Заметим, что, как и в предыдущем примере, необходимо вручную выполнил! команду sendmail -q или внести данную команду в сценарий, выполняемый пост осуществления соединения. Интересно то, что данный вариант настройки системы широко использовался и » сих пор используется некоторыми спамерами. Заметим, что отправлять сообщения см- гут пользователи системы, у которых есть идентичные записи в домене main.com.ua, Таким образом, для пользователя test на хосте mobile, at .local должна иметю запись test в домене main.com.ua. В случае отсутствия такой записи вероятнее всего, что сообщение не будет отправлено. Использование серверов перенаправления В продолжение предыдущего вопроса можно затронуть использование серверов перенаправления. Эта тема всегда была и остается спорной. Несмотря на запрет в систем! sendmail пересылки сообщений, не относящихся к локальному хосту, существуют ситуации, когда такую пересылку необходимо включить. Отчасти, данный вопрос решается созданием и поддержкой файла базы доступа /etc/mail/access, однако, как правило, этого недостаточно — особенно при существовании клиентов, подключаемых по коммутируемой линии. Как же позволить вашим удаленным пользователям с изменяющимися IP-адресами осуществлять пересылку сообщений, но при этом отвергать попытки пересылки от других неизвестных хостов. По умолчанию, в системе отсутствует файл /etc/mail/relay-domains, который позволяет вести список доменов с доверием для пересылки. Использование данного файла означает, что любой хост, находящийся в пределах перечисленных домем, сможет использовать ваш сервер для пересылки. Просто создайте данный файл и в любом текстовом редакторе добавьте домены провайдеров, которым доверяете. Например, если пользователь пользуется дома услугами провайдера ISPLOCUA, который ставит dialup-пользователям в соответствие запись вида xx.xx.dial-pool.isplocua.net, то просто добавьте в вышеупомянутый файл в новой строке запись dial- pool, isplocua.net, после чего потребуется перезапустить Sendmail. При этом следует отметить, что данный способ не поможет, если найдется спамер в данном домене, однако подобные случаи, как правило, легко решаются звонком в службу поддержи
Настройка Sendmail 467 (указанием адреса и времени отправки письма спамером. После проверки данный пользователь более не сможет пользоваться услугами этого провайдера ©. Дополнительную защиту от несанкционированного использования сервера спаме- йми предоставляют несколько расширений контроля пересылки, основанных на раз- мчных правилах. Просмотрим их список: dnl Пересылка на основаниии присутствия МХ-записи для хоста FEATURE(relay_based_on_MX) dnl Пересылка на основании принадлежности к домену FEATURE(relay_entire_domain) dnl Пересылка на основании точного совпадения записей в базе доступа dnl и в файле relay-domains (домены интерпретируются как хосты) FEATURE(relay_hosts_only) dnl Пересылка писем на основании короткого DNS-имени сервера FEATURE(relay_local_from) dnl Пересылка на основании поля From: в заголовке письма dnl и правила RELAY в файле базы доступа /etc/mail/access FEATURE(relay_mail_from) Если необходимо полностью отключить блокирование пересылки (на свой страх и риск) используйте расширение FEATURE(promiscuous_relay) Использование описанных в данном разделе методов может представлять существенную опасность. Не исключена возможность попадания вашего сервера в черный список RBL. Данные решения необходимо использовать в крайних случаях. Использование внешних почтовых фильтров Наверное, одна из самых замечательных возможностей Sendmail — это поддержка подключения внешних почтовых фильтров. Такая возможность полностью официально была включена в продукт, начиная с версии 8.12. До этого в версиях 8.10-8.11 также можно было ею воспользоваться, хотя официальной поддержки не было. Практически иждый, кто слышал или сталкивался с Sendmail, неоднократно слышал о библиотеке Milter. Именно она отвечает за возможность доступа к внешним программам с помощью сокетов. В системе Sendmail, поставляемой вместе с FreeBSD, данная возможность уже включена, и потому каких-либо усилий по перекомпиляции из исходных кодов прилагать не придется (как это было с включением SMTP-аутентификации). Благодаря поддержке внешних фильтров, расширение возможностей системы Sendmail "прозрачно" и не вызывает сложностей. К тому же, внешние программы могут мвать указание "отсекать" сообщение еще до его получения на основании информации о соединении или заголовков. Такая возможность особенно важна при использовании антиспамовых фильтров. Ранее, в основном, использовались правила procmail, что требовало полного принятия сообщения с дальнейшим решением его судьбы ("быть или утЗить" ©), и кроме того, довольно сильно нагружалась система. О прохождении сообщения через некий фильтр свидетельствует наличие в письме Х-заголовков. Прежде чем подключить внешний фильтр, необходимо его установить и итем описать в главном конфигурационном mc-файле с помощью одной из следующих макрокоманд: INPUT_MAIL_FILTER("имя', 'список определений ...') MAIL_FILTER('имя', "список определений ...')
468 Глава 15. Работа с почтой (e-mail) Заметим, что в данном случае "имя" — это не имя внешней программы, а внутри нее имя для использования только в sendmail. Список определений имеет строки форму. Каждое определение состоит из ключевого символа и значения, разделении знаком равно ("="), элементы списка разделяются запятой. Всего существует три кл» чевых символа: S — для описания используемого сокета; F — для описания поведения sendmail при сбое фильтра; Т — для описания различных таймаутов. Пример использования: INPUT_MAIL_FILTER('antispam', 'S=local:/var/run/antispam.sock, F=R, 4>T=E:5m;R:10s;S:10s;C:5m') Рассмотрим значения, которые могут принимать ключевые символы и результат и использования. Во-первых, ключевой символ S (socket) и его значения — это обязательное определение. Существует несколько типов используемых сокетов: socket и local — используются для обозначения стандартных Unix-сокетм (файл специального назначения); inet — используется для указания сетевого сокета IPv4; inet6—для IPv6. Формат записи имеет следующий вид: S=sockettype:socketdescription Примеры использования: S=local:/var/run/clamav.sock S=inet:3001@localhost S=inet:1003@main.com.ua S=inet6:3001@3ffe:501:ffff:1000::1 Определения F и Т необязательны. Ключевой символ F (flags) может принимип только два значения: R (reject, отклонять соединение, если фильтр недоступен™ находится в состоянии ошибки) и Т (temporary, временно отклонять соединения и переводить в режим ожидания при недоступности фильтра). Если данное определен» опущено, то при ошибках или недоступности фильтра (сокета) sendmail ведет сей так, как будто данный фильтр и не был подключен. Использование ключевого символ Т рассматривать не будем. Порядок, в котором определены фильтры, имеет огромное значение. При использовании макрокоманды INPUTMAILFILTER фильтры будут применены в порядке и описания. В случае использования макрокоманды MAILFILTER для описания списи подключаемых фильтров также потребуется дополнительно установить опцию confINPUT_MAlL_FlLTERS. Рассмотрим идентичные примеры при использовали! различных команд: dnl Использование INPUT_MAIL_FILTER позволяет сразу определить поряди INPUT_MAIL_FILTER('spam', 'S=local:/var/run/spam.sock')dnl INPUT_MAIL_FILTER('clamav', 'S=local:/var/run/antivir.sock, F=R')dnl dnl Использование MAIL_FILTER сопровождается макроопределением MAIL_FILTER('clamav', 'S=local:/var/run/antivir.sock, F=R')dnl MAIL_FILTER('spam', 'S=local:/var/run/spam.sock')dnl define)"confINPUT_MAIL_FILTERS', 'spam, clamav')dnl Какое же значение имеет порядок фильтров? В первую очередь необходимо определить, какой из фильтров чаще отклоняет письма и на какой стадии. Например, скорее всего, антивирусный фильтр будет отклонять зараженное сообщение уже после полнот
Настройка Sendmail 469 spam clamav spam clamav spam clamav spam clamav spam spam spam clamav • clamav • clamav <r <r снятия тела сообщения, таким образом, съедая значительную часть трафика. Анти- шамовый же фильтр может "отсекать" сообщение на этапе чтения заголовков письма. Рассмотрим порядок использования внешних фильтров из вышеописанного примерло этапам: информация о соединении (имя хоста и адрес); информация о соединении (имя хоста и адрес); приветствие (HELO/EHLO); приветствие (HELO/EHLO); MAIL FROM: адрес и расширенная информация; MAIL FROM: адрес и расширенная информация; RCPT ТО: адрес и расширенная информация; RCPT ТО: адрес и расширенная информация; заголовки сообщения; тело сообщения; конец сообщения; заголовки сообщения; тело сообщения; конец сообщения. На любом из этапов утилите sendmail будут возвращены определенные решения фильтра о дальнейшей судьбе сообщения. Заметим, что если порядок вызова фильтров не будет определен, ни один из фильтров вызван не будет. Отметим также, что количество используемых фильтров ограничено (а есть ли смысл использовать большое количество фильтров ©). В качестве примера использования внешних фильтров рассмотрим порядок под- иючения и настройки SpamAssassin и ClamAV. Защита от спама на примере SpamAssassin Любой пользователь электронной почты когда-либо сталкивался с ненужными письмами от неизвестных адресатов, не представляющих никакого интереса. Данные письма являются спамом {нежелательной рассылкой). По большему счету, электронные щреса попадают в базы данных спамеров по неаккуратности самих же пользователей: размещение своего электронного адреса на различных публичных серверах (например, и сайтах поиска работы или в форумах) или размещение адресов на своих страницах «з так называемого "экранирования" (замена символа "@" каким-либо другим или подстановка действительного адреса при наведении курсора мыши с использованием денария javascript). Как правило, сбором адресов занимаются роботы, которые сканируют различные страницы на наличие адресов и при нахождении таковых заносят в свою базу данных, после чего происходит периодическая массовая рассылка. Довольно часто спам содержит в теле письма вирусы. На сегодняшний день практически нет никакой правовой от- ктственности за рассылку спама, за исключением редких случаев, когда пострадавшие компании (понесшие крупные финансовые потери) таки выигрывали судовые процессы против спамеров. Борьба со спамом на сегодняшний день заключается в использовании специальных программных комплексов, анализирующих поток сообщений и отсекающих нежела- гсльную рассылку. К таким программным комплексам можно отнести SpamAssassin, Bslilter, SpamGuard, Dspam и др. Большинство из них можно найти в коллекции портов /usr/ports/mail/. Мы же рассмотрим использование одного из наиболее известных «используемых пакетов — SpamAssassin. Почтовый фильтр SpamAssassin написан на языке Perl и предназначен для опознания спама по различным методам текстового анализа, метода Баеса и др. При этом сам SpamAssassin не является частью какого либо почтового сервера, и может использовать- акак Sendmail, так и Postfix или Qmail. Получив сообщение на входе, и проанализиро-
470 Глава 15. Работа с почтой (e-mail) вав заголовки и тело письма на принадлежность к спаму, SpamAssassin возвращает сообщение обратно, пометив его как спам или как нормальное сообщение. Заметим, что пакет SpamAssassin является самообучаемым. Также имеется возможность ручного обучения, благодаря которому достигается более точная фильтрация корреспонденции н» нормальные сообщения (ham) или рекламу (spam). С точки зрения статистики, до обучения SpamAssassin отсеивает около 60%-70% нежелательной рекламы, а после обучения до 90%-95%. Также, иногда данный фильтр может распознать нормальное сообщение как спам. Такие случаи крайне редки, но о них необходимо помнить. Сам SpamAssassin можно использовать, благодаря наличию командно-ориентированной утилиты spamassassin через всевозможные правила procmail. Однако, как правило, лучше всего воспользоваться библиотеками Milter из Sendmail. Для подключения фильтра SpamAssassin в Sendmail используется сторонняя утилита spamass- milter (существуют и другие). К тому же установка данной утилиты из набора портов (/usr/ports/mail/spamass-milter) установит также и сам пакет SpamAssassin (/usr/ports/mail/p5-Mail-SpamAssassin). Примем, что оба пакета не установлены в системе. Для установки перейдем в директорию /usr/ports/mail/spamass-milter/ и выполним следующую команду: # make install clean В результате будут загружены и установлены в системе необходимые пакеты, Фильтр SpamAssassin требует наличия некоторых модулей Perl, которые будут также автоматически загружены и установлены. Если установка пакета SpamAssassin производится в первый раз, то будет отображено окно конфигурации (рис. 15.8), где необходимо указать дополнительные возможности' пакета. Options [К] [ ] [ ] Ш [ ] ш For p5-Mail-SpamAssassin 3.0.4 Run stand as root recommended Build with SSL support for spamd/spamc Add MySQL support Add PostreSQL support Add Vipul's Razor support Add SPF query support Install SpanAssassin tools Cancel Рис. 15.8. Окно конфигурации SpamAssassin После установки можно перейти к настройке и запуску необходимых утилит. В первую очередь стоит разрешить запуск даемонов SpamAssassin и spamass- milt.er. Для этого добавим следующие строки в конфигурационный /etc/rc.conf: # для выполнения /usr/local/etc/rc.d/sa-spamd.sh spamd_enable="YES" # для выполнения /usr/local/etc/rc.d/spamass-milter.sh spamass_milter_enable="YES"
Настройка Sendmail 471 Главный конфигурационный файл для SpamAssassin— /usr/local/etc/mail/ spamassassin/local.cf. По умолчанию он отсутствует, зато в этой же директории входится файл примера local. cf. sample. Скопируем его: tf cd /usr/local/etc/mail/spamassassin # cp local.cf.sample local.cf После этого приведем local. cf к следующему виду: rewrite_header Subject *****SPAM***** add_header all Report _REPORT_ required_hits 10.0 report_safe 0 use_auto_whitelist 1 auto_whitelist_factor 0.5 auto_whitelist_path /etc/mail/spamassassin/auto_whitelist use_bayes 1 bayes_auto_learn 1 bayes_auto_learn_threshold_nonspam 0.1 bayes_auto_learn_threshold_spam 10.0 bayes_path /etc/mail/spamassassin/bayes score ALLJTRUSTED O.O score HTML_WITH_BGCOLOR 2.5 score NO_REAL_NAME 1.0 It trusted_networks 192.168. lock_method flock Описание данного файла и применяемых в нем команд можно найти в документации по настройке SpamAssassin — perldoc Mail: : SpamAssassin: : Conf. В данный иомент необходимо было просто подготовить систему к запуску необходимых служб, тгомы и сделаем, выполнив представленные ниже команды: # /usr/local/etc/rc.d/sa-spamd.sh start Starting spamd. # /usr/local/etc/rc.d/spamass-milter.sh start Starting spamass_milter. Если все прошло успешно, то можно переходить к непосредственной настройке Sendmail на использование только что установленного фильтра. Итак, добавьте сле- цующие строки в конфигурационный файл /etc/mail/<hostname>.mc: INPUT_MAIL_FILTER('spamassassin',*S=local:/var/run/spamass- 4>milter.sock, T=C:20m;S:4m;R:4m;E:15m')dnl define('confMILTER_MACROS_CONNECT','b, j, _, {daemon_name}, {if_name}, 4>(if_addr}')dnl После изменения конфигурационного mc-файла, выполните компиляцию и уста- ювку нового с f-файла, а также перезапустите службы Sendmail (не забудьте, что порядок описания команд в mc-файле строго ограничен). Итак, после этого необходимо удостовериться в том, что все работает. Для этого выполним следующую команду: # echo "Test spamass-milter and SpamAssassin"Imail -s "spam test" root Через некоторое время пользователю root будет доставлено сообщение "spam 1st", в заголовках которого должны появиться новые поля, начинающиеся на X-Spam, ипример:
472 Глава 15. Работа с почтой (e-mail) X-Spam-Status: No, score=0.0 required=10.0 tests=none autolearn=hara version=3.0.4 X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on mobile.altersys-ua.com Теперь каждый пользователь системы может настроить свой почтовый клиент на автоматическое удаление всех сообщений, помеченных как спам. Более того, можно настроить сам почтовый сервер на автоматическое удаление всех сообщений, помеченных как спам, например, с использованием следующего простого правила procmail в файле /usr/local/etc/procmailrc: :0: * "X-Spam-Status: Yes /dev/null Заметим, что до проведения ручного обучения системы с помощью утилиты sa- learn автоматическое удаление сообщений, помеченных как спам, нежелательно. Потому более приемлемо первое время складировать все сообщения, помеченные каг спам, в какую-нибудь папку или пересылать на другой ящик для ручного пересмотра администратором: :0: * ^-Spam-Status: Yes ! spam-root Каждый пользователь имеет свою специфическую корреспонденцию, и, возможно, чьи-то "нормальные" письма окажутся автоматически удаленными, так и не попав в ящик конечного пользователя. Действительно, каждый пользователь может сам управлять уровнем оценки каждого правила и "белым списком" в файле ~/. spamassassin/ user_pref s в своей домашней директории. Но для этого администратору необходимо в конфигурационный файл local. c£ добавить строку: allow_user_rules 1 Заметим, что использование такой опции может быть опасно для безопасности системы. Кроме того, SpamAssassin будет заново полностью перепроверять сообщение дли пользователя по его критериям оценок, что приведет к дополнительным нагрузкам на систему. По этой причине, лучший вариант — ручное обучение системы с помощью фильтра Баеса. При этом необходимо передать в сумме не менее 200 (значение по умолчанию, можно изменить) нормальных и нежелательных писем. Рекомендуется собрать в отдельной директории ham-письма, а в другой — spam-письма. При этом, как правило, необходимо просто попросить пользователей экспортировать нормальные письма в одну директорию, а весь спам — в другую. Важно отметить, что не имеет значения, имеют ли уже эти письма оценку того самого SpamAssassin и верна ли она. Таким образом, лучше всего передать системе на обучение те письма, которые она неправильно пометила, то есть, выбрать нормальные письма, но помеченные как спам, и положить их в директорию ham. To же самое необходимо сделать и с явным спамом, но не распознанным как таковой. # sa-learn —spam —showdots /spam/folder # sa-learn --ham —showdots /ham/folder Только после полного обучения системы в заголовке письма появится информации об оценке по алгоритму Баеса. Дополнительную информацию по этому вопросу можно найти на страницах справочного руководства man spamassassin, man spamd, man spamc, man sa-leamH man spamass-milter.
Настройка Sendmail 473 г ; Защита от вирусов на примере использования ClamAV Если проблема со спамом, в основном, не приносит каких-либо крупных финансо- шх проблем, кроме платы за трафик и потери времени на чтение ненужной информа- ри, то вопрос защиты от вирусов более критичен. Правда, данный вопрос затрагивает, яо большей части, пользователей операционных систем от компании Microsoft, которые миболее популярны в качестве настольных систем в офисах и домах. Игнорирование проблемы широкого распространения вирусов может вылиться не только в неудобства яри работе, но и в покупку некоторого специализированного программного обеспечения или даже обращения в IT-компанию для восстановления утерянных данных или перепрошивки запорченной BIOS. Более того, вы можете невольно стать распространителем икого-либо вируса, что стало довольно популярно в последнее время. Хорошо, если рабочая станция защищена каким-либо специализированным антивирусным программным обеспечением, но защита почтового сервера должна быть проведена не просто как дополнение к пользовательской, но как основная антивирусная защита всей сети в целом. Это приводит и к финансовой экономии, и позволяет не отвлекаться на ежедневное обновление антивирусного пакета на каждой рабочей станции в сети — ведь достаточно следить за обновлениями на сервере. Большинство специализированных антивирусных пакетов позволяют выполнять подобные проверки несколько раз в день и при необходимости загружать и устанавли- аать дополнения. К тому же, антивирусные пакеты для системы FreeBSD (как и для других UNIX-систем) зачастую бесплатные. К таким пакетам относится и один из наиболее популярных антивирусных пакетов ClamAV. Рассмотрим кратко его установку, настройку, и подключение к Sendmail. Как и во всех остальных случаях, установку производим из набора портов. Перейдя вдиректорию /usr/ports/security/clamav/, выполним следующую команду: # make config install clean В результате на экране будет отображено окно дополнительных опций (рис. 15.9), вспользуемых при сборке и установке пакета. Нам потребуется как минимум поддержка MILTER, потому выберем данную опцию и нажмем кнопку ОК. Options for clawav 0.86.2JL DXD IJIIMia» Compile the Milter interface [ 1 Support URL downloading 1ШЛН1 Cancel Рис.15.9. Конфигурирование пакета ClamAV В результате будет загружен и установлен антивирусный пакет ClamAV. Помимо этого, будут установлены также некоторые дополнительные пакеты программ, например, программы архивации и распаковки. После этого можно перейти к настройке вновь
474 Глава 15. Работа с почтой (e-mail) установленных программ из набора ClamAV (clamd и f reshclam) или самого Sendmail на поддержку clamav-milter. Последнее— наиболее простая задача, поэтому вначале решим именно ее. Итак, внесем изменения в конфигурационный mc-файл, добавив в файл /etc/mail/<hostname>.mc строку: INPUT MAILFILTERf'clamav', "S=local:/var/run/clamav/clmilter.sock, "ЪТ=5:4т;К:4пГ )dnl После внесения изменений, пересоберите и установите новый конфигурационный файл без перезапуска самого Sendmail. Обратите внимание на то, что для правильной работы антивирусного пакета в связке с Sendmail необходимо настроить на выполнение три отдельных даемона. Для этого добавим следующие строки в главный конфигурационный файл системы /etc/rc.conf: # для запуска сценария /usr/local/etc/rc.d/clamav-clamd.sh clamav_clamd_enable="YES" # для запуска сценария /usr/local/etc/rc.d/clamav-freshclam. sh clamav_freshclam_enable="YES" # для запуска сценария /usr/local/etc/rc.d/clamav-milter.sh clamav_milter_enable="YES" Первая команда позволит запустить сам даемон антивируса, вторая— запустить даемон автоматического обновления базы данных, а третья — это утилита для связи антивирусного пакета и Sendmail через библиотеку Milter. Последним штрихом перед запуском в работу является правильная настройка конфигурационных файлов пакета ClamAV. В первую очередь внесем изменения в файл /usr/local/etc/clamd.conf (хотя, вполне возможно, они и не понадобятся). Пример данного файла можно найти в листинге 15.12. Листинг 15.12. Пример конфигурационного файла /«Wlocal/etc/clamd.conf LogFile /var/log/clamav/clamd.log LogFileMaxSize 1M PidFile /var/run/clamav/clamd.pid TemporaryDirectory /tmp DatabaseDirectory /var/db/clamav LocalSocket /var/run/clamav/clamd.sock FixStaleSocket MaxConnectionQueueLength 15 User clamav AllowSupplementaryGroups ScanPE DetectBrokenExecutables ScanOLE2 ScanMail ScanHTML ScanArchive ScanRAR ArchiveMaxFileSize 10M ArchiveMaxRecursion 5 ArchiveMaxFiles 500 ArchiveLimitMemoryUsage Затем необходимо позаботиться об автоматическом обновлении антивирусной базы, отредактировав конфигурационный файл /usr/local/etc/freshclam.conf. Пример данного файла — в листинге 15.13.
Настройка Sendmail 475 Ёнг 15.13. Пример конфигурационного файла /usr/XucaJ./ate/fraiBhelam. conJ aseDirectory /var/db/clamav eLogFile /var/log/clamav/freshclam.log PidFile /var/run/clamav/freshclam.pid JatabaseOwner clamav UlowSupplementaryGroups ONSDatabaselnfo current. cvd. clamav. net SatabaseMirror database, clamav. net HaxAttempts 3 Checks 12 HotifyClamd Последним шагом будет запуск необходимых даемонов и перезапуск самого Sendmail, хотя более рекомендуется просто перезапустить систему. # /usr/local/etc/rc.d/clamav-clamd.sh start Starting clamav_clamd. # /usr/local/etc/rc.d/clamav-freshclam.sh start Starting clamav_freshclam; # /usr/local/etc/rc.d/clamav-milter.sh start Starting clamav_milter. # cd /etc/mail # make stop Stopping: sendmail sendmail-clientmqueue. # make start Starting: sendmail sendmail-clientmqueue. Если во время первого запуска clamav-milter будет получено следующее сообщение: /var/log/clamav/clamd.log: Permission denied го необходимо перейти в директорию /var/log/clamav и выполнить следующую команду: # chown clamav clamd.log после чего попытаться выполнить повторный запуск clamav-milter. Теперь удостоверимся в том, что все работает нормально. Для этого отправим тестовое сообщение пользователю root: # echo "ClamAV test ..." I mail -s "ClamAV" root Если сообщение будет получено с дополнительными заголовками, содержащими в названии текст "X-Virus", то можно считать что все работает (по крайней мере, clamav-milter передает и возвращает проверенные сообщения от ClamAV). Пример заголовков: X-Virus-Scanned: ClamAV version 0.86.2, clamav-milter version 0.86 on 4>mobile.altersys-ua.com X-Virus-Status: Clean Дополнительная проверка может заключаться в отправке нескольких зараженных писем на один из почтовых ящиков вашего сервера. Наиболее подходящим и безопасным вариантом будет использование системы "Anti-Virus Testing Tool" расположенной по адресу http: //www.webmail.us/testvirus. Все, что потребуется, — это ввести адрес получателя, получить подтверждение на электронный адрес, пройти авторизацию по полученной ссылке и отправить тестовые сообщения (все или выборочно). Затем проверить, что в почтовый ящик не пришли вовсе (маловероятно ©) или пришли не все сообщения, пользователь root получил письма с отчетом об отклонении зараженных
476 Глава 15. Работа с почтой (e-mail) писем с адресом отправителя и именем вируса, а также в log-файле /var/log/ clamav/clamd. log появились записи вида: /tmp/clamav-2ada6365f52517f2/msg.e4tzsC: OK /tmp/clamav-2ada6365f52517f2/msg.LEbaJ5: Eicar-Test-Signature FOUND /tmp/clamav-2ada6365f52517f2/msg.noNLV7: Exploit.Zip.ModifiedHeaders FOUND /tmp/clamav-2ada6365f52517f2/msg.AcHVdZ: Eicar-Test-Signature FOUND Если это так, то примите поздравления! Получена удачно настроенная и правильно работающая почтовая система с мощной антивирусной защитой. Дополнительную информацию по этой вопросу можно найти на страницах справочного руководства man clamd, man freshclam, man clamd.conf и man clamav-milter. РАБОТА С РОРЗ Вот и настала очередь протокола РОРЗ, упомянутый в начале главы. Напомним, что по умолчанию система FreeBSD не имеет в стандартной поставке программного обеспечения для поддержки работы с данным протоколом, но зато в коллекции портов (и в наборе пакетов на установочном диске) есть обильный список РОРЗ-серверов (а также РОР2-серверов): teapop, akpop3d, courier, cyrus, imap-uw, popa3d, popd, Qpopper. Последний из них — Qpopper — это одна из самых распространенных реализаций РОРЗ- сервера. Это объясняется, по большей части, тем, что данный продукт ранее был разработкой самого института в Беркли, а в данный момент поддерживается компанией Qualcomm. Как правило, РОРЗ-серверы не требуют глубокой настройки в силу простоты и "прозрачности" самого протокола. Опишем работу с серверами РОРЗ на примере Qpopper. Сервер Qpopper прост в настройке, довольно быстро работает, может запускаться в различных режимах, поддерживает безопасное соединение. Для начала важно уяснить, что операционная система FreeBSD поддерживает специальные lock-файлы, которые размещаются в директории /var/mail и имеют имя в формате .<username>.pop. Длина этих файлов, как правило, нулевая, и они создаются автоматически для пользователя при первой POP-сессии. Как только пользователь устанавливает POP-сессию, все сообщения из файла сообщений пользователя копируются (переносятся) в данный файл и из него уже передаются пользователю, если только РОРЗ-сервер не работает в режиме сервера. Таким образом, во время активной РОРЗ-сессии пользователь без проблем может получать новую почту, так как его ящик при этом не блокируется. Установка и настройка qpopper Установку Qpopper проще всего выполнить из набора портов — установочные файлы находится в директории /usr/ports/mail/qpopper (старая версия программы может быть найдена в директории /usr/ports/mail/popper). При этом вначале необходимо определиться, в каком режиме будет работать сервер, и каким способом запускаться. Автор предпочитает не пользоваться суперсервером inetd из соображений безопасности, поэтому в данном разделе примем, что установка Qpopper производится для запуска РОРЗ-сервера в режиме "standalone" (в режиме даемона). Итак, выполним следующую команду, находясь в ранее указанной директории: # make config install clean Программа установки отобразит диалоговое окно, в котором будет предложено установить некоторые дополнительные опции, необходимые для работы РОРЗ-сервера (рис. 15.10). После нажатия кнопки ОК будет загружен, скомпилирован и установлен
Работа с РОРЗ 477 дистрибутив Qpopper. В зависимости от выбранных опций, может оказаться различное юличество новых исполняемых файлов. В данном случае нас интересует только файл /usr/local/libexec/qpopper, который и является непосредственно главным файлом РОРЗ-сервера. Options for qpopper 4.0.8 build with flPOP authentication only build with flPOP install pdf documentation build with Dynamic Relay Authorization build with IPv6 support build with more verbose debugging build with PRH authentication build the poppassd daemon install qpopauth setuid to pop user build a default reject file hide qpopper version in P0P3 banner build with SSL/TLS su ort uild ■ oner to be run without inet include support for user .qpoppcr-oplions Н0ЭН Cancel Рис.15.10. Меню конфигурации Qpopper Может показаться странным, но при установке Qpopper с поддержкой режима "standalone", в директории /usr/local/etc/rc.d не создается сценарий запуска и останова необходимых служб, потому создадим такой файл самостоятельно (qpopper. sh) — листинг 15.14. Рнг 15.14. Стартовый сценарий /usr/locaa/etc/rc.d/qpopper. ah для запуска qpopper в режиме "standalone" ♦!/bin/sh I PROVIDE: qpopper I REQUIRE: DAEMON I BEFORE: LOGIN I KEYWORD: FreeBSD shutdown I Add the following lines to /etc/rc.conf to enable qpopper: lqpopper_enable="YES" . /etc/re. subr iiame=qpopper tcvar=" set_rcvar' command=" /usr/local/libexec/qpopper" . required_files=/usr/local/etc/qpopper.config I read settings, set default values load_rc_config "$name" : ${qpopper_enable="NO"} ! ${qpopper_flags="-s"} mn_rc_command "$1" Теперь для автоматического запуска даемона qpopper во время старта системы достаточно добавить в файл /etc/rc. conf строку: [ ] Ш [ ] [ J [ ] [ ] Г 1 ( J ш 1 1 Ш Ш я я I) I р 0 с XIISThNDALONE MODE [ ] !
478 Глава 15. Работа с почтой (e-mail) qpopper_enable="YES" Ну а для тех, кто хочет запускать РОРЗ-сервер из суперсервера inetd, необходимо просто добавить в файл /etc/inetd. conf следующую строку и перезапустить даемон inetd: рорЗ stream tcp nowait root /изг/local/libexec/qpopper qpopper -s Во всем остальном настройка и работа с сервером Qpopper в двух различных режимах работы принципиально ничем не будет отличаться. Заметьте, что система уже готова для использования. Дальнейшие действия зависят от того, подходит ли конфигурации по умолчанию. В первую очередь упомянем о возможности запуска qpopper в режиме сервера (не путать с запуском в режиме даемона), благодаря чему можно ускорить работу клиентов. Но в данном случае существует много ограничений и особенностей. Во-первых, данный режим можно использовать в том случае, когда пользователи забирают почту только с использованием РОРЗ-сессии, не имея при этом непосредственного доступа к файлам почтовых ящиков. Ускорение работы происходит за счет пропуска выполнения операции копирования сообщений из файла /var/mail/<username> в /var/mail/ . <username> .pop, то есть, получение сообщений производится непосредственно из файла сообщений. Для запуска qpopper в глобальном режиме сервера необходимо передать дополнительную опцию при запуске даемона. Для этого добавьте в файл /etc/rc. conf строку вида: qpopper_flags="-s -S" Теперь qpopper будет работать в режиме сервера для всех пользователей. Работать в таком режиме, в принципе, не рекомендуется. Более гибко и безопаснее указать в конфигурационном файле /usr/local/etc/qpopper.config группу пользователей, для которых qpopper будет работать в режиме сервера или наоборот — группу пользователей, для которых он не будет работать в данном режиме, если режим сервера включен. Для начала, необходимо указать даемону qpopper считывать информацию из конфигурационного файла. Для этого добавим (изменим) следующую строку в файле /etc/rc.conf: qpopper_flags="-s -f /usr/local/etc/qpopper.config" Сам же файл qpopper. conf ig приведем к виду: set server-mode = false set group-server-mode = popusers В таком случае только группа popusers будет напрямую работать с почтовыми файлами пользователей без использования промежуточного lock-файла. Если привести конфигурационный файл к виду: set server-mode = true set group-no-server-mode = wheel то все пользователи системы, кроме пользователей, входящих в группу wheel, будут работать по POP-сессии напрямую с файлами сообщений из директории /var/mail. Отметим, что существует возможность такой настройки отдельно для каждого пользователя системы. Как достигнуть такой функциональности — смотрите в справочном руководстве man qpopper. Аутентификация АРОР и шифрование TLS/SSL Все было бы хорошо, если бы использование почты ограничивалось только локальной сетью, но, как правило, большинство пользователей хотят иметь доступ к почтою-
Работа с РОРЗ 479 ну ящику с домашних машин или любого другого места. Перед администратором стает стеной проблема сокрытия данных о пользователях почтового сервера (как было упомянуто ранее, РОРЗ-аутентификация выполняется с использованием открытого текста). К счастью, Qpopper имеет внутреннюю поддержку "сокрытия" пароля и шифрования соединения. При этом, в отличие от Sendmail, это реализовано более "прозрачно" и просто. Первым делом рассмотрим аутентификацию АРОР, и не только потому, что это очень просто, а потому, что в некоторых случаях при определенных настройках (рассмотренных далее) без этого будет невозможно установить защищенное соединение с сервером. Это важно знать как пользователям (чтобы не возникало лишних вопросов), так и администраторам системы (чтобы знали, как можно более надежно защитить систему и самих пользователей). Важно отметить, что придется параллельно вести базу данных АРОР-пользова- телей. Для работы с ней используется псевдопользователь pop, присутствующий по умолчанию в системе FreeBSD. Для работы с базой данных АРОР-пользователей используется утилита qpopauth. По умолчанию, база данных АРОР-пользователей отсутствует в системе, потому ее придется создать с помощью следующей команды: tt qpopauth -init В результате, в директории /usr/local/etc/qpopper/ появится файл pop. auth. db — именно он служит для хранения списка АРОР-пользователей. Для того чтобы некоторый пользователь системы popuser имел возможность использовать АРОР-аутентификацию, его необходимо добавить в данную базу. Отметим, что этот пользователь должен также присутствовать в системе. Итак, для того чтобы добавить пользователя, выполним следующую команду (с последующим указанием пароля): # qpopauth -user popuser Adding only АРОР password for popuser. New password: Retype new password: или, сразу указав пароль как аргумент (в этом случае следите за использованием спецсимволов — некоторые требуют экранирования): # qpopauth -user popuser p@sswOrd Таким образом, данная база — это список пользователей, которые имеют возможность забирать сообщения с помощью АРОР-аутентификации. При этом пароль пользователя системы не обязательно должен совпадать с паролем в базе данных, что является дополнительным критерием безопасности. Отметим, что пароли в "чистом" виде в данном файле также не хранятся ©. Любой пользователь системы может добавить свою учетную запись АРОР или изменить АРОР-пароль в базе с помощью простой команды qpopauth без указания аргументов в командной строке. Забирать почту пользователь сможет с помощью любого почтового клиента, поддерживающего аутентификацию MD5 АРОР (подробности смотрите в документе RFC-1939). Теперь поговорим о параметрах управления работой с пользователями АРОР в конфигурационном файле qpopper. config. Для управления, в принципе, потребуется только один параметр: clear-text-password. Рассмотрим подробно возможные значения данного параметра. default — в данном случае пароль в открытом тексте принимается от всех пользователей системы, если только для них нет записи в базе данных АРОР. Если за-
480 Глава 15. Работа с почтой (e-mail) пись для пользователя присутствует в базе АРОР, то он обязан включить соответствующую опцию в почтовом клиенте, в противном случае запрос будет отклонен never — полное отключение поддержки работы с паролями, которые передаюта открытым текстом. Самый "параноидальный" режим (особенно, если еще установлено защищенное соединение). always — пароли, которые передаются открытым текстом, принимают в любом случае, независимо от того, есть запись в базе АРОР или нет. Пользователь сам выбирает, каким образом настраивать клиентское приложение, local — пароли в открытом тексте принимаются только в том случае, если Р0Р- сессия устанавливается на локальном хосте с использованием loopback- интерфейса (127.0.0.1). tls — использование паролей в явном виде разрешено только при защищенном соединении, ssl — аналогично значению tls. По умолчанию используется значение default. Рекомендуется установить значение never или tls (ssl): set clear-texc-password = never Теперь поговорим о защищенном соединении. В данном случае, помимо рекомендуемой (но не обязательной) настройки АРОР, придется создавать сертификат безопасности. Этот вопрос рассматривался ранее в разделе "Настройка поддержки TLS/SSL и SMTP-аутентификации". Кроме того, сертификаты, созданные при настройке безопасного соединения для sendmail, подойдут для использования и в qpopper. ПРИМЕЧАНИЕ Технология TLS/SSL в Qpopper не шифрует передаваемое сообщение, а только т$ эволяет защитить от прослушивания пароли и текст сообщений сторонними лицам* во время передачи от сервера:к.^^ёнтгу. Итак, если процесс создания и подписания сертификата опустить, то настройка сервера на использование шифрования TLS/SSL сводится к установке двух параметров в конфигурационном файле qpopper .config. Вот как это будет выглядеть при использовании сертификатов, создаваемых при настройке Sendmail: set tls-support = stls set tls-server-cert-file = /etc/mail/certs/sendmail.pem Напомним, что данный сертификат должен принадлежать пользователю root, a права установлены в значение 400: # 11 /etc/mail/certs/sendmail.pem -г 1 root wheel 2205 Aug 25 12:51 /etc/mail/certs/sendmail.pes Параметра tls-support может принимать следующие значения: default — поддержка TLS/SSL отключена полностью; none — аналогично значению default; stls — поддержка РОРЗ-команды STLS (данная команда позволяет на стандартный порт принимать также и соединения с поддержкой TLS/SSL); alternate-port — включение альтернативного порта для защищенного соединения TLS/SSL. Данная опция необходима для поддержки некоторых старых почтовых клиентов. Как правило, в качестве альтернативного используется порт 995. После соответствующей настройки POP-сервера не забудьте правильно настроить клиентское приложение. Более подробно настройка и работа с программным комплексом Qpopper описаны в документации к данному продукту (файл GUIDE.pdf в дирек-
Сервер 1МАР4 481 юрии с исходными файлами), в sample-файле /usr/local/etc/qpopper.config. ample, а также на страницах справочного руководства man qpopper и man qpopauth. СЕРВЕР IMAP4 Перед установкой какого-либо 1МАР4-сервера необходимо четко определить, подходит и он под ваши нужды, и как его использование отразиться в целом на системе. В дан- юм разделе будет предложено на рассмотрение два различных программных продукта: IMAP-UW и Cyrus-IMAPD. С их помощью будет наглядно проиллюстрировано, каким (йразом изменяются требования к системе в зависимости от сделанного выбора. Настройка IMAP-UW Настройка IMAP-UW простота и "прозрачна". Кроме того, для данного продукта отсутствует конфигурационный файл. Вся настройка сводится к конфигурированию при юмпиляции и установке, а также при описании служб в системе для обслуживания запросов от клиентов. Вторая особенность IMAP-UW заключается в том, что все клиенты сервера IMAP4 должны быть действительными пользователями системы FreeBSD (используются системные UID из файла /etc/passwd), при этом пароли могут различаться если используется база данных CRAM-MD5. В-третьих, вся почта складывается в привычный файл /var/mail/<username>, что позволяет параллельно использовать также РОРЗ-серверы, наподобие Qpopper, если пользователь предпочитает протокол POP. Если пользователь пользуется обоими прото- ршами, то ему придется смириться с постоянным появлением сообщения "DON'T DELETE THIS MESSAGE — FOLDER INTERNAL DATA". По этой причине рекомендуйся использовать сервер ipop3d, поставляемый в наборе IMAP-UW, или же опреде- лпъся с используемым протоколом для получения сообщений раз и навсегда. Но обо кем по порядку... Итак, для установки сервера IMAP-UW в системе с FreeBSD лучше всего использо- ить порты. Для этого перейдем в директорию /usr/ports/mail/imap-uw/ и выполним следующую команду: # make install clean При этом будет скомпилирована и установлена версия IMAP-UW без поддержки незашифрованного соединения, то есть, требующая наличия сертификата и, как следст- вие, используемое клиентское приложение также обязательно должно поддерживать («опасное соединение SSL/TLS. Если это вас устраивает, то можете в этой же директории выполнить команду на создание сертификатов и их установку в системе: # make cert В процессе выполнения данной операции необходимо ответить на несколько вопросов, после чего в директории /usr/local/certs/ появятся два файла: jtapd. pem — сертификат безопасности; ipop3d. pem — просто символическая ссылка «а первый файл. Возможно, уже существует созданный ранее сертификат безопасности (например, при настройке SMTP- или РОР-сервера, как было описано ранее), который требуется использовать с сервером IMAP-UW. Для этого его достаточно просто скопировать в необходимое место под соответствующим именем: # ср /etc/mail/certs/sendmail.pem /usr/local/certs/imapd.pem Затем необходимо позаботиться о запуске соответствующей службы для обслужи- шия клиентских запросов. Службы из набора IMAP-UW запускались и запускаются до сих пор с использованием суперсервера inetd, конфигурационный файл которого уже
482 Глава 15. Работа с почтой (e-mail) содержит необходимые строки (хотя они и закомментированы). Если предполагаете! запускать только сервис IMAP4, найдите и снимите соответствующие комментарии, или просто добавьте строку в файле /etc/inetd. conf: imap4 stream tcp nowait root /usr/local/libexec/imapd imapd Если предполагается запускать и сервис РОРЗ из набора IMAP-UW, то добавьте в вышеупомянутый файл следующую строку: рорЗ stream tcp nowait root /usr/local/libexec/ipop3d ipop3d РОРЗ-сервер ipop3d (из набора) рекомендуется использовать вместо любого другого, установленного в системе. Это связано с тем, что данный даемон перенаправляет все POP-команды серверу IMAP, то есть, они взаимодействуют друг с другом, что позволяет избежать коллизий, а также плавно и без проблем перевести всех пользователей с РОРЗ на IMAP4. После изменения конфигурационного файла /etc/inetd. conf перезапустите даемон inetd и попробуйте подключиться по telnet к порту 143 локального хоста. В случае успешной установки пакета и правильной постнастройки системы должно отобразиться подобное сообщение: OK [CAPABILITY IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS STARTTLS 4>LOGINDISABLED] localhost IMAP4revl 2004.357 at Sun, 25 Sep 2005 4>23:04:05 +0300 (EEST) Если это так, то примите поздравления! На этом общую настройку почтового сервер! можно завершить. Но остается несколько "но". Во-первых, не забывайте, что соединение обязательно защищено сертификатом безопасности. Во-вторых, обычное соединение (не STARTTLS) будет отклонено. В-третьих, имеется возможность использовать для любого пользователя пароль, отличный от системного. Для этого достаточно создать файл /etc/cram-md5.pwd и внести в него список пользователей с их новыми паролями IMAP4/POP3. Даже в случае перехвата такого пароля, доступ в среду по нему будет закрыт. Однако обратите внимание на то, что в данном файле все пароли хранятся в открытом тексте — определите соответствующие права на ограничение доступа к нему: # more /etc/cram-md5.pwd imapusr Iq2w3e skolya #dgR&8$5 Программа IMAP-UW имеет некоторые особенности при работе с почтовым спулон; Это заметят пользователи, которые время от времени по каким бы то ни было причинам используют различные почтовые протоколы для получения корреспонденции. В ихящике назойливо будет появляться сообщение с темой "don|г delete this MESSAGE — FOLDER INTERNAL DATA", KOTOpOe ПрИСуТСТрует у каЖДОГО ПОЛЬЗОЮ- теля, работающего с протоколом 1МАР4 (но получают только пользователи P0P3). Это внутреннее требование самой программы IMAP-UW, которые мы опустим. Но если кому-то кажется, что таким образом его хотят "достать" ©, чтобы он полностью перешел на использование IMAP4, то скажем, что дело совсем не в этом. Просто иепшьзуйте один тип протокола; или РОРЗ или IMAP4. Использование Cyrus-IMAPD Если вы решились на то, что бы установить Cyrus-IMAPD, то придется смириться со многими вещами. Это и использование отдельной базы пользователей, а также пути
Сервер 1МАР4 483 [сообщениям и формату хранения, и жесткая привязка к Sendmail, который становится циностью зависим от данного пакета вплоть до имен почтовых ящиков (для реальных доьзователей системы придется заново создавать ящики во внутреннем формате Cyrus- WAPD), что зачастую является главной причиной отказа от перехода на Cyrus-IMAPD большой организации с настроенной и отлаженной почтовой системой. Последней кашей может также стать невозможность использовать сторонний сервер РОРЗ типа {popper. Если же все перечисленное вас не отпугивает, то можете приступать к освое- мю продукта. В данном разделе мы не будем очень углубляться в подробности установки, на- пройки и конфигурирования продукта, поэтому за дополнительной информацией реко- ендуем обратиться к документации. Установку, как и прежде, желательно выполнить из набора портов в директории /usr/ports/mail/cyrus-imapd22 (на момент написания книги использовалась верви 2.2.12). Также будет установлен пакет Cyrus-sasl2, если он еще не был установки ранее. Во время установки будут изменены некоторые параметры системного поль- ювателя cyrus. После установки в директории /usr/local/etc/ появятся несколько конфигура- ионных файлов, отвечающих за работу пакета Cyrus-IMAPD: cyrus. conf и mapd.conf. Как правило, изменять cyrus.conf не придется — он подходит для Цьшинства случаев, а вот с imapd. conf разбираться необходимо долго и вниматель- ю, Для начала приведем последний упомянутый файл к виду, представленному в листинге 15.15, и выполним следующую команду (создание необходимых директорий и файлов): It /usr/local/cyrus/bin/mkimap reading configure file... i will configure directory /var/imap. i saw partition /var/spool/imap. done configuring /var/imap... creating /var/spool/imap... done Нютинг 15.15. Пример конфигурационного файла /iawr/loc^l/ato/im»pd. conf configdirectory: /var/imap partition-default: /var/spool/imap lievedir: /var/spool/sieve admins: root cyrus jasl_pwchecVp_method: saslauthd iisl_mech_list: cram-md5 plain tls_cert_f ile : /var/imap/server .pem tls_key_f ile: /var/imap/server.pem teject8bit: no iltname space: yes В листинге указан путь к директории, в которой будет храниться информация о Ициках и пользователях (configdirectory), а также другая служебная информация. Параметр partition-default указывает путь, по которому будут храниться папки и иобщения пользователей. Параметр admins позволяет указать пользователей, которым (врешено управлять почтовыми ящиками IMAP-сервера. Параметр reject8bit, принимающий значение по, позволяет не отклонять сообщения с 8-битным набором симво- мв в заголовке. Обратите внимание на используемый метод аутентификации — saslauthd. Этот Метод мы уже применяли при настройке Sendmail на безопасное соединение. А вот (файлами сертификата могут возникнуть проблемы. Создайте их по-новому или скопируйте созданные ранее, но с изменением прав доступа:
484 Глава 15. Работа с почтой (e-mail) # ср /etc/mail/certs/sendmail.pem /var/imap/server.pem # chown cyrus:mail /var/imap/server.pem Как упоминалось ранее, Cyrus-IMAPD работает в связке с Sendmail, полностью ю- меняя поведение последнего. Добавьте в файл /etc/mail/<hostname>.mc следующие строки: define('confLOCAL_MAILER', "cyrusv2')dnl MAILER('cyrusv2')dnl после чего скомпилируйте и установите новый конфигурационный файл с помощью знакомых команд make cf и make install. В принципе, практически все готово к первому запуску сервера Cyrus-IMAPD, но прежде добавим наших пользователей-администраторов и их пароли в базу данных sasl2: # saslpasswd2 -с root # saslpasswd2 -с cyrus Кроме того, для правильной работы пакета необходимо создать символическую ссылку в директории /usr надиректорию /usr/local/cyrus: # In -s /usr/local/cyrus /usr Последний штрих — настройка автоматического запуска соответствующих пакета» при старте системы. Проверьте наличие представленных ниже строк в файле /etc/rc. conf и добавьте недостающие: sendmail_enable="YES" saslauthd_enable="YES" saslauthd_flags="-a sasldb" shlib_dirs="/usr/local/lib /user/local/lib/sas12" cyrus_imapd_enable="YES" После этого необходимо перезапустить сервер. После запуска системы и входа, выполните следующую команду проверки соединения (для удобства, полужирным шрифтом выделены вводимые команды или места, требующие ввода паролей): # imtest -m login -a cyrus -p imap localhost S: * OK mobile.altersys-ua.com Cyrus IMAP4 v2.2.12 server ready С: С01 CAPABILITY S: * CAPABILITY IMAP4 IMAP4revl ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES ANNOTATEMORE IDLE AUTH=DIGEST-MD5 AUTH=CRAM-MD5 SASL-IR S: C01 OK Completed Please enter your password: C: L01 LOGIN cyrus {9} S: + go ahead C: <omitted> S: L01 OK User logged in Authenticated. Security strength factor: 0 Если на экране отобразится текст "OK User logged in", то можно считать, что пакет Cyrus-IMAPD успешно установлен и настроен. Но на этом все не заканчивается. Данный пакет содержит несколько дополнительных утилит по управлению почтовыми ящиками. Наиболее часто придется пользоваться утилитой cyradm. Опишем процесс создания нового почтового ящика для пользователя relay. В первую очередь требуется создать пользователя в базе sasldb и задать ему пароль. Для этого используется знакомая нам утилита saslpasswd2:
Сервер 1МАР4 485 # saslpasswd2 -с relay Password: Again (for verification): # sasldblistusers2 relay@mobile.altersys-ua.com: userPassword { ... } Затем вся работа по управлению возлагается на утилиту cyradm: # cyradm —user cyrus —auth login —server localhost IMAP Password: localhost> cm user.relay localhost> sq user.relay 200000 quota:200000 localhost> quit Поясним применяемые в cyradm команды: ■ createmailbox, cm — создание почтового ящика; ■ deleteaclmailbox, dam — удаление указанного ACL (Access Control List — список управления доступом) из ящика; ■ deletemailbox, dm — удаление ящика; • help — помощь по командам; • listaclmailbox, lam — список установленных ACL; listmailbox, lm — список ящиков; • listquota, lq — установленная квота на ящик; listquotaroot, lqr, lqm — установленная суммарная квота на ящик в целом и процент использования; • quit — выход из утилиты; renamemailbox, renm — переименование почтового ящика; • setaclmailbox, sam — установка некоторого ACL на ящик; • setquota, sq — установка значения квоты на ящик. Для понимания ACL перечислим используемые значения: • 1 (lookup) — пользователь может видеть существование ящика; • г (read) — пользователь может читать ящик, то есть, выбирать его, получать данные, производить поиск, копировать сообщения из него; s (seen) — разрешить устанавливать состояние просмотра (прочтенное/не- прочтенное); • w (write) — пользователь имеет право изменять флаги состояния сообщения, отличные от "Просмотрено" или "Удалено"; i (insert) — пользователь может вставлять новые сообщения в почтовый ящик; • р (post) — пользователь может отправлять почту; с (create) — пользователь имеет право создавать подпапки в ящике, а также удалять или переименовывать текущий ящик; d (delete) — пользователь может устанавливать флаг "Удалено" и запрашивать опустошение ящика; • a (administer) - пользователь может изменять права на ящик. Из-за наличия ACL существует большое количество "подводных камней" при управлении. К примеру, могут возникнуть проблемы при удалении ящика, которые уожно решить следующим образом: # cyradm —user cyrus —auth login —server localhost IMAP Password: localhost> cm user.informex localhost> dm user.informex deletemailbox: Permission denied
486 Глава 15. Работа с почтой (e-mail) localhost> sam user.informex cyrus с localhost> dm user.informex localhost> quit Более подробную информацию об установке, настройке и использованию пакета Cyrus-IMAPD можно найти в документации, которая расположена в директории /usr/local/share/doc/cyrus-imapd/. ИСПОЛЬЗОВАНИЕ FETCHMAIL Fetchmail — это простая утилита для приема почты с удаленных почтовых серверов» передачи ее локальному агенту доставки почты или же для дальнейшей пересылки на другой адрес. Доставленная локально почта может быть прочитана любым почтовым клиентом, работающим со спулом сообщений локального хоста (например, mail, pine или elm). Данная утилита может запускаться как из командной строки, так и работать в режиме даемона, периодически проверяя новую корреспонденцию через определенные промежутки времени. С помощью Fetchmail, клиенты, работающие на FreeBSD и не имеющие средств для непосредственного доступа к своему РОРЗ- или 1МАР4-серверу, могут без проблем забирать всю почту. Установить Fetchmail довольно просто. Как правило, это делают с помощью набора портов в директории /usr/ports/mail/fetchmail/. После установки будет доступна утилита fetchmail с возможностью управления файлом . fetchmailrc, расположенным в домашней директории пользователя. Структура этого файла проста, несмотря на то, что утилита fetchmail имеет широкие возможности настройки. При запуске, fetchmail проверяет права на файл . fetchmailrc и, если они выше 710, прекращает работу с соответствующим сообщением: %/usr/local/bin/fetchmail File /home/informex/.fetchmailrc must have no more than -rwx—x— (0710) permissions. Конфигурационный файл ~/ . fetchmailrc Несмотря на всю простоту конфигурационного файла, необходимо соблюдать множество правил при его составлении. Логически конфигурационный файл можно разбип на три части: глобальные опции, опции серверов и опции пользователей. При этом используется строгий порядок следования определений указанных частей. Глобальные опции В части глобальных опций можно использовать определения, перечисленные в табл. 15.2. Таблица 15.2. Список глобальных опций, применяемых в файле .fetchmailrc Опция Описание set daemon Опция, позволяющая перевести fetchmail в фоновый ре-. жим (даемона) с. периодическим приемом почты через указанные интервалы времени в секундах set postmaster Если получатель не найден,.то в качестве получателя будет использовано имя данного пользователя set no bouncemaii Почта, информирующая об ошибках, будет отправляться пользователю postmaster set no spambounce Пытаться отправлять спам обратно set logf ile Имя файла для хранения ошибок и информационных сообщений
Использование fetchmail 487 Таблица 15.2. Окончание (Опция Описание (Set idf ile Имя файла для хранения .списка идентификаторов rioi^ao- I вателей (set syslog Использовать ays log r*et no syslog Выключить поддержку ayslbg -set properties Данная опция игнорируется fetchmail Перечисленные опции влияют на поведение всех записей в определении серверов и юльзователей. Пример определения глобальных опций: ft запускать проверку каждые 5 минут set daemon 300 # если получатель отсутствует — отправлять почту пользователю root set postmaster root Опции определения серверов и пользователей Вторая часть файла содержит список серверов, на которых будет осуществляться |роверка почты и пользователей. В данной части может применяться множество опций, ю полностью мы их рассматривать не будем — за более подробной информацией общайтесь к справочному руководству по утилите fetchmail. Рассмотрим простой и ииболее часто используемый вариант описания сервера: poll <ИмяСервера> protocol <Протокол> username <Пользователь> password Ч><Пароль> Отметим, что возможна доставка почты другому пользователю с использованием вдующего синтаксиса: poll <ИмяСервера> protocol <Протокол> username <Пользователь> password Ч><Пароль> is <ПользовательСистемы> В одном файле разрешается указывать несколько определений серверов и пользований, например: # получать с сервера mobile.altersys-ua.com poll mobile.altersys-ua.com proto рорЗ # всю почту пользователя oneusercom user oneusercom pass XYZ # всю почту пользователя relay user relay pass ZYX # получать с сервера main.com.ua всю почту пользователя testeron It и передавать в локальный ящик пользователя inform # полученные сообщения удалять с сервера, не использовать DNS poll main.com.ua proto рорЗ no dns user testeron pass YXZ is inform •bfetchall flush # получать с сервера mail.findmeua.isp.net всю почту # с использованием учетной записи mail без изменений для домена # findme.ua poll mail.findmeua.isp.net local findme.ua user mail pass "yZxAxZy" to 4>* here Более подробную информацию о настройке и использовании fetchmail смотрите кправочном руководстве man fetchmail.
488 Глава 15. Работа с почтой (e-mail) ПОЛЬЗОВАТЕЛЬСКИЕ ПОЧТОВЫЕ АГЕНТЫ (MUA) Почтовый агент (Mail User Agent, MUA) — это приложение, которое размещая в очереди SMTP-сервера данные, поступившие от клиента, а также извлекает сообщай из почтового ящика пользователя. Заметим, что почтовые агенты с каждым годом все более совершенствуются и становятся более удобными для пользователей. Более тот их количество намного превосходит количество агентов пересылки почты. Каждый почтовый агент имеет свои характерные особенности: одни позволяют напрямую работать с почтовыми ящиками на сервере, или же по различным протоколам (IMAP или РОРЗ); другие ориентируются на работу в графической среде (evolution balsa), или же для работы в консоли (mail, pine, elm, mutt); некоторые же—это просто Web-интерфейсы к почтовым ящикам. Разброс также касается и операционной системы пользователя. Независимо от операционной системы почтового сервера, клиент выбирает почтовый агент под свою среду. Для Windows-систем наиболее распространены программы Microsoft Outlook, Outlook Express. The Bat. В FreeBSD чаще всего используются программы mail, pine, elm, mutt, evolution, xfmail, mulberry (требует покупки лицензии). Большинство и них (а также и другие) можно найти в коллекции портов в директории /usr/ports/mail. Рассмотрим подробнее работу с некоторыми из них. Программа mail Программа mail — это самый первый вариант почтового агента. Данная утилита. хотя и сложна, является мощным средством приема, чтения и отправки почтовых сообщений. Несмотря на сложность работы с mail и риск случайно затереть любое письмо, большинство администраторов до сих пор используют эту программу как основной почтовый агент. К тому же, в отличие от других почтовых агентов, которые необходимо устанавливать из набора пакетов или портов, mail всегда присутствует в системе сраз; после установки. Ограничение программы — работа только с системными (локальными) почтовыми ящиками, то есть, файлами по имени пользователя в директории /var/mail, а также ограничение при работе с вложениями (при этом для получения такой возможности прежде необходимо установить утилиту из набора портов /usr/ports/converters/ трас к). В действительности, ранее существовало две'постовые* программы: mail и mail* но на сегодняшний день обе имеют одинаковый размер и вызывают одно и то же приложение, и обусловлены только целями обратной совместимости. Заметим также, что приложения /usr/bin/Mall, /usr/bin/mail И /usr/bin/mailx являются жесткими ссылками на один и тот же файл. Утилита mail постоянно следит за содержимым пользовательского файла сообщений и, в случае поступления нового письма, сообщает пользователю о наличии новой почты с помощью строки "You have new mail". Для запуска утилиты и возможности работы с почтовым ящиком выполните простую команду: # mail В результате, будет считано все содержимое почтового файла текущего пользователя и выведено в виде списка: Mail version 8.1 6/6/93. Type ? for help, "/var/mail/root": 3 messages 1 new 3 unread U 1 informex Mon Aug 1 12:55 10/119 "test"
Пользовательские почтовые агенты (MUA) 489 U 2 informex@mobile.alte Mon Aug 1 13:47 22/786 "sample mail" >N 3 informex@mobile.alte Mon Aug 1 13:51 20/814 "TASK: Create •bnew user" & В случае, когда ящик пользователя пуст, файл сообщений пользователя удаляется (поведение по умолчанию), и программа выдаст сообщение следующего вида: mail: /var/mail/informex: No such file or directory или же (если поведение изменено): No mail for informex Для чтения любого сообщения из списка можно просто ввести номер необходимого сообщения или использовать команду t, с номером сообщения в качестве параметра, например: s t з Message 3: From informex@mobile.altersys-ua.com Mon Aug 1 13:51:12 2005 Date: Mon, 1 Aug 2005 13:51:12 +0300 (EEST) From: Olexa <informex@mobile.altersys-ua.com> To: root@mobile.altersys-ua.com Subject: TASK: Create new user please, create user MASTER Priority: HIGHT p/s: ASAP Для просмотра списка сообщений после прочтения письма, необходимо воспользоваться командой h (headers), или же просмотреть следующее письмо в списке с использованием команды n (next). Отметим, что текущее сообщение выделяется в списке знаком ">". Как видно из рассмотренного выше примера, сообщение выводится с ограниченным списком заголовков. Чтобы получить полный список заголовков письма, а также иметь возможность изменить содержимое письма, воспользуйтесь командой е (edit) с номером сообщения в конце, что приведет к вызову текстового редактора vi. Просмотрим результат выполнения данной команды для третьего сообщения (см. пример выше): From informex@mobile.altersys-ua.com Mon Aug 1 13:51:12 2005 Return-Path: <informex@mobile.altersys-ua.com> Received: frommobile.altersys-ua.com (localhost [127.0.0.1]) by mobile.altersys-ua.com (8.13.1/8.13.1) with ESMTP id 1>j71ApC8C021602 for <root@mobile.altersys-ua.com>; Mon, 1 Aug 2005 13:51:12 4>+0300 (EEST) (envelope-from informex@mobile.altersys-ua.com) Received: (from root@localhost) bymobile.altersys-ua.com (8.13.1/8.13.1/Submit) id 4>j71ApCvk021601 for root; Mon, 1 Aug 2005 13:51:12 +0300 (EEST) (envelope-from informex) Date: Mon, 1 Aug 2005 13:51:12 +0300 (EEST) From: Olexa <informex@mobile.altersys-ua . com> Message-Id: <200508011051.j71ApCvk021601@mobile.altersys-ua.com> To: root@mobile.altersys-ua.com Subject: TASK: Create new user Status: 0
490 Глава 15. Работа с почтой (e-mail) please, create user MASTER Priority: HIGHT p/s: ASAP Другой вариант просмотра всех заголовков в теле письма— удалить следующую строку из файла /etc/mail. re (которая и приводит к сокрытию перечисленных в списке ignore заголовков): ignore Received Message-Id Resent-Message-Id Status Mail-From Return- 4>Path Via Для написания ответа на прочитанное письмо необходимо ввести команду R (Reply, для ответа только отправителю) или г (reply, для ответа отправителю и всем остальным, кому было также послано письмо). Также можно в качестве параметра передать номер письма, на которое необходимо написать ответ (полужирным шрифтом выделен текст, вводимый пользователем): & Reply То: informex@mobile.altersys-ua.com Subject: Re: TASK: Create new user Done. User MASTER was created. Didok Olexander. System Administrator. EOT Обратите внимание на завершающую точку в конце письма. Эта точка— управляющая и указывает конец письма. В самом письме ее не будет. Отметим, что управляющая точка должна быть единственным символом в новой строке. Для создания нового письма используется команда m (mail) с перечислением через запятую адресов получателей (также отдельно будет предложено ввести заголовок письма), например (полужирным шрифтом выделены вводимые пользователем данные и команды): & mail inf°ormex@localhost, rootQlocalhost, master@localhost Subject: LOW: Test Test message only EOT Для удаления письма используется команда d (delete) с указанием номера письма, которое необходимо удалить. Заметим, что удаление письма не изменяет порядковые номера сообщений до выхода из программы. Таким образом, если удалить третье письмо из шести, то при просмотре заголовков писем в списке будет отсутствовать именно третье письмо. Но если выйти из утилиты mail и зайти снова, то все номера писем после удаленного будут изменены. К слову, можно удалять несколько писем одновременно, указав номера первого и последнего письма через дефис, например (полужирным шрифтом выделен текст, вводимый пользователем): # mail Mail version 8.1 6/6/93. Type ? for help. "/var/mail/root": 5 messages 1 new 5 unread U 1 informex@mobile.alte Mon Aug 1 15:50 21/7 93 "TASK: Create 4>new user" U 2 informex@mobile.alte Mon Aug 1 16:00 21/848 "Re: TASK: 4>Create new "
Пользовательские почтовые агенты (MUA) 491 U 3 informex@mobile. U 4 informex@mobi.le. •^Create new " >N 5 informex@mobile. S d 2-4 S h U 1 informex@mobile, %>new user" >N 5 informex@mobile ,alte ,alte .alte ,alte .alte Mon Mon Mon Mon Mon Aug Aug Aug Aug Aug 1 1 1 1 1 16: 16: 16: 15: 16: 01 01 :08 :50 :08 19/790 19/831 19/796 21/793 19/796 "test message "Re: TASK: "LOW: Test" "TASK: Create "LOW: Test" Подобно тому, как это делается при удалении, разрешено указывать последова- цльный список для просмотра писем с помощью команды t (например, & t 1-4). Полный список спецификаторов перечислен в табл. 15.3, а примеры использования «редставлены в листинге 15.16. Таблица 15.3. Список спецификаторов, используемых в качестве аргументов команд утилиты mail •Спецификатор Описание Текущее сообщение Сообщение с номером п Последнее сообщение Следующее сообщение Предыдущее сообщение Все сообщения Диапазон сообщений, от п до m Сообщения, со строкой string в теме Сообщения, в имени адресата которых присутствует строка username Где t принимает одно из следующих значений: п (новые сообщения), о (старые), г (прочитанные), и (непрочитанные). Цистинг 15.16. Пример использования различных спецификаторов (команда f позволя* £ ет вывести список писем, удовлетворяющих заданному условию) I mail Hail version 8.1 6/ Vvar/mail/root": 4 U 1 informex@mobi U 2 informex@mobi informex@mobi informex@mobi n-m /string username ,:t U 3 >N 4 ( f . >M 4 t f г и l (f $ N 4 ( f - U 3 I f + N 4 informex@mobi ( f 2-3 2 informex@mobi informex@mobi informex@mobi informex@mobi informex@mobi informex@mobi U U I f и и >u informex@mobi informex@mobi informex@mobi 6/93. Type ? for help. messages 1 new 4 unread le.alte Tue Aug 2 13:09 250/26876 le.alte Tue Aug 2 13:10 297/27993 le.alte Tue Aug 2 13:11 386/31222 le.alte Tue Aug 2 13:13 296/27993 le.alte Tue Aug 2 13:13 296/27993 le.alte Tue Aug 2 13:09 250/26876 le.alte Tue Aug 2 13:13 296/27993 le.alte Tue Aug 2 13:11 386/31222 le.alte Tue Aug 2 13:13 296/27993 le.alte Tue Aug 2 13:10 297/27993 le.alte Tue Aug 2 13:11 386/31222 le.alte Tue Aug 2 13:09 250/26876 le.alte Tue Aug 2 13:10 297/27993 le.alte Tue Aug 2 13:11 386/31222 "mpack testl" "my foto" "my new music *)" "RE: ps cannot run" "RE: ps cannot run" "mpack testl" "RE: ps cannot run" "my new music *)" "RE: ps cannot run" "my foto" "my new music *) " "mpack testl" "my foto" "my new music *) "
492 Глава 15. Работа с почтой (e-mail) Листинг 15.16. Окончание N & f и и и >N & f и и & f Б f и и Б f > £ f О О 4 informex@mobile. inf 1 informex@mobile. 2 informex@mobile, 3 informex@mobile, 4 informex@mobile, /my 2 informex@mobile, 3 informex@mobile, : П 4 informex@mobile. :o 1 informex@mobile. 2 informex@mobile. 3 informex@mobile, :r 2 informexSmobile. 4 informexSmobile. :u 1 informex@mobile, 3 informex@mobile. .alte . alte .alte .alte ■ alte ■ alte .alte .alte .alte .alte .alte .alte .alte .alte .alte Tue Tue Tue Tue Tue Tue Tue Tue Tue Tue Tue Tue Tue Tue Tue Aug Aug Aug Aug Aug Aug Aug Aug Aug Aug Aug Aug Aug Aug Aug 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 13: 13: 13: 13: 13: 13: 13: 13: 13; 13: 13: 13: 13: 13: 13: :13 :09 :10 :11 ;13 :10 :11 :13 :09 :10 :11 :10 :13 :09 ill 296/27993 250/26876 297/27993 386/31222 296/27993 297/27993 386/31222 296/27993 250/26876 297/27993 386/31222 297/27993 296/27993 250/26876 386/31222 "RE: ps cannot run' "mpack testl" "my foto" "my new music *)" "RE: ps cannot run" "my foto" "my new music *)" "RE: ps cannot run" "mpack testl" "my foto" "my new music *)" "my foto" "RE: ps cannot run" "mpack testl" "my new music *)" Для выхода из программы mail используется команда q (quit, выход с сохранением сообщений в файле mbox, который находится в начальной директории пользователя и хранит прочитанные, но не удаленные сообщения) или х (exit, выход без внесения каких либо изменений). В любой момент можно воспользоваться подсказкой, вызвав ее командой ? (help). Относительно порядка чтения файлов перед запуском программы mail скажем следующее. В первую очередь считывается содержимое файла /etc/mail. re. Данный файл содержит определения для некоторых переменных программы и описывает глобальное поведение утилиты mail. После этого программа mail считывает данные из пользовательского конфигурационного файла .mailrc, расположенного в домашней директории пользователя. В данном файле хранятся установки начального режима отображения, список псевдонимов, а также некоторые команды управления. Почтовый агент elm Несмотря на свою популярность, время почтового агента mail проходит. Теперь среди консольных приложений все больше начинают использоваться программы с так называемым интерактивным экранно-ориентированным интерфейсом. К таким программам относится и elm. Для установки elm проще, быстрее и надежнее воспользоваться набором портов. Для этого необходимо перейти в директорию /usr/ports/mail/elm/ и выполнить команду make install clean. Во время установки будет задано множество вопросов по конфигурации программы, но для большинства пользователей подойдут ответы, предоставленные сценарием настройки по умолчанию. После установки будет доступна команда elm. Во время первого запуска будет задано еще несколько дополнительных вопросов для создания директорий ~/ . elm/ (для хранения конфигурации и псевдонимов) и ~/Mail/ (для хранения почты). Программа elm может работать в нескольких режимах. В первом режиме (самом простом) пользователь указывает в качестве параметров тему письма, адрес получателя и передает на вход программы некий файл, содержимое которого будет доставлено адресату: % elm -s "ELM: Test Letter Simple" root@localhost < -/letter to root
Пользовательские почтовые агенты (MUA) 493 Sending mail... % В результате пользователь root получит письмо следующего содержания (пример дя программы mail): From informex@mobile.altersys-ua.com Wed Aug 3 18:04:04 2005 From: Olexa <informex@mobile.altersys-ua.com> Subject: ELM: Test Letter Simple To: root@mobile.altersys-ua.com Date: Wed, 3 Aug 2005 18:04:03 +0300 (EEST) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hello from informex. Simple test message. Второй режим использования программы elm — это так называемый режим "Send inly" ("только отправка")- Данный режим позволяет только написать письмо (и отпра- 1пъ), а также вложить несколько файлов. Отметим, что для входа в режим "Send only" еобходимо просто указать в качестве параметра тему письма или адрес получателя шкто не мешает указать одновременно и тему, и получателя), или же просто параметр S, Рассмотрим соответствующий пример (полужирным шрифтом выделен вводимый ользователем текст, в фигурных скобках указаны комментарии): % elm -a "ELM: Test Letter" Send only mode [ELM 2.5 PL6] To: root@localhost Subject of message: ELM: Test Letter Send Only Copies to: informex@localhoat Invoking editor... ( нажать клавишу <i> для перехода в режим вставки текста в vi } Send only mode test message { нажать клавишу <ESC> затем написать :wq для сохранения и выхода } /tmp/snd.51933: 1 lines, 28 characters. Send Message T)o: root@localhost C)c: informex@localhost B)cc: Slubject: ELM: Test Letter Send Only R)eply-to: Select letter of header to edit, "e" to edit the message, 'a' to make attachments, 'y' to send message, or 'n' to cancel. Send the message now? у Для отправки письма можно нажать <Enter>, однако предположим, что требуется южить несколько файлов. Для добавления вложенных файлов необходимо нажать ивишу <А>, как и написано в строке помощи (окно программы будет рассмотрено не- яого позже). В результате на консоль будет выведено окно вложений (рис. 15.11).
494 Глава 15. Работа с почтой (e-mail) Message attachments Screen [page 1/1I 1 [main message! - Current flttachnent n Message 1 FHle t'.iie ; [*= Oontent Type ■ Cot te-)t Elncoding . Coitent De(s)criptioT ■ Content Dis(p)ositicn : Make selection: j/k = cb Vup, +/- - dovrv/up pag~e,v or eiter selection rin. Then a)dd after or djelete the selection. ? *, help. Th$n qluit when done. Command: Bl Рис. 15.11. Окно вложений программы elm Для добавления вложенного файла необходимо еще раз нажать клавишу <А>, что приведет к появлению второго пункта в списке вложений с названием [new attachment], а курсор будет переведен в поле F)ile Name:. Можно вручную ввести полный путь к файлу, но проще всего вызвать встроенный браузер файлов, введя путь к некой директории (например, к /) и нажав <Enter>. На рис. 15.12 изображен браузер файлов, где в качестве текущей выбрана директория /var/ spool /obex и выделен файл с именем serYOGA.jpg. Directory: /var/spool/obex type file file file file file file file file file file file size date 13207 64 66 76 i2601 955705 131388 10904 46947 640S8 3082 Select File to Attach [page 2/2J Pattern: « 05-Juii-17 05-Jun-19. 05-Jun-16 05-Jun-17 05-JunTl7 O5-Jun-20 05-Jun-28 05-Jan-17 05-Jun-20 0b-Jun-20 05-Jun-17 filename Ppk.mid Rakhunok.vcf UMC-'Infom.vcf Uap.Russkiy.ocf VMIRE.MID Video(l).3gp govori tmoskva2.wav nochnojdozor.mid ozerov. " ■ serVOGH.ioq wvint_spiashscreen_icq1. gi Г Move the highlighted selection: j/k = down/up, +/- - clown/up page Press ENTER to make selection, ? for help,, or q)uit. Command: I Рис. 15.12. Окно просмотра списка файлов для вложения Для вложения выделенного файла просто нажмите <Enter>. На рис. 15.13 показан результат операции вложения файла. Как видим, автоматически был определен MIME- тип файла. Если необходимо изменить любое из полей, то просто нажмите клавишу символа, обозначенного в любой строке описания вложения символом закрывающей скобки ")". Например, нажатие клавиши <S> дает возможность редактировать описание содержимого текущего вложения.
Пользовательские почтовые агенты (MUA) 495 Message Attachments Screen' [page 1/11 1 [main messa el* 2 serVOGR.i"o base64 imaae/ioea JPEG image data JHh ... 't—-—'— Current Attachment -, — ,F)ile Name . /var/spool/obex/serYOGH.jpg Oontent Type image/jpeg Content Elncoding ■ base64 . - , Content De(s)cription JPEG image d,ata. jriF standard 1.02, Content Disposition . attachment; filepawre^.'serVOGA. jpg" Hake selection: j/k = down/up. */- * down/up page, or enter selection num. Then a)dd after or d)elete the selection. ? =[he-le- Then q)ui t when-done. Conraand: 51 Attachment has been added to this Message Рис. 15.13. Окно вложений после вложения нового файла Можно повторить операцию вложения файла. Когда все необходимые файлы будут прикреплены к письму, просто нажмите клавишу <Q> или <Enter> (так как выход — это операция, выбранная по умолчанию). Для отправки письма и выхода из программы следует нажать клавишу <Y> или <Enter>. При успешной отправке будет выведено сообщение "Sending mail...", а в случае ошибки (например, если невозможно закодировать вложение)— сообщение о невозможности выполнить операцию. В таком случае исправьте ошибку или же нажмите клавишу <N> для выхода из программы без выполнения отправки. Как видим, создавать письма с помощью программы elm — одно удовольствие, мы рассмотрели. Переходим к третьему режиму работы. Именно в данном режиме предоставляется доступ ко всем возможностям почтового агента elm: чтение и удаление старых писем, написание и отправка новых. Запуск элементарно прост: # elm Другими словами, достаточно просто вызвать утилиту без каких-либо параметров. В результате на консоль будет выведено главное меню программы (рис. 15.14). В первой строке отображается справочная информация: файл сообщений (или директория), количество писем в ящике и версия программы. Затем отображается список сообщений (количество сообщений зависит от настроек консоли или терминальной программы), потом — список доступных команд и поле для ввода команды. В списке сообщений активным считается сообщение, выделенное подсветкой (или таком стрелки при соответствующих настройках). Каждая строка разбита на пять полей. В первом поле отображается информация о состоянии данного сообщения. Оно может быть пустым (письмо прочитано, других манипуляций не выполнялось) или содержать список символов: N— новое сообщение. О— старое сообщение. D— удаленное сообщение, и — сообщение высокой важности. Следующее поле— номер сообщения для возможности быстрого доступа. Эта возможность полезна при восстановлении случайно удаленных писем, так как письмо, помеченное как удаленное, невозможно сделать активным с помощью команд перемещения, перечисленных в списке доступных команд (j и к). Для перемещения по удаленным сообщениям используется комбинация mix клавиш в сочетании с клавишей <Shift> (или активировав режим "Caps Lock"). Перед номером может стоять символ "+", который информирует о том, что данное сообщение помечено. В третьем поле находится дата отправки. Четвертое поле информирует
496 Глава 15 Работа с почтой (e-mail) об отправителе данного сообщения. Пятое поле содержит число строк (учитывая скрытые по умолчанию строки в заголовке письма), а шестое поле — тему письма. Mailbox is Vver/mail/.root' with 6 messages [ELM 2.5 PL6I N D 0 N N 1 2 3 *4 Ь 6 fluj 04 Puj 04 ft a 04 Pll! 04 Пиа 04 Rug 04 Olexa Olexa 01e-a Cierlie Root Charlie Root Olexa (1216) ELH: Test Letter (906) ELH: Test Letter (240) ELH: Test Letter Seid Only 139 mobile.ailters s-ia.com securit n 71) mobile.altorsvs-im.com daily rune (899) test Vou can use eny of tSe following conwanc's by pressing the'first'character; d)elete or u)nclelete mail, n)ail a message, r)eply or f)orward mail, q)uit To read a message1, press <retirn> j = move down, k = move up, ? = help Command: I Рис. 15.14. Главное меню почтового агента elm Для чтения активного сообщения следует просто нажать клавишу <Enter> (для чтения письма с отображением всех заголовков используйте клавишу <h>). Для просмотра или изменения опций программы нажмите клавишу <о>. Для получения справки по командам нажмите клавишу <?>, после чего нажатие любой клавиши будет комментироваться у нижнего края консоли. Если нажать еще раз клавишу <?>, то на экран будет выведен список всех команд. Наиболее часто используемые команды перечислены в табл. 15.4. Таблица 15.4. Список команд, используемых в меню программы elm Команда <Enter>,<Пробел> <NUMBERXEnter> / // > < а Ь С Описание Прочитать текущее сообщение Выход в оболочку Повторное считывание содержимого почтового ящика Режим справки Переход на следующую страницу Переход на предыдущую страницу Быстрый переход к первому сообщению в списке Быстрый переход к последнему сообщению в списке Переход к сообщению с номером <number> Поиск по шаблону в строках from/subject Поиск по содержимому писем во всем ящике Сохранение выделенных сообщений во внешний файл (с удалением из ящика) Поиск сообщений по дате Переход в режим редактирования списка псевдонимов Повторная отправка письма (forward) Скопировать выделенные сообщения во внешний файл (без удаления) Удаление текущего сообщения Удаление сообщений, соответствующих заданному шаблону
Пользовательские почтовые агенты (MUA) 497 Таблица 15.4. Окончание Команда Описание л Редактирование файла сообщений f Перенаправить сообщение (forward) g Групповой ответ всем получателям текущего письма Ь Показать сообщение со всеми заголовками J Переход к следующему сообщению в списке j, < i > Переход к следующему не удаленному сообщению в списке к Переход к предыдущему сообщению в списке к, < т > Переход к предыдущему не удаленному сообщению в списке 1 Фильтрация списка сообщений по шаблону "1 Обновление экрана л Написать сообщение п Прочитать текущее сообщение и перейти к следующему в списке, сделав его активным о Перейти к редактированию параметров программы Р Напечатать текущее или все помеченные сообщения <\ Выход из программы с запросом на удаление или сохранение сообщений С Быстрый выход, без каких либо вопросов г Написать ответ (reply) на текущее сообщение s Сохранить текущее или помеченные сообщения во внешний файл : Пометить сообщение для последующего выполнения операций над ним (или группой помеченных файлов) ЛТ Пометить все сообщения, соответствующие шаблону и Восстановить текущее удаленное сообщение "и Восстановить все удаленные сообщения по указанному шаблону х, AQ Выход с запросом на сохранение it Немедленный выход без каких либо запросов Несмотря на то, что утилита elm сегодня используется довольно редко, ее все-таки имело смысл рассмотреть, поскольку практически все интерактивные экранно- ориентированные почтовые агенты взяли за основу именно ее — в том числе и рассматриваемые далее программы pine и mutt. Работа с программой pine Почтовый агент pine (Program for Internet News and Email) — это, наверное, самое лростое и удобное средство для работы с почтовыми сообщениями, которое при этом обладает широкими функциональными возможностями. Хотя данная утилита и не поставляется вместе с системой как mail, она может быть установлена еще на этапе установки системы с использованием набора пакетов (если используется не mini-install CD аеэ набора пакетов), или же после установки с использованием набора портов. Последний вариант наиболее предпочтителен с точки зрения безопасности и актуальности версии. 1АРУ СЛОВ О БЕЗОПАСНОСТИ. Был момент, когда в программе pine была обнаружена серьезная проблема безопасности, которая позволяла с помощью специального письма выполнить от имени локального пользователя системы произвольный исполняемый код. Данная проблема устранена, но никто не гарантирует, что подобные уязвимости не могут быть обнаружены и в дальнейшем.
498 Глава 15. Работа с почтой (e-mail) В настоящий момент используется четвертая версия программы pine. Для установки ее из набора портов необходимо перейти в директорию /usr/ports/mail/ pine4 и выполнить сценарий установки make install clean, после чего программ! будет доступна для использования. Запуск осуществляется с помощью простой команды # pine При первом запуске на экране отображается страница приветствия с кратким вступлением и просьбой отправить анонимное сообщение для возможности ведения статистики о приблизительном количестве пользователей (рис. 15.15). Для отправки сообщения нажмите клавишу <Enter>, для игнорирования отправки и перехода к главному меню нажмите клавишу <Е>. ПТжТГб! BRCb"flNG"tEXT No Messages 1 «<Г is» res~age till appear only о -e»> Welcere to Pinefv » Program for Internet to s a*d Erail' I'e hope you will ^xplore Pine's rary'capabilit "<«:. Fron lie H.'i rs-iu select Setup/Cor fig to see, mery of fie options av.a^lable to yo*0 P1 о note fiat all streets have conte t—ser itive help text available. ^•ErJ'L REQUEST. Tris software is r4de a«.ilc>4e vrldrwid* as. a p blic к- ice of tSe University of Washington iri Seattle. In or^er to justify corf ig developioent it is helpful Jo' rave an- id«»a of hoy nany pe»ple are u irg Pine. Pre you willing to be counted as a Pine user? Presing ,' "leturr. vill send aia^iymo s (meeni 3, your real ela'l aidre^s t»ill rot be reveajed) Message to the Pine development team at 'the University of' Washington for purposes of tallying. 1 f Pine is a tradenark of fhe AJniversity 6f Washington,' 8 [ALL of (rretinc text] Help E Exit this greeting . - PrevPage Й Print, \ie\ [Be Counted?! S. NextPa*ie Рис. 15.15. Окно приветствия почтового агента pine, отображаемое при первом запуске программы После этого (и при последующих запусках программы) будет отображено главное меню (рис. 15.16). Для перемещения по пунктам меню используют клавиши управления курсором или <Р> (предыдущий пункт) и <N> (следующий пункт). Окно программы состоит из информационной (статусной) строки в самом верху, рабочего окна и строки с информацией о клавишах. Главное меню позволяет войти в справочную систему, быстро написать сообщение (с помощью простого текстового редактора pi со), просмотреть список входящих сообщений, список почтовых директорий и их содержимого, отредактировать адресную книгу, настроить опции программы и выйти из почтового агента. Все эти операции можно выполнить с помощью клавиатурных сокращений, отображаемых у нижнего края окна. Изучение работы с программой pine не должно ни у кого вызвать особых проблем. Как видно из рис. 15.16, программа имеет простой и удобный интерфейс, что делает честь команде Вашингтонского Университета, добившейся поставленной перед собой цели упрощения работы со своим почтовым клиентом.
Пользовательские почтовые агенты (MUA) 499 f PINE t j i 61 7 С I L Й S Q MMN MENU -HELP со po e H**aqGE fCSS'tE I ill 8 FOLDER LIST ADDRE S ВПК S TUP QU T ""older: INBOX 33 Messages Get help u in] Pine Corpose aid serd a res,sage View r- — ;ges in с rrent folder Select a folder to view Upc'ate' a» 're s book Сог'Чдиге Pii e Op^io s. Lee e t4e Pi Ve progran Copyright 1989-2004. PINE is a tra/ane к of the Univ-rsi^y of Wa ' "igton. [Folder "INBOX" ODened with 33 messaaes] ? Help . P PrevCnd R RelNotes 5 OTHER CMDS S IListFldrsl N r'e« f\d k KBLock . Puc. 15.16. Главное меню программы pine Несколько слов о mutt и evolution Помимо рассмотренных ранее почтовых клиентов, существует множество альтернативных. Если это касается консольных утилит, то они в той или иной мере сочетают возможности рассмотренных ранее почтовых агентов. К таким можно отнести и про- фамму Mutt. Несмотря на его популярность в настоящее время, рассматривать данный продукт мы не будем, поскольку он очень похож на Elm и Pine. Установить его можно из набора пакетов или с помощью дерева портов из директории /usr/ports/mail/ 7j-.t./. Достаточно интересным может оказаться изучение "продвинутых" почтовых клиентов, использующих графический интерфейс. Наиболее популярным среди пользова- клей операционной среды 1'reeBSD является почтовый агент Evolution, разработанный •зя среды Gnome. Данный продукт удобен при чтении и создании новых писем, ведс- лш адресной книги и списка задач и др. Для тех. кто раньше пользовался Microsoft Out- bok, программа Evolution покажется наиболее подходящей, поскольку она имеет подобные функциональные возможности и подобный интерфейс. Чем примечательна Evolution? По утверждению разработчиков эта утилита: имеет расширенные возможности поиска; защищена от вирусов и "червей"; позволяет принимать почту с разных серверов и хранить в отдельных нанках: совместима с протоколом LDAP; интегрируется с Рабочим столом; поддерживает плагины; позволяет создавать пользовательские фильтры; использует плагин антиспама, работающий по методу Баеса; позволяет использовать средства шифрования и много других возможностей. Внешний вид интерфейса Evolution показан на рис. 15.17. Как правило. Evolution сганавливается вместе со средой GNOME. Если в системе отсутствует пакет Evolution, и можно установить с помощью дерева портов — сценарий установки находи гея н директории /usr/por-s/mai i/evolu-ion/. Дополнительную информацию о пакете
500 Глава 15. Работа с почтой (e-mail) Evolution и его возможностях можно получить на домашней странице проекта http://www.gnome.org/projects/evolution/. ■JL I vclutl«n - Mail З^Гпх (la E<t> Vi« £ctioni bob s**rch title [2f u*n ■»■ n Sand / Rtcwva Pfe^, QtaiS8o<&© SB Reply Reply toAl Forward jurk Notjurfc Cancel Previous Н«Л Q **•* 1Э»Ы, 9 <jnr««d Subject or Sander eonUru & On I hie Computer ^ «pool fj.ciTbrmo* pop П orveuMTcem pop QreUypop Ojunfc Qgdm f*~lnfarm«x L] oneuie> com CD relay (1) <l r.i ^ CoriUdi 0 '"Ь [»*) Calendars L^ Exchange сз|ф|о| Subject Kail Delivery Subsystem <HA... Returned maib коя transcript... 2:24 PM MailDaWerySubsyrtem-tMAILE . Returned mat se* transer** for det 5:27PM FETCKMAIL-DAEMON@mobl«.ak... ratdvnail authentication faded on г.- &M РМ FETCHMAJL-OAEM0N©mob*i.** fatchmail authentication faded on г.. 3:10 PM Rot Коде». -ПХ Subject Da*. Дмкум, Рлсмих Пастор нов мо5 T/f*KC тел. I т*я. ( а-аш.1 Sent | Ловр I 1^ tie E<ft Form* Jtfew (ni«rt Socurty & Ф ^ * S*nd Attach Undo Redo EU (S I @) Find Rap] лее From; Oil» <fOOt©*fc*r»ys-ujLCom> Signature: Autogenoraced To; I I Igor Shyia <rdXXOC".©rn*tru: Sutyecb I Re. Кодек tO т Normal ;| !н1 [а] В в a pEl a ; еЗ В Zavxdy rady dopomogty ")| Sn Tut, 2005-09-27 at 17 17 +ЭЭ0Э. Igor Shyika wrotar * Ачкун, эдоя* С-овОг* > r-«rt« basJ*4 СЛ»Гос№'/в1Н1 ' * Пастор lrco ttitea >n.^ -ЯГ - Jew» (ЗН1Ю11П IG4!) > »*>15 «X LW > t ♦ok- XX < - n»Blo > Ttr 4%X Л Kill! > re-n ихх 1озлич1 t- Show fcttacrrrter* Bar ldrr»att*chm^^harej Ji Рис. 15.17. Внешний вид программы Evolution АЛЬТЕРНАТИВЫ SENDMAIL Sendmail — несомненно, прекрасный почтовый сервер, но даже он имеет ряд недостатков. Да даже если бы их и не было, оставаться единственным продуктом для реализации тех или иных возможностей в UNIX-системах сложно. Самые значительные недостатки Sendmail: сложность ведения конфигурационного файла sendmail.cf, а для упрощения работы с ним используется непонятный язык макросов т4; большая громоздкость, значительное потребление ресурсов и малая скорость обработки. По этим или иным причинам были написаны другие "почтовики". Наибольшей популярностью и доверием среди них пользуются Postfix, Exim и QMail. Почтовый сервер Postfix начал довольно быстро отвоевывать рынок у Sendmail. Его преимущества— высокая скорость работы, простота конфигурации, модульность, а также возможность "прозрачной" замены им штатного sendmail. Путь в дереве портов для установки последней стабильной версии — /usr/ports/mail/ postfix/. Данный почтовый сервер рекомендуем к использованию в небольших и средних компаниях. Вторым по популярности после Postfix является Qmail. Данный продукт первоначально разрабатывался как альтернатива Sendmail в области безопасности и скорости
Альтернативы Sendmail 501 работы. Безопасность достигается за счет создания дочерних процессов для выполнения определенных задач, после завершения которых процесс уничтожается. Такое поведе- вие Qmail не всегда находит должную оценку среди администраторов, но при этом необходимо согласиться, что Qmail стал популярным наряду с Sendmail. Данный продукт довольно часто используется крупными почтовыми серверами и провайдерами Internet. Рекомендуем к использованию в средних и больших сетях. Путь в дереве портов — /usr/ports/mail/qmail/. Exim, хотя и находит применение, не является лидером и далеко отстал от "китов". Главное его достоинство — наличие прекрасной и обширной документации (каких-либо других значительных преимуществ обнаружено не было ©). Выбор используемого программного продукта для своего почтового сервера — личное дело каждого администратора. Его необходимо делать не спонтанно, не в результате рекомендаций "продвинутого знакомого администратора", а после личного изучения возможностей и детального их сравнения с поставленными задачами. Желаем читателю успехов в этом непростом деле.
502 Глава 16. Базы данных. MySQL ГЛАВА 16. БАЗЫ ДАННЫХ. MYSQL Базы данных глубоко проникли в нашу жизнь. Сегодня без них невозможно себе представить работу ни одной более-менее серьезной компании и большинства Web-сайтов. Специалисты в области IT-технологий не могли не слышать об Oracle, MsSQL, Paradox, Interbase, FoxPro, MySQL или PostgreSQL. Каждая из этих реализаций баз данных имеют свои преимущества и недостатки. Например, Oracle является очень мощным продуктом, который покрывает практически любую область использования баз данных, но при этом его установка требует больших затрат ресурсов — как по памяти, так и по объем)' занимаемого дискового пространства. Продукт MsSQL офаничен одной профаммноЙ платформой — системой Windows. Однако рынок требует простой, небольшой и межплатформенной реализации баз данных. К таким реализациям можно отнести MySQL. Именно благодаря своей простоте, сервер MySQL приобрел широкое распространение в сети Internet. Сегодня практически нет хостинга без поддержки MySQL, потому что большинство сайтов невозможно создать без базы данных. В данной главе мы вкратце коснемся темы установки и использования сервера баз данных MySQL. СЕРВЕР БАЗ ДАННЫХ MYSQL В первую очередь, вынуждены огорчить тех, кто хочет здесь увидеть полное руководство по установке и настройке БД MySQL, — мы коснемся только установки из портов и кратко опишем первоначальную настройку (большего не позволяют рамки книги). Итак, установку MySQL выполним из набора портов, поскольку это — наиболее простой и правильный вариант. Версия для установки — MySQL 4.1. Во время установки сервера баз данных также будет установлена клиентская часть. Поскольку используются порты, необходимо их наличие в системе. Если набор портов присутствует, тогда переходим в каталог /usr/ports/databases/mysql41-server и выполняем следующую команду: # make install clean Во время установки пакета в систему будет добавлен пользователь mysql и группа mysql. Базы данных по умолчанию хранятся в каталоге /var/db/mysql. Сам пакет устанавливается по умолчанию в каталог /usr/local. После продолжительной установки необходимо создать базу данных mysql. Для этого выполните следующую команду: # /usr/local/bin/mysql_install_db Installing all prepared tables f .- } Затем необходимо установить пароль для пользователя root пакета MySQL. Пользователь root для MySQL — это не системный пользователь, и, по умолчанию, не имеет пароля. Для установки пароля выполните следующую команду: # /usr/local/bin/mysqladmin -u root password 'new-password'
Сервер баз данных MySQL 503 Для автоматического запуска базы данных во время старта системы (и работы в цепом) необходимо внести изменения в файл /etc/rc. conf, а точнее, добавить строку: mysql_enable="YES" Теперь после перезагрузки системы можно увидеть в списке процессов несколько процессов сервера MySQL (/usr/local/libexec/mysqld и /usr/local/bin/ oysqldsafe). Если необходимо запустить базу данных без перезагрузки, просто выполните команду: # /usr/local/etc/rc.d/mysql-server.sh start Главные таблицы базы данных mysql Созданная нами ранее база данных mysql является системной и содержит несколь- ю важных таблиц. В первую очередь нас интересуют следующие три таблицы: db, host и user. Таблица user содержит список всех пользователей и их пароли и привилегии. Изначально эта таблица содержит только пользователя root с паролем, установленным вами ранее, и хостом % (символ процента означает "любой"). Фактически, пользователь root может входить с любого хоста и имеет неограниченные права и доступ ко всем базам данных. Данная таблица также может содержать запись для пользователя %, что позволяет входить любому пользователю с неограниченными правами. Таблица db позволяет определить, к каким базам данных, с каких хостов и каким пользователям можно разрешать доступ. Также в этой таблице определяются привилегии на базы данных (какие операции можно выполнять с доступными БД). Таблица host позволяет расширить доступ к базам данных. Например, если доступ к какой-либо базе данных должен быть предоставлен более, чем одному хосту, тогда следует оставить пустой колонку host в таблице db, и внести в таблицу host необходимые имена хостов. Обратите внимание на то, что все привилегии доступа следует задавать в таблице db для каждого пользователя, а в таблице host только перечислить имена хостов. Сервер читает все таблицы, проверяет имя пользователя, пароль, имя хоста, имя базы данных, привилегии. Если в таблице db привилегии select, insert установлены в 'Y', а в таблице host — в 'N', то в итоге пользователь все равно получит 'Y'. Чтобы не вносить путаницы, лучше назначать привилегии в таблице db. Работа с утилитами пакета MySQL В состав пакета MySQL входит несколько утилит. Перечислим те из них, которые используются чаще всего: mysql — позволяет работать с базами данных; mysqladmin — позволяет управлять сервером; mysqlcheck — позволяет проверять и исправлять базы данных и таблицы во время работы сервера MySQL; myisamchk — позволяет проверять базы данных и таблицы при неработающем сервере; mysql dump — позволяет получить дамп содержимого базы данных. В пакете MySQL существуют и другие утилиты, на которых мы здесь останавливаться не будем. Пример перезагрузки (обновления) всех баз данных с помощью утилиты mysqladmin: # mysqladmin -p reload
504 Глава 16. Базы данных. MySQL Параметр -р позволяет указать пароль пользователя root. Если раннее этому по* зователю был назначен пароль, то без опции -р будет отказано в выполнении команда В случае, если пароль пользователя root забыт, необходимо удалить каталог /vat/ db/myqsl /mysql и заново создать базу данныхmysql, как было описано ранее. Для того чтобы указать имя пользователя, в утилите mysql необходимо использовать параметр -и. Например, для подключения к серверу с именем пользователя root, выполните следующую команду: # mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 to server version: 4.1.15-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Как видим, будет предложено ввести пароль. Для выхода из утилиты mysql используется команда quit. Список возможных к использованию команд в утилит! mysql можно получить по команде help. Все сообщения ошибок и другие журнальные файлы можно найти в каталоге /var/db/mysql. Конфигурация сервера Управление сервером MySQL можно выполнять с помощью дополнительных параметров сервисов, но проще всего это делать через конфигурационный файл my.cnf. Может быть несколько таких файлов — одни задают общую конфигурацию, а другие используются для настройки особых параметров пользователей. По умолчанию, общий файл конфигурации располагается по пути /etc/my.cnf. Также его можно задать через опцию --defaults-f ile=/etc/my. cnf (см. стартовый сценарий mysql-server. sh). Дополнительный файл конфигурации можно задан с помощью опции —defaults-extra-file. Файлы параметров могут содержать строки следующего вида: #comment — строки комментариев — начинаются с символа # или ;. Пустые строки игнорируются. [group] — группа представляет собой имя программы или группы, для которой необходимо задать параметры. Любые параметры или строки, задающие значении переменных, которые указаны после строки группы, будут относиться к названной группе, пока не закончится файл параметров или же не будет указана другая строка группы. option — эквивалент —option в командной строке. option=value — эквивалент —option=value в командной строке. set-variable=variable=value — эквивалент —set-variable variable =value в командной строке. Данный синтаксис необходимо использовать для задания переменных mysqld. Отметим, что —set-variable не используется с MySQL 4.O. Использование некоторых типов описанных строк показано на примере файла /etc /my. cnf, представленного в листинге 16.1. Листинг 16.1. Пример файла конфигурации /ato/my. cnf дг<я сервера MySQL # The following options will be passed to all MySQL clients [client] ttpassword = your_password port = 3306 socket = /tmp/mysql.sock
Сервер баз данных MySQL 505 рютинг 16.1. Окончание I The MySQL server Imysqld] port = 3306 socket = /tmp/mysql.sock skip-locking key_buffer •= 16M «ax_allowed_packet = 1M table_cache = 64 sort_buf fer_size = 512K net_buffer_length = 8K read_buf fer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M skip-networking log-bin server-id = 1 [mysqldump] quick max_allowed_packet = 16M Imysql] no-auto-rehash [isamchk] key_buffer = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [myisamchk] key_buffer = 20M sort_buffer_size = 20M read_buffer = 2M »rite_buffer = 2M [mysqlhotcopy] interactive-timeout Благодаря возможности указания файлов конфигурации, можно установить несколько копий сервера баз данных MySQL и использовать для них собственные настройки (порт, сокет и т.д.). На этом завершим краткий экскурс в мир баз данных на FreeBSD. Напоследок отметим, что серьезной альтернативой MySQL на сегодняшний день выступает сервер PostgreSQL, доступный в дереве портов по пути /usr/ports/databases/ postgresqlXX-server, где XX — версия пакета. К слову, FreeBSD поддерживает также работу пакета Oracle, но только при эмуляции операционной системы Linux.
506 Глава 17. Настраиваем Web-сервер ГЛАВА 17. НАСТРАИВАЕМ WEB-CEPBEP Да. Именно тот самый, из-за которого, возможно, читатель и взялся за установку сиси мы FreeBSD. Возможно, кого-то это и разочарует, но такая важная часть системы а Web-сервер отсутствует в стандартной установке. Разработчики системы сочли, ч) пользователь сам должен решить, необходима ли установка Web-сервера, и какой ими но продукт избрать. Несмотря на то, что пакетов для реализации Web-сервера б<щ чем достаточно, наиболее популярным, стабильным и безопасным является Apache. По пулярность Apache обусловлена также и его доступностью в различных операционны системах и поддержкой сторонних пакетов (например, Perl, PHP или SSL) через модул (например, mod_ssl). Сегодня уже невозможно определить, что более популярно: почтовый или Щ сервер — однако без них представить сегодняшний Internet уже практически невозмо» но, хотя Web-серверы появились более, чем через 20 лет после появления почтовых ар веров. На сегодняшний день Web-серверы применяются для решения таких задач, кота рые еще несколько лет назад, казалось, решить с помощью данной технологии невю можно: игры on-line, потоковые трЗ-серверы (кстати, модуль для Apache присутствуе в наборе портов /usr/ports/www/mod_mp3), заказ билетов или товаров в Internet кассах и магазинах... Для всего этого требуется Web-сервер. В настоящий момент сер вер Apache поддерживается группой Apache Group из организации Apache Project, кота рой и был разработан. Заметим, что возник данный продукт как альтернатива первом] Web-серверу NCSA httpd. Это произошло, скорее всего, по причине ухода одного я разработчиков httpd из компании NCSA. Хотя в данной главе основной акцент сделан на Apache, будут также кратко р* смотрены наиболее важные вопросы, выходящие за рамки только этого Web-сервера. Обращаем особое внимание, что на момент написания книги Apache развивала в двух направлениях: поддержка и усовершенствование ветки Apache 1.3 (которая ибу- дет здесь, в основном, рассмотрена), а также разработка и поддержка относительно новой ветки Apache2 (2.0 и 2.1). Заметим, что Apache 1.3 на сегодняшний день являем одной из наиболее стабильных версий и пользуется популярностью у множества полк зователей систем xBSD, Linux, Windows и др. Проект Apache2 многие считают еще в настолько стабильной версией, чтобы всецело доверять ему свой сервер. Выбор за ваш1 ПРОТОКОЛ HTTP Прежде, чем рассмотреть установку и настройку самого Web-сервера, обсудим принципы, заложенные в основу его работы, а точнее — протокол HTTP (HyperText Transit; Protocol — протокол передачи гипертекста). Каким бы сложным ни выглядел Ш сервер или Web-клиент, их взаимодействие организовано по довольно простому протоколу — возможно, даже более простому, чем рассмотренный ранее протокол РОРЗ. Во-первых, команды клиента очень просты и их можно пересчитать на пальцах pji Во-вторых, протокол HTTP сам по себе не предусматривает поддержку аутентификации. В-третьих, протокол HTTP не поддерживает сеансы, и после обработки запри сразу же закрывает соединение. В тот же время следует сказать, что сегодня существуй и используется два стандарта протокола: НТТР/1.0 и НТТР/1.1 (первоначальная верен
Протокол HTTP 507 ПТР/0.9 упразднена и фактически не используется). Второй был расширен и поддер- ивает конвейерное объединение нескольких ответов на различные запросы в один отит. Вторым дополнением в НТТР/1.1 стала поддержка виртуальных хостов, при этом лиентская сторона должна обязательно передать имя хоста в заголовке H6st: сразу же июле запроса (об этом речь пойдет чуть позже). Независимо от версии протокола, обмен происходит по схеме "клиент/сервер". IIначале клиент создает соединение с сервером, а затем отсылает запрос с дополни- гсльной информацией в полях заголовка запроса в MIME-подобном формате и, возмож- ю, — тело сообщения. Сервер на это отсылает ответ, состоящий из строки состояния, волей заголовка ответа и, возможно, — тела сообщения (если запрос не был типа HEAD пли код статуса ответа не подразумевает отсутствие тела). После этого происходит закрытие соединения (в НТТР/1.1 закрытие происходит по прошествии некоторого корот- юго промежутка времени ожидания следующего "связанного" запроса). Рассмотрим пот процесс подробнее. HTTP-запрос Запрос представляет собой строку запроса (Request-Line), поле заголовка, и, возможно, сообщение. Строка запроса состоит из имени метода, идентификатора ресурса (URI) и версии протокола. Имена методов строго специфицированы, но могут быть и расширены: • OPTIONS — запрос информации об опциях соединения; GET — запрос на получение всей информации по указанному URI; HEAD — возврат всей информации о запрошенном URI (как при запросе GET, но без возврата тела объекта; POST — метод, несколько отличающийся от GET, в частности тем, что может по URI возвратить несколько иной ответ, чем ожидалось (это обусловлено отправкой в теле сообщения дополнительных опций); PUT — запрос на сохранение объекта, находящегося в теле сообщения, по указанному URI; DELETE — запрос на удаление ресурса по указанному URI; TRACE и CONNECT — информация о наличии связи с сервером и поддержке протокола HTTP (в новой спецификации НТТР/1.1). Сервер может не поддерживать все указанные методы, но обязательно должен поддерживать как минимум методы GET и HEAD. Запрашиваемый ресурс по URI может быть указан несколькими способами, например, по абсолютному пути или абсолютному идентификатору ресурса URI. Возможно указание звездочки "*", что обозначает обращение непосредственно к самому серверу. К примеру, получим информацию о сервере с помощью метода OPTIONS и протокола НТТР/1.0 (эмулируем соединение с использованием telnet): # telnet localhost 80 Trying 127.0.0.1. . . Connected to localhost. Escape character is 'л ] ' . OPTIONS * HTTP/1.0 HTTP/1.1 200 OK Date: Tue, 15 Nov 2005 10:40:43 GMT Server: Apache/1.3.34 (Unix) Content-Length: 0 Allow: GET, HEAD, OPTIONS, TRACE Connection: close Connection closed by foreign host.
508 Глава 17, Настраиваем Web-сервер При использовании протокола НТТР/1.1 запрос (который в предыдущем примере был выделен полужирным шрифтом) выглядел бы следующим образом: OPTIONS * HTTP/1.1 Host: * Такова, вкратце, структура запроса. Отметим, что в запросе обязательно долина присутствовать строка запроса, а остальные строки не обязательны. Исключение составляет только строка Host: при использовании НТТР/1.1, которая должна следовать непосредственно за строкой запроса. Заметим также, что строка запроса разделяется ш поля символом пробела. Поля заголовка запроса и тело сообщения упоминать не будем. Тем, кто хочет более подробно ознакомиться с этими вопросами, следует обратиться! RFC-1945 (HTTP/1.0), RFC-2068 (НТТР/1.1) или RFC-2616 (пересмотренный НТТР/1.1). HTTP-ответ Для того чтобы рассмотреть HTTP-ответ, в начале создадим запрос GET с исп№ зованием telnet на 80-й порт некоторого Web-сервера. Пример создания соединения, запрос и получаемый ответ представлены в листинге 17.1. Листинг 17.1. Пример формирования запроса к Web-серверу и получаемого ответа г\ # telnet klipov.net 80 Trying 213.227.33.20... Connected to klipov.net. Escape character is ,л]'. GET / HTTP/1.0 HTTP/1.1 200 OK Date: Thu, 03 Nov 2005 13:04:06 GMT Server: Apache/1.3.34 (Unix) Content-Location: index.html.ru.koi8-r Vary: negotiate,accept-language,accept-charset TCN: choice Last-Modified: Thu, 28 Jun 2001 13:06:46 GMT ETag: "45251-631-ЗЬЗЬ2Ье6;43Sf65ec" Accept-Ranges: bytes Content-Length: 429 Connection: close Content-Type: text/html; charset=koi8-r Content-Language: ru Expires: Thu, 19 Nov 1981 08:52:00 GMT <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=koi8-r"> <meta name="GENERATOR" content="Mozilla/4.72 [koi8-r] (XI1; U; Linux 4>2.2.12-20smp i686) [Netscape]"> <title>TecTOBaH страница Apache</title> </head> <body> Если Вы это видите, это значит, что установка Web-сервера Apache на этой системе завершилась успешно. </body> </html> Connection closed by foreign host.
Протокол HTTP 509 Прежде чем рассмотреть HTTP-ответ обратите внимание на то, что сервер сразу же рыл соединение (так как при запросе использовалась версия протокола НТТР/1.0). юмним, что протокол HTTP не поддерживает сессии (это было только что проде- ютрировано на примере). С одной стороны, это плюс в сторону простоты, с другой роны — это накладно для сервера по ресурсам, и с возрастанием нагрузок и увеличе- м количества одновременно работающих пользователей приходится думать об эф- ггивном распределении использования памяти и ресурсов процессора (частично ре- юза счет конвейерного объединения запросов в один в протоколе НТТР/1.1). Итак, HTTP-ответ... Первое, что возвращает Web-сервер,— это строка состояния (us-Line), которая состоит из версии протокола, кода состояния и объясняющей фра- разделенных символом пробела. В листинге 17.1 строка состояния принимает вид ГР/1.1 200 ОК. О кодах состояния и объясняющих фразах будет рассказано немного асе. После строки состояния идут поля заголовка ответа. В различных случаях их коли- тво и принимаемое значение меняется, что зависит от кода состояния, поддерживае- i возможностей, программного обеспечения принимающего участие в работе Web- вера и т.п. Например, из листинга 17.1 можем сделать вывод, что применяется Web- вер Apache версии 1.3.34, кодировка страницы — koi8-r, а размер ответа — 429 байт. После этого (в зависимости от типа запроса) может идти тело сообщения, которое рляется от заголовка ответа пустой строкой (см. листинг 17.1). Более подробная ин- рмация содержится в RFC-1945, RFC-2068 и RFC-2616. Коды состояния При возврате HTTP-ответа в строке состояния указывается код состояния и объяс- ющая фраза. Код состояния позволяет узнать, понял ли сервер запрос и как он его обитал. Объясняющая фраза используется для описания состояния на понятном для че- кка языке. Код состояния — это трехзначное число, первая цифра которого описывавшее ответа. Существует пять классов: 1хх — информационные коды — позволяют проинформировать о том, что запрос был получен, и его обработка продолжается (поддерживаются только в НТТР/1.1); 2хх — коды успеха — запрос был получен, понят и обработан; Зхх — коды перенаправления — для выполнения запроса должны быть предприняты дополнительные действия; 1 4хх — коды ошибок клиента — запрос неправильно сформирован или не может быть выполнен сервером; 1 5хх — коды ошибок сервера — сервер находится в состоянии ошибки, неправильно настроен или не может выполнить правильный запрос Коды состояния и их краткое описание перечислены в табл. 17.1. Таблица 17.1. Коды состояния HTTP (по пересмотренному НТТР/1.1) Описание Клиент может продолжать запрос Предложениепереключитьверсию протокола Запрос был удачно выполнен. Запрос был выполнен, в результате был создан новый объект Запрос был принят для обработки, но обработка завершена не была И Фраза в Continue ) Switching I Protocols К OK M Created К. Accepted
510 Глава 17. Настраиваем Web-сервер Таблица 17.1. Продолжение Код Фраза Описание 203 Non- Информация, возвращенная в заголовке, не является ориги- Authoritative нальной, а была собрана из локальных копий или копий на Information сторонних серверах 204 No Concent Запрос был обработан, но информации для отправки назад нет 205 Reset content Сервер выполнил запрос, и агенту пользователя следует отменить просмотр документа, который инициировал запрос 206 Partial Content Частичное содержимое 300 Multiply Запрошенный ресурс имеет несколько представлений и можно choices использовать любое из них 301 Moved Запрошенному ресурсу был присвоен новый постоянный URI, Permanently по которому и необходимо формировать запросы в дальнейшем 302 Found Запрошенный ресурс временно находится по другому URI 303 See other Ответ на запрос может быть найден по другому URI 304 Not Modified Если был выполнен условный метод GET, то доступ разрешен и объект не изменялся — разрешается использовать кэшированию версию документа 305 Use Proxy Обращение к ресурсу должно происходить с использованием proxy-сервера, указанного в поле Location 307 Moved Запрошенный ресурс временно находится по другому URI. По- Temporarily скольку нахождение по новому адресу— временно, следует продолжать использовать старый URI 400 Bad Request Запрос не понят сервером или имеет ошибочный синтаксис Следует изменить запрос 401 unauthorized Запрос требует установления подлинности пользователя (аутентификации) 402 Payment В данный момент этот код не используется и зарезервирован Required для использования в будущем 403 Forbidden Запрос был принят, но сервер отказывается его выполнить. Причина отказа не указывается 404 Not Found Запрашиваемый объект не был найден 405 Method Not Метод, указанный в строке запроса, не разрешен к использо- Allowed ванию для указанного ресурса 406 Not Acceptable Запрос не приемлем 407 Proxy Требуется установление подлинности пользователя через Authentication proxy-сервер Required 408 Request Timeout Истекло время ожидания для запроса. Клиент не сформировал запрос в течение времени, установленного на сервере 409 Conflict Запрос не был выполнен из-за конфликта с текущим состоянием ресурса (наиболее часто возникает при использовании метода PUT) 410 Gone Ресурс был удален с сервера, перенаправление не указано. Состояние следует рассматривать как постоянное 411 Length Required He была определена длина содержимого, и сервер отказался обрабатывать запрос. Требуется указать длину с помощью поля заголовка Content-Length 412 Precondition Предусловие (указанное в полях заголовка) при проверке ока- Failed залось ложным
Установка Web-сервера Apache 511 №д 413 L «С14 г W 416 W SOO 501 «02 $03 I Ш Фраза Request Entity Too Large Request-URI Too Long Unsupported Media Type Requested range not satisfiable Expectation Failed Internal Server Error Not Implemented Bad Gateway Service Unavailable Gateway Timeout Таблица 17.1. Окончание Описание Сервер отказался обрабатывать запрос, поскольку объект больше, чем предполагалось, или же не может быть обработан URI запроса слишком длинный Объект запроса не поддерживается ресурсом для запрашиваемого метода > Запрошенный ресурс не содержит значения в диапазоне, заданном в поле заголовка запроса Range Сервер отверг предложение, указанное в поле заголовка запроса Expect Сервер не может выполнить запрос по непредвиденным условиям Сервер не поддерживает функциональные возможности, требуемые для успешного выполнения запроса Сервер (работающий в качестве шлюза или proxy) получил недопустимый ответ от следующего сервера в цепочке запросов Сервис временно недоступен из-за перезагрузки или обслуживания сервера Сервер (работающий в качестве шлюза или proxy) не получил i ответа от следующего сервера в цепочке запросов по прошествии допустимого времени ожидания Щ нттр version Сервер отказывается использовать или не поддерживает вер- Not Supported сию. HTTP, Переданную в строке запроса Более подробная информация и описание протокола HTTP может быть найдена sRFC-1945, RFC-2068, RFC-2616, а также на страницах консорциума W3C (http: //www. w3 . org/Protocols/). УСТАНОВКА WEB-СЕРВЕРА APACHE Самым проблематичным вопросом при рассмотрении Apache может быть вопрос его ус- пновки. Если вы изначально не знаете, что вам необходимо, то установка Web-сервера Apache может стать "головной болью". Вернее, установить сам Apache — не проблема, во нужен ли будет вам ТАКОЙ Apache: без поддержки PHP, PERL, SSL и т.п.? Нет? Вот s этом-то и заключается загвоздка, поскольку Apache прославился именно своей мощностью и безопасностью. Но мы начнем по порядку, и рассмотрим вначале самый простой вариант (назовем его, к примеру, "голый Apache" ©). Существует два способа установки: из пакета, который, как правило, входит в состав установочного компакт-диска (такой вариант установки не рекомендуется); установка с использованием исходных текстов Apache — при этом можно произвести сборку и установку как полностью вручную, так и с помощью набора портов (этот вариант наиболее предпочтителен и прост). Итак, заходим в директорию /usr/ports/www/apachel3 и находим там файл tekef ile. Внимательно просмотрите его, в частности, — пункт CONFIGUR.E_AR.GS, который задает основные параметры установки. Возможно, потребуется внести кое-какие вменения. "Но зачем?", — спросите вы.
512 Глава 17. Настраиваем Web-сервер Обратите внимание на то, что некоторые модули не включены по умолчанию на этапе установки, потому выполните следующие команды: # cd /usr/ports/www/apachel3 # make extract # cd work/apache_l.3.34/ # ./configure —help В полученном выводе обратите внимание на следующие строки (особенно на сочетания, выделенные полужирным шрифтом): —disable-module=NAME disable a particular Module named 'NAME' [access=yes actions=yes alias=yes [asis=yes [auth_db=no [autoindex=yes [digest=no [example=no [imap=yes (log_agent=no [log_referer=no [mmap_static=no [rewrita=no [speling=no [userdir=yes auth=yes auth_dbm=no cern_meta=no dir=yes expires=no include=yes log_config=yes mime=yes negotiation=yes proxy=no setenvif=yes so=no status=yes unique_id=no usertrack=no vhost alias=no auth_anon=no auth_digest=no cgi=yes env=yes headers=no info=no log_forensic=no mime_magic=no Модули auth_db и nmapstatic в файле Makefile уже, скорее всего, были включены, а вот модули rewrite и so, в случае необходимости, придется включить самому, Внесите соответствующие изменения в конфигурационный файл установки и приступайте непосредственно к компиляции и установке: # cd /usr/ports/www/apachel3 # make install clean Почти в самом конце установки должно появиться следующее сообщение: + + You now have successfully built and installed the Apache 1.3 HTTP server. To verify that Apache actually works correctly you now should first check the (initially created or preserved) configuration files /usr/local/etc/apache/httpd.conf and then you should be able to immediately fire up Apache the first time by running: /usr/local/sbin/apachectl start Thanks for using Apache. The Apache Group http://www.apache.org/ + В принципе, вас уже можно поздравить: Web-сервер Apache был установлен уо пешно. Дальнейшие действия — настройка и запуск сервера, а также, возможно, установка дополнительных модулей (об этом будет рассказано позже).
Установка Web-сервера Apache 513 Запуск и останов сервера Для автоматического запуска Web-сервера в директории /usr/local/etc/rc.d/ фнсутствует файл сценария apache. sh, который также может использоваться для за- [уска/останова/перезапуска процессов сервера вручную в любой удобный момент. Од- ико данный сценарий не будет производить никаких действий, пока в файл jetc/rc. conf не будет добавлена следующая строка: apache_enable="YES" Теперь запуску, останову, перезапуску или получению информации о текущем состоянии будут соответствовать следующие команды: # /usr/local/etc/rc.d/apache.sh start # /usr/local/etc/rc.d/apache.sh stop # /usr/local/etc/rc.d/apache.sh restart # /usr/local/etc/rc.d/apache.sh status Заметим, что исполняемый файл Web-сервера (и, как следствие, все его процессы) взывается httpd (размещен в директории /usr/local/sbin/). По умолчанию, будет впущено шесть процессов, один из которых является родительским, а все остальные — юрожденными от него. Их количество может динамически меняться в зависимости от встроек в конфигурационном файле httpd. conf и загруженности сервера. Родитель- кий процесс никогда сам не обрабатывает запросы, а только порождает дочерние провесы и передает им запрос на обработку. Это связано с тем, что родительский процесс, ак правило, запускается от имени пользователя root, а порожденные процессы — от шени пользователя, указанного в конфигурационном файле httpd.conf и не имеющего никаких прав в системе (как правило, это пользователь www): # ps -axcu I grep httpd root www www www www www 24199 24200 24201 24202 24203 24204 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 2552 2568 2568 2568 2568 2568 1964 1988 1988 1988 1988 1988 ?? ?? ?? ?? ?? ?? Ss I I I I I 11 11 11 11 11 11 38PM 38PM 38 PM 38PM 38PM 38PM 0 0 0 0 0 0 00 00 00 00 00 00 09 httpd 00 httpd 00 httpd 00 httpd 00 httpd 00 httpd Помимо рассмотренного выше сценария запуска apache, sh, присутствующего фактически только в системе FreeBSD, сам пакет Apache содержит собственный сценарий запуска и останова процессов: apachectl (apache control), размещенный в дирек- гории /usr/local/sbin. Этот сценарий не зависит от содержимого файла /etc/ :c.conf, и потому его можно использовать для запуска сервера в конфигурации, когда тематический запуск Apache не производится. Присутствующий в пакете Apache сценарий воспринимает практически те же ко- ванды, что и упомянутый ранее сценарий apache.sh, но с некоторыми отличиями. Впервую очередь, команда status (а также fullstatus) требует наличия программы lynx. Команды start, stop и restart ничем не отличаются от аналогичных команд, рассмотренных выше (разве что отображаемым сообщением о результате): # /usr/local/sbin/apachectl start /usr/local/sbin/apachectl start: httpd started # /usr/local/sbin/apachectl restart /usr/local/sbin/apachectl restart: httpd restarted # /usr/local/sbin/apachectl stop /usr/local/sbin/apachectl stop: httpd stopped
514 Глава 17, Настраиваем Web-сервер Особый интерес представляют команды graceful и configtest. Возможно, после изменения настроек сервера потребуется перезапустить Apache с новыми параметрами. Применять команду restart в данном случае не обязательно, да и не рекомендуется, так как это приведет к останову всех процессов сервера и к прерыванию обработки запросов. Чтобы этого избежать, и используется команда graceful, которая позволяя перезапустить только родительский процесс сервера, а все порожденные процессы будут оставаться запущенными до окончания обработки каждым из них своего запроса: # /usr/local/sbin/apachectl graceful /usr/local/sbin/apachectl graceful: httpd gracefully restarted Если во время внесения изменений в конфигурацию Apache была допущена ошибка, то родительский процесс запущен не будет, что приведет фактически к останову Web-сервера в целом. В результате все это "выльется" в долгие поиски проблемы, в то время как клиенты будут ожидать, что сервер вот-вот запустится. Во избежание этого используйте команду configtest, которая позволяет протестировать новую конфигурацию сервера на отсутствие ошибок без остановки или перезапуска самого сервера,« только после получения положительного ответа производите перезапуск: # /usr/local/sbin/apachectl configtest Syntax OK # /usr/local/sbin/apachectl graceful В случае ошибки команда configtest укажет на место ошибки и выдаст краткое описание причины ее возникновения: # /usr/local/sbin/apachectl configtest Syntax error on line 63 of /usr/local/etc/apache/httpd.conf: Invalid command 'SrverRoot', perhaps mis-spelled or defined by a •^module not included in the server configuration Но ошибки возникнут только после внесения изменений в конфигурационный файл Web-сервера Apache. В данный момент проверим, что пакет был успешно установлен и готов к настройке и использованию. Для этого на локальном хосте при наличии графического интерфейса (система X-Window описана в части IV) попробуйте открыть в Web- браузере страницу по локальному адресу (127.0.0.1 или localhost). Если вы увидели результат, подобный представленному на рис. 17.1, то вас можно еще раз поздравить! Немного о размещении файлов В различных операционных системах схема размещения файлов Apache отличаете! до неузнаваемости — даже при работе в системах Linux (это очень похоже на ситуацию с почтовым сервером Sendmail). По умолчанию, корневым каталогом для Apache является /usr/local. Так, двоичные файлы дополнительных утилит находятся в подкаталоге . /bin (например, htpasswd), исполняемые файлы сервера— в подкаталоге ./sbin (например, apachectl или httpd), модули размещаются в подкаталоге ./libexec/apache, файлы документации (в формате HTML) — в поддиректории . /share/doc/apache,a файлы настроек— в ./etc/apache. Журнальные файлы сервера Apache хранятм в стандартном системном каталоге /var/log в файлах httpd-access . log и httpd- error.log. Особое внимание следует обратить на корневой каталог документов /usr/local/www/data и каталог сценариев /usr/local/www/cgi-bin. Упомянутые пути являются, в действительности, символическими ссылками на каталоги в этой же директории с именами data-dist и cgi-bin-dist.
I Установка Web-сервера Apache 515 L . ■ ' Т*стреая страница чотаноеки Apache - Opara 8.0 Rnal build MBS □ X File Edit yiew Bookmarks loois Help !_J New page i http://127.0.0.1/ - Л. Google search - 66 Если Вы это видите, это значит, что установка ПО веб-гертера Apache на этой системе завершилась успешна Вы можете теперь добавлять содержимое в эту директорию и заменить эту страницу. Вы видите это вместо ожидаемой страницы? Эта страница находится здесь потому что администратор системы изменил конфигурацию этого веб-сервера. Пожалуйста, свяжитесь с лицом, ответсвенным за поддержку этого сервера дпя выяснения ваших вопросов. Apache Software Foundation, автор ПО веб-сервера, которым пользуется 1 администратор этой системы, не связан с поддержкой этой системы и не может помочь Вам разрешить проблемы конфигурации. Документация по веб-серверу Apache прилагается к комплекту ПО. Вы можете свободно использовать пиктограмму, находящуюся ниже, на веб-сервере, использующим ПО Apache. Спасибо за использование Apache! Powered by >*Ч1=»ХЧ.СЗ I—I IE Рис. 17.1. Тестовая страница. Если она отображается, то Apache установлен успешно Хранить Web-данные в подкаталогах директории /usr/local/www никто не заставляет, кроме того, нередко данные хранятся в домашних каталогах пользователей. Этот вариант наиболее предпочтителен при настройке хостинга. В данном случае каждому владельцу домена предоставляется учетная запись в системе, с помощью которой он может управлять по FTP содержимым сайта, сценариями, просматривать журнальные файлы по работе своего домена. Таким образом, например, владелец домена itlipov.net может иметь учетную запись klipovnet, домашним каталогом будет /home/klipovnet, каталогом для хранения Web-данных—/home/klipovnet/ htdocs и т.д. Об этом будет рассказано подробнее при рассмотрении виртуального хостинга. Возможно также установить весь Apache из исходных кодов вручную (или кардинально изменив сценарий Makefile в портах) в некую специфическую директорию (например, /usr/local/apachel), и тогда все файлы (даже журнальные) будут располагаться глубже по иерархии в данной директории. Более того, установив таким образом несколько копий Apache в различные директории, можно получить несколько по- разному настроенных Web-серверов для достижения различных целей на одном сервере. ПРИМЕЧАНИЕ [описанной выше конфигурации копии \Л/еЬ-сервёра Apache, запускаемые одно- ленно, обязательно должны быть настроены на-Обслуживание (Прослушивание) точных портов. О том, как это сделать>1й|(охЗбц|е о настройке Apache в целом и этречь далее. г^>^ >"
516 Глава 17. Настраиваем Web-сервер НАСТРОЙКА Настройка Web-сервера Apache сводится к изменению нескольких текстовых файлов, которые имеют простой формат и структуру. Даже у того, кто впервые столкнулся с настройкой Apache, скорее всего не возникнет никаких проблем. Обычно приходится иметь дело только с одним конфигурационным файлом: httpd. conf. Этот файл хорошо закомментирован и содержит наиболее подходящие для большинства пользователей настройки, однако некоторые строки все равно придется поменять. Если во время настройки была допущена ошибка, то при запуске сервера, как правило, она будет четко описана. Как упоминалось выше, конфигурационные файлы системы находятся в директории /usr/local/etc/apache. При этом во время установки создаются две одинаковые копии каждого из них: рабочая копия файла (та, которую можно изменять) и файл- пример настройки по умолчанию: # Is /usr/local/etc/apache/ access.conf magic access.conf-dist magic-dist httpd.conf mime.types httpd.conf-dist mime.types-dist Два файла: access. conf и srm. conf в данный момент упразднены и, скорее всего, никогда не понадобятся. Если не требуется совместимость со старыми версиями Apache, их можно просто удалить. Упразднение использования этих файлов обусловлено переносом их содержимого в файл httpd. conf. По сути, на сегодняшний день файл httpd. conf можно считать практически "монополистом" конфигурации Web-сервера Apache. Два других файла: mime, types и magic— позволяют задать соответствия между расширениями файлов или их содержимым с типом блока данных (так называемый MIME-тип), который будет указан в HTTP-заголовке Content-Type при отправке клиенту для определения браузером, и принятия решения о его отображении. Файлы *-dist изменять не рекомендуется (да и в этом нет смысла), поскольку при обновлении продукта они будут заменены новыми копиями. Остальные файлы (перечисленные выше) при обновлении или добавлении модулей остаются нетронутыми, и потому нет необходимости всякий раз вносить в них изменения (если это не предусматривает обновление) или настраивать все "с нуля". Всемогущий httpd. conf Главный конфигурационный файл httpd. conf довольно большой, но при этом хорошо закомментирован. Суть файла — в хранении списка директив и их значений. Все директивы можно разбить на несколько групп по различным критериям. Разработчики предпочитают разбивать их по сферам влияния: глобальные — которые влияют на общее поведение Web-сервера; настройки по умолчанию для основного (default) сервера; настойка виртуальных хостов для возможности выдачи различного содержимого в зависимости от запрашиваемого адреса. Мы же по ходу рассмотрения директив будем группировать их по задачам (если это будет возможно). Если вы допустите ошибку и не заметите этого, то при запуске/перезапуске/тестировании получите четкое уведомление о ее наличии и месте возникновения. Рассмотрим список некоторых директив, применяемых в конфигурационном файле httpd. conf , и рассмотрим каждую из них подробнее. srm.conf srm. conf-dist
Настройка 517 Общие настройки сервера Директива ServerName ServerName — директива, которая позволяет задать имя хоста. Таким образом, ори обращении к серверу все относительные ссылки будут строиться на основании данного имени. Заметим, что здесь желательно задать официальное DNS-имя для IP-адреса сервера или DNS-имя хоста в локальной сети, если сервер только для локального использования. Например, если машина с именем fbsd. klipov.net имеет также DNS- имя www. klipov.net (CNAME), то можно записать директиву ServerName в такой конфигурации следующим образом: ServerName www.klipov.net Если директиву не задать, то Apache попытается сам определить ее значение на основании IP-адреса машины, что не всегда приводит к успешному и правильному результату. Обратите внимание на то, что данная директива используется также при виртуальном хостинге (будет описано позже) и позволяет определить настройки для виртуального хоста, имя которого будет получено в заголовке Host: запроса. Директива ServerType ServerType — директива, которая позволяет определить тип запуска сервера. По умолчанию, используется значение standalone, которое рекомендуется не изменять ю избежание проблем с производительностью. Разрешено устанавливать два значения: standalone или inetd. Первое из них указывает на запуск сервера в режиме даемона. В данном режиме сервер должен запускаться из командной строки или сценарием запуска. В режиме inetd сервер запускается для каждого запроса в отдельности с использованием суперсервера inetd, что на первый взгляд безопаснее, однако использовать inetd не рекомендуется из-за его собственных проблем с безопасностью! Пример (и значение по умолчанию): ServerType standalone Директива ServerAdmin ServerAdmin — директива, позволяющая задать адрес e-mail, который будет ука- шваться в страницах ошибок, возвращаемых пользователям (как правило, устанавливается адрес администратора Web-сервера webtmaster@<FQDN>). Напомним, что такой пользователь не обязательно должен присутствовать в системе, достаточно будет в ali- jses-файле почтового сервера установить соответствующий псевдоним. Пример использования директивы: ServerAdmin webmaster@klipov.net Директива ServerSignature Директива ServerSignature позволяет определить поведение сервера при выводе листинга директории, выводе ошибок и в других случаях, когда вывод создается самим сервером Apache, а точнее — показывать или не показывать подпись сервера. В системе FreeBSD по умолчанию данная опция включена с использованием значения On. Другими значениями могут быть Off или Email. Значение Off позволяет отключить установку подписи, а значение Email —добавить к стандартной подписи HTML- ссылку mailto: на значение директивы ServerAdmin. Под подписью сервера в данном случае подразумевается нижняя строка сгенерированной страницы, в которой указаны имя и версия сервера, имя домена из директивы ServerName и номер порта. Пример
518 Глава 17. Настраиваем Web-сервер страницы ошибки при установленном значении Email для рассматриваемой директивы показан на рис. 17.2. ■ Not Found- File Edit View Bookmarks Iools help _J New page . - Not Found The requested URL/123 Apacbe/1.3.34 Server at —— '^ •■ MiMIHnalbuMXOSS http://mobile.altersys-ua. was not found on this server. mobiJe.a.Tersvs-ii ■■Б 1А£2Ш Port BO jAddress: mailto com » Л, <"oogle search : webma5ter@altersy54ja.com | . □ X 6Л Рис. 17.2. Вывод страницы ошибки "404 Not Found" при установленной директиве ServerSignature в значение Email ДиреКТИВа TimeOut Директива TimeOut позволяет задать промежуток времени в секундах, в течение которого сервер ожидает запроса после осуществления соединения, или же продолжения передачи данных после приостановки. По умолчанию, установлено значение 300 секунд, и уменьшать его не рекомендуется: TimeOut 300. Директива user Директива User позволяет задать пользователя, от имени которого будут обрабатываться запросы в режиме standalone. Пользователя можно задавать как по его имени, так и по уникальному идентификатору UID. Обратите внимание на то, что сам Web- сервер Apache, как правило, запускается от имени пользователя root, но установка значения рассматриваемой директивы в root чревата проблемами с безопасностью (мы уже упоминали, что главный процесс httpd не принимает участия в обработке запросов, а запускает для этих целей дочерние процессы). По умолчанию, в системе FreeBSD присутствует непривилегированный пользователь www без домашней директории и рабочей оболочки (фактически, он не имеет возможности делать что-либо в системе), от имени которого и рекомендуется запускать процессы обработки запросов. Другой вариант — использование имени nobody (хоти это и не всегда возможно): User www. ДиреКТИВа Group Кроме директивы User, при запуске сервера от имени root также требуется указывать директиву Group, значение которой задает группу, от имени которой будут выполняться процессы обработки запросов в режиме standalone. Как и при описаний директивы User, можно указывать имя или уникальный идентификатор группы GID. Обратите внимание на то, что если главный процесс сервера запускается от имени пользователя, отличного от root, то значение данной директивы игнорируется. По умолчанию, применяется значение www, также можно применять nobody: Group www. Управление размещением файлов Размещение некоторых файлов и каталогов Web-сервера Apache можно переопределить. Для этого в конфигурации присутствует несколько специальных директив. Одю из них позволяют определить расположение журнальных файлов, другие позволяю!
Настройка 519 тазать путь к специальным директориям, и несколько директив имеют специальное на- шачение (например, указывают, в каком файле будет записан идентификатор главного ipoueccahttpd). Директива ServerRoot Директива ServerRoot служит для указания директории в которой установлен Apache. В системе FreeBSD она, по умолчанию, принимает значение /usr/local. Это йусловлено тем, что все файлы Apache довольно сильно раскиданы в системе, но юльшинство все-таки размещаются ниже по иерархии /usr/local (исключение, шримеру, составляют журнальные файлы Apache, которые размещены в директории /var/log по соглашению о размещении журнальных файлов). Тем не менее, когда «конфигурационном файле в других директивах указаны относительные пути, они бурт относительными для данного значения. Директива PidFile Директива PidFile позволяет указать путь к файлу, в котором будет записан идентификатор главного процесса Apache, запущенного в режиме даемона. Как правило, данный файл используется для останова или перезапуска Web-сервера из сценариев. По умолчанию, файл, содержащий идентификатор главного процесса Apache, находится «стандартной директории системы FreeBSD /var/run, предназначенной для хранения файлов с идентификаторами процессов, и имеет имя httpd. pid: PidFile /var/run/httpd.pid Директива DocumentRoot Директива DocumentRoot позволяет определить местонахождение каталога, «котором хранятся Web-данные (то есть, тот каталог, где будут размещаться доступные через Web-соединение документы). Обратите внимание на то, что во избежание проблем рекомендуется каталог указывать без завершающей косой черты. Благодаря данной директиве, сервер определяет реальное местонахождение запрашиваемого докумен- а. К примеру, при установленном значении: DocumentRoot /usr/local/www/data по запросу страницы http: //www.main.com.ua/tak/nashvybir.html будет отображен файл, который в действительности размещен по пути /usr/local/www/data/ tak/nashvybir. html. Относительно описанного выше примёраГёсг^^яд замечаний. Подкаталог в URL не обязательно должен быть реальным каталогом файловой системы, а уж тем более необязательно размещен ниже па иерархии от значения директивы DocumentRoot. Web-сервер Apache по умолчанию поддёрживает'модуль mod_aiias и его директиву Alias, которая позволяет задавать "виртуальные" каталоги, размещенные в совсем другом месте файловой системы, чем описано директивой; DocumentRoot. К примеру, при наличии следующей строки в конфигурационном файле: Slias /tak /www/maincom/tak реальное местонахождение запрашиваемого файла для вышеописанного примера апроса страницы будет /www/maincom/tak/nashvybir.ntmi (см. также описание директивы ScriptAlias).
520 Глава 17. Настраиваем Web-сервер ПЕРЕНАПРАВЛЕНИЕ СТРАНИЦ В случае использования модуля mod_alias доступно еще несколько полезных директив. Одна из них — Redirect. Данная директива позволяет переместить документы в другую директорию или же вообще на другой сервер, и во время запроса документа по старому адресу автоматически перенаправлять браузер пользователя к месту нового размещения запрашиваемого ресурса, указанного как полный URL К примеру, строка в конфигурационном файле Web-сервера для домена altersys- ua.com: Redirect /services http://main.com.ua/services позволит автоматически перевести браузер пользователя, запросившего ресурс http://altersys-ua.com/services/it.htrtil, на НОВЫЙ адрес ресурса За URL http://main.com.ua/services/it.html. Обратите внимание на то, что перенаправление даже внутри одного домена требует указания полного URL к месту нового расположения документов. Директива ErrorLog Директива ErrorLog позволяет определить расположение журнального файла регистрации ошибок Web-сервера Apache (записываются ошибки как самого Apache, так и ошибки, возникающие при выполнении сценариев). По умолчанию, в системе FreeBSD данная директива принимает следующее значение: ErrorLog /var/log/httpd-error.log Вместо имени журнального файла можно указать внешнюю программу, которой будет передаваться информация об ошибках. Для этого необходимо указать имя сценария с ведущим символом конвейера " | ", например: ErrorLog I bin/errorlog.pi Web-сервер Apache также поддерживает запись ошибок с использованием syslogd (если тот настроен соответствующим образом). Для этого укажите в конфигурационном файле следующую строку: ErrorLog syslog Во избежание проблем с безопасностью, следите за правами доступа к журнальным файлам (можно отключить запись ошибок, указав файл /dev/null). При установленной директиве HostNameLookups (описана в подразделе "Параметры соединения") в значение On, вместо IP-адресов клиентов в файл будут записываться их DNS-имена. УРОВЕНЬ РЕГИСТРАЦИИ ОШИБОК В зависимости от предпочтений, можно указывать различный уровень отслеживания ошибок. В случае использования syslogd необходимо указать желаемый уровень сразу же при описании директивы ErrorLog, например: ErrorLog syslog:err При использовании пути к журнальному файлу желаемый уровень регистрации устанавливается с помощью дополнительной директивы LogLevel. Данная директива может принимать следующие значения: debug (запись отладочной информации), info (информационные сообщения), notice, warn (запись предупреждений), error (запись ошибок), crit (запись критических ситуаций), alert (сообщения, требующие немедленного вмешательства во избежание проблем), emerg (ошибки запуска сервера, требуется немедленное вмешательство). Пример использования: LogLevel warn
Настройка 521 Директива Transf erLog Директива Transf erLog определяет размещение журнального файла, в котором сохраняются все запросы клиентов. По использованию подобна к директиве ErrorLog. Каждый сервер позволяет задавать список имен документов, которые будут исполь- юваться как стартовые. То есть, когда пользователь обращается к ресурсу http://www.altersys-ua.com без указания документа, сервер должен решить, какой документ отобразить по умолчанию. За список таких документов отвечает директива Directorylndex. Принято устанавливать первым именем в списке index.html. Также желательно добавить следующие имена файлов: index.htm, index.php, index. shtml, default. html и default. htm. Пример объявления: Directorylndex index.php index.html index.htm Есть более простой вариант описания списка индексных файлов: использование следующей комбинации директив: Options MultiViews Directorylndex index default Теперь индексными будут считаться все файлы вида index. * и default. * Управление постоянными соединениями Стандарт НТТР/1.1 поддерживает постоянные соединения, в течение которых возможно более одного запроса на одно TCP-соединение. Такую возможность еще называют конвейером объединенных запросов. Для управления постоянными соединениями Bhttpd.conf присутствуют директивы KeepAlive, KeepAliveTimeOut и MaxKeepAliveRequests. Директива KeepAlive Директива KeepAlive регулирует возможность включать или отключать поддержку конвейера запросов, присутствующего в стандарте НТТР/1.1. Благодаря включению и правильной настройке данной директивы, можно на порядок ускорить загрузку страниц, содержащих большое количество изображений: KeepAlive On По умолчанию данная опция включена. Директива KeepAliveTimeOut Директива KeepAliveTimeOut устанавливает таймаут в секундах для постоянного соединения (если включена поддержка постоянных соединений). Таймаут— это время ожидания перед следующим запросом от данного пользователя в текущем соединении. По истечении установленного времени соединение будет закрыто. По умолчанию, определен таймаут в 15 секунд: KeepAliveTimeOut 15 Директива MaxKeepAliveRequests Директива MaxKeepAliveRequests позволяет установить максимальное количество запросов на одно постоянное соединение. Установка в ноль (0) позволяет убрать данное ограничение. Для достижения максимальной производительности этой директиве рекомендуется присваивать как можно большее значение. По умолчанию, установлено значение 100. Пример установки другого значения:
522 Глава 17. Настраиваем Web-сервер MaxKeepAliveRequests 250 Управление количеством процессов и соединений Для каждого соединения Web-сервер Apache запускает отдельную копию процесса, которая и обрабатывает запросы от пользователя. От количества запущенных процессов зависит, сколько пользователей смогут одновременно "достучаться" до Web-страниц. Управлять количеством запущенных процессов позволяют директивы MinSpareServers и MaxSpareServers и StartServers. Кроме того, дополнительно можно указать максимальное количество запущенных процессов, а также через какое число обработанных запросов запускать новую копию процесса (удалив старую). Директива StartServers StartServers — это директива, которая задает количество дочерних процессов, запускаемых во время старта сервера. На самом деле данный параметр играет незначительную роль в производительности Web-сервера Apache, поскольку количество процессов динамически изменяется в зависимости от активности и количества клиентов. Все дочерние процессы запускает главный процесс, который получает запросы и передает их на выполнение дочерним, благодаря чему достигается равномерная загрузка. По умолчанию, запускается только пять копий дочерних процессов (в сумме — шесть): StartServers 5 ДиреКТИВЫ MaxSpareServers И MinSpareServers Когда запущенных процессов не достаточно для обработки поступающих запросов, главный процесс пытается создать больше дополнительных дочерних серверов. За максимальное количество таких процессов-серверов отвечает директива MaxSpareServers. Заметим, что созданные дополнительные процессы не выгружаются из памяти после обработки запроса (исключение составляет только случай, когда их количество превышает заданное данной директивой значение). Обратите особое внимание на то, что устанавливать большое значение для директивы MaxSpareServers очень нежелательно, поскольку она задает не максимальное количество одновременно обрабатываемых запросов (см. ниже описание директивы MaxClients), как может показаться на первый взгляд, а только максимальное количество запущенных дополнительных процессов: MaxSpareServers 10 С другой стороны, существует директива MinSpareServers, которая управляет минимальным значением количества дополнительных процессов. Если родительский процесс обнаруживает, что в памяти находится меньше дочерних процессов, чем указано данной директивой, то он пытается создать их. По умолчанию, данной директиве установлено значение 5. Директивы MaxClients Директива MaxClients позволяет определить максимальное количество дочерних процессов, выполняемых одновременно. По умолчанию, установлено значение, равное 150. Максимальное значение — 256, но его можно обойти, изменив исходные тексты Web-сервера Apache (увеличьте в исходных текстах в файле src/incude/httpd.h значение параметра HARD_SERVER_LIMIT перед установкой/переустановкой Apache). Если при запросе окажется что исчерпано максимальное количество соединений, запрос как бы зависнет, и ответ не будет получен. Установка маленького значения для данной директивы — это очень плохое и необдуманное решение. В то же время, установка большого значения может превысить системные возможности (например, количество памяти) и не дать положительного результата.
Настройка 523 Директива MaxRequestsPerChild Директива MaxRequestsPerChild позволяет указать, после какого количества запросов дочерний процесс-сервер будет выгружен из памяти. Установка значения директивы в ноль (установлено по умолчанию) позволяет указать, что дочерние процессы никогда не будут устаревать. Однако установка значения, отличного от нуля, имеет ряд преимуществ, и в первую очередь— это возможность избежать "съедания" памяти множеством зависших процессов. Также это позволяет медленно уменьшать количество одновременно запущенных процессов, когда уменьшается нагрузка. Параметры соединения Как и любое другое сетевое приложение, Web-сервер Apache позволяет управлять своими сетевыми настройками, такими как номер порта, интерфейс (адрес), на котором будут прослушиваться запросы, и т.п. Директива Port Директива Port позволяет указать номер порта, который будет использоваться для установки соединения. Номер порта может быть от 0 до 65535, но, по умолчанию, используется порт 80 (зарезервирован и прописан в файле /etc/services). Обратите внимание на то, что все порты до 1024 — системные и могут использоваться только по разрешению суперпользователя (запущены от имени root), потому, если такие права отсутствуют, можно установить любой другой порт, но выше 1023 (например, 8000 или 8080). То же самое касается случая, когда 80-й порт занят, но есть права суперпользователя root в системе — тогда просто можно воспользоваться любым другим свободным портом. Заметим, что в таком случае будет изменено каноническое имя Web-сервера, и в случае, например, следующего определения: Port 81 пользователям придется обращаться к его страницам по адресу http: //www. klipov. net: 81/ Шратите внимание на то, что запуск Apache от имени суперпольэователя root не обозначает установку для директивы User значения root. Такое значение директивы может привести к серьезным проблемам в безопасности системы. Всегда используйте User www. Директива BindAddress Директива BindAddress используется для указания, на каких интерфейсах прослушивать клиентские запросы. Здесь может использоваться IP-адрес, полное доменное имя или символ "*", соответствующий любому IP-адресу, присвоенному серверу. Данную директиву можно объявить только один раз, более того — рекомендуется использовать директиву Listen, поскольку использование BindAddress может быть исключено в следующих версиях Apache (в Apache2 уже не применяется). Пример: BindAddress 81.82.83.1 Директива Listen Директива Listen указывает Web-серверу Apache прослушивать запросы более чем по одному IP-адресу или порту. Она используется как альтернатива директивам BindAddress и Port, разрешая принимать входящие запросы на указанные порты или комбинацию адреса и порта. Если был указан только порт, то директива Listen позво-
524 Глава 17. Настраиваем Web-серввр ляет прослушивать запросы по указанному порту на любом интерфейсе сервера. Если указана комбинация адреса и порта, то будут прослушиваться запросы, приходящие только на указанный адрес (и порт). В отличие от директив BindAddress и Port, директиву Listen можно объявлять несколько раз, тем самым гибко настроив Apache: Listen 80 Listen 81.82.83.1:443 Директива HostnameLookups Директива HostnameLookups позволяет включить или отключить поиск DNS- имени клиента по IP-адресу для записи в журнальный файл (и применения как переменной среды REMOTEHOST). В версии Apache 1.3 данная директива по умолчанию принимает значение off для уменьшения сетевого трафика и ускорения работы сервера (поскольку не требуется время на ожидание ответа от сервера DNS). Директива HostnameLookups может принимать одно из трех значений: off, on или double. Заметим, что последнее значение (double) применяется для усиленш безопасности системы, выполняя двойное обратное преобразование адреса ("параноидное" поведение, paranoid). Таким образом, страницы с ограниченным доступом по. DNS-именам хостов будут более защищены от несанкционированного доступа (см. подраздел "Контроль доступа"). Директива UseCanonicalName Директива UseCanonicalName позволяет определить, каким образом Web-сервер Apache будет формировать ссылки на страницы, а точнее — каким образом будет формироваться имя сервера. При установленном значении on Apache будет формировать ссылки на страницы внутри запрошенного ресурса на основании директив ServerNarae и Port. Таким образом, при обращении к Web-серверу локальной сети по имени www тот может преобразовать свое имя в что-то наподобие www.domain.com. Установка значения описываемой директивы в of f позволяет отменить такое поведение. Третье возможное значение — dns: UseCanonicalName on Другие часто используемые директивы Директива Directory Директива Directory используется в том случае, когда необходимо включить группу директив, применяемых только к некоторому каталогу и его подкаталогам. Данная директива описывается как блок <Directory> ... </Directory:-. При этом в блоке может использоваться любая директива, применимая в контексте каталога В качестве значения директивы Directory указывается полный путь к каталогу. При этом разрешено использовать символы заместители "*" (любая последовательность символов) и "?" (любой одиночный символ). Простой пример использования: <Directory /usr/local/www/data> Options Indexes FollowSymLinks </Directory> Если необходимо использовать регулярное выражение, то в описании директивы применяется символ тильды "~". Если несколько различных блоков из директив Directory соответствуют одному и тому же каталогу (например, когда имеется директива для корневого каталога и затем — для какого-либо из его подкаталогов), то директивы Directory применяются к подкаталогу в порядке от самого глобального до наиболее близкого. Например, в следующем случае:
Настройка 525 <Directory /> AllowOverride None </Directory> <Directory /usr/local/www/data> AllowOverride All </Directory> ря фалов в каталоге /usr/local/www/data/docs будет применяться такая последовательность правил: вначале будет применено значение директивы AllowOverride None, затем — директивы AllowOverride All и в конце — значения для всех дирек- тив из файла /usr/local/www/data/.htaccess, если такой существует. Определять директиву Directory разрешено в любом месте конфигурационного файла, кроме другого блока директивы Directory или Limit. Директива options Директива Options позволяет определить возможности сервера для данной директории. Она может принимать следующие значения (возможно совместное использование нескольких опций): All — разрешает все опции, кроме MultiViews; ExecCGI — разрешает выполнять сценарии CGI; FollowSymLinks — если в каталоге есть символические ссылки, то сервер будет пытаться следовать им; includes — разрешает использование включений на стороне сервера (технология Server Site Includes, SSI) IncludesNOEXEC — позволяет использовать технологию SSI с заблокированной возможностью использовать расширения #ехес и #include для сценариев; Indexes — позволяет выводить список файлов в запрошенном каталоге, если не было найдено файла, соответствующего директиве Directorylndex; MultiViews; SymLinksIfOwnerMatch — сервер будет следовать только тем символическим ссылкам, на которые имеет права пользователь Когда необходимо отключить все опции, директиве Options следует назначить значение None. Обратите внимание на то, что опции не объединяются, если соответствуют одному каталогу, но описаны в различных блоках директивы Directory. Для объединения или удаления опций используются предшествующие символы "+" и "-" соответственно. Например: <Directory /usr/local/www/data> Options FollowSymLinks </Directory> <Directory /usr/local/www/data/docs> Options Indexes </Directory> обозначает, что для директории /usr/local/www/data/docs будет применена только одна опция Indexes. Для объединения опций необходимо применить следующий вариант: <Directory /usr/local/www/data> Options FollowSymLinks </Directory> <Directory /usr/local/www/data/docs> Options +Indexes </Directory>
526 Глава 17. Настраиваем Web-сервер Директива Location Для управления доступом к некоторому URL применяется директива Location, которая подобна директиве Directory и обязательно должна быть с ней согласована. Как правило, данная директива применяется для ограничения просмотра URL по адресам или другим критериям. Пример использования: <Location /perl-status> SetHandler perl-script PerlHandler Apache::Status Order deny,allow Deny from all Allow from 127.0.0.1 </Location> Директива Limit Директива Limit используется для ограничения доступа к определенным HTTP- методам. К примеру, для ограничения доступа к использованию метода TRACE только авторизированным пользователям будет иметь вид: <Limit TRACE> require valid-user </Limit> Директива File Помимо особых определений для директорий, Web-сервер Apache позволяет определять директиву File для управления доступом к группе файлов. Даная директива часто применяется в связке с директивой Directory. В качестве значения для нее необходимо установить имя файла или группы файлов с использованием символов- заместителей "*" и "?". Как и в случае с директивой Directory, разрешено применять регулярные выражения с добавлением символа "~". Пример описания блока: <Files - "\.(cgi|shtml|phtml|php3?)$"> SSLOptions +StdEnvVars </Files> Директива AccessFileName Директива AccessFileName позволяет указать имя файла управления доступом, который сервер будет искать во всех каталогах по пути к документу: AccessFileName .htaccess Директива AllowOverride Для описания директив, которые разрешено определять/переопределять в данном файле, служит другая директива: AllowOverride. Если сервер находит файл . htaccess, то ему необходимо знать, какие директивы, объявленные в нем, могут отменять установленные ранее параметры доступа. Для описания разрешения используется директива AllowOverride, которая может принимать следующие значения: None — позволяет отменить поиск файла . htaccess; All — позволяет серверу переопределять любые директивы . htaccess файла;
Настройка 527 AuthConfig — позволяет переопределять следующие директивы: AuthName, AuthType, AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthUserFile, Require И Т.п. Filelnfo — разрешает использовать в файле .htaccess директивы, управляющие типом документов (например, AddEncoding, AddLanguage, AddType, Def aultType, LanguagePriority И т.д.); Indexes — разрешает использование директив управления индексацией директорий (например, AddDescription, Addlcon, Defaultlcon, Directorylndex. HeaderName, IndexOptions, ReadmeName И Т.Д.); Limit — допускает использование директив управления доступом как Allow, Deny и Order; Options — разрешает директивы, управляющие особенностями использования каталога (например, разрешает переопределять директиву Options). Директива Def aultType Бывают ситуации, когда сервер не может определить MIME-тип запрашиваемого документа. Поскольку сервер должен передать клиенту заголовок Content-type: при передаче документа, применяется значение установленное директивой Def aultType. Пример определения: DefaultType text/plain Контроль доступа Для ограничения доступа к различным страницам или директориям необходимо применять директивы контроля доступа. В различных случаях используют различные директивы, но в целом выделяют два способа контроля, которые можно комбинировать: по адресу и по паролю. При контроле по адресу применяются директивы Order, Deny и Allow. Первая директива (Order) позволяет задать порядок приоритета использования директив Deny и Allow. Для того, чтобы правила Allow могли отменять правила Deny , необходимо указать: Order deny,allow В противном случае применяйте следующую форму: Order- allow, deny Необходимость указывать порядок использования директив Allow и Deny обусловлена тем, что они считываются вместе и порядок их описания значения не имеет. Простые примеры ограничения доступа по адресам представлены в листингах 17.2 и 17.3. Листинг 17.2. Пример запрещения доступа к ресурсу со всех адресов, кроме локального хоста, машин локальной сети и машин из домена altarsys-иа.сош . Order deny,allow Deny from all Allow from 192.168.0 Allow from localhost Allow from altersys-ua.com
528 Глава 17. Настраиваем Web-сервер Листинг 17.3. Пример разрешения доступа к ресурсу со всех адресов, кроме 92. х.х.хи принадлежащих доменуhacfc .ua '-- ; . .' Order allow,deny Allow from all Deny from 82 Deny from hack.ua С контролем доступа по паролю дело обстоит несколько сложнее. Отметим, что контроль доступа не производится по системной базе пользователей. Для него желательно использовать файл доступа .htaccess, в котором и определяют все необходимые директивы. Для контроля доступа по паролю применяются различные модули, например modauth или mod_auth_db. При этом, в зависимости от применяемого модуля, будут соответственно меняться и директивы. Самый простой и распространенный способ — хранение базы данных в файле .htpasswd. Имя файла при этом может быть другим, но желательно, чтобы оно начиналось на .ht, так как, по умолчанию, файлы с такими именами невозможно увидеть при выводе списка файлов каталога или загрузить через HTTP-соединение (см. настройки по умолчанию в файле httpd. conf). Итак, в упомянутом случае используется следующий набор директив: AuthType — данная директива позволяет установить тип аутентификации пользователя для каталога. Она может принимать два значения: Basic или Digest, при этом последний не реализован. AuthName — директива, задающая имя области доступа. Данное имя выводится в окне аутентификации. В принципе, название может быть любым, но рекомендуется давать какое-то связанное имя для области, например "Административная зона" или "Ограниченная зона". AuthUserFile — директива, задающая местоположение текстовой базы данных пользователей/паролей. Рекомендуется хранить данный файл в каталоге за границами значения, установленного для директивы DocumentRoot (например, в каталоге /home/userl/htpasswds при DocumentRoot, равном /home/userl/ htdocs). AuthGroupFile — задает простой текстовый файл, в котором перечислены группы и пользователи, входящие в данные группы. require — директива, устанавливающая список пользователей, которым разрешен доступ к директории. При этом используется три варианта синтаксиса. Первый разрешает доступ всем авторизированным пользователям: require valid- user. Второй вариант позволяет определить список авторизированных пользователей, которым разрешен доступ к каталогу: require user имя- пользователя имя-пользователя. . . .Третий вариант используется, когда необходимо перечислить группы пользователей, которым разрешен доступ: require group имя-группы имя-группы.... Пример содержимого файла .htaccess для контроля доступа по паролю (в комментариях указан путь к файлу): # /usr/local/www/data/controlpanel/.htaccess AuthType Basic AuthName "Editors only" AuthUserFile /usr/local/www/.htpasswd AuthGroupFile /usr/local/www/.htgroup require group editors Для создания файла паролей и добавления в него пользователей применяется утилита htpasswd. Для создания файла паролей /usr/local/www/ .htpasswd и добавления пользователя test воспользуйтесь следующей командой (и дважды введите пароль):
Настройка 529 It htpasswd -с /usr/local/www/.htpasswd test New password: Re-type new password: Adding password for user test Для добавления новых пользователей в существующий файл необходимо убрать опцию -с Вместе с именем пользователя можно сразу же указать устанавливаемый пароль. Для этого используется опция -Ь и следующий формат вызова команды: # htpasswd -b /usr/local/www/.htpasswd admin admin Adding password for user admin После добавления всех пользователей файл будет иметь вид подобный следующему (имя-пользователя: зашифрованный-пароль): test:WCt/yYmXR2kLA admin:1/оj CYfGttvQ6 edi tor:vwKcNewrpQO/6 redactor:c3NLdVZRnwEoM adidok:1c34uz4cDZxuQ info:o7.awVqf2slPk Для создания и изменения файла групп используется любой текстовый редактор. Пример файла групп: editors: editor redactor admins: admin adidok users: test admin editor redactor adidok info После создания этих файлов при попытке доступа к защищенной директории будет выведено окно авторизации, подобное показанному на рис. 17.3. При увеличении числа пользователей рекомендуется хранить список пользователей в нетекстовой базе данных. Для указания пути к базе с пользователями и к файлу групп используются директивы AuthDBUserFile и AuthDBGroupFile. Для управления пользователями в базе данных вместо htpasswd используется утилита dbmmanage. Для совмещения контроля по адресам и паролям используется дополнительная директива Satisfy. Данная директива может принимать только два шчения: all или any. При значении all будет выполнена проверка как по адресу, так и по паролю. При этом доступ к ограниченной зоне предоставляется только тем пользователям, которые отвечают обоим критериям. Если требуется ввести правильный пароль или же иметь допустимый адрес хоста, используйте значение any: Allow from localhost Require valid-user Satisfy any В этом примере для пользователя, зашедшего с локального компьютера, не будет запрошен пароль. В Сервер 1 Сообщение Щ Имя Пароль ~' ■.' .. . - -"j/л ■" .. | vmw.altersys4ja.com Editors only editor » »**** ,_ Запомнить пароль OK Отменить 3 1 1 Рис. 17.3. Окно запроса авторизации
530 Глава 17. Настраиваем Web-сервер ВИРТУАЛЬНЫЙ ХОСТИНГ О виртуальном хостинге мы уже успели упоминали при рассмотрении протокола HTTP, Его смысл заключается в хранении данных для различных доменов на одном и том же сервере. Кроме того, зачастую эта задача совмещается с требованием ограничиться использованием только одного IP-адреса. Сегодня всем этим никого не удивишь - сплошь и рядом все именно так и обстоит: множество небольших хостеров на одном сервере позволяют держать вместе DNS-сервер, почтовый сервер, Web-сервер и обслуживать базы данных MySQL. Раньше тоже все размещалось на одном сервере, но вот с IP-адресами была неувязка: НТТР/1.0 не поддерживал передачу имени хоста (на какой адрес запрос пришел, тот адрес и отвечал). Фактически приходилось одному интерфейсу присваивать много IP- адресов, и каждому из них ставить в соответствие отдельное доменное имя. Web-сервер, в свою очередь, настраивался по адресам (то есть, при объявлении виртуального хоста указывалось не имя домена, а его IP-адрес). Такое поведение было не выгодно, в первую очередь, хостерам и провайдерам. Для первых — это "головная боль" с нагромождением множества IP-адресов на один интерфейс, для вторых — быстрое исчерпание их адресного пространства. Выходом из ситуации стал протокол НТТР/1.1. Как уже упоминалось, благодаря обязательному указанию заголовка Host: сразу после соединения была решена проблема с виртуальными хостами. Теперь отпадает необходимость использовать множество IP-адресов и определять виртуальные хосты по IP-адресам. Но перейдем от теории к практике. Ранее при рассмотрении файла httpd. conf мы изучили большинство директив, которые разрешено использовать при настройке виртуального хоста. Но если тогда они применялись для описания главного сервера (сервера по умолчанию), то теперь их необходимо употребить для описания виртуальных хостов. Также стоит отметить, что на сегодняшний день разрешается (и очень активно используется) как виртуальный хостинг по именам, так и по IP-адресам. Виртуальный хостинг по именам Настройка виртуального хостинга по именам начинается с правильной настройки DNS, но этот вопрос мы упустим. Далее необходимо настроить директиву NameVirtualHost, в которой следует указать IP-адрес или же адрес с портом, на который будут приниматься обращения к виртуальным хостам: NameVirtualHost 81.82.83.1 NameVirtualHost 81.82.83.2:8080 Если виртуальные хосты будут настраиваться на несколько IP-адресов, то директиву NameVirtualHost необходимо повторить для каждого из них, но проще указать один раз с использованием символа "*", что позволит использовать любой IP-адрес машины для виртуального хостинга и избежать жесткой привязки конфигурационного файла к адресам: NameVirtualHost * Следующий шаг — описание блока директив с использованием <virtualHost> для каждого виртуального хоста. При этом аргументом директивы virtualHost должен выступать тот же аргумент, что и для директивы NameVirtualHost (а если их было несколько, — тот, который будет использоваться при описании конкретного виртуального хоста): <VirtualHost 81.82.83.1> ИЛИ <VirtualHost *>
Виртуальный хостинг 531 В блоке VirtualHost необходимо описать как минимум директивы ServerName (имя виртуального хоста, который обслуживает сервер) и DocumentRoot (размещение данных для виртуального хоста), которые отменяют соответствующие значения директив для основного сервера. Отменяющих директив может быть намного больше, чем две вышеупомянутые. Некоторые директивы могут использоваться только в контексте виртуальных хостов, например, директива ServerAlias, которая позволяет указать дополнительные псевдонимы для конкретного виртуального хоста. Для внесения большей ясности в настройку виртуального хостинга приведем пример описания двух виртуальных хостов: www.klipov.net и main.com.ua (листинг 17.4). Ыстинг 17.4. Пример описания двух виртуал^ных^хОстбв по именам NameVirtualHost * : 80 <VirtualHost *:80> ServerAdmin webmaster@klipov.net DocumentRoot /home/klipovnet/htdocs ServerName www.klipov.net ServerAlias klipov.net *.klipov.net ErrorLog /home/klipovnet/logs/error.log CustomLog /home/klipovnet/logs/access.log common </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@main.com.ua DocumentRoot /usr/local/www/maincomua/htdocs ScriptAlias /cgi-bin/ "/usr/local/www/maincomua/cgi-bin/" ServerName main.com.ua ServerAlias www.main.com.ua ErrorLog /usr/local/www/maincomua/logs/error.log CustomLog /usr/local/www/maincomua/logs/access.log common <Directorу "/usr/local/www/maincomua/htdocs"> Options FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> На первый взгляд, использование виртуальных хостов по именам не вызывает проблем и довольно просто реализуется, но заметим, что при использовании виртуальных хостов, у которых IP-адрес совпадает с адресом основного сервера (например, при использовании директивы NameVirtualHost *), невозможно "достучаться" до основного сервера, так как по соглашению относительно использования виртуальных хостов сервером по умолчанию будет считаться первый описанный виртуальный хост. По этой причине при использовании виртуальных хостов рекомендуется первым описать "фиктивный" виртуальных хост, который описывает тот же основной сервер, например: ServerName somehoster.com DocumentRoot /usr/local/www/data < ... > NameVirtualHost * <VirtualHost *> ServerName somehoster.com DocumentRoot /usr/local/www/data </VirtualHost> { определения других виртуальных хостов }
532 Глава 17. Настраиваем Web-сервер Виртуальный хостинг по IP-адресам Как и в предыдущем случае, в первую очередь необходимо позаботиться о правильной настройке DNS, но в данном случае правила более жесткие: каждому виртуальному серверу должен быть поставлен в соответствие только один IP-адрес. Конфигурирование Apache для настройки виртуального хостинга по адресам может быть выполнено двумя способами: запуск различных копий сервера Apache для каждого хоста или же правильная настройка одного сервера. При этом первый вариант подойдет в том случае, когда компьютер имеет достаточную производительность и большие ресурсы по памяти. Запуск двух различных копий сервера позволяет обезопасить данные за счет использования различных значений директив User, Group и ServerRoot. Если нет предпосылок для запуска нескольких копий сервера, то применяют второй вариант. При использовании виртуального хостинга только на основе IP-адресов не указывайте директиву NameVirtualHost (если вы только не решили совмещать виртуальный хостинг по именам и IP-адресам)! В этом случае все основано только на описании блоков <VirtualHost>, при этом значением для директивы VirtualHost должен быть IP-адрес или DNS-имя (при этом первый вариант более предпочтителен). Во всем остальном использование виртуальных хостов на основе IP-адресов практически не отличается от варианта, основанного на именах. Простой пример описания двух виртуальных хостов по IP-адресам представлен в листинге 17.5. Листинг 17.5. Использование виртуального хостинга, основанного на IP-адресах <VirtualHost 81.82.83.2> ServerAdmin webmaster@klipov.net DocumentRoot /home/klipovnet/htdocs ServerName www.klipov.net ( ... другие директивы } </VirtualHost> <VirtualHost 81. 82. 83.3> ServerAdmin webmaster@main.com.ua DocumentRoot /usr/local/www/maincomua/htdocs ServerName main.com.ua { ... другие директивы } </VirtualHost> Более подробную информацию о настройке виртуального хостинга, о том, как совмещать виртуальный хостинг по именам и IP-адресам или создать динамически настраиваемый пул виртуальных хостов см. документацию Apache по настройке виртуального хостинга: http://httpd.apache.org/docs/vhosts/ или на вашем Web- сервере по адресу http://servername/manual/vhosts/. МОДУЛИ Web-сервер Apache славится своей модульностью, то есть, возможностью расширения своей функциональности за счет добавления новых модулей. Более того, все директивы, рассмотренные выше, были доступны только благодаря наличию соответствующих модулей. Даже директива ServerName! Ранее поддержка модулей в Apache была негибкой, поскольку их необходимо было включать еще на этапе компиляции сервера. Теперь же большинство модулей могут быть установлены и подключены уже после установки самого Web-сервера Apache. Это стало возможно, благодаря включению поддержки модели динамически разделяемых объектов DSO (Dynamic Shared Objects). И все же, несколько модулей до сих пор
Модули 533 встраиваются в ядро Apache на этапе его компиляции. Для того чтобы просмотреть их перечень, необходимо выполнить следующую команду: # httpd -1 Compiled-in modules: http_core.с mod_so.с suexec: disabled; invalid wrapper /usr/local/sbin/suexec Модуль httpdcore позволяет включить минимальную поддержку директив, без которых сервер не сможет работать (та же директива ServerName поддерживается, благодаря наличию этого модуля), а модуль mod_so включает поддержку DSO. Поддержка последнего позволяет динамически загружать дополнительные модули по мере необходимости их использования. Если модуль не используется, его можно не загружать, благодаря чему уменьшается потребление ресурсов каждым из процессов httpd. Для включения дополнительных модулей используются две директивы: LoadModule и AddModule. Директива LoadModule позволяет динамически подключать необходимый модуль, а директива AddModule — инициализировать использование модулей за счет включения поддержки директив модуля. Заметим, что большинство модулей являются "предзагруженными" (вспомните установку Apache и выбор модулей), а для очистки их списка используется директива ClearModuleList (при этом не забудьте описать добавление необходимых модулей и в необходимом порядке). Порядок описания модулей имеет очень большое значение, поскольку некоторые модули могут зависеть от других. В таких случаях зависимый модуль должен быть указан позже. Правильный порядок подключения стандартных модулей Apache указан в файле примера httpd. conf-dist. Помимо стандартных, в наборе портов можно найти множество дополнительных модулей (на сегодняшний день — более 100), использование которых может до неузнаваемости расширить функциональность Apache. Для просмотра списка этих модулей выполните следующие команды: # cd /usr/ports/www # Is -d mod_* Как видно из примера, дополнительные модули в наборе портов размещены вдиректории /usr/ports/www и начинаются с mod_. Наиболее часто используемыми модулями являются mod_gzip, mod_perl, mod_php4, mod_php5 и mod_ssl, при этом последнего в чистом виде в наборе портов вы не найдете. Встроенная поддержка данного модуля включена в Apache 2, а в случае Apache 1.3 он устанавливается из отдельного порта под названием apachel3-modssl (из директории /usr/ports/www/ apachel3-modssl). Об этом и поговорим подробнее. mod_ssl Модуль modssl позволяет использовать стандартную библиотеку OpenSSL, что делает возможным шифрование передаваемых данных с помощью протоколов SSL (SSLv2 или SSLv3) или TLS (TLSvl). Система FreeBSD следит за устанавливаемыми пакетами и их зависимостями с другими пакетами, потому важно заранее определить, необходима ли такая функциональность сервера или нет. Если ранее был установлен Web-сервер Apache без поддержки SSL, но затем оказалось что требуется поддержка защищенного соединения, то придется удалить предыдущую установку и выполнить ее с самого начала, но уже свключенной поддержкой mod_ssl. Итак, как же решить вопрос о необходимости в такой функциональности? Защищенный протокол HTTP, называемый HTTPS, требуется в тех случаях, когда необходимо защитить некоторые данные, передаваемые от клиента к серверу. Это имеет место
534 Глава 17. Настраиваем Web-сервер при работе электронного магазина, когда необходимо предоставить клиенту гарантию о том, что его персональные данные не будут перехвачены при передаче на сервер. Также это может потребоваться, когда необходимо защитить работу с Web-интерфейсом чтения почты. Естественно, злоупотреблять защищенным соединением не стоит. Это связано с нагрузкой на сервер и уменьшением скорости передачи данных от клиента к серверу и наоборот. Последнее обусловлено с постоянным шифрованием всех данных сервером — даже тех, которые шифровать нет необходимости (например, изображения на странице) — что занимает время и ресурсы. Если вас это не интересует, и поддержка HTTPS вам не нужна, то можно смело пропускать данный подраздел и переходить к рассмотрению следующего вопроса Предположим, что вам все же необходима поддержка HTTPS. В этом случае убедитесь в отсутствии других версий Apache, установленных с помощью набора портов (или с использованием бинарного пакета): # pkg_info | grep apache Если полученный список пуст, то можно переходить к настройке и установке Apache 1.3 с поддержкой modssl. Но не следует спешить. Первый "подводный камень" связан с генерированием файлов сертификатов, потому выполните только команду загрузки и компиляции Apache и дождитесь завершения данной операции: # cd /usr/ports/www/apachel3-modssl # make { ... } ===> Creating Dummy Certificate for Server (SnakeOil) [use 'make certificate' to create a real one] Обратите внимание на строки: % make certificate TYPE=dummy (dummy self-signed Snake Oil cert) % make certificate. TYPE=test (test cert signed by Snake Oil CA) % make certificate TYPE=custom (custom cert signed by own CA) % make certificate TYPE=existing (existing cert) CRT=/path/to/your.crt [KEY=/path/to/your.key] Любой сертификат должен быть подписан центром сертификации (СА) для доверия клиентами. Поскольку подпись сертификатов стоит немалых денег, большинство малых и средних компаний сами подписывают сертификаты. Для этого при генерировании сертификатов необходимо выбрать тип CUSTOM. Пример процесса создания и генерирования файлов представлен в листинге 17.6. При этом для полей, значения которых требуется оставить выбранными по умолчанию, необходимо просто нажать [Enter], если же поле необходимо игнорировать и не использовать в сертификате, устанавливайте в качестве значения точку ("."). Особое внимание обратите на строки, выделенные полужирным шрифтом — они указывают на те участки, где необходим ввод данных. Также обратите внимание на седьмой и восьмой шаги (STEP 7 и STEP 8), в которых запрашивается шифрование приватных ключей для увеличения безопасности. В любом случае отвечайте положительно и вводите ключевое слово. Ключевое слово необходимо запомнить, так как его указание требуется при запуске Apache с поддержкой SSL. Естественно, что вводить ключевое слово каждый раз при запуске автономного сервера не очень-то удобно, потому позже будет рассказано, как данный процесс автоматизировать. Листинг 17.6. Последовательность создания СивтрМ^ертификата и ого подпись своим же ключом СА (сертификат и ключ создается и подписывается в пунк- тах 1-3) . ...■■■ 'У ' .■. '." - # make certificate TYPE=cuatom ===> Creating Test Certificate for Server
Модули 535 Рйггинг 17.6. Продолжение *>ч' SSL Certificate Generation Utility (mkcert.sh) Copyright (с) 1998-2000 Ralf S. Engelschall, All Rights Reserved. Generating custom certificate signed by own CA [CUSTOM) STEP 0: Decide the signature algorithm used for certificates The generated X.509 certificates can contain either USA or DSA based ingredients. Select the one you want to use. Signature Algorithm (<R)SA or (D)SA) [R]: STEP 1: Generating RSA private key for CA (1024 bit) [ca.key] 14676 semi-random bytes loaded Generating RSA private key, 1024 bit long modulus ++++++ ++++++ e is 65537 (0x10001) STEP 2: Generating X.509 certificate signing request for CA [ca.csr] Vou are about to be asked to enter information that will be incorporated into your certificate request. Shat you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. 1. Country Name 2. State or Province Name 3. Locality Name 4. Organization Name Systems 5. Organizational Unit Name 6. Common Name 7. Email Address [caGsnakeoil.dom]:webmasterealtersys-ua.com B. Certificate Validity (days) (2 letter code) (full name) (eg, (eg, (eg, (eg, (eg, city) company) section) CA name) name@FQDN) [XI]:UA [Snake Desert]:. [Snake Town]:. [Snake Oil, Ltd] Alternative [Certificate Authority]:. [Snake Oil CA]:AlterSys CA [365] STEP 3: Generating X.509 certificate for CA signed by itself [ca.crt) Certificate Version (1 or 3) [3]: Signature ok subject=/C=UA/0=Alternative Systems/CN=AlterSys CA/emailAddress=webmaster@altersys-ua.com Getting Private key Verify: matching certificate & key modulus Verify: matching certificate signature ../conf/ssl.crt/ca.crt: /C=UA/0=Alternative Systerns/CN=AlterSys CA/emailAddress=webmaster@altersys-ua.com error 18 at 0 depth lookup:self signed certificate OK STEP 4: Generating RSA private key for SERVER (1024 bit) [server.key] M676 semi-ra/idom bytes loaded
536 Глава 17. Настраиваем Web-сервер Листинг 17.6. Продолжение Generating RSA private key, 1024 bit long modulus ++++++ e is 65537 (0x10001) STEP 5: Generating X.509 certificate signing request for SERVER [server.csr] You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. (2 letter code) (full name) (eg, city) (eg, company) (eg, section) (eg, PQDN) [XY] :UA [Snake Desert]:. [Snake Town]:. [Snake Oil, Ltd]:Alternative [Webserver Team]:. 1. Country Name 2. State or Province Name 3. Locality Name 4. Organization Name Systems 5. Organizational Unit Name 6. Common Name [www.snakeoil.dom]:www.altersys-ua.com 7. Email Address (eg, name@fqdn) [www@snakeoil.dom]:webmasterSaltersys-ua.com B. Certificate Validity (days) [365]: STEP 6: Generating X.509 certificate signed by own CA [server.crt] Certificate Version (1 or 3) [3]: Signature ok subject=/C=UA/0=Alternative Systems/CN=www.altersys- ua. com/emailAddress=webmaster@altersys-ua.com Getting CA Private Key Verify: matching certificate & key modulus Verify: matching certificate signature ../conf/ssl.crt/server.crt: OK STEP 7: Enrypting RSA private key of CA with a pass phrase for security [ca.key] The contents of the ca.key file (the generated private key) has to be kept secret. So we strongly recommend you to encrypt the server.key file with a Triple-DES cipher and a Pass Phrase. Encrypt the private key now? [Y/n]: у writing RSA key Enter РЕМ pass phrase: Verifying - Enter РЕМ pass phrase: Fine, you're using an encrypted private key. STEP 8: Enrypting RSA private key of SERVER with a pass phrase for security [server.key] The contents of the server.key file (the generated private key) has to be kept secret. So we strongly recommend you to encrypt the server.key file with a Triple-DES cipher and a Pass Phrase.
Модули 537 Ё стинг 17.6. Окончание *-^Х:л bcrypt the private key now? [Y/n]: у uriting RSA key inter РЕМ pass phrase: Verifying - Enter РЕМ pass phrase: Fine, you're using an encrypted RSA private key. RESULT: CA and Server Certification Files о conf/ssl.key/ca.key The PEM-encoded RSA private key file of the CA which you can use to sign other servers or clients. KEEP THIS FILE PRIVATE! о conf/ssl.crt/ca.crt The PEM-encoded X.509 certificate file of the CA which you use to sign other servers or clients. When you sign clients.with it (for SSL client authentication) you can configure this file with the 'SSLCACertificateFile' directive. 0 conf/ssl.key/server.key The PEM-encoded RSA private key file of the server which you configure with the 'SSLCertificateKeyFile' directive (automatically done when you install via APACI). KEEP THIS FILE PRIVATE! о conf/ssl.crt/server.crt The PEM-encoded X.509 certificate file of the server which you configure with the 'SSLCertificateFile' directive (automatically done when you install via APACI). conf/ssl.csr/server,csr The PEM-encoded X.509 certificate signing request of the server file ihich you can send to an official Certificate Authority (CA) in order to request a real server certificate (signed by this CA instead of our own CA) which later can replace the conf/ssl.crt/server.crt file. . Congratulations that you establish your server with real certificates. Теперь можно выполнить установку Web-сервера Apache в систему: # make install clean По завершении установки (фактического копирования необходимых файлов) i систему первое изменение можно заметить при просмотре содержимого директории [конфигурационными файлами. Теперь здесь будут размещены также и каталоги [файлами сертификатов и ключей. # Is -F /usr/local/etc/apache/ access.conf magic-dist ssl.crl/ access.conf-dist mime.types ssl.crt/ httpd.conf mime.types-dist ssl.csr/ httpd.conf-dist srm.conf ssl.key/ magic srm.conf-dist ssl.prm/ Второе изменение — это появление множества новых директив в конфигурацион- юмфайле httpd.conf.
538 Глава 17. Настраиваем Web-сервер Для начала попробуем запустить сервер с настройками по умолчанию: # /usr/local/etc/rc.d/apache.sh start Starting apache. Apache/1.3.34 mod_ssl/2.8.25 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases. Server new.host.name:4 43 (RSA) Enter pass phrase: Ok: Pass Phrase Dialog successful. Само собой разумеется, такой запуск никого не впечатлит и не найдет должного понимания. Для решения этой проблемы в каталоге /usr/local/etc/apache создадим подкаталог vhosts/ и некий файл certpwd.pl: # cd /usr/local/etc/apache # mkdir vhosts # chmod 700 vhosts # cd vhosts # touch certpwd.pl # chmod 7 00 certpwd.pl Приведем созданный файл к следующему виду: #!/usr/bin/perl print "myCertPa$$\n"; где myCertPa$$ — то ключевое слово, которое было использовано при шифровании приватных ключей из листинга 17.6 в шагах 7 и 8. Теперь изменим конфигурационный файл httpd.conf, приведя его к виду, который частично (большинство директив и комментариев исключено по причине использования стандартных значений) отображен в листинге 17.7. Листинг 17.7. Частичный вид конфигурационного файла httpd. oonf" для домена aitersys-ua. com при использовании модуля mpdssl и хранении файла; шифрования приватных ключей во внешнем файле cartpwd.pl # ... набор стандартных директив ServerAdmin webmastersaltersys-ua.com ServerName www.altersys-ua.com # ... набор стандартных директив <IfModule mod_ssl.c> # измените значение следующей директивы на использование # сценария автоматической подстановки пароля при запросе SSLPassPhraseDialog exec:etc/apache/vhosts/certpwd.pi SSLSessionCache dbm:/var/run/ssl_scache SSLSessionCacheTimeout 300 SSLMutex file:/var/run/ssl_mutex SSLRandomSeed startup builtin SSLRandomSeed connect builtin SSLLog /var/log/ssl_engine_log SSLLogLevel info </IfModule> <IfDefine SSL> <VirtualHost _default_:443> DocumentRoot "/usr/local/www/data" # Имя сервера должно совпадать с именем в сертификате, # иначе клиент может отказаться от работы с таким сервером
Модули 539 Иистинг 17.7. Окончание JerverName www. al terэуэ -ua. com ServerAdmin webmaster@altersys-ua.com ErrorLog /var/log/httpd-error. log IransferLog /var/log/httpd-access.log SSLEngine on SSLCipherSuite iALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile /usr/local/etc/apache/ssl.crt/server.crt SSLCertificateKeyFile /usr/loaal/etc/apache/ssi.key/server.key (SSLCACert if icateFile /usr/local/etc/apache/ssl.crt/ca.crt (Files - "\.(cgiIshtmlIphtml|php3?)$"> SSLOptions +StdEnvVars </Files> (Directory "/usr/local/www/cgi-bin"> SSLOptions +StdEnvVars (/Directory> SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 (/VirtualHost> </IfDefine> После этого перезапустим сервер и удостоверимся, что он стартовал удачно: # /usr/local/etc/rc.d/apache.sh restart Stopping apache. Waiting for PIDS: 48128. Starting apache. # ps ax | grep httpd 48169 ?? Ss 0:00.22 /usr/local/sbin/httpd -DSSL 48170 ?? I 0:00.04 /usr/local/abin/httpd -DSSL 48171 ?? I 0:00.04 /usr/local/abin/httpd -DSSL 48172 ?? I 0:00.00 /usr/local/sbin/httpd -DSSL 48173 ?? I 0:00.00 /usr/local/sbin/httpd -DSSL 48174 ?? I 0:00.00 /usr/local/sbin/httpd -DSSL 48178 ?? I 0:00.00 /usr/local/sbin/httpd -DSSL Если не будет обнаружено ни одной запущенной копии сервера, возможно, была допущена ошибка в написании ключевого слова в сценарии автоматической подстановки этого слова во время запуска сервера. После правильной настройки Web-сервера для описанного выше примера будет доступен виртуальный хост по адресу https: / /www. altersys-ua. com (в вашем случае адрес будет другой). Не забывайте, что вся информация из сертификата будет общедоступной, и любой пользователь сможет просмотреть ее при попытке обращения на защищенную страницу (рис. 17.4). На этом описание функциональных возможностей Apache при использовании модуля modssl завершено. Более подробную информацию можно найти на сайте проекта http: //www.modssl.org/. Упомянем только о возможности разрешить пользователю самому решить, доверять ли сертификатам, подписанным вашим центром сертификации (чтобы браузер не задавал лишних вопросов при обнаружении не простроченных сертификатов, в которых домен совпадает с запрошенным пользователем). Для этого в файле httpd. conf (см. листинг 17.7) снимите комментарии со строки SSLCACertificateFile /usr/local/etc/apache/ssl.crt/ca.crt и перезапустите Web-сервер Apache. При следующем обращении к защищенному ресурсу пользователю будет предоставлена информация о сертификате домена, а также сертификат вашего центра как показано на рис. 17.5. Для доверия клиенту необходимо
540 Глава 17. Настраиваем Web-сервер выбрать сертификат Altersys С А (для описываемого примера), нажать кнопку Install I подтвердить установку доверия сертификату (рис. 17.6). Blank рчд* - t'pwia B.0 Пгю! build 10S3 3- п х Eds Edn view Bookman» Iocls Help I"] New page https:/7v/ww.altersys-ua.corri/ (Document. OB ■» ' 4 '*»gie sear-h - hA I The server's certificat registered. Accept? Certificate name «««1 Jifcfrrfji wt* com AA«rn«tiv« Sytttmi •maMdtfrcss. wr ebenart ■(■<•> *Jt*rsy»-u*. com шаЕШванна Allow connections to sites using this certificate warn me before using this certificate - The certificate for "www.altersys-ija.cam" is signed by the unknown * Cert if к-ate A ithority "AltcrSys CA". it is not possible to verify that this is a valid certificate Accept Рис. 17.4. Сообщение браузера Opera о неизвестном центре сертификации, а также просмотр информации, внесенной при создании сертификата хоста CtrtlMcafenw notJound |_ ПХ The root certificate for this server Is not registered. You may install this certificate. Accept/install? www.alter -S4ja.com Alter s CA - The certificate for ■www.altersys-ua.com" Is signed by the unknown » Ceitificate Authority "AlterSys CA". It is not possible to verify that this 15 a valid certificate The root certificate from "AlterSys CA" is not known to Opera. Opera cannot decide if this certificate can be trusted. Accept Install Cancel Help Рис. 17.5. Информация о сертификате хоста и сертификате центра сертификашт
Модули 541 CartVkat* - not found _ X 1 \ Are you sure you want to trust this issuer? Рис. 17.6. Установка доверия сертификату центра сертификации После этого все сертификаты хостов, подписанные вашим центром сертификации, штоматически станут доверенными для данного браузера пользователя. mod_perl Web-сервер Apache позволяет запускать сценарии, написанные на Perl как CGI- орограммы (с использованием стандартного модуля mod_cgi), но при этом существует ряд ограничений: как по времени, так и по ресурсам. Чтобы при каждом запросе на выполнение Perl-сценария не ожидать запуска командного интерпретатора и выполнения внем сценария, необходимо установить дополнительный модуль mod_perl. Данный модуль доступен для установки из набора портов в директории /usr/ports/www/ «odperl. После его установки будет получена встроенная поддержка Perl в Apache. Хотя это и требует намного больше ресурсов системы, поскольку интерпретатор Perl впускается вместе с Apache, но и предоставляет огромные преимущества, например, вширование кода сценариев: сценарии компилируются и затем кэшируются только один раз при запуске, а затем используются только кэшированные сценарии, что значительно разгружает сервер. Если сценарием установки модуля mod_perl не были автоматически внесены из- иенения в конфигурационный файл httpd.conf, то в соответствующих местах этого файла (как правило, после всех остальных идентичных директив) необходимо самому унести следующие строки: ! LoadModule perl_module libexec/apache/libperl.so I AddModu1e mod_ pe r1.с I Но этого будет недостаточно. Для того чтобы сценарии на Perl исполнялись и исполнялись правильно, необходимо определить дополнительные директивы. При этом способ описания зависит от того, как написаны сценарии, или же каким образом необ- годимо их исполнять. Сразу заметим, что будет ошибочным просто переписать все сце- ирии, написанные на Perl, в директорию CGI-сценариев, заданную через директиву ScriptAlias. Это обусловлено тем, что упомянутая директива устанавливает обра- 5отчик modcgi для всех сценариев по указанному пути. Первый вариант: при отсутствии CGI-сценариев и необходимости в их поддержке вблоке <IfModule mod_alias.c>...</IfModule> удалите или закомментируйте строки, имеющие отношение к директиве ScriptAlias и директории, выступающей в ичестве ее значения. Вместо этого добавьте следующие строки: <IfModule mod_perl.с> Alias /cgi-bin/ "/usr/local/www/cgi-bin/" <Directory "/usr/local/www/cgi-bin"> SetHandler perl-script PerlHandler Apache::Registry Options ExecCGI Allow from all </Directory> </IfModule>
542 Глава 17. Настраиваем Web-сервер Не забудьте перезапустить Web-сервер. После внесения описанных изменений и перезапуска Apache все файлы по адресу http: //hostname/cgi-bin/ будут исполняться интерпрегатором Perl. Если файл сценария в данной директории будет написан не на языке Perl, то при попытке доступа к нему сервер отобразит страницу внутренней ошибки сервера ("500 Internal Server Error"). Для того чтобы этого избежать, есть несколько путей решения. Первый основан на простом описании расширения файлов, а второй — на описании расширения файлов совместно с указанием другого псевдонима для той же директории. Первый вариант реализуем при добавлении следующих строк в конфигурационном файле Web-сервера Apache (во избежание путаницы желательно сразу же после блока <IfModule mod_alias . c>...</If Module>): <IfModule mod_perl.c> <Files - "\.pl$"> SetHandler perl-script PerlHandler Apache::Registry Options ExecCGI Allow from all PerlSendHeader On </Files> <IfModule mod_perl.c> Теперь сервер будет использовать интерпретатор Perl для любого файла с расширением *.pl, где бы тот ни был размещен. Второй вариант реализуем, к примеру, следующими строками в файле httpd. conf: Scr.iptAlias /cgi-bin/ "/usr/local/www/cgi-bin/" <Directory "/usr/local/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Location "/cgi-bin/*.pl"> Deny from all </Location> <IfModule mod_perl.c> Alias /perl/ "/usr/local/www/cgi-bin/" •cLocation "/perl/*"> Deny from all </Location> <Location "/perl/*.pl"> SetHandler perl-script PerlHandler Apache::Registry Options ExecCGI Allow from all PerlSendHeader On </Location> </IfModule> Более детальная информация по настройке и использованию mod_perl можно найти на странице http://perl.apache.org/docs/index.html.
Модули 543 mod_php4 Вторым по популярности языком для написания динамических Web-страниц после Perl, наверное, является РНР. Этот язык отмечается простотой конструкций, широкими функциональными возможностями, прост для изучения. Процессор языка РНР сегодня доступен практически для любой операционной системы, потому вы можете с легкостью переносить страниц практически без изменения на другие серверы с РНР, не боясь, что они перестанут работать или будут работать неверно. Конечно, язык РНР имеет ряд проблем (как правило, связанных с безопасностью) и может стать причиной взлома Web-сервера или повреждения важных данных, однако, несколько ограничив его возможности, можно намного повысить его устойчивость к взломам. Как и в случае с Perl, PHP-сценарии могут выполняться в Apache с постоянным вызовом интерпретатора РНР, который возвращает сгенерированную страницу обратно серверу или же через модуль mod_php4 (или через новый модуль mod_php5 для РНР5). При этом использование какого-нибудь из модулей modphp позволяет в несколько раз увеличить скорость обработки сценариев Web-сервером. Установку mod_php4 желательно выполнить из набора портов. При этом хотим предупредить, что данный модуль является частью пакета РНР, а набор портов, как известно, не позволяет второй раз установить уже установленное приложение. Фактически, если у вас в системе уже установлен РНР, но без mod_php, то просто удалите первый — установка модуля установит и сам интерпретатор языка. С установкой r,od_php4 спешить не надо — подумайте над тем, какие модули вам необходимы. ракет РНР, подобно, как и Apache; — модульное средство,' но при этом в наборе портов модули для РНР разбросаны практически по всем разделам, в отличие от gpache, модули которого собранны вместе. Если у вас нет желания искать необходимые модули по различным директориям набора портов и устанавливать их после установки модуля, то сущесвует возможность включить их еще на этапе установки самого РНР (модуля mod_php). Для этого посмотрите файл /nsr/ports/lang/php4/Makefile.ext, который содержит список доступных модулей. Каким образом будет включена их поддержка: через добавление переменной PHP_MODNAME с перечнем необходимых модулей или через добавление в конец списка CONFIGUREARGS аргументов конфигурации — значения фактически не имеет. Если точно не известно, что потребуется в будущем, а безопасность и ресурсоем- гость не Играют большой роли, то, возможно, предпочтительнее изменить стандартный список набора конфигурационных аргументов CONFIGURE_ARGS в файле Makefile для поддержки большинства наиболее часто используемых модулей: CONFIGURE_ARGS= —enable-versioning \ —enable-memory-limit \ --with-layout=GNU \ --with-config-file-scan-dir=$(PREFIX}/etc/php Разобравшись с модулями, можно переходить к компиляции и установке, что уже ве должно вызвать у читателя проблем. Из директории /usr/ports/www/mod_php4 запускаем команду: # make config install clean При этом отобразится окно параметров, отображенное на рис. 17.7. Комментарии вданном случае излишни. После установки модуля практически все необходимые изменения будут автоматически внесены в конфигурационный файл Web-сервера httpd.conf.
544 Глава 17. Настраиваем Web-сервер Options for mod_php£ 4.4.0 [ ] Use apache 2.x instead of apache 1.3.x [ 1 Enable debug [ ] Enable zend wultib te support ОН ШШ nable i v6 su..ort [ 1 * Build static OpenSSL extension Cancel Рис. 17.7. Окно параметров установки mod_php4 Осталось только добавить две строки в блок <IfModule mod_mime.c> </IfModule>: AddType application/x-httpd-php -php AddType application/x-httpd-php-source .phps После перезапуска Apache создайте в директории с данными сайта некий тестовый файл phpinf о. php следующего содержания: <?php echo "<h2>PHP test page</h2>"; phpinfo (); ?> После этого попробуйте открыть данный файл в браузере и просмотреть результат. Если результат подобен показанному на рис. 17.8, а не текст файла phpinf о. php, то этого говорит об успешной настройке Apache на совместную работу с PHP (modphp). Что касается настроек самого РНР, то значения по умолчанию приводят к возникновению проблем с безопасностью. В первую очередь заметим, что все php-сценарии будут выполняться от имени пользователя, под которым запущен сервер Apache. Разграничение прав по пользователям возможно только при использовании РНР как CGI- программы, но при этом придется смириться с большим расходом ресурсов и медленной работой сервера. Но выход есть! В первую очередь — использование "безопасного режима" работы (safemode). Во-вторых, — отключить опцию register_globals (установить значение Off). В-третьих, для каждого виртуального хоста ввести ограничения на права доступа и исполнения php-сценариев только ниже по иерархии от корневой директории виртуального хоста (что будет показано позже на примере). Опишем все по порядку. Итак, в первую очередь необходимо сформировать конфигурационный файл для РНР. По-умолчанию, он должен располагаться в каталоге /usr/local/etc и иметь имя php. ini, но вместо него там можно найти два других файла: php.ini-dist и php.ini-recommended. Обычно просто копируют файл php. ini-recommended в php. ini и вносят в него некоторые изменения. В первую очередь изменению должны подвергнуться параметры saf e_mode и registerglobals, но этого может оказаться мало. Большинство администраторов придерживаются мнения о том, что необходимо отключать возможность вызова функции phpinfo (), и оно не лишено оснований. В конце концов, файл php. ini может
Модули 545 принять вид, подобный представленному в листинге 17.8 (данный файл учитывает все описанные выше требования к безопасности). - df.3 J ♦аил {^ъдеъэ &ад Swmultjk JV«c трьяюнэгы Сграа*д Создать с-фшкцу ■ . PHP Version 4 V«*NI КМОМ С*м1Ц«н« f n—iiml V*«v<*Art Virtual Crintt»ty »Atiu*ul J4d lib* Г1ГДЛ ГИГ ILibMiM X+w4 £*(**«*»• Cwt««l«U4 Thr**4 <Ы**у bttp;Vww*.Att*rsy*-ua.corn/phpin<o.|>l,ip - v\ \ 0< PHP test page 4,0 ■.- ч php n»v ig ;c« io 4i n 4it»tvi*rt«t4ii4tc*ft»''-Firth/-iff •.■■lip'*-4t*«bU tb"-*&k<4iwb*f+\tfl*ti&Atnr*p*t' -di**fcl«- ****** *i*t.1«J Jwirff*c*l ж'»** 1л| Ги!Л%<*1>4<и>>М ;tt»*tl jOMoij* 2901-349* ti» •n*H*4 4u*bM »bK*<Kv. ftj rtnIE^fi«viSerCHry"fhC<c*l»l?<4«t«^T«cftflV*»M* Рис. 17.8. Вывод функции phpinfo() для демонстрации правильной настройки Apache на использование mod_php Йистинг 17.8. Простой пример конфи!у|кЩШк^,^^Щр^;|%1 для Е ного выполнения сценариев нШ^кёРЙР" ' : ;, [РНР] engine = On short_open_tag = On asp_tags = Off precision = 14 y2k_compliance = On output_buffering = 4096 zlib.output_compression = Off implicit_flush = Off serialize_precision = 100 allow_call_time_pass_reference = safe_mode = On safe_mode_gid = Off safe_mode_allowed_env_vars = PHP safe_mode_protected_env_vars disable_functions = phpinfo expose_php = On max_execution_time = 30 aax_input_time = 60 memory_limit = 8M error_reporting = E ALL Off LD LIBRARY PATH
546 Глава 17. Настраиваем Web-сервер Листинг 17.8. Окончание . ,<,■>'■' i, - - х-- . ^ ■ ?% display_errors = Off display_starcup_errors = Off log_errors = On log_errors_max_len = 1024 ignore_repeated_errors = Off ignore_repeated_source = Off track_errors = Off variables_order = "GPCS" register_globals = Off register_argc_argv = Off post_max_size = 8M magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off default_mimetype = "text/html" file_uploads = On upload_max_filesize = 2M allow_url_fopen = On default_socket_timeout = 60 [MySQL] mysql.allow_persistent = On mysql.max_persistent = -1 mysql.max_links = -1 mysql.default_socket = /tmp/mysql.socket mysql.connect_timeout = 60 mysql.trace_mode = Off [Session] session.save_handler = files session.save_path = /tmp session.use_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.bug_compat_42 = 0 session.bug_compat_warn = 1 session.entropy_length = 0 session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeent г у" В такой конфигурации для РНР после перезапуска Web-сервера Apache обращение к файлу phpinf о. php через браузер отобразит только текст "РНР test page", а выполнение функции phpinf о () будет проигнорировано. Что касается вопроса прав доступа для php-сценариев, то здесь придется немного повозиться с внесением изменений в настройки виртуальных хостов (или в файлы доступа .htaccess). Пример описания "безопасного" виртуального хостинга для домена main. com. ua примет следующий вид:
Дополнительные вопросы 547 <VirtualHost *:80> ServerAdmin webmaster@main.com.ua DocumentRoot /usr/local/www/maincomua/htdocs ScriptAlias /cgi-bin/ "/usr/local/www/maincomua/cgi-bin/" ServerName main.com.ua ServerAlias www.main.com.ua ErrorLog /usr/local/www/maincomua/logs/error.log CustomLog /usr/local/www/maincomua/logs/access.log common <IfModule mod_php4.c> php_admin_value doc_root /usr/local/www/maincomua php_admin_value open_basedir /usr/local/www/maincomua php_admin_value user_dir /usr/local/www/maincomua/htdocs Ипри безопасном режиме и разрешенной загрузке файлов php_admin_value safe_mode_include_dir /usr/local/www/maincomua php_admin_value safe_mode_exec_dir /usr/local/www/maincomua php_admin_value upload_tmp_dir /usr/local/www/maincomua/tmp </IfModule> </VirtualHost> Установка значения для директивы open_basedir позволяет ограничить файловые операции php-сценариев за пределами данной директории и ее поддиректорий. Монет использоваться в рамках директив virtualHost и Directory Web-сервера Apache. Директива docroot позволяет установить корневую директорию для php- сценариев. В случае использования "безопасного режима" имеет смысл установить директивы safe_mode_include_dir и safe_mode_exec_dir. Первая позволяет обойти проверку прав доступа для подключаемых (include) файлов внутри указанной директории. Вторая директива позволяет выполнять программы внутри указанной директории при использовании различных функций, наподобие exec () или systemO. При разрешенной загрузке файлов php-директива upload_tmp_dir позволяет ограничить сохранение файлов только внутри указанного каталога и его подкаталогов. Более детальная информация о настройке и использовании языка РНР находится на сайте http: //www.php.net/. ДОПОЛНИТЕЛЬНЫЕ ВОПРОСЫ Рассмотрение Web-сервера Apache можно было бы завершить модулями, как в других книгах по FreeBSD, но многие вопросы возникают не в настройке стандартной конфигурации Apache, а в том, как ее расширить, правильно настроить доступ к почтовому Web-интерфейсу и т.п. Разумеется, учитывая рамки книги, дать исчерпывающий анализ подобных вопросов мы также не сможем, но кое-что все же вкратце рассмотрим. Управление MySQL через phpMyAdmin Для многих пользователей интерфейс MySQL несколько отталкивающий. При его использовании даже опытные администраторы допускают ошибки, что может привести «потере важной информации. Почему бы не создать более простой способ управления, подобно тому, как это есть у других СУБД, например Oracle или MsSQL? И он уже создан! В наборе портов есть очень интересный и популярный пакет под названием phpMyAdmin. С его помощью можно управлять базами данных (любые операции), таблицами, данными в них, пользователями, правами доступа, импортировать и экспортировать базы данных и таблицы во внешние файлы, выполнять запросы на языке SQL, перезапускать MySQL и много другое. Данный пакет станет находкой для хостеров, так как большинство их пользователей не имеют представления о консольной утилите mysql, да и права доступа к терминалу предоставит не каждый.
548 Глава 17. Настраиваем Web-сервер Как и следует из названия, пакет phpMyAdmin требует наличия поддержки языка РНР Web-сервером (как правило, модуль mod_php4), не говоря уже о том, что требуется MySQL ©. Итак, первым делом — установка пакета. Переходим в директорию /usr/ports/databases/phpmyadmin и выполняем команды установки: # make install clean При запросе об установке или изменении опции оставьте все как есть и дождите» загрузки пакета, его компиляции и установки в системе. По умолчанию, он будет установлен в каталог /usr/local/www/phpMyAdrain. После этого первым делом внесем изменения в конфигурацию Web-сервера Apache, а точнее — добавим одну строку в блок директивы <IfModule mod_alias . с> </IfModule> в файле httpd. conf: Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/" Второй пункт — внесение изменений в конфигурационный файл config. inc.php, который размещен непосредственно в корневом каталоге системы phpMyAdmin. Изменение этого файла зависит от ваших предпочтений и настроек базы данных MySQL. Проверьте и измените следующие строки (в первом блоке объявлений); $cfg[ $cfg[ $cfg[ $cfg[ $cfgt $cfg[ $cfg[ $cfg[ 'Servers' ' Servers' ' Servers' 'Servers' ' Server's ' 'Servers' 'Servers' 'Servers' [$i] r$i] [$i] [$i] [$i] [$il [$i] [$i] •host'] 'port'] 'socket'] 'connect type'] 'auth_type'] 'user'] 'password'] 'only_db'] В данном случае host — имя компьютера, на котором установлен сервер MySQL Опцию port установите, если сервер MySQL прослушивает порт, отличный от 3306. Если не менялся путь к файлу сокета MySQL, выбранный по умолчанию (/tmp/ mysql. sock), то опцию socket оставьте без изменений. Важным параметром является connecttype, который может принимать одно из двух значений: tcp или socket. Если phpMyAdmin необходимо подключатш к MySQL с использованием порта (система MySQL установлена на другом компьютере), то оставьте значение tcp, в противном случае лучше воспользоваться значением socket. Особое внимание обратите на параметры auth_type, user, password и only_db. При использовании метода авторизации config позаботьтесь о соответствующей настройке Apache, а точнее — об ограничении доступа к директории phpMyAdmin (директива Directory) на основе авторизации по паролю или IP-адресу. Использование данного метода обязывает указать имя пользователя, пароль и, желательно, — имя базы данных. Более подходящим вариантом может быть использование метода авторизации http, при этом нет необходимости описывать значения для опций user, password и only_db. Каждый раз при доступе к странице управления базами данных пользователь должен будет пройти авторизацию по базе и сможет управлять только теми базами, на которые у него есть соответствующие права. Поскольку информация в базе данных пользователя может быть секретной, возможно, потребуется защищенное соединение HTTPS (о том, как настроить Web-сервер Apache на использование SSL, сказано выше). Для того чтобы запретить доступ к phpMyAdmin no незащищенному HTTP, просто перенесите объявление псевдонима /phpmyadmin/ в блок директивы <VirtualHost _default_: 443> </VirualHost>. Сведения об использовании пакета phpMyAdmin и более подробную информацию!) его возможностях см. на сайте http: //www.phpmyadmin.net/.
Дополнительные вопросы 549 Web-интерфейс к почте с использованием OpenWebMail Второй вопрос, возникающий рано или поздно как у начинающих администраторов, так и у пользователей хостинга, касается доступа к почтовому ящику через Web- интерфейс. Для решения данного вопроса можно применить различные варианты, начиная от написания свого до установки бесплатного или коммерческого пакета. Мы рассмотрим бесплатный вариант. Итак, наиболее популярные и интересные проекты — это Horde, SquirrelMail, Neo- Mail и OpenWebMail, который был создан на основании NeoMail. Интерфейс Horde неплох, но довольно запутан. Интерфейс SquirrelMail слишком прост, плохо выглядит и малофункционален. Наиболее популярными интерфейсами являются NeoMail и OpenWebMail. Они очень быстры и поддерживают ряд возможностей, отсутствующих у других Web-интерфейсов для почты. Мы остановимся на кратком обзоре OpenWebMail. Почему именно OpenWebMail? На этот вопрос легко ответить кратким перечнем тех возможностей, которыми он обладает: поддержка большого количества языков; возможность настройки интерфейса с использованием различных тем и картинок; отличная поддержка MIME-типов; поддержка виртуального хостинга и псевдонимов; поддержка различных типов авторизации с возможностью изменить пароль в любое время; поддержка РАМ; поддержка автоответа; проверка текста сообщения на предмет ошибок; поиск по контексту; возможность использования протокола РОРЗ; управление всевозможными фильтрами; антивирусная защита; поддержка "белого" и "черного" списка адресов; возможность управлять системой SpamAssassin, в том числе и его автоматическим обучением. Впечатляет? И это только начало. Мы еще не упомянули о поддержке виртуального диска (WebDisk) и возможности запуска SSH-клиента в виде аплета. Установку пакета OpenWebMail в системе FreeBSD можно выполнить в три этапа. В первую очередь необходимо проверить наличие поддержки SUIDPERL. По умолчанию, данная возможность в системе FreeBSD отсутствует, поэтому, скорее всего, придется опять установить Perl из системы портов следующими командами: # cd /usr/ports/lang/perl5.8/ # make install clean -DENABLE_SUIDPERL -DFORCE_PKG_REGISTER Будет предложено заменить "старый" системный Perl на установленный из портов командой: # use.perl port Если установлен модуль modssl, то сценарий автоматической подстановки пароля при этом может перестать работать, и, как следствие, перестанет запускаться сам lweb-сервер Apache (в журнальном файле регистрации ошибок появится сообщение о «возможности проверить достоверность сертификата).Если вы оказались в этой непри- !гной ситуации, не стоит переживать — просто измените владельца на файл сценария, используемого в примере из листинга 17.7 (в нашем случае это был файл certpwd.pl), на пользователя, от имени которого запускаются процессы Apache. Вероятнее всего, это будет пользователь www (см. значения директив User и Group):
550 Глава 17. Настраиваем Web-сервер # cd /usr/local/etc/apache/vhosts # chown www:www certpwd.pl ЧТО ТАКОЕ SUIDPERL? Suidperl позволяет запускать сценарии на Perl от имени пользователя, который : ляется владельцем данного сценария. Но это не означает, что сценарий с права» пользователя root будет иметь неограниченные права в.системе. это его установка из набора порта! Второй шаг на пути к запуску OpenWebMail Просто выполните следующие команды: # cd /usr/ports/mail/openwebmail # make install clean После загрузки, компиляции и установки порта, в системе можно найти два новьи! каталога: /usr/local/www/data/openwebmail и /usr/local/www/cgi-bin/ openwebmail. Обратите внимание на то, что Web-сервер не требует создания каких- либо псевдонимов в файле конфигурации для правильной работы пакета OpenWebMail. После установки можно переходить к третьему этапу: настройке и проверке. Настройка OpenWebMail для системы FreeBSD заключается в изменении файла openwebmail. conf из каталога конфигурации /usr/local/www/cgi-bin/ openwebmail/etc и последующего выполнения команды: # /usr/local/www/cgi-bin/openwebmail/openwebmail-tool.pi —init Пору слов о файле etc/openwebmail.conf... По умолчанию, он подходит дм большинства пользователей, однако при необходимости наложить определенные ограничения на пользователей его следует расширить. Как и конфигурационный /etc/rc.conf системы FeeeBSD, файл etc/openwebmail.conf является переопределяющим. Для просмотра всех возможных значений и значений по умолчанию обратитесь к файлу etc/defaults/openwebmail.conf. Пример конфигурационного файла для системы OpenWebMail представлен в листинге 17.9, а пример внешнего вида интерфейса— на рис. 17.9 Листинг 17.9. domainnames auth module Пример mailspooldir ow cgidir ow cgiurl ow htmldir ow htmlurl logfile конфигурационного файла etc/op«nwebmail. conf auto auth unix.pl /var/mail /usr/local/www/cgi-bin/openwebmail /cgi-bin/openwebmail /usr/local/www/data/openwebmail /openwebmail /var/log/openwebmail.log % Включить антивирусную поддержку ClamAV, поддержку антиспамового # пакета SpamAssassin и возможность автообучения enable_viruscheck yes enable_spamcheck yes enable_learnspam yes enable_about no about_info_software no # не спрашивать настройки при первом входе пользователя auto_createrc yes default_style default_iconset default fscharset Adjunct Adjunct.Blue none
Дополнительные вопросы 551 Листинг 17,9.Окончание . . - .-'■ ■ .-, <-.; ........Via/■*£*■• i Украинский интерфейс default_language uk I Поддержка укр.символов default_charset koi8-u ( Автоматически перенаправлять на защищенное соединение forced_ssl_login yes I После авторизации оставаться на защищенном соединении 'stay_ssl_afterlogin yes * Запретить изменение пароля enable_changepwd no <default_signature> Open WebMail Project (http://openwebmail.org) </default_signature> S nformcx©»»ww.altersys-ua. am -"i2/02/2eo^S2:6'o7o4 pm +02<ЙГ. ko!8-u . Open WebMalFtzl^bpera 8.S Z S'X |айл Главка Вид Закладки Инструмент* Справка Ц Соэда ТЧ Ч» тьстраницу чС' • " ■' с GjAww.altersys-ua.com/cgi-bln/op jAlternatlve System (UA) ^_ ' ^Псиск: ВХЩНКШ) - , j 1/ ,-f\ # М1Жнародний день ска.» Тема д.' И 1Ы (Г-хд Дата л 12/02/2005 OliOslB 'У Автор pm 9 Ofexa u- G009I4 » 6<") 1 нових /1 повдампень / 737байт с* и # М'пкнародний день шв.» (»2i г Введения в храм Црес • [*змДень працшнтав ста - »Мжнароднийденьцив..* . ошук Сторшка.1 -г + APXIB » ере Кодаов %иа f hello Op«nWebM»il version 2.S1 ДоВШКа? Розм'ф '37 ,vj Рис. 17.9. Внешний вид почтового Web-интерфейса OpenWebMail для конфигурации из листинга 17.9 Изменения настроек вступают в действие сразу же после сохранения конфигурационного файла и не требуют перезапуска Web-сервера. Последним штрихом в настройке системы OpenWebMail станет выполнение следующих команд: # cd /usr/local/www/data/openwebmail/ # rm index.html # In -s redirect.html index.html После этого при обращении по адресу http://www.altersys-ua.com /openwebmail/ для домена www. altersys-ua.com стартовой будет страница входа в систему OpenWebMail. Более подробная информация по данному продукту находится на домашней странице проекта http://www.openwebmail.org/.
552 Глава 17. Настраиваем Web-сервер Пример конфигурационного файла httpd. conf Пример конфигурационного файла httpd.conf при использовании практически всех описанных ранее возможностей и примеров для домена www.altersys-ua.com представлен в листинге 17.10. Листинг 17.10.Примерк&нфигураЦйонноге4>а^ШЩ^:^<йШ '■" \УЩ&^я-.' ■" ServerType standalone ServerRoot "/usr/local" PidFile /var/run/httpd.pid ScoreBoardFile /var/run/httpd.scoreboard ResourceConfig /dev/null AccessConfig /dev/null Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 MinSpareServers 7' MaxSpareServers 15 StartServers 7 MaxClients 255 MaxRequestsPerChild 0 LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule mmap_static_module vhost_alias_module env_module define_module config_log_module mime__magic_module mime_module negotiation_module status_module info_module includes_module autoindex_module dir_module cgi_module asis_module imap_module action_module speling_module userdir_module alias_module rewrite_module access_module auth_module anon_auth_module db_auth_module digest_module proxy_module cern_meta_module expires_module headers_module usertrack module . so .so libexec/apache/mod_mmap_static.so libexec/apache/mod_vhost_alias.so libexec/apache/mod_env.so libexec/apache/mod_define.so libexec/apache/mod_log_config. libexec/apache/mod_mime_magic. libexec/apache/mod_mime.so libexec/apache/mod_negotiation.so libexec/apache/mod_status.so libexec/apache/mod_infо.so libexec/apache/mod_include.so libexec/apache/mod_autoindex.so libexec/apache/mod_dir.so libexec/apache/mod_cgi.so libexec/apache/mod_asis.so libexec/apache/mod_imap.so libexec/apache/mod_actions, libexec/apache/mod_speling. libexec/apache/mod_userdir. libexec/apache/mod_alias.so libexec/apache/mod_rewrite.so libexec/apache/mod_access.so libexec/apache/mod_auth.so libexec/apache/mod_auth_anon.so libexec/apache/mod_auth_db.so libexec/apache/mod_digest.so libexec/apache/libproxy.so libexec/apache/mod_cern_meta.so libexec/apache/mod_expires.so libexec/apache/mod_headers.so libexec/apache/mod usertrack.so . so . so . so
Дополнительные вопросы 553 loadModule log_forensic_module libexec/apache/mod_log_forensic.so LoadModule unique_id_module libexec/apache/mod_unique_id.so LoadModule setenvif_module libexec/apache/mod_setenvif.so <IfDefine SSL> LoadModule ssl_module libexec/apache/libssl.so </IfDefine> loadModule perl_module libexec/apache/libperl.so LoadModule php4_module libexec/apache/libphp4.so Clea rModu 1 e L i s t AddModule mod_mmap_static.c AddModule mod_vhost_alias.с AddModule mod_env.с AddModule mod_define.c AddModule mod_log_config.с AddModule mod_mime_magic.c AddModule mod_mime.c AddModule mod_negotiation.с AddModule mod_status.c AddModule mod_infо.с AddModule mod_include.c AddModule mod_autoindex.с AddModule mod_dir.с AddModule mod_cgi.c AddModule mod_asis.c AddModule mod_imap.c AddModule mod_actions.с 1 AddModule mod_speling.c | AddModule mod_userdir.с AddModule mod_alias.c AddModule mod_rewrite.с ! AddModule mod_access.с [AddModule mod_auth.c AddModule mod_auth_anon.с AddModule mod_auth_db.с ' AddModu1e mod_d i g es t.с AddModule mod_proxy.с AddModule mod_cern_meta.с AddModule mod_expires.с AddModule mod_headers.с AddModule mod_usertrack.c AddModule mod_log_forensic.c AddModule mod_unique_id.с AddModule mod_so.c AddModule mod_setenvif.с <IfDefine SSL> AddModule mod_ssl.c </IfDefine> AddModu1e mod_pe r1.с AddModule mod_php4.с Port 80
554 Глава 17. Настраиваем Web-сервер Листинг 17^th Продолжение >' У'*У>гёйУ г ^ ■. ■ ' 'иМ <IfDefine SSL> Listen 80 Listen 443 </IfDefine> User www Group www ServerAdmin info@altersys-ua.com ServerName www.altersys-ua.com DocumentRoot "/usr/local/www/data" <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory "/usr/local/www/data"> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> <IfModule mod_dir.c> <IfModule mod_php4.c> DirectoryIndex index.php index.html </IfModule> <IfModule !mod_php4.c> Directorylndex index.html </IfModule> </IfModule> AccessFileName .htaccess <Files - ,,A\.ht"> Order allow,deny Deny from all Satisfy All </F,iles> f UseCanonicalName On <IfModule mod_mime.c> TypesConfig /usr/local/etc/apache/mime.types </IfModule> DefaultType text/plain <IfModule mod_mime_magic.c> MIMEMagicFile /usr/local/etc/apache/magic </IfModule> HostnameLookups Off ErrorLog /var/log/httpd-error.log LogLevel warn LogFormat "%h %1 %u %t \"%r\" %>s %b \"%{Referer}i\" \"%(User-Agent)i\"" 4>combined LogFormat "%h %1 %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer
Дополнительные вопросы SSS |йстийг 17.10. Продолжение ТТ LogFormat "%{User-agent}i" agent CustomLog /var/log/httpd-access.log combined ServerSignature Email <IfModule mod_alias.c> Alias /icons/ "/usr/local/www/icons/" <Directory "/usr/local/www/icons"> Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> Alias /manual/ "/usr/local/share/doc/apache/" <Directory "/usr/local/share/doc/apache"> Options Indexes FollowSymlinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/" <Directory "/usr/local/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> </IfModule> <IfModule mod_perl.c> # При использовании OpenWebMail необходимо убрать или изменить <Files ~ "\.pl$"> SetHandler perl-script PerlHandler Apache::Registry Options ExecCGI Allow from all </Files> # <Location /perl-status> SetHandler perl-script PerlHandler Apache::Status Allow from any </Location> </IfModule> <IfModule mod_autoindex.c> IndexOptions Fancylndexing AddlconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip AddlconByType (TXT,/icons/text.gif) text/* AddlconByType (IMG,/icons/image2.gif) image/* AddlconByType (SND,/icons/sound2.gif) audio/* AddlconByType (VID,/icons/movie.gif) video/* Addlcon /icons/binary.gif .bin .exe Addlcon /icons/binhex.gif .hqx Addlcon /icons/tar.gif .tar
556 Глава 17. Настраиваем Web-сервер Листийг^ТЛО. Продолмсение * И-^'лУЖ"1ч'^ -' • *-/^j Addlcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv Addlcon /icons/compressed.gif . Z .z .tgz .gz .zip Addlcon /icons/a.gif .ps .ai .eps Addlcon /icons/layout.gif .html .shtml .htm .pdf Addlcon /icons/text.gif .txt Addlcon /icons/c.gif .c Addlcon /icons/p.gif .pi .py Addlcon /icons/f.gif .for Addlcon /icons/dvi.gif .dvi Addlcon /icons/uuencoded.gif . uu Addlcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl Addlcon /icons/tex.gif .tex Addlcon /icons/bomb.gif core Addlcon /icons/back.gif .. Addlcon /icons/hand.right.gif README Addlcon /icons/folder, gif ^DIRECTORY^ Addlcon /icons/blank.gif AABLANKICON/4" Defaultlcon /icons/unknown.gif AddDescription "GZIP compressed document" .gz AddDescription "tar archive" .tar AddDescription "GZIP compressed tar archive" .tgz ReadmeName README.html HeaderName HEADER.html Indexlgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t </IfModule> <IfModu1e mod_mime.с > AddLanguage en .en AddLanguage ru .ru AddCharset WINDOWS-1251 .cp-1251 AddCharset CP866 .cp866 AddCharset ISO-8859-5 .iso-ru AddCharset K0I8-R .koi8-r AddCharset UTF-8 .utf8 <IfModule mod_negotiation.c> LanguagePriority ru en </IfModule> AddType application/x-tar .tgz AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz #AddType application/x-compress ,Z #AddType application/x-gzip .gz .tgz AddHandler cgi-script .cgi AddType text/html .shtml AddHandler server-parsed .shtml AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps </IfModule> <IfModule mod_setenvif.c> BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "RealPlayer 4\.0" force-response-1.0 /BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0 </IfModule>
Дополнительные вопросы 557 Йистинг 17.10. Продолжение ■ ' 'У ~'т 'Л -j Щ& ' *'f ' '' \ . , NameVirtualHost *:80 <VirtualHost _default_:80> ServerAdmin info@altersys-ua.com DocumentRoot /usr/local/www/data ServerName www.altersys-ua.com ServerAlias www.altersys-ua.com <IfModu1e mod_php4.c> php_admin_value doc_root /usr/local/www php_admin_value open_basedir /usr/local/www php_admin_value user_dir /usr/local/www/data php_admin_value safe_mode_include_dir /usr/local/www php_admin_value safe_mode_exec_dir /usr/local/www php_admin_value upload_tmp_dir /usr/local/www/data/tmp </IfModule> </VirtualHost> <IfDefine SSL> AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl </IfDefine> <I fModu1e mod_s s1.с > SSLPassPhraseDialog exec:etc/apache/vhosts/certpwd.pl SSLSessionCache dbm:/var/run/ssl_scache SSLSessionCacheTimeout 300 SSLMutex file:/var/run/ssl_mutex SSLRandomSeed startup builtin SSLRandomSeed connect builtin SSLLog /var/log/ssl_engine_log SSLLogLevel info </IfModule> <IfDefine SSL> <VirtualHost _default_:443> DocumentRoot "/usr/local/www/data" ServerName www.altersys-ua.com ServerAdmin info@alterays-ua.com ErrorLog /var/log/httpd-error.log TransferLog /var/log/httpd-access.log Alias /phpmyadmin "/usr/local/www/phpMyAdmin/" SSLEngine on SSLCipherSuite <>ALL:!ADH: !EXP0RT5 б:RC4 +RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile /usr/local/etc/apache/ssl.crt/server.crt SSLCertificateKeyFile /usr/local/etc/apache/ssl.key/server.key SSLCACertificateFile /usr/local/etc/apache/ssl.crt/ca.crt <Files - "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </Files> <Directory "/usr/local/www/cgi-bin"> SSLOptions +StdEnvVars </Directory>
558 Глава 17. Настраиваем Web-сервер SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost> </IfDefine> # включение файлов с описанием виртуальных хостов для других доменов Include etc/apache/vhosts/main.com.ua Include etc/apache/vhosts/klipov.net Include etc/араche/vhosts/ttt.net.ua Расширение и альтернативы Apache Кроме установки модулей, Apache можно расширить другими способами, например, через сервер страниц JSP — TomCat или портальную систему Zope. Оба эти продукта можно найти в наборе портов (см. директорию /usr/ local /www). В данный момент существует множество альтернативных Web-серверов, имеющих свои преимущества и недостатки, но Apache, все же, — несомненный лидер. Некоторые альтернативные Web-серверы можно найти в наборе портов, но их изучение оставим читателю в качестве домашнего задания ©.
Сеанс связи 559 ГЛАВА 18. СЕРВЕР FTP Практически каждый, кто работает в Internet, когда-нибудь сталкивался с вопросом поиска файлов. Для решения этой задачи большинство серверов предоставляют доступ к своему архиву по протоколу FTP, который появился практически одновременно с по- «влением Internet — в 1971 году протокол FTP был избран в качестве стандарта для организации файлового обмена в сети ARPANET. Сегодня эту службу имеют в своем составе практически все операционные системы, включая Windows, Novell и UNIX- системы. FreeBSD включает в себя довольно простой FTP-сервер, легкий в настройке, однако не очень надежный. Например, как показывает опыт, в локальной сети со скоростью передачи данных 100 Мбит довольно часто наблюдается случай обрыва передачи файлов. Еще одна проблема связана со способом запуска встроенного FTP-сервера на FreeBSD, что не очень хорошо с точки зрения безопасности системы в целом. Но об этом мы поговорим чуть позже. Итак, какие возможности предоставляет FTP? В первую очередь, это передача файлов любого размера (для чего, в принципе, этот протокол и был разработан) как в двоичном (BINARY) так и в символьном (ASCII) виде. При этом файл, который не был передан полностью, может быть дозаписан без необходимости передачи с самого начала. Во-вторых, FTP имеет встроенную поддержку аутентификации пользователей, которая в принципе отсутствует в протоколе HTTP. Если говорить об отличиях в этих протоколах, то одной из основных особенностей FTP является двунаправленность (то есть, возможность как принимать файлы, так и передавать их на сервер). Кроме того, протокол FTP поддерживает определенные операции файловой системы, например, создание/удаление директорий и файлов, изменение прав, переименование. Протокол FTP является сеансовым, из чего следует, что для возможности передачи файлов между клиентом и сервером устанавливается двустороннее соединение, осуще- ствляотся постоянный обмен командами, а разрыв связи происходит по инициативе ишента или по истечению определенного времени бездействия. При этом для одного сеанса FTP создаются два соединения: непосредственно для передачи данных, называемое ftp-data (порт 20), а также для управления и обмена сообщениями, называемое просто ftp (порт 2 П. СЕАНС СВЯЗИ Сеанс связи начинается с того, что клиент открывает соединение по порту 21 (это стан- цартиое значение можно изменить в файле /etc/services), которое остается откры- njv на протяжении всего сеанса. Протекает встроенный процесс аутентификации FTP и основе информации о пользователях системы, на которой работает FTP-сервер (для колд ил FTP-сервер, подобно терминальной сессии по Telnet или SSH, используются метенные учетные записи пользователей сервера). При любой команде передачи данных сервер и клиент договариваются о временном юрте. Как правило, это порт 20, если не определено иное в файле /etc/services. Если соответствующая запись в этом файле отсутствует, то используется порт с номе- fOM На единицу меньше номера порта, по которому было установлено соединение. Этот
560 Глава 18. Сервер FTP порт используется для непосредственной передачи одного блока данных, после чего он закрывается. Блоком данных будем называть любую последовательность данных, как то: файл или список файлов в директории. Таким образом, на протяжении одного сеанса связи с сервером, для передачи данных может быть открыто несколько сеансов передачи данных. В конце сеанса клиент передает команду завершения. Если сервер долго не получает команд от клиента, он принудительно разрывает соединение. Приведем пример соединения с FTP. # ftp mobile.altersys-ua.com Connected to mobile.altersys-ua.com. 220 mobile.altersys-ua.com FTP server (Version 6.00LS) ready. Name (mobile.altersys-ua.com:root): informex 331 Password required for informex. Password: 230 User informex logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/home/informex" is current directory. ftp> cd /home/depot/pics/Partl 250 CWD command successful. ftp> Is 150 Opening ASCII mode data connection for '/bin/Is'. total 1360 155839 134414 98251 30449 40351 175591 134616 -rwxrw-rw- -rwxrw-rw- -rwxrw-rw- -rwxrw-rw- -rwxrw-rw- -rwxrw-rw- -rwxrw-rw- wheel wheel wheel wheel wheel wheel wheel anp 17:55 bootmgr.pcx anp 16:14 custom_install.pcx anp 14:28 dasklabel_swap.pcx anp 13:27 disklabell.pcx anp 22:58 fdisk_dos.pcx anp 21:50 media.pcx anp 21:57 select_drives.pcx 1 nobody 1 nobody 1 nobody 1 nobody 1 nobody 1 nobody 1 nobody 226 Transfer complete. ftp> ascii 200 Type set to A. ftp> binary 200 Type set to I. ftp> get bootmgr.pcx local: bootmgr.pcx remote: bootmgr.pcx 150 Opening BINARY mode data connection for 'bootmgr.pcx' (155839 bytes). 100% I ************************************************* I 152 KB 00*00 ETA 226 Transfer complete. 155839 bytes received in 0,43 seconds (357,69 KB/s) ftp> quit 221 Goodbye. Как можно заметить из примера соединения, для работы с файлами на FTP используются команды, во многом похожие на те, которые применяют при работе с локальной файловой системой, например, pwd, Is, cd и т.д. При загрузке файлов на удаленный или на локальный компьютер используется директория, из которой был вызван клиент FTP. Для изменения этой директории применяется команда led (local cd). Для пересылки файлов используют команды get/put и mget/mput (первые две — для получения/оправки одного файла, две другие — для нескольких файлов соответственно). Для того чтобы получить полный список команд, поддерживаемых FTP-сервером, во время соединения необходимо ввести команду ? или help.
Немного о доступе 561 Обратите внимание на используемый режим передачи, принятый по умолчанию. Существует два режима: двоичный и в виде текста. Современные FTP-клиенты автоматически определяют тип файла и переключаются в необходимый режим, но полагаться на это все же не следует. Во избежание порчи данных или текста, используйте для текстовых файлов режим передачи "ASCII" (переключение в FTP- ипиенте— по команде ascii), а для всех остальных файлов (исполняемые про- фаммы, двоичные файлы баз данных, изображения) — режим "BINARY" (переключение по команде binary). Как упоминалось в начале главы, способ запуска FTP-сервера на FreeBSD — не лучший вариант, поскольку для этого используется даемон суперсервера inetd (ftpd может запускаться и в автономном режиме, о чем речь пойдет чуть позже). К тому же, кроме проблем в защите с суперсервером, весьма проблематично и использование самого FTP-сервера ftpd. В связи с этим, рекомендуется использовать альтернативные FTP- серверы, например, ProFTPD, Pure-FTPd (к слову, именно этим сервером предпочитает пользоваться автор этой книги) или Wu-FTPD. Эти и другие популярные альтернативные FTP-серверы можно найти в портах в директории /usr/ports/ftp. Описание установки, настройки и возможностей одного из них будут рассмотрены в конце главы. Файлы настройки FTP-сервера находятся в каталоге /etc и /var/ftp/etc (возможно, в системе поначалу будет только один файл — /etc/f tpusers, а остальные придется создать самому). НЕМНОГО О ДОСТУПЕ На первом шаге настройки FTP-сервера следует определить, кому будет предоставлено право на доступ. Обычный аутентифицированный доступ к FTP предполагает, что поль- юватель окажется в домашней директории, но корневым каталогом будет директория системы root. При этом любой пользователь, как и в случае использования терминальной сессии, может просматривать структуру каталогов и создавать файлы в любом месте, где у него на это есть право. Если существуют пользователи, которым необходимо закрыть FTP-доступ, то для зтого используют файл /etc/f tpusers, в котором перечислены все пользователи без права входа. Для анонимного пользователя создается ограниченная среда, где корневая и домашняя директория совпадают, при этом пользователь даже не будет знать, в какой директории он в действительности находится в данный момент. Для анонимного пользователя принято создавать директорию /var/ftp и несколько необходимых поддиректорий (для возможности запустить среду chroot). Для входа анонимного пользователя используется имя ftp или anonymous (в системе должен присутствовать пользователь ftp), а в качестве пароля, по соглашениям, принято использовать адрес электронного почтового ящика. У FTP-сервера есть опция, разрешающая только анонимный доступ. НАСТРОЙКА FTP Прежде чем рассмотреть назначение и описание конфигурационных файлов, а также настройки сервера, перечислим несколько простых правил для пользователей FTPD: имя пользователя должно быть указано в файле /etc/passwd, а пароль не должен быть нулевым; если пароль-отсутствует, то пользователь обязан установить его прежде, чем выполнять какие-либо операции;
562 Глава 18. Сервер FTP имя пользователя или его группа должны отсутствовать в файле /etc/ f tpusers (перед именем группы стоит знак "@"); пользователь не должен находиться в группе, указанной в файле /etc/ ftpusers; у пользователя должен быть установлен стандартный командный интерпретатор, указанный в файле /etc/shell. Запомнив эти правила, в будущем можно избежать некоторых банальных ошибок» долгих почесываний головы в поисках ответа на вопрос: "Что же здесь не так?". Итак, вернемся к нашим баранам, то есть, файлам, имеющим отношение к настройке FTP-сервера. Файлы настройки /etc/ftpusers Здесь содержится список "волков" или, иначе говоря, — нежелательных пользователей и групп пользователей, которым запрещен вход по FTP. Этот файл по умолчанию присутствует в системе после установки и содержит список имен системных пользователей, под которыми, в основном, запускаются системные процессы. Внесите в этот список, в первую очередь, всех специфических пользователей, имеющих неограниченные права в системе, или пользователей, под которыми выполняются некие процессы. Как говорится: "На чужой корешок не разевай роток!". Пользователи в файле перечислены просто по имени учетной записи. Для того чтобы определить группу, перед ее именем необходимо поставить символ "@". Внесенные изменения сразу же вступают в силу, и перезапуск сервисов не потребуется. Пользователи из этого списка будут получать отказ в соединении еще до ввода пароля. Это сделано в целях защиты, дабы лишний раз не передавать незашифрованный пароль по сети. /etc/ftpchroot Здесь содержится список всех "нормальных" пользователей, ограниченных своей домашней директорией (с использованием chroot). К слову, если вы — хостер и решились использовать ftpd (оригинально звучит и вызывает улыбку), то учтите, что это- именно тот вариант, который вам необходим (но лучше используйте альтернативный FTP-сервер). /etc/ftpwelcome Текстовый файл, содержащий сообщение, которое отображается после создания соединения до запроса имени пользователя. /etc/ftpmotd Сообщение дня. Приветствие после регистрации пользователя на FTP-сервере. Обратите внимание, что для анонимных пользователей путь к этому файлу выглядит как /var/ftp/etc/ftpmotd, а для остальных пользователей, помещенных в среду chroot, он расположен в домашней директории пользователя: -username/etc/ f tpmotd. /var/run/nologin Если присутствует этот файл, то общий вход по FTP будет запрещен, а при попытке соединиться выводится его содержимое. Хостеры могут использовать это для первоапрельских розыгрышей (правда, не без финансовых последствий). Если необходимо быстро отключить регистрацию всех пользователей и только по FTP (оставив, например,
Настройка FTP 563 возможность входа в терминальную сессию), то создайте этот файл с помощью команды touch в каталоге /var/run. В результате, при попытке соединения сервер моментально ответит сообщением "530 System not available". Если при этом требуется описать причину отключения сервиса, отредактируйте файл, добавив необходимые строки текста. Это может выглядеть следующим образом: # ftp mobile.altersys-ua.com Connected to mobile.altersys-ua.com. 530- Profilatiktika do 01.08.2005 530- Izmenenie nastroek i prav dostupa. 530- 530- Try to connect later ... 530 System not available. ftp> Для разрешения доступа к FTP-серверу просто удалите файл /var/run/nologin. /var/log/ftpd Это — журнал анонимных соединений, в котором записываются сведения о всех файлах, полученных анонимными пользователями. Здесь хранится следующая информация: дата передачи; адрес электронной почты, введенный в качестве пароля; имя или IP-адрес компьютера, с которого производился вход; переданный файл; количество переданных байтов и код завершения (например, I — успешное завершение. 2 - передача файла была прервана и т.д). Все записи разделены знаком восклицания. Для возможности ведения журнала анонимных соединений, создайте его с помощью команды touch, а также добавьте ключ - S в параметрах запуска FTP в файле суперсервера. Пример содержимого файла /var/log/ftpd: # more /var/log/ftpd Apr 10 15:07:37 2005!adidok@altersys-ua.com!informex!/incoming/net- <b3.2.1.tar.gz!202100!l /etc/ftphosts Подобно Web-серверу Apache, FTP поддерживает виртуальные хосты для каждого отдельного IP-адреса. Для этого, в первую очередь, необходимо создать файл /etc/ftphosts, поскольку по умолчанию его в системе нет. Для описания каждого виртуального FTP-сервера используется одна строка, в которой можно указать отдельные файлы конфигурации (например, если есть необходимость вести отдельный журнал). Каждая такая строка представляет собой пять полей, разделенных пробелом или знаком табуляции. Для использования значения по умолчанию в соответствующем поле следует указать знак дефиса "-". Порядок значений таков: DNS-имя или IP-адрес используемый для виртуального FTP-хоста; имя пользователя системы, домашняя директория которого будет использоваться как root для анонимных пользователей; не забудьте создать соответствующую структуру директорий, необходимую для правильной работы (об этом речь пойдет чуть позже); путь к журнальному файлу всех пересылок; путь к файлу f tpwelcome; путь к файлу f tpmotd.
564 Глава 18. Сервер FTP Пример файла /etc/f tphosts: It more /etc/f tphosr.s 192.163.0.200 informex /var/log/ftpd.]ocal - 82.200.25.15 - /var/ftp/etc/ftpmctd ftp /var/log/ftpd/etc/ftpwelcome /etc/ftpmotd В последней строке файла указаны значения по умолчанию, применяемые в том случае, когда вместо значения подставлен знак дефиса. /etc/shells Файл, в котором перечислены все командные интерпретаторы. Используется для предотвращения входа пользователей, у которых установлен некорректный командный интерпретатор. Как правило, после проверки имени пользователя даемон сверяет значение командного интерпретатора пользователя, а также наличие его имени в этом файле и использование в системе. В случае, если соответствие не найдено, пользователь получает сообщение об отказе в доступе: # finger mysql Login: mysq] Name: mysqld user Directory: /home/system/mysql Shell: /sbin/nologin Never logged in. No Mail. No Plan. # ftp mobile.altersys-ua.com Connected to mobile.alter5y5-ua.com. 220 mobile.altersys-ua.com FTP server (Version 6.00LS) ready. Name (mobile.altersys-ua.com:root): mysq] 530 User mysql access denied, ftp: Login failed. ftp> quit 221 Goodbye. ПРИМЕЧАНИЕ Утилита /sbin/nologin выводит сообщение "This account is currently not available", Если требуется предотвратить доступ пользователя в систему, то проще всего это сделать, изменив его интерпретатор на /sbin/nologin. При использовании анонимного FTP должны присутствовать еще несколько файлов и каталогов в /var/ftp, повторяющие структуру файловой системы, поскольку FTP- сервер использует некоторые системные утилиты, а в данном случае эти утилиты будут недоступны в ограниченной среде chroot. Настройка анонимного FTP-доступа Если не включить опцию Anonymous FTP во время постконфигурирования после установки системы, то анонимный FTP-доступ будет отключен. Для активизации этого доступа используют два метода: с помощью программы /stand/sysinstall; создать вручную пользователя ftp с определенными параметрами и определенной структурой домашней директории. В первом случае следует запустить sysinstall, перейти в раздел Configure, а затем — в раздел Networking, где необходимо выбрать опцию Anon FTP и в ответ на запрос "User Confirmation Requested " ответить YES.
Настройка FTP 565 В результате откроется окно, показанное на рис. 18.1: flnonynous FTP Configuration > UID: Group: CoMMent: 14 I operator I finonoHous FTP.fldMin Path Configuration FTP Root Directory: •ver'ftp Upload Subdirectory: iiiconjng 1 1 год] roHCKi. 1 Рис. 18.1. Окно конфигурирования анонимного FTP-доступа Обычно здесь оставляют все значения, выбранные по умолчанию, но, возможно, S' ждется изменить идентификатор UID, если он уже занят в системе (например, на 21). осле этого можно перейти к кнопке ОК. и нажать ее. На вопрос о создании welcome- сообщения ответьте YES, если перед входом в систему требуется доводить до сведения Пользователей какую-либо информацию, или NO. После этого окно можно закрыть. В результате в систему будет добавлен пользователь ftp с псевдонимом anonymous, и создано дерево каталогов и файлов в директории /var/f tp. Теперь настройте запуск inetd и ftpd или разрешите запуск ftpd в режиме даемона как будет описано ниже. , В случае ручной настройки анонимного FTP-доступа, добавьте в систему с помо- ью команды pw пользователя ftp и создайте иерархию директорий и файлов в до- инем каталоге пользователя /var/f tp как показано ниже : # pw user add -n ftp -u 14 -c "ftp user" -d /var/ftp -g 5 -s /nonexistent # mkdir -p /var/ftp/etc; mkdir /var/ftp/bin; mkdir /var/ftp/pub # mkdir /var/ftp/incoraing # cd /var; chmod -R 555 /var/ftp; chown -R root:operator ftp # cp /bin/Is /var/ftp/bin/ # cp /bin/date /var/ftp/bin/ # chmod a-rw ./ftp/bin/* Каталог /var/ftp/bin должен содержать выполняемые файлы Is и date, необходимые FTP-серверу для правильного генерирования списка файлов. Для того чтобы в листингах каталогов вместо uid и gid отображались имена вла- (ельцев файлов, скопируйте файлы /etc/passwd и /etc/group в директорию Var/ftp/etc/: # cp /etc/passwd /var/ftp/etc/ # cp /etc/group /var/ftp/etc/ Обязательно отредактируйте их, и приведите, например, к такому виду: # more /var/ftp/etc/group operator:*:5: # more /var/ftp/etc/passwd root:*:0:0:root:/:/nonexistent ftp:*:14:5:ftp user:/var/ftp:/nonexistent
566 Глава 18. Сервер FTP Установите права доступа только на чтение: # chmod a-wx /var/ftp/etc/* Если необходимо, создайте для анонимного пользователя файл f tpmotd ("Сообщение дня") в каталоге /var/f tp/etc/. Если анонимным пользователям требуется предоставить право загружать какие- либо файлы, то для этого служит директория /var/f tp/pub. В ней можно создавать любую иерархию каталогов и размещать общедоступные файлы. Для обмена информацией с анонимными пользователями служит каталог incoming. Это должен быть единственный каталог с правом записи "для всех", но не забудьте установить бит устойчивости: # chmod 1777 /var/ftp/incoming Как правило, анонимные пользователи не имеют права переименовывать и удалять файлы в каталоге incoming. Если такая возможность все-таки будет необходима, для этого служит параметр -т. Перед запуском анонимного FTP-сервера с правом переименования и удаления файлов, еще раз проверьте права на все каталоги в домашней директории анонимного пользователя. Не забудьте разрешить запуск inetd, который в свою очередь должен быть настроен на запуск f tpd (или запустите f tpd в режиме даемона). Для отключения анонимного FTP-доступа необходимо удалить пользователя ftp и, возможно, директорию /var/f tp. СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ ТОЛЬКО С FTP- ДОСТУПОМ К слову, никто не мешает установить для пользователя в качестве командного интерпретатора сам даемон f tpd, не забыв заранее добавить соответствующую запись в файл /etc/shells. При этом мы получаем оригинальное решение ограничения доступа: пользователь не сможет регистрироваться в системе, кроме как по FTP. А если еще не забыть при этом добавить пользователя в файл /etc/f tpchroot, то пользователь не сможет выйти за пределы своей домашней директории. Итак, выполним следующие действия: 1. Добавим в файл /etc/shells новую строку 'Vusr/libexec/ftpd", чтобы в качестве командного интерпретатора можно было использовать даемон f tpd. 2. Изменим для пользователя интерпретатор, выбранный по умолчанию. Это наиболее просто сделать с помощью утилиты pw. Например, для пользователя inf ormex это будет выглядеть так: # pw usermod informex -s /usr/libexec/ftpd. 3. Подменим директорию root с использованием chroot, добавив в файл /etc/f tpchroot новую строку с именем ограниченного пользователя. ЗАПУСК FTPD В РЕЖИМЕ ДАЕМОНА Несмотря на распространенное мнение о том, что ftpd якобы не может запускаться в режиме даемона, такая возможность все-таки существует. Наиболее интересные параметры, с помощью которых можно управлять поведением FTPD (и не только в режиме даемона) представлены в табл. 18.1:
Запуск FTPD в режиме даемона 567 Таблица 18.1. Параметры, с помощью которых можно управлять поведением FTPD Параметр Описание /-D Запуск FTPD в режиме даемона -4 Прослушивание соединения по IPv4 ,*а address Привязка к адресу, если есть несколько сетевых интерфейсов с различными IP-адресами. -а Разрешение только анонимного доступа к серверу -h Отключение печати специальной информации об имени хоста и версии используемого сервера FTP -1 Ведение журнального файла syslog (не забудьте настроить syslog. conf на log_ftp) -г Режим "только чтение". Устанавливается, если необходимо запретить операцию изменения содержимого файловой системы, доступной по FTP -t Таймаут до разрыва связи в секундах. По умолчанию равен 900 с (15 мин.) -s Запись информации о полученных файлах в файл /var / log/f tpd. Структура файла рассмотрена ранее в этой же главе -т Разрешение анонимному пользователю переименовывать и удалять файлы, если это позволяют права файловой системы для этого файла -м Запрет анонимным пользователям создавать директории Существует еще множество других параметров, способствующих гибкой настройке сервера FTP. Для того чтобы узнать о них, обратитесь к справочной информации с помощью команды man f tpd. Если эти параметры требуется использовать при запуске ftpd с применением суперсервера inetd, то их следует добавить в файл конфигурации /etc/inetd.conf. По- умолчанию, запись в этом файле для FTP-сервера выглядит следующим образом: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -1 Напишем простой сценарий запуска FTP-сервера в режиме даемона при старте системы и корректного завершения при останове с временем ожидания 5 минут, возможностью принимать только анонимные соединения и указанием не передавать имя и версию «оста. Разместим этот сценарий в каталоге /usr/local/etc/rc.d под именем ftpd.sh (не забыв сделать его запускаемым с помощью команды chmod +x ftpd.sh): #!/bin/sh PREFIX=/usr/libexec ftpd=$(PREFIX}/ftpd pidfile=/var/run/ftpd.pid case $1 in start) if [ -f $ftpd ]; then $ftpd -Dl -t 300 -AS -h -4 -p $pidfile echo -n 'FTPD daemon started. ' fi stop) kill "cat $pidfile' echo -n 'FTPD daemon stoped. ' echo "usage: $0 (start|stop)" esac
568 Глава 18. Сервер FTP АЛЬТЕРНАТИВНЫЕ FTP-СЕРВЕРЫ Как упоминалось в начале главы, несмотря на простоту и интегрированность сервера ftpd, его использование в реальной жизни — не самый лучший вариант. Для расширения возможностей используйте FTP-серверы сторонних разработчиков. Рассмотрим некоторые из наиболее популярных проектов. Pure-FTPd Это один из самых простых, быстродействующих и качественных FTP-серверов, который был разработан с целью обеспечения безопасности в конфигурации по умолчанию. На сегодняшний день для этого сервера неизвестно ни единой уязвимости. Управлять им очень просто, благодаря одному главному конфигурационному файлу, понятному для восприятия. Рассмотрим преимущества этого альтернативного FTP-сервера более детально. Безопасность В первую очередь следует отметить, что сервер Pure-FTPd может быть выполнен не под системной учетной записью пользователя root. Он обладает встроенной эмуляцией chroot и виртуальными учетными записями (при использовании баз данных). Позволяет избежать передачи паролей и команд в виде текста, поскольку в нем реализована дополнительная поддержка для уровня кодирования SSL/TLS (используется библиотека OpenSSL). Pure-FTPd предоставляет широкие возможности по ограничению количества одновременно подключенных пользователей и пропускной способности. Позволяет скрывать системные файлы. Есть возможность предотвратить полную загрузку разделов, в которых хранятся файлы, доступные по FTP. С помощью команды pure-f tpwho можно просмотреть в реальном режиме времени все активные сеансы с детальной информацией о них. Расширенные возможности К расширенным возможностям Pure-FTPd можно отнести следующее: полностью поддерживается идентификация LDAP; существует возможность хранить всю пользовательскую информацию в базах данных MySQL; поддерживается виртуальная система квотирования — учетные записи могут иметь индивидуальную квоту по количеству файлов и полному размеру; поддержка ограничения пропускной способности с регулируемыми значениями скорости как загрузки, так и выгрузки; в случае хранения информации в базе данных, каждому пользователю может быть назначена индивидуальная квота, пропускная способность, наличие ограничения chroot; существует возможность вызывать внешние сценарии после успешной загрузки файлов, например, для сканирования на наличие вирусов; существует возможность автоматически создать домашний каталог во время первого входа пользователя; Сервер Pure-FTPd может работать как приватный FTP-сервер и отвергать все анонимные подключения даже при наличии в системе пользователя ftp. Установка и запуск Этот FTP-сервер, как правило, находится в коллекции портов по адресу /usr/ports/ftp/pure-ftpd. Выполните команду make install clean в ука-
Альтернативные FTP-серверы 569 занной директории для установки Pure-FTPd. После этого можно найти несколько примеров конфигурационных файлов с расширением *. sample в директории /usr/ local /etc. Переименуйте требуемый файл и отредактируйте его (за более детальной информации о различных вариантах настройки обращайтесь к документации по адресу http: //www. puref tpd. org/). Сервер можно запускать как даемон или же используя суперсервер inetd. В первом случае запуск сервера производится сценарием /usr/local/etc/rc.d/pure-f tpd. sh. Во втором случае, следует изменить файл /etc/inetd. conf таким образом, чтобы запись для FTP-сервера имела вид: ftp stream tcp nowait root /usr/local/sbin/pure-ftpd pure-ftpd Пример конфигурации Рассмотрим на примере часть опций из конфигурационного файла сервера Pure- FTPd (с комментариями): ft Ограничить всех пользователей их собственной директорией ChrootEveryone yes # Количество одновременных соединений с сервером MaxClientsNumber 20 # Разрешить запуск в фоновом режиме (как даемон) Daemonize yes # Количество соединений с одного IP-адреса MaxClientsPerIP 4 # Включение записи всех комманд клиента в журнал VerboseLog yes # Всегда показывать скрытые dot-файлы, # даже если пользователь не выполнил команду "-а". DisplayDotFiles no # Включить только анонимные соединения. AnonymousOnly no # Возможность отключить анонимные соединения NoAnonymous yes # Определять имена машин в журнальном файле или оставлять # IP-адрес. На нагруженных серверах и без ДНС рекомендуется # не определять DontResolve yes # Максимальное время ожидания в минутах MaxIdleTime 15 (t Использовать стандартную авторизацию пользователей UNIX # (по файлу /etc/passwd) UnixAuthentication yes # Ограничение для команды 4s'. Первый аргумент ограничивает # количество файлов в листинге. Второй ограничивает уровень # поддиректорий после которого листинг не работает LimitRecursion 1000 8 # Позволять ли анонимным пользователям создавать директории AnonymousCanCreateDirs no # Запрет получения файлов, владельцем которых является # пользователь "ftp", таким образом все файлы, записанные # анонимным пользователем, не могут быть получены кем-либо, # до тех пор, пока, например, администратор не проверит их # и не изменит права AntiWarez yes # IP-адрес/порт для прослушивания FTP-запросов Bind 192.168.0.200,21 .# Пропускная способность для анонимных пользователей в Кбит/с. AnonymousBandwidth 8
570 Глава 18. Сервер FTP tt Пропускная способность для всех пользователей # (включая анонимных) в Кбит/с. UserBandwidth 100 # Маска при создании файлов # <umask для файлов>:<итазк для каталогов> Umask ' 133:022 # Минимальный UID пользователя, которому возможен доступ. # Преграждает доступ под специальными псевдпользователями # системы MinUID 100 # Запретить или разрешить удалять/писать dot-файлы ProhibitDotFilesWrite no (t Ограничить возможность просмотра dot-файлов ProhibitDotFilesRead no # Запретить перезапись файлов, вместо этого автоматически # переименовывать вновь полученные файлы по принципу: # file.l, file.2, file.3, . . . AutoRename no # Запретить анонимным пользователям загружать новые файлы # (по = загрузка разрешена)- AnonymousCantUpload no # Создавать дополнительный файл загрузок в формате подобном # Apache (elf:), по стандарту W3C (w3c:) # или в формате статистики (stats:). Этот файл можно будет # использовать для анализаторов трафика AltLog w3c:/var/log/pureftpd.log # Запретить/разрешить использование команды CHMOD. NoChmod no # Разрешение пользователям загружать и продолжать загрузку # файлов с запретом/разрешением на их удаление # (по = разрешить удалять). KeepAllFiles no # Автоматически создавать при соединении домашнюю директорию # пользователю, у которого ее нет CreateHomeDir . no # Разрешить виртуальные квоты. Первое число обозначает # квотирование количества файлов. Второе число задает # максимальный размер директории в мегабайтах. Установите 0:50 # для установки квоты только по суммарному размеру директории # в мегабайтах Quota 0:250 # Путь к pid-файлу PIDFile /var/run/pure-ftpd.pid # Запрет на получение новых файлов, когда диск заполнен на # XX процентов. MaxDiskUsage 90 # Установите 'yes *, если хотите # запретить переименование файлов NoRename ' no # Если вы уверены в "продвинутости" пользователей вашего # FTP-сервера, .установите 'yes'. # Если вы - хостер, то обязательно установите эту опцию. CustomerProof yes # Ограничение на одновременное соединение пользователей с одной # учетной записью. Формат: <количество одновременных соединений # на пользователям<количество одновременных анонимных # соединений> PerUserLimits 1:10
Альтернативные FTP-серверы 571 # По умолчанию сервер прослушивает запросы как по IPv4, так и # по IPv6. Данная опция ограничивает прослушивание только IPv4 IPV40nly yes ProFTPD Сервер ProFTPD появился в результате стремления получить безопасный FTP- сервер, который был бы настолько же конфигурируем как и Apache. В настоящее время существует очень мало FTP-серверов, которые используют стандартный, встроенный в систему даемон FTP. Ранее чаще всего в качестве сервера использовалось приложение wu-ftpd. Хотя оно и обеспечивало превосходную работу, в нем, все же, присутствовал ряд недостатков и проблемы с безопасностью. В результате был разработан полностью новый, не основанный на других FTP-серверах сервер ProFTPD, который сейчас довольно популярен и используется наряду с Pure-FTPd. Этот сервер может быть установлен с портов (/us r /ports/ ftp/pro ftpd). Особенности и характеристики На сегодняшний день ProFTPD обладает следующими особенностями: наличие одного главного файла конфигурации с директивами, интуитивно понятными любому администратору, который когда-либо использовал Web-сервер Apache; существует возможность создавать в домашней директории пользователя файл конфигурации . f tpaccess, подобный . htaccess в Apache; простота настройки множества виртуальных FTP-серверов с предоставлением анонимного FTP-доступа; может быть реализован как автономный сервер или как зависимый от inetd; анонимные каталоги FTP не требуют никакой определенной структуры и наличия системных утилит, как это было для встроенного сервера ftpd; может работать от имени непривилегированного пользователя в автономном режиме, что уменьшает возможности взлома; регистрация и поддержка utmp/wtmp — регистрация совместима со стандартом wu-ftpd; модульный дизайн позволяет расширять сервер с помощью дополнительных модулей — были написаны модули для поддержки баз данных SQL, LDAP-серверов, кодирования SSL/TLS, поддержки RADIUS, и т.д.; поддерживается IPv6; Более детальную информацию о сервере ProFTPD можно найти в документации по адресу http: //www. prof tpd. org.
572 Глава 19. Сетевая файловая система NFS ГЛАВА 19. СЕТЕВАЯ ФАЙЛОВАЯ СИСТЕМА NFS В UNIX, подобно другим операционным системам, существуют механизмы совместного использования файлов. Например, в операционных системах Windows или Mac OS есть механизмы, которые позволяют сетевым машинам получать доступ к файлам на других машинах как к своим собственным. В FreeBSD (как и в остальных UNIX-подобных системах) к такому механизму относится сетевая файловая система NFS (Network File System), которая, кроме описанных выше возможностей, обладает рядом превосходств, отсутствующих в других подобных протоколах. "Почему именно система NFS стала стандартом де-факто для UNIX, а, например, не FTP?", — спросите вы. Как уже упоминалось, NFS содержит ряд преимуществ перед другими протоколами. Для работы с файлами по протоколу FTP клиенту необходимо установить связь с сервером, найти и переписать требуемый файл на локальный компьютер, отредактировать его и переслать назад на FTP, разорвать связь. Более того, необходимо изучить несколько команд для обмена файлами по FTP, поскольку они отличаются от стандартных команд UNIX. Система же NFS обходит данные ограничения, позволяя "прозрачно" работать с удаленными файловыми системами. Для пользователя работа с NFS-ресурсами ничем не отличается от работы с локальными ресурсами — ему не нужно производить вход, копирование, изменение, выход. Также пользователю не требуется знать имя и пароль для доступа. Он может работать с NFS-ресурсом, даже не подозревая, что работает с файлами на удаленной системе. Например, можно определить автоматическое монтирование ресурса при загрузке или, используя даемон автоматического монтирования amd, "прозрачно" монтировать ресурс при обращении. Зачастую применение NFS обусловлено наличием большого количества дешевых клиентских машин с малым объемом дисков. Используя на сервере быстрые и большие SCSI-диски, несколько клиентов, имеющих одновременный доступ к ресурсу, практически не будут замечать задержек. ПРЕИМУЩЕСТВА NFS Как известно, ОС Windows использует широковещательные рассылки для сообщения другим системам о своем присутствии и о ресурсах, предоставленных для общего доступа. В дополнение к этому, каждый компьютер постоянно посылает запросы на выявление доступных ресурсов. Как следствие, мы получаем перегруженную информационными запросами сеть. Но что же сказать в отношении NFS? Данная система отличается тем, что является системой типа "клиент-сервер", где явно выявлены серверы, которые предоставляют ресурсы для совместного доступа, и клиенты, которые используют выделенные ресурсы. Ресурсы NFS общего пользования называются экспортируемыми файловыми системами. Для использования экспортируемой файловой системы как локальной, клиент должен смонтировать удаленный каталог к своей локальной файловой системе как и другой любой монтируемый ресурс.
Применение на практике 573 Таким образом. NFS имеет более централизованный вид, а при должной конфигурации может предоставить те же возможности, что и другие протоколы, и даже более того, но без возможности широковещательного выявления доступных серверов и ресурсов. Каждый NFS-клиент заранее должен знать, где находится сервер, и монтировать его ресурсы в явном виде (рис. 19.1). NFS server NFS client I I /home /dev /usr ukir adidok /home ukir adidok /var /tmp Рис. 19.1. Схема монтирования экспортируемой файловой системы Отнесем к преимуществам NFS-серверов также явное управление тем, какие клиенты имеют доступ к ресурсам, а каким будет отказано в доступе в зависимости от имени хоста. IP-адреса или через службу регистрации, такой как Kerberos или N1S. Поскольку на NFS-сервер не влияет наличие среды для широковещательной рассылки, он может использоваться в глобальных сетях, например в Internet. ВНИМАНИЕ! Автор книги не рекомендует предоставлять доступ к NFS-ресурсам по Internet. Это небезопасно. Для того чтобы предоставить доступ к файловым ресурсам удаленным пользователям, рекомендуется использовать сервисы, которые требуют аутентификации на основе пароля или ключа. В крайнем случае, можно создать VPN-туннель с шифрованием (смотрите подробности в главе 13) или использовать NFS Version 4. ПРИМЕНЕНИЕ НА ПРАКТИКЕ Система NFS используется практически во всех больших сетях, построенных на технологии UNIX. Ее использование соизмеримо с использованием сетевых ресурсов в сетях Windows. Перечислим наиболее распространенные способы использования NFS: предоставление нескольким машинам доступа к CD-ROM, ZIP, FLOPPY или другим носителям для совместного использования — это более дешёвый и удобный способ установки программного обеспечения на несколько машин; предоставление доступа к домашним каталогам пользователей, используя центральный сервер NFS, на котором размещаются все домашние каталоги пользователей — вне зависимости от того, на какой рабочей станции в данный момент работает пользователь, он может иметь доступ в один и тот же домашний каталог, что позволяет не заботиться о переносе и дублировании данных; размещение общего дистрибутивного каталога на сервере — например, экспортируя каталог /usr/ports/distfiles или /usr/ports, можно решить проблему обновления программного обеспечения и поддержки его в актуальном со-
574 Глава 19. Сетевая файловая система NFS стоянии. Другими словами, если требуется установить новый порт на несколько машин, то достаточно получить доступ к обновленным исходным текстам без их загрузки на каждой машине в отдельности. ПРОБЛЕМЫ БЕЗОПАСНОСТИ И СОХРАННОСТИ ДАННЫХ На сегодняшний день выделяют следующие основные проблемы в сфере обеспечения безопасности сетевой файловой системы: как известно, NFS построен на основе Sun RPC (удаленный вызов процедур) и в большинстве случаев для авторизации используется именно вызовы RPC — если не применяется безопасная форма RPC, то возможен спуфинг сервера NFS; даже при использовании Secure RPC информация передается через NFS в незашифрованном виде, что может послужить причиной легкого мониторинга всех данных и их использования; в случае перехвата данные нередко заменяются и могут приходить в измененном, некорректном виде; система NFS использует стандартный контроль доступа к файлам, что может вызывать проблемы в обеспечении безопасности как при использовании локальных ресурсов. Одной из характеристик системы NFS является постоянство соединения. В отличие от других подобных систем удаленного доступа, нет понятия идентификации текущего состояния соединения или использования ресурсов. Это означает, что в случае сбоя или перезапуска клиентской системы сервер не знает об этом и продолжает "думать", что есть активное соединение. В то же время, если произойдет сбой на сервере, клиентская машина может продолжать работать с ресурсами так, как будто ничего не произошло. Хотя на стороне сервера и нет такого понятия как "восстановление соединения", в определенных случаях это все-таки возможно. ИСТОРИЯ NFS Система NFS была разработана внутри компании SUN Microsystems в начале 1980-х годов. В дальнейшем она была трижды пересмотрена. NFS Версия 1 Данная версия была разработана как прототип для сетевой файловой системы и никогда не была выпущена для внешнего использования. NFS Версия 2 В 1985 году компания SUN впервые включает новый стандарт NFS Version 2 в свой продукт SunOS2. Данная версия стала популярной и была широко лицензирована многочисленным поставщикам Unix-систем. В конце 1980-х в Университете Беркли была выпущена совместимая и свободно распространяемая версия NFS. В течение десяти лет было внесено много тонких, недокументированных изменений. Некоторые поставщики систем уменьшали ограничения, другие, наоборот, накладывали. Зачастую такие изменения приводили к частичным несовместимостям между различными исполнениями системы NFS, но в целом NFSv2 обеспечивала больш>ю степень совместимости систем различных поставщиков.
Использование NFS в FreeBSD 575 NFS Версия 3 Спецификация NFS Version 3 была разработана на протяжении ряда встреч в Бостоне в июле 1992 года, однако рабочий код для NFS версии 3 был представлен некоторыми поставщиками только .в 1995 году, после чего стал широко доступным. По сравнению со второй версией, версия 3 содержала много усовершенствований, однако коренных изменений в принципы работы NFS и модель безопасности внесено не было. Дополнительные подробности можно узнать в документе RFC 1813. NFS Версия 4 Спецификация NFS Version 4 была описана в документе RFC ЗОЮ и издана в декабре 2000 года как проект стандарта (существует дополненная и исправленная версия RFC 3530 за 2003 год). Версия 4 отличается от предыдущих версий NFS большей гибкостью и включает в себя возможность блокирования и соединения как часть основного протокола. Версия NFSv4 разрабатывалась с возможностью обеспечения мощных средств безопасности, включая шифрование и поддержку ACL. В отличие от предыдущих версий. NFS Version 4 работает на протоколе TCP. К тому же. данная версия использует кодировку UTF-8, в то время как предыдущие версии использовали семибитную кодировку. ИСПОЛЬЗОВАНИЕ NFS В FREEBSD Как было отмечено выше, NFS состоит из двух основных частей: сервера и некоторого количества клиентов. Клиент обращается к данным, находящимся на сервере, в режиме удалённого доступа. Раз уж речь зашла о сетевой файловой системе, то само собой разумеется, реализация NFS присутствует и в FreeBSD, причем эту операционную систему можно сконфигурировать и как сервер, и как клиент. Для того, чтобы все функционировало нормально, необходимо настроить и запустить несколько процессов, перечисленных в табл. 19.1. Таблица 19.1. Процессы, необходимые для поддержки NFS в FreeBSD Даемон Описание nfsd Даемон NFS, обслуживающий запросы от клиентов NFS mountd Даемон монтирования NFS, который выполняет запросы, передаваемые ему от nfsd rpebind (FreeBSD 5.x) Этот даемон позволяет клиентам NFS определить порт, исполь- portmap (FreeBSD 4.x) зуемый сервером NFS. Заметьте, что в четвертой и пятой версиях название данного даемона отличается nfsiod Этот даемон может запустить клиент и обслуживает запросы, поступающие от сервера NFS. Он необязателен и для нормальной работы не требуется, но при запуске позволяет увеличить производительность. Дополнительную информацию можно получить в man-разделе по nfsiod Настройка клиента и сервера NFS на FreeBSD довольно проста. Рассмотрим этот процесс подробнее. Настройка сервера NFS Для того чтобы машина FreeBSD стала сервером NFS. в первую очередь необходимо проверить, существуют ли в файле /etc/rc.conf следующие две строки (и если не существуют — написать):
576 Глава 19. Сетевая файловая система NFS nfs server enablG="YES" por>:map_cnable="YES" ВНИМАНИЕ! В FreeBSD 5.0 и следующих версиях вместо portmap используется название rpcbind, соответственно вместо строки portmap_enable="YES" и подобных необходимо писать rpcbind_enable="YES". Это практически все, что необходимо сделать для запуска NFS-сервера при следующей загрузке системы. Если в файле /etc/rc . conf уже есть подобные строки, то в первую очередь обратите внимание, включают они данный сервис ("YES") или отключают ("NO"). По-умолчанию, в файле /etc/rc. conf, как правило, уже присутствует строка portmap_enable="YES"(rpcbind_enable="YES"). Обратите внимание на то, что в файле /etc/defaults/rc. conf данная опции принимает значение "NO". Другими словами, если строка отсутствует или удалена из файла /etc/rc . conf, то сервис portmap будет отключен, и сервер NFS просто не будет работать. Необходимо также отметить, что сервис mountd запускается автоматически, если прописан запуск NFS-сервера. После того как вышеописанные параметры определены и выполнен перезапуск системы, будут запущены соответствующие процессы. В сценарии запуска можно прописать несколько дополнительных параметров для упомянутых процессов, а список экспортируемых каталогов указать в файле /etc/exports. Даемон portmap (rpcbind) Даемон portmap предоставляет поддержку служб RPC и позволяет клиентам определять порт для подключения к серверу. Это связано с тем, что службы UDP могут иметь только одно соединение на порт, при этом для начального соединения с сервером NFS используется строго определенный порт 2049. Далее службы RPC динамически сопоставляют свободные номера портов для каждого клиента. Использование протокола UDP обусловлено тем, что подпрограммы RPC имеют короткий жизненный цикл и загружать их процессом создания и удаления TCP-соединения неоправданно, поскольку для обеспечения целостности переданных данных используются встроенные функции очередности сообщений и проверки надежности. Даемон nf sd Даемон nfsd является основным процессом сервера NFS и обслуживает подключения клиентов NFS (по одному процессу nfsd на каждого клиента). Количество процессов регулируется с помощью параметров (по умолчанию запускается только четыре процесса nfsd). Некоторые параметры nfsd перечислены в табл. 19.2. Таблица 19.2. Некоторые параметры даемона nfsd Параметр Описание -а -t -п Указывает принимать запросы, которые приходят на все IP-адреса, присвоенные NFS-серверу. Применяется по умолчанию, пока не будет использована ОПЦИЯ -h и Указывает обслуживать запросы от клиентов NFS, подключающихся по TCP Указывает обслуживать запросы от клиентов NFS, подключающихся по UDP Указывает количество запускаемых серверов h Указывает, к какому IP-адресу или имени привязать сервер. Как правило, используется на машинах с несколькими интерфейсами. Данную опцию можно указать несколько раз для различных IP-адресов
Использование NFS в FreeBSD 577 По-умолчанию nfsd, если не определить иное, запускается с тремя параметрами: -u -t -n 4. Эти значения указаны в файле /etc/def aults/rc. conf в строке: nfs_server_flags="-u -t -n 4"" Чтобы изменить параметры по умолчанию, необходимо добавить в файл /etc/rc. conf соответствующую строку с иными, необходимыми в конкретном случае параметрами. В качестве примера, будем считать, что наш сервер требует подключения шести клиентов. В этом случае в конфигурационный файл следует добавить такую строку: nfs_server_flags="-u -t -n 6" В результате сервер сможет обслуживать запросы от шести клиентов как по протоколу UDP, так и по протоколу TCP. Рассмотрим случай, когда на сервере есть два сетевых интерфейса: первый с IP-адресом 193.16.25.27 смотрит "в мир", а второй с IP- адресом 192.168.0.111 — в локальную сеть. Требуется сделать так, чтобы NFS-сервер могли увидеть только внутренние клиенты. Для этого необходимо добавить в файл /etc/rc. conf приблизительно такую строку: nfs_server_flags="-u -t -n 4 -h 192.168.0.111" В дополнение, рекомендуется закрыть доступ к NFS "извне", используя правила IPFW. Для этого в конфигурационном файле /etc/rc. firewall в используемом профиле необходимо добавить строку: $(fwcmd) add deny udp from any to ${oif} nfsd нли (что в нашем случае эквивалентно): ${fwcmdt add deny udp from any to 193.16.25.27 2049 Подробности о настройке брандмауэра IPFW можно узнать в соответствующей главе этой книги или в справочной системе по команде man ipf w. Даемон монтирования mountd Как упоминалось ранее, для первоначального соединения с NFS-сервером используется порт 2049. Именно программа mountd прослушивает данный порт и ожидает запросов на соединение. Данный сервис запускается автоматически вместе с процессами nfsd во время загрузки в ходе инициализации сети. Некоторые параметры, которые можно передать данному даемону, перечислены в табл. 19.3. Таблица 19.3. Некоторые параметры, которые можно передать даемону mountd Параметр Описание -2 Позволяет заставить клиентские машины использовать только вторую версию протокола NFS для работы с экспортируемыми каталогами -d выводит отладочную информацию -1 Активизирует регистрацию всех запросов монтирования -р <port> Принудительная привязка к указанному порту. Удостоверьтесь, что порт не занят и не закрыт правилами брандмауэра. Если даемон не сможет привязаться к данному порту, то будет записана ошибка в журнальных файлах, а даемон не запустится _г Данная опция позволяет обслуживать не только каталоги, но и обычные файлы По умолчанию, для совместимости с бездисковыми рабочими станциями, которые загружаются с помощью NFS, в файле /etc/def aults/rc. conf установлена только одна опция:
578 Глава 19. Сетевая файловая система NFS mountdf1адз="-г" Все опции можно переопределить/определить в файле /etc/ re . conf. Также даемон mountd следит за всеми ресурсами, указанными в файле /etc/ exports. Если в этот файл внесены изменения, то для перезагрузки информации об экспортируемых ресурсах даемону mountd необходимо послать сигнал HUP. Для этого, к примеру, может быть использована следующая команда: kill -HUP 'ps axlgrep mountd" Файл /etc/exports В файле /etc/exports определяются все директории, которые необходимо предоставить для общего доступа, используя NFS. Каждая строка в /etc/exports задает файловую систему, которая будет экспортироваться, а также указывает, какие компьютеры будут иметь к ней доступ, и другие параметры, влияющие на особенности предоставления доступа (строку можно разделить на три группы: ресурс, опции, и права доступа). Полное описание набора параметров, которые доступны для использования, можно найти на страницах справочной системы man exports. Рассмотрим несколько простых и наглядных примеров описания ресурсов в файле /etc/exports. Для начала, рассмотрим самую простую запись: /usr Здесь все понятно: есть экспортируемая файловая система /usr, монтировать которую сможет любой, кто будет знать о ее существовании. Если общий ресурс /usr — это точка монтирования локальной файловой системы, то клиентам может быть предоставлена возможность монтировать и поддиректории. Для этого необходимо использовать следующую строку: /usr -alldirs Теперь, зная, что в директории /usr присутствует поддиректория ports, клиент сможет напрямую монтировать последнюю. Для ограничения доступа только на чтение можно использовать один из нижеприведенных вариантов (при попытке записи клиент будет получать сообщение "Read-only file system" или "Permission denied"): /usr -alldirs -ro /home -alldirs,ro Для предоставления доступа только определенным машинам необходимо их перечислить в строке по порядку, например: /usr -alldirs -ro ns7.altersys-ua.com localsrv virtual /home -alldirs,ro localsrv.altersys-ua.com 82.21.134.209 Но есть одно "но"! Если в момент запуска даемон монтирования не сможет определить по имени IP-адрес компьютера, то он зависнет на определенное время в ожидании, а затем, так и не определив IP-адрес, все же запустится, но удалит упоминание о компьютере из списка машин, получивших возможность доступа. Учитывая это, после внесения изменений в файл /etc/hosts или обновления DNS, необходимо снова перезапустить даемон монтирования, иначе удаленный компьютер так и не получит доступа к ресурсам. В файле описания экспортируемых файловых систем вместо имен компьютеров можно использовать имена сетевых групп. Сетевые группы задаются в файле /etc/ netgroup. В каждой строке этого файла описывается одна группа — одна строка представляет собой запись, состоящую из имени группы и последовательного перечисления членов группы в формате (host, user, domain). В качестве примера приведем
Использование NFS в FreeBSD 579 содержимое файла /etc/netgroup и то, как может выглядеть в данном случае файл /etc/exports: # more /etc/netgroup localnet (virtual, informex,) (,, altersys-ua.com) homeinet (82.21.134.209, informex,) # more /etc/exports /usr -alldirs -ro localnet /home -alldirs,ro homeinet Теперь к файловой системе mobile:/usr сможет "достучаться" пользователь informex с компьютера virtual, а также все пользователи в домене altersys- ua.com. К ресурсу mobile: /home доступ сможет получить только пользователь informex, используя компьютер с IP-адресом 82.21.134.209. Тем не менее, для корректной работы с экспортируемыми файловыми системами этого не достаточно. Поскольку имена пользователей и идентификаторы на различных компьютерах не совпадают (если в сети не используется для синхронизации служба NIS), то для корректной установки прав на вновь созданные файлы (или при изменении существующих прав) необходимо согласовать имена пользователей и их идентификаторы на всех машинах. Для частичного решения этой проблемы используется опция сопоставления прав. Для того чтобы удаленный пользователь мог выполнять запись в экспортируемой файловой системе от имени пользователя сервера root, необходимо использовать опцию -maproot: /usr -alldirs -maproot=root /home -alldirs -maproot=user2 Обратите внимание на то, что удалённый компьютер может быть задан только один раз для каждой файловой системы. К примеру, запись следующего вида будет некорректной: /home/informex localnet /home/depot localnet В данном случае во время чтения файла даемон mountd проигнорирует вторую строку. Будет корректно перечислить ресурсы для компьютера или группы в одной строке, например: /home/informex /home/depot localnet Рассмотрим более сложный вариант: /home/informex /home/depot -maproot=rootvirtual /home/informex /home/depot mobile /usr -alldirs -maproot=rootvirtual mobile /etc -ro -network 192.168 -mask 255.255.0.0 В данном случае файловые системы /home/depot и /home/informex экспортируются и доступны обеим машинам, но только компьютер virtual имеет права пользователя root на них. Третья строка предоставляет полный доступ к файловой системе /usr компьютерам virtual и mobile, при этом оба имеют полные права пользователя root в этой директории. Последняя строка позволяет всем компьютерам сети 192.168.255.255 монтировать директорию /etc, но только на чтение— запись, удаление и изменение запрещено. Для отображения списка всех общих ресурсов и прав доступа используется команда showmount: mobile# showmount -e Exports list on localhost: /usr virtual /home 192.168.0.111
580 Глава 19. Сетевая файловая система NFS virtual! showmount -e mobile Exports list on mobile: /usr virtual /home 192.168.0.111 virtual! showmount -e localsrv Exports list on localsrv: /usr virtual mobile /home/repository virtual mobile /home/deposit virtual mobile /etc 192.168.0.0 Если файл /etc/exports в системе отсутствует или недоступен, то запуск nfsd и mountd будет невозможен. После внесения изменений в файл /etc/exports всегда необходимо перезапускать процесс mountd. Для этого проще всего отправить сигнал HUP, который не прервет работу процесса: # killall -HUP mountd Для запуска NFS-сервера, после того как создан файл exports и внесены изменения в конфигурационный файл rc.conf, не обязательно перезапускать систему. Для ручного запуска из командной строки следует выполнить представленную ниже последовательность команд под пользователем root: # portmap # nfsd -t -u -n 6 # mountd -r Ha FreeBSD 5.x вместо portmap используется команда rpcbind. Настройка клиента NFS Как правило, специальная настройка клиента NFS не требуется. Любой компьютер с установленной системой FreeBSD уже имеет возможность работать как NFS-клиент без дополнительных настроек. Это достигается простым монтированием ресурса, как и любой другой файловой системы. Однако никто в данном случае не гарантирует высокую скорость работы, а уж тем более надежность. Для правильного конфигурирования NFS-клиента достаточно добавить только одну строку в файл /etc/rc. conf: nfs_client_enable="YES" В результате, будет включен автоматический запуск NFS-даемона nfsiod, который позволяет существенно ускорить выполнение запросов со стороны клиента, а также изменяет некоторые настройки ядра (sysctl vf s .nfs) для уменьшения времени доступа к ресурсу (за более детальной информацией обращайтесь к файлу сценария /etc/rc. network, отвечающего за сетевые настройки, или к странице документации man 8 re.network). Рассмотрим даемон nfsiod подробнее. Во-первых, ускорение работы происходит за счет включения асинхронного режима для операций ввода/вывода, в результате чего процессы выполняются в фоновом режиме, не ожидая завершения предыдущего процесса. Также эта программа контролирует количество процессов, запускаемых ядром. Если не определено иное, то nfsiod запускает один процесс обслуживания. Для нормальной работы желательно запускать столько же процессов, сколько ресурсов смонтировано клиентом. Как и в случае с сервером NFS, по умолчанию в файле /etc/ defaults/rc. conf определен запуск четырех процессов nfsiod. Для того чтобы изменить количество запускаемых процессов, в файле /etc/rc. conf необходимо добавить строку следующего вида: nfs_client_flags="-n 2"
Использование NFS в FreeBSD 581 Заметьте, что у nfsiod больше нет никаких параметров. В том случае, если был изменен конфигурационный файл, но нет возможности перезапустить систему в данный момент, используется команда: # nfsiod -n 2 Теперь, как и после перезапуска системы, будет запущено только два процесса дае- мона nfsiod: # ps ax I grep nfsiod 75 ?? I 0:00.00 nfsiod -n 2 76 ?? I 0:00.00 nfsiod -n 2 Монтирование ресурсов NFS Итак, мы рассмотрели все, что необходимо для работы как сервера, так и клиента NFS. Для того чтобы подробнее изучить использование экспортируемых файловых систем, в качестве примера примем, что серверной машиной будет выступать mobile с правильно настроенными и запущенными процессами NFS-сервера, а файл /etc/exports содержит только одну строку (в директории /home есть поддиректория depot, которую мы будем использовать в примерах): /home -alldirs,ro -network 192.168.0.0 -mask 255.255.0.0 На стороне клиента, соответственно, запущен процесс nfsiod. Для использования ресурсов сперва необходимо смонтировать требуемую экспортируемую файловую систему, и только после этого ее можно будет использовать. Для монтирования NFS-ресурсов существует утилита mountnf s (можно использовать команду mount -t nf s). Для монтирования необходимо, как минимум, передать два параметра: первый — разделенные двоеточием (":") имя компьютера и имя общего ресурса; второй — точка монтирования. В результате, для монтирования можно использовать одну из представленных ниже команд (первый вариант предпочтительнее, поскольку проще использовать дополнительные параметры; опция -i будет рассмотрена чуть позже): # mount_nfs -i mobile:/home/depot /mnt # mount -t nfs -o -i mobile:/home/depot /mnt He пытайтесь два раза смонтировать один и тот же ресурс, поскольку в результате такой попытки будет получено приблизительно такое сообщение об ошибке (не говоря уже о том, что могут возникнуть проблемы с NFS в целом): mobile:/home/depot: RPCPROG_MNT: RPC: Timed out Если случайно была предпринята попытка дважды смонтировать одну и ту же экспортируемую файловую систему, то после появления вышеописанной ошибки, возможно, не получится смонтировать ее опять после размонтирования. Для решения этой проблемы придется перезапустить процесс mountd на NFS-сервере. Во избежание подобных ситуации, используйте мягкое монтирование, описанное немного ниже. В случае успешного монтирования на экране никаких сообщений не появится. Для того чтобы удостовериться в том, что экспортируемая файловая система действительно была смонтирована, можно воспользоваться утилитой df, или просмотреть содержимое смонтированной директории: # df Filesystem /dev/adOsla /dev/adOslf /dev/adOslg /dev/adOsle lK-blocks 128990 257998 2451078 257998 Used 36172 10 568278 1158 Avail 82500 237350 1686714 236202 Capacity 30% 0% 25% 01 Mounted on / /tmp /usr /var
582 Глава 19. Сетевая файловая система NFS procfs 4 4 0 100% /proc mobile:/home/depot 705582 81966 567П0 13% /mnt # Is /mnt NFS.doc _resource pics FTP.doc FreeBSD.doc history.doc uses.doc Filosophy.doc _FreeBSD2.doc install.doc using_for.doc По окончанию использования ресурса не забудьте выйти из всех смонтированных ресурсов и размонтировать их командой umount. Ниже показан пример попытки раз- монтирования и сообщение, которое будет получено, если вы находитесь в смонтированном каталоге: # umount /mnt umount: unmount of /mnt failed: Device busy # cd / # umount /mnt Рассмотрим мягкое монтирование, которые уже упоминалось выше применительно к случаям множественного монтирования одного и того же ресурса, хотя, в действительности, оно используется в первую очередь для >1размонтирования" ресурса в случае сбоя или по истечению заданного таймаута. Для мягкого монтирования используется опция -s, а для изменения времени таймаута — опция -х. При мягком монтировании рекомендуется использовать опцию -i, благодаря которой возможно прерывание любого зависшего процесса в случае недоступности (например, сбоя) NFS-сервера. При использовании этой опции для прерывания зависшей команды используется стандартная комбинация клавиш <Ctrl+C>, посылающая сигнал о прекращении работы приложения. Как и на стороне сервера, у клиента тоже есть опции, которые позволяют выбирать использование протокола TCP или UPD: -Т и -U соответственно. Используйте протокол TCP в сетях, где возможна потеря пакетов (например, в Internet). Для упрощения монтирования, как и для любых других файловых систем, можно описать ресурсы NFS в файле /etc/f stab. Для этого необходимо добавить строку, наподобие следующей: # Device Mountpoint FStype Options Dump Pass# mobile:/home/depot /mnt nfs rw,-Tsi 0 0 В данном случае монтирование производится автоматически при загрузке системы, точка монтирования— /mnt. Для ручного монтирования, если была необходимость размонтировать ресурс ранее, или если установлена опция noauto, используется короткий формат команды: # mount /mnt Рекомендуется использовать опцию -Ь, которая позволяет перевести процесс попытки монтирования ресурса в фон. Это очень полезно в тех случаях, когда установлено автомонтирование при загрузке, поскольку, в случае недоступности последнего, процесс загрузки остановится на попытках монтирования файловой системы, вплоть до появления сервера в сети. Вот наглядный пример того, как выглядит процесс ручного монтирования с опцией -Ь при временном отсутствии и дальнейшем появлении сервера в сети: # mountnfs -Tsib mobile:/home/depot /mnt mobile:/home/depot: nfsd: PRCPROG_NFS: RPC: Port mapper failure - RPC: Timed out mounl_nfs: Cannot immediately mount mobile:/home/depot, backgrounding # date суббота, 16 апреля 2005 г. 12:27:29 (EEST)
Использование NFS в FreeBSD 583 # df Filesystem /dev/adOsla /dev/adOslf /dev/adOslg /dev/adOsle proofs # date lK-blocks Used 128990 36172 257996 10 2451078 568278 257998 1158 4 4 суббота, 16 апреля 2005 г. 12:29:33 # df Filesystem /dev/adOsla /dev/adOslf /dev/adOslg /dev/adOsle procfs mobile:/home, lK-blocks Used 128990 36172 257998 10 2451078 568278 257998 1158 4 4 /depot 705582 97208 Avail 82500 237350 1686714 236202 0 (EEST) Avail 82500 237350 1686714 236202 0 551928 Capacity 30% 0% 25% 0% 100% Capacity 30% 0% 25% 0% 100% 15% Mounted on / /tmp /usr /var /proc Mounted on / /tmp /usr /var /proc /mnt Полезной может также показаться опция -R, задающая количество попыток монтирования. По умолчанию, данный параметр принимает значение 0, что равнозначно бесконечному количеству повторов. При необходимости, можно установить и другое значение. Автоматическое монтирование ресурсов Несмотря на всю простоту работы с NFS, существует еще более простой вариант монтирования удаленных файловых систем, реализованный с помощью даемона amd (даемон автоматического монтирования), который автоматически монтирует удалённую файловую систему как только происходит обращение к файлу или каталогу в этой файловой системе. Более того, неактивные на протяжении некоторого времени файловые системы будут размонтированы даемоном amd автоматически. В данном случае не требуется никаких команд монтирования и никаких дополнительных настроек в файле /etc/f stab. В системе FreeBSD для запуска даемона amd необходимо добавить только одну строку в файл /etc/rc . conf: amd_enable="YES" Помимо этого, для даемона amd можно определить несколько дополнительных опций, используя параметр amd_f lags. По умолчанию, параметр amd_f lags настроен в файле /etc/defaults/rc. conf следующим образом: amd_flags="-a /.amdjmnt -1 syslog /host /etc/amd.map /net /etc/amd.map" В данном случае для автоматического монтирования по умолчанию используются каталоги /host и /net. Когда происходит обращение к файлу в одном из этих каталогов, даемон amd ищет соответствующий удаленный ресурс и автоматически его монтирует. Каталог /host используется для монтирования ресурсов по удаленному имени хоста, a /net — для монтирования экспортируемой файловой системы по IP-адресу. Например, обращение к любому файлу в директории /host/mobile/home указывает даемону amd попытаться смонтировать ресурс /home, находящийся на компьютере mobile (аналогичноmobile: /home) Для демонстрации работы с NFS-ресурсами в режиме автоматического монтирования с использованием даемона amd рассмотрим следующий пример: # ps ax I grep amd 80 ?? Is 0:00,02 amd -p /etc/amd.map /net /etc/amd.map -a /.amd_mnt -1 syslog /host.
584 Глава 19. Сетевая файловая система NFS # df Filesystem /dev/adOsla /dev/adOslf /dev/adOslg /dev/adOsle procfs pid80@virtual: pid80@virtual: # cd /host # Is -1 # cd mobile # showmount -e lK-blocks 128990 257998 2451078 257998 4 /host 0 /net 0 ! mobile Exports list on mobile: /home # Is -1 total 2 drwxr-xr-x 6 # df Filesystem /dev/adOsla /dev/adOslf /dev/adOslg /dev/adOsle procfs pid80@virtual: pid80@virtual: mobile:/home Used 36172 10 568278 1158 4 0 0 . Avail 82500 237350 1686714 236202 0 0 0 192.168. root wheel 512 9 anp 18:24 lK-blocks 128990 257998 2451078 257998 4 :/host 0 :/net 0 705582 / .amd__mnt/mobile/host/home # cd home/depc # Is FTP.doc Filosophy.doc NFS.doc # cd / # df Filesystem /dev/adOsla /dev/adOslf /dev/adOslg /dev/adOsle procfs pid80@virtual pid80@virtual >t _FreeBSD.doc Used 36172 10 568278 1158 4 0 0 97208 Avail 82500 237350 1686714 236202 0 0 0 551928 . history.doc FreeBSD2.doc install.doc _resource lK-blocks 128990 257998 2451078 257998 4 :/host 0 :/net 0 pics Used 36172 10 568278 1158 4 0 0 Avail 82500 237350 1686714 236202 0 0 0 Capacity 30% 0% 25% 0% 100% 100% 100% 0.0 home Capacity 30% 0% 25% 0% 100% 100% 100% 15% : uses Mounted on / /tmp /usr /var /proc /host /net Mounted on / /tmp /usr /var /proc /host /net .doc : using for.doc Capacity 30% 0% 25% 0% 100% 100% 100% Mounted on / /tmp /usr /var /proc /host /net В данном случае первым делом проверяется, запущен ли даемон автоматического монтирования и список всех файловых систем, доступных в данный момент (обратите внимание на две записи, которые начинаются с pid80@, в данном случае 80—это Process ID процесса amd). Затем переходим в директорию /host и просматриваем ее содержимое — директория пуста (аналогично и для директории /net). Как и в предыдущих примерах, нам необходимо" получить доступ к ресурсам компьютера mobile потому, несмотря на отсутствие записей в /host, мы пытаемся сменить директорию по имени компьютера. В результате, сообщение об ошибке не выдается. Просмотрев содержимое /home/mobile, мы обнаруживаем список экспортируемых файловых систем хоста mobile, а выполнив просмотр монтированных файловых систем с использованием команды df, видим, что была смонтирована файловая система mobile: /home. Теперь можно спокойно работать с файлами на удаленном NFS-
Обеспечение безопасности 585 сервере. Последние команды показывают: если выйти из директории автоматического монтирования и немного подождать, то точка монтирования автоматически исчезает. Если при частом использовании некоторого ресурса тяжело постоянно писать полный путь к монтируемой файловой системе, то автоматическое монтирование можно сделать намного "прозрачнее". Например, выполнив на своем хосте представленные ниже команды, можно получить следующий результат: # cd /mnt й In -s /host/mobile/home/depot mdepot # cd /mnt/mdepot # Is NFS.doc _resource pics FTP.doc _FreeBSD.doc history.doc uses.doc Filosophy.doc _FreeBSD2.doc install.doc using_for.doc Теперь, всякий раз при обращении к директориям или файлам в /mnt /mdepot будет происходить автоматическое монтирование необходимого ресурса. Просмотрите файл /etc/amd.map, в котором задаются опции, используемые при монтировании экспортируемых ресурсов. В файле /etc/amd. conf задаются настройки более сложных возможностей amd (по умолчанию, данный файл в системе отсутствует). Он состоит из записей вида "name = value" и секций [global ] и [ /тар]. Подробности об этом файле и пример его использования можно найти в справочном руководстве man amd. conf. ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ Для обеспечения должного уровня безопасности при работе с NFS поможет только правильное планирование. Общие правила таковы: ограничьте использование NFS, разрешив доступ только с тех компьютеров, где необходимо или планируется использовать ресурсы; при этом и эти машины необходимо ограничить числом файловых систем, которые возможно одновременно смонтировать для каждого клиента (например, заданием подсети в файле /etc/ exports); если не требуется предоставлять доступ на запись и изменение, позаботьтесь о том, что бы на NFS-сервере была указана соответствующая опция в файле /etc/exports, а также, если это возможно,— и в файле /etc/fstab на всю файловую систему, которая экспортируется; установите для всех файлов экспортируемой файловой системы право на запись только для пользователя root, а для групп уберите право на запись; если возможно, не экспортируйте домашние директории пользователей, и директории, в которых присутствуют исполняемые системные файлы; запретите возможность входа на сервер пользователям, которым предоставляется право монтировать экспортируемые файловые системы; используйте Secure NFS; для того чтобы удостовериться в том, что экспортированы только необходимые ресурсы, используйте утилиту showmount; не предоставляйте доступ через сеть Internet; корректно настройте правила IPFW относительно портов NFS.
586 Глава 20. Сервер имен DNS ГЛАВА 20. СЕРВЕР ИМЕН DNS ВВЕДЕНИЕ Большинство людей, работающих с Internet, имеют поверхностное понимание DNS. Для них это понимание остается на уровне элементарного запоминания имени машины, к которой они пытаются получить доступ. В действительности, машины общаются между собой с помощью специальных номеров (IP-адресов), однозначно идентифицирующих каждый ПК. Система DNS — это именно та служба, которая позволяет определить (найти) соответствие между именами, понятными и простыми для запоминания человеком, и действительными адресами машин. Однако не следует думать, что DNS используется исключительно в Internet, поскольку, в действительности, эта служба имеет более широкую сферу применения. В данной книге будет рассмотрена самая популярная на сегодняшний лень программная реализация сервера имен — BIND (Berkeley Internet Name Domain). История DNS Система DNS появилась не спонтанно. Ее возникновению предшествовало несколько событий в развитии проекта ARPANET. Сперва, когда сеть насчитывала несколько сотен машин, за соответствие имен и адресов отвечал файл HOSTS . TXT, и всякий раз при изменении этого файла он распространялся с помощью почты. В начале 1980-х годов разрабатывается стек протоколов TCP/IP, который, будучи включенным в операционную систему BSD UNIX, популяризуется вместе с системой; многие университеты, получившие бесплатную версию данной ОС, начинают объединяться в сети. Использование файла HOSTS. TXT теперь стало невозможным, поскольку количество хостов увеличивалось не по дням, а по часам. Распространение огромного файла занимало много времени, а также трафика и ресурсов системы. Еще более серьезной проблемой стала невозможность отслеживать появление систем с одинаковыми именами, но разными адресами, что приводило к частым сбоям. Руководство проекта ARPANET дало поручение разработать новую систему именования хостов, более децентрализованную, потребляющую меньше трафика и ограничивающую возникновение дефектов. В результате, в 1984 году была разработана новая система, названная DNS, устранявшая большинство проблем своей предшественницы (HOSTS. TXT), не говоря уже о новых возможностях. Программная реализация имела название JEEVES. В дальнейшем институт Беркли написал новую реализацию сервера имен под названием BIND, которая сегодня поддерживается и распространяется консорциумом ISC. Понимание структуры системы DNS Система DNS представляет собой распределенную базу данных, где за каждую ее часть отвечает отдельный авторитетный сервер. Кроме авторитетных серверов существуют также кэширующие сервера, благодаря чему достигается высокая отказоустойчи-
Введение 587 вость и малая ресурсоемкость всей системы в целом. Помимо серверов, в системе присутствуют клиенты, которые запрашивают информацию от серверов. Клиенты в данном случае называются resolvers и имеют встроенную систему формирования запросов. Система DNS представима в виде дерева, у которого корень находится вверху и обозначается точкой "." — корневая зона, за которую отвечают несколько серверов по всему миру, содержащих в своей базе данных информацию обо всех авторитетных серверах доменов верхнего уровня (ua, ru, edu, com и т.д.). В каждом из этих доменов могут присутствовать другие домены, которые должны не повторяться только в пределах своей иерархии, например, abc.ru и abc.com. Каждый из таких доменов может содержать необходимое число поддоменов. Все имена поддоменов отделяются от имени предыдущего уровня точкой. К примеру, домен вида altersys-ua.com является доменом второго уровня, amain, com.ua —доменом третьего уровня. За каждым доменом/поддоменом стоит определенный сервер(ы), который управляет содержимым этого домена и может делегировать право управления поддоменами другим серверам. Так, сервер ns.altersys-ua.com, отвечающий за домен altersys-ua. com, может содержать поддомен subdom (subdom. altersys-ua. com) и делегировать право на его управление серверу ns . subdom. altersys-ua . com. Каждый конечный хост (например, www, ftp, nsl) содержит информацию о домене, к которому он принадлежит. Тем самым была решена проблема повторяемости имен машин. Теперь могут существовать тысячи компьютеров с именем www, но в различных доменах, и только одна машина с таким именем — в своем конкретном домене. К тому же, различные имена машин в различных доменах могут ссылаться на одну и ту же машину. Подобным же образом, различные имена в одном домене могут ссылаться на имена машин в другом домене. Например, компьютер с адресом 195.15.16.1 может быть обозначен как nsl в домене altersys-ua.com и как ns2 в домене main.com.ua, а компьютер altersys в домене main.com.ua может ссылаться на машину www в домене altersys-ua.com. Имя машины вида www.main.com.ua называется полным доменным именем машины. Рассмотрим, как происходит поиск компьютера в системе DNS. В первую очередь, resolver посылает запрос DNS-серверу, указанному в сетевых настройках для протокола TCP/IP. Если тот не может ответить на запрос сам, то передает этот запрос далее — серверу, расположенному выше в иерархии или, в случае отсутствия такового, — непосредственно корневому серверу. Корневые серверы содержат список авторитетных серверов для каждого домена и передают назад адрес авторитетного сервера для запрашиваемого домена. Для внесения ясности рассмотрим примеры. Предположим, компьютер с полным доменным именем must.main.com.ua пытается обратиться к компьютеру www.main.com.ua. Для этого он передает запрос серверу, ответственному за зону main.com.ua, который сразу же передает ответ, содержащий реальный адрес. Это — самый простой вариант. Теперь предположим, что компьютер must.main.com.ua запрашивает информацию о хосте с именем i.am.ua. Запись об этой машине не содержится в зоне main.com.ua (хотя может и содержаться), поэтому запрос направляется серверу, ответственному за зону com. ua, который в свою очередь отвечает, что запрос необходимо передать выше, к серверу зоны ua. Сервер зоны ua содержит запись о домене am. ua — формируется запрос к серверу имен этого домена, который и содержит запись о хосте i (а может и не содержать — в этом случае возвращается сообщение о том, что машины с именем i . com. ua не существует). Но и это еще — не самый сложный вариант. В случае запроса информации о хосте с именем i . am. ru, даже сервер, отвечающий за зону ua, не сможет ответить на запрос. Как следствие, запрос будет перенаправлен корневым серверам, которые скорее всего имеют в своем списке запись о сервере имен, отвечающем за зону искомого хоста. Как будут развиваться события далее — вполне очевидно...
588 Глава 20. Сервер имен DNS Хотелось бы напомнить, что существует огромное количество кэширующих серверов. Большинство ответов приходит именно от серверов подобного типа (как правило, это сервер провайдера услуг Internet). Применение Серверы имен наиболее часто применяются в качестве авторитетных и кэширующих серверов, иногда — в режиме перенаправления. Режим перенаправления необходим в тех случаях, когда в сети есть два сервера DNS: один отвечает за сопоставление внешних имен, а второй — имен внутренней сети. В таких случаях все клиенты настраиваются на отсылку запросов именно серверу внешних имен. Тот, определив, что запрос относится к внутреннему серверу, направляет запросы только к нему, а все остальные запросы пытается разрешить путем поиска в других зонах описанным выше способом (или используя кэширующий сервер). Авторитетный сервер используется для предоставления DNS-информации всем клиентам в Internet. Например, если у вас есть зарегистрированный домен, то для обслуживания этой зоны можно настроить основной и несколько подчиненных серверов. Также авторитетный сервер используется в том случае, когда требуется установить обратные записи DNS для машин и серверов (преобразование IP-адресов в имена). Преобразование IP-адресов в имена используется, к примеру, почтовыми серверами (большинство серверов при приеме почты проверяют обратную запись отправителя во избежание получения spam-писем). Неправильная настройка обратной записи может привести к отказу в приеме почты некоторыми серверами. Кэширующий сервер используется для кэширования полученной информации в ответ на запрос и ускорения отправки ответов при следующих идентичных запросах из локальной сети — при этом важно то, что существенно уменьшается потребление сетевого графика. Файлы и программы Рассмотрим список файлов и утилит, необходимых для настройки и запуска сервера имен (табл. 20.1). Таблица 20.1. Список файлов системы, используемых для настройки и запуска DNS Файл Описание /usr/sbin/named Даемон BIND. По умолчанию, читает файлы конфигурации /etc/namedb/named.conf, файлы зон и прослушивает запросы (как правило, на порт 53) ndc, rndc (BIND9) Программа управления даемоном сервера имен. Позволяет системному администратору контролировать работу даемона named. Может запускаться в командном и интерактивном режиме /etc/namedb Директория, в которой хранятся все файлы конфигурации и файлы зон /etc/namedb/named. conf Главный конфигурационный файл BIND nslookup Утилита, работающая в командном и интерактивном режиме. Используется для проверки и тестирования службы DNS Зоны. Прямой и обратный поиск Выше несколько раз были упомянуты такие понятия как зона, домен и поддомен, но до сих пор не внесено ясности, что же это такое и "с чем его едят". Понятие зон аналогично понятию домена. Зона является полным описанием определенного домена и представляет собой совокупность сопоставлений имен хостов и их IP-адресов на некотором уровне иерархии. Для того чтобы разместить данные в зоне на своем сервере, не-
Введение 589 обходимо иметь соответствующие полномочия на управление ею. Любая зона должна завершаться точкой ".". Например, зона com. находится в корневой зоне "." и может содержать поддомены (например, a. com. или altersys-ua.com.), которые также «вляются зонами. За каждую зону отвечает некоторый авторитетный сервер или группа серверов. Благодаря зонам, может осуществляться прямой поиск имен или определение IP- адреса по известному имени. Например: # nslookup com.ua. Server: localhost.altersys-ua.com Address: 127.0.0.1 Name: com.ua # nslookup nsl.com.ua. Server: localhost.altersys-ua.com Address: 127.0.0.1 Non-authoritative answer: Name: nsl.com.ua Address: 195.39.196.34 Благодаря DNS, может производиться и обратный поиск имен. Обратный поиск — это определение имени по известному IP-адресу. Например: # nslookup 195.39.196.34 Server: localhost.altersys-ua.com Address: 127.0.0.1 Name: pegas.mirohost.net Address: 195.39.196.34 Заметьте, что IP-адрес, полученный в результате прямого поиска по имени, не всегда будет соответствовать имени в случае обратного поиска. Например, как в представленном выше случае, имени nsl.com.ua при прямом поиске соответствует IP-адрес 195.39.196.34, но при обратном поиске этому IP-адресу будет соответствовать имя pegas .mirohost. net. Для каждой зоны в системе BIND должен быть создан соответствующий файл зоны, в котором описан набор соответствий IP-адресов и имен, а также дополнительные параметры. Запуск сервера имен Система FreeBSD устанавливается с поддержкой сервера имен DNS, и все, что необходимо для его запуска, — отредактировать сценарий /etc/rc. conf, указав автоматический запуск named во время загрузки системы. Для этого в файл /etc/rc. conf достаточно добавить строку: named_enable="YES" После этого необходимо перезапустить систему или выполнить команду: # ndc start
590 Глава 20. Сервер имен DNS Не забудьте, что прежде, чем запускать службу named, необходимо отредактировать главный файл системы BIND — named, conf и сформировать правильные файлы зон. В противном случае, сервер окажется в неработоспособном состоянии или будет неправильно обрабатывать запросы. При успешном запуске вы увидите присвоенный идентификатор процесса. Рекомендуется также на сервере создать файл /etc/resolv.conf или изменить его таким образом, чтобы первым сервером имен числился localhost (в формате IP- адреса). Например, для сервера имен в домене altersys-ua . com это будет выглядеть следующим образом: domain altersys-ua.com search altersys-ua.com nameserver 127.0.0.1 При любом изменении конфигурации сервера имен или внесении корректив в любой файл зоны требуется перегрузка даемона named: tt ndc reload Эта команда позволяет считать по-новому все файлы конфигурации. Для полного перезапуска даемона используется следующая команда: # ndc restart Сервер имен может запускаться в защищенной среде называемой "песочница" (sandbox). При этом файлы конфигурации и процесс запуска немного отличаются от стандартных. Подробное описание запуска BIND в "песочнице" будет представлено в разделе, посвященном организации защиты службы имен. Используемые сегодня версии BIND Наиболее популярной версией сервера имен в последние годы была BIND8. Начиная с FreeBSD 5.3-RELEASE, по умолчанию применяется система BIND9. Но и до этого пользователи предыдущих релизов могли пользоваться этой версией сервера имен, имея возможность установить ее из коллекции портов по пути /usr/ports/net/bind9, Далее в книге будет подробнее рассмотрена настройка именно версии B1ND8. НАСТРОЙКА СИСТЕМЫ BIND8. ФАЙЛ КОНФИГУРАЦИИ Для людей, впервые столкнувшихся с настройкой сервера DNS, будет сложно разобраться со всеми файлами и их назначением, не говоря уже о том, чтобы разобраться с их содержимым. Несмотря на распространенность DNS-серверов, реальных специалистов, которые не только могут создать конфигурацию для поддержки нескольких доменов, но и разобраться с уже написанной кем-то ранее, в действительности не так уж и много. Если вы решились на такой шаг, как изучение сервера имен DNS, то приготовьтесь уделить этому вопросу как минимум несколько недель. Еще более пугающим может стать осознание того, что при настройке необходимо учитывать очень много второстепенных и, казалось бы, несвязанных вещей (например, топология сети, параметры, переданные от провайдера услуг Internet, слежение за правильным согласованием информации между другими серверами имен). Иногда неправильная, хотя и работоспособна» конфигурация сервера имен может привести к "смерти Internet" вследствие засорения канала связи так называемым "техническим трафиком". В FreeBSD файлы конфигурации системы BIND8 (далее просто BIND) находятся в директории /etc/namedb. После установки в ней будет расположено всего лишь пять файлов:
Настройка системы BIND8. Файл конфигурации 591 PROTO.localhost-v6.rev PROTO.localhost.rev make-localhost named.conf named.root Первые два файла PROTO.* служат прототипами для создания файлов зоны localhost. Если не используется и в ближайшем времени не планируется использовать IPv6, то можно удалить файл PROTO. localhost-v6. rev (в случае необходимости, его можно будет найти в директории /usr/src/etc/namedb, но только при условии, что был установлен набор etc из исходных текстов). Файл make-localhost — это утилита, позволяющая создать специальные файлы зон на основе упомянутых выше файлов. Процесс создания файлов зоны localhost рассматривается чуть позже в этой же главе. В дальнейшем примем, что IPv6 не используется. Файл named, root содержит список корневых серверов, используемых для поиска соответствия имени и адреса в случае, когда сервер не может сам установить такого соответствия. Наконец, файл named, conf — это главный конфигурационный файл систем BIND (ранее использовалось имя named.boot). Именно с него и начнем... Для тех, кто ранее работал с другими версиями системы BIND, формат файла named, conf будет отчасти незнаком, но в то же время он намного проще в понимании и обладает более широкими возможностями управления (например, списки доступа и гибкое управление ведением журналов). Содержимое простого конфигурационного файла представлено в листинге 20.1. Листинг 20.1. Пример файла настройки /etc/nmattdb/riamad,conf options { directory "/etc/namedb"; version "None"; // query-source address * port 53; /* forward only; recursion no; V 1 { type hint; file "named.root" zone "0.0.127.IN-ADDR.ARPA" { type master; file "localhost.rev"; ); zone "altersys-ua.com" { type master; file "master/altersys-ua.com"; zone "62.81.60.in-addr.arpa" ( type master; file "master/82.81.80.in-addr.arpa"; zone "altersys-ua.loc" { type slave;
592 Глава 20. Сервер имен DNS Листинг 20.1. Окончание file "slave/altersys-ua.loc" ; masters ( 192.168.0.2; ); I; zone "168.192.in-addr.arpa" { type slave; file "slave/1 68.192.in-addr.arpa"; masters ( 192.168.0.2; I ; Как видно из примера, файл /etc/namedb/named. conf состоит из блоков (записей) и комментариев в стиле языка С. Каждый блок заканчивается точкой с запятой (";"). Блоки, как правило, содержат записи, которые, в свою очередь, также заканчиваются точкой с запятой и заключены в фигурные скобки {}. Перечень возможных блоков представлен в табл. 20.2. Таблица 20.2. Список блоков, используемых в конфигурационном файле Блок Описание logging В этом блоке описано, что именно записывается в файл журнала, и где он хранится, Данный блок может встречаться в файле только один раз options Управляет настройками системы BIND, а также устанавливает значения по умолчанию для других блоков. Как и блок logging, может встречаться в файле только один раз zone Блок, описывающий одну зону. В файле может присутствовать столько блоков zone, сколько зон обслуживает сервер acl Именованные списки адресов для управления доступом key Описывает информацию о ключах, используемых для авторизации и аутентификации trusted-keys Описание ключей DNSSEC, которые предопределены в сервере и неявно доверяются server Используется для установки всевозможных параметров для различных удаленных систем controls Описание каналов управления для утилиты ndc include Включение содержимого других файлов Чаще всего используют блоки options, zone, acl, logging и controls. От содержимого файла /etc/namedb/named. conf зависит работа сервера. Как правило, один сервер имен выступает в нескольких ролях одновременно: поддержка первичных (главных) и подчиненных (вторичных) зон, перенаправление запросов другому серверу, а также выполнение роли кэширующего сервера. Для определения ролей достаточно просмотреть типы зон, содержащихся в главном файле. Выделяют пять типов зон: master — используется для описания первичной зоны; slave — используется для описания подчиненной зоны, которая, по сути, является копией описания зоны с первичного сервера; stub (в переводе с английского "заглушка") — применяется для описания зоны, используемой для переноса информации только об авторитетных серверах имей. отвечающих за зону; forward — используется для перенаправления запросов по зоне на другие серверы;
Настройка системы BINDS. Файл конфигурации 593 hint — этот тип зоны, как правило, присутствует даже в минимальной конфигурации, и используется для перенаправления запросов "корневым" серверам, описанным в файле зоны, для определения реальных адресов в том случае, если запрос остался без ответа. Список серверов довольно часто изменяется. Более подробную информацию по этому вопросу можно найти в справочной системе man named, conf. Для начала рассмотрим описание первичной зоны. Настройка первичной зоны Итак, если сервер отвечает за поддержку первичной зоны для какого-либо домена, то обязательно потребуется вручную настроить первичную зону для него и внимательно следить за содержимым файла зоны. Этот сервер, хранящий главный файл описания зоны, будет первоисточником информации о соответствии имен и адресов в заданном домене, а все другие серверы будут периодически обращаться к нему за информацией о домене и постоянно следить за изменениями в его конфигурации. В качестве примера, рассмотрим минимальный вариант зоны такого типа: zone "altersys-ua.com" { type master; file "master/altersys-ua.com"; 1; Итак, обязательно должны быть указаны имя домена, тип зоны (master) и путь к файлу, в котором описывается зона. Заметьте, что в файле named, conf имя зоны, совпадающее с именем домена или поддомена, всегда указывается без завершающей точки (корневая зона, аналогично / в дереве каталогов). Кроме вышеперечисленных обязательных составляющих, для описания зоны используются еще несколько операторов. Полный формат блока выглядит следующим образом (man named, conf): zone domain_name [ ( in I hs | hesiod I chaos ) ] { type master; file path_name; check-names ( warn I fail | ignore )■; ) allow-update ( address_match_list }; ] allow-query { address_match_list }; ] allow-transfer ( address_match_list }; ] forward { only | first ); ] forwarders { [ ip_addr ; [ ip_addr ; ... ] ] }; 1 dialup yes_or_no; ] notify ( yes_or_no I explicit ); ] also-notify ( ip_addr; [ ip_addr; ...]}; pubkey number number number string; ] }; Детальное описание файла для первичной зоны будет рассмотрено в этой главе чуть позже. Настройка подчиненной зоны Как правило, подчиненная зона настраивается на вторичных серверах, которые принимают данные от главного сервера (или иного другого, например, вторичного) относительно поддерживаемой зоны. При этом вторичный сервер не содержит собственных файлов описания зон, а получает их каждый раз при запуске или по истечению заданного периода времени (если первичный отвечает).
594 Глава 20. Сервер имен DNS Вторичный сервер, как правило, также отвечает на запросы о соответствии имен и указан в качестве носителя копии в файле зоны на первичном сервере имен. Это упрощает настройку вторичных серверов: для них достаточно только указать путь к файлу зоны, который будет автоматически создан, и соответствующим образом настроите файл named.conf. Пример подчиненной зоны может выглядеть следующим образом: zone "alteirsys-ua. loc" ( type slave; file "slave/altersys-ua.loc"; masters { 192.168.0.2; ); }; В данном примере определены обязательные параметры (путь к файлу не обязателен, но рекомендуется для ускорения запуска сервера имен и времени ответа на запросы), необходимые для настройки вторичного сервера имен: тип зоны (slave), путь к файлу зоны, создаваемого на основе конфигурации первичного сервера, а также список адресов авторитетных серверов, с которых запрашивается необходимая информации о конфигурации домена. Полный формат блока: zone domain_name [ ( In I hs I heslpd I chaos ) type slave; [ file path_name; ] masters [ port lp_port ] { lp_addr [ key key [ check-names ( warn | fail I ignore ); ] [ allow-update { address_match_llst }; ] [ allow-query { address_match_list }; ] [ allow-transfer { address_match_llst }; ] [ forward ( only | first ); ] [ forwarders { [ ip_addr ; [ ip_addr ; ... ] [ transfer-source ip_addr; ] [ max-transfer-time-in number; ] [ notify yes_or_no; ] [ also-notify ( lp_addr; [ ip_addr; ... ] }; [ pubkey number number number string; ] ); Следует отметить, что формат блока описания зоны типа stub имеет точно такую же структуру, с единственным отличием: вместо "type slave;" необходимо указать "type stub;". Описание этой зоны уже было представлено выше. Перенаправление запросов. Настройка forward-зоны Довольно часто запрос информации о каком-либо домене непосредственно из авторитетных или корневых серверов влечет за собой накладные расходы по времени ожидания и трафику. Более выгодно использовать так называемые серверы перенаправленш (forwarders). Как правило, в качестве таких серверов выступают DNS-серверы провайдеров, разрешающие прием запросов к ним от клиентских машин (эти серверы ограничивают доступ из тех сетей, которые ими не обслуживаются). В результате, сервер можно настроить таким образом, что вместо передачи запроса о неизвестной зоне одному из корневых серверов все они перенаправляются непосредственно на сервер провайдера (или иной другой, позволяющий подобные запросы). Дальнейшая "судьба" запроса клиента не волнует — он ожидает ответа именно от сервера перенаправления. Сервер перенаправления, на который поступает запрос, извлекает информацию из кэша, сформированного на основе клиентских или своих собственных запросов, или пе- ] ( id 1; [ ... ] }; ] }; ]
Настройка системы BIND8. Файл конфигурации 595 редает его далее (например, своему перенаправляющему серверу или на один из корневых серверов). В результате можно уменьшить скорость отклика и количество пакетов. Однако у такого подхода есть один недостаток: использование серверов перенаправления может привести к ситуации, когда клиенты временно используют устаревшие данные о зоне (в зависимости от установленного времени устаревания зоны в файле зоны на первичном сервере), что иногда может привести к определенным казусам. Для использования серверов перенаправления, в блок записи options необходимо внести запись forwarders и в ней перечислить адреса доступных вам серверов DNS. По умолчанию, в файле /etc/namedb/named.conf присутствует закомментированная запись forwarders с использованием адреса 127.0.0.1. Даже если убрать комментарии, все равно не будет получено никакого результата. Использование адреса 127.0.0.1 бесполезно, поскольку сервер DNS не может перенаправлять запросы сам себе. Рассмотрим пример блока options при использовании сервера перенаправления: options { directory "/etc/namedb"; version "None"; // forward only; forwarders ( 8 0.81.82.1; 195.10.200.15; }; }; Как видно из примера, есть один оператор (закомментирован), позволяющий управлять перенаправлением — forward. Он может принимать значение only или first. В режиме forward first. BIND будет обращаться только к серверам перенаправления и только в случае их отсутствия в сети запросит информацию с корневых серверов. В режиме forward only, даже в случае недоступности серверов перенаправления, BIND не будет пытаться посылать запросы к корневым серверам. В BIND присутствует еще одна интересная функциональная реализация: возможность использовать серверы перенаправления только для определенных зон. Запись зоны такого типа имеет следующий формат: zone domain_name [ ( in | hs I hesiod I chaos ) J { type forward; [ forward ( only | first ); ] [ forwarders ( [ ip_addr ; [ ip_addr ; ... 1 1 }; ] [ check-names ( warn | fail | ignore ); ] }; Напомним, что благодаря использованию серверов перенаправления не только выигрывают клиенты, но также существенно снижается потребляемый объем трафика и нагрузка на основной сервер — первичный носитель зоны. Использование кэширующего сервера Ранее уже упоминалось о возможности кэширования запросов сервером. Кэширование запросов — это сохранение ответов в памяти и их использование при повторном идентичном запросе вместо полного процесса преобразования имени в IP-адрес или наоборот. Кэширующий сервер не является авторитетным ни для одной зоны, но другие серверы могут использовать его кэш.
596 Глава 20. Сервер имен DNS Кэширующий сервер в любой момент может быть преобразован в авторитетный сервер для какой-либо зоны путем добавления дополнительных блоков описания зон. Пример файла конфигурации кэширующего сервера представлен в листинге 20.2. Листинг 20.2. Пример файла /etc/namedb/named. conf для котирующего сервера options ( directory "/etc/namedb"; version "None"; }; zone I; type hint; file "named.root"; zone "0.0.127.IN-ADDR.ARPA" ( type master; file "localhost.rev"; }; Как видно из примера, кэширующий сервер является просто урезанным вариантом сервера имен. Напомним, что любое изменение конфигурации сервера имен должно завершаться перезапуском службы named с помощью утилиты ndc: # ndc reload Это касается также и изменения файлов зон. ФАЙЛЫ ЗОН Для каждой зоны, определенной в главном конфигурационном файле системы BIND, должен быть создан файл зоны. Файлы зон создаются или вручную (если сервер является авторитетным, главным для зоны типа master), или автоматически— на основании данных, полученных от одного из главных серверов, перечисленных в блоке masters для зоны типа slave (подчиненной). Создание файлов зон— дело довольно сложное, поэтому рекомендуется подойти к нему со всей осторожностью. Для начала рассмотрим пример файла зоны altersys-ua . com (см. листинг20.1), который должен быть расположен согласно описанию в главном конфигурационном файле по пути /etc/namedb/master/altersys-ua. com (листинг 20.3). Листинг 20.3. Файл зоны для домена altersys-ua. com $ORIGIN altersys-ua.com. $TTL 3600 IN SOA nsl.altersys-ua.com. root.altersys-ua.com. ( ; Serial ; Refresh ; Retry ; Expire ; Minimum TTL nsl.altersys-ua.com. ns2.altersys-ua.com. ns.subdomain.altersys-ua.com. ; DNS Servers 0 0 subdomain 2005042101 10800 3600 604800 86400 ) IN NS IN NS IN NS
Файлы зон 597 Листинг 20.3. Окончание MX Records IN MX IN MX ; Machine Names localhosc IN A в IN A nsl IN A ns2 IN A mail IN A relay2 IN A westhost IN A ns.subdomain IN A 10 mail.altersys-ua.com. 20 relay2.altersys-ua.com. 127.0.0.1 80.81.82. 80.81.82. 80.81.82. 80.81.82. 80.81.82. 80.81.82.254 80.81.83.1 ; Aliases www ftp wwwl IN CNAME IN CNAME IN CNAME e e ns2 ; Others nsl HINFO 8 IN WKS в IN WKS i IN RP admin.main.com.ua. INTEL-386 UNIX-BSD 80.81.82.1 TCP FTP SMTP DOMAIN AUTH 80.81.82.2 TCP SMTP DOMAIN adidok.altersys-ua.com. admin.main.com.ua. IN TXT " Didok Olexander 8050-3815806" На первый взгляд, файл, представленный в этом листинге, довольно сложен для понимания. Рассмотрим подробнее формат и используемые типы записей. Файл зоны состоит из различных записей, имеющих различный формат написания. В первую очередь отметим, что знак точки с запятой ";" указывает на начало комментария. Кроме комментариев, используются еще два типа записей: директивы и записи ресурсов (RR — Resource Records). Больше всего файл зоны содержит записей ресурсов, которые описывают информацию о структуре домена. Существует много типов записей ресурсов, каждый из которых имеет свое назначение. Все они детально описаны в документе RFC 1033. Общий синтаксис RR таков: name [ttl] [class] type data Рассмотрим назначение каждого из перечисленных элементов: name — имя описываемого объекта. Это может быть имя машины или домена (если данное поле пустое, то принимается значение name предыдущей записи). tfcl — время жизни, заданное в секундах (если этот аргумент опущен, то принимается значение, указанное по умолчанию директивой $TTL (о директивах речь пойдет чуть позже). class — класс записи. Система распознает несколько классов RR, однако нас интересует только IN (Internet). Среди прочих можно упомянуть такие классы как HS (Hessiod) или СН (Chaosnet). Класс можно указать в блоке zone при описании зоны в файле named, conf, после чего использовать его в файле зоны не обязательно. Пример блока zone с указанием класса: zone "altersys-ua.com" in ( type master; file "master/altersys-ua.com"; };
598 Глава 20. Сервер имен DNS type — тип записи. Наиболее часто используются записи типов SOA, NS, MX, An PTR. daza — данные об объекте. В зависимости от типа записи меняется и формат содержимого этого поля, например, для записи типа А это будет IP-адрес, а для поля SOA — блок данных, описывающий свойства зоны. Использование директив С помощью директив можно устанавливать и изменять некоторые глобальные установки (например, время жизни или имя домена по умолчанию). Имя директивы начинается со знака доллара "$'' и пишется прописными буквами. Директиву можно переопределить в любом месте файла, но при этом следует учитывать, что ее новое значение будет задействовано только в последующих записях. Наиболее часто используются директивы $ORIG IN и $TTL. причем первая, как правило, — неявно. Рассмотрим синтаксис и описание существующих директив. $ORIGIN Синтаксис: $ORIGIN domainname В файле зон можно использовать два типа имен: полные и неуточненные. Полное имя — это имя, записанное с завершающей точкой, неуточненное — имя, указанное без точки. Значение $0RIGIN добавляется к любому неуточненному имени. Таким образом, к записи www без завершающей точки будет добавлено значение $ORIGIM (domainname). Как правило, директива $CRIGIN в файле зоны не определена и совпадает с именем зоны, указанным в блоке zone конфигурационного файла named, conf (с добавлением завершающей точки, которая там отсутствует). Если требуется указать значение этой директивы явно, не забудьте в конце имени домена domainname поставить точку. Пример: $ORIGIN alr.ersys-ua.com. ПРИМЕЧАНИЕ Следите за использованием завершающей точки. В большинстве случаев именно это становится причиной неправильной настройки и последующих неприятностей в работе DNS. Например, запись: www.altersys-ua.com IN A 80.81.82.1 с установленной директивой $ORIGIN altersys-ua.com. будет расценена как запись вида: www.altersys-ua.com.altersys-ua.com. IN A 80.81.82.1 Также, обращаем внимание на то, что знак @ имеет специальное значение, а точнее — совпадает с текущим значением директивы SORIGIN и используется без комбинаций вида ns1.@ $TTL Синтаксис: STTL time-to-live Установка стандартного значения для времени жизни TTL (Time To Live). Используется для установки значения $ttl тех записей, где явно не указано поле ttl.
Файлы зон 599 $INCLUDE Синтаксис: $INCLUDE filename [domainname] Используется для импортирования содержимого файла filename. При этом ко всем неполным именам в файле будет добавлено значение $ORIGIN. Для изменения такого поведения перед директивой $ INCLUDE необходимо изменить директиву $ORIGIN или указать domainname. Следующие два примера идентичны: ; Пример 1 $ORIGIN main.com.ua. $INCLUDE main.com.ua ; Пример 2 $INCLUDE main.com.ua main.com.ua. $GENERATE Синтаксис: $GENERATE range leftpart recordtype rightpart Довольно интересная директива, которая очень полезна при настройке локальных сетей, где зачастую имена клиентских машин и IP-адреса взаимосвязаны и отличаются друг от друга одним числовым символом (как будет показано в примере ниже). Эта директива позволяет создать список записей, описываемых некой формулой. Поле range задает начальное и конечное значение итератора в формате start- end или start-end/step (если необходимо использовать значение шага счетчика, отличное от 1, выбранного по умолчанию). Поле leftpart описывает имя генерируемых записей, а для подстановки значения итератора используется символ $. Поле recordtype описывает тип генерируемых записей — могут использоваться типы NS, CNAME, А и PTR (если создается список для записей NS, проследите, чтобы в файле присутствовала как минимум одна неавтоматическая запись для сервера имен). Поле rightpart описывает значение,'которое принимает leftpart. Подстановка символа О обозначает подстановку значения директивы $0RIGIN. Например, добавим в файл named.conf: $GENERATE 10-100 client$ A 192.168.0.$ В результате получим список следующего вида (класс IN будет использоваться по умолчанию, к неполным именам добавляется значение $ORIGIN): clientlO A 192.168.0.10 clientll A 192.168.0.11 { ... } clientlOO A 192.168.0.100 Результат выполнения команды ns lookup для сгенерированных имен: # nslookup clientlO Server: localhost.altersys-ua.com Address: 127.0.0.1 Name: clientlO.altersys-ua.com Address: 192.168.0.10 # nslookup client99 Server: localhost.altersys-ua.com Address: 127.0.0.1
600 Глава 20. Сервер имен DNS Name: client99.altersys-ua.com Address: 192.168.0.99 Запись soa Каждый файл конфигурации зоны должен содержать запись SOA (Start of Authority), определяющую начало раздела, на который распространяются полномочия сервера в указанной зоне. Запись SOA не понятна интуитивно и имеет особенный формат блока data (см. описание RR). Полный синтаксис записи таков: [zone] [ttl] IN SOA origin contactperson (serial refresh retry expire minimum) Рассмотрим пример из листинга 20.3: @ IN SOA nsl.altersys-ua.com. root.altersys-ua.com. ( 2005042101 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL Итак, zone описывает имя зоны. Здесь можно применять знак @ или полностью указать имя зоны с завершающей точкой. Если zone будет указано без завершающей точки, то к имени будет добавлено значение директивы $ORIGIN. Можно указать время жизни (хотя это и не обязательно) — значение, установленное директивой $TTL. В примере из листинга 20.3 время жизни не установлено, поэтому применяется значение, указанное директивой $TTL: 3600 секунд. Поля IN и SOA указывают на класс и тип записи. Далее указан главный авторитетный сервер имен для описываемой зоны (origin). В примере это — один из серверов имен (nsl .altersys-ua.com.). Не забудьте в конце этой записи указать точку. Затем указывается адрес электронного почтового ящика администратора (поле contactperson), ответственного за зону. Обратите внимание на то, что вместо знака в в качестве разделителя используется точка. Можно указать еще несколько человек, ответственных за зону, но не здесь (см. ниже подраздел "Другие записи"). В рассмотренном примере адрес ответственного администратора имеет вид root@altersys- ua. com. He забудьте указать точку в конце, если используете полное имя домена в адресе. Далее расположены пять полей, как правило, заключенных в скобки, что позволяет форматировать записи на свое усмотрение и расставлять комментарии. Этот блок описывает общее поведение зоны. К примеру, представленный выше блок можно было записать одной строкой без скобок: @ IN SOA nsl.altersys-ua.com. root.altersys-ua.com. 2005042101 10800 3600 604800 86400 Рассмотрим назначение остальных полей: serial — серийный номер, указывающий на версию изменения файла. Используется вторичными серверами для проверки того, хранят ли они идентичную копию файла зоны. Увеличение номера является сигналом для обновления файла вторичными серверами. Изменение файла зоны без увеличения номера может вызвать проблемы в работе службы DNS. Как правило, принято использовать формат YYYYMMDDNN, где NN — версия изменения в течение дня. Если придерживаться такого формата, то в любой день изменение записи будет увеличивать значение этого номера. Если вторичные серверы не используются, то изменять серийный номер не обязательно, хотя и рекомендуется.
Файлы зон 601 refresh — число, определяющее значение времени в секундах, по прошествии которого вторичные серверы проверяют первичный сервер на предмет изменений в файле зоны. Если серийный номер изменился, то происходит обновление файлов зон на вторичных серверах. retry — в случаях, когда вторичные серверы при попытке связаться с первичным сервером для проверки обновлений обнаружили недоступность последнего, данное значение в секундах указывает интервал повторного опроса сервера на предмет изменений. Как правило, это поле имеет наименьшее значение. expire — данное поле указывает период устаревания данных. Если вторичный сервер не смог обновить файлы зон до истечения этого срока, то он сбрасывает все данные о зоне. Как правило, это значение устанавливается равным одной неделе. minimum — время жизни, применяемое к записям ресурсов в зоне, для которых оно не установлено явно. Запись ns Запись NS (Name Server) в работе DNS — одна из самых важных. Она позволяет указать авторитетные серверы (как первичные, так и подчиненные), которые отвечают за зону. Особенно важна эта запись для указания серверов имен для поддоменов. Синтаксис: [domain] [ttl] IN NS server В листинге 20.3 можно увидеть три записи типа NS: ; DNS Servers @ IN NS nsl.altersys-ua.com. @ IN NS ns2.altersys-ua.com. subdomain IN NS ns.subdomain.altersys-ua.com. В данном примере есть две записи серверов имен для текущей зоны @ (altersys- ua.com.) и одна запись, указывающая на сервер имен (с именем ns) для подцомена subdomain (subdomain. altersys-ua. com.). Обратите внимание на то, что имена серверов имен пишутся в полном формате, так как они могут принадлежать другим доменам. Кроме того, указать для сервера имен только одну запись NS недостаточно. Необходимо также указывать записи типа А для каждого сервера имен, перечисленного в файле зоны. Например: subdomain IN NS ns.subdomain.altersys-ua.com. { ... } ns.subdomain IN A 80.81.83.1 Заметьте, что имя домена и машины указаны в неполном виде, потому к ним будет добавлено значение директивы $ORIGIN. Используя команды host, dig и nslookup, можно просмотреть записи NS для домена: # host -t ns altersys-ua.com. altersys-ua.com name server nsl.altersys-ua.com altersys-ua.com name server ns2.altersys-ua.com tt dig altersys-ua.com. NS { ... } ;; ANSWER SECTION: altersys-ua.com. 1H IN NS nsl.altersys-ua.com. altersys-ua.com. 1H IN NS ns2.altersys-ua.com. ;; ADDITIONAL SECTION:
602 Глава 20. Сервер имен DNS nsl.altersys-ua.com. 1Н IN A 80.81.82.1 ns2.altersys-ua.com. 1Н IN А 80.81.82.2 ( ... ) # nslookup Default Server: localhost.altersys-ua.com Address: 127.0.0.1 > set type=NS > altersys-ua.com. Server: localhost.altersys-ua.com Address: 127.0.0.1 altersys-ua.com nameserver = ns2.altersys-ua.com altersys-ua.com nameserver = nsl.altersys-ua.com ns2.altersys-ua.com internet address = 80.81.82.2 nsl.altersys-ua.com internet address = 80.81.82.1 > exit Запись MX Запись MX (Mail Exchanger) указывает, какие почтовые серверы отвечают за обработку входящей электронной почты для указанной зоны. При создании почтового сообщения и попытке его отправить машина передает серверу имен МХ-запрос с указанием домена используемого в адресе получателя. DNS-сервер клиента находит сервер, отвечающий за указанный домен, и запрашивает у него МХ-записи, после чего возвращает список IP-адресов машин, отвечающих за доставку. Синтаксис записи: domain IN MX preference host Каждый почтовый сервер имеет некий приоритет использования. Почтовый сервер, который пытается доставить почту, в первую очередь пробует связаться с машиной, имеющей наивысший приоритет (наименьшее значение в записи MX). В случае неудачи предпринимаются попытки связаться с серверами, имеющими меньший приоритет. Просмотреть для какого-либо домена записи MX с приоритетами можно с помощью команд dig, host или nslookup: # host altersys-ua.com. altersys-ua.com has address 80.81.82.1 altersys-ua.com mail is handled (pri=10) by mail.altersys-ua.com altersys-ua.com mail is handled (pri=20) by relay2.altersys-ua.com # dig altersys-ua.com. MX { ... > ;; QUERY SECTION: ;; altersys-ua.com, type = MX, class = IN ;; ANSWER SECTION: altersys-ua.com. 1H IN MX 10 mail.altersys-ua.com. altersys-ua.com. 1H IN MX 20 relay2.altersys-ua.com. { ... ) mail.altersys-ua.com. 1H IN A 80.81.82.3 relay2.altersys-ua.com. 1H IN A 80.81.82.4 (...) tt nslookup Default Server: localhost.altersys-ua.com Address: 127.0.0.1 > set type=MX
Файлы зон 603 > altersys-ua.com Server: localhost.altersys-ua.com Address: 127.0.0.1 altersys-ua.com preference = 20, mail exchanger = relay2.altersys- ua . com altersys-ua.com preference = 10, mail exchanger = mail.altersys-ua.com altersys-ua.com nameserver = nsl.altersys-ua.com altersys-ua.com nameserver = ns2.altersys-ua.com relay2.altersys-ua.com internet address = 80.81.82.4 mail.altersys-ua.com internet address = 80.81.82.3 nsl.altersys-ua.com internet address = 80.81.82.1 ns2.altersys-ua.com internet address = 80.81.82.2 > exit Обратите внимание, во-первых, на то, что в записи MX не могут использоваться IP- адреса машин. Во-вторых, для всех записей MX в зоне должны присутствовать записи А, сопоставляющие имена с IP-адресами. В-третьих, использование псевдонимов CNAME в записях MX также является ошибочным, и может привести к зацикливанию почты. Запись а Запись A (Address) служит для привязки имени к IP-адресу. Синтаксис: [name] [ttl] IN A ipaddress В качестве значения поля name может выступать имя машины или запись @ (имя домена). При обращении к домену без указания имени машины будет возвращен IP- адрес (как правило, совпадает с IP-адресом сервера имен). В большинстве случаев имя указывается в неполном формате. Примеры записей А: localhost 0 nsl mail westhost IN IN IN IN IN A A A A A 127.0.0.1 80.81.82.1 80.81.82.1 80.81.82.3 80.81.82.254 Запись cname Запись CNAME (Canonical Name) создает псевдоним, указывающий на другое имя хоста. v Синтаксис: alias [ttl] IN CNAME [hostname] В листинге 20.3 было использовано несколько псевдонимов, но все они ссылались на имена в текущем домене: www IN CNAME 0 wwwl IN CNAME ns2 Никто не запрещает создавать ссылки на имена в других доменах (должны быть записаны в полном виде с завершающей точкой), например: main IN CNAME www.main.com.ua. Благодаря использованию псевдонимов, может упроститься задача управления зоной. Предположим, существует сервер mail.altersys-ua.com, который выступает
604 Глава 20. Сервер имен DNS также в качестве Web- и FTP-сервера. Если создать по одной записи типа А для имен mail, www и ftp, то при изменении IP-адреса машины придется изменять несколько записей. При использовании псевдонимов www и ftp, указывающих на mail, необходимо изменить только адрес для имени mail. Другие записи Существует еще несколько типов записей, которые используются крайне редко: HINFO, WKS, RP и ТХТ. Рассмотрим их кратко. hinfo (Host Information) Синтаксис: host [ttl] [class] HINFO hardware software Содержит два информационных поля об аппаратной части машины и версии операционной системы, разделенные пробелом. Первое поле hardware включает имя производителя и модель, второе — название операционной системы. Официальные типы перечислены в документе RFC 1340. nsl IN HINFO INTEL-386 UNIX-BSD В данном примере определено, что компьютер nsl имеет архитектуру i386; используется операционная система UNIX BSD. wks (Well Known Services) Синтаксис: name [ttl] [class] WKS ipaddress protocol services Запись данного типа служит для перечисления известных служб, предоставляемых хостом. Как правило, к хорошо известным службам относятся те, которые работают на портах с номерами ниже 256. В записи WKS перечисляются службы, доступные по отдельному адресу с указанным протоколом. В качестве протоколов обычно используются UDP и TCP. Для описания служб, работающих на различных протоколах одного хоста, необходимо завести две записи — для каждого протокола отдельно. @ IN WKS 80.81.82.2 TCP SMTP DOMAIN В данном примере определено, что компьютер с IP-адресом 80.81.82.2 предоставляет в домене почтовые услуги и является сервером DNS. RP (Responsible Person) и тхт Синтаксис: name [ttl] [class] RP mbox txt Первое поле описания mbox обозначает почтовый ящик ответственного администратора. Оно записывается в том же формате, что и для записи SOA: вместо символа t используется точка. Поле txt идентифицирует запись типа ТХТ, присутствующую в описании зоны. Оно позволяет предоставить детальное описание ответственного человека. Если описание не требуется, можно указать точку "." Пример использования: @ IN RP adidok.altersys-ua.com. admin.main.com.ua. admin.main.com.ua. IN TXT "Didok Olexander, 8050-3815806"
Файлы зон 605 Запись ptr. Файлы обратного просмотра Записи PTR используются в файлах обратных зон in-addr .arpa вместо записей типов А и CNAME в том же формате, однако для одного IP-адреса в обратной зоне должна быть только одна запись для сопоставления имени. По этой причине использование двух и более записей для одного компьютера в зоне обратного просмотра считается ошибкой и может привести к непредсказуемому поведению машин в домене. Как следствие, файлы обратных зон намного короче, к тому же здесь нет таких записей как MX или HINFO. Очень внимательно отнеситесь к тому, чтобы здесь сопоставлялись реальные имена машин, ранее описанные в файле зон прямого просмотра. Пример файла обратного просмотра для зоны 82.81.80. in-addr. arpa (см. листинг 20.1) представлен в листинге 20.4. Листинг 20.4. Файл зоны обратного просмотра DNS /etc/namedb/master/82.81.60.in-addr.arpa $TTL 3600 Й IN SOA nsl.altersys-ua.com. root.altersys-ua.com. ( 0 13 1 2 3 4 254 IN IN IN IN IN IN IN 2005042101 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 8 64 00 ) ; Minimum TTL NS NS PTR PTR PTR PTR PTR nsl.altersys-ua.com. ns2.altersys-ua.com. nsl.altersys-ua.com. ns2.altersys-ua.com. mail.altersys-ua.com. relay2.altersys-ua.com. westhost.altersys-ua.com. В данном файле определены привязки IP-адресов к именам в домене верхнего уровня in-addr. arpa. Таким образом, для сети 80.81.82.0 используется имя домена 82 . 81. 80. in-addr. arpa. В зоне обратного просмотра IP-адреса записываются в обратном порядке. Например, хосту в листинге 20.4 с именем mail будет соответствовать обратный IP-адрес 3 . 82 . 81. 80, а полное доменное имя в зоне будет иметь вид 3.82.81.80.in-addr.arpa. Файлlocalhost.rev Прежде чем использовать службу DNS, требуется создать специальный файл для зоны localhost. Для этого в каталоге /etc/namedb присутствует специальный сценарий make-localhost. Этот сценарий использует файлы PROTO. localhost- v6.rev и PROTO. localhost. rev для создания файлов зоны localhost. Если компьютер не принадлежит никому домену (команда hostname возвращает только имя), то этот сценарий запросит имя домена: # sh ./make-localhost Enter your domain name: altersys-ua.com # В противном случае, будет использован домен, в который входит данный хост, и никаких дополнительных вопросов задано не будет: # sh ./make-localhost
606 Глава 20. Сервер имен DNS В результате выполнения данного сценария будет создан файл, приблизительное содержание которого (без учета комментариев) представлено в листинге 20.5. Листинг 20.5. Файл ЗОНЫ localhost (/etc/naaedb/localhost ■ rev) $TTL 3600 Э IN SOA nsl.altersys-ua.com. root.nsl.altersys-ua.com. ( IN IN 20050421 ; Serial 3600 ; Refresh 900 ; Retry 3600000 ; Expire 3600 ) ; Minimum NS nsl.altersys-ua.com. PTR localhost.altersys-ua , . com ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ Несмотря на то, что BIND является самой распространенной реализацией DNS-сервера, и над ней работает довольно хорошая команда разработчиков, время от времени обнаруживаются серьезные проблемы в безопасности. Кроме того, неправильная настройка сервера может привести к проблемам в доступе. Рассмотрим существующие возможности ограничения доступа и повышения безопасности службы DNS. Ограничение доступа Для ограничения доступа к зонам могут использоваться списки контроля доступа ACL (Access Control List). Для создания списка доступа необходимо создать в файле named.conf блок aci: acl aclname { address_match_list }; Список доступа должен быть описан до того как будет впервые применен, потому все списки рекомендуется помещать в начало файла named, conf. Списки ACL могут включать в себя IP-адреса и другие списки доступа (рекурсивно). Существует стандартный набор встроенных списков контроля доступа: any — разрешается доступ всех хостов; попе — запрет доступа для любого хоста; localhost — разрешен доступ с IP-адресов всех интерфейсов системы; localnets — разрешен доступ любого хоста в сетях, к которым подключены интерфейсы хоста. Для того чтобы запретить доступ с какого либо IP-адреса или ACL, перед ними необходимо указать знак восклицания, например, 145.12.6.1 означает запрет доступа для хоста с IP-адресом 4 5.12.6.1. Также необходимо отметить, что просмотр списка происходит сверху вниз, и если ранее доступ хосту был разрешен, то запрет, указанный ниже, не сработает. Пример списка доступа: acl my_acl ( localhost; localnets; 80.82.83.1; 180.B2. 83/24; };
Обеспечение безопасности 607 Списки доступа используются в блоке описании зоны zone (для ограничения доступа к зоне) или в блоке options (для задания глобальных настроек доступа). Существует пять операторов для контроля доступа: allow-query — задает список хостов, которым разрешено передавать стандартные запросы DNS. Может быть задан для зоны, переопределяя allow-query для блока options. В случае, если данный оператор не задан, доступ на запросы разрешен любому хосту. allow-recursion — задает список хостов, которым разрешено передавать рекурсивные запросы к серверу. Если данный оператор не задан, разрешены рекурсивные запросы от любого хоста. allow-transfer — указывает список хостов, которым разрешено передавать содержимое зон по запросу. Как правило, здесь указывается список всех вторичных серверов. Оператор allow-transfer может быть определен для зоны, тем самым, переопределяя глобальные установки блока options. Если этот оператор не указан, то, как и в предыдущих случаях, разрешено выполнение операции передачи зоны любому хосту. allow-update — по умолчанию, сервер не настроен на поддержку Dynamic DNS (динамический DNS используется только в связке с DHCP). Если требуется поддержка динамического обновления зоны, то оператор allow-update позволяет задать список хостов, которые могут посылать запрос на обновление. В любом случае, необходимо как можно жестче ограничивать список машин, которым разрешено производить динамическое обновление. blackhole — определение списка адресов, с которых сервер не будет принимать запросы. Любые запросы от машин, перечисленных в данном списке, будут игнорироваться. Используя эти операторы, можно ограничить те или иные зоны от нежелательных запросов. Пример использования списков acl представлен в листинге 20.6 Листинг 20,6. Использование списков доступа ■■'■'■ ■ " -Т -' acl intns ( 80.82.82.1 80.82.82.2 80.82.83.1 locns { 192.168.0.1; 192.168.0.2; options ( directory "/etc/namedb"; version "None"; allow-transfer ( locns; intns; гопе "altersys-ua.com" { type master; file "master/altersys-ua.com"; allow-query { any; }; allow-transfer ( intns; }; I; zone "altersys-ua.loc" { type master;
608 Глава 20. Сервер имен DNS Листинг 20.6. Окончание file "master/altersys-ua.loc"; allow-query { localhost; localnets; }; allow-transfer ( locns; 192.168.1.1; }; jj В данном примере в блоке options используется опция version. Благодаря этому, можно скрыть версию используемой системы BIND, что также является одной из мер предосторожности. Большинство злоумышленников, узнав версию BIND, могут напрямую использовать ее для взлома, используя известные ошибки и уязвимости в данной реализации. В любом случае, сокрытие версии еще не означает, что вы защищены, н рекомендуется постоянно следить за обновлениями, устанавливая последнюю версию системы, не содержащую известных ошибок. Запуск named в "песочнице" По умолчанию, в FreeBSD присутствуют пользователь и группа с именем bind Они необходимы в том случае, если понадобится повысить безопасность системы BIND, запуская процесс под учетной записью непривилегированного пользователя, и настроить ее на работу в среде chroot. Для named среду chroot принято называть "песочницей" (sandbox). Таким способом можно ограничить выполнение процесса неким закрытым пространством, без права выйти за границы указанного каталога. При этом взлом данного процесса не позволит нанести урон всей системе в целом. Однако для нормальной работы в "песочнице" необходимо выполнить дополнительную настройку под пользователем root. В первую очередь, принято создавать некий подкаталог внутри /etc/namedb (например, sandbox или chroot ), чтобы не нарушать права и структуру в случае, если вы решите вернуться к простому стандартному решению. Примем, что каталогом для "песочницы" будет /etc/namedb/chroot. Создадим его и несколько других необходимых подкаталогов (bin, etc, var/run), а также не забудем установить необходимые права на директории: # cd /etc/namedb # mkdir -p chroot/var/run # mkdir chroot/bin ft mkdir chroot/etc # mkdir chroot/master # mkdir chroot/slave # chmod -R 7 50 chroot Во время работы, named создает рабочие файлы в директории /var/run. При этом он использует утилиту localtime для обработки значений в файлах зон и учета дат. Именно для localtime была создана директория etc. Нам также потребуется файл named-xfer, расположенный в директории /usr/ libexec/ (только начиная с версии FreeBSD 4.9-RELEASE), который мы разместим в поддиректории bin. Перепишем необходимые файлы: [/etc/namedb]# cp /etc/localtime chroot/etc/ [/etc/namedb]# cp /usr/libexec/named-xfer /etc/namedb/chroot/bin/ Далее необходимо позаботиться о создании конфигурационных файлов. Если настроенные файлы зон уже существуют, просто скопируйте их, в противном случае, создайте их вручную согласно описанию в предыдущих разделах данной главы: [/etc/namedb]# cp named.* chroot/ [/etc/namedb]# cp localhost.rev chroot/ [/etc/namedb]# cp -r master/ chroot/master/ [/etc/namedb]# chown -R bind:bind chroot
Обеспечение безопасности 609 Приведем файл /etc/namedb/chroot/named. conf к необходимому виду, а точнее, изменим блоки options и controls так, чтобы они приобрели приблизительно следующий вид (основное внимание обратите на оператор directory): options { directory "/"; named-xfer "/bin/named-xfer"; version "none"; query-source address * port 53; // recursion no; }; controls { unix "/var/run/ndc" perm 0600 owner 0 group 0; }; Если ведется файл журнала, позаботьтесь о том, чтобы он был в пределах ограниченной среды. В случае использования стандартного журнала syslogd, настройте его на использование дополнительного сокета протоколирования. Для этого добавьте в файл /etc/rc. conf запись: syslogd_flags="-l /etc/namedb/enroot/var/run/log" Опция -1 предназначена специально для ведения стандартного журнала syslogd из среды enroot. Возможно использовать до девятнадцати дополнительных сокетов протоколирования. Раз уже речь зашла о внесении изменений в файл /etc/rc. conf, позаботимся также и о запуске даемона named в созданной для него среде. Добавим следующие строки: named_enable="YES" named_flags="-u bind -g bind -t /etc/namedb/chroot /named.conf" Опция -t указывает директорию, которая будет использоваться в качестве директории /. Если конфигурационный файл named, conf сохранен в другой директории относительно /etc/namedb/chroot (например, в etc), то последняя строка будет иметь вид: named_flags="-u bind -g bind -t /etc/namedb/chroot /etc/named.conf" Таким образом, путь к конфигурационному файлу указывается относительно директории root в ограниченной среде sandbox. Теперь можно перезапустить систему. Если для управления даемоном named используется утилита ndc, то при работе с ней необходимо указать опцию -с, например: # ndc -с /etc/namedb/chroot/var/run/ndc reload Замечания по использованию BIND9 в FreeBSD Начиная с версии FreeBSD 5.3-RELEASE, система, по умолчанию, содержит новую версию сервера DNS: BIND9. Эта версия менее уязвима, предоставляет больше возможностей по обеспечению безопасности, автоматически запускается в среде chroot и имеет новую организацию файлов. Кроме того, директория по умолчанию изменена на /var/named/etc/namedb. Поддержка IPv6 в BIND9 Довольно интересной характеристикой BIND 9 является поддержка IPv6 (о протоколе IPv6 читайте в главе 12, "Настройка сетевой среды"). Хотя предыдущие реализа-
610 Глава 20. Сервер имен DNS ции BIND до этого уже разрешали использование IPv6, последняя реализация продукта рекомендуема для использования в таких сетях. Причем, если ранее разрешалось использовать две версии записей в прямых (forward) зонах: А6 и АААА (при этом использование А6 было более предпочтительным), — то в данный момент стандартом принято считать только записи ресурсов с использованием АААА. Ресурсная запись АААА довольно проста, например: mobile АААА 2001:05с0:8fff:fffe::2e2d В результате добавления такой записи к файлу зоны altersys-ua .com (рассматриваемой как пример ранее) можно получить следующие выходные данные утилиты host: # host mobile mobile.altersys-ua.com has address 192.168.0.200 mobile.altersys-ua.com has IPv6 address 2001:5c0:8fff:fffe::2e2d Записи А6 были немного гибче в использовании, однако, в виду требования их не использовать, рассматривать их мы не будем. Добавление обратной (reverse) зоны несколько сложнее и требует большей внимательности (что станет понятнее далее). Ко всему прочему, необходимо будет создать файл для зоны localhost с использованием сценария make-localhost:. При этом данный сценарий определит, имеет ли компьютер поддержку протокола IPv6, и в случае получения удовлетворительного ответа создаст файл localhost-v6. rev. Для его использования необходимо добавить следующую запись в конфигурационный файл /etc/namedb/named. conf (учитывая, что файл зоны для localhost находится в директории master относительно директории конфигурационных файлов): zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. 4>ip6.arpa" ( type master; file "master/localhost-v6.rev"; I; После перезапуска сервера имен можно выполнить команду для проверки: # nslookup : : 1 Server: 127.0.0.1 Address: 127.0.0.1#5Э 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.ar pa name = localhost.altersys-ua.com. Обратите внимание на запись имени зоны. Как видим, записываются все нули без исключения (нет понятия сокращенной записи с использованием ": :"). Зона имеет окончание ip6.arpa, что позволяет определить данную зону как обратную зону IPv6 (кстати, ранее использовалось окончание ip6. int, однако, как и ресурсная запись А6, теперь оно не рекомендуется). Что касается требования к внимательности... Упущение одного из нулей (и не только нулей, как будет видно при описании файла зоны, отличного от localhost) или добавление одного лишнего приводит к ошибке. Рассмотрим по порядку процесс создания обратной (reverse) зоны и добавления записи для xocTamobile.altersys-ua.com для IPv6-cera 2001: 05c0:8f f f: fffe/ 64 pref ixlen. В первую очередь необходимо внести изменения в конфигурационный файл named, conf. Добавим следующие строки: zone "e.f.f.f.f.f.f.8.0.c.5.0.1.0.0.2.ip6.arpa" { type master; file "master/2001.05c0.8fff.fffe.ipv6.arpa"; };
Обеспечение безопасности 611 Как видим, было указание на файл 2001. 05c0.8f ff. fffe.ipv6.arpa, в котором и хранится описание обратной зоны. Содержимое данного файла вначале практически ничем не отличается от подобного файла для IPv4, но вот записи ресурсов требуют осторожности и внимания. В листинге 20.7 представлен пример файла обратной зоны. Листинг 2^7, Простой-пример со^1в^^ма^6,<<^айл4 обратной 'зоны для |руб-сетц. $0RIGIN e.f.f.f.f.f.f.8.0.c.5.0.1.0.0.2.ip6.arpa. $TTL 3600 6 IN SOA mobile.altersys-ua.com. root.altersys-ua.com. ( 2005062101 ; Serial 3600 ; Refresh 900 ; Retry 3600000 ; Expiry 3600 ) ; Minimum IN NS mobile.altersys-ua.com. d.2.e.2.0.0. 0.0.0.0. 0.0.0. 0.0.0 IN PTR mobile . altersys-ua . com. После перезапуска сервера имен можно выполнить обратный поиск имени машины по известному адресу с использованием утилит host или nslookup: # nslookup 2001:5c0:8fff:fffe::2e2d Server: 127.0.0.1 Address: 127.0.0.1#53 d.2.e.2.0.0.0.0.0.0.0.0. 0.0.0.0.e.f.f.f.f.f.f.8.0.c.5.0.1.0.0.2.ip6.ar "5>ра name = mobile.altersys-ua.com. На этом рассмотрение использования сервера имен DNS на примере BIND можно завершить. Упомянем лишь, что, помимо ISC BIND, существует ряд других реализаций сервера имен DNS. Для этого просмотрите директорию dns/ в наборе портов (по умолчанию /usr/ports/dns).
612 Глава 21. Информационная служба NIS ГЛАВА 21. ИНФОРМАЦИОННАЯ СЛУЖБА NIS В распределенных сетях есть одна существенная проблема: обеспечение удобства работы пользователей независимо от компьютера, за которым они находятся в данный момент. Пользователя не должно волновать, где найти домашнюю директорию, почему на данном компьютере для него не заведена учетная запись, или почему на предыдущем рабочем месте он мог получить доступ к машине по имени carlton, а теперь получает ответ, что такой машины вовсе нет в сети. Решать подобные вопросы — задача администратора, и хорошо, если сеть маленькая и все, хотя и с трудом, но все же удается держать в "крепкой руке". В процессе роста любой сети в динамично развивающейся компании наступает момент, когда администратору тяжело держать все настройки в голове и эффективно управлять сетью. Еще большей проблемой является добавление пользователя или новой машины в сеть, состоящую из 50—100 компьютеров. Администратору приходится вручную добавлять пользователя на всех хостах, и редактировать на каждой машине файл /etc/hosts для сопоставления имени и IP-адреса нового компьютера. В таких случаях можно пойти по одному из двух путей: увеличить 1Т-команду или построить централизованную систему управления. Перечислим некоторые особенности и преимущества централизованных сетевых систем управления: централизованное хранение всей информации на одном сервере, так что все изменения "прозрачно" обновляются и вступают в силу на клиентских компьютерах с минимальными затратами времени; сервер может идентифицировать клиента и предоставить соответствующие права; клиент может удостовериться в том, что сервер является именно тем сервером, который необходим клиенту в данный момент; реализована идентификация пользователей — поскольку за клиентское оборудование может сесть человек, не имеющий права работать на данном компьютере, сервер должен иметь механизмы для подтверждения того, что пользователь является легитимным. В различных операционных системах используются собственные механизмы централизованного хранения и управления со своими особенностями, преимуществами и ограничениями. Так, в системах Novell есть службы NDIS, в системах Microsoft — Active Directory. Аналогичная система присутствует и в UNIX-системах, и хотя внутренняя реализация перечисленных систем существенно отличается, их цель — одна. СЕТЕВАЯ ИНФОРМАЦИОННАЯ СЛУЖБА NIS В середине 1980-х годов компания Sun Microsystems разработала продукт для централизованного администрирования систем SunOS под названием Network Information Services (сетевые информационные службы), сокращенно NIS. Разработка была настолько удачной, что через некоторое время NIS перекочевало практически на все системы UNIX — как коммерческие (HP-UX, AIX), так и бесплатные Linux-системы xBSD (OpenBSD, NetBSD, FreeBSD) и т.д.
Сетевая информационная служба NIS 613 Первоначально служба NIS называлась Yellow Pages (yp), но из-за некоторых проблем компании Sun пришлось изменить название. Старое название YP до сих пор иногда употребляется вместо NIS, также иногда используется сочетание NIS/YP. От старого названия осталось применение сочетания "ур" в названиях некоторых директорий и исполняемых файлов. Общее понимание NIS Как и NFS, NIS — это система типа "клиент-сервер", основанная на вызовах RPC. Она позволяет некоторой объединенной группе машин (домен NIS) совместно использовать общий набор конфигурационных файлов. Это дает возможность администратору, произведя минимум операций на клиентском компьютере — указав его как клиента N1S — в дальнейшем изменять все необходимые параметры централизованно из одной точки. Терминология, используемая при работе с NIS При работе в системе FreeBSD со службой NIS необходимо знать некоторые основные понятия и программы, используемые при настройке как сервера, так и клиента (табл. 21.1). Таблица 21.1. Термины, используемые при работе со службой NIS Термин Описание Имя домена NIS Всё компьютеры объединяются в некую логическую структуру, которая имеет доменное имя NIS. Все машины должны использовать идентичное имя, начиная От главного сервера и вторичных серверов, и заканчивая каждым клиентом (это имя не имеет ничего общего с доменными именами в DNS) rpcbind (5.x) На всех клиентских машинах и серверах должен быть запущен даемон portmap (4.x) rpcbind (portmap), для поддержки удаленного вызова процедур RPC (Remote Procedure Call). Без него службы NIS работать не будут ypbind Данный сервис служит для связи клиента NIS с NIS-сервером. Используя PRC и файл конфигурации для определения имени домена NIS, клиент имеет возможность Подключиться к серверу. Если на клиентской машине не запустить ypbind, то она будет лишена доступа к серверу NIS и не сможет взаимодействовать с ним. Данная утилита является основой для работы клиентов в среде NIS ypserv Программа ypserv отвечает за работу сервера NIS и должна запускаться только на компьютерах, выполняющих роль серверов NIS. В случае, если процесс ypserv перестает работать, машина будет не в состоянии отвечать на запросы. В таких случаях один из вторичных серверов берет на себя роль главнЬго rpc.yppasswdd На главных серверах NIS также запускается процесс rpc.yppasswdd, позволяющий клиентам NIS изменять свои пароли. В противном случае (когда этот даемон не запущен), клиентам придется входить на сервер и на нем менять свои пароли Принцип работы Выше было упомянуто три типа машин, присутствующих в системе NIS: главные (основные) серверы, вторичные серверы и клиентские машины. Рассмотрим назначение каждого из этих типов: Главные серверы. Выполняют роль централизованного хранилища информации о конфигурации всех машин в домене N1S, храня оригинальные файлы баз данных. Подобно первичному контроллеру домена NT, они хранят файлы, совместно используемые всеми клиентами, например, master .passwd, group, hosts
614 Глава 21. Информационная служба NIS и др. В некоторых случаях можно настроить один сервер как основной для нескольких доменов NIS. Вторичные серверы. Хранят копии оригинальных баз данных конфигурации для обеспечения избыточности и отказоустойчивости в случае сбоя главного сервера. Также обеспечивают балансировку нагрузки на основной сервер, принимая на себя вызовы клиентов. Клиентские машины. Конечные компьютеры, использующие общедоступную информацию о конфигурации. Во время входа в систему клиенты проходят аутентификацию на сервере NIS. Когда клиенту необходима какая-либо информация, которая обычно (без домена NIS) находится локально (например, необходимо определить IP-адрес по имени машины из файла /etc/hosts), то он посылает запрос серверу N1S в своем домене (как правило, клиент работает с первым сервером домена, ответившим на его запрос). ИСПОЛЬЗОВАНИЕ NIS Рассмотрим процесс планирования, настройки серверов и клиентов NIS. К планированию всегда следует подходить очень осторожно, дабы не иметь проблем глобальной перенастройки в дальнейшем. Планирование Правильное планирование — длительный и ответственный процесс. Представляем некоторые замечания по планированию внедрения NIS: выделите основные задачи, которые стоят перед вами; определите текущую обстановку и опишите конфигурацию сети; выделите компьютеры, которые будут выступать в роли серверов; подберите имя для домена; определите временные затраты при перенастройке и возможные проблемы, которые могут возникнуть во время настройки или в процессе использования системы. Подготовка Может показаться смешным, но выбор имени домена NIS — не очень-то простой процесс. Это имя не должно совпадать с именами доменов, которые уже присутствуют в сети, поскольку клиент рассылает запросы на получение информации, включая имя домена, в который входит сам. Не рекомендуется использовать для домена NIS имя DNS домена в Internet — как правило, это приводит к проблемам и путанице при решении проблем внутри сети. Как бы то ни было, выбирайте уникальное имя, которое не использует другая служба, например, DNS, рабочая группа SMB, домен Active Directory (если используется пакет Samba), и не совпадает с именем любой машины в сети. Зачастую применяются имена, описывающие группу объединенных машин. Например, для отдела IT будет хорошо назвать домен NIS как "it-dep.nis". Некоторые ОС имеют ограничения в именовании доменов NIS. Например, как и для домена AD в сети Win2k, где обязательно используется имя DNS, SunOS использует имя домена NIS в качестве имени домена Internet. Далее в этой главе будет использоваться имя домена f reebsd. nis. Необходимо уделить особое внимание выбору компьютера, который будет выполнять роль сервера NIS. Очень важно понимать последствия его выхода из строя или перезагрузки. В тех случаях, когда клиент не сможет соединиться со своим сервером, машину в прямом смысле становится невозможно использовать, в первую очередь из-за отсутствия информации о пользователях и группах. Если вы— сотрудник большой
Настройка серверов NIS 615 компании, обоснуйте покупку отдельного сервера, выделенного для выполнения исключительно роли основного сервера NIS (и никаких служб DNS, FTP и т.п.). Серверы NIS Как упоминалось ранее, оригинальные копии всех конфигурационных файлов NIS хранятся на одном компьютере, называемом главным или основным сервером NIS. Для хранения этой информации используются базы данных, которые называются картами NIS. Для хранения карт в FreeBSD используется директория /var/yp/ [domain- name] , где domainname — имя домена NIS, обслуживаемого сервером. В случае необходимости, один и тот же сервер NIS может поддерживать несколько доменов одновременно. Для этого следует создать по одному каталогу на каждый обслуживаемый домен и разместить в них наборы карт, независимые от других наборов. Для обслуживания всех входящих запросов NIS от клиентов, распознавания домена, правильного отображения имени домена в путь к файлам базы данных и обратной передачи информации серверы используют даемон ypserv. При этом нет надобности запускать несколько процессов — один процесс обслуживает все домены. НАСТРОЙКА СЕРВЕРОВ NIS В FreeBSD поддержка NIS присутствует сразу же после установки. Все что требуется сделать — отредактировать некоторые конфигурационные файлы, и настроить серверы с использованием утилиты ypinit. Настройка основного сервера Как правило, настройка основного сервера NIS не вызывает практически никаких проблем и довольно проста, как и в случае с NFS. Для того чтобы включить поддержку NIS на сервере, следует добавить/изменить следующие строки в файле /etc/rc. conf: portmap_enable="YES" nisdomainname="freebsd.nis" nis_server_enable="YES" nis_yppasswdd_enable="YES" В первой строке определяется имя домена NIS, которое будет установлено еще до инициализации сетевых параметров. Как было оговорено ранее, имя домен звучит как freebsd.nis. Вторая строка указывает на необходимость запуска даемона сервера NIS (ypserv) при загрузке машины. Третей строке соответствует запуск даемона rpc.yppasswdd, который позволяет пользователям менять пароль со своей клиентской машины. В зависимости от потребностей, для сервера можно передать дополнительные параметры, определив их в файле /etc/rc. conf: nis_server_flags="" ni3_yppas3wdd_flags="" Полный перечень доступных опций можно найти в справочном руководстве man ypserv и man rpc.yppasswdd. После внесения изменений в конфигурационный файл можно перезапустить сервер или же выполнить под суперпользователем root сценарий /etc/netstart для установки имени домена. Во время перезагрузки можно увидеть некоторые изменения в сообщениях процесса init (пример для FreeBSD 4.11): [ ] Doing initial network setup: hostname domain. loO: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST^ mtu 16384 inet 127.0.0.1 netmask Oxff000000
616 Глава 21. Информационная служба NIS [ ] Routing daemons:. Additional daemons: syslogd. Doing additional network setup: portmap ypserv rpc.yppasswddrpc.yppasswdd: can't get name of NIS master server for domain freebsd.nis Starting final network daemons:. [ ] Карты NIS Карты NIS для каждого домена хранятся в каталоге /var/yp/ [domainname]. Все они генерируются из конфигурационных файлов, находящихся в директории /etc. Обратите внимание на то, что файл /etc/master .passwd в целях безопасности не распространяется, поскольку хранит пароли, поэтому прежде, чем приступить к инициализации KapTNIS, необходимо позаботиться о файле паролей: It cp /etc/master.passwd /var/yp/ # cd /var/yp # Is -1 total 22 -r—r—r— 1 root wheel 18448 21 янв 17:46 Makefile.dist -rw 1 root wheel 1488 18 anp 21:48 master .passwd Удостоверьтесь, что для файла master .passwd установлены соответствующие права доступа, в противном случае измените их командой # chmod 600 master.passwd Затем отредактируйте этот файл, удалив все записи для системных пользователей и пользователей, информацию о которых распространять нежелательно (например, root и toor). Теперь можно перейти непосредственно к инициализации карт NIS. Для этого используется сценарий ypinit из стандартного набора (подробности — в man ypinit). Данный сценарий создает директорию для домена /var/yp/ [domainname], файл /var/yp/ypservers, после чего вызывает сценарий /var/yp/Makefile для создан ия набора карт NIS. Для генерации карт основного сервера NIS сценарию ypinit необходимо передать параметр -m [domainname] (имя домена передавать не обязательно — в этом случае будет использоваться домен, установленный по умолчанию для этой машины во время загрузки или выполнения сценария /etc/netstart): # ypinit -m Server Type: MASTER Domain: freebsd.nis Creating an YP server will require that you answer a few questions. Questions will all be asked at the beginning of the procedure. Do you want this procedure to quit on non-fatal errors? [y/n: n] n Теперь следует проверить правильность именования домена и его типа, после чего можно выбрать ответ "п" (для продолжения работы сценария в случае появления нефатальных ошибок). Ok, please remember to go back and redo manually whatever fails. If you don't, something might not work. At this point, we have to construct a list of this domains YP servers. mobile.altersys-ua.com is already known as master server.
Настройка серверов NIS 617 Please continue to add any slave servers, one per iinc. When you are done with the list, type a <control D>. master server next host to add next host to add mobile.altersys-ua. com localsrv.altersys-ua.com The current list of NIS servers looks like this: mobile.altersys-ua.com localsrv.altersys-ua.com Is this correct? [y/n: у] у В данном случае выдано сообщение о том, что данный сервер будет настроен как основной, а также просьба ввести имена всех вторичных серверов — каждый в отдельной строке. В данный момент создается директория f reebsd. nis и копируется файл Makefile .dist в Makefile. ВНИМАНИЕ! Программа ypinit создает полную копию файла /var/yp/Makefile.dist. В нем по умолчанию предполагается, что ваш сервер— единственный сервер NIS для домена (без вторичных), а также отключена поддержка других операционных систем (предполагается использовать безопасные пароли из файла master .passwd). Если планируется настроить вторичные серверы, то необходимо заранее отредактировать файл /var/yp/Makefile.dist. При этом следует закомментировать (поставить перед ней знак "#") строку nopush = "True". Это необходимо для синхронизации изменений в картах NIS на основном сервере с вторичными серверами NIS. После ввода списка вторичных серверов необходимо нажать комбинацию клавиш <Ctrl+D>. Сверьте список и, в случае отсутствия ошибок, выберите "у" для процесса генерации карт: Building /var/yp/freebsd.nis/ypservers. . . Running /var/yp/Makefile... NIS Map update started on понедельник, 18 апреля 2005 г. 22:59:34 (EEST) for domain freebsd.nis Updating hosts.byname... Creating new /var/yp/passwd file from /var/yp/master.passwd... Updating netid.byname... Updating hosts.byaddr... Updating networks.byaddr. . . yp_mkdb: no key — check source file for blank lines yp_mkdb: no key -- check source file for blank lines Updating networks.byname... ypjnkdb: no key -- check source file for blank lines yp_mkdb: no key -- check source file for blank lines Updating protocols.bynumber... Updating protocols.byname... Updating rpc.byname... Updating rpc.bynumber... Updating services.byname... yp_mkdb: duplicate key 'compressnet/tcp' - skipping yp_mkdb: duplicate key 'compressnet/udp' - skipping ypjmkdb: duplicate key 'mit-ml-dev/tcp' - skipping ypjnkdb: duplicate key 'mit-ml-dev/udp' - skipping yp_mkdb: duplicate key 'rap/tcp' - skipping yp_mkdb: duplicate key 'rap/udp' - skipping yp_mkdb: duplicate key '351/tcp' - skipping
618 Глава 21. Информационная служба NIS yp_mkdb: duplicate key '351/udp' - skipping yp_mkdb: duplicate key '352/tcp' - skipping yp_mkdb: duplicate key '352/udp' - skipping yp_mkdb: duplicate key '666/tcp' - skipping yp_mkdb: duplicate key '666/udp' - skipping ( ... } Updating group.byname... Updating group.bygid... Updating passwd.byname... Updating passwd.byuid... Updating master.passwd.byname... Updating master.passwd.byuid... NIS Map update completed. mobile.altersys-ua.com has been setup as an YP master server without any errors. В результате будет получена следующая структура директорий: mobile* pwd /var/ypmobile # Is -1 total 48 -r 1 root wheel 18450 18 anp 22:51 Makefile -r—r—r— 1 root wheel 18450 18 anp 22:41 Makefile.dist drwx 2 root wheel 512 18 anp 22:59 freebsd.nis -rw 1 root wheel 188 18 anp 22:00 master.passwd -rw 1 root wheel 111 18 anp 22:59 passwd -rw 1 root wheel 64 18 anp 22:59 ypservers mobile! Is -1 freebsd.nis/ total 1184 -rw 1 root wheel 40960 18 anp 22:59 group.bygid -rw 1 root wheel 40960 18 anp 22:59 group.byname -rw 1 root wheel 40960 18 anp 22:59 hosts.byaddr -rw 1 root wheel 40960 18 anp 22:59 hosts.byname -rw 1 root wheel 40960 18 anp 22:59 master.passwd.byname -rw 1 root wheel 40960 18 anp 22:59 master.passwd.byuid -rw 1 root wheel 40960 18 anp 22:59 netid.byname -rw 1 root wheel 40960 18 anp 22:59 networks.byaddr -rw 1 root wheel 40960 18 anp 22:59 networks.byname -rw 1 root wheel 40960 18 anp 22:59 passwd.byname -rw 1 root wheel 40960 18 anp 22:59 passwd.byuid -rw 1 root wheel 57344 18 anp 22:59 protocols.byname -rw 1 root wheel 40960 18 anp 22:59 protocols.bynumber -rw 1 root wheel 40960 18 anp 22:59 rpc.byname -rw 1 root wheel 40960 18 anp 22:59 rpc.bynumber -rw 1 root wheel 524288 18 anp 22:59 services.byname -rw 1 root wheel 40960 18 anp 22:59 ypservers В файле /var/yp/ypservers перечислены имена серверов, использовавшихся при создании баз данных. В директории /var/yp/freebsd.nis находятся файлы в формате Unix db. He забудьте перезапустить сервер. Настройка вторичного сервера NIS Настройка вторичного сервера NIS намного проще, чем настройка главного сервера. Это связано с тем, что нет необходимости редактировать файл паролей и отвечать на некоторые дополнительные вопросы программы ypinit.
Настройка серверов NIS 619 Итак, во-первых, на вторичном сервере необходимо отредактировать файл /etc/rc. conf, а именно: включить поддержку portmap (rpcbind) (если ее не было); добавить строку, описывающую имя основного используемого домена; включить запуск даемона обслуживания запросов NIS, а также клиентскую часть (требуется для обнаружения карт NIS): portmap_enable=J,YES" nisdomainname="freebsd.nis" nis_server_enable="YES" nis_client_enable="YES" nis_client_flags="-S freebsd.nis,mobile" He забудьте удостовериться, что в файле /etc/hosts присутствует сопоставление IP-адреса и имени для главного сервера. Перезагрузите систему для применения новых сетевых параметров и запуска необходимых процессов. После перезагрузки системы можно приступать к настройке синхронизации карт (да-да, именно синхронизации!). В первую очередь, при запуске ypinit теперь необходимо использовать опцию -s вместо -m (s — от "slave", m — от "master"). Используя эту опцию, следует обязательно указать имя основного сервера для домена, а затем —имя самого домена (если это имя не указать, то будет использован домен, указанный в конфигурационном файле):, localsrv# ypinit -s mobile freebsd.nis Server Type: SLAVE Domain: freebsd.nis Master: mobile Creating an YP server will require that you answer a few questions. Questions will all be asked at the beginning of the procedure. Do you want this procedure to quit on non-fatal errors? [y/n: n] Ok, please remember to go back and redo manually whatever fails. If you don't, something might not work. There will be no further questions. The remainder of the procedure should take a few minutes, to copy the databases from virtual. Transfering master.passwd.byuid... ypxfr: Exiting: Map successfully transferred Transfering passwd.byuid... ypxfr: Exiting: Map successfully transferred Transfering passwd.byname... ypxfr: Exiting: Map successfully transferred Transfering group.bygid... ypxfr: Exiting: Map successfully transferred Transfering group.byname... ypxfr: Exiting: Map successfully transferred Transfering services.byname... ypxfr: Exiting: Map successfully transferred Transfering rpc.bynumber... ypxfr: Exiting: Map successfully transferred Transfering rpc.byname... ypxfr: Exiting: Map successfully transferred Transfering protocols.byname... ypxfr: Exiting: Map successfully transferred Transfering master.passwd.byname... ypxfr: Exiting: Map successfully transferred Transfering networks.byname... ypxfr: Exiting: Map successfully transferred Transfering networks.byaddr... ypxfr: Exiting: Map successfully transferred Transfering hosts.byaddr...
620 Глава 21. Информационная служба NIS ypxfr: Exiting: Map successfully transferred Transfering netid.byname... ypxfr: Exiting: Map successfully transferred Transfering hosts.byname... ypxfr: Exiting: Map successfully transferred Transfering protocols.bynumber... ypxfr: Exiting: Map successfully transferred Transfering ypservers... ypxfr: Exiting: Map successfully transferred localsrv.altersys-ua.com has been setup as an YP slave server without any errors. Don't forget to update map ypservers on mobile. Полученная в результате структура каталогов будет примерно следующей: localsrv# pwd /var/yp localsrv# Is -1 total 24 _r__r—r— i root wheel 18448 Jan 21 17:46 Makefile.dist drwxr-xr-x 2 root wheel 512 Apr 19 15:05 binding drwx 2 root wheel 512 Apr 19 15:00 freebsd.nis localsrv# Is -1 freebsd.nis/ total 1184 -rw 1 root wheel 40960 Apr 19 15:00 group.bygid -rw 1 root wheel 40960 Apr 19 15:00 group.byname -rw 1 root wheel 40960 Apr 19 15:00 hosts.byaddr -rw 1 root wheel 40960 Apr 19 15:00 hosts.byname -rw 1 root wheel 40960 Apr 19 15:00 master.passwd.byname -rw 1 root wheel 40960 Apr 19 15:00 master.passwd.byuid -rw 1 root wheel 40960 Apr 19 15:00 netid.byname -rw 1 root wheel 40960 Apr 19 15:00 networks.byaddr -rw 1 root wheel 40960 Apr 19 15:00 networks .byname -rw 1 root wheel 40960 Apr 19 15:00 passwd.byname -rw 1 root wheel 40960 Apr 19 15:00 passwd.byuid -rw 1 root wheel 57344 Apr 19 15:00 protocols.byname -rw 1 root wheel 40960 Apr 19 15:00 protocols.bynumber -rw 1 root wheel 40960 Apr 19 15:00 rpc.byname -rw 1 root wheel 40960 Apr 19 15:00 rpc.bynumber -rw 1 root wheel 524288 Apr 19 15:00 services.byname -rw 1 root wheel 40960 Apr 19 15:00 ypservers В директории /var/yp/freebsd.nis будет находиться точная копия файлов с сервера mobile в аналогичной директории. При изменении карт на главном сервере он будет пытаться сам синхронизировать обновленные версии со всеми вторичными серверами, указанными в ypservers. He забудьте перезапустить компьютер. Обновление карт С каждым изменением необходимо перестраивать базы данных и выполнять синхронизацию с вторичными серверами. Предположим, в сети появился новый компьютер, на который была только что установлена система FreeBSD с именем client21. altersys-ua.com. Требуется распространить информацию об этом всем хостам в домене, изменив файл /etc/hosts. Для этого на главном сервере домена NIS следует перейти в директорию /var/yp и выполнить команду make domainname: # cd /var/yp # more /etc/hosts
Настройка серверов NIS 621 127.0.0.1 localhost.altetsys-ua.com localhost 192.168.0.200 mobile mobile.altersys-ua.com 192.168.0.2 localsrv localsrv.altersys-ua.com 192.168.0.111 virtual virtual.altersys-ua.com 192.168.0.21 client21 client21.altersys-ua.com # make freebsd.nis NIS Map update started on вторник, 19 апреля 2005 г. 16:46:07 (EEST) for domain freebsd.nis Updating hosts.byname... yppush: transfer of map hosts.byname to server mobile.altersys-ua.com failed yppush: status returned by ypxfr: Master's version not newer Pushed hosts.byname map. Updating hosts.byaddr... yp_mkdb: no key -- check source file for blank lines yppush: transfer of map hosts.byaddr to server mobile.altersys-ua.com failed yppush: status returned by ypxfr: Master's version not newer Pushed hosts.byaddr map. NIS Map update completed. Если, так же как и в представленном выше примере, появляются ошибки, не обращайте на них внимания. Теперь на всех серверах (которые были доступны в данный момент) будет храниться обновленная версия базы данных KapTNIS. Добавление нового вторичного сервера NIS Иногда возникает потребность добавить новый вторичный сервер NIS. Эта процедура очень проста, потому рассматривать ее очень подробно мы не будем. В первую очередь,4 необходимо обновить файл /etc/hosts на основном сервере, добавив в него IP-адрес и имя для нового компьютера. Предположим, имя нового сервера будет secondary2.altersys-ua.com, файл hosts обновлен, и все действия по подготовке к использованию в качестве вторичного сервера на secondary2 были выполнены (прописан запуск необходимых сервисов и имя домена). После этого выполним на основном сервере следующую последовательность команд: mobile# make NIS Map update started on среда, 20 апреля 2005 г. 06:05:09 (EEST) for domain freebsd.nis Updating hosts.byname... Pushed hosts.byname map. (...) NIS Map update completed. mobile# ypinit -u freebsd.nis Server Type: UPDATE Domain: freebsd.nis Update the list of hosts running YP servers in domain freebsd.nis. Master for this domain is mobile.altersys-ua.com. First verify old servers, type \ to remove a server. Then add new servers, one per line. When done type a <control D>. master server verify host next host to add next host to add mobile.altersys-ua.com [localsrv.altersys-ua.com] secondary2.altersys-ua.com "D The current list of NIS servers looks like this:
622 Глава 21. Информационная служба NIS mobile.altersys-ua.com localsrv.altersys-ua.com secondary2.altersys-ua.com Is this correct? [y/n: у] у Building /var/yp/freebsd.nis/ypservers. . . mobile# Теперь необходимо перейти на компьютер secondary2 и выполнить команду: secondary2# ypinit -s mobile freebsd.nis КЛИЕНТЫ NIS Клиенты NIS — это именно те компьютеры, для которых и выполняются все описанные выше настройки. Для их работы необходимо запустить только один процесс ypbind. Эта утилита позволяет привязаться к одному из серверов NIS в своем домене, который устанавливается командой domainname и указывается в файле /etc/rc.conf для автоматической установки каждый раз при запуске машины. После того имя домена определено, даемон ypbind начинает широковещательную рассылку запросов RPC в локальной сети с указанием имени домена. Как только какой- либо сервер, обслуживающий этот домен, получает такой запрос, он немедленно отвечает клиенту. Клиент запоминает первый компьютер, ответивший на запрос, и устанавливает с ним постоянную связь для обмена сообщениями. В определенные моменты времени ypbind передает тестовые запросы на проверку работоспособности серверной машины, и в том случае, если ответ не получен, разрывает связь и начинает рассылать запросы поиска нового сервера, отвечающего за этот домен. Настройка клиента Настройка FreeBSD, как клиента NIS, достаточно проста и может быть произведена частично еще при установке системы (с некоторыми дополнениями после первой загрузки), или же полностью вручную путем изменения некоторых файлов. Для настройки с помощью программы sysinstall необходимо знать имя домена NIS, к которому планируется присоединить новую машину. При этом последовательность действий такова: 1. Из главного меню программы sysinstall переходим в раздел Configure. 2. Переходив в раздел Startup, где выбираем пункты nis client и nis domain- name. 3. В диалоговом окне вводим имя домен, который планируется использовать (рис. 21.1). ГТ~5 [ .1 IX] ВДЕХШШОХШ [ 1 с 1 [ j [ 1 t д Рис. 21.1. Ввод имени домена в программе sysinstall Если система уже установлена, то эту же последовательность действий можно реализовать, отредактировав файл /etc/rc.conf. В этот файл следует добавить строки, Run a local паме server on this host Set default flags to nat-ied (if enabled) n I lout. Set HIS donainnane (If enabled) uer. ccount i to run linux SUR4 b |freabsd.nis| m I'ance 1 I ■•■ ba u L- ' dp r« i
Обеспечение безопасности NIS 623 которые задают имя домена NIS и определяют запуск даемона ypbind, во время запуска сетевых сервисов: nis_client_enable="YES" nisdomainname="freebsd.nia" После этого, воспользовавшись утилитой vipw, следует удалить ненужные записи пользователей из файла /etc/master .passwd (оставьте, как минимум, учетную запись для локального пользователя из группы wheel, для возможности входа в систему в случае недоступности сервера NIS), а в конец добавить следующую строку: +::::::::: Это предоставит возможность импортировать все учетные записи и их параметры из сервера NIS и позволит указанным пользователям входить локально на данном компьютере. Отредактируйте также файл /etc/group, добавив в него следующую строку: + : * : : Если все сделано правильно, то на клиентской машине можно выполнить команды ypcat hosts, ypcat passwd и др. для просмотра соответствующих карт на сервере NIS. Для просмотра полного списка карт можно использовать команду ypcat -x. Как правило, вторичные серверы также настраиваются как клиенты NIS, однако при этом возникает ряд проблем. В первую очередь, это связано с рассмотренным выше принципом взаимодействия клиента и сервера. Например, нештатная ситуация может возникнуть в том случае, когда несколько вторичных серверов установят связь с еще одним вторичным сервером, который в определенный момент выйдет из строя. В таких ситуациях можно позаботиться о статической привязке к самому себе или к первичному серверу, во избежание перекрестных запросов. Для этого необходимо запустить даемон ypbind с флагом -S domainname, servername, что реализуется добавлением в файл /etc/rc. conf строки следующего вида: nis_client_flags="-S freebsd.nis,mobile" #подставьте свои значения ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ NIS К понятию обеспечения безопасности NIS можно отнести несколько аспектов. Это как ограничение входа некоторых пользователей на определенных компьютерах, так и запрет приема серверами запросов из определенных подсетей. В разных случаях это можно сделать различными способами. Рассмотрим самые распространенные методы. Запрет входа определенных пользователей NIS Естественно, бывают случаи, когда необходимо запретить некоторым пользователям вход на определенные машины как локально, так и с использованием терминальной сессии. Например, на персональном ноутбуке директора требуется запретить вход некоторых пользователей, присутствующих в базе NIS. Для этого на локальной машине директора с помощью утилиты vipw в файл /etc/master.passwd необходимо добавить строки с перечислением запрещенных пользователей до строки "+:::::::::" в формате -username: ::::::::. Например, для запрета входа пользователя user2 в этом файле должны присутствовать следующие строки: -иэег2::::::::: +
624 Глава 21. Информационная служба NIS ВАЖНО! Такой метод ограничения входа не рекомендуется и в больших сетях его применение считается некорректным. Это особенно касается рассмотренного выше случая, когда приходится запрещать большинство учетных записей локально. Более правильным будет применение сетевых групп. О сетевых группах и их использовании в сочетании с NIS читайте ниже в этом же разделе. Использование системы securenets Существует и другой метод защиты: ограничение доступа только с определенной группы хостов. Из всего, что было описано ранее, становится понятным, что любой пользователь без вашего ведома и каких либо ограничений может сам, зная имя домена, выполнить запрос PRC к вашим серверам для получения любой доступной информации (например, списка пользователей или имена компьютеров). Для предотвращения такого типа запросов даемон ypserv поддерживает систему securenets. С ее помощью можно определить группы хостов, которым разрешено отправлять запросы данному серверу. Каждый раз при запуске служба сервера NIS пытается загрузить информацию о securenets из файла /var/yp/securenets. По умолчанию, этот файл отсутствует, поэтому его придется создать самому. Он содержит записи, состоящие из указания сети и маски, разделенных пробелом или символом табуляции. Строки, начинающиеся со знака "#", воспринимаются как комментарии, например: # разрешить соединение для локального хоста 127.0.0.1 255.255.255.255 # разрешить соединения из локальной сети # для хостов 192.168.0.0-192.168.0.255 # и 192.168.2.0-192.168.2.255 192.168.0.0 255.255.255.0 192.168.2.0 255.255.255.0 После создания данного файла перезапустите сервис ypserv следующей командой: # killall -HUP ypserv Заметьте, что такой файл необходимо создать на всех серверах. Если его не разместить на одном из серверов, то клиентские компьютеры смогут получать с этого сервера информацию. Запрос, полученный от машины с адресом, разрешенным в файле securenets, будет обработан стандартным способом, в противном случае он будет отвергнут с записью в журнальном файле. В отсутствие файла securenets, сервер позволяет обслуживание любого хоста. Параллельно с securenets можно попробовать использовать для разграничения доступа пакет TCP Wrapper (файл /etc/hosts . allow), однако использование обоих способов не гарантирует полную безопасность в силу некоторых проблем, связанных с их внутренней реализацией. Наиболее правильным будет использовать их в сочетании с набором правил пакета IPFW или ему подобных. Использование сетевых групп Ранее уже упоминалось, что запрет на вход пользователей путем перечисления всех запрещенных учетных записей —вариант не из лучших, и более того — бессмысленный. Только представьте, что будет твориться в сети, состоящей хотя бы из десяти компьютеров и двадцати пользователей, доступ которых к машинам строго регулируется! С какими затратами будет связано добавление в сеть каждого нового пользователя! Мы
Обеспечение безопасности NIS 625 снова возвращаемся к той самой рутинной работе, которой пытались избежать, и в первую очередь теряется смысл и красота централизованного администрирования. Как же поступить? Отказаться от него? Нет. Разработчики NIS уже позаботились о простом решении этой проблемы, и это решение — сетевые группы. Они немного отличаются от стандартных групп UNIX: во-первых, отсутствием идентификаторов, а во- вторых, — возможностью включения в группы как пользователей, так и других групп. Для тех, кто ранее работал с Active Directory в системе Windows, данное решение будет очень знакомым и простым в понимании. Итак, сетевые группы помогают упростить процесс управления доступом к компьютерам как в больших, так и в малых сетях. Для того чтобы понять суть применения сетевых групп, рассмотрим поэтапно процесс настройки небольшой сети с несколькими маленькими отделами, состоящими из двух-трех человек. Итак, для упрощения задачи предположим, что у нас есть три компьютера: virtual — основной сервер сети, к которому имеет доступ только ГГ-отдел, состоящий из пользователей adidok и adm, а также техника из отдела технической поддержки с именем adm но в домене tech. sup; local srv — вторичный сервер, к которому допускаются все члены 1Т-отдела, управляющий персонал (ikonko и sbutusov) и один разработчик (smike); mobile — простая рабочая машина, к которой имеют доступ все работники компании: IT-отдел, управляющий персонал, а также две независимые группы разработчиков (smike, vhomchenko, yef etov, imostik). Даже в данном случае ограничение доступа путем перечисления недоступных пользователей на каждой машине — рутинное и запутанное дело, а одна ошибка может повлечь непредсказуемые последствия со скандалами (если не увольнением). Поэтому самое лучшее — использовать сетевые группы, поскольку в этом случае отпадает необходимость постоянно вносить изменения на компьютерах, а настройка сводится практически к добавлению двух строк в файл паролей и изменению одного конфигурационного файла на сервере. Первое, что необходимо сделать, — создать учетные записи для пользователей (параметр -d указывает директорию, где находится файл master .passwd, а как было упомянуто ранее, при построении KapTNIS используется файл master .passwd из директории /var/yp): # vipw -d /var/yp adidok:*:1004:0: : : : : : adm:*:1005:0: : : : : : ikonko:*:1006:0: : : : : : sbutusov:*:1007:0: : : : : : smike:*:1008:0::: : : : vhomchenko:*:1009:0:::::: yefetov:*:1010:0:::::: imostik:*:1011:0: : : : : : { вы можете в последнем поле указать командный интерпретатор, используемый по умолчанию; в принципе, его можно будет переопределить для сетевой группы на локальной машине в файле паролей ) = q vipw: rebuilding the database... vipw: done # passwd imostik Changing NIS password for imostik on localhost in domain freebsd.nis. New password: Retype new password: NIS password has been changed on localhost.
626 Глава 21. Информационная служба NIS ( установите пароли для всех пользователей } Затем, когда все пользователи созданы и имеют установленные пароли, можно приступить к созданию файла сетевых групп /var/yp/netgroup, из которого будут построены три файла карт NIS. Этот файл не создается по умолчанию, но поддерживается службой NIS и будет использоваться после перенастройки карт NIS, если утилита make найдет соответствующий файл при обновлении конфигурации. Создадим в любом редакторе файл следующего вида: ft more /var/yp/netgroup # описание департаментов и пользователей в них ITDEP (,adidok, freebsd.nis) (,adm,freebsd.nis) MANAGER (,ikonko,freebsd.nis) (,sbutusov,freebsd.nis) DEVELOPl (,smike, freebsd.nis) (,vhomchenko,freebsd.nis) DEVELOP2 (, yefetov, freebsd.nis) (,imestik,freebsd.nis) t включение пользователей департаментов в группы USERS ITDEP MANAGER DEVELOP1 DEVELOP2 RESTRICT ITDEP MANAGER (,smike,freebsd.nis) # создаем группу для некоторых компьютеров, # где необходимо создать особые правила доступа VIRTUAL ITDEP (,adm,tech.sup) # Что мы видим в этих файлах? В первую очередь — это четыре главные группы ITDEP, MANAGER, DEVELOP1 и DEVELOP2. В скобках перечислены пользователи, входящие в каждую из групп. Следует отметить, что, по возможности, не рекомендуется использовать пересекающиеся записи для пользователей, когда один из них одновременно входит в несколько групп, хотя все зависит от того, как вы захотите описать группы, и никаких ограничений практически нет. Рассмотрим значение каждого поля в скобках: Имя машины. Если не указано, то запись применяется ко всем машинам. Рекомендуется оставлять данное поле пустым во избежание путаницы. Имя пользователя. Имя пользователя, который присутствует в базе данных master .passwd или будет добавлен позже для определения принадлежности к сетевой группе. Домен NIS для учетной записи пользователя. Если есть несколько доменов NIS, то здесь можно указать, пользователям какого домена разрешено входить в систему. ВНИМАНИЕ! Не используйте имена сетевых групп длиннее 8 символов. Все имена чувствительны к регистру. Для сетевых групп используйте заглавные буквы, облегчающие чтение файла. Некоторые клиенты NIS не могут работать с сетевыми группами, включающими большое количество записей: В таком случае используйте подгруппы — определите несколько групп с ограниченным количеством пользователей и затем объедините эти группы в одну, например: GROUPl (,userl, domain) (,user2,domain) (, user3, domain) ... GROUP2 (,userll,domain) (,userl2, domain) (, userl3, domain) ... USERS GROUPl GROUP2 Описав все группы, необходимо обновить карты и выполнить синхронизацию со всеми вторичными серверами NIS:
Обеспечение безопасности NIS 627 # cd /var/yp # make NIS Map update started on среда, 20 апреля 2005 г. 02:56:15 (EEST) for domain freebsd.nis Updating netgroup.byhost... yppush: transfer of map netgroup.byhost to server virtual.altersys- ua.com failed yppush: status returned by ypxfr: Master's version not newer Pushed netgroup.byhost map. Updating netgroup.byuser... yppush: transfer of map netgroup.byuser to server virtual.altersys- ua.com failed yppush: status returned by ypxfr: Master's version not newer Pushed netgroup.byuser map. Updating netgroup... yppush: transfer of map netgroup to server virtual.altersys-ua.com failed yppush: status returned by ypxfr: Master's version not newer Pushed netgroup map. NIS Map update completed. # i В результате будет создано три новых файла карт в директории freebsd.nis: netgroup, netgroup.byhost и netgroup.byuser. He обращайте внимания на ошибки для основного сервера, а вот все вторичные серверы, скорее всего, откажутся синхронизировать новые карты с основного сервера. Это не большая проблема — для ее решения на всех вторичных серверах следует вручную запустить полное пересоздание базы данных с помощью ypinit: # ypinit -s virtual freebsd.nis Server Type: SLAVE Domain: freebsd.nis Master: virtual { ... >• Do you want this procedure to quit on non-fatal errors? [y/n: n] { - ) Can we destroy the existing /var/yp/freebsd.nis and its contents? [y/n: n] у There will be no further questions. The remainder of the procedure should take a few minutes, to copy the databases from virtual. Transfering netgroup... ypxfr: Exiting: Map successfully transferred Transfering netgroup.byuser... ypxfr: Exiting: Map successfully transferred Transfering netgroup.byhost... ypxfr: Exiting: Map successfully transferred Transfering master.passwd.byuid... ypxfr: Exiting: Map successfully transferred { - } localsrv.altersys-ua.com has been setup as an YP slave server without any errors. Don't forget to update map ypservers on virtual. # Теперь можно проверить доступность этих карт на клиентских машинах: mobilett ypcat netgroup (,smike,freebsd.nis) (,vhomchenko,freebsd.nis) ITDEP MANAGER (,smike,freebsd.nis) (,yefetov,freebsd.nis) (,imostik,freebsd.nis) ITDEP MANAGER DEVELOPl DEVEL0P2
628 Глава 21. Информационная служба NIS i, i копко,frcebsd.nis) (,sbutusov,freebsri.nis) (,adidok,freebsd.nis) (,adm,freebsd.nis) ITDEP (,adm,tech.sup) mobile# ypcaf. netgrcup. byhost mobile* ypcat netqroup.byuser USERS,DEVEL0P2 USERS,RESTRICT,DEVEL0P1 USERS,ITDEP,RESTRICT,VIRTUAL,VIRTUAL USERS,DEVEL0P1 USERS,DEVEL0P2 MANAGER,USERS,RESTRICT MANAGER,USERS,RESTRICT USERS,ITDEP,RESTRICT,VIRTUAL mobile# После этого можно приступать к настройке компьютеров. Это сделать довольно просто: необходимо запустить утилиту vipw и добавить одну-две строки в конец файла паролей. Для главного сервера virtual мы определили, что на него может входить только группа VIRTUAL, поэтому добавим в конец локального файла паролей следующие строки: +0VIRTUAL: :::::::: + : : : : : : : : :/sbiri/no login Первая строка позволяет импортировать все учетные записи, определенные в сетевой группе (и подгруппах) VIRTUAL. Заметьте, что ранее мы не устанавливали для пользователей в файле паролей какие-либо дополнительные свойства (комментарий, домашняя директория или оболочка по умолчанию), но теперь можно определить некоторые параметры, например, указать оболочку по умолчанию для всех пользователей NIS. Хотя, лучше предоставить пользователям самим решать, что использовать. Каким образом? Ответ на этот вопрос вы найдете в следующем разделе, посвященном использованию NIS совместно с NFS. Вторая строка позволяет импортировать все остальные учетные записи NIS, но запрещает их вход с локального компьютера. Присутствие этой строки не обязательно в системе, однако она позволяет избежать некоторые неприятных проблем. Рекомендуется импортировать все учетные записи NIS, оставляя в самом конце строку вида +:::::::::/sbin/nologin Она позволит импортировать все остальные учетные записи без права входа в систему. Без нее на локальной машине нельзя будет ссылаться на имена других пользователей NIS, поскольку система не будет знать об их существовании. Если на локальной машине или экспортируемой файловой системе присутствуют файлы, принадлежащие таким пользователям, то вы увидите только числовые идентификаторы вместо имен пользователей, которым они принадлежат. Будучи пользователем root, вы не сможете перейти в домашнюю директорию такого пользователя командой cd -username, равно как и искать файлы пользователя командой find . - user username -print. На машине localsrv (как и на всех остальных серверах, если они есть) добавим в конец файла паролей следующие строки: +0RESTR1CT: :::::::: +:::::::::/sbin/nologin
Использование NIS совместно с NFS 629 а на рабочей машине mobile: +0USERS::::::::: +:::::::::/sbin/nologin Теперь, при смене политики безопасности все изменения будут сводиться к корректировке одного файла на основном сервере. Только при полном изменении политики, возможно, придется повозиться с изменением файлов паролей на локальных компьютерах. Для того чтобы и это обойти, создавайте для каждой машины отдельную группу по имени компьютера в файле сетевых групп на основном сервере, определяя для каждой собственную политику безопасности. При этом на локальном компьютере в файл паролей следует добавить такие строки: +@{PC_NAME}::::::::: +: : : : : : : ::/sbin/no]ogin . где { PC_NAME} — сетевая группа с именем, совпадающим с именем машины, для которой она определена. Создание сетевых групп для каждой машины ■—не всегда хороший вариант, особенно, когда есть группа пользователей, пользующихся одной учетной записью на десятках машин (например, учебное заведение, где большинству студентов будет выдана одна, общедоступная на лабораторных машинах учетная запись student). ИСПОЛЬЗОВАНИЕ NIS СОВМЕСТНО С NFS После внедрения службы NIS обычно возникает проблема домашних директорий для пользователей. Причина в том, что пользователи импортируются и, вполне естественно, что для них нет созданных домашних директорий. Если же начать создавать эти директории для всех пользователей вручную, то это приведет к еще большим проблемам, чем в случае перечисления всех запрещенных пользователей в файле паролей. Опять таки, пропадает цель использования NIS как средства централизованного управления. Здесь на помощь приходит другая возможность системы FreeBSD, рассмотренная ранее: использование сетевой файловой системы NFS. Каким же именно способом настраивать клиентские компьютеры на использование NFS? Жестким определением монтирования ресурса при запуске системы в файле /etc/f stab (кстати, этот файл также можно распространять по NIS, но сами подумайте, к чему это может привести на машинах с различными разметками дисков, поэтому данный метод применим, в основном, только для бездисковых терминалов) или же использованием системы автоматического монтирования amd. Предположим, был предпочтен первый вариант, но тогда при каких-либо изменениях в расположении домашних директорий (например, в случае переноса NFS на другую машину) придется переписывать все точки монтирования в локальном файле /etc/f stab для всех компьютеров. А теперь предположим, что на некоторых машинах есть несколько локальных учетных записей, и уже присутствует точка монтирования /home... Потому, все же, рекомендуется использовать второй способ: применение amd. Его первое преимущество — это простота настройки клиентских машин (все что необходимо, — включить поддержку этой службы). Второе преимущество заключается в том, что при переносе сервера NFS на другой компьютер, достаточно только изменить домашнюю директорию в файле master. passwd на основном сервере и обновить карты NIS (если написать простой сценарий, то изменение файла из 1000 записей займет пару секунд).
Использование NIS совместно с NFS 631 = q Changing NIS information for adidok on localhost chpass: NIS information changed on host localhost, domain freebsd.nis virtual* Внесенные изменения будут сразу же применены в картах NIS на всех серверах! После возможной перезагрузки для запуска NFS-сервера или же после запуска необходимых процессов вручную пользователь adidok сможет получить доступ к своей домашней директории на любом компьютере: login as: adidok Password: Last login: Wed Apr 20 16:09:13 2005 Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 4.11-RELEASE (MOBILE) #7: Tue Apr 12 01:44:48 EEST 2005 %pwd /.amd_mnt/virtual/host/home/adidok %ls -1 total 0 -rw-r—r— 1 adidok wheel 0 20 anp 16:02 test % Хотелось бы упомянуть, что пользователь adidok, как и любой другой, может изменить некоторые свои настройки, например, сменить пароль (используя утилиту passwd), или же с помощью chpass указать предпочитаемый командный интерпретатор, свою фамилию, адрес и другую дополнительную информацию: %chpass ♦Changing NIS information for adidok. Shell: /bin/csh Full Name: Didok Olexander Office Location: Home "~ Office Phone: 8050-3815806 Home Phone: - Other information: :q Changing NIS information for adidok on virtual.altersys-ua.com Please enter password: chpass: NIS information changed on host virtual.altersys-ua.com %
632 Глава 22. Использование DHCP ГЛАВА 22. ИСПОЛЬЗОВАНИЕ DHCP Протокол DHCP (Dynamic Host Configuration Protocol — протокол динамической настройки хоста) предоставляет возможность выделения и динамического обновления IP- адресов, а также установки дополнительной сетевой информации такой, как адреса DNS-серверов, шлюза и т.п. До внедрения DHCP администратору приходится заниматься ручной настройкой всех машин для работы в сети (установка статического IP-адреса, маски подсети, сервер DNS и т.д.). Внесение изменений и их документирование занимает много времени, отбирает немало сил и приводит к возникновению ошибок. Чтобы избавиться от таких проблем и была разработана клиент-серверная система DHCP, которая обновляет всю сетевую информацию на сервере и автоматически распространяет ее по сети. В этой главе рассматриваются общие принципы функционирования протокола DHCP и его реализация в системе FreeBSD. Заметим, что система FreeBSD как со стороны клиента, так и со стороны сервера использует реализацию DHCP от ISC (Internet Systems Consortium). БЕГЛЫЙ ОБЗОР Протокол DCHP является стандартным протоколом Internet, предназначенным для выделения и распространения IP-адресов и другой сетевой информации, и прекрасно описан в RFC-2131 (для протокола IPv6— в RFC-3315). Клиент DHCP создает широковещательный UDP-запрос на порту с номером 68 к DHCP-серверу на получение IP-адреса и другой сетевой информации. Сервер, получив такой запрос, выделяет клиенту свободный адрес и вносит коррективы в свою таблицу, записывая информацию о клиенте и времени продолжительности использования адреса, а также удаляет этот адрес из списка доступных адресов. Данный процесс называется арендой адреса (lease). Время аренды адреса также передается клиенту. По окончании времени, на который был арендован адрес, клиент обязан обновить данную информацию или же запросить новый адрес. По окончанию времени аренды, если адрес не используется, сервер может записать его как свободный и выделить другому хосту. Используя такую схему, администратор может изменять любую сетевую информацию без доступа к клиентским машинам, а клиент получать ее при запросе на аренду адреса или при обновлении информации. Аренда адреса имеет значительные достоинства: экономия адресов — даже если компьютер будет отключен от сети по истечению некоторого времени, ранее выделенный ему адрес скоро окажется свободным; хранение информации об аренде адреса в локальной базе данных клиента позволяет ему даже при продолжительном отсутствии сервера DHCP пользоваться арендованным адресом (время истечения срока аренды адреса, как правило, намного больше времени обновления аренды). Опишем подробнее самые важные характеристики DHCP, описанные в стандарте: протокол DHPC позволяет администратору контролировать параметры своей сети;
Реализация DHCP в FreeBSD 633 клиентский компьютер всегда получит правильный IP-адрес и не будет конфликтовать с другими компьютерами, тем более серверами (что приводит к громаднейшим проблемам, вплоть до отказа в обслуживании); клиенты DHCP могут быть настроены динамически, то есть, администратору нет необходимости вносить изменения на каждой машине — для этого достаточно изменить настройку только на сервере DHCP; все проблемы в неправильной настройке также сводятся к исправлению на сервере; имеется возможность содержать несколько серверов DHCP, которые будут обслуживать одну и ту же сеть; серверы DHCP могут обслуживать несколько сетей, используя при этом агенты ретрансляции ВООТР; серверы DHCP содержат динамическую базу данных выделенных адресов — когда адрес не используется, он может быть удален из этой базы и выделен новому клиенту; клиент, который перезагрузился или был выключен некоторое короткое время, может далее использовать арендованный адрес так, как будто он не выключался. При всем этом содержать DHCP-сервер в небольшой одноранговой сети нет необходимости, однако при планировании установки большого количества клиентов и постоянном расширении сети необходимо заранее позаботиться о наличии DHCP-сервера и его должной настройке. Следует не забывать, что все ключевые серверы (DNS-сервер, шлюз и т.д.), в том числе и DHCP-сервер, должны иметь статические IP-адреса и маску подсети. РЕАЛИЗАЦИЯ DHCP В FREEBSD Система FreeBSD может работать как клиент, так и сервер DHCP. За клиентскую сторону отвечает программа dhclient, которая интегрирована в систему, а серверная доступна в виде порта, может быть установлена в любой момент из директории /usr/ ports/net/isc-dhcp3-server и представленадаемоном dchpd. На момент написания книги использовалась версия ISC DHCP 3, основными новшествами которой являются поддержка динамического обновления DNS-зон (в связке с BIND9) и возможность контроля доступа на уровне пула адресов. Другие новшества, отличные от предыдущей (второй) версии, не столь актуальны для большинства пользователей и подробнее о них можно узнать в файле описания порта /usr/ports/net/ isc-dhcp3-server/pkg-descr. Прежде чем настраивать FreeBSD на работу в качестве клиента или сервера DHCP, проверьте наличие поддержки ядром пакетного фильтра Berkeley Packet Filter (bpf). По умолчанию, стандартное ядро GENERIC поддерживает этот фильтр, потому, если вы используете именно им, ничего менять не придется. Если ядро пересобиралось, то поддержка bpf могла быть удалена из соображений безопасности. Для того чтобы проверить наличие устройства bpf в ядре, найдите следующую строку в файле текущего варианта ядра: device bpf # Berkeley packet filter Если строка отсутствует, добавьте ее, а затем пересоберите и установите новое ядро. ПРИМЕЧАНИЕ О безопасности при использовании строки device bpf в файле ядра было упомянуто неспроста. Это устройство позволяет работать не только DHCP, но также и программам-снифферам (анализаторы сетевых пакетов), хотя для этого потребуется привилегированный доступ root. Снифферы могут использоваться для перехвата передающихся по сети данных, в том числе и паролей, поэтому прежде, чем использовать DHCP, оцените его преимущества и риск, которому подвергается сеть.
634 Глава 22. Использование DHCP НАСТРОЙКА КЛИЕНТА DHCP Убедившись, что ядро поддерживает работу с устройством bpf, можно переходить к настройке самого клиента. Настройка клиента DHCP рассматривается прежде настройки сервера по той причине, что его поддержка реализована уже в только что установленной системе FrecBSD, а для настройки сервера DHCP необходимо прежде установить серверное приложение. К тому же в сети может уже присутствовать настроенный сервер DHCP на другой операционной системе, например Windows NT/2000/2003 Server. Файлы на стороне клиента DHCP Поддержка клиента DHCP включена в FreeBSD, начиная с версии 3.2 и, как упоминалось ранее, представлена программой dhclient. Рассмотрим все файлы, которые, так или иначе, принимают участие в работе клиента DHCP. Их список и детальное описание приведены в табл. 22.1. Таблица 22.1. Файлы на стороне клиента DHCP Файл или программа Описание /зЫп/dhclient Программа, которая позволяет настроить один или несколько интерфейсов с помощью протоколов DHCP или ВООТР, или же в случае неуспешного их использования — установить статически присвоенный адрес /etc/dhclient. conf dhclient для своей работы требует наличие данного конфигурационного файла. Как правило, он содержит только комментарии и не требует редактирования /sbin/dhclient-script Специальный сценарий настройки клиента DHCP. Как правило, в его модификации нет необходимости, поскольку это может привести к сбоям в работе DHCP. Полное описание этого файла можно найти на странице справочного руководства man dhcllent-script /var/db/dhclient. leases База данных выданных к использованию адресов, а также дополнительной сетевой информации Для настройки системы в качестве клиента DHCP используют два способа: с помощью программы sysinstall или же вручную. Использование sysinstall для включения DHCP Наверное, самый простой способ настройки клиента DHCP — во время установки FreeBSD, когда при настройке сетевого интерфейса отображаются вопросы об использовании IPv6 и DHCP (рис. 22.1). Если в ответ на второй вопрос ("Do you want to try DHCP configuration of the interface?") выбрать кнопку Yes, то утилита сама запустит программу dhclient, которая попытается автоматически определить и установить всю необходимую информацию для данного интерфейса от сервера DHCP (если таковой присутствует в сети). Если система уже установлена, то запустите утилиту sysinstall из директории /stand под пользователем root. Из главного меню перейдите в раздел Configure, а затем — в Networking. Выберите опцию Interfaces и затем в появившемся окне — интерфейс, который необходимо настроить. На вопрос о поддержке IPv6 ответьте No (если конечно вам не нужна поддержка IPv6 ©), а на вопрос об использовании DHCP, как было упомянуто ранее, — ответьте Yes (см. рис. 22.1). После этого, если был найден сервер DHCP, в появившемся окне сетевой конфигурации интерфейса будут автоматически заполнены некоторые поля (в зависимости от настроек на сервере DHCP). В качестве примера рассмотрим результат работы про-
Настройка клиента DHCP 635 граммы dhconf ig с использованием утилиты sysinstall для настройки сетевого интерфейса lncl, изображенный на рис. 22.2. If you ere using PPP over a serial device, as opposed to a direct ethemet connection, tben you «ay. first need to dfal gour Internet Service Provider lising the ppp utility ue provide for that purpose. If you're using SLIP over a serial device then the expectation is that you have a HARDWIRED connection. Vou can also install over a parallel port using a special "laplink" cab! Do you «ant to try DHCP configuration of the interface? ЯКШИ No r PPPtnterfece on device /dev/cunaB tCOMl) SLIP interface on device /dev/cuaal (COM2) PPP interface on device /dev/cuaal (COM2) Oance1 Рис. 22.1. Включение поддержки DHCP для сетевого интерфейса с помощью программы sysinstall. Network Cpni'igurat-Jon -ш Host: _ Donalri: .subnet.nain.con.ua| 1 subnet.nain.con.ua IPv4 Gateway; Nane server: 192.Щ8.8.1 ] J92.168.Bv2 ] Configuration for Interface lncl IPv4 Address: Neinask: 192.I68.B.S9 ] 255.255.B.8 1 Extra options to lfconfig (usually enpty): 1 OK ] JflNCEL | Рис. 22.2. Окно сетевой конфигурации интерфейса lncl после автоматической настройки с использованием протокола DHCP После этого, скорее всего, потребуется перезапуск системы. До перезапуска можете просмотреть всю информацию, полученную от сервера DHCP, в файле /var/db/ dhclient.leases: # more /var/db/dhclient.leases lease { interface "lncl"; fixed-address 192.168.0.99; option subnet-mask 255.255.0.0; option dhcp-lease-time 7200; option routers 192.168.0.1; option dhcp-message-type 5; option dhcp-server-identifier 192.168.0.200,- option domain-name-servers 192.168.0.2,192.168.0.1; option domain-name "subnet.main.com.ua";
636 Глава 22. Использование DHCP renew б 2005/7/2 18:15:32; rebir.d 6 20С5/7/2 19:08:19; expire 6 2005/7/2 19:23:19; I Как видно из примера, кроме информации, отображенной утилитой sysinstall, здесь присутствует информация о втором DNS-сервере, время аренды адреса и срок ее истечения. ВАЖНО! Каждый запуск программы sysinstall приводит к записи "мусора" в файл /etc/rc.conf. К "мусору" можно отнести как комментарии, так и повторяющиеся записи, вносящие полную неразбериху. Во избежание путаницы попытайтесь очень редко использовать данную утилиту, а если можно, то откажитесь от ее использования после установки системы навсегда. Ручная настройка клиента на использование DHCP Поддержку протокола DHCP для автоматической настройки интерфейса можно включить, изменив файл /etc/rc.conf. Если интерфейс был настроен на использование статического адреса, то закомментируйте или удалите строку инициализации интерфейса. Вместо нее добавьте строку следующего вида, изменив при этом 1пс0 на имя вашего сетевого устройства: ifconfig_lncO="DHCP" После этого потребуется перезапуск системы, в результате которого интерфейс будет настроен, используя данные, предоставленные сервером DHCP (если таковой будет найден в сети). В системе появится новый (если его не было до этого) файл /var/db/ dhclient. leases, предоставляющий исчерпывающую информацию об аренде адреса и полученных сетевых настройках: # more /var/db/dhclient.leases lease ( interface "IncO"; fixed-address 192.168.0.98; option subnet-mask 255.255.0.0; option dhcp-lease-time 604800; option routers 192.168.0.1; option dhcp-message-type 5; option dhcp-server-identifier 192.168.0.200; option domain-name-servers 192.168.0.2,192.168.0.1; option domain-name "subnet.main.com.ua"; renew 5 2005/7/8 17:26:21; rebind 1 2005/7/11 13:33:33; expire 2 2005/7/12 10:33:33; ) В случае использования PCMCIA-карты, использующей драйвер ed, проверьте дополнительный параметр, находящийся в файле /etc/defaults/rc. conf: pccard_ether_delay="5" Он позволяет установить паузу в секундах прежде запуска программы dhclient в файле /etc/pccard_ether. Данная установка позволяет обойти проблемы, к которым приводят некоторые карты, использующие драйвер ed. Как вы могли заметить, работа программы dhclient вызывает некоторую временную приостановку процесса загрузки системы. Если быстрая загрузка системы принци-
Настройка клиента DHCP 637 пиально важна, и нет никаких сетевых служб, которые требуют установленного адреса для своего запуска, то можно ускорить данный процесс, переведя запуск программы dhciient в фоновый режим. Для этого добавьте следующую строку в файл /etc/ re. conf (в системе FreeBSD 5.X): background_dhcl ient="YES" Возможно, по прошествии некоторого времени вы решите обновить программу dhciient в системе (например, используя порт /usr/ports/net/isc-dhcp3- client), и установите ее в другую директорию, отличную от стандартного пути. Для того чтобы указать системе, где искать программу dhciient, используйте следующую запись в файле /etc/rc. conf, изменив стандартный путь: dhclient_program="/sbin/dhclient" It для системы FreeBSD 5.X dhcp_program="/sbin/dhclient" # для системы FreeBSD 4.X Если необходимо изменить стандартное поведение программы dhciient, то это можно сделать с помощью флагов, указав их в /etc/rc. conf в следующей строке: dhciient_flags="" # для системы FreeBSD 5.X dhcp_flags="" # для системы FreeBSD 4.X Подробнее речь об этом пойдет в следующем разделе (см. табл. 22.2). Программа dhciient Если в системе есть хотя бы один сетевой интерфейс, конфигурируемый с использованием DHCP, то при запуске FreeBSD будет запущена программа dhciient, считывающая содержимое файла /etc/dhclient .conf для получения инструкций относительно настройки. Затем она принимает список всех сетевых интерфейсов, требующих настройки, и пытается сконфигурировать их, используя данные с сервера DHCP. Для того чтобы хранить информацию о настройках, полученных от сервера DHCP, не запрашивая ее по-новому всякий раз при перезагрузке системы, dhciient сохраняет всю необходимую сетевую информацию относительно каждого интерфейса в файле dhciient. leases. Этот файл просматривается сразу же после считывания конфигурационного файла dhciient. conf. Если в системе присутствует несколько интерфейсов, и несколько из них настроены на использование протокола DHCP, то для каждого будет присутствовать запись в файле dhciient. leases. Более того, в данном файле может храниться несколько записей для одного интерфейса, при этом использоваться будет последний из них. Для того чтобы данный файл не разрастался, dhciient периодически создает новый файл dhciient. leases, переименовывая старый файл в dhciient. leases- до следующей перезаписи базы данных аренды. Устаревший файл будет присутствовать в системе и использоваться в том случае, если при попытке обновления или проверки аренды окажется недоступным сервер DHCP. В таком случае будут использоваться те записи аренды адресов из старого файла, которые не устарели. Но перейдем к рассмотрению опций программы. Как упоминалось ранее, в файле /etc/rc. conf можно переопределить стандартное поведение программы dhciient. Наиболее часто используемые опции (и их описание) представлены в табл. 22.2. Таблица 22.2. Наиболее часто используемые опции программы dhciient Опция Описание -р <port> Если необходимо, чтобы программа dhciient использовалась для прослушивания и передачи через другой порт, отличный от стандартного 68, то это достигается при помощи флага -р, за которым следует поместить номер требуемого порта. Данная опция, как правило, используется только в целях тестирования
638 Глава 22. Использование DHCP Таблица 22.2. Окончание Опция Описание -q В нормальном режиме программа dhclient выводит стартовые сообщения и информацию о процессе инициализации протокола на вход стандартного Дескриптора ошибок до получения адреса, а затем — только журнальные сообщения, используя настройки syslog. Данная опция позволяет выводить только сообщения об ошибках -v В отличие от предыдущей, данная опция позволяет включить вывод всех без исключения сообщений (даже версию программы и адрес сайта разработчика ©) -1 Если указана эта опция, то программа dhclient предпримет только одну попытку аренды адреса. В случае неуспеха, программа прерывает работу с кодом ошибки 2 -cf <filename> Данная опция позволяет задать другой путь к конфигурационному файлу (отличный от стандартного файла /etc/dhclient .conf). Не забывайте указывать полный путь -If <filename> Как упоминалось ранее, по умолчанию программа dhclient ищет информацию об арендованных адресах в файле /var/db/ dhclient. leases. Используя данную опцию, можно изменить расположение этого файла. При этом не следует забывать указывать полный путь относительно директории root -pf <fiiename> Эта опция используется, если требуется изменить стандартный путь размещения файла идентификатора процесса (/var/run/ dhclient .pid). <f ilename> — полный путь к файлу относительно директории . / Таким образом, для того чтобы программа dhclient выводила все без исключения сообщения и использовала конфигурационный файл, расположенный по пути /usr/local/etc/dhclient. conf, в файл /etc/rc.conf необходимо добавить строку следующего вида (пример для FreeBSD 5.X): dhclient_flags="-v -cf /usr/local/etc/dhclient.conf" В случае использования FreeBSD 4.X, вместо dhclient_flags используйте dhcp_flags. Более подробная информация о программе dhclient и ее опциях содержится в справочном руководстве man dhcl ient. Конфигурационный файл /etc/dhclient. conf Ранее уже упоминалось о наличии обязательного конфигурационного файла dhclient. conf, который, к тому же, по умолчанию содержит только комментарии. Данный файл позволяет коренным образом изменять поведение программы dhclient, хотя, как правило, изменять ее поведение — не самое лучшее решение. Тем не менее, некоторые полезные опции, которые можно задавать в этом файле, мы все же рассмотрим. Заметим, что все ключи в файле /etc/dhclient. conf не чувствительны к регистру символов. Итак, файл /etc/dhclient. conf содержит всю информацию, необходимую для правильной работы программы dhclient до того как будет настроен интерфейс. Это и время ожидания обнаружения сервера, и информация, требуемая от сервера, и информация для сервера, а также список значений по умолчанию, которые будет применены в условиях недоступности или отсутствия сервера DHCP. Если планируется использовать DHCP-сервер, но в данный момент он не настроен, то можно установить значения
Настройка клиента DHCP 639 по умолчанию и разрешить использование DHCP для интерфейса. Как только клиент обнаружит в сети сервер DHCP, то будет использовать уже его настройки. Настройка времени ожидания Настройки, имеющие отношение к интервалам времени, должны быть определены со стороны клиента. Если клиент не предоставляет никаких настроек, то будут использоваться настройки, принятые по умолчанию. Оператор timeout Синтаксис: timeout time; Данный оператор позволяет задать время в секундах, в течение которых программа dhclient ожидает ответ при попытке связаться с сервером прежде, чем сочтет его недоступным. По умолчанию, время ожидания составляет 60 секунд. При неудачной попытке связи по истечению данного времени программа dhclient попытается найти не просроченную запись аренды в конфигурационном файле dhclient. conf или же в базе данных аренд dhclient. leases и использовать ее при дальнейших попытках найти сервер. Если в упомянутых файлах не будет найдено ни одной действующей аренды, то будет перезапущен процесс инициализации протокола по истечению времени, указанного с помощью оператора retry. Оператор retry Синтаксис: retry time; Данный оператор позволяет задать время, по истечении которого после определения отсутствия в сети сервера DHCP программа dhclient повторно попытается найти и соединиться с сервером DHCP. По умолчанию, значение этого оператора равно пяти минутам. Оператор select-timeout Синтаксис: select-timeout time; Иногда бывает так, что в сети присутствует более одного сервера DHCP, обслуживающих данную сеть. В данном случае клиент может запросить и получить несколько предложений на аренду адреса и выбрать более предпочтительный для себя. Первый вариант не всегда может оказаться подходящим. Например, если один из серверов предложит использовать тот адрес, который имеет в данный момент клиент, то последний, скорее всего, его и выберет. Оператор select-timeout позволяет задать время ожидания ответа от остальных серверов. Если в заданный период времени ответов не поступит, то будет выбрано первое (и единственное) значение. По умолчанию, данный оператор устанавливает время ожидания, равное нулю, и, таким образом, будет использован первый же полученный ответ. Оператор reboot Синтаксис: reboot time; Во время перезапуска системы программа dhclient пытается получить тот же IP- адрес, который использовался в прошлый раз. Такое состояние называется "INIT- REBOOT". Оператор reboot устанавливает время, предоставляемое программе для попытки получить старый адрес, прежде чем понять, что это невозможно, и согласиться с новым выделенным адресом. По умолчанию, время ожидания составляет десять секунд. Оператор initial-interval Синтаксис: Initial-interval time;
640 Глава 22. Использование DHCP Данный оператор устанавливает время между первой и второй попыткой найти сервер. Каждый раз при отправке сообщения интервал увеличивается удвоением значения текущего времени, умноженного на случайное число из диапазона от нуля до единицы. Начальное значение этого интервала, по умолчанию, составляет десять секунд. Настройка "пожеланий" и требований Протокол DHCP позволяет стороне клиента запрашивать у сервера специфическую информацию и указывать, какую информацию он не желает получать. В том числе, протокол позволяет отклонить предложение от сервера, если оно не соответствует "пожеланиям" и требованиям клиентской стороны или неполноценно. Оператор request Синтаксис: request [ option ] [, ... option ] ; Оператор request позволяет клиентской стороне послать запрос для получения от серверов интересующей информации. При этом в качестве значений разрешается перечислять только имена опций из списка разрешенных (man dhcp-options) без указания их параметров. По умолчанию, запрашивается информация о маске подсети, о широковещательном адресе, о времени offset, о маршрутизаторах, а также об именах доменов, серверов имен и компьютеров. Иногда клиенту предпочтительнее отправить пустой список — в этом случае можно просто указать в конфигурационном файле dhclient. conf оператор request без параметров (опций): request; Оператор require Синтаксис: require [ option ] [, ... option ] ; Данный оператор позволяет клиенту составить и отправить список требуемой информации для того, чтобы он мог принять предложение сервера. Если востребованная клиентом информация не будет предоставлена, клиент будет игнорировать предложение сервера. Модификаторы опций В некоторых случаях клиент может получить данные от сервера, которые ему не подходят, или же в том случае, когда нет требуемой информации. Иногда информация, полученная от сервера, важна, но может использоваться только с добавлением некоторой локальной информации. Для таких целей были введены модификаторы опций. Оператор default Синтаксис: default [ option declaration ] ; Если клиент использует данные, полученные от сервера, но требуются также и другие важные для его работы данные, то они могут быть определены с помощью оператора default. Оператор supersede Синтаксис: supersede [ option declaration ] ; В некоторых случаях требуется "подавить" отдельные данные, полученные от сервера DHCP. Оператор supersede позволяет клиенту определить те данные, полученные (или не полученные) от сервера, которые будут в любом случае отклонены и заменены локальными определениями.
Настройка клиента DHCP 641 Оператор prepend Синтаксис: prepend [ option declaration ] ; Значения опций, определенные данным оператором, будут добавлены в начало тех данных, которые предоставит сервер. Заметим, что оператор prepend может использоваться для определения тех опций, которые могут принимать несколько значений (например, список серверов имен). Оператор append Синтаксис: append [ option declaration ] ; Этот оператор служит той же цели, что и оператор prepend, но, в отличие от него, добавляет свои данные не в начало данных, полученных от сервера, а в конец. Описание аренды Оператор lease Синтаксис: lease { lease-declaration [ ... lease-declaration ] ) По истечению некоторого времени, в течение которого клиент DHCP пытается найти сервер, он может принять решение, что все попытки тщетны и найти сервер не удастся. В данном случае он ищет в своей базе данных записи старых аренд и пытается протестировать каждую из них, "пингуя" маршрутизаторы, указанные для аренды (определяя, таким образом, действительность аренды). Оператор lease позволяет определить в конфигурационном файле одну или несколько фиксированных записей аренды для сети, в которой отсутствует сервер DHCP или ВООТР, таким образом как бы эмулируя их наличие. Запись оператора lease практически аналогична подобной записи в файле dhclient. leases для компьютера, в сети которого присутствует сервер DHCP. Перечислим разрешенные декларации: bootp; # предпочтительней использовать сервер ВООТР interface "string"; # имя интерфейса; не обязательное fixed-address ip-address; # установленный адрес; обязательное поле filename "string"; # загрузочный файл server-name "string"; # имя загрузочного сервера option option-declaration; # смотрите man dhcp-options • script "script-name"; # загрузочный сценарий (man dhclient-script) vendor option space "name"; medium "media setup"; renew date; # время обновления аренды rebind date; # время получения новой аренды expire date; it время окончания использования аренды,- требуется новая # формат date: <weekday> <year>/<month>/<day> <hour>:<minute>:<second> Описание псевдонима Оператор alias Синтаксис: alias ( declarations ... } В некоторых случаях клиенту DHCP требуется в дополнение к арендованному адресу на интерфейсе некоторого постоянного адреса. Программа dhclient и реализация DHCP от ISC не поддерживает непосредственную установку дополнительного фиксированного адреса на интерфейс. Для решения этой проблемы на стороне клиента была введена возможность установки IP-псевдонима со статическим адресом.
642 Глава 22. Использование DHCP Объявление псевдонима очень похоже на описание аренды, за исключением того, что объявление опций ограничено использованием только одной опции: subnet-mask. Кроме того, игнорируются объявления истечения срока действия адреса. Как правило, оператор alias содержит декларации относительно имени интерфейса и фиксированного адреса, а также опцию установки маски подсети. Другие операторы Оператор reject Синтаксис: reject ip-address; Данный оператор позволяет клиенту DHCP отбрасывать любые варианты предложений от сервера с указанным IP-адресом. Такая возможность, в основном, используется в случаях, когда необходимо избежать настройки со стороны нерабочего или неконтролируемого DHCP-сервера. Оператор interface Синтаксис: interface "name" { declarations ... } Клиенту может понадобиться настраивать свои интерфейсы по-разному в зависимости от имени интерфейса. В списке деклараций оператора interface могут использоваться любые операторы, исключая lease и alias, в результате чего каждый интерфейс будет настраиваться по-своему. Для интерфейсов, которые не будут описаны отдельно с использованием данного оператора, будут применены установки по умолчанию или те, которые были определены в конфигурационном файле за пределами описания интерфейсов. В принципе, существует еще несколько операторов, используемых в конфигурационном файле, которые меняют поведение программы dhclient, однако мы их рассматривать не будем. За более подробной информацией обращайтесь к справочному руководству man dhclient.confи man dhcp-options. В листинге22.1 представлен пример конфигурационного файла dhclient .conf, в котором учтено большинство описанных выше возможностей и операторов. Листинг 22.1. Пример конфигурационного файла /etc/dhclitvt. conf # $FreeBSD: src/etc/dhclient.conf,v 1.3 2001/10/27 03:14:37 rwatson Exp $ # # In most cases an empty file is sufficient for most people as the # defaults are usually fine. # timeout 20; retry 20; reboot 5; select-timeout 3; initial-interval 5; reject 192.168.34.12; # ??? :) interface "epO" ( supersede domain-name "main.com.ua"; prepend domain-name-servers 127.0.0.1; request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, host-name; require subnet-mask, domain-name-servers, routers; script "/sbin/dhclient-script"; media "media lObaseT/UTP", "media 10base2/BNC";
Настройка сервера DHCP 643 Листинг 22.1. Окончание lease ( interface "epO"; fixed-address 192.168.0.20; option subnet-mask 255.255.0.0; option dhcp-lease-time 608400; option routers 192.168.0.1; option domain-name-servers 192.168.0.2,192.168.0.1; option domain-name "main.com.ua"; renew 2 2015/12/01 00:00:00; rebind 2 2015/12/01 00:01:00; expire 2 2015/12/01 00:02:00; ) alias ( interface "epO"; fixed-address 192.168.0.200; option subnet-mask 255.255.255.255; } НАСТРОЙКА СЕРВЕРА DHCP Теперь можно перейти к описанию настройки сервера DHCP. Как упоминалось ранее, в качестве DHCP-сервера принято использовать реализацию пакета DHCP от компании ISC. В принципе, никто не мешает использовать другую реализацию, например WIDE, которую можно найти в наборе портов в директории /usr/ports/net-mgmt/wide- dhcp. Заметим, что последний вариант может выступать как в роли сервера, так и в роли клиента DHCP. В этой главе будет рассмотрена только реализация компании 1SC. Установка и подготовка к использованию Перед установкой пакета убедитесь в том, что ядро поддерживает фильтр пакетов Беркли (устройство bpf). Для установки лучше всего использовать набор портов. Всё что необходимо,— это выполнить следующую команду, находясь в директории /usr/ports/net/isc-dhcp3-server: # make config install clean В результате программа установки задаст вопрос о включении некоторых возможностей при сборке пакета (рис. 22.3), зафузит файл с исходными текстами, произведет компиляцию и установит пакет в системе. После установки пакета в системе появится несколько новых исполняемых файлов и файлов настройки. В зависимости от выбранных опций, до сборки пакета могут быть внесены также некоторые изменения в присутствующие файлы. Так, например, при выборе опции DHCP_PARANOIA в систему будут добавлены пользователь dhcpd и, соответственно,— группа dhcpd для возможности работы сервера DHCP в среде chroot. В директории /usr/local/etc будет создан пример конфигурационного файла dhcpd. conf. sample, который можно переименовать (скопировать) и использовать для настройки сервера в файл dhcpd. conf (формат данного файла и настройка сервера DHCP будет описана немного позже): # ср /usr/local/etc/dhcpd.conf.sample /usr/local/etc/dhcpd.conf
644 Глава 22. Использование DHCP Options for isc-dhcp3-server Э.0.2_8 QXE ЖЙЖШЯШЕ = dd -user --roui and -chroot oition IX] add -chroot and -jail options til. add experimental LDflP backend support Ш '* support LDflP connection over SSL/TLS [XI use the base system OpenSSL (required by TLS) [ 1 use OpenSSL from ports (required by TLS) I 1 DHCPLEflSEQUERV support used by Cisco uBR's Cancel Рис. 22.3. Выбор поддерживаемых возможностей при установке пакета ISC DHCP Server 3 Для запуска сервера в директории ./usr/local/etc/red/ будет создан сценарий isc-dhcpd.sh, который уже является запускаемым и не требует изменения прав или переименования: # /usr/local/etc/re.d/isc-dhepd.sh Usage: /usr/local/etc/rc.d/isc-dhcpd.sh [fast|force lone)(start stop 4>restart rcvar install uninstall status poll) Однако, для того чтобы его можно было использовать, необходимо выполнить два условия: создать конфигурационный файл /usr/local/etc/dhcpd.conf (как описано ранее или вручную), а также внести изменения в главный конфигурационный файл системы /etc/rc. conf. Заметим, что имеется огромный список строк, которые можно вносить в конфигурационный файл /etc/rc.conf, изменяя тем самым поведение или возможности сервера DHCP: # включить возможность запуска сервера DHCP # данная опция обязательна для работы стартового сценария is.c-dhcpd.sh dhcpd_enable="YES" # устанавить. опции для даемона dhcpd при запуске; смотрите man dhcpd dhcpd_flags="-q" # путь к конфигурационному файлу сервера DHCP dhcpd_conf="/usr/local/etc/dhcpd.conf" # список сетевых интерфейсов, к которым будет привязан сервер # таким образом, можно разрешить аренду адресов в какой-то одной сети dhcpd_ifaces="" Если была включена возможность запуска даемона dhcpd в среде chroot, то будет поддерживаться также следующий список определений в файле /etc/rc. conf: # псевдопользователь, для запуска среды chroot dhcpd_withuser="dhcpd" # группа пользователя, для запуска среды chroot dhcpd_withgroup="dhcpd" # запускать dhcpd в среде chroot dhepdeh root_enable="YES" # использовать devfs при создании chroot-среды (FreeBSD 5.X) tt файлы устройств будут созданы в директории <chrootdir>/dev
Настройка сервера DHCP 645 dhcpddevfs enable-"YES" # использовать сценарий MAKEDEV (FreeBSD 4.X) dhcpd_ma kedev_enable="YE S" It директория, которая будет установлена как корнеиая в среде chroot. dhcpdrootdi r="/var/db/dhcpd" Заметим, что подготавливать среду chroot нет необходимости. Программа сама позаботится о создании всех необходимых директорий и файлов. Важно запомнить, что, несмотря на то, что в среде chroot будет создан свой конфигурационный файл <chrootdir>/usr/local/etc/dhcpd. conf, его изменение не будет учтено при перезапуске даемоиа сервера DHCP. Данный файл создается всякий раз заново при запуске dhcpd. conf в среде chroot копированием конфигурационного файла, расположенного в директории /usr/local/etc, поэтому всегда вносите изменения только в файл /usr/local/etc/dhcpd.conf. Файлы на стороне сервера DHCP Рассмотрим список файлов, которые принимают участие в работе сервера DHCP и влияют на его поведение. Их список и детальное описание представлены в табл. 22.3. Таблица 22.3. Список программ и файлов на стороне сервера DHCP Имя файла Описание /usr/local/sbin/dhcpd Исполняемый файл на стороне сервера DHCP. Смотрите страницу справочного руководства man dhcpd /usr/local/etc/dhcpd.conf Как упоминалось ранее, даемон dhcpd требует наличия конфигурационного файла до того как будет впервые запущен. В данном файле содержится вся информация о настройке клиентов и самого сервера. Он подробно описан на страницах справочной системы man dhcpd. conf /var/db/dhepd. leases Подобно клиенту, сервер DHCP также ведет базу данных всей выданной информации в виде журнала. Подробное описание ищите на страницах справочного руководства man dhcpd,leases /sbin/omshell Командный интерфейс ОМАР1. Данное приложение позволяет вносить изменения в работу сервера DHCP, когда он находится в рабочем состоянии без последующей перезагрузки /usr/local/sbin/dhcrelay Иногда DHCP-серверу бывает необходимо пересылать запросы от клиентов другому серверу в другой сети. Для такой возможности требуется дополнительно установить пакет dhcrelay из директории /usr/ports/net/isc- dhcp3-relay Даемон dhcpd На стороне сервера главным исполняемым файлом является dhcpd. Этот файл практически полностью отвечает за работу сервера DHCP. Заметим, что, как и любой другой сервер, присутствие которого требуется постоянно, сервер DHCP реализован в виде даемона. Во время запуска dhcpd считывает содержимое файла dhcpd. conf и заносит в память список доступных адресов для каждой подсети. Как только приходит запрос со стороны клиента, dhcpd выделяет для него адрес (аренда адреса), срок которого истекает через некоторое определенное время, установленное администратором. Клиент обязан обновить аренду до того, как истечет срок ее использования, чтобы иметь возможность и дальше обращаться по выделенному адресу. Если клиент не запросит обновления аренды до истечения срока действия, то в дальнейшем не сможет пользоваться адресом и потребуется запрос на новую аренду.
646 Глава 22. Использование DHCP Подобно тому как клиентская сторона хранит записи об аренде в файле на случай перезагрузки системы, сервер dhcpd хранит список всех аренд в файле dhcpd. leases. Прежде чем выдать информацию об аренде клиенту, dhcpd заносит изменения в базу данных аренд и только затем передает ее на сторону клиента. Это гарантирует, что при сбое системы информация о последних выданных адресах сохранится. Файл аренд счи- тывается в память всякий раз при загрузке даемона dhcpd после конфигурационного файла. Сервер DHCP следит за тем, чтобы файл аренд не разрастался (смотрите соответствующее описание в разделе, посвященном работе утилиты dhclient). Рассмотрим опции программы dhcpd, которые можно использовать в файле /etc/ rc.conf для изменения ее поведения. Наиболее часто используемые опции представлены в табл. 22.4. Таблица 22.4. Наиболее часто используемые опции программы dhcpd Опция Описание -р <рогс> Если необходимо использовать для прослушивания и передачи порт, отличный от стандартного порта с номером 67, используйте флаг -р, после которого следует указать Номер используемого UOP-порта, Данная опция применяется в целях отладки -q Эта опция позволяет подавлять вывод информационных сообщений (версия программы и т.п.) во время запуска даемона dhcpd -t Данная опция позволяет просто синтаксически протестировать конфигурационный файл, без проведения каких-либо сетевых операций. Используется для тестирования измененного конфигурационного файла на синтаксическую корректность прежде его использования. Внимание] Не используйте опцию -г. в списке флагов в файле /etc/rc.conf -cf <f ilename> Эта опция позволяет задать другой путь к конфигурационному файлу, отличный от стандартного пути /usr/local/etc/dhcpd. conf -If <filename> Используя данную опцию, можно изменить расположение файла базы данных аренд Конфигурационный файл dhcpd. conf Конфигурационный файл dhcpd. conf имеет свободный текстовый формат, при этом ключевые слова не зависят от регистра символов. Комментарии начинаются с символа "*" и могут находиться в любом месте файла. Комментарий продолжается до окончания строки. Файл dhcpd. conf. по существу, состоит из утверждений. При этом существует два типа утверждений: параметры и объявления. Параметры описывают, как выполнить какую-либо операцию, или указывают, какие параметры необходимы клиенту. Объявления описывают топологию сети, клиентов сети, адреса, а также группируют параметры. В группе параметров и объявлений все параметры, необходимые для других объявлений, должны быть описаны раньше. Объявления могут быть вложенными в другие объявления. Все параметры, а также некоторые простые объявления должны завершаться точкой с запятой ";". Объявления, которые предполагают наличие вложенной структуры, заключают последнюю в фигурные скобки {} и не имеют завершающей точки с запятой. Существует два типа объявлений описывающих сетевую топологию: shared-network и subnet. Если клиенты в subnet должны получать адреса динамически, то должно присутствовать объявление range. Если же клиенты должны получать постоянные адреса, то для них должны быть созданы объявления host. Для каждой подсети, к которой подключён сервер DHCP, должно присутствовать отдельное объявление подсети subnet. В тех случаях, когда различные подсети подключены к одному физическому интерфей-
Настройка сервера DHCP 647 су, объявления таких подсетей должны быть помещены внутрь объявления shared- network. Более подробное варианты использования различных объявлений и их вложений описаны в справочном руководстве по конфигурационному файлу (man dhcpd. conf). Описание глобальных параметров Рассмотрим пример создания файла конфигурации сервера DHCP. В первую очередь, необходимо позаботиться об описании глобальных параметров. Добавим следующие строки в файл dhcpd. conf: # GLOBAL option domain-name "maih.com.ua"; option domain-name-servers 192.168.0.2, 192.168.0.1; option subnet-mask 255.255.255.0; Первая строка — комментарий. За ней следует строка описания параметра domain-name. Он позволяет задать домен, который будет выдаваться клиентам в качестве домена, используемого по умолчанию при поиске. Обратите внимание на то, что файл /etc/resolv.conf будет переписан у клиента! В нем появится строка: search main.com.ua Третья строка, содержащая описание параметра domain-name-servers, позволяет задать список серверов DNS по их именам или IP-адресам. Заметим, что элементы списка разделяются запятыми. Использование параметра domain-name без domain- name-servers практически лишено смысла. Подобно тому как предыдущий параметр вносил коррективы в файл /etc/resolv.conf, этот параметр добавит две (в данном конкретном случае) строки следующего вида: nameserver 192.168.0.2 nameserver 192.168.0.1 Следующий параметр subnet-mas к, как и предполагается, позволяет указать маску сети, которая будет выдаваться клиентам вместе с IP-адресом (если данное значение не будет определено иным в блоке описания подсети). default-lease-time 7200; max-lease-time 86000; authoritative; ddn3-update-atyle none; Первые два параметра из этого примера уже были рассмотрены при настройке клиента, потому подробно на них останавливаться не будем. Напомним лишь, что параметр def ault-lease-time позволяет установить время жизни аренды адреса (в случае, если клиент не запросил свои параметры), a max-lease-time— максимальное время использования арендованного адреса до истечения срока действия. Следующий параметр — authoritative — очень важен, и должен использоваться, если сервер является официальным DHCP-сервером в сети. Параметр ddns- update-style будет подробно описан в следующей главе при рассмотрении динамического DNS (DDNS). Скажем только, что если поддержка динамического DNS вам не нужна, данный параметр должен принимать значение попе. Другие варианты значений: ad-hoc (игнорируется) и interim (позволяет DNS-серверу узнавать соответствие IP- адреса и имени хоста). Ведение отдельного журнала событий Данный вопрос вынесен в отдельный пункт не зря. Это связано, по большей части, с тем. что, кроме изменения конфигурационного файла сервера DHCP, необходимо внести некоторые изменения в систему.
648 Глава 22. Использование DHCP Все сообщения от даемона dhcpd попадают в стандартный журнальный файл. Если необходимо вести отдельный журнальный файл для сервера DHCP, в первую очередь внесите следующую строку в конфигурационный файл dhcpd. conf: log-facility 1оса17; После этого создайте файл, в котором будет храниться вся log-информация. Например, для ведения файла с именем dhcpd. log в стандартной системной директории для хранения подобной информации (/var/log/) используйте следующую команду: # touch /var/log/dhcpd.log Следующим шагом является внесение изменений в работу утилиты syslog. Как мы помним, данная системная утилита позволяет перехватывать сообщения событий различных программ из потока и записывать в некий файл. Вся конфигурационная информация хранится в файле /etc/syslog. conf. С учетом ранее созданного log-файла и информации, внесенной в конфигурационный файл сервера DHCP, добавим в начало файла syslog. conf следующую строку, после чего сохраним файл: 1оса17.* /var/log/dhcpd.conf Как мы помним, существует средство для ведения восьми отдельных пользовательских журнальных файлов для приложений: от localO до 1оса17. Можно использовать эту возможность для своих приложений (если это поддерживает само приложение) — в том числе и для даемона dhcpd. В данном случае мы определили, что в файле конфигурации сервера (dhcpd. conf) будет использоваться 1оса17, а в конфигурации syslog будут перехватываться все сообщения от сервера DHCP и записываться в файл /var/log/dhcpd.log. После внесения всех изменений необходимо перезапустить систему или же службы syslogd и dhcpd. При этом службе syslogd достаточно просто отправить сигнал HUP (перечитать конфигурацию): # killall -HUP syslogd Сервер DHCP потребует полной перезагрузки, поскольку для него не достаточно просто заново считать конфигурационный файл: # /usr/local/etc/rc.d/isc-dhcpd.sh restart Теперь можно удостовериться, что все отлично работает, просмотрев содержимое журнального файла: # more /var/log/dhcpd.log Jul 11 13:32:14 mobile dhcpd: Internet Systems Consortium DHCP Server 4>V3.0.2 Jul 11 13:32:14 mobile dhcpd: Copyright 2004 Internet Systems •^Consortium. Jul 11 13:32:14 mobile dhcpd: All rights reserved. Jul 11 13:32:14 mobile dhcpd: For info, please visit 4>http://www.isc.org/sw/dhcp/ Jul 11 13:32:14 mobile dhcpd: Wrote 0 deleted host decls to leases 4>file. Jul 11 13:32:14 mobile dhcpd: Wrote 0 new dynamic host decls to leases «bfile. Jul 11 13:32:14 mobile dhcpd: Wrote 0 leases to leases file. Jul 11 13:32:14 mobile dhcpd: Listening on 4>BPF/ep0/00:01:03:82:5c:41/192.168. 0/16 Jul 11 13:32:14 mobile dhcpd: Sending on 4>BPF/ep0/00:01:03:82:5c:41/192.168.0/16
Настройка сервера DHCP 649 Jul 11 13:32:14 mobile dhcpd: Sending on Socket/fallback/fallback- 4>net Описание подсетей Сервер DHCP должен знать всю информацию о подсетях, в которых он будет функционировать, и отвечать за динамическое выделение адресов. К тому же, потребуется описание пула адресов, доступных для аренды, поскольку в сети могут находиться машины со статическими адресами. Приведем простейший пример объявления подсети: # LOCAL SUBNET subnet 192.168.0.0 netmask 255.255.0.0 { range 192.168.0.10 192.168.0.99; option routers 192.166.0.1; default-lease-time 86000; max-lease-time 604 800; } В данном случае выполняется описание подсети 192.168.0.0. Параметр range задает список адресов, доступных для выделения. Параметр routers позволяет установить всем клиентам DHCP в данной подсети список шлюзов (по IP-адресу или имени, разделенных запятыми). Два последних параметра позволяют установить значения времени аренды и максимального времени использования аренды (отличные от глобальных установок). Данный пример довольно прост. На практике, как правило, используются гораздо более сложные объявления для подсетей. Приведем пример, взятый из конфигурационного sample-файла: class "foo" { match if substring (option vendor-class-identifier, 0, 4) = "SUNW"; ) shared-network 224-29 { subnet 10.17.224.0 netmask 255.255.255.0 { option routers rtr-224.example.org; } subnet 10.0.29.0 netmask 255.255.255.0 { option routers rtr-29.example.org; } pool { allow members of "foo"; range 10.17.224.10 10.17.224.250; } pool { deny members of "foo"; range 10.0.29.10 10.0.29.230; 1 } В данном случае сначала определяется класс клиентов "foo" и затем на основе данного класса описывается, каким образом и из какой подсети клиенты будут получать адреса и другие сетевые параметры. Таким образом, клиенты, входящие в класс "foo", будут иметь адреса из подсети 10.17.224/24, а все остальные — из подсети 10.17.29/24. Описание отдельных хостов Сервер DHCP может выдавать постоянные IP-адреса для строго определенных машин без истечения срока аренды. Такое решение применяется в случае загрузки бездис-
650 Глава 22. Использование DHCP ковых терминалов с использованием ВООТР или DHCP. Для описания машин с фиксированным адресом используется объявление host: host chief ( hardware ethernet 0 : Ос:29:c8:0a:ee; fixed-address 192.168.0.100; server-name "mobile.altersys-ua.com"; } В данном случае сервер DHCP распознает компьютер по МАС-адресу сетевой карты, указанному в параметре hardware ethernet. Параметр fixed-address определяет выдачу постоянного адреса (может использоваться имя). В листинге 22.2 показан пример простого конфигурационного файла dhcpd. conf, сформированного на основании рассмотренных выше возможностей. Листинг 22.2. Пример простого KW^ur^^^^m^^^^fSH^^ii^g-, ", ■; ['. .: # GLOBAL option domain-name "main.com.ua"; option domain-name-servers 192.168.0.2, 192.168.0.1; option subnet-mask 255.255.255.0; default-lease-time 7200; max-lease-time 86000; authoritative; ddns-update-style none; log-facility local7; # LOCAL SUBNET subnet 192.168.0.0 netmaak 255.255.0.0 ( range 192.168.0.10 192.168.0.99; option routers 192.168.0.1; default-lease-time 86000; max-lease-time 604800; host chief { hardware ethernet 0:0c:29:c8:0a:ее; fixed-address 192.166.0.100; # fixed-address localsrv.main.com.ua; server-name "mobile.altersys-ua.com"; J Более детальную информацию о настройке сервера и о конфигурационном файле можно найти на страницах справочного руководства man dhcpd. conf.
Краткое вступление 651 ГЛАВА 23. ДИНАМИЧЕСКИЙ DNS (DDNS) Те. кто использовал в своей практике Windows 2000 Server или Windows 2003, наверное, заметили удобство работы с динамически обновляемым DNS (DDNS). Она заключается в том, что содержимое зоны меняется в зависимости от адреса клиента, полученного от сервера DHCP. Таким образом, независимо от текущего адреса клиента, мы можем без проблем обращаться ко всем машинам в сети по их именам. Ранее в Windows-сетях за определение адреса по имени отвечала служба WINS, с появлением же DDNS ее поддержка теоретически отпала, но на практике существует ряд проблем, рассматривать которые мы не будем. Ведь мы говорим о системе FreeBSD ©. Но как бы все ни казалось просто с появлением DDNS, в действительности, данная система довольно сложна — в первую очередь, с точки зрения безопасности. Более подробную информацию о DDNS можно найти в документах RFC2136 и RFC2137, а также RFC3007 и RFC3008. В системе FreeBSD также можно организовать динамическое обновление зон. В первую очередь потребуется установить или проверить, что уже установлены, пакеты ISC DHCP версии 3 и ISC BIND версии 9 (поддержку DDNS имели и ранние версии BIND, начиная с 8.1.1, но использовать их не рекомендуется). Для понимания работы с данными пакетами просмотрите главу 20, "Сервер имен DNS" и главу 22, "Использование DHCP". Начиная с версии FreeBSD 5.3, пакет B1ND9 поставляется вместе с самой системой, а тем, кто пользуется более ранними версиями системы, придется установить этот пакет из набора портов. Сервер DHCP в любом случае придется устанавливать из дистрибутивного набора или портов. КРАТКОЕ ВСТУПЛЕНИЕ Итак, динамическое обновление... О нем мы уже упоминали в предыдущей главе, посвященной DHCP. Возможно, именно по причине существования DHCP была введена возможность динамического обновления зон DNS. К примеру, если существуют две сети с отдельными серверами DHCP и DNS внутри каждой, обе они соединены между собой, и клиенты обмениваются данными, то статическое определение имен ни в DNS, ни в файле hosts ни к чему хорошему не приведет. Требуется динамическое обновление файлов зон, а также безопасное обновление (DNSSEC), когда инициатор обновления должен предоставить ключ, совпадающий с ключом на сервере DNS, тем самым, подтвердив, что он является уполномоченным для выполнения данной операции. НАСТРОЙКА СИСТЕМЫ В данной главе мы будем рассматривать именно настройку безопасного обновления зон DNS. Но прежде, чем перейти непосредственно к описанию процесса настройки, перечислим главные операции, которые необходимо выполнить: выбор типа ключа, его параметров и непосредственное генерирование файла ключа (данная глава описывает самый простой и наиболее распространенный способ — использование симметричных ключей);
652 Глава 23. Динамический DNS (DDNS) внесение соответствующих изменений в настройку DHCP и DNS; настройка клиента DHCP на динамическое обновление DNS-зон. Ключи В первую очередь необходимо отметить, что существуют два типа ключей, используемых при динамическом обновлении: TSIG (симметричные) и SIG(O) (ассиметрич- ные). При этом ассиметричные ключи поддерживаются в версиях, начиная с BIND 9.3. К симметричным ключам относится HMAC-MD5, который рекомендован к использованию в большинстве случаев. Для генерации ключей используется утилита dnssec-keygen (в BIND8 — dnskeygen). Следующая команда позволит сгенерировать ключ по алгоритму НМАС- MD5 размером 512 бит для хоста с именем mobile.altersys-ua.com (имя ключа может быть любое, но рекомендуется использовать полное DNS-имя машины): # dnssec-keygen -a HMAC-MD5 -Ь 128 -n HOST mobile.altersys-ua.com. Kmobile.altersys-ua.com.+157+48554 В директории, где была запущена данная команда, появятся два файла, имя которых определяется по схеме K<keyname>+157 + <keyid>.<keytype>, где <keyname> — имя ключа, <keyid> — уникальный идентификатор ключа, a <keytype> — тип ключа (private или key). Число 157 в названии файла указывает на использование алгоритма HMAC-MD5. Просмотрим список файлов и содержимое файла ключа: # is к* ' Kmobile.a J tersys-ua.com.+157 + 4 8554.key Kmobile.altersys-ua.com.+157+48554.private # more Kmobile.altersys-ua.com.+157 + 48554 . key Private-key-format: vl.2 Algorithm: 157 (HMAC_MD5) Key: ZyB28NDUPh9o9aGA5DvcVg== В принципе, данные файлы нигде не будут использоваться —для нас важно только их содержимое, а точнее — строка символов после слова Key в файле * . private (это и есть сгенерированный ключ — ZyB28NDUPh9o9aGA5DvcVg==). При каждой новой попытке сгенерировать ключ эта строка будет отличной. Кроме значения HOST, для указания типа владельца могут использоваться также ZONE, ENTITY, USER и OTHER. При этом разрешенные к использованию типы зависят от алгоритма. Заметим, что длина ключа может варьироваться, при этом она очень сильно зависит от используемого алгоритма. Перечислим возможные значения длины ключей (табл. 23.1). Таблица 23.1. Возможные значения длины ключей для различных алгоритмов Алгоритм Длина ключа RSAMD5 От 512 до 2048 бит RSASHA1 От 512 до 2048 бит DH (Diffie Hellman) От 128 до 4096 бит DSA От 512 до 1024 бит (шаг 64) HMAC-MD5 От 1 до 512 бит (шаг 1) Настройка DDNS-сервера Настройка сервера имен DNS Настройка сервера DNS зависит от типа ключа, то есть, от типа алгоритма (симметричный или ассиметричиыи). В данном случае упомянем только, что при использовании
Настройка системы 653 ассиметричных ключей (SIG(O)) никаких изменений в работу сервера имен, кроме редактирования файлов зон, вносить не придется. При использовании симметричного ключа (например, HMAC-MD5), добавьте строку следующего вида в начало файла /etc/named, conf (предварительно изменив в соответствии с вашими предпочтениями): key mobile.altersys-ua.com. { algorithm HMAC-MD5; secret "ZyB28NDUPh9o9aGA5DvcVg=="; }; В данном случае мы добавили ключ (key) с именем mobile . altersys-ua.com.; используемый алгоритм — HMAC-MD5; в строке secret указывается сам ключ (строка символов). Далее необходимо определиться с зонами, которые предполагается динамически обновлять. Для разрешения обновления (и не только) используется один из двух операторов: allow-update и update-policy. Первый из них позволяет указать ключ, который имеет полные права на внесение любых изменений в файл зоны. Для более гибкой настройки прав доступа на обновление рекомендуется использовать оператор update-policy. Приведем пример использования оператора allow-update: allow-update { key mobile.altersys-ua.com.; }; Предположим, что необходимо разрешить динамическое обновление прямой зоны altersys-ua.com и обратной зоны 168 .192. IN-ADDR.ARPA, которые отвечают за машины в локальной сети. Пример конфигурационного файла named, conf для сервера DNS при использовании симметричного ключа представлен в листинге 23.1, "стартовые" (до динамического обновления) файлы зон — в листингах 23.2 и 23.3. Заметим, что те части листинга, на которые в первую очередь следует обратить внимание, выделены полужирным шрифтом. Листинг 23.1. Пример конфигурационного файла named.conf для разрешения безопас- ного динамического обновления зон key mobile.altersys-ua.com. { . algorithm HMAC-MD5; secret "ZyB28KDUPh9o9aGA5DvcVg=="; ); // Сохранять всю информацию о запросах на обновление зон, // включая успешные и неуспешные попытки, а также ошибки обновления. logging { category queries ( security log; }; category notify ( security_log; }; category dnssec { security_log; }; category update { security_log; }; category security { security_log; }; // Хранить всю информацию в файле dns-security.log // в корневой директории сервера DNS (запускается в среде enroot). // Когда размер файла достигает 10 Мбайт, он // архивируется. Хранить 3 предыдущие копии log-файлов. channel security_log { file "dns-security.log" versions 3 size 10m; print-time yes; print-category yes; print-severity yes;
654 Глава 23. Динамический DNS (DDNS) Листинг 23.1 ■ Окончание severity dynamic; ); }; options { directory "/etc/namedb"; dnssec-епаЫе yes; # включено по умолчанию version "none"; query-source address * port 53; ); zone " . " ( type hint; file "named.root"; ); zone "0.0.127.IN-ADDR.ARPA" ( type master; file "master/localhost.rev"; }; "altersys-ua.com" { type master; file "master/altersys-ua.com"; allow-update { key mobile.altersys-ua.com.; }; }; zone "168.192.IN-ADDR.ARPA" { type master; file "master/168.192.in-addr.arpa"; allow-update { key mobile.altersys-ua.com.; }; 22 Листинг 23.2. Файл forward-зоны "maeter/altereya-ua. com" до внедрения динамиче- скогообновления "'':■ -~ • .;' ■■ - ■,' '-г ■' -'"^ '""■ ' ' '".'• • $ORIGIN altersys-ua.com. 5TTL 3600 @ IN SOA mobile.altersys-ua.com. root.altersys-ua.com. ( 2005071112 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) ; DNS Servers @ IN NS mobile.altersys-ua.com. ; MX Record @ IN MX 10 mobile.altersys-ua.com. ; Machine Names localhost IN A 127.0.0.1 0 IN A 192.168.0.200 mobile IN A 192.168.0.200
Настройка системы 655 Листинг 23.2. Окончание - , f ; HINFO "INTEL-386" "UNIX-BSD" ; Other root IN TXT "Didok Olexander, Altersys" Листинг 23.3. Файл обратной зоны "maeter/168.192 .in-addr.arpa" до внедрения динамического обновления ^_, ^_ , ' SORIGIN 168.192.IN-ADDR.ARPA. $TTL 3600 @ IN SOA mobile.altersys-ua.com. root.altersys-ua.com. ( 2005071112 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) @ IN NS mobile.altersys-ua.com. 200.0 PTR mobile.altersys-ua.com. Настройка сервера DHCP На следующем этапе выполняется настройка сервера DHCP. Она сводится к нескольким простым шагам: разрешить производить динамическое обновление, указать ключ для возможности производить безопасное обновление и указать зоны, в которых сервер DHCP будет производить обновление (в соответствии с настройками самого сервера DNS). В первую очередь необходимо настроить сервер DHCP на обновление соответствующих записей в зонах при каждом изменении аренды (выделение новой аренды или обновление старой). Для этого необходимо изменить значение оператора ddns- update-style в глобальном пространстве операторов конфигурационного файла dhcpd. conf с none на interim: ddns-update-style interim; Для того чтобы указать ключ, подобно тому, как это было выполнено для сервера DNS, добавим в конфигурационный файл dhcpd. conf следующие строки (в каждом конкретном случае они будут различными): key mobile.altersys-ua.com. ( algorithm HMAC-MD5; secret ZyB28NDUPh9o9aGA5DvcVg==; } Итак, мы добавили ключ (key) с именем mobile.altersys-ua.com.. Секретное слово в нашем случае должно полностью совпадать с тем, которое использовалось для сервера DNS. Это касается и используемого алгоритма. Для каждой зоны, которую должен динамически обновлять сервер DHCP, потребуется создать отдельную запись подобного вида: zone altersys-ua.com { primary 127.0.0.1; key mobile.altersys-ua.com.; I
656 Глава 23. Динамический DNS (DDNS) Заметим, что в данном случае использовалось имя forward-зоны altersys- ua.com, а оператор primary задает адрес DNS-сервера, которому будут посылаться запросы на обновление. В данном случае и сервер DNS, и сервер DHCP запущены на одном компьютере. Обратим внимание еще на ряд немаловажных аспектов. В первую очередь, синхронизируйте время на сервере DHCP и DNS. Во-вторых, во избежание возникновения проблем с разрешением имен в сети при динамическом изменении адреса желательно в файле dhcpd. conf указать оператор ddns-ttl с как можно минимальным значением, например, в одну минуту: ddns-ttl 60; Обратите также внимание на использование точек (.), точек с запятой (;) и кавычек ("). Большинство проблем может возникнуть именно при неправильном их использовании (то есть, при установке в неположенном месте или, наоборот, при отсутствии необходимых знаков там, где они должны быть указаны). Пример конфигурационного файла dhcpd. conf для сервера DHCP при использовании симметричного ключа представлен в листинге 23.4 (полужирным шрифтом выделены строки, на которые необходимо обратить особое внимание). Листинг 23.4. Пример конфигурационного файла dhcpd. conf для разрешения безопас- ного динамического обновления зон ■ ■ С ■ option domain-name "altersys-ua.com"; option domain-name-servers 192.168.0.200; option subntet-mask 255.255.0.0; default-lease-time 3600; max-lease-time 86400; authoritative; ddns-update-style interim; ddns-ttl 60; log-facility local7; key mobile.altersys-ua.com. { algorithm HMAC-MD5; secret ZyB28NDUPh9o9aGA5DvcVg==; } zone altersys-ua.com { primary 127.0.0.1; key mobile.altersys-ua.com.; ) zone 168.192.in-addr.arpa { primary 127.0.0.1; key mobile.altersys-ua.com.; } subnet 192.168.0.0 netmask 255.255.0.0 { range 192.168.0.10 192.168.0.99; option routers 192.168.0.1; } После внесения соответствующих изменений перезапустите сервер DNS и DHCP. Просмотрите журнальные файлы на предмет наличия ошибок.
Настройка системы 657 Настройка клиента Настройка клиента сводится к простому изменению конфигурационного файла /etc/dhclient. conf. Все что потребуется, — это добавить три строки: send fqdn.fqdn "<hostname>.<domainname>."; send fqdn.encoded on; send fqdn.server-update on; Первый оператор позволяет указать полное доменное имя клиентской машины. При этом обратите осббое внимание на точку в конце имени — она является обязательной! Пример полного доменного имени: localsrv.altersys-ua.com.. Второй оператор позволяет перекодировать полное доменное имя в формат, понятный серверу DNS. Последний оператор позволяет клиенту послать указание серверу DHCP обновить ресурсную запись А в forward-зоне. Пример файла /etc/dhclient. conf, используемого на стороне клиента DHCP, представлен в листинге 23.5. Листинг 23.5. Пример настройки клиента DHCP с именем localsrv.altersys-ua.com. в файле /etc/dhclient.conf для динамического обновления DNS-зон # $FreeBSD: src/etc/dhclient.conf,v 1.3 2001/10/27 03:14:37 rwatson Exp $ # # In most cases an empty file is sufficient for most people as the # defaults are usually fine. # select-timeout 5; initial-interval 5; reject 192.168.0.1; send fqdn.fqdn "localsrv.altersys-ua.com."; send fqdn.encoded on; send fqdn.server-update on; После изменения конфигурационного файла клиента перезапустите клиентскую машину. Просмотр результатов Просмотрим результат внесенных изменений на стороне как сервера, так и клиента. Предположим, существуют две клиентские машины: localsrv (листинг 23.5) и virtual, настроенные в соответствии с предыдущими описаниями. При правильной настройке обеих сторон (клиентов и серверов), на стороне сервера DNS в директории /var/named/etc/namedb/master (/etc/namedb/master) должны появиться несколько новых файлов с расширением * . jnl: # pwd /var/named/etc/namedb/master # Is 168.192.in-addr.arpa altersys-ua.com.jnl 168.192.in-addr.arpa.jnl localhost.rev altersys-ua.com На стороне клиентов должны пройти успешно следующие команды (имя машины указано в строке запроса на ввод команды вместе с версией системы; для удобства команды на различных машинах выделены различными стилями шрифта): localsrv[F5.4]# nslookup localsrv Server: 192.168.0.200 Address: 192.168.0.200*53
658 Глава 23. Динамический DNS (DDNS) Name: localsrv.altersys-ua.com Address: 192.168.0.99 localsrv[F5.4]# nslookup 192.168.0.99 Server: 192.168.0.200 Address: 192 .168 . 0.200#53 99.0.168.192.in-addr.arpa name = localsrv.altersys-ua.com. virtual[F4.11]# nslookup virtual Server: mobile.alterays-ua.com Address: 192.168.0.200 Name: virtual.altersys-ua.com Address: 192.168.0.98 virtual[F4.11]# nslookup 192.168.0.98 Server: mobile.altersye-ua.com Address: 192.168.0.200 Name: virtual.altersys-ua.com Address: 192.168.0.98 Кроме этого, через некоторое время изменятся файлы зон. Примеры файлов зон после настройки на динамическое обновление и динамического выделения адресов двум клиентам DHCP приведены в листингах 23.6 и 23.7 (полужирным шрифтом выделены новые записи в файлах зон). Листинг 23.6. Файл forward-зоны master/altersys-ua.вот после настройки на дина- , мическое обновление ' ' • .■', ' ■ $0RIGIN . $TTL 3600 ; 1 hour altersys-ua.com IN SOA mobile.altersys-ua.com. root.altersys- ua.com. ( NS A MX A 2005071114 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) mobile.altersys-ua.com. 192.168.0.200 10 mobile.altersys-ua.com. 127.0.0.1 50RIGIN altersys-ua.com. localhost $TTL 60 ; 1 minute localsrv A 192.168.0.99 TXT "004be8217533898cl9a33a8ce4aad33a43" $TTL 3600 ; 1 hour mobile A 192.168.0.200 HINFO "INTEL-386" "UNIX-BSD" root TXT "Didok Olexander, Altersys" $TTL 60 ; 1 minute virtual A 192.168.0.98 TXT "001939849f2a07a3365cb085e64 6c4407a"
Настройка системы 659 Листинг 23.7. Файл обратной зоны master/168.192. in-addr.arpa после настройки на динамическое обновление • ■ - $ORIGIN . $TTL 3600 ; 1 hour 168.192.IN-ADDR.ARPA IN SOA mobile.altersys-ua.com. root.altersys- ua.com. ( 2005071114 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS mobile.altersys-ua.com. $0RIGIN 0.168.192.IN-ADDR.ARPA. 200 PTR mobile.altersys-ua.com. $TTL 60 ; 1 minute 98 PTR virtual.altersys-ua.com. 99 PTR localsrv.altersys-ua.com. Помимо этого, несколько иначе будет выглядеть также файл аренды /var/db/ dhclient. leases. Приведем пример такого файла для машины localsrv (обратите внимание на строки, выделенные полужирным шрифтом) в листинге 23.8: Листинг 23.8. Пример содержимого файла аренды для клиента DHCP, настроенного на динамическое обновление lease ( interface "lncO"; fixed-address 192.168.0.99; option subnet-mask 255.255.0.0; option dhcp-lease-time 3600; option routers 192.168.0.1; option dhcp-message-type 5; option dhcp-server-identifier 192.168.0.200; option domain-name-servers 192.168.0.200; option domain-name "altersys-ua.com"; option fqdn.encoded true; option fqdn.hostname "localsrv.altersys-ua.com"; option fqdn.fqdn "localsrv.altersys-ua.com"; option fqdn.no-client-update true; option fqdn.server-update true; option fqdn.rcode1 0; option fqdn.rcode2 0; renew 4 2005/7/14 19:29:31; rebind 4 2005/7/14 19:57:27; expire 4 2005/7/14 20:04:57; } ТОЧКИ. В данном случае полное доменное имя машины записывается без завершающей Использование асимметричных ключей Рассматривать в подробностях порядок настройки мы не будем. Опишем только некоторые особенности: ■ приватный и публичный ключи отличаются — приватный ключ хранится только у клиента;
660 Глава 23. Динамический DNS (DDNS) клиент может динамически изменять публичный ключ, поскольку он хранится в файле зоны (скопируйте все содержимое файла К* . key в файл зоны); динамическое обновление файла зоны должно производится с использованием сценария /etc/dhclient-exit-hooks, который отсутствует в системе по умолчанию. Встроенный в утилиту dhclient алгоритм динамического обновления не предусматривает прямого изменения файла зоны с использованием асимметричных ключей. В файл /etc/dhclient. conf на стороне клиента необходимо добавить следующие строки: send fqdn.fqdn "<name>.<domainname>."; send fqdn.encoded on; send fqdn.server-update off; Также потребуется создать файл /etc/dhclient-exit-hooks следующего формата: TTL=3600 SERVER=<ip.add.re.ss> ZONE=<zone_name> HOSTNAME=<name>.<domainname>. # K*.key и К*.private файлы должны находиться в одной директории KEYFILE=<full_path_to_privare_keyfile> nsupdate -v -k $KEYFILE > /dev/null « EOF server $SERVER zone $ZONE update delete $HOSTNAME A update add $HOSTNAME $TTL A $new_ip_address send EOF Возможные ошибки и их решение Перечислим основные ошибки и способы их решения. Появление в журнальном файле следующей ошибки: 14-Jul-2005 23:13:05.388 security: error: client 192.168.0.200*62333: ^request has invalid signature: TSIG mobile.altersys-ua.com: tsig 'bverify failure (BADSIG) означает несоответствие ключей на сервере DHCP и сервере DNS. Внимательно просмотрите файлы named, conf и dhcpd.conf на предмет корректности написания ключа после слова secret. Появление на консоли и в файле /var/log/messages сервера следующих записей: Jul 14 23:20:55 mobile named[2632]: client 192.168.О.99#57807 : update 'Ь'altersys-ua.com/IN' denied а на консоли клиента и в файле системных сообщений записей Jul 14 23:21:16 localsrv dhclient: Unable to add forward map from 'blocalsrv.altersys-ua.com. to 192.168.0.99: timed out может означать, что на стороне клиента в файле /etc/dhclient. conf отключена отправка запроса обновления forward-зоны сервером DHCP, и клиент пытается сам
Настройка системы 661 выполнить небезопасное обновление прямой зоны. Для решения проблемы исправьте или добавьте следующую строку в файл /etc/dhclient. conf: send fqdn.server-update on; после чего перезапустите клиентскую машину или же выполните следующие команды (измените IncO на имя вашего интерфейса): localsrv[F5.4]# dhclient -r localsrv[F5.4]# dhclient IncO & He выполняется прямой просмотр по имени машины, а обратный выдает непонятный ответ, например: Localsrv[F5.4]# nslookup localsrv ;; connection timed out; no servers could be reached localsrv[F5.4]# nslookup 192.168.0.99 Server: 192.168.0.200 Address: 192.168.0.200*53 99.0.168.192.in-addr.arpa name = localsrv.altersys- *bua.com.altersys-ua.com. В случае получения подобного ответа, скорее всего, присутствует ошибка в написании полного доменного имени компьютера в файле /etc/dhclient.conf. Например, если компьютер называется localsrv а домен — altersys-ua.com, то правильная запись будет выглядеть следующим образом: send fqdn.fqdn "localsrv.altersys-ua.com."; # правильная запись а не: send fqdn.fqdn "localsrv.altersys-ua.com"; # неправильная запись Исправьте ошибку, после чего перезапустите клиентский компьютер или выполните ту же последовательность команд, что и в пункте 2 данного подраздела. Более подробную информацию о внедрении DDNS в сети можно найти в справочном руководстве man dhcpd.conf, man dhclient .conf, а также в руководстве администратора по BIND9 (BIND9 ARM).
662 Глава 24. Связь с Windows. Использование пакета SAMBA ГЛАВА 24. СВЯЗЬ С WINDOWS. ИСПОЛЬЗОВАНИЕ ПАКЕТА SAMBA Несмотря на закрытость продуктов компании Microsoft, ее операционные системы стали наиболее популярными среди пользователей домашних систем и настольных рабочих станций. В виду -этого, для других операционных систем появляются продукты позволяющие интегрировать их в сетевое окружение Windows. При этом также были разработаны некоторые коммерческие продукты для Windows-систем, реализующие NFS, которые, впрочем, не стали популярными из-за ограниченных возможностей, а использовать FTP для связи Windows и FreeBSD несколько непрактично. Предположим, вы — администратор небольшой компании. Во избежание больших капиталовложений на покупку лицензионного ПО, было принято решение использовать в качестве операционной системы для большинства серверов и рабочих станций FreeBSD. При этом на нескольких серверах и рабочих компьютерах пришлось оставить ОС Windows (например, для работы таких приложений как 1С или Клиент-Банк). Некоторые Windows-приложения без проблем можно запускать и в среде FreeBSD. Для этого существует несколько утилит эмулирования среды Microsoft Windows. Одна из наиболее известных — пакет Wine. Его установку можно произвести из портов (/us r /ports /emulators /wine). Как связать в данном случае рабочие машины клиентов, работающие под управлением FreeBSD. с присутствующими Windows-системами? Можно ли предоставить возможность Windows-пользователям входить под своими учетными записями на FreeBSD- машины? Может ли FreeBSD-машина выступать в качестве контроллера домена или носителя групповой политики Active Directory Win2k или Win2k3s? Да, может. Для возможности взаимосвязи был разработан продукт под названием Samba, который реализует методы взаимодействия Windows-клиентов, используя протокол SMB (Server Message Block) и файловую систему CIFS (Common Internet File System). Пакет Samba не включен в саму операционную систему, но может быть добавлен из портов или набора пакетов. Поначалу использование данного продукта может вызвать некоторые сложности, но в дальнейшем вы сможете почувствовать всю простоту и "прозрачность" его работы и настройки. ВВЕДЕНИЕ В SAMBA Итак, Samba — довольно удобный, свободно распространяемый продукт, позволяющий без проблем объединить все системы Windows и Unix в сети для совместного использования файлов и принтеров. Он позволяет как объединять Unix-системы с Windows- системами для совместного использования ресурсов (с помощью пакетов smbfs и libsmbclient), так и предоставлять в совместное использование Windows-клиентам ресурсы Unix-систем. В последнем случае можно обойтись без дорогих Windows- серверов, полностью заменив их компьютерами с Samba. Более того, Samba может выступать в роли контроллера домена и носителя Active Directory.
Введение в Samba 663 Отметим, что пакет Samba работает намного лучше при больших нагрузках и не ограничен количеством одновременных клиентский соединений как в случае с Windows- сервером, где для каждого дополнительного соединения необходимо приобретать отдельную клиентскую лицензию. Независимо от потребностей, практически во всех случаях использование Samba окупается как в цене, так и во времени настройки и поддержки. Чем же примечателен протокол SMB? Прежде всего возможностью автоматического поиска всех машин в сетевом окружении, используя отсылку широковещательных запросов выявления (рис. 24.1). При этом в сети присутствует компьютер, называемый главным обозревателем сети (master browser), который содержит список всех обнаруженных машин и постоянно пытается динамически его корректировать. -JPI.X] д Соседние компьютеры Файл Правке £ид Избранное Сереж Спраека ^Намд - ■* JJ фпвнск ^Папки ^ /£ О; '/(. Л " Адрес: j^Mshome 2 <>Пврвяод Соседние компьютеры Иия ' Б .окнонтарид ■g)clkjnt92 windows 9х dent •^Jlnfortnex Vrtn2k workstation JSjMobfe Sonriba Setver Чтобы просмотреть описание элаиемта, Bbwenmeero. Рис. 24.1. Сетевое окружение. Компьютер Mobile работает под управлением FreeBSD и использует пакет Samba Все машины в сети SMB именуются неким коротким именем (не более 15-ти символов), называемым именем NetBIOS (за имена в системе Samba отвечает утилита nmbd, о чем речь пойдет немного позже). Имя NetBIOS не обязательно совпадает с коротким именем DNS, хотя по умолчанию Samba пытается установить его, используя короткую часть DNS-имени. При этом, если длина DNS-имени превышает 15 символов, то оно будет "обрезано". Например, для машины с DNS-именем somebigandlongr.amedmachi- nein.domain.ua Samba установит имя NetBIOS somebigandlongn (если в конфигурационном файле не определена другая установка). Регистр символов в имени NetBIOS машины, как и в случае с DNS-именем, не имеет значения. ПРИМЕЧАНИЕ Как известно, широковещательные пакеты не передаются через маршрутизаторы. Это несколько ограничивает использование протокола NetBIOS и SMB небольшими локальными сетями. При этом даже одна рабочая группа внутри компании может быть непреднамеренно разделена на независимые подгруппы со своими главными обозревателями, которые не будут знать о существовании других машин в рабочей группе, расположенных по другую сторону маршрутизатора. Подобная проблема возникает, когда рабочая группа разделена на подсети (сетевой маской), а широковещательные запросы, как известно, посылаются только внутри одной подсети (вспомните поле broadcast в настройках интерфейса). Для устранения подобных проблем был разработан протокол WINS (Windows Internet Name Service). Пакет Samba может использовать серверы WINS, а также выступать в роли первичного или вторичного WINS-сервера. Все главные обозреватели подсетей должны быть настроены на синхронизацию списка записей своей подсети с WINS-сервером, содержащим общий список всей рабочей группы. Клиентские ..Е.м.Р!?.ю1е.Р.ь!.£9.л.жны быть настроены на использование WINS-сервера.
664 Глава 24. Связь с Windows. Использование пакета SAMBA Все компьютеры в сетевом окружении могут предоставлять для общего пользования так называемые общедоступные (разделяемые) ресурсы (shares). Просмотреть список всех ресурсов, предоставленных в общее пользование, можно, обратившись к машине с помощью команды Wnetpcname Для доступа к определенному общедоступному ресурсу используется формат UNC (Universal Naming Convention), немного напоминающий формат URL (Uniform Resource Locators): \\netpcname\sharedfoldername При этом в среде FreeBSD для доступа к разделяемым ресурсам используется именно формат URL: smb://netpcname/sharedfoldername Как и в случае с NFS, протокол SMB позволяет следить за тем, кто в данный момент использует и какой именно общедоступный ресурс. Для этого предназначена команда smbstatus: К smbstatus Samba version 3.0.14a PID Username Group Machine Service pid mach'ine Connected at IPC$ 277 192.168.0.1 Mon May 9 16:39:29 2005 public 277 192.168.0.1 Mon May 9 16:36:57 2005 IPCS 277 192.168.0.1 Mon May 9 16:35:42 2005 Locked files: Pid DenyMode Access R/W Oplock Name 277 DENY_NONE 0x2019f RDWR EXCLUSIVE+BATCH /home/depot/_FreeBSD.doc Mon May 9 16:39:30 2005 Операции в среде SMB В принципе, на верхнем пользовательском уровне операции довольно просты и понятны. Ресурсы в среде SMB предоставляют такие же возможности управления файлами, как и локальные файловые системы, а для разделяемых принтеров доступны те же операции, что и для локальных принтеров. Точнее, можно создавать, удалять, изменять права и атрибуты файлов и директорий; открывать, считывать, записывать и закрывать файлы; осуществлять поиск файлов в директориях и поддиректориях, а также выполнять любые операции установки и удаления заданий в очередь печати. Также разрешен поиск машин в сети и ресурсов, предоставляемых в общее пользование. Клиенты и серверы SMB На первый взгляд может показаться, что SMB является протоколом вида "точка- точка", однако в действительности он работает по принципу "клиент-сервер". Это означает, что есть некий клиент, посылающий запросы серверу, который обрабатывает эти запросы и возвращает ответ. Если провести аналогию с NFS, где сервер может выступать также и в роли клиента, то с протоколом SMB ситуация обстоит несколько иначе. Как правило, одна машина выступает и как клиент, и как сервер. При этом понятие
Введение в Samba 665 "клиент-сервер" употребляется для одной конкретной сессии запроса-ответа по протоколу SMB. Таким образом, в один и тот же момент времени компьютер может выступать и в качестве клиента, и в качестве сервера для других машин. В сети SMB под сервером понимается компьютер, который предоставляет свои ресурсы в общее пользование, а под клиентом — машина, которая имеет возможность использовать предоставленные ресурсы. Еще раз обращаем внимание на то, что пакет Samba функционирует только в качестве сервера, однако существуют другие пакеты, позволяющие машинам FreeBSD работать в качестве клиентов SMB (они будут рассмотрены в конце главы). Безопасность: рабочие группы, домены и Active Directory Пользователи, работавшие с Windows-системами, должны помнить всю сложность настройки безопасности и работы в сети. При этом поведение машин в сети серьезно отличалось в случае использования Windows 9x и NT/2000/XP. Рассмотрим общие принципы и понятия рабочих групп и доменов, а также основ контроля доступа в зависимости от выбранного решения. Рабочие группы Рабочая группа — это логическое объединение компьютеров, каждый из которых выступает одновременно в качестве клиента и сервера, управляя при этом доступом к ресурсам на основе своей локальной базы пользователей и в соответствии со своими настройками. Таким образом каждая рабочая группа осуществляет уникальную политику безопасности. В данном случае используют несколько уровней контроля доступа. Во-первых, может быть ограничен доступ к компьютеру на просмотр ресурсов. Во-вторых, накладывают ограничение на сами ресурсы (пароль или по адресу компьютера) — как на доступ в целом, так и на операции в пределах всего ресурса. И третий уровень —ограничение доступа к определенным файлам или каталогам на уровне файловой системы. Заметим, что для систем Windows 9x, работающих в рабочей группе, существует три типа парольной проверки: пароль Windows (используется для разграничения локального входа); сетевой пароль (используется для ограничения доступа в сети); пароль на ресурс (ограничение доступа к сетевым ресурсам). Пакет Samba может быть настроен на работу в рабочей группе, выступать в качестве WINS-сервера, а также в качестве главного обозревателя сети. Домены Домен - это логическое объединение компьютеров и пользователей сети, которые используют некую общую базу данных, отвечающую за политику безопасности. Эта база, иногда называемая каталогом домена, содержит полное описание всех пользователей и компьютеров и позволяет централизованно управлять ими, а также сетевыми доступами и безопасностью. В такой сети выделяется один или несколько специфических серверов, которые отвечают за хранение данных в каталоге домена и предоставляют ресурсы в совместное использование (в качестве клиентов они как правило не используются). К таким серверам относится главный (основной) контроллер домена (PDC— Primary Domain Controller) и вторичный (подчиненный) контроллер домена (BDC — Backup Domain Controller). В домене может быть только один сервер PDC и несколько BDC (носители копий SAM-базы домена, доступных только для чтения). Серверы BDC позволяют в случае выхода из строя PDC контролировать доауп к ресурсам.
666 Глава 24. Связь с Windows. Использование пакета SAMBA Принципы управления безопасностью в доменной среде несколько отличаются от тех. что присутствуют в рабочей группе. В частности, основной контроль осуществляется в процессе аутентификации, на основании которой ограничивается или предоставляется доступ к ресурсам. В такой среде всем объектам присваивается уникальный идентификатор безопасности SID, с которым связаны определенные наборы правил ACL. Здесь можно провести параллель между UID/GID в UNIX-среде и SID в Windows, а также списки ACL с правами файловой системы. Система Samba может быть настроена как основной контроллер или как клиент домена. Active Directory Активный каталог AD, который был впервые реализован в Windows 2000, является расширением понятия домена. Поддержка Active Directory появилась в Samba 3.0, но при этом машина может выступать только в качестве клиента AD. Версии Samba 2.2 и 3.0 могут работать в Active Directory как серверы только в режиме эмуляции PDC. Необходимо учитывать, что при использовании Active Directory используется Kerberos5 и LDAP, а вместо WINS используется DNS. В сети Active Directory каждый домен выступает в качестве основного контроллера, и отсутствует такое понятие как BDC. Возможности Приведем краткую суммирующую таблицу возможностей пакета Samba (табл. 24.1). Таблица 24.1. Основные возможности пакета Samba Возможности Контроллер Active Directory Клиент Active Directory Основной контроллер домена (PDC) Вторичный контроллер домена (BDC) Основной WINS-сервер Вторичный WINS-сервер Файловый сервер Сервер печати Поддержка DFS Поддержка ACL Главный обозреватель сети Подчиненный обозреватель сети Поддержка клиентов Windows 9x Поддержка клиентов Windows NT/2000/XP УСТАНОВКА ПАКЕТА В последнее время пакет Samba стал настолько популярен, что большинство поставщиков сразу же укомплектовывают им свои системы. С одной стороны, это удобно, однако в большинстве случаев такой вариант "установки" не подходит, поскольку пользователь сталкивается с ограниченным набором возможностей, определенных во время компиляции, и неподходящей версией. Вторая проблема заключается в постоянном появлении новых пакетов обновлений и исправлений (Service Pack) для Windows-систем, что приводит к частичной несовместимости сервера Samba и обновленных клиентских машин. Таким образом, в большинстве случаев все равно приходится заниматься ручной "сборкой" пакета и его установкой в систему. Поддержка Нет Да Да Да/Нет Да Нет Да Да Да Да Да Да Да Да
Установка пакета 667 Как обычно, существует несколько путей для установки: из набора пакетов (не рекомендуется), из портов (наиболее предпочтительный вариант), или же полностью ручная установка с загруженных с сервера исходных текстов (не рекомендуется). Далее в книге будет принято, что используется пакет Samba 3.0.14а из стабильной ветки 3.x. Пакет Samba 2.2.x устанавливать не рекомендуется, несмотря на то, что он и присутствует в наборе портов (версия 2.2.12) — он отмечен как устаревший и не поддерживается с осени 2004 года. В данный момент идет разработка новой ветки Samba 4.x, которая пока недоступна для массового использования. Если у вас уже установлен пакет Samba, то его версию можно узнать с помощью следующей команды: # smbd -V Version 3.0.14а Возможно, система не обнаружит исполняемый файл smbd и выдаст сообщение об ошибке. Проше всего узнать какие пакеты установлены с помощью команды pkg_info: # pkg_info I grep samba samba-3.0.14a,1 A free SMB and CIFS client and server for UNIX samba-libsmbclient-3.0.14a_2 The shared lib from the samba packages Если окажется, что в системе уже установлена какая-либо версия пакета Samba, то определите ее возможности — может быть, некоторые из них недостаточны. Например, если во время установки системы FreeBSD была выбрана установка пакета Samba 2.2.12, то окажется, что отсутствует поддержка winbindd (рассматривается ниже). Для деинсталляции и установки новой версии воспользуйтесь приблизительно такой последовательностью команд: # pkg_info I grep samba samba-2.2.12 A free SMB and CIFS client and server for UNIX samba-libsmbclient-3.0.14a_2 The shared lib from the samba packages # pkg_delete samba-2.2.12 # pkg_info | grep samba samba-3.0.14a,1 A free SMB and CIFS client and server for UNIX # cd /usr/ports/net/samba3 # make config install clean В результате на экране появится окно конфигурирования Samba (рис. 24.2). CM] ШЗ 1X1 1X1 [ ] 1 [XI •. [ ] «)' [XI '"" [X] [ ] [ 1 [ ] [ ] [ ] [ ] Options for samba 3.G.14a,l With Active Directory support With CUPS printing support With WinBIND support With ACL support With Syslog support With Quota support With UTMP support With HSDFS support With XML smbpasswd backend With MVSQL smbpasswd backend With PostgreSQL smbpasswd backend With Samba2.x LDflP smbpasswd backend With SMB РАМ module With experimental module(s) НЛШ1 Cancel Рис. 24.2. Опции пакета Samba при установке
668 Глава 24. Связь с Windows. Использование пакета SAMBA Выберите требуемые опции и нажмите кнопку ОК. Будет выполнена загрузка пакета, распаковка, компиляция, установка и очистка системы от временных файлов. Итак, был установлен пакет Samba, используя порты. Далее необходимо выполнить настройку, тестирование и запуск. Но прежде рассмотрим список файлов и программ, которые могли быть установлены (в зависимости от опций, выбранных во время установки) в системе. Проверьте правильность установки и доступности пакета в системе: if pkg info I yrep samba samba-З.СЛ la,1 A free SMB and CIFS client and server for UNIX samba-1ibsmbclient-3.0.14a 2 The shared lib from the samba packages Файлы и программы Пакет Samba укомплектован набором файлов, которые предоставляют возможность работать с протоколом SMB. Список таких файлов представлен в табл. 24.2 (может варьироваться в зависимости от выбранной конфигурации во время подготовки к установке). Таблица 24.2. Список файлов, используемых для настройки и управления Samba Файл Описание smbd Даемон, используемый для работы с общедоступными ресурсами. Отвечает на такие запросы клиентов как печать, работа с файлами, построение списка файлов, аутентификация пользователей, блокирование ресурсов nmbd Простой даемон, выполняющий функции сервера имен. Отвечает также за функционирование Samba как WINS-сервера и за построение списка машин в сетевом окружении winbindd Даемон, используемый для получения информации о пользователях и группах с серверов Windows NT. Позволяет также пакету Samba самому аутентифицировать пользователей доменов Windows NT/2000/2003 swat Система Web-администрирования пакета Samba smbcontrol Простая утилита управления даемонами smbd, nmbd и winbindd smbcacls Утилита, используемая для установки или просмотра списка ACL на удаленном NT-ресурсе (файл, директория) pdbedit Новая утилита, позволяющая управлять учетными записями, хранящимися в SAM-баэе smbspool Утилита, используемая для отправки документов на удаленный общедоступный принтер smbtar Программа, подобная tar-команде. Используется для создания резервных копий данных, расположенных на общедоступных ресурсах wbinfo Утилита для получения и отображения информации от даемона winbindd (должен быть запущен) net Новая,.угилита, появившаяся в Samba 3.0. Аналогична одноименной утилите в Windows и служит для управления серверами в сети smbclient Простая ftp-подобная утилита, используемая для соединения с удаленными SMB-машинами. Позволяет оперировать данными в общедоступных ресурсах testparm Простая утилита, используемая для проверки правильности описания конфигурационного файла и вывода сообщений об ошибках. Также позволяет вывести весь список возможных записей в файле smb.conf и параметры, установленные по умолчанию smbstatus Простая программа вывода списка текущих сетевых соединений и использования общедоступных ресурсов на сервере Samba nmblookup Программа для поиска имен, если необходимо определить IP-адрес, или поиска всех машин в сети, всех главных обозревателей в сети и т.п.
Запуск 669 Таблица 24.2. Окончание Файл Описание smbpasswd Программа для изменения паролей, используемых сервером Samba. При этом пользователь может изменить свой пароль, а администратор системы имеет право на изменение паролей всех пользователей системы f indsmb Утилита для поиска в локальной сети компьютеров, отвечающих на запросы по протоколу SMB, и вывода детальной информации о них: IP-адрес, имя машины, рабочая группа, версия ОС Как правило, большинство утилит управления устанавливаются в директорию /usr/local/bin, а файлы даемонов — в директорию /usr/local/sbin. Некоторые примеры файлов настройки и сценарии автоматизации могут быть найдены в директории /usr/local/share/examples/samba. Документация находится в директории /usr/local/share/doc/samba. В директории /usr/local/etc находится файл smb. conf .default, который необходимо переименовать или скопировать в smb. conf и отредактировать в соответствии со своими конкретными потребностями. В директории /usr/local/etc/rc.d.можно найти стартовый сценарий samba.sh, который служит для автоматического запуска необходимых процессов при запуске системы. Он также может быть использован по запросу администратора системы как для запуска, так и для останова Samba. Кроме того, в системе будет создан ряд других файлов и директорий таких как кодовые страницы, директория для хранения журналов, директория для хранения временных приватных таблиц, набор библиотек и дополнительных файлов для работы системы SWAT. ЗАПУСК Запуск Samba-З несколько отличается от запуска предыдущих версий. Если ранее в/usr/local/etc/rc.d сценарий samba.sh автономно отвечал за запуск/останов необходимых сервисов и после установки не был исполняемым, а также создавался как пример (samba, sh. sample), то теперь он устанавливается как исполняемый (executable), не требует переименования и зависит от конфигурационного файла /etc/ re. conf. Итак, для возможности автоматического запуска сервисов, необходимых для работы Samba во время старта системы, требуется внести ряд изменений в главный конфигурационный файл /etc/rc. conf. Как правило, достаточно добавить строку: samba_enable="YES" Для более гибкого контроля запускаемых даемонов используйте такие строки: nmbd_enable="YES" smbd_enable="YES" # следующую строку можно заккоментировать, если сервис не нужен winbindd_enable="YES" Следует отметить, что без добавления вышеприведенных строк будет невозможно обратиться к сценарию samba. sh с помощью следующих команд: /usr/local/etc/re.d/samba.sh start /usr/local/etc/rc.d/samba.sh restart /usr/local/etc/rc.d/samba.sh stop /usr/local/etc/rc.d/samba.sh status Впрочем, это — ограничение только самого сценария samba . sh. Запуск необходимых даемонов можно произвести, вызвав их поочередно из командной строки:
670 Глава 24. Связь с Windows. Использование пакета SAMBA /usr/local/sbin/smbd -D /usr/local/sbin/nmbd -D /usr/local/sbin/winbindd Заметим, что передача параметра -D программам smbd и nmbd позволяет запустить их в режиме даемона, a winbindd запускается как даемон по умолчанию. Запуск в режиме даемона означает, что при любом SMB-запросе сервис, которому этот запрос направлен, автоматически создает дочерний процесс для обработки. До запуска Samba в системе должен присутствовать файл smb.conf, в противном случае запуск необходимых сервисов будет невозможен: it /usr/local/etc/rc.d/samba . sh start /usr/local/etc/rc.d/samba.sh: WARNING: /usr/local/etc/smb.conf is not readable. Аналогично, если во время работы Samba удалить файл smb.conf и попытаться остановить сервис, то это приведет к возникновению ошибки. К слову, любые изменения, внесенные в конфигурационный файл системы Samba, практически сразу же применяются без перезапуска сервисов. Это объясняется тем, что система сама периодически (каждую минуту) считывает файл smb. conf. Но есть одно "но"! Новые параметры не вступят в силу для тех пользователей, которые уже подключены. Если изменения критичны, выполните перезагрузку полностью всех сервисов, что приведет к отключению всех клиентов. Упомянем немного об nmbd. Как отмечалось ранее, именно этот сервис отвечает за построение, хранения и использования списка машин в сети. Даемон nmbd выполняет роль WINS-сервера, если это определено в конфигурационном файле smb.conf. При этом в локальной сети используются широковещательные посылки по протоколу UDP, для работы же WINS используется протокол TCP. О том, как заставить сервер Samba работать в качестве WINS-сервера, речь пойдет чуть позже, сейчас же отметим, что таблица сопоставлений имен и адресов хранится в файле /var/db/samba/wins .dat и имеет приблизительно такой вид: й more /var/db/samba/wins.dat VERSION 1 0 "MOBILEttOO" 1116517261 192.168.0.200 66R "MOBILE#03" 1116517261 192.168.0.200 66R "MOBILE#20" 1116517261 192.168.0.200 66R "MSHOMEttOO" 1116517261 255.255.255.255 e4R "MSHOMEttle" 1116517261 255.255.255.255 e4R В случае, когда Samba настроен на работу в качестве главного обозревателя сети, все данные будут храниться в файле /var/db/samba/browse. dat, который имеет несколько иной вид: # more /var/db/samba/browse.dat "MSHOME" сОООЮОО "MOBILE" "MSHOME" "MOBILE" 40059a03 "Samba 3.0.14a" "MSHOME" "INFORMEX" 40011203 "Win2k workstation" "MSHOME" При каждом перезапуске сервиса nmbd оба файла будут перестраиваться заново. Простейший файл smb.conf Как было упомянуто ранее, прежде, чем впервые запустить сервер Samba, необходимо создать файл smb.conf, но и его наличие в системе не обозначает нормальную работу сервера Samba. Для начала, создадим файл smb.conf как показано в листинге 24.1, который будем в дальнейшем изменять и добавлять новые строки.
Запуск 671 Листинг 24.1. Пример самого простого файла smb. conf. [global] workgroup = MSHOME security = share В данном случае директива [global] указывает на начало блока описания глобальных параметров сервера Samba. За ним следуют строки описания функциональных возможностей и характеристик. Строка workgroup = MSHOME служит для описания рабочей группы (домена), в которую будет включена машина (в данном случае — MSHOME). Следующая строка security = share описывает метод контроля доступа к серверу и ресурсам. В данном случае выбран метод, применяемый по умолчанию в системах Windows 9х, когда доступ контролируется на уровне ресурсов. Имя машины будет совпадать с коротким именем машины, усеченным до 15 символов, как было показано ранее. Если требуется изменить это имя, добавьте строку следующего вида: netbios name = PCNAME После создания файла smb. conf попробуйте впервые запустить сервер Samba: # /usr/local/etc/rc.d/samba.sh start Starting SAMBA: removing state tdbs : Starting nmbd. Starting smbd. Обратите внимание на то, что система еще не имеет таблиц состояния (state tbds). Перед запуском или перезапуском сервера проверяйте файл smb. conf на корректность. Для этого служит утилита testparm: # testparm / Load smb config files from /usr/local/etc/smb.conf params.с:Parameter() - Ignoring badly formed line in configuration file: badline Loaded services file OK. Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions tt Global parameters [global] workgroup = MSHOME security = SHARE Но подробнее об этом мы поговорим чуть позже. Система SWAT SWAT — это утилита Web-управления пакетом Samba. Она запускается с использованием суперсервера inetd, и является простым средством создания и изменения конфигурационного файла smb. conf. Как и для любой другой программы, запускаемой с использованием inetd, необходимо внести соответствующие изменения в файл /etc/inetd.conf. Однако в первую очередь следует проверить наличие в файле /etc/services следующей строки: # more /etc/services | grep swat Swat 901/tcp # samba web configuration tool Если °на отсутствует, добавьте ее. Как видно из этого примера, SWAT использует ТСР-порт 901. Затем необходимо проверить, существует ли запись для системы SWAT в файле/etc/inetd.conf:
672 Глава 24. Связь с Windows. Использование пакета SAMBA # more /etc/inetd.conf t grep swat H (from the Samba documentation). Enable the third entry to enable the swat fswat stream top nowait/400 root /usr/local/sbin/swat swat Как видно из этого примера, в FreeBSD уже присутствует закомментированная строка, с помощью которой (сняв комментарии) можно произвести запуск системы SWAT, используя суперсервер inetd. Снимите комментарии или добавьте в файл /etc/inetd. ccnf следующую строку: swat stream сер nowait/400 root /usr/local/sbin/swat swat К СЛОВУ... В файле /etc/inetd.conf присутствуют закомментированные строки, позволяющие запуск сервисов smbd и nmbd из-под суперсервера inetd. Тем не менее, использовать такой способ запуска этих сервисов не рекомендуется, как. впрочем, и запускать систему SWAT. Далее перезапустите даемон суперсервера inetd (если сервис был запущен): # killall -HUP inetd Теперь откройте браузер и попробуйте перейти по адресу http: //localhost: 901. Использовать нелокальную машину не рекомендуется: система SWAT запрашивает имя пользователя и пароль из локальной базы пользователей системы (рис. 24.3), что может привести к их перехвату в случае использования для доступа к системе SWAT другого сетевого компьютера. Работать с системой SWAT можно только после успешной авторизации. В распоряжение пользователя предоставляется довольно удобный интерфейс управления содержимым файла smb.conf. С его помощью можно настроить глобальные параметры; подробно описать общедоступные ресурсы и принтеры; просмотреть статус сервера Samba, список подключенных клиентов (с возможностью отключения) и текущее содержимое файла smb. conf; перезапустить при желании даемоны smbd, nmbd и winbindd (рис. 24.4). Тем не менее, несмотря на все удобство, "прозрачность" и простоту, использовать SWAT не рекомендуется — в первую очередь из-за нарушения политики безопасности, а точнее — необходимости запуска суперсервера inetd. Во-вторых, использование SWAT иногда может привести к ошибкам в настройке общедоступных ресурсов, что обусловлено, как правило, особенностями Web-браузеров. Дачее будет рассмотрена настройка сервера Samba без использования SWAT. \ ■ ■•а«ни Сервер Сообщение Имя Пароль localhost SWAT |:оо1 |*~**"— Г" Запомнить «. \Ал А пароль Отменить J Рис. 24.3. Окно с требованием авторизации пользователя перед началом работы с утилитой SWAT НАСТРОЙКА СИСТЕМЫ SAMBA Перейдем непосредственно к настройке сервера Samba. В данном разделе мы рассмотрим общие понятия, имеющие отношение к файлу smb. conf, формат этого файла, спо-
Настройка системы Samba 673 собы предоставления в общее пользование ресурсов и управления доступом пользователей. tf»-.-,- . оии»гэ« Файл Правил Вне Кми1*ач»в Закладки Пел* £b*i Teoli 0*иО 0<i*e*L» i_ Ы о Ч j? -* _^ j ОтксыТъ CvJpaHriib Печать Нантн Дгмой Panel* Мозаика Каскад ^.5 BUY OPERA TODAYT Ало make Ms banner go a*>y <1 .OPERA C03fi.llb СТРИН1ГЦГ | S4'nb9'.%-4hArlminiSlr4 Щ **--*--• - "t | пер jlstamotf *01 /glot-a* Ml»* Qui»! ~3 I xl'M. <0 "3 HOUC Ф CIOBAL3 SHARES РПЮТЕЛА У/ II 3 WtfARD И STATUS VIEW PASSWORD Global Parumrit r> I CTuiiintVir'ts (* Banc f AdvuM»d Си»теЯ Eli«*t«l | R«rtV»1vw | Bwffrtitti Ulta ШЬ tifV Hei» Нед leibi IttttHDI 1ИПС nttbioi alufti atrvti tliuig ■nlcffacM [■.lOSliK [5 *ЛЪЛ j 0 1-1» r |sn«AC С] i«: IWS «Wi entUiod* | ijgla «nCIJ-pT purvtwdr l>« ^»l 5«1Р«Гд.М I [tiifll ] [Догуиент I ■ OpenQfftco or? [ [Торнимап) I £ Samba Web AdmiivstratHjn Tpi США «ф 15:54 Рис. 24.4. Вид утилиты Web-управления пакетом Samba в окне браузера Opera Файл smb.conf Как упоминалось ранее, настройка системы Samba, как правило, сводится к редактированию одного файла — smb. conf. В некоторых случаях требуется изменить также и другие системные файлы. Для получения подробной информации просмотрите страницу документации man smb. conf. Структура файла Файл smb.conf состоит из нескольких блоков, по аналогии с файлами *.ini в системах Windows. Как правило, каждый блок описывает один ресурс. Начало блока — это имя ресурса, заключенное в квадратные скобки [ ], например, [ home ]. За ним следуют строки опций, относящиеся к данному блоку, вплоть до начала следующего блока или конца файла. В файле smb. conf присутствует три специфических блока: [global] — отвечает за глобальные настройки системы и не описывает никаких общедоступных ресурсов, однако может переопределять значения, применяемые по умолчанию для всех общедоступных ресурсов; [printers] —описывает настройки общедоступных принтеров; [homes] — используется для создания общедоступных ресурсов "на лету". При этом для пользователя root будет создан общедоступный ресурс под именем root, который будет совпадать с домашней директорией пользователя root
674 Глава 24. Связь с Windows. Использование пакета SAMBA (/root). Если к компьютеру будет подключен пользователь с именем master, то "на лету" будет создан общедоступный (но видимый только этому пользователю) ресурс master, совпадающий с домашней директорией пользователя master (например, /home /master). Строки опций имеют формат: имя_опции = значение При этом имяопции — это строго определенное и заранее оговоренное поле, а поле значение может содержать данные из заранее определенного списка значений или же варьироваться на ваше усмотрение. Некоторые строки опций являются взаимозаменяемыми. Например, можно использовать как строку public = Yes, так и строку вида guest ok = Yes, или же вместо writable = Yes использовать read only = No. Обратите внимание на использование знака пробела. В поле имяопции использование нескольких знаков пробела подряд (например, guest ok) не является ошибкой, и все лишние пробелы будут отброшены, однако рекомендуется использовать имена общепринятого вида с одним пробелом между словами. Также не имеет значения количество пробелов между знаком "=" и первым символом поля значение. Если значение — это строка с пробелами, то ее следует заключить в двойные кавычки (""). Отметим, что использование кавычек в поле имяопции является ошибкой. Иногда бывает необходимо перечислить список значений, которые может принять опция. Для разделения значений в списке используется пробел или запятая, причем в некоторых случаях должен применяться только один из способов: netbios name = MOBILE netbios aliases = SERVER SMBDOMAIN SMBSRV Обратите внимание на использование больших и малых символов. Как правило, регистр символов значения не имеет, и следующие строки будут правильно интерпретированы сервером: [global] Workgroup = MsHOME security = sHaRe NetbioS NamE = moBILE encrYpt passwords = YeS 10CA1 MAStER = yes Тем не менее, представленная ниже строка будет ошибочной, и клиент не получит доступ к общедоступному ресурсу (рис. 24.5), поскольку объявленной директории в системе не существует: path = /Root В файле smb.conf разрешено использовать неограниченное количество комментариев. Строка комментария начинается с символа # или точки с запятой (;). Очень важно запомнить, что строки комментариев всегда должны начинаться с новой строки и не могут располагаться в одной строке с опцией. Обратите внимание на представленный ниже пример: mobile# more /usr/local/etc/smb.conf [global] ГмоЬЙе jxj Нет доступа к \\Mobile\errordir. Не найдено сетевое имя. ОК Рис. 24.5. Ошибка на клиентском компьютере Windows 2000 в случае попытки доступа к ресурсу с неправильно указанным путем
Настройка системы Samba 675 workgroup = MSHOME ; Ошибка security = user netbios name = mobile encrypt passwords = Yes local master = Yes [homes] comment = Home Directories browseable = no writable « yes mobile# more /var/db/samba/browse.dat "MSHOME ; Ошибка" сОООЮОО "" "MSHOME ; Ошибка" "MOBILE" 40019a03 "Samba 3.0.14a" "MSHOME ; Ошибка" Использование переменных Зачастую бывает удобно использовать переменные. Это позволяет гибко настроить сервер в зависимости от потребностей и требований. К примеру, каждому пользователю можно предоставлять собственную домашнюю директорию, вести для каждой машины отдельный log-файл и т.д. Список возможных переменных представлен в табл. 24.3. Таблица 24.3. Переменные, которые можно использовать в файле smb. conf Файл %а %1 %т %М %и %Н «д %S %Р %h %L %v %d %R %T %D %$enwar Описание Тип операционной системы клиента IP-адрес клиента NetBIOS-имя клиентского компьютера DNS-имя клиентского компьютера Имя пользователя, используемое на клиентском компьютере для доступа к системе Домашняя директория пользователя системы (для пользователя %и) Имя основной группы для пользователя %и Имя текущего ресурса Домашняя директория для ресурса %s DNS-имя сервера, на котором работает Samba NetBIOS-имя сервера, на котором работает Samba Версия пакета Samba Идентификатор текущего процесса для сервера Samba Используемый протокол (CORE, COREPLUS, LANMAN1, LANMAN2 или NT1) Текущие дата и. время Имя домена или рабочей группы пользователя Значение переменной среды enwar Пример использования (для каждой машины можно использовать собственный файл с настройками): [pchome] comment = PC Home Directories include = /usr/local/etc/smb.conf. %m Включение файлов и использование шаблонов Звучит парадоксально, но с одной стороны настройка файла smb. conf — это довольно сложный процесс, а с другой — простой и гибкий. Рассмотрим некоторые возможности, позволяющие говорить о гибкости настройки.
676 Глава 24. Связь с Windows. Использование пакета SAMBA ИсПОЛЬЗОВаНИе ОПЦИИ config file Глобальная опция config file = path to file позволяет использовать для настройки сервера другой конфигурационный файл. При этом, если указанный файл существует, то для настройки будет использован именно он, в случае же его отсутствия процесс будет запущен с параметрами, описанными в текущем файле. Наиболее часто такой подход применяют, если необходимо вести отдельные файлы для нескольких машин в сети. Пример использования опции config file: [global] { -. } config file = /usr/local/etc/smb.conf.%m { ... } ИсПОЛЬЗОВаНИе ОПЦИИ include Пример использования этой опции уже рассматривался выше. Напомним, что она позволяет подключить файл таким образом, что его содержимое будет считаться неотъемлемой частью текущего файла. При этом опции из данного файла будут переопределять опции определенные ранее. Отсутствие подключаемого файла к возникновению ошибки не приводит. В подключаемом файле разрешено использовать переменные, за исключением %u, %S и %Р. Использование опции сору Опция сору = other share name позволяет скопировать все опции из другого блока (шаблон), имя которого задано в качестве значения. Отметим, что упоминаемый блок, используемый для копирования, должен быть определен ранее. Пример использования данной опции: [template] writable = yes browsable = no guest ok = yes hide dot files = No create mask = 0777 path = /home/%S [depot] copy = template browsable = yes [pub] copy = template browsable = yes Посмотрим, что выдаст в данном случае утилита testparm: # testparm -v ( ... } [template] path = /home/%S read only = No create mask = 0777 guest ok = Yes hide dot files = No browseable » No [depot] path = /home/%S read only = No
Настройка системы Samba 677 create mask = 0777 guest ok = Yes hide dot files = No copy = template [pub] path = /homeAS read only = No create mask = 0777 guest ok = Yes hide dot files = No copy = template При этом все опции, где бы они ни находились в новом блоке, переопределяют опции из копируемого блока (шаблона). Управление доступом Последовательность настройки будет сильно отличаться в зависимости от ваших потребностей. В первую очередь необходимо определиться с управлением доступом. Аутентификация Samba поддерживает четыре типа обеспечения безопасности: На уровне ресурсов. Глобальная опция security = share. При этом любой пользователь получает доступ к серверу и всем ресурсам без всякой аутентификации по имени пользователя и паролю. В данном случае за контроль доступа отвечает только опция hosts allow, где перечислены IP-адреса разрешенных машин. Однако в данном случае не все так просто. В действительности любой пользователь проходит авторизацию. Если в файле smb.conf присутствует опция guest only, то все пользователи в системе считаются "гостями", при этом проверяется значение опции guest account = system username. Некоторые общедоступные ресурсы могут быть защищены на доступ по пользователям. При этом, если "гость" успешно входит в данный ресурс как разрешенный пользователь, то далее при работе со всеми ресурсами он больше не будет считаться "гостем". Используйте данный тип предоставления доступа в крайних случаях, поскольку он основан на списке системных пользователей. На уровне пользователей. Опция security = user. В данном случае при установке соединения с сервером клиент предоставляет имя пользователя и пароль, на основании которых сервер предоставляет или запрещает доступ к ресурсам. Список пользователей хранится в файле /usr/local/private/smbpasswd. В этот файл могут быть добавлены системные пользователи. При этом пароль Samba-пользователя может совпадать с паролем Unix-пользователя, а может и отличаться (в системе Samba присутствует понятие синхронизации паролей, и в данном случае синхронизацию потребуется отключить). При использовании данного типа контроля доступа обратите внимание на опцию encrypt passwords, которая по умолчанию принимает значение Yes. Некоторые старые операционные системы, такие как Windows 95 или Windows NT до версии 4 с Service Pack 3, передавали пароли по сети в явном виде. В таком случае необходимо позаботиться о проверке типа операционной системы (%а) или имени машины (%т) и подмене конфигурационного файла с опцией encrypt passwords = no, используя рассмотренную ранее опцию config file (например, config file = /usr/local/etc/smb.%a). Обратите внимание на то, что даже если пользователь не сможет получить доступ к вашей системе, можно настроить автоматическое присвоение ему статуса "гостя" и предоставить возможность доступа к некоторым несекретным общим ресурсам.
678 Глава 24. Связь с Windows. Использование пакета SAMBA На уровне сервера. Опция security = server. Этот тип напоминает тип обеспечения безопасности на уровне пользователей, однако в данном случае за аутентификацию отвечает другой сервер (Samba или Windows). При попытке доступа к общедоступному ресурсу сервер проверяет, может ли пользователь быть опознан на другом сервере, и в случае успеха предоставляет доступ к своим ресурсам. В случае использования такого типа обеспечения безопасности в конфигурационном файле smb.conf необходимо перечислить все серверы (опция password server), отвечающие за аутентификацию пользователей, используя при этом их NetBIOS-имена: [global] security = server password server = w2000server smbserver otherserver На уровне домена. Опция security = domain, security = user или security = ads. В данном случае сервер Samba может выступать как член Windows-домена или в качестве сервера PDC. При этом все пользователи и пароли хранятся в базе данных, называемой SAM. Пользователи получают доступ к ресурсам в соответствии с именем, введенным при аутентификации в домене. Когда сервер Samba необходимо настроить как PDC для некоего домена, используется опция security = user. Если компьютер настраивается как клиент Active Directory, то используется опция security = ads и конфигурируется система Kerberos5 (файл /etc/krb5 .conf). В случае настройки сервера Samba как клиента домена Windows NT/2000, используйте опцию security = domain. Краткое описание некоторых опций контроля доступа encrypt passwords — глобальная опция, принимает значение по или yes. Отвечает за возможность включения или отключения шифрования паролей при пересылке по сети. smb passwd file — глобальная опция; указывает путь к файлу, в котором хранится список пользователей и паролей Samba (по умолчанию имеет значение /usr/local/samba/private/smbpasswd). unix password syne — глобальная опция; указывает на необходимость синхронизации паролей Samba с системными паролями; принимает значение yes или по. passwd chat — последовательность команд, передаваемых программе изменения пароля (по умолчанию, *old*password* %o\n *new*password* %n\n *new*password* %n\n *changed*). null passwords — глобальная опция, разрешающая вход пользователей с пустым паролем. update encrypted — глобальная опция; при установке значения yes указывает изменять файл с шифрованными паролями в случае, когда пользователь входит в систему, используя пароль в явном виде. invalid users — список пользователей, которым будет отказано в доступе к ресурсу. path — опция, используемая при описании ресурсов; позволяет задать системную директорию. comment — комментарий к общедоступному ресурсу, writable — определяет, доступен ли ресурс на запись. admin users — список пользователей, которые будут иметь доступ как пользователь root. valid users — список пользователей, имеющих возможность доступа к ресурсу, read list — список пользователей, имеющих доступ только на чтение к ресурсу с правом на запись.
Настройка системы Samba 679 wr±te list — список пользователей, имеющих право чтения и записи в ресурсе, доступном только для чтения browsable — определяет видимость ресурса для пользователей, guest ok — определяет, разрешен ли доступ для гостевых пользователей, guest account — пользователь системы, используемый для доступа "гостей", guest only — если установлено значение yes, то доступ к ресурсу смогут получить только гостевые пользователи. username map — позволяет указать файл, в котором хранится список сопоставлений имен групп и пользователей системы FreeBSD с именами и группами Windows (пароли должны совпадать). Пример одной записи из такого файла: root = Admin Administrator Глобальные опции управления сервером netbios name — NetBIOS-имя машины, workgroup — имя рабочей группы или домена. server string — строка описания машины (можно использовать переменные), netbios aliases — описание альтернативных имен машины, которые используются для создания виртуальных серверов. Пример использования: [global] netbios aliases = smbserver accounting include = /usr/local/etc/smb.conf.%L time server — разрешение серверу выступать в роли сервера времени, client code page — установка кодовой страницы, используемой клиентами, character set — перевод кодовой страницы в один из альтернативных символьных наборов Unix. announce as — по умолчанию, Samba анонсирует себя как NT-сервер версии 4.9. Можно использовать значения "NT Server" (NT). "NT Workstation", "Win95","WfW" announce version — указание серверу Samba анонсировать версию. По- умолчанию, используется значение 4 . 9. Если, не изменяя значение announce as, изменить значение данной опции на 4 .0, то сервер Samba будет представлен в сети как Windows NT 4.0 Server. Значению 5.0 соответствует Windows 2000 Server, а значению 5.1 — Windows Server. os level — установка уровня претензии сервера на роль главного обозревателя сети. Чем выше значение, тем больше шансов на успех. Предоставление доступа к ресурсам Для предоставления доступа к ресурсам необходимо описать блок ресурса приблизительно следующего вида: [depot] comment = Documents Repository path = /home/depot . writable = yes browsable = yes printable = no hide dot files = No create mask = 0777 guest ok = yes
680 Глава 24. Связь с Windows. Использование пакета SAMBA Благодаря этому, любой клиент, получающий доступ к серверу, будет видеть общедоступный ресурс depot в общем списке SMB-ресурсов машины. Данная директория будет доступна для чтения и записи всем пользователям и даже "гостям" (если таковым будет предоставлена возможность получать доступ к самому серверу). Как правило, настройка ресурсов имеет множество нюансов и может вызвать головную боль ©. Изучение всех возможностей предоставляется читателю. Простые примеры настройки Опишем коротко несколько примеров настройки сервера Samba в зависимости от поставленных задач. Настройка простого файлового сервера В первую очередь создадим файл, содержание которого примерно соответствует листингу 24.2. Листинг 24.2. Пример конфигурационного файла smb.conf для настройки Samba как простого файлового сервера рабочей группы .: [global] ; описание сервера server string = Local Samba Server ; рабочая группа workgroup = MSHOME security = user ; имя машины netbios name = mobile encrypt passwords = Yes local master = Yes master browser = yes prefferred master = yes os level = 65 ; анонсировать как Windows 2000 Server announce version = 5.0 ; функционировать как WINS сервер wins support = yes map to guest = Never [homes] comment = Home Directories browseable = no writable = yes ; общедоступный ресурс [depot] writable = yes browsable = yes hide dot files = No create mask = 0777 path = /home/depot comment = Documents Repository Поскольку был выбран тип безопасности security = user, создадим пользователей, которым будет предоставлен доступ к домашним директориям. Заметим, что к машине запрещен доступ "гостей". По этой причине была добавлена опция map to guest = Never (в действительности, это — значение, установленное по умолчанию).
Настройка системы Samba 681 Создадим необходимые учетные записи и пароли. Предположим, что у нас есть три пользователя: Таня (tan), Катя (ket) и Миша (mih), — и их учетные записи уже присутствуют в системе FreeBSD. Разрешим их использование сервером Samba: mobile# smbpasswd -a tan New SMB password: Retype new SMB password: Added user tan. mobile* smbpasswd -a ket New SMB password: Retype new SMB password: Added user ket. mobile# smbpasswd -a mih New SMB password: Retype new SMB password: Added user mih. Предположим, что все клиентские компьютеры укомплектованы операционной системой Windows 2000 Professional. Теперь при попытке доступа пользователя из сетевого окружения к машине mobile в рабочей группе MSHOME будет запрашиваться имя пользователя и пароль. Введя одно из вышеупомянутых имен и правильный пароль, пользователь будет получать доступ к ресурсу depot и своей домашней директории, в противном случае будет снова выдан запрос на ввод имени пользователя и пароля, пока не будут введены правильные данные. Настройка Samba как контроллера домена Кратко опишем настройку Samba как основного контроллера домена. В первую очередь создадим файл smb. conf приблизительно соответствующий листингу 24.3. Листинг 24.3. Пример конфигурационного файла sab. conf для настройки Samba как ;- контроллера домена . , [global] netbios name = mobile workgroup = MSHOME encrypt passwords = yes 'domain master = yes local master = yes preferred master = yes os level = 65 announce version = 5.0 security = user domain logons = yes unix password sync = yes passwd program = /usr/bin/passwd %u wins support = yes add user script = /usr/sbin/pw useradd %u delete user script = /usr/sbin/pw userdel %u add group script = /usr/sbin/pw groupadd %g delete group script = /usr/sbin/pw groupdel %g add machine script = /usr/sbin/pw user add %u -d /dev/null -g samba -s /sbin/nologin time server = yes admin users = root informex ; для клиентов NT/2000/XP logon path = \\%L\profiles\%u logon script = usrlogon.bat logon drive = H:
682 Глава 24. Связь с Windows. Использование пакета SAMBA Листинг 24.3. Окйнна^йе ; три обязательных ресурса [netlogon] comment = Network Logon Service path = /home/smb-netlogon guest ok = yes writable = no browsable = no share modes = no [Profiles] path = /home/smb-profiles browsable = yes writable = yes guest ok = yes create mask = 0600 [homes] writable = yes browsable = no guest ok = no ; общедоступный ресурс [depot] comment = Documents Repository path = /home/depot writable = yes browsable = yes create mask = 0777 Далее создаем необходимые директории: # mkdir /home/smb-netlogon # chmod 775 /home/smb-netlogon # mkdir /home/smb-profiles # chmod 777 /home/smb-profiles Создадим файл usrlogon. bat следующего содержания (в формате MS-DOS): net time Wmobile /set /yes net use H: /home Сохраним его в директории /home/smb-netlogon и изменим права доступа: # chmod 0777 /home/smb-netlogon/usrlogon.bat Добавляем необходимых пользователей в домен: ft smbpasswd -a informex New SMB password: Retype new SMB password: Added user informex. # smbpasswd -a tan New SMB password: Retype new SMB password: Added user tan. # smbpasswd -a ket New SMB password: Retype new SMB password: Added user ket. # smbpasswd -a mih New SMB password: Retype new SMB password:
Настройка системы Samba 683 Added user mih. Заметим, что учетные записи для NT-машин будут создаваться в системе автоматически благодаря опции add machine script (создайте перед этим группу samba). После этого можно перезапустить сервер Samba и приступить к добавлению клиентских машин в созданный домен. Настройка Samba как члена Active Directory (Windows 2000) Опишем настройку пакета Samba как члена домена. Примем, что у нас есть домен MSHOME (mshome. local) с одним сервером ALTERSRV с IP-адресом 192.168.0.I0. Используемая операционная система — Windows 2000 Server. Этот же сервер выступает в роли WINS-сервера. В первую очередь позаботимся о видимости сервера домена MSHOME для нашей машины FreeBSD с пакетом Samba, добавив в файле /etc/host следующую строку: 192.168.0.10 altersrv altersrv.mshome.local Затем, как правило, необходимо позаботиться о правильном использовании DNS. Для этого добавим в файл /etc/resolv.conf следующие строки (в каждом конкретном случае огни будут выглядеть по-разному): domain mshome.local search mshome.local nameserver 192.168.0.10 Так как мы будем использовать Active Directory, необходимо позаботиться о правильности настройки системы Kerberos5. Прежде чем приступить к настройке, необходимо проверить версию установленного в системе пакета Heimdal. Для успешной работы желательно иметь версию выше 0.6 (в примере использовалась последняя на момент написания главы версия 0.6.3): mobile# /usr/libexec/kdc -v kdc (Heimdal 0.6.3) Copyright 1999-2004 Kungliga Tekniska HJKgskolan Send bug-reports to heimdal-bugs@pdc.kth.se Теперь можно переходить к настройке самой системы Kerberos5. Создадим файл /etc/krb5.conf в соответствии с листингом 24.4. Листинг 24.4. Пример файла /etc/krb5. cohf для возможности работы пакета Samba как клиента Active Directory (Windows 2000) ■ [libdefaults] default_realm = MSHOME.LOCAL default_tgs_enctypes - des-cbc-crc des-cbc-md5 default_tkt_enctypes ~ des-cbc-crc des-cbc-md5 permitted_enctypes = des-cbc-crc des-cbc-md5 ticket_lifetime = 360000 forwardable = true proxiable = true dns_lookup_realm = true dns_lookup_kdc = true [doma i n_rea1ms] .mshome.local = MSHOME.LOCAL mshome.local = MSHOME.LOCAL [realms] MSHOME.LOCAL = {
684 Глава 24. Связь с Windows. Использование пакета SAMBA Листинг24.4. Окончание л ■'">'• ■: kdc = altersrv.mshome.local:88 admin_server = altersrv.mshome.local default_domain = mshome.local ) [appdefaults] pam = { debug = false ticket_lifettfne = 360000 renew_lifetime = 360000 forwardable = true krb4_convert = false _} Затем необходимо выполнить регистрацию на сервере Kerberos и получить "билет" (ticket). Обратите внимание, что система Kerberos очень чувствительна к системному времени, поэтому, во избежание ошибок, прежде всего позаботьтесь о синхронизации времени на машинах. Для регистрации используется команда kinit, а проверить наличие "билета" можно с помощью команды klist: mobile* kinit AdministratorSMSHOME,. LOCAL Administrator@MSHOME.LOCAL'S Password: kinit: NOTICE: ticket renewable lifetime is 1 week mobile# klist Credentials cache: FILE:/tmp/krb5cc_0 Principal: AdministratordMSHOME.LOCAL Issued Expires Principal May 23 15:04:32 May 24 01:04:32 krbtgt/MSHOME.LOCALdMSHOME.LOCAL Затем создадим файл smb. conf в соответствии с листингом 24.5. Листинг 24.5. Пример конфигурационного файла sob. conf для настройки пакета Samba как клиента Active Directory (Windows 2000) [global] dos charset = 866 unix charset = KOI8-R ; dn% домена Active Directory ; совпадает с указанным в файле /etc/krb5.conf realm = MSHOME.LOCAL server string = Local Samba Server , netbios name = mobile ; NetBIOS-имя домена workgroup = MSHOME encrypt passwords = yes announce version = 5.0 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 ; сценарий автоматического добавления пользователей домена ; в локальную базу пользователей (добавляются без пароля, ; что фактически означает невозможность их локального входа) add user script = /usr/sbin/pw useradd %u -d /home/%u -g users -m ; используемый тип обеспечения безопасности, ; можно также использовать значение domain security = ads password server = * ; password server = altersrv case sensitive = no
Настройка системы Samba 685 Листинг И.5.Ьк6нчанй# '■..'.-■, '*';- v .:А-.' ""'■■ \ allow trusted domains = no unix password sync = yes passwd program = /usr/bin/passwd %u wins server = 192.168.0.10 ' winbind uid = 10000-20000 winbind gid = 10000-20000 winbind enum groups = yes winbind enum users = yes winbind use default domain = yes ; winbind separator = + name resolve order = wins beast host [homes] browseable = no comment = Home Directory for '%u' writable = yes [depot] comment = Documents Repository path = /home/depot writable = yes browsable = yes create mask = 0777 Итак, файл создан. Проверим правильность составления и отсутствие ошибок: mobile# testparm Load smb config files from /usr/local/etc/smb.conf Processing section "[homes]" Processing section "(depot]" Loaded services file OK. Server role: ROLE_DOMAIN_MEMBER Press enter to see a dump of your service definitions 1 ... } Теперь можно переходить непосредственно к включению машины в домен Active Directory. Для этого необходимо воспользоваться утилитой net (к слову, эта утилита предоставляет довольно большие возможности управления). Поскольку мы уже прошли проверку и получили "билет", для включения в домен можно не указывать имя и пароль пользователя из группы администраторов, а также нет надобности указывать домен, в который будет включен наш сервер: mobile# net ads join Using short domain name — MSHOME Joined "MOBILE" to realm 'MSHOME.LOCAL" Итак, включение машины прошло успешно. Теперь результат можно просмотреть на сервере ALTERSRV. В списке машин домена появится запись для данного компьютера (в нашем случае — mobile). Теперь проверим доступность сервера ALTERSRV, используя систему аутентификации Kerberos5 (ключ -к): mobile! smbclient -L altersrv -к OS=[Windows 5.0] Server=[Windows 2000 LAN Manager] Sharename Type Comment IpC$ IPC Удаленный IPC
686 Глава 24. Связь с Windows. Использование пакета SAMBA D$ Disk Стандартный общий ресурс NETLOGON Disk Общий сервер входа ADMIN$ Disk Удаленный Admin SYSVOL Disk Общий сервер входа С$ Disk Стандартный общий ресурс OS»[Windows 5.0] Server=(Windows 2000 LAN Manager] Server Comment Workgroup Master В случае успешного результата можно запустить пакет Samba, а если он был запущен — перезапустить (будут заново созданы все файлы таблиц *. tbs в каталоге /usr/local/private и/var/db/samba). Проверим доступность списка всех пользователей и машин в домене, а также списка групп на просмотр: mobile# wbinfo -u administrator inform guest tsinternetuser iusr_altersrv iwam_altersrv krbtgt mobile$ altersrv$ mobile* wbinfo -g BUILTIN/system operators BUILTIN/replicators BOILTIN/guests BUILTIN/power users BOILTIN/print operators BUILTIN/administrators BUILTIN/account operators BUILTIN/backup operators BUILTIN/users компьютеры домена контроллеры домена t администраторы схемы администраторы предприятия издатели сертификатов domain admins domain users domain guests владельцы-создатели групповой политики dnsupdateproxy домене Также должны быть доступны две команды получения подробной информации о ене: # net ads info LDAP server: 192.168.0.10 LDAP server name: altersrv Realm: MSHOME.LOCAL Bind Path: dc=MSHOME,dc-LOCAL LDAP port: 389 Server time: Mon, 23 May 2005 15:38:17 GMT
Настройка системы Samba 687 KDC server: 192.168.0.10 Server time offset: 5 # net ads status accountExpires: 9223372036854775807 badPasswordTime: 0 badPwdCount: 0 codePage: 0 en: mobile countryCode: 0 dNSHostName: mobile instanceType: 4 isCriticalSystemObject: FALSE lastLogoff: 0 lastLogon: 127613254594993750 logonCount: 4 4 { ... } distinguishedName: CN=mobile,CN=Computers,DC=mshome,DC=local objectCategory: CN=Computer,CN=Schema,CN=Configuration,DC-mshome,DC=local objectClass: top objectClass: person objectClass: organizationalPerson objectClass: user objectClass: computer objectGUID: e8eccaa4-bd43-4c03-af7f-a9642a51ef63 objectSid: S-l-5-21-1454471165-1972579041-839522115-1109 operatingSystem: Samba operatingSystemVersion: 3.0.14a primaryGroupID: 515 pwdLastSet: 127613251770462500 name: mobile sAMAccountName: mobile$ sAMAccountType: 805306369 i - > whenChanged: 20050523123257.0Z whenCreated: 20050523123256.0Z Итак, в результате мы получили возможность использовать сервер FreeBSD с пакетом Samba в качестве файлового сервера с проверкой доступа пользователей, используя базу данных пользователей домена MSHOME (mshome. local). При попытке доступа любого пользователя Samba будет пытаться соединиться с серверами домена для получения списка пользователей. Если пользователь есть в домене, то для него создается учетная запись на локальной машине и предоставляется доступ. Если пользователь уже есть в локальной базе пользователей, то Samba просто проверяет пароль такого пользователя, используя один из серверов домена Active Directory. Определенным образом изменив окружение системы FreeBSD и конфигурационный файл smb. conf, можно добиться возможности локального входа пользователей домена подобно тому, как это было рассмотрено для системы N1S. Дальнейшее изучение возможностей настройки пакета Samba предоставляется читателю. Отметим лишь, что ACL поддерживаются только при установке пакета Samba на системах версий FreeBSD 5.x. Настройка пакета Samba для работы как клиента Active Directory (security = ads) подразумевает настройку системы Kerberos5, и желательно наличие обновленного пакета Heimdal (присутствует в коллекции портов /usr/ ports/security/heimdal) версии выше 6.0. В конце концов, настройка пакета Samba в среде FreeBSD 4.x для функционирования в качестве клиента Active Directory может оказаться "головной болью", и в боль-
688 Глава 24. Связь с Windows. Использование пакета SAMBA шинстве случаев все просто переходят на версию FreeBSD 5.x. Последняя имеет полную поддержку системы NSS и поддержку ACL; в ней проще реализована система РАМ, присутствует обновленный пакет Kerberos5 и имеется возможность использования библиотеки libnss_ldap.so. Подробнее о настройке пакета Samba можно узнать из справочного руководства man samba и man smb. conf, или посетив Web-сайт http://www. samba . org. ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ Как и любой другой сетевой сервис, работающий по протоколу TCP/IP, пакет Samba, установленный на компьютере, выступающем в роли шлюза между локальной сетью и Internet, может принимать запросы на соединение и предоставлять доступ любому пользователю извне. В первую очередь необходимо позаботиться о выделении отдельного компьютера для работы в качестве файлового сервера. Ограничение доступа Вне зависимости оттого, какой компьютер будет использован в качестве файлового сервера Samba, всегда необходимо позаботиться о правильной настройке доступа. Рассмотрим опции, которые применяются для такой настройки. hosts allow — строковое значение, определяющее список машин, которые могут иметь доступ к ресурсу. Может быть указано как для каждого ресурса в отдельности, так и глобально для всех ресурсов в глобальном блоке описания. Примеры использования: ; разрешить доступ всем машинам домена altersys-ua.com, ; машине smbsrv.main.com.ua и машине localsrv hosts allow = .altersys-ua.com, smbsrv.main.com.ua, localsrv ; разрешить доступ всем машинам из подсетей 192.168.0., ; 192.168.2. а также машине с IP 192.168.1.1 hosts allow = 192.168.0. 192.168.2. 192.168.1.1 ; разрешить доступ всем машинам hosts allow = ALL ; разрешить доступ всем машинам, исключая все в подсети 10. hosts allow = ALL EXCEPT 10. hosts deny — строковое значение, определяющее список машин, которым запрещен доступ к ресурсу. Как и для предыдущей опции, ее можно указать как для ресурсов в отдельности, так и глобально. Никогда не вносите в список адрес 127.0.0.1 или localhost! Примеры использования: ; запретить доступ всем машинам из подсети 192.168.1., ; а также машине с именем localsrv hosts deny = 192.168.1. localsrv ; запретить доступ всем машинам исключая машины из ; подсети 192.168.0. hosts deny = ALL EXCEPT 192.168.0. interfaces — строковое значение, определяющее список сетей, в которых будет функционировать сервер Samba. Другими словами, если у вас есть несколько интерфейсов, обслуживающих различные сети, то с помощью данной опции можно перечислить те интерфейсы, от которых будут приниматься запросы. По-умолчанию, Samba при загрузке пытается определить самый первый интерфейс и привязывается именно к нему.
Обеспечение безопасности 689 Все остальные .интерфейсы остаются вне поля функционирования. Потому, если требуется разрешить другим подсетям обращаться к серверу или автоматический выбор первого интерфейса не подходит, то необходимо воспользоваться опцией interfaces, описав ее в блоке [global ]. Примеры использования: interfaces = 10.0.0.1/255.255.255.0 10.0.1.1/255.255.255.0 interfaces = 192.168.0.1/24 192.168.1.1/24 bind interfaces only — глобальная опция, принимающая значение yes или по. Используется в связке с опцией interfaces. Эта опция предназначена для ограничения приема запросов только от машин в сетях, перечисленных в опции interfaces. При этом игнорируются также и широковещательные запросы. Важно упомянуть, что при установке значения yes для опции bind interfaces only в опции interfaces обязательно должна присутствовать запись для локальной машины (127 .0.0.1). Пример использования: bind interfaces only = yes Правила IPFW Особое внимание, как всегда, необходимо уделить особенностям настройки брандмауэра. В данном случае это важно с той точки зрения, что пакет Samba является комплексным решением и содержит набор даемонов, использующих для своей работы различные порты. Перечислим их, а также назначение каждого: порт 137 — используется для сетевого просмотра по протоколу NetBIOS; порт 138 — используется для работы пакета в качестве сервера имен (используя протокол NetBIOS); порт 139 — используется непосредственно для построения списка общедоступных ресурсов, их просмотра, а также для выполнения всех остальных операций по протоколу SMB; порт 445 — используется в случае, когда отключено использование NetBIOS поверх TCP/IP (в операционных системах Windows 2000 и Windows XP); порт 901 — как упоминалось ранее, используется для работы системы SWAT. Уже давно не секрет, что использование вышеупомянутых протоколов существенно увеличивают риск взлома сети и незаконного использования ресурсов, а также воровства конфиденциальной информации компании. Довольно часто используется прослушивание всего сетевого трафика внутренней сети. Если вы решили использовать пакет Samba или какой-либо другой продукт на основе сетевых технологий Microsoft, то в первую очередь позаботьтесь о полном закрытии доступа по этим портам. Все это необходимо сделать непосредственно на сервере доступа к Internet или на сервере DMZ (демилитаризрванная зона). Если крайне необходимо использовать протокол SMB для обмена информацией между различными подразделениями компании в различных районах или городах, то рекомендуется воспользоваться альтернативными способами или же построить виртуальную частную сеть (VPN — Virtual Private Network) между офисами с шифрованием трафика. Закрыть некоторые порты желательно также и на самом сервере Samba (например, для системы SWAT). Приведем в качестве примера несколько записей правил для IPFW в файле /etc/rc.firewall: # правила на сервере доступа к Internet # (желательно установить эти правила одними из первых в списке) # - ${fwcmd} add deny tcp from any to any 137,138,139,44 5,901 ${fwcmd} add deny udp from any to any 137,138,139,44 5
690 Глава 24. Связь с Windows. Использование пакета SAMBA # правила на компьютере Samba # - # запретить доступ к системе SWAT с других машин И разрешить только с локального хоста $'fwcmd) add allow tcp from localhost to me 901 3{fwcmd) add deny tcp from any to me 901 # перечислить подсети, которым разрешен доступ # (фактически, повторение опции interfaces). # Разрешаем доступ из сети 192.168.255.255 ${fwcmd) add allow tcp from 192.168.0.0/16 to me 137,138,139,445 in $(fwcmd} add allow tcp from me to 192.16B.0.0/16 137,138,139,445 out ${fwcmd) add allow udp from 192.168.0.0/16 to me 137,138,139,445 in ${fwcmdl add allow udp from me to 192.168.0.0/16 137,138,139,445 out ft запрещаем доступ всех остальных $ifwcmd} add deny tcp from any to any 137,138,139,445 ${fwcmd| add deny udp from any to any 137,138,139,445 ИСПОЛЬЗОВАНИЕ ПАКЕТА SMBFS Ранее было рассмотрено использование пакета Samba для настройки системы как файлового сервера и предоставления ресурсов в общее использование. Теперь же поговорим о настройке FreeBSD как клиента SMB и о возможности монтирования удаленных ресурсов SMB как файловой системы. Для этого служит пакет из набора портов smbf s, а также файл /etc/nsmb.conf. Прежде всего необходимо позаботиться об установке порта smbfs из каталога /usr/ports/net/smbf s. Кстати, данный порт появился в среде FreeBSD сравнительно недавно (начиная с версии FreeBSD 4.5), а до того он был реализован для систем Linux. Это связано с тем, что поддержку SMB на уровне файловой системы необходимо было включить в ядро, что означает полностью новую разработку пакета для данной операционной системы. Но все это позади, и теперь можно наслаждаться наличием пакета SMBFS и в системе FreeBSD. Кроме всего прочего, он позволяет использовать общедоступные сетевые принтеры (посмотрите файл /etc/princap, или же найдите его пример вдиректории /usr/share/examples/smbf s/print). Установка пакета на более старых версиях системы, чем FreeBSD 4.5, не займет много времени (подробное описание установки дополнительных приложений смотрите в главе 9). ВНИМАНИЕ! Последние версии системы FreeBSD уже включают в себя пакет smbfs и его установка из портов не потребуется. После установки пакета или системы вы сможете найти в директории /modules файл модуля ядра smbfs . ко, а также пару дополнительных утилит: утилиту монтирования mountsmbfs в директории /sbin (/usr/sbin для FreeBSD 5.x) и утилиту управления smbutil вдиректории /usr/bin. Подробную информации обо всех утилитах можно найти в справочной системе, выполнив команду man mount_smbsf или man smbutil. Первой рассмотрим утилиту mountsmbf s. Она позволяет монтировать общие сетевые ресурсы, используя протокол SMB. Как и в случае использования любой другой утилиты монтирования, ей необходимо передать как минимум два параметра: имя ресурса и точку монтирования. При этом имя ресурса имеет формат //username@ smbhostname/resource. Точка монтирования — директория в системе. Например: mount smbfs //guest@client01/install /mnt/install
Использование пакета SMBFS 691 В данном случае локальный компьютер должен знать IP-адрес машины с именем clientOl, иначе можно воспользоваться опцией -I, с помощью которой передается IP- адрес машины. В любом случае рекомендуется использовать опцию -I: mount_smbfs -I 192.168.0.1 //guestSclientOl/install /mnt/install Важно помнить, что без наличия в системе настроенного файла /etc/nsmb. conf утилита монтирования будет требовать ввод пароля для пользователя, указанного в имени ресурса. Очень важно также использовать опцию -Е, которая позволяет установить набор символов для локального и удаленного компьютера: mount_smbfs -I 192.168.0.1 -Е koi8-r:866 //guest@client01/install /mnt/install Как правило, каждый раз указывать такую длинную строку для монтирования часто используемого ресурса не целесообразно. Как и прежде, выходом является использование файла /etc/fstab. Для автоматического монтирования ресурсов используйте строку следующего вида: //guest@client01/install /mnt/install smbfs rw,noauto, - 1=192.168.0.1,-E=koi8:866 0 0 Но почему здесь указано noauto? Напомним, что утилита потребует пароль, который у нас не будет возможности ввести во время загрузки системы и процесса монтирования всех auto-ресурсов. Таким образом, монтирование файловой системы завершится неудачно, и система будет переведена в однопользовательский режим (см. главу 8). Установка опции noauto позволяет не монтировать ресурс во время загрузки системы. Вот теперь и настало время рассказать немного о нашем "загадочном" файле /etc/nsmb.conf. Этот файл содержит всю необходимую информацию о компьютерах, пользователях и ресурсах и представляет собой набор строк, распределенным по блокам. Как уже стало привычным, начало блока имеет вид: [имя_блока] Существует четыре типа блоков: [default]; [SERVER_NAME]; [SERVER_NAME:USER]; [SERVER_NAME:USER:SHARE]. Конец блока — это конец файла или начало следующего блока. Строки в блоке имеют вид: ключ = значение Ключей также не очень много, и они могут использоваться не во всех типах блоков (табл. 24.4). Таблица 24.4. Список ключей, используемых в файле /etc/nsmb. conf Ключ addr charaeta nbns nbscope nbtimeout Блок 12 3 4 - + - - - + + + + + + + - - + + - - Описание IP- или IPX-адрес сервера Локальный/удаленный набор символов Адрес сервера имен (WINS) Область NetBIOS Время ожидания для сервера имен
692 Глава 24. Связь с Windows. Использование пакета SAMBA Таблица 24.4. Окончание Ключ Блок Описание . ' v password - -++ Пароль в явном виде, используемый для доступа к ресурсу retrycount 4 + - - Количество повторных попыток установить соединения прежде, чем ресурс будет определен как недоступный Timeout +. + -.- Время ожидания для SMB-запросов, workgroup +■+;■++ Имя рабочей группы В файле можно использовать комментарии, которые начинаются с символа #. Блок [default] служит для описания параметров используемой по умолчанию рабочей группы или домена. В названиях остальных блоков запрещено использовать кириллические символы (нельзя указывать блоки для машин, пользователей, ресурсов, в которых есть символы кириллицы). Рассмотрим простой пример файла /etc/nsmb. conf (листинг 24.6). Листинг 24,6. Пример простого файла /afcc/nsab.conf -К . - ■..■■'■ # Описываем рабочую группу, используемую по умолчанию, [default] workgroup=MSHOME # Описываем машину с именем "INFORMEX" [INFORMEX] charsets=koi8-r:ср866 addr=192.16B.0.1 tt указываем пароль для пользователя "admin" [INFORMEX:ADMIN] password=mypass Данным примером мы заканчиваем изучение возможностей связи систем FreeBSD и Windows. В данной главе были рассмотрены только основы взаимодействия данных систем. Для полного описания всех возможностей потребовалось бы написать целую книгу.
ЧАСТЬ IV СИСТЕМА X-WINDOW Несмотря па необоснованность использования графической системы на сервере, рассмотрение системы FreeBSD нельзя оставить без предоставления краткой информации об X-Window. При этом не следует также забывать, что система X-Window не является частью самой FreeBSD. Графическая среда X-Window позволяет работать с различными пакетами клиентских приложений: графическими и текстовыми редакторами, приложениями просмотра Web-страниц (браузеры), играть в игрушки и выполнять много других задач.
694 Глава 25. Использование X-Window ГЛАВА 25. ИСПОЛЬЗОВАНИЕ X-WINDOW Для успешной работы с системой Х-Window необходимо знать некоторые основы. Тем, кто впервые столкнулся с графической оболочкой X-Window, возможно, будет непросто сходу понять ее функционирование и настройку. Итак... X-WINDOW И FREEBSD Система X-Window изначально разрабатывалась как ориентированная на работу в сети с использованием модели "клиент-сервер". При этом подразумевается следующая модель. Х-сервер работает на компьютере с клавиатурой, монитором и мышью. Область ответственности сервера включает управление дисплеем, обработку ввода с клавиатуры и мыши и т.д. Каждое Х-приложение является "клиентом". Клиент отправляет серверу сообщения, наподобие "Нарисуй окно с такими-то координатами", а сервер отвечает сообщениями типа "Пользователь только что щёлкнул мышью на кнопке Apply". В случае использования дома или в офисе, сервер и клиенты X-Window, как правило, работают на одном и том же компьютере, однако возможно запускать Х-сервер на менее мощном настольном компьютере, а приложения X (клиенты) на мощной и дорогой машине, обслуживающей целый офис. Далее будем подразумевать, что Х-клиент и сервер общаются через сеть. Некоторых это вводит в заблуждение, потому что терминология X-Window в точности обратная тому, что ожидают пользователи. Они полагают, что "Х-сервер" будет большой мощной машиной, а "Х-клиентом" является простой рабочий компьютер. Но важно помнить, что Х-сервером является компьютер с монитором и клавиатурой, а Х-клиенты — это программы, отображающие окна. Начиная с FreeBSD 5.3-RELEASE, Х-сервер, поставляемый с FreeBSD, называется Xorg, и распространяется свободно по лицензии, очень похожей на условия распространения FreeBSD. В системе X-Window не определено, как окна должны выглядеть на экране, как их двигать мышью, какие комбинации клавиш должны использоваться для переключения между окнами, как должны выглядеть заголовки окон, должны ли в них быть кнопки для закрытия и пр. Вместо этого система X-Window (далее будем применять также просто понятие X для X-Window) делегирует ответственность за это приложению, которое называется менеджером окон. Существуют десятки оконных менеджеров для X: AfterStep, Blackbox, ctwm, Enlightenment, fvwm, Sawfish, twm, WindowMaker и др. Каждый из них предоставляет различные внешние виды и удобства; некоторые поддерживают "виртуальные рабочие столы"; другие позволяют изменять назначения комбинаций клавиш, используемых для управления рабочим столом; в некоторых есть кнопка Start или нечто подобное; часть поддерживает "темы", позволяющие изменять внешний вид окон. Эти оконные менеджеры, а также множество других, отнесены к категории xll-wm коллекции портов или набора пакетов. Кроме того, оболочки KDE и GNOME имеют собственные оконные менеджеры, интегрированные в оболочку. Каждый оконный менеджер также имеет собственный механизм настройки; некоторые предполагают наличие вручную созданного конфигурационного файла; другие предоставляют графические инструменты для выполнения большинства работ по на-
X-Window и FreeBSD 695 стройке; по крайней мере один (Sawfish) имеет конфигурационный файл, написанный на диалекте языка Lisp. Другой особенностью, за которую отвечает оконный менеджер, является "политика фокусирования" мыши. Каждая оконная система должна иметь некоторый способ выбора окна для активации получения нажатий клавиш, а также визуальную индикацию того, какое окно активно. Широко известна политика фокусировки называется "щелчок для фокуса" (click-to-focus). Эта модель используется в Microsoft Windows, когда окно становится активным после получения щелчка мыши. Система X-Window не поддерживает никакой конкретной политики фокусирования. Вместо этого менеджер окон управляет тем, какое окно владеет фокусом в каждый конкретный момент времени. Различные оконные менеджеры поддерживают разные методы. Все они поддерживают метод щелчка для фокусирования, и большинство поддерживает некоторые другие методы. Самыми популярными политиками фокусирования являются: Фокус следует за мышью (focus-follows-mouse) — фокусом владеет окно, которое находится под указателем мыши (не обязательно окно, которое находится поверх всех остальных). Фокус меняется при указании на другое окно, при этом щелкать на нем не обязательно. Нечеткий фокус (sloppy-focus) — с политикой "focus-follows-mouse", если указатель мыши помещается поверх корневого окна (или заднего фона), то никакое окно фокус не получает, а нажатия клавиш просто пропадают. В слцчае использования политики нечёткого фокуса, он меняется только тогда, когда указатель попадает на новое окно, но не когда уходит с текущего окна. Щелчок для выбора фокуса (click-to-focus) — активное окно выбирается щелчком мыши. Затем окно может быть "поднято" и появится поверх всех других окон. Все нажатия клавиш теперь будут направляться в это окно, даже если указатель переместится к другому окну. Многие оконные менеджеры поддерживают и другие политики, а также вариации перечисленных политик. Обязательно обращайтесь к документации по оконному менеджеру. Для полного понимания системы X-Window необходимо также рассмотреть понятие элементов управления окном (widget). Этот термин применяется для всего в пользовательском интерфейсе, на чем можно щелкать или каким-то образом управлять: кнопки, переключатели, флажки, пиктограммы, списки и т.д. В Microsoft Windows существует схожее понятие элемент управления (control). При этом Windows придерживается в этом отношении очень жесткой политики. Предполагается, что разрабатываемые приложения обязательно должны иметь подобный внешний вид. Что касается системы X-Window, то было решено, что не нужно требовать обязательного использования какого-то определённого графического стиля или набора вид- жетов. В результате не стоит ожидат*. от Х-приложений схожести по внешнему виду. Существует несколько популярных наборов виджетов и их разновидностей, включая оригинальный набор Athena от MIT, Motif®, OpenLook и др. В большинстве появляющихся в настоящее время приложений для X используется набор виджетов современного вида Qt. применяемый в KDE, или GTK+, применяемый проектом GNOME. В этом отношении наблюдается унификация внешнего вида рабочего стола в системах UNIX, что определённо облегчает жизнь начинающему пользователю. Установка X-Window На FreeBSD могут быть установлены системы Xorg или XFree86. Начиная с FreeBSD 5.3-RELEASE и FreeBSD 4.10, версией системы X-Window по умолчанию является Xorg. Xorg — это сервер Х-дистрибутива открытой реализации X-Window System, выпущенной X.Org Foundation. Он основан на коде XFree86 4.4RC2 и XI 1R6.6. X.Org Foun-
696 Глава 25. Использование X-Window dation выпустила XI 1R6.7 в апреле 2004 года, а XI 1R6.8.1 — в сентябре 2004; эта версия доступна из коллекции портов FreeBSD. Далее для обозначения этой системы X- Window будем использовать название "X11". Для сборки и установки Xorg из коллекции портов выполните следующие команды (перед сборкой полной версии Xorg удостоверьтесь в наличии хотя бы 4 Гбайт свободного места на жестком диске): # cd /usr/ports/xl1/xorg # make install clean Кроме того, XI1 может быть установлен непосредственно из пакетов. Бинарные пакеты, устанавливаемые pkg_add, доступны и для XII. Когда pkg_add используется для удаленной загрузки пакетов, номер версии пакета необходимо удалить. Утилита pkgadd автоматически установит последнюю версию приложения. Таким образом, для загрузки и установки пакета Xorg, просто наберите: ft pkgadd -r xorg Пакет XFrec86 4.X может быть установлен командой: if pkg_add -r XFree86 Заметим, что в данном случае будет установлен полный дистрибутив XII, включая серверы, клиенты, шрифты и т.д. Также доступны и отдельные пакеты и порты для различных частей X11. В оставшейся части главы будет рассказано о том, как сконфигурировать XII и настроить рабочее окружение. Настройка X Перед настройкой системы X-Window необходима следующая информация о конфигурируемой системе: характеристики монитора; набор микросхем, используемый в видеоадаптере; объём видеопамяти. Характеристики монитора используются в ХП для определения рабочего разрешения и частоты. Обычно они могут быть получены из документации, которая прилагается к монитору или с Web-сайта производителя. Требуются два диапазона значений: для частоты горизонтальной развёртки и частоты вертикальной синхронизации. . Набор микросхем графического адаптера определяет, модуль какого драйвера использует XI1 для работы с графическим оборудованием. Для большинства типов микросхем это может быть определено автоматически, но все же его полезно знать на тот случай, когда автоматическое определение работает некорректно. Объём видеопамяти графического адаптера определяет разрешение и глубину цвета, с которым может работать система. Это важно, чтобы пользователь знал ограничения системы. Процесс настройки XII является многошаговым. Первый шаг заключается в подстроении начального конфигурационного файла. Работая с правами суперпользователя, просто запустите: # Xorg -configure А для системы XFree86 запустите: # XFree86 -configure При этом в каталоге /root будет создан скелет конфигурационного файла XI1 под именем xorg. conf. new. Для XFree86 этот файл называется XF86Conf ig.new. Программа XI1 сделает попытку распознать графическое оборудование системы и запишет
X-Window и FreeBSD 697 конфигурационный файл, загружающий правильные драйверы для обнаруженного оборудования в системе. Следующим шагом является тестирование существующей конфигурации для проверки того, что Xorg может работать с графическим оборудованием в настраиваемой системе. Для этого выполните: # Xorg -config xorg.conf.new Пользователям XFree86 необходимо выполнить: # XFree86 -xf86config XF86Config.new Если появилась чёрно-белая сетка и указатель мыши в виде X, то настройка была выполнена успешно. Для завершения тестирования просто нажмите комбинацию клавиш <Ctrl+Alt+Backspace> ("убить" графический режим). Теперь выполните тонкую настройку в файле xorg. conf. new (или в файле XF86Config.new) по своему вкусу. Для этого откройте файл в текстовом редакторе (например, edit). Сначала задайте частоты для монитора. Они обычно обозначаются как частоты горизонтальной и вертикальной синхронизации. Эти значения добавляются в конфигурационный файл в раздел Monitor: Section "Monitor" Identifier "MonitorO" VendorName. "Monitor Vendor" ModelName "Monitor Model" HorizSync 30-107 VertRefresh 48-120 EndSection Ключевых слов HorizSync и VertRefresh может и не оказаться в файле конфигурации. Если их нет, то они должны быть добавлены, с указанием корректных значений горизонтальной частоты синхронизации после ключевого слова HorizSync и вертикальной частоты синхронизации после ключевого слова VertRefresh. В примере выше были введены частоты монитора настраиваемой системы. Система X позволяет использовать возможности технологии DPMS с поддерживающими её мониторами. Программа xset управляет временными задержками и может явно задавать режимы ожидания, останова и выключения. Если требуется включить использование возможностей DPMS монитора, следует добавить следующую строку в раздел, описывающий монитор: Option "DPMS" Пока файл конфигурации xorg. conf. new открыт вредакторе, выберите желаемые разрешение и глубину цвета, которые будут использоваться по умолчанию. Они задаются в разделе Screen: Section "Screen" Identifier "ScreenO" Device "CardO" Monitor "MonitorO" DefaultDepth 24 Subsection "Display" Viewport 0 0 Depth 24 Modes "1024x768" EndSubSection EndSection Ключевое слово DefaultDepth описывает глубину цвета, с которой будет работа по умолчанию. Это значение может быть переопределено при помощи параметра ко-
698 Глава 25. Использование X-Window мандной строки -depth. Ключевое слово Modes описывает разрешение, с которым необходимо работать при данной глубине цвета. Заметьте, что поддерживаются только те стандартные режимы VESA, которые определены графическим оборудованием настраиваемой системы. В примере выше глубина цвета по умолчанию равна 24 битам на пиксель. При такой глубине принимается разрешение 1024x768. Наконец, запишите конфигурационный файл и протестируйте его с помощт. тестового режима, описанного выше. Если все в порядке, то конфигурационный файл необходимо установить в общедоступное место, где его сможет найти Xorg или XFree86. Обычно это /etc/Xll/xorg.conf или /usr/XllR6/etc/Xl1/xorg.conf (для XFree86 это /etc/Xll/XF86Conf ig или /usr/XllR6/etc/Xll/XF86Conf ig). Скопируйте: # cp xorg.conf.new /etc/Xll/xorg.conf Для XFree86: # cp XFSeConfig.new /etc/Xll/XF86Config Процесс настройки X-Window завершен. Для запуска XFree86 4.X посредством команды startx установите порт xll/wrapper. В Xorg уже включен код wrapper, и установка его из порта не требуется. X-Window можно также запустить через xdm. ПРИМЕЧАНИЕ Существует также графический инструмент для настройки: xorgcf g для Xorg и xf8 6cfg для XFree86, который включен в дистрибутив X-Window. Он позволяет выполнить настройку в интерактивном режиме посредством выбора соответствующих драйверов и настроек. Эти программы могут быть запущены в консоли командой xorgcfg -textmode. , Кроме того, существует программа настройки xorgconfig (xf8 6config для XFree86). Это консольная утилита, которая менее дружественна к пользователю, но может работать в ситуациях, в которых другие утилиты не работают. Использование шрифтов Шрифты, используемые по умолчанию и распространяемые вместе с X, вряд ли можно назвать идеально подходящими для применения в обычных издательских приложениях. Однако есть некоторое количество свободно распространяемых высококачественных шрифтов Typel, которые можно без изменений использовать с X. Кроме того, XII с минимальными усилиями может быть настроена на использование шрифтов TrueType. Для установки коллекции шрифтов urwfonts из коллекции портов выполните следующие команды: # cd /usr/ports/xll-fonts/urwfonts N make install clean Чтобы Х-сервер обнаруживал этих шрифты, добавьте соответствующую строку в файл настройки X сервера /etc/Xil/xorg. conf, которая должна выглядеть так: FontPath "/usr/XllR6/lib/Xll/fonts/URW/" Либо из командной строки при работе с X выполните: % xset fp+ /usr/XllR6/lib/Xll/fonts/URW % xset fp rehash Эта команда сработает только на текущий сеанс работы с X. Как в XFrcc86 4.X, так и в XoTg имеется встроенная поддержка шрифтов TrueType. Существуют два модуля, которые могут обеспечить эту функциональность. В нашем
X-Window и FreeBSD 699 примере используется модуль freetype, потому что он в большей степени похож на другие механизмы для работы с шрифтами. Для включения модуля freetype достаточно в раздел Module файла /etc/Xl 1/xorg. conf добавить следующую строку. Load "freetype" Теперь создайте каталог для хранения шрифтов TrueType (к примеру, /usr/XllR6/lib/Xll/fonts/TrueType) и скопируйте все шрифты TrueType в этот каталог. После того как файлы будут скопированы, воспользуйтесь утилитой ttmkf dir для создания файла fonts. dir, который укажет подсистеме вывода шрифтов X на местоположение этих новых файлов: # cd /usr/XHR6/lib/Xll/fonts/TrueType # ttmkfdir > fonts.dir Утилита ttmkfdir имеется в коллекции портов xll-fonts/ttmkfdir. После этого добавьте каталог со шрифтами TrueType к маршруту поиска шрифтов. Это делается точно так же, как описано выше для шрифтов Typel, то есть выполните % xset fp+ /usr/XllR6/lib/Xll/fonts/TrueType % xser. fp rehash или добавьте строку FontPath в файл xorg. conf. В принципе, это все, что необходимо сделать. Теперь все приложения должны увидеть установленные шрифты Typel и TrueType. Графические оболочки В данном разделе описываются две графические оболочки, доступные в системе X-Window для FreeBSD и наиболее часто используемые. Термин "графическая оболочка" может использоваться для чего угодно: от простого менеджера окон до полнофункционального набора приложений для рабочего стола, типа K.DE или GNOME. Оболочка GNOME Оболочка GNOME является наиболее дружественной к пользователю графической оболочкой, позволяющей пользователям легко использовать и настраивать свои компьютеры. В GNOME имеется панель (для запуска приложений и отображения их состояния), рабочий стол (где могут быть размещены данные и приложения), набор стандартных инструментов и приложений для рабочего стола, а также набор соглашений, облегчающих совместную работу и согласованность приложений. Пользователи других операционных систем или оболочек при использовании такой мощной графической оболочки как GNOME должны чувствовать себя в родной среде. Установить GNOME можно несколькомя путями. Во-первых, — во вермя установки системы, во-вторых, — с помощью набора пакетов с CD-ROM (xll/gnome2-x.x) или из сети Internet следующей командой: # pkg_add -r gnome2 Для построения GNOME из исходных текстов используйте дерево портов: # cd /usr/ports/xll/gnome2 # make install clean После установки GNOME следует указать Х-серверу на запуск GNOME вместо стандартного оконного менеджера. Если присутствует файл ~/ . xinitrc, то просто замените строку, в которой запускается используемый менеджер окон, на ту, что вызовет /usr/XllR6/bin/gnome-session. Если в конфигурационном файле нет ничего особенного, то будет достаточно выполнить команду: %echo "/usr/XHR6/bin/gnome-session" > -/.xinitrc
700 Глава 25. Использование X-Window Теперь выполните команду startx, и будет запущена графическая оболочка GNOME. При этом, если используется менеджер дисплеев типа XDM (см. файл /etc/ ttys), то это не сработает, и будет запущена графическая среда без поддержки оболочки GNOME. Для решения этой проблемы создайте выполнимый файл -/.xsession с той же командой в нем. Для этого отредактируйте файл, заменив существующую команду запуска оконного менеджера на /usr/XHR6/bin/gnome-session: %echo "ft !/bin/sh" > ~/. xsession %echo "/usr/XHR6/bin/gnome-session" » -/.xsession ?,chmod +x ~/.xsession Пример внешнего вида рабочего стола, при использовании оболочки GNOME показан на рис. 25.1 Г *>чг "? ** - оа-вч д^в* * ■ *— ■ »v i til»1 art -■ rminftl i. i- * «-■*' vulnerability check disable^, database: not found «■■> Eura/eung for «voUmon-d«ta-s«rvtsr.i.2.3 ... у , i t- и a mTZ. %0 , •» Clwch^iA.ittsustch, for gnoi»2/evolution;deta-»rver-l.2.3.tar.b^S, —■_ Vas» Rafcjtcbr'for I.more tines files: gnome2/evoluti©n.duta.e*rver.l'.2.3.tar.b Ljj~ ' 5i rl- т . " .. "■ . > - -'> ' _,— ^r — ~c i-stci irihw i I r ^ ev« •n'data.eerver-has the- following configurable optionfs); "' ''"™ • ^n-**i-.i ■ ^1 %' " '■ TWT.'" '-••»»4s,u3№WP»r« ■" •'. '■'-''■■' _ т"^1 &Ч* ra^Ut]( c,hecH disabled, database not found' ^- с _ ,-r . -J ¥i«?W8U*!fe" " r r" *!•'*«•' •■• -t'' "Y" l -.5 -i« t ~e»75ig|jejj ' -'".-' 'v . . *■ 'V."-" . r" ,,1,^*В$«(М»,Рв. • it'- . ■■_ ■' JtJP.belnet.beMcre^'i.; •■■■ "V9/.«d <«9 • vouy- .ii«»-»bwi ..> . .'•■?" -»■*.. '■ .;., 4,w < f tc& JSi /ftgtfM^t^bevwc^r/ftp.gnoine.org/sourcai/eVol t .п.. t . f v г/ j?/»»?W^on'-o^ti»S»aliv«^3i!®3it«r.bj2:-Per«i«ion'den>a. '_ „_. '^" ». • ■> Attepti'ng'to fetch fromjjj ■;/<ftp.linuiI,org.uk/jw,rr:ii /i ■'.• •* • g .'.. f се«7«/о1ч.Чап:4ач.»егчег/1Тг7- v -,;, 4,- - • ": e»olution-det*-senfer<1.2.3.tar.bi2 2» of ■ MS W«3 ере лапгге. No Edit ще* Search Ipols tatumams belp shizz tyt x £jj - - no - -4 bopofke олов1дання. Bci bbht.i тд о_овигтост1 вввлди* вигвдвнквм- Лнбг ;л1Вплданья > реалиями S. »,.т..- т. п.д..„ ,..,. .„л.д.вв. i ..пгмд.-» вед*т»,.я В1Л ofinwia пвторл лбе одного э герглв огог.дзммя 1дмл пс т< сту ИГплоащ recol \ ШГСьСл - ■лловиГ* .г П'шнл 6 ргив ('ГВ иьпгдлнл в Галину [ д'Ппиа гаив л тому кгргтгччагнл >акГ<>ПНни в 1пви> .цбчвт. Howe ..па'-шся дуМкл. ■<; птряна л»дпня Д/ЛкП BB»^f» * Ц»ОГО ГОНВЕД/ ИО«Г р1Л»ИТ11^Я >11Я ОП В1ДПННЧ и M*C ^Я |11ЛЬ ;10».|1ЯТ1 Lol.roll Ijf "nplicalions Actions '=.» fl]J хг-'глй - 13 ' i ' ntimmal] В Terminal „ jhoniefinformeK/i ij^ LtA rhuAuo. 4,00.46 |Э ^ Рис. 25.1. Пример внешнего вида рабочего стола в случае оболочки GNOME Оболочка KDE Многие пользователи выбирают оболочку KDE. Оболочка KDE проста в использовании и современна. Перечислим некоторые из ее преимуществ: красивый современный рабочий стол; рабочий стол, полностью прозрачный при работе в сети; интегрированная система помощи, обеспечивающая удобный и согласованный доступ к системе помощи по использованию рабочего стола KDE и его приложений; однообразный внешний вид и управление во всех приложениях KDE; стандартизованные меню и панели инструментов, комбинации клавиш, цветовые схемы и т.д.;
X-Window и FreeBSD 701 интернационализация: в KDE поддерживается более 40 языков; централизованное однообразное конфигурирование рабочего стола в диалоговом режиме; большое количество полезных приложений для KDE. Для KDE существует пакет офисных приложений, который выполнен по технологии KParts из K.DE, состоящий из программы для работы с электронными таблицами, презентационной программы, органайзера, клиента для чтения телеконференций и других программ. С K.DE также поставляется Web-браузер под названием Konqueror, который является серьезным соперником другим браузерам. Как и в случае с GNOME или любой другой графической оболочкой, легче всего установить KDE во время установки системы. Для установки же пакета KDE из сети, просто наберите: 'ft pkg_add -r kde При этом утилита pkgadd автоматически загрузит самую последнюю версию приложения и установит его в системе. Для построения KDE из исходных текстов воспользуйтесь деревом портов: # cd /usr/ports/xll/kde.1 # make install clean После установки KDE следует указать Х-ссрверу на запуск этого приложения вместо оконного менеджера, используемого по умолчанию. Это достигается редактированием файла ~/. xinitrc: techo "exec .startkde" > ~/.xinitrc Теперь при вызове X Window System по команде startx в качестве оболочки будет использоваться KDE. При использовании менеджера дисплеев типа XDM настройка несколько отличается. Вместо этого необходимо отредактировать файл . xsession подобно тому, как было описано для оболочки GNOME. Теперь, когда KDE установлена, можно узнать много нового из её справочных страниц. Пользователи Windows при этом будут чувствовать себя "как дома". Лучшим справочником по KDE является интерактивная документация. Менеджер дисплеев KDE Администратору многопользовательской системы может потребоваться графический экран для входа пользователей в систему. Можно использовать XDM. Однако в KDE имеется альтернативный менеджер kdm, который был разработан более привлекательным и с большим количеством настраиваемых опций для входа в систему. В частности, пользователи могут легко выбирать посредством меню, какую оболочку (KDE, GNOME или что-то еще) запускать после входа в систему. Для начала запустите панель управления KDE kcontroi из-под пользователя root. Вообще говоря, считается небезопасным работать в X-Window под пользователем root. Вместо этого лучше запустить менеджер окон как обычный пользователь, открыть окно терминала xterm из KDE, стать пользователем root по команде su, а затем набрать kcontroi. Щёлкните на пиктограмме слева с надписью System, затем — на Login manager. Справа находится много различных параметров настройки, которые более подробно описаны в руководстве по KDE. Щелкните на sessions справа. Затем нажмите кнопку New type, чтобы добавить различные оконные менеджеры н графические оболочки. Это просто названия, так что они могут именоваться KDE или GNOME, а не startkde или gnome-session). Обязательно добавьте также и foil.sate. Поэкспериментируйте также и с другими меню — они, в основном, носят "косметический" характер. По окончании настройки нажмите кнопку Apply внизу окна и завершите работу панели управления kcontroi.
702 Глава 25. Использование X-Window Для того чтобы kdm понимал, что значат эти названия (KDE, GNOME и т.д.), отредактируйте файлы, которые использует XDM. Для этого в окне терминала, работая как пользователь root, отредактируйте файл /usr/XHR6/lib/Xll/xdm/Xsession. В середине есть раздел вида case $# in 1) case $1 in failsafe) exec xterm -geometry 80x24-0-0 t t esac esac Необходимо добавить к этому разделу несколько строк. Полагая, что ранее использовались названия KDE и GNOME, сделаем следующее: case $# in 1) case $1 in KDE) exec /usr/local/bin/startkde GNOME) exec /usr/XHR6/bin/gnome-session / r failsafe) exec xterm -geometry 80x24-0-0 i I esac esac Для того чтобы выбор KDE в качестве оболочки на момент входа в систему был принят, необходимо добавить такую строку в /usr/XHR6/lib/Xll/xdm/Xsetup_0: /usr/local/bin/kdmdesktop Теперь проверьте, что kdm указан в файле /etc/ttys для запуска при следующей загрузке. Для этого замените вызов программы /usr/XllR6/bin/xdm на /usr/ local/bin/kdm. СПИСОК ПОЛЕЗНЫХ ПРИЛОЖЕНИЙ В ПОРТАХ /usr/ports/www/mozilla — наиболее популярный браузер; /usr/ports/www/firefox — очень популярный браузер, основанный на коде браузера Mozilla; /usr/ports/www/opera — очень быстрый, полноценный и совместимый со стандартами браузер; /usr/ports/editors/abiword — свободно распространяемый текстовый процессор, по внешнему виду и поведению очень похожий на Microsoft Word; он подходит для набора документов, писем, отчетов, напоминаний и т.д.; очень быстр, содержит много новшеств и очень удобен в использовании; /usr/ports/editors/openoffice.org-2.0 — OpenOffice.org включает все обязательные компоненты полноценного офисного пакета: текстовый процессор, программу электронных таблиц, программу управления презентациями и программу векторной графики; интерфейс пользователя очень похож на другие офис-
Список полезных приложений в портах 703 ные пакеты, возможен импорт и экспорт различных популярных файловых фор- магов; приложение доступно в вариантах для множества разных языков, включая интерфейсы, проверку орфографии и словари; , /usr/ports/graphics/gimp — программа-аналог известному Adobe Photoshop; может быть использована как простая программа рисования и как программа обработки фотографий; поддерживается большое количество плагинов; /4sr/ports/print/acroread7 — программа для чтения PDF-файлов; /usr/ports/russian/xmms — программа для прослушивания музыкальных файлов; по внешнему виду и настройкам приближается к известному Winamp; .^uer/ports/multimedia/xine — простая утилита для просмотра видео; ^^/usr/ports/multimedia/totem — наиболее популярная программ просмотра 1 п видео-фалов различных форматов; '' /usr/ports/mail/evolution — программа для чтения почты, новостей. Очень удобный интерфейс, напоминает Microsoft Outlook. Наборы полезных утилит для GNOME2: %/usr/ports/xll/gnome2-f if th-toe — содержит список и позволяет уста- йовить много полезных и интересных программ и утилит; некоторые были перечислены в рассмотренном выше списке приложений; /usr/ports/xll/gnome2-power-tools — набор популярных и полезных утилит, наподобие предыдущему описанному пакету.
ДЯдокО. О. Д44 Один на един з FreeBSD. - К.: "Ш-Йресс", 2006. - 704а< ю. ISBN 966-S806-00-X Ця книга е вичерпним пойбником системного вдм^етратора. Вона висвгглюе питанн»'установки', нзлагодження та практихвого еихористамия в мереж! «перац№нр1 системи FreeBSD. Автор бласиим практичним досв|дом робот мережевим адмЦ)1сграл$рам в р1зних великих компан^ багато аспектов адмЫктрування FreeBSD. водочаючи роботу э командными интерпретаторам корисгувачами та обл|ковими эаписаОД, управгЦнкя файловою системою. вйкдрисха~ння пак ^ та дерева портпв. налагодженКЯ ядра системе, роботе в мерена та безпека систвми, налатод ' служб i aaco6iB як DNS, FTP, NIS. NFS, SAMBA; DHCP Web-сервер Apache та багато imuoro. ББКЗШ&4М8 Головний редактор: Ю. О. Шпак ©_Д1док О. О., текст, глюстрацм, 2006 ISBN 966-8806-00-Х © "МК-Пресс", оформления, -дизайн обкладинкидЗЙМ
Дидок Александр Александрович Один из ведущих специалистов IT-компании, в сферу деятельности которой входит установка серверов под заказ, контроль безопасности, консультирование пользователей и администраторов Unix-систем. Автор имеет большой практический опыт работы с различным сетевым оборудованием и аппаратными платформами, включая Sun UltraSPARC 64-bit и HP Workstation 2000i 64-bit, а также операционными системами Sun Solaris 9 for SPARC, HP-UX 11 version 1.5, IBM AIX, Linux RedHat 9, FreeBSD 5.X, Cisco IOS. С системой FreeBSD работает с 1999 года. Эта книга представляет собой справочное пособие по установке, настройке и использованию операционной системы FreeBSD. Она будет полезна как начинающим, так и опытным системным администраторам FreeBSD. В книге исчерпывающе рассмотрены следующие темы: - установка FreeBSD и первоначальная настройка; - настройка среды, локализация системы, работа с командными интерпретаторами; - администрирование системы, вопросы файловой системы, управление пользователями и группами, основы программирования в среде, мониторинг производительности и безопасности, установка дополнительного программного обеспечения, печать; - роль ядра системы, его взаимодействие с клиентским программным обеспечением, подробное описание конфигурирования ядра; - ветви системы, возможность постоянного поддержания системы в актуальном состоянии; - настройка сетевого окружения; доступ в Internet с использованием модема; настройка почтового, WWW- и FTP-сервера; использование системы в качестве шлюза; вопросы безопасности и обеспечения надежной связи систем с использованием VPN и IPSec; - настройка служб DNS, DHCP, NFS, NIS; - возможность взаимной работы с Windows-системами, используя сервер SAMBA; - работа с системой X-Window. Большинство затронутых вопросов сопровождается примерами с детализацией процесса настройки, а также описанием возможных проблем и способов их устранения. Личный сайт автора: www.main.coni.ua