Текст
                    Free BSD* 6
Brian Tiemann
sAms
800 East 96th Street,
Indianapolis, Indiana, 46240 USA


Free BSD* 6 Ш®Ш®@ РЖ®©®^©^® Брайан Таймэн Москва • Санкт-Петербург • Киев 2007
ББК 32.973.264)18.2.75 Т14 УДК 681.3.07 Издательский дом "Вильяме* Зав. редакцией С.Н. Тригуб Перевод с английского Я.П. Волковой, Д.Я. Иваненко, Н.А. Мухина Под редакцией Ю.Н. Артеменко По общим вопросам обращайтесь в Издательский дом "Вильяме" по адресу: info@williamspublishing.com, http://www.williamspublishing.com 115419, Москва, а/я 783; 03150, Киев, а/я 152 Таймэн, Брайан. Т14 FreeBSD 6. Полное руководство. : Пер. с англ. — М. : ООО "И.Д. Вильяме", 2007. — 1056 с. : ил. — Парал. тит. англ. ISBN 978-5-8459-0741-7 (рус.) Книга известного профессионала в области операционных систем и сетевых технологий посвящена очередной версии самой популярной в настоящее время операционной системы с открытым исходным кодом — FreeBSD 6. Подробно рассматриваются такие вопросы, как установка, сборка и конфигурирование FreeBSD из коллекции портов, загрузка и завершение работы системы, работа в командной строке и в графических оболочках X Window System, настройка безопасности и организация сетей на базе FreeBSD 6. Большое внимание уделяется файловым системам, установке программного обеспечения Web-сервера Apache, совместной работе множества пользователей, а также поиску и устранению неполадок. Книга изобилует не только множеством примеров из реальной жизни, но также снабжена теоретическими сведениями по таким сложным темам, как протоколы и маршрутизация. Прилагаемый к книге DVD-диск содержит дистрибутив FreeBSD 6.1, текущую коллекцию портов и многое другое. Книга рассчитана на пользователей и администраторов разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей. ББК 32.973.26-018.2.75 Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Sams Publishing. Authorized translation from the English language edition published by Sams Publishing, Copyright © 2006 All rights reserved. No part of this book shall be reproduced, stored in a retrieval system, or transmitted by any means, electrbnic, mechanical, photocopying, recording, or otherwise, without written permission from the publisher. No patent liability is assumed with respect to the use of the information contained herein. Although every precaution has been taken in the preparation of this book, the publisher and author assume no responsibility for errors or omissions. Nor is any liability assumed for damages resulting from the use of the information contained herein. Russian language edition is published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2007 ISBN 978-5-8459-0741-7 (рус.) ISBN 0-672-32875-5 (англ.) © Издательский дом "Вильяме*, 2007 © by Sams Publishing, 2006
Оглавление Об авторе 27 Посвящение 27 Благодарности 27 От издательства 28 Введение 29 Часть I. Введение в FreeBSD 35 Глава 1. Что собой представляет FreeBSD 37 Глава 2. Установка FreeBSD 53 Глава 3. Дополнительные задачи по установке 103 Часть II. FreeBSD как настольная система 121 Глава 4. Загрузка и завершение работы FreeBSD 123 Глава 5. Работа с системой X Window System 139 Глава 6. Работа с приложениями 169 Глава 7. Дополнительная настройка XI1 213 Часть III. FreeBSD и командная строка 263 Глава 8. Работа с командной оболочкой 265 Глава 9. Настройка командной оболочки 303 Глава 10. Программирование в командной оболочке 325 Глава 11. Основы программирования на языке Perl 373 Часть IV. Системное администрирование 401 Глава 12. Файловая система FreeBSD 403 Глава 13. Пользователи, группы и полномочия 433 Глава 14. Конфигурация системы и сценарии запуска 465 Глава 15. Мониторинг производительности, управление процессами и автоматизация задач 485 Глава 16. Установка дополнительного программного обеспечения 505 Глава 17. Печать 535 Глава 18. Конфигурация ядра 569 Глава 19. Поддержание актуальности FreeBSD 587 Глава 20. Добавление жестких дисков 617 Глава 21. Курс выживания в FreeBSD 641
6 Оглавление Часть V. Работа в сети FreeBSD 673 Глава 22. Принципы организации сетей на основе TCP/IP 675 Глава 23. Конфигурирование базовых сетевых служб 703 Глава 24. Работа в сети с помощью РРР и 802 Л1 723 Глава 25. Конфигурирование почтовых служб 739 Глава 26. Конфигурирование Web-сервера 781 Глава 27. Конфигурирование БТР<ервера 815 Глава 28. Конфигурирование Internet-шлюза 829 Глава 29. Конфигурирование сервера баз данных 847 Глава 30. Безопасность сети 887 Глава 31. Виртуальные частные сети (VPN) 935 Глава 32. Сервер доменных имен 951 Глава 33. Сетевая файловая система 971 Гпгава 34. Совместное использование файлов и печати с Microsoft Windows 983 Глава 35. Протокол динамической конфигурации хоста (DHCP) 999 Часть VI. Приложения 1007 Приложение А. Команды и конфигурационные файлы 1009 Приложение Б. Списки совместимого оборудования 1017 Приложение В. Поиск и устранение проблем в процедуре установки и загрузки 1031 Приложение Г. Источники дополнительной информации 1037 Предметный указатель 1046
Содержание Содержание Об авторе 27 Посвящение 27 Благодарности 27 От издательства 28 Введение 29 FreeBSD и коммерческое ПО 30 Преимущества FreeBSD 31 Как организована эта книга 32 Соглашения, принятые в этой книге 34 Часть I. Введение в FreeBSD 35 Глава 1. Что собой представляет FreeBSD 37 Преимущества использования FreeBSD 38 Что можно делать с помощью FreeBSD? 39 FreeBSD подходит уже не только для серверов 40 Краткая история FreeBSD и UNIX 41 Рождение операционной системы BSD 42 Рождение операционной системы FreeBSD 43 Философия разработки UNIX 44 FreeBSD в сравнении с другими операционными системами 46 Windows XP 46 Mac OS X 48 Linux 49 NetBSD 51 OpenBSD 51 Логотип FreeBSD 51 Глава 2. Установка FreeBSD 53 Проверка оборудования 54 Создание установочных дискет 55 Создание загрузочных дискет в DOS или Windows 57 Создание загрузочных дискет в FreeBSD или UNIX 57 Загрузка в программу установки 58 Навигация по программе Sysinstall 59 Создание разделов и назначение точек монтирования 61 Выбор жестких дисков 61 Разбиение диска или дисков на разделы 63 Редактор меток дисков (Disk Label Editor) 66 Создание разделов вручную 67
~ | Содержание Полезная информация об опции Soft Updates 74 Выбор дистрибутива * 75 Выбор источника установки 76 Конфигурирование и настройка системы после установки 78 Настройка сети 78 Настройка консоли 82 Выбор часового пояса 83 Совместимость с Linux 83 Настройка мыши 84 Установка дополнительных пакетов программного обеспечения 85 Добавление пользователя 87 Установка пароля для пользователя root 90 Выход из программы Sysinstall и перезагрузка системы 91 Первая загрузка FreeBSD 91 Настройка системы X Window System (XI1) 93 Автоматическое распознавание установленного видеооборудования 93 Тестирование X Server 95 Настройка Xorg с помощью xorgcf g 96 Точная настройка файла xorg. conf 99 Завершение работы FreeBSD 101 Глава 3. Дополнительные задачи по установке 103 Резервное копирование существующей файловой системы Windows или Linux 104 Неразрушающее разбиение жесткого диска на разделы с помощью FIPS 105 Запуск утилиты ScanDisk и программы дефрагментации 106 Получение FIPS и создание загрузочной дискеты 107 Работа с программой FIPS 108 Потенциальные проблемы и ограничения систем с двойной загрузкой 111 Двойная загрузка для DOS, Windows 95, Windows 98, Windows Me или Windows XP 112 Двойная загрузка для Linux 112 Диспетчер загрузки FreeBSD 113 Альтернативные методы установки FreeBSD 114 Установка FreeBSD через FTP 115 Установка FreeBSD с помощью NFS 118 Часть II. FreeBSD как настольная система 121 Глава 4. Загрузка и завершение работы FreeBSD 123 Процесс запуска FreeBSD 124 Процедура POST и BIOS 124 Процедура самозагрузки 124 Ядро 126 Вход в систему FreeBSD 132 Выход из системы FreeBSD 134 Завершение работы системы FreeBSD 134 Использование команды shutdown 134
Содержание 9 Глава 5. Работа с системой X Window System 139 Знакомство с XI1 140 X Server 141 Оконные диспетчеры 142 KDE и GNOME 143 Установка KDE 145 Включение диспетчера регистрации KDM 146 Среда KDE 148 Работа с файлами и папками 150 Просмотр файлов, которые находятся на удаленных томах 151 Переход в другую рабочую область 153 Изменение внешнего вида и поведения KDE 153 Приложения KDE 154 Завершение сеанса KDE 155 Работа с оконными диспетчерами 156 Установка оконных диспетчеров 156 Выбор оконного диспетчера, который должен использоваться по умолчанию 157 Оконный диспетчер Window Maker 158 Работа с окнами 160 Меню в Window Maker 161 Работа с панелью Dock 161 Установка и использование DockApp-приложений 162 Настройка Window Maker 164 Утилита Preferences 165 Завершение работы Window Maker и X11 167 Глава 6. Работа с приложениями 169 Запуск приложений с графическим по тык вагельским интерфейсом и интерфейсом командной строки 171 Работа с текстом 173 Использование редактора ее 175 Редактор vi 178 Графическое редактирование текста с помощью KEdit или gedit 186 Офисные приложения 187 Функциональная совместимость 188 Создание и редактирование изображений с помощью GIMP 189 Аудиоприложения 191 Активизация звуковой поддержки 192 Использование микшера 193 Воспроизведение МРЗ-файлов в XI1 с помощью XMMS 196 Сетевые приложения 197 Web-браузеры для XII 197 Web-браузер Lynx 199 FTP 200 Приложения электронной почты 204 Работа с Java-приложениями 210 Установка Java-приложений 210 Запуск Java-приложений 211
10 Содержание Глава 7. Дополнительная настройка Х11 213 Конфигурирование XI1 с помощью сценария xorgconfig 214 Настройка мыши 216 Выбор клавиатуры 218 Настройка монитора 221 Настройка видеокарты 224 Что собой представляет файл xorg. conf 236 Синтаксис, используемый в файле xorg.conf 237 Раздел "Module" 238 Раздел "Files" 238 Раздел "ServerFlags" 239 Раздел "InputDevice" 241 Раздел "Monitor" 244 Раздел "Device" 245 Раздел "Screen" 246 Раздел "Serve r Lay out" 247 Тестирование конфигурации XI1 248 Персональный файл .xinitrc 249 Смена оконного диспетчера 249 Автоматический запуск приложений 251 Установка цвета фона и фонового рисунка 252 Работа со шрифтами 254 Проверка файла xorg. conf на наличие в нем поддержки для шрифтов 254 Создание каталогов и установка шрифтов 255 Использование удаленных клиентов XI1 256 Использование программы xhost для позволения удаленным приложениям отображаться локально 257 Запуск удаленного приложения 259 Другие способы управления доступом клиентов 260 Использование графического диспетчера XDM 260 Часть HI. FreeBSD и командная строка 263 Глава 8. Работа с командной оболочкой 265 Что собой представляет командная оболочка 266 Выбор командной оболочки для FreeBSD 267 Командная оболочка Bourne (sh) и POSIX 268 Командная оболочка С (csh) 268 Командная оболочка Korn (ksh или pdksh) 269 Командная оболочка Bourne Again (bash) 270 Командная оболочка tcsh 270 Командная оболочка zsh 271 Какую командную оболочку лучше выбрать? 271 Смена командной оболочки 271 Получение справки в командной оболочке 273 Поиск страниц в руководстве 274
Содержание 11 Краткие описания команд 275 Разделы руководства 275 Основные операции для работы с файлами в командной оболочке 277 Как FreeBSD хранит файлы 277 Просмотр содержимого каталогов 278 Навигация по файловой системе 280 Копирование файлов и каталогов 281 Перемещение и переименование файлов и каталогов 283 Удаление файлов и каталогов 283 Создание и удаление каталогов 284 Команда touch 284 Создание ссылок 284 Универсальные опции 287 Метасимволы и операции с групповыми символами 288 Соответствие диапазонам символов 288 Замечания касательно имен файлов 289 Необычные имена файлов 290 Куда делся файл? 291 Команды для обработки текста 292 Подсчет строк, слов и символов 292 Просмотр текстовых файлов: less и more 293 Просмотр только верхней или нижней части текстового файла 293 Поиск по образцу 294 Сортировка текста в файле 295 Замена строк с помощью команды tr 296 Отображение только определенных частей строк в текстовых файлах 296 Форматирование текста с помощью команды f mt 297 Конвейеры и переадресация ввода-вывода 298 Завершение команд и редактирование хронологии 300 Глава 9. Настройка командной оболочки 303 Добавление командных оболочек в систему и предоставление к ним доступа 304 Установка командных оболочек из коллекции портов или коллекции пакетов 305 Файл /etc/shells 306 Использование альтернативных командных оболочек 308 Замена командной оболочки во время сеанса работы 308 Замена командной оболочки, используемой по умолчанию 308 Использование других программ в качестве командных оболочек 310 Файлы инициализации командной оболочки 313 Файлы оболочек tcsh и csh: . cshrc, . login и . logout 313 Файлы bash: .profile, .shrcn .bash_logout 315 Настройка среды командной оболочки 317 Настройка tcsh 318 Настройка bash 320 Переменные среды и переменные оболочки 322 Переменные среды 322 Переменные оболочки 323
12 Содержание Глава 10. Программирование в командной оболочке 325 Зачем нужно уметь программировать на языке оболочки 326 Простая программа оболочки 329 Построчный анализ сценария оболочки 330 Использование команды printf 332 Переменные 333 Присваивание значений переменным 334 Имена переменных 335 Взаимодействие с пользователем 335 Обработка аргументов командной строки 337 Подстановка команд 338 Арифметические операции в программах оболочки 338 Циклы 341 Цикл while 341 Цикл until 343 Логические операторы И/ИЛИ в циклах while и until 344 Цикл for 345 Команда shift 346 Операторы,true и false 347 Прерывание цикла 347 Условные операторы 349 Опера горы i f 349 Операторы сазе 354 Логические условные операции И/ ИЛИ 356 Значение состояния завершения 356 Установка значения состояния завершения 358 Перехват сигналов завершения работы 359 Функции 361 Дескрипторы файлов 361 Отладка сценариев оболочки 363 Дополнительные возможности, доступные дчя программирования в оболочке Когп 365 Установка командной оболочки Когп 366 Встроенные арифметические функции 366 Массивы 367 Подстановка команд 371 Использование команды getopt s 371 Глава 11. Основы программирования на языке Perl 373 Perl в FreeBSD 374 Преимущества Perl 375 Недостатки Perl 376 Основные технологии написания сценариев на языке Perl 377 Переменные и операции 379 Скаляры, массивы и ассоциативные массивы 381 Управление выполнением программы 383 Аргументы командной строки 386 Простой сценарий Perl 386
Содержание 13 Дополнительные технологии программирования на языке Perl 387 Обработка текстовых данных 387 Использование дескрипторов файлов для работы с файлами 391 Функции 393 Модули Perl 395 Полезные источники информации о языке Perl 397 Web-сайты 397 Книги 398 Архив CPAN 399 Часть IV. Системное администрирование 401 Глава 12. Файловая система FreeBSD 403 Структура каталогов FreeBSD 405 Мониторинг использования файловой системы 408 Команда df (свободное место на диске) 409 Команда du (использование диска) 410 Монтирование и размонтирование файловых систем FreeBSD 411 Команда mount 411 Команда umou n t 413 Монтирование и размонтирование файловых систем из других операционных систем 414 Монтирование файловой системы Windows/MS-DOS 416 Монтирование файловой системы Linux 417 Монтирование и размонтирование файловых систем компакт-дисков и дискет 419 Монтирование компакт-дисков и дискет 419 Размонтирование компакт-дисков и дискет 420 Другие съемные носители 421 Файл /etc/f stab 421 Проверка и исправление файловых систем с помощью программы f sck 423 Ведение журналов файловых систем и Soft Updates 425 Использование программы f sck для восстановления поврежденного суперблока 426 Установка и ввод квот на использование диска 428 Мягкие и жесткие лимиты 430 Блоки, файлы и индексные дескрипторы 431 Глава 13. Пользователи, группы и полномочия 433 Знакомство с пользователями и группами 436 Для чего используются группы? 439 Владение файлом 440 Использование команды chown для изменения владельца файла 441 Использование команды chgrp для изменения группы-владельца файла 442 Полномочия на доступ к файлам и каталогам 443 Отношения между полномочиями на файлы и каталоги 444 Использование команды chmod для изменения полномочий на файлы и каталоги 445
14 Содержание Списки контроля доступа 448 Конфигурирование ядра для поддержки списков контроля доступа 448 Конфигурирование файловых систем UFS1 для использования списков контроля доступа 449 Включение ACL в смонтированных файловых системах 450 Получение информации о текущих параметрах настройки ACL 450 Установка маски максимальных полномочий 451 Добавление пользователя или группы в ACL 451 Отказ в доступе с помощью списков контроля доступа 454 Удаление записей списка контроля доступа 454 Добавление и удаление пользователей 455 Настройка параметров по умолчанию для adduser 455 Добавление пользователя с помощью сценария adduser 456 Удаление пользователя с помощью команды rmuser 458 Файлы /etc/passwdn /etc/master.passwd 459 Файл /etc/group 461 Управление группами 461 Управление пользователями с помощью NIS 462 Глава 14. Конфигурация системы и сценарии запуска 465 Процесс запуска FreeBSD 466 Прохождение процесса загрузки 467 Безопасность процесса загрузки 469 Что может замедлить процесс загрузки? 470 Сценарии конфигурации ресурсов 471 Каталог /etc/red 471 Файл /etc/defaults/rc.conf 473 Файл /etc/rc • conf 475 Каталоги /usr/local/etc и /usr/local/xilR6/etc 477 Создание сценариев для запуска программ во время загрузки системы 479 Демон inetd и конфигурационный файл inetd. conf 480 Системный регистратор (s уs 1 ogd) и файл s уs 1 og. conf 482 Замечания касательно файла /etc/rc. local 484 Глава 15. Мониторинг производительности, управление процессами и автоматизация задач 485 Мониторинг производительности с помощью утилиты top 486 Объяснение информации, выводимой утилитой top 487 Использование интерактивных команд top 490 Мониторинг процессов с помощью программы ps 491 Объяснение информации, выводимой программой ps 492 В каких случаях ps используется вместо top 492 Завершение неправильно функционирующих процессов 493 Уничтожение процессов внутри вывода top 493 Программа kill командной строки и ее опции 494 Как сделать процесс "хорошим"? 495 Автоматизация процессов с помощью демона планировщика сгоп 496
Содержание I 7Г" Анатомия файла crontab 497 Создание и редактирование файлов crontab 499 Использование команды at для формирования заданий, выполняемых в запланированное время 499 Управление доступом к командам сгоп и at 501 Использование планировщика периодических задач 502 Глава 16. Установка дополнительного программного обеспечения 505 Введение в пакеты 506 Общие библиотеки и зависимости 508 Получение информации об инсталлированных пакетах 509 Установка пакетов 513 Установка из Sysinstall 51S Использование утилиты pkg_add 516 Удаление и обновление пакетов 518 Модернизация инсталлированных пакетов 518 Введение в порты 519 Дерево портов FreeBSD 520 Анатомия порта FreeBSD 522 Установка и удаление портов 524 Обновление и обслуживание портов 525 Поддержка актуальности портов с помощью инструмента CVSup 525 Замечания по запрещенным портам 527 Восстановление пространства на жестком диске посредством процесса сборки порта 528 Если порт не будет собран: поиск решений 529 Модернизация порта 530 Модернизация портов с помощью Portupgrade 531 Web-сайт Fresh Ports 533 Глава 17. Печать 535 Принцип работы демона lpd, спулера печати и очереди печати в FreeBSD 537 Конфигурация режима ядра, устройства и связей 538 Конфигурирование режима параллельного порта 539 Поддержка конфигурации параллельного порта после перезагрузок 540 Проверка связности порта принтера 540 Создание каталога спула и установка его полномочий 541 Настройка фильтров текста и фильтров преобразования 541 Текстовые фильтры 541 Фильтры преобразования 546 Конфигурирование /etc/printcap для управления функциями системы печати 548 Создание файла /etc/printcap 548 Инсталляция фильтров преобразования 548 Печать из командной строки с помощью lpd 549 Базовая печать в режиме командной строки 550 Печать из приложений XI1 551 Печать в OpenOffice.org 552
16 Содер: жание Управление принтером в KDE 553 Использование команды lpq для проверки состояния заданий печати 554 Удаление заданий из очереди с помощью команды lprm 555 Управление принтерами 557 Использование 1рс в интерактивном режиме 557 Использование программы 1рс в неинтерактивном режиме 562 Как управлять разрешениями на использование 1рс 563 Базовая печать через сеть 563 Печать следующего поколения с помощью CUPS 564 Поиск и устранение неполадок 566 Принтер не получает данные; задания находятся в очереди 566 Данные попадают на принтер, но он их не печатает 566 Печать файла изображений в GIMP или Web-страницы приводит к печати множества страниц с мусором 566 Принтер работает медленно 566 Печать строк производится в виде "лесенки" 567 Весь текст печатается в одной строке, порождая беспорядок и выводя строки поверх существующего текста 568 Глава 18. Конфигурация ядра 569 Роль ядра 570 Модули ядра 572 Для чего нужно конфигурировать специальное ядро? 573 Упрощение ядра 574 Использование утилиты dmesg для получения информации о запуске ядра 575 Конфигурационные файлы ядра 577 Конфигурационный файл GENERIC 578 Подсказки устройств 580 Файлы NOTES и LINT 581 Создание конфигурационного файла специального ядра 582 Компиляция и установка специального ядра 583 Добавление узлов устройств в каталог /dev 584 Как произвести восстановление, если что-то работает неправильно? 585 Глава 19. Поддержание актуальности FreeBSD 587 Отслеживание исходных кодов FreeBSD 589 Что собой представляют ветви STABLE и CURRENT исходных кодов 590 Выбор цели модернизации 591 Модернизация с помощью процесса make world 595 Что нужно учесть, прежде чем приступать к модернизации с помощью процесса make world 596 Задачи, которые нужно выполнить перед процессом make world 598 Синхронизация существующего дерева исходных кодов с деревом STABLE или CURRENT, ветвью исправления ошибок или выпуском 599 Текстовый файл UPDATING 603 Объединение /etc/group и etc/passwd 604 Объединение файла /etc/make. conf 605
Содержание 17 Пересборка системы из исходных кодов 606 Очистка /usr/obj 606 Запуск журнала выходных данных 607 Запуск, поиск и устранение неполадок make buildworld 608 Модернизация ядра 609 Запуск, поиск и устранение неполадок процесса make installworld 611 Использование утилиты mergemaster для проверки измененных конфигурационных файлов 612 Запуск утилиты me r gema s te r 613 Поиск и устранение неполадок в работе утилиты mergemaster 615 Перезагрузка после модернизации 615 Глава 20. Добавление жестких дисков 617 Режимы доступа IDE/ATA 618 Режимы РЮ 619 Режимы DMA 619 Режимы Ultra DMA (UDMA) 620 Диски SCSI 621 Геометрия жесткого диска 622 LBA и ограничение в 528 Мбайт 624 Режимы Extended INT13 и ограничение в 8,4 Гбайт 625 48-битная LBA 625 Практические последствия установки FreeBSD в старых системах 626 Разбиение жесткого диска 626 Разделы BIOS (секции) 626 Разделы BSD 627 Внешние расширенные разделы 628 Редактор секций (f di s k) в программе Sysinstall 628 Создание меток диска 630 Создание полной компоновки разделов FreeBSD 630 Добавление нового диска 632 Запись изменений и форматирование диска 633 Как сделать файловую систему доступной для использования 634 Повышение производительности диска с помощью RAID и Vinum 634 Глава 21. Курс выживания в FreeBSD 641 Переход на FreeBSD 642 Миграция из Windows 643 Миграция из Linux 648 Что нужно, и чего нельзя делать (обычные трудности) 655 Настройка производительности 658 Настройки ядра 659 Soft Updates и асинхронные записи 660 Соображения по поводу геометрии диска 661 Несколько настроек программы sysctl 662 Полезные страницы руководства 663 Готовимся к худшему: резервные копии и зеркала 663
18 Содержание Создание файлов прототипов 664 Резервные копии 664 Использование утилиты dump 666 Восстановление 667 Зеркала 668 Часть V. Работа в сети FreeBSD 673 Глава 22. Принципы организации сетей на основе TCP/IP 675 Введение в сети 676 Топологии сетей 678 Компоненты сети 680 Кабели 681 Концентраторы 683 Коммутаторы 685 Маршрутизаторы 687 Беспроводные маршрутизаторы 688 Сетевые протоколы 689 Протокол управления передачей (TCP) 690 Протокол передачи дейтаграмм пользователя (UDP) 690 Протокол управляющих сообщений Internet (ICMP) 691 IP-адреса 692 Подсети и маски сети 692 Работа с IP-адресами 694 Работа с сетями на уровне Ethernet 695 Маршрутизация между сетями с использованием ARP и МАС-адресов 696 Проверка содержимого кэша ARP командой агр 697 Маршрутизация 698 Неверная конфигурация маршрута 699 Шлюзы и преобразование сетевых адресов 700 Имена хостов и доменные имена 701 Протокол динамического конфигурирования хоста (DHCP) и автоматическая IP-адресация 702 Глава 23. Конфигурирование базовых сетевых служб 703 Конфигурирование сетевой карты 704 Конфигурирование сетевых настроек с помощью Sysinstall 706 Конфигурирование сетевых настроек без Sysinstall 710 Использование i f config для применения сетевых настроек 710 Использование route для установки маршрутизатора-шлюза 712 Использование hostname 714 Сетевые настройки в /etc/rс. conf 714 Использование /etc/netstart 715 Создание IP-псевдонимов 716 Отображение имен на IP-адреса в файле /etc/hosts 717 Тестирование сетевого соединения с помощью ping 718 Конфигурирование DNS в файле /etc/resolv. conf 719
Содержание I 7Z I Обзор других конфигурационных файлов сети 720 Глава 24. Работа в сети с помощью РРР и 802.11 723 Дозвон с помощью РРР 724 Сбор необходимой информации 724 Конфигурирование демона РРР ядра 725 Запуск демона pppd 729 Аутентификация РАР и CHAP 729 Дозвон по требованию и постоянные соединения 731 Запуск команд при подключении и отключении 732 РРР поверх Ethernet (PPPoE) 733 Устранение неполадок в РРР 734 Подключение к беспроводной (802.11) сети 735 Выбор беспроводной карты 735 Базовые (нешифрованные) беспроводные соединения 736 Шифрованные беспроводные соединения 737 Сценарии подключения и отключения 738 Глава 25. Конфигурирование почтовых служб 739 Введение в SMTP 740 Агенты передачи почты (МТА) и почтовые агенты пользователя (MUA) 743 Распространенные МТА 743 Распространенные MUA 744 Конфигурирование базовых почтовых служб с Sendmail 746 Раскладка файлов Sendmail 746 Конфигурационные файлы 747 Преобразование DNS 752 Управление Sendmail 753 Очередь сообщений 754 Понятие ретрансляции 756 Как работает ретрансляция . 756 Конфигурирование S1 для разрешения ретрансляции пользователям 757 Введение в РОРЗ 759 Конфигурирование сервера РОРЗ с помощью Qpopper 760 Дополнительная информация 764 Конфигурирование сервера IMAP с помощью IMAP-UW 765 Электронная почта для отдельно стоящих рабочих станций 767 Использование Fetchmail для извлечения почты с серверов РОРЗ и IMAP 767 Конфигурирование файла • f etchmailrc 768 Конфигурация Sendmail для отдельно стоящих рабочих станций 771 Фильтрация мусорной почты средствами Procmail и SpamAssassin 772 Установка SpamAssassin 774 Установка Procmail 775 Обзор некоторых альтернатив Sendmail 778 Postfix 778 Qmail 779 Exim 779
20 Содер: жание Глава 26. Конфигурирование Web-сервера 781 Введение в протокол HTTP 782 Структура запроса HTTP 783 Коды ответа и перенаправления 785 Получение и установка Apache 786 Раскладка файлов Apache 787 Конфигурирование Apache 789 Использование httpd. conf 790 Использование файлов . htaccess и переопределений 791 Запуск и останов демона HTTP 793 Базовый контроль доступа в Apache 795 Контроль доступа по адресу 795 Контроль доступа по паролю 796 Контроль доступа по адресу и паролю 799 Виртуальный хостинг 800 Введение в модули Apache 802 Встроенные модули 802 Динамически загружаемые модули 803 Модули от независимых поставщиков 804 Включения стороны сервера 806 Введение в CGI 809 Включение CGI в Apache 809 Разработка CGI-программ 811 Глава 27. Конфигурирование FTP-сервера 815 Введение в протокол передачи файлов 816 Раскладки файлов аутентифицированного и анонимного FTP 819 Конфигурирование FTP-сервера 820 Контроль FTP-доступа 823 Файл /etc/f tpusers 823 Файл /etc/shells 824 Файл /var/run/nologin 824 Разрешение анонимного FTP-доступа 825 Виртуальный хостинг 826 Использование альтернативных FTP-серверов 827 WU-FTPD 827 vsftpd 827 ProFTPD 828 Secure FTP (sftp) 828 Глава 28. Конфигурирование Internet-шлюза 829 Основы маршрутизаторов и преобразования сетевых адресов (NAT) 830 Что такое шлюз? 832 Что такое NAT? 832 Конфигурирование шлюза NAT в FreeBSD 834 Разрешение пересылки пакетов 835
Содержание 21 Включение NAT для систем без статических IP-адресов 835 Применение пользовательского РРР 836 Использование РРР ядра или выделенного Ethernet-соединения с Internet 836 Конфигурирование и включение natd 837 Включение и конфигурирование брандмауэра 837 Конфигурирование клиентов для использования нового шлюза 838 Конфигурирование клиентов Windows 839 Конфигурирование клиентов Mac OS и Mac OS X 839 Конфигурирование клиентов FreeBSD 841 Конфигурирование клиентов Linux 841 Конфигурирование точки беспроводного доступа в Internet 842 Маршрутизация между тремя и более сетями 843 Динамическая маршрутизация 845 Маршрутизация в пределах предприятия и DMZ 846 Глава 29. Конфигурирование сервера баз данных 847 Введение в дизайн и администрирование баз данных 848 SQL: язык структурированных запросов 849 Базовый синтаксис SQL 851 Использование баз данных с открытым кодом MySQL и PostgreSQL 854 В чем отличия между MySQL и PostgreSQL? 854 Инсталляция MySQL 855 Инсталляция PostgreSQL 856 Конструирование системы баз данных 859 Создание таблиц 862 Поддержание безопасности 865 Написание административных сценариев 867 Подключение к базам данных с помощью Perl 867 Подключение к базам данных с помощью Python 869 Сценарий Perl для наполнения базы данных 869 Подключение базы данных к Web 870 Использование Perl и CGI для доступа к содержимому базы данных 871 Вставка данных в базу 871 Создание поисковой формы 873 Блокировка сеанса и целостность данных 875 Соображения безопасности 876 Использование РНР для обеспечения управляемого базой данных содержимого на Web-страницах 877 Инсталляция РНР 877 Поток управления и приемы программирования 878 Взаимодействие с базами данных 878 Соображения безопасности 880 Оптимизация производительности базы данных 880 Мониторинг использования базы данных 881 Создание временных таблиц 883 Использование кэш-таблиц 883 Выполнение резервного копирования базы данных 884
22 Содержание Подготовка дампа базы данных 884 Восстановление базы данных 885 Проектирование с учетом восстанавливаемости 886 Глава 30. Безопасность сети 887 Выбор модели безопасности на основе имеющихся рисков 888 Модели безопасности 888 Риски безопасности, с которыми вы сталкиваетесь 890 Политики паролей 891 Обеспечение безопасных паролей с помощью Crack 892 Обеспечение устаревания паролей 893 Присваивание начальных паролей 895 Одноразовые пароли с S/Key 896 Kerberos 899 Избежание проблем со службами открытого текста 899 Использование tcpdump для мониторинга трафика 900 Обеспечение дополнителькой безопасности с шифрованными протоколами ' 901 Защита терминального трафика (SSH) 902 Защита почтовых служб (РОРЗ и IMAP) 903 Защита FTP 905 Защита Apache 906 Apache-SSL 907 Apache с mod s s 1 907 Плохо написанные CGI-сценарии 908 Повышение безопасности CGI-сценариев с помощью CGIWrap 909 Системные профили безопасности и безопасность ядра (Securelevels) 910 Использование брандмауэра 913 Включение брандмауэра 914 Проектирование правил IPFW 915 Применение конфигурационного файла брандмауэра 917 Предотвращение проникновений и компрометации 918 Использование PortSentry 918 Использование /etc/hosts.allow 922 Использование Tripwire 923 Если вы подозреваете, что подверглись нападению... 926 Атаки типа "отказа в обслуживании" (DOS) 928 Ограничение количества порожденных процессов на сервере 929 Защита от атак атрамплиномп 930 Физическая защита 931 Другие ресурсы, посвященные безопасности 932 Страница man security 932 Списки рассылки 932 Рекомендации по безопасности FreeBSD 933 Ресурсы в Web 933 Книги 934
Содержание I ГГ~ Глава 31. Виртуальные частные сети (VPN) 935 Что такое VPN? 936 Топологии VPN 939 Службы VPN в FreeBSD: IPSec 941 Подготовка вашей системы 941 Подключение к серверу VPN в FreeBSD 944 Подключение к VPN-серверу Windows 946 FreeBSD как сервер VPN 949 Глава 32. Сервер доменных имен 951 Введение в структуру, функции и программное обеспечение DNS 952 Программное обеспечение DNS: BIND 953 Зоны 954 Файлы и программы BIND 954 Включение демона сервера доменных имен 955 Запуск BIND в sandbox 955 Работа с конфигурационным файлом BIND (named. conf) 956 Использование экспедитора 958 Конфигурации ведущего и ведомого 960 Другие типы зоны 961 Ограничение доступа к DNS 961 Создание файла зоны 963 Начальные записи зон (SOA) 964 Записи серверов имен (NS) 966 Записи адресов (А) 966 Записи канонических имен (CNAME) 967 Записи обмена почтой (MX) 967 Записи указателей (PTR) 968 Файлы зон обратного просмотра DNS 968 Создание файла зоны localhost 969 Конфигурирование кэширующего сервера имен 969 Глава 33. Сетевая файловая система 971 Введение в NFS 972 Конфигурирование сервера NFS 975 Демон NFS (nf sd) 975 Демон монтирования NFS (mountd) 976 Определение совместно используемых ресурсов в файле /etc/exports 976 Конфигурирование клиента NFS 978 Демон ввода/вывода NFS (nf s iod) 978 Монтирование удаленных файловых систем 979 Автоматическое монтирование удаленных файловых систем при загрузке системы 980 Демон автоматического монтирования (amd) 981
24 Содержание Глава 34. Совместное использование файлов и печати с Microsoft Windows 983 SMB/CIFS и Samba 985 Просмотр 985 Безопасность, рабочие группы и домены 986 Установка и конфигурирование Samba 987 Демоны smbd и nmbd 988 smb.conf и SWAT 988 Совместный доступ к каталогам 990 Разделяемые принтеры 991 Контроль доступа 992 Файлы журналов Samba 995 Переменные Samba 996 Прочие компоненты Samba 997 Доступ к совместно используемым файлам в системе Windows (файловая система smbf s) 997 Глава 35. Протокол динамической конфигурации хоста (DHCP) 999 Как работает DHCP 1000 Аренда IP-адреса 1000 Преимущества DHCP перед статическими IP-адресами 1001 Включение DHCP 1002 Программа dhclient 1003 Опции командной строки dhc 11ent 1003 Файл dhclient. conf 1003 Запуск сервера DHCP 1005 Часть VI. Приложения 1007 Приложение А. Команды и конфигурационные файлы 1009 Опции команд 1009 Команды для работы с файлами и каталогами 1010 Команды для работы с учетными записями и правами пользователей 1011 Команды, наиболее часто используемые в оболочке 1012 Команды для обслуживания системы и вызова системных утилит 1013 Команды для работы с принтером 1014 Команды для установки и удаления пакетов программ 1014 Общие конфигурационные файлы 1013 Приложение Б. Списки совместимого оборудования 1017 Требования к системе 1017 Поддерживаемое оборудование 1018 Дисковые контроллеры (IDE/ATA) 1018 Дисковые контроллеры (SCSI) 1018 Оптические дисководы (CD-ROM/DVD) 1020 Сетевые карты 1020 Беспроводные сетевые карты 1023 USB-устройства 1024
Содержание 25 Аудиоустройства 1024 Устройства FireWire (IEEE 1394) 1025 .Устройства Bluetooth , 1025 Видеокарты, поддерживаемые XI1 1025 Приложение В. Поиск и устранение проблем в процедуре установки и загрузки 1031 Проблемы, возникающие во время установки 1031 Загрузка с дискеты приводит к зависанию или перезагрузке системы 1032 Загрузочная дискета зависает на этапе "Probing Devices" ("Проверка устройств*) 1032 Система загружается с CD-диска, но программа установки сообщает о том, что CD-ROM не обнаружен 1032 Геометрия жесткого диска не распознается должным образом 1033 Micron и/или другие системы зависают при загрузке 1033 Проблемы, возникающие во время загрузки, и другие проблемы, случающиеся уже после установки FreeBSD 1033 FreeBSD при загрузке отображает сообщение "Missing Operating System** ("Отсутствует операционная система*) 1033 Диспетчер загрузки FreeBSD зависает на сообщении "F?" 1034 Загрузчик операционной системы FreeBSD отображает сообщение "Read Error" ("Ошибка чтения") и зависает 1034 Никакой экран диспетчера загрузки не появляется; сразу же загружается Windows 1034 FreeBSD распознает меньший объем ОЗУ, чем на самом деле доступный в системе 1034 При попытке смонтировать диск CD-ROM FreeBSD отображает сообщение "Device Not Configured" ("Устройство не сконфигурировано") 1035 Работа программ завершается и появляется сообщение об ошибке "Signal 11" 1035 При запуске top, ps и других системных утилит появляются странные сообщения (вроде "ргос size mismatch") 1036 Если вы забыли пароль пользователя root 1036 Приложение Г. Источники дополнительной информации 1037 Источники информации о FreeBSD 1037 Web-сайты 1037 Списки рассылки 1038 Общие списки 1038 Технические списки 1041 Посвященные FreeBSD группы новостей в Usenet 1042 Каналы IRC 1042 Источники информации по BSD в целом 1042 Web-сайты 1043 Другие источники в Internet 1043 Web-сайты 1043 Группы новостей в Usenet 1045 Предметный указатель 1046
Об авторе Брайан Таймэн (Brien Tiemann) — вольнонаемный писатель технического профиля, на литературном счету которого несколько книг по Mac OS X, iTunes, iPod и iLife, а также по FreeBSD (в частности, это уже третье издание этой книги). Брайан пользуется FreeBSD постоянно, еще со студенческих времен в Калифорнийском технологическом институте, где он работал в FreeBSD, создавая Web-сайт любителей кино, который существует до сих пор и прекрасно справляется с не перестающей увеличиваться нагрузкой. Сейчас Брайан живет в Сан-Хосе (штат Калифорния), присматривает за двумя собаками и в свободное время занимается разработкой устройств для оптимизации сетей. Посвящение Моим родителям Кейту и Энн, а также моему брату Майку и его жене Джулии. Брайан Таймэн Благодарности Это уже третье издание книги; как и в предыдущих изданиях, содержимое книги значительно изменилось, потому что изменилось программное обеспечение, которое в ней описывается, однако некоторые вещи остались прежними, а именно: неимоверные усилия сотрудников издательства Sams Publishing. В частности, мне хотелось бы поблагодарить Кейт Гивенс (Kate Givens), которая привела материал в корректный с точки зрения грамматики и стилистики вид, Джоша Мора (Josh More), который проверил правильность технических моментов, Джорджа Недеффа (George Nedeff), который вообще руководил всем процессом авторской вычитки и редактирования, а также Скотта Мейерса (Scott Meyers) и Дженни Уотсон (Jenny Watson), которые очень быстро скомпоновали весь проект. Также я должен поблагодарить Кэтрин Пердэм (Kathryn Purdum), которая, предоставила мне возможность работать над этой книгой еще в самом начале, много лет назад, когда такая возможность казалась практически нереальной. Конечно же, отдельной благодарности заслуживает Майкл Урбан (Michael Urban), с которым мы вместе трудились над предыдущими изданиями: многие написанные им главы легли в основу и этой книги. Его опыт работы с FreeBSD всегда служил прекрасным дополнением моему собственному, и он всегда приходил на помощь в тех вопросах, в которых я был не достаточно компетентен. Какой бы сложной и развернутой не была книга по FreeBSD, со сложностью самой FreeBSD ей все равно не сравниться, и усилия тех, кто создавал книгу, все равно нельзя сравнить с усилиями разработчиков FreeBSD, которые потратили бесконечное количество часов на то, чтобы "вывести FreeBSD в свет*, а также усилиями неутомимых пользователей, которые документируют и обмениваются своими впечатлениями через Internet. Без всех этих добровольных усилий создание подобного сложнейшего проекта было бы невозможным. Также я хочу отдельно поблагодарить Пола Саммерса (Paul Summers) за то, что он выполнял такую сложную и тяжелую работу администратора моего сайта, в то
Благодарности время как я лишь разглагольствовал, одобрял и раздавал указания издалека; Лэнса (Lance), Криса (Chris), Брайана Д. (Brian D.), Дэвида (David), Дрю (Drew), Зджонни (Zjonni), Джеррит (Gerrit), Маркуса (Marcus), Мэтта (Matt), Трента (Trent) и всех остальных моих друзей, которые помогли мне сформировать мнение и определиться с предпочтениями по операционным системам и программам; Джеймса (James), Стивена (Stiven), Майка (Mike), Майка (Mike) и всех остальных, кто постоянно читал мои опусы в онлайновом режиме, вдохновлял меня и помогал быть честным, а также (по моей'прихоти) уделял мне свое внимание даже в самое позднее время суток. И, наконец, я хочу выразить свою признательность всем членам TLK-L и Lionking.org за то, что они меня все время поддерживали, позволяя мне чувствовать, что я разбираюсь в том, о чем пишу. Может, экземпляр этой книги будет добавлен в библиотеку 8р, где ему, в принципе, самое место. От издательства Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше, и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы высказать в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо, либо просто посетить наш Web-сервер и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Посылая письмо или сообщение, не забудьте указать название книги и ее авторов, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты: E-mail: inf o@williamspublishing ¦ com WWW: http: //www. williamspublishing. com Информация для писем из: России: 115419, Москва, а/я 783 Украины: 03150, Киев, а/я 152 Благодарности издательства Издательский дом "Вильяме" благодарит Ерофеева Сергея за большой вклад в подготовку издания книги.
Введение Если вы читаете эту книгу, то, скорее всего, вы — технический специалист (профессионал в области информационных технологий), зарабатывающий себе на жизнь с помощью Internet и связанных с ним отраслей. Возможно, вы слышали о таком феномене как "программное обеспечение (ПО) с открытым кодом"; это ПО, созданное разработчиками-добровольцами, которое распространяется абсолютно бесплатно вместе с исходным кодом, что позволяет пользователям анализировать код любой доступной в этом ПО функциональной возможности и даже изменять его или добавлять что-то свое. Вы наверняка не прочь воспользоваться таким ПО с открытым i дом и сделать так, чтобы оно работало на вас. Тем не менее, существует вероятность, что о FreeBSD вы не слышали. Самой * "яркой звездой" в мире ПО с открытым кодом на сегодняшний день является доступная бесплатно операционная система Linux, которая уже заручилась финансовой поддержкой такого гиганта по разработке ПО как IBM, и постоянно маячит в заголовках новостей о компьютерных технологиях, но Linux — это не единственная доступная бесплатно операционная система семейства Unix. О FreeBSD реже пишут в новостях, но это более старая и более надежная операционная система, которая стояла еще у истоков Unix и имеет ряд технических и концептуальных преимуществ по сравнению со своей более "модной" соперницей. К преимуществам FreeBSD относится реализация стека сетевых протоколов TCP/IP, который многие находят одним из лучших в компьютерной индустрии, и реализация справочной системы, к которой разработчики другого ПО часто обращаются за справкой. Также одним из главных ее достоинств является надежная, основанная на микроядре архитектура, которую можно настроить так, что FreeBSD будет работать намного лучше, чем работала бы Linux в той же тестовой или производственной среде. Система пакетирования для сторонних программ в FreeBSD представляет собой очень простую и очень эффективную модель, и поскольку все в FreeBSD, начиная от ядра и заканчивая самыми маленькими вспомогательными программами, создавала одна группа разработчиков, каждому компоненту была уделена должная часть внимания, что в мире Linux встречается крайне редко. Таких отличий между FreeBSD и Linux еще очень много, хотя внешне эти две системы могут показаться очень похожими. Однако откуда же берутся эти отличия? Люди часто забывают, что Linux — это не Unix. Да, в принципе Linux можно назвать операционной системой, подобной Unix, потому что она выполняет те же функции, что и большинство наиболее популярных и продаваемых версий Unix. Однако ее от начала и до конца разрабатывали сами пользователи на основе исходного кода, поэтому перед ее названием так часто можно увидеть слово "GNU" ("GNU's Not UNIX" — проект по свободному распространению программного обеспечения). Все основные условия, которым должен отвечать проект GNU, перечислены в общедоступной лицензии GPI (GNU General Public License), где в качестве одного из пунктов указано, что любой разрабатываемый по этому соглашению код должен быть доступен бесплатно. Условия этого соглашения касаются также и коммерческих организаций, занимающихся разработкой ПО: любое ПО, которые они создают с помощью подпадающих под действие GPI материалов, они должны выпускать с доступным бесплатно исходным кодом. Если между сторонниками бесплатного и коммерческого ПО и возникают разногласия, то только по поводу этого с виду совсем безобидного лицензионного соглаше-
Введение ния. Проблема состоит в том, что многие компании не хотят принимать его условия, потому что для них бесплатное распространение исходного кода равнозначно разглашению профессиональных секретов. ПО, разрабатываемое в соответствии с условиями лицензии GPL, — это своего рода воплощение в реальность мечты о программном обеспечении, создаваемом людьми для людей, которое никому не принадлежит и которым могут пользоваться все, что противоречит принципам коммерческого ПО, которое продается в скомпилированной, исполняемой форме, и права на пользование которым принадлежат только одному конкретному производителю. В Linux эта мечта во многом осуществилась, но негативное влияние условий лицензионного соглашения GPL на бизнес привело к тому, что многие компании отказались использовать Linux в качестве основы при разработке своего ПО. И именно здесь становятся очевидными преимущества FreeBSD. FreeBSD и коммерческое ПО FreeBSD и Linux имеют разные традиции в смысле открытого кода. FreeBSD разрабатывалась не на основе лицензионного соглашения GPL, а на основе лицензионного соглашения BSD (Berkeley Software Design), в котором указывается, что код, первоначально разработанный в исследовательских центрах Калифорнийского университета в Беркли, может повторно использоваться при разработке ПО (в том числе и в коммерческих целях), и что последующая публикация исходного кода не является обязательным условием. Отчасти именно поэтому компания NeXT (которая была основана Стивом Джобсом (Steve Jobs)) предпочла использовать операционную систему BSD в качестве основы для своей платформы NeXTSTEP, которая, в конечном счете, превратилась в операционную систему Mac OS X. Точно так же, пытаясь прощупать почву и привлечь внимание научных кругов, Microsoft выпустила в 2002 году среду программирования для своего языка С# и сделала ее доступной для двух операционных систем, Windows и FreeBSD. Отсутствие в лицензионном соглашении BSD условия об обязательной бесплатной публикации "ключей от королевства" делает его более привлекательным для компаний, занимающихся разработкой ПО в коммерческих целях, нежели соглашение GPL. Оно, с одной стороны, стимулирует пользователей принимать участие в разработке, а, с другой стороны, не накладывает никаких ненужных ограничений на компании. Поэтому компании предпочитают тратить свои ресурсы на разработку именно BSD-сертифицированных программ и превращения их в по-настоящему полезные продукты. Из-за увеличения популярности Linux, FreeBSD приходится в прямом смысле "бороться за свое место под солнцем"; и хотя в технической прессе упоминания о FreeBSD сегодня встречаются практически так же часто, как и о Linux, большая часть внимания все равно достается Linux. Однако это вовсе не означает, что FreeBSD является в каком-то смысле менее привлекательной платформой, особенно если рассматривать ее с чисто технической точки зрения. На базе FreeBSD по-прежнему разрабатывают новый код и новые функциональные возможности, которые потом, подобно Mac OS X, превращаются в коммерческие продукты. Преимущества цельной архитектуры FreeBSD, которая поставляется в виде одного "дистрибутива" и с даже еще более усовершенствованным процессом инсталляции и пакетирования, сегодня ценятся не меньше, чем раньше. Новые версии FreeBSD продолжают выпускаться и пополняться постоянно появляющимися новыми технологиями (вроде Wi-Fi, FireWire и многоуровневой, симметричной параллельной обработкой), так что
Введение пользователю FreeBSD доступна та же (а в некоторых случаях даже большая) мощность, что и пользователю Linux, и он может выполнять все те же задачи, выполнение которых в Windows невозможно. Все это означает, что FreeBSD вполне подходит вам, если вы: • Научный сотрудник, которому в лаборатории необходима стабильная платформа для тестирования. т • Любознательный пользователь, который хочет открыть для себя мир настольных систем с открытым кодом. • Специалист, тестирующий высокоэффективную топологическую схему сети, • Администратор Web-сайта, которому необходима стабильная система с определенной структурой. • Разработчик ПО, ищущий возможности внести свой вклад в разработку коммерческих продуктов, таких как операционная система Mac OS X. • Просто пользователь, который не хочет зависеть от ограничений ПО с закрытым кодом. Преимущества FreeBSD Я впервые решил установить FreeBSD в 1997 году, когда вышла версия 2.2.2. Мое внимание к FreeBSD привлек тот факт, что уже на столь ранней стадии развития этой операционной системы поисковая система Yahoo! предпочла использовать в качестве платформы ее, а не Linux, а также то, что Hotmail (до того, как была приобретена Microsoft) использовала ее параллельно с Solaris для обработки огромного трафика, создаваемого пользователями ее работающей через Web службы электронной почты. Эти сведения показались мне достаточно убедительными, а когда я узнал, что FreeBSD можно установить через сеть с помощью установочных дискет, у меня вообще отпали все сомнения. С того времени FreeBSD сильно изменилась: структура системы стала намного более организованной, модель безопасности — более сложной и более надежной, а революционный механизм "коллекции портов" для установки сторонних программ — настолько популярным, что он был даже импортирован в NetBSD, OpenBSD и Mac OS X. Также более простой стала и процедура перехода на FreeBSD с других платформ. Многие коммерческие и бесплатные (то есть с открытым кодом) версии Unix имеют свою собственную иерархию файловой системы и методы конфигурирования, изучать которые — это то же самое, что и изучать другой иностранный язык; а модель FreeBSD, основанная на централизованных конфигурационных файлах и имеющая четко контролируемую структуру файловой системы, является более предсказуемой и более удобной для администрирования, чем какая-либо другая система в мире Unix. Поэтому ее легче осваивать, особенно пользователям, которые давно работают с другими платформами Unix. И, наконец, модуль ядра Linux, обеспечивающий совместимость на уровне двоичных кодов, позволяет программам, разрабатывавшимся в коммерческих целях для Linux (таким как RealPlayer и Oracle), запускаться на платформе FreeBSD. Хотя FreeBSD не пользуется такой популярностью, как Linux (или даже можно сказать, страдает от этой популярности), она действительно предоставляет практически все основные преимущества, доступные пользователям, которые работают с Linux, а также множество своих собственных преимуществ.
Введение Сейчас Linux занимает первое место по популярности среди операционных систем с открытым кодом (и, по крайней мере в ближайшем будущем, эта ситуация вряд ли изменится). Однако FreeBSD продолжает удерживать свои позиции на рынке, представляя собой альтернативный вариант операционной системы для компаний, которые устали от "диктатуры" Microsoft, но беспокоятся о возможных негативных последствиях перехода на Linux или не знают, какой дистрибутив лучше выбрать. Другие BSD-сертифицированные операционные системы тоже "надежно закрепились" на соответствующих участках рынка: OpenBSD, например, продолжает считаться самой безопасной из всех доступных операционных систем, a NetBSD славится тем, что может запускаться на огромном количестве различных аппаратных платформ, начиная от Intel x86 и Motorola PowerPC и заканчивая Sega Dreamcast. Роль FreeBSD более универсальна — при теперешнем мощном оборудовании она запросто может использоваться в качестве полнофункционального Internet-сервера или рабочей станции. Она не является чрезмерно специализированной и не выставляет условий, которые могут отпугнуть финансовых директоров корпораций. Она придерживается курса, который пролегает как раз между двумя существующими сегодня противоположными направлениями, и в ближайшие годы, скорее всего, по-прежнему будет занимать стабильные позиции на рынке и оставаться наиболее предпочитаемым вариантом операционной системы в мире среди компьютерных профессионалов с высокими требованиями. Мы не могли в точности предвидеть, каким будет состояние компьютерной индустрии ни двадцать, ни десять, ни даже пять лет назад. И сейчас мы тоже даже не можем себе представить, что ждет нас через 10 или 20 лет, но, судя по тому, как успешно складывалась судьба FreeBSD до сих пор, можно сделать следующий вывод: FreeBSD будет с нами до тех пор, пока будет существовать такое направление, как "разработка ПО с открытым кодом". Возможно, настанет такой день, когда FreeBSD благодаря тому, что она представляет собой компромисс между гибкостью, которую подразумевает ПО с открытым кодом, и защищенностью, которой требует коммерческое ПО, станет единственно возможным типом платформы. Как организована эта книга Эта книга писалась с расчетом на разбирающегося в компьютерах читателя, которому всегда интересно узнать о новых технологиях. Я преследовал следующую цель: предоставить всю необходимую информацию для того, чтобы читатель, независимо от имеющегося у него уровня компьютерных знаний (по Windows или по Unix), мог извлечь максимальную выгоду из перехода на FreeBSD. Какая бы задача не стояла перед читателем (перенести отлаженный корпоративный сервер на быструю и стабильную платформу FreeBSD, создать высокоэффективную среду для тестирования или настроить "любительскую" машину для повседневной работы), в этой книге он сможет найти все, что ему нужно. Читая книгу "от корки до корки", вы сможете пройти полноценный образовательный курс по FreeBSD, начиная от первоначальных процедур установки и заканчивая сложными опциями и технологиями администрирования. В зависимости от имеющегося опыта работы с компьютерами или с FreeBSD, вы можете решить начать читать эту книгу сразу с какой-нибудь более поздней главы, в которой описывается интересующая вас тема. Однако чтобы получить полное представление о том, что делает FreeBSD уникальной операционной системой и какие идеи лежат в ее основе,
Введение я рекомендую начинать с первой главы, в которой подробно описывается процедура установки FreeBSD. Как бы вы не решили читать эту книгу (подряд или только выборочные главы), вы наверняка оцените логичность представленного в ней материала: • Часть I, "Введение в FreeBSD". В этой части описывается процедура установки FreeBSD. Если вы устанавливаете FreeBSD впервые или если вы хотите освежить свои знания о том, как это делается, вам следует начинать именно с этой части, • Часть II, "FreeBSD как настольная система". В этой части приводится краткий обзор доступных в FreeBSD графических сред для пользователя и особое внимание уделяется высокоэффективной настольной системе KDE. Эта информация может вам пригодиться, если вы не умеете пользоваться интерфейсом командной оболочки или если вы достаточно опытный пользователь и хотите сделать так, чтобы FreeBSD работала как настольная операционная система. Вы спокойно можете пропустить этот раздел, если знаете, как работать с командной оболочкой, a FreeBSD вас больше интересует из-за ее серверных возможностей, а не в качестве заменителя операционной системы Windows на вашей настольной системе. • Часть III, "FreeBSD и командная строка". В этой части описывается среда командной оболочки — интерфейс командной строки, являющийся главным в FreeBSD и других операционных системах типа Unix. В главах этой части вы узнаете, как можно настроить командную оболочку по своему вкусу и как можно автоматизировать работу с помощью сценариев, а также ознакомитесь с базовыми концепциями программирования в Perl. • Часть IV, "Системное администрирование". В этой части более подробно описываются технологии, позволяющие настраивать FreeBSD в соответствии с имеющимися конкретными требованиями. Здесь рассказывается о том, как устроена файловая система в FreeBSD, как работает система учетных записей и прав пользователей, а также о том, как можно конфигурировать систему и следить за ее работой (то есть выполнять мониторинг). В этой части вы научитесь устанавливать и обновлять сторонние программы и саму FreeBSD, настраивать параметры печати, а также добавлять на жесткий диск раздел и конфигурировать его именно так, как вам нужно. Завершающая глава этой части представляет собой краткий перечень основных, наиболее важных рекомендаций и технологий, необходимых для успешного администрирования системы FreeBSD, a также советов касательно того, как настроить машину FreeBSD так, чтобы ее производительность была максимальной. Многие из приводимых здесь трюков были выведены специалистами по Unix путем длительных проб и ошибок. • Часть V, "Работа в сети FreeBSD". В этой части приводится информация, позволяющая превратить машину FreeBSD в платформу Internet-сервера мирового класса. Сначала здесь описываются особенности сетевой работы через TCP/IP и процедура настройки такой работы в FreeBSD. Далее приводятся подробные инструкции по настройке базы данных, службы электронной почты, Web, FTP-сервера и служб маршрутизации, а также DNS, общего доступа к файлам Windows и NFS. Сетевая безопасность является очень важной темой для любого, кто желает создать сетевой сервер, и поэтому вы ни в коем случае не должны пропустить ее.
Введение • Часть VI, "Приложения", В этой части содержится информация справочного типа, которая может быть вам полезной, независимо от вашего уровня квалификации. Здесь вы найдете описание команд Unix, списки совместимого оборудования, инструкции по выявлению и устранению неисправностей, а также перечень дополнительных источников, которыми вы можете воспользоваться, когда вам перестанет хватать данной книги (но тогда вас уже наверняка можно будет назвать истинным специалистом). В этой книге рассматривается самая последняя из существующих на текущий момент версий FreeBSD — FreeBSD 6.1. Развитие FreeBSD в последние годы происходило в умеренном темпе, поэтому если у вас установлена версия FreeBSD 5.x, многое из того, о чем рассказывается в этой книге, подходит и вам. Конечно, наиболее значительные отличия между FreeBSD 6.x и несколькими последними версиями серии 5.x будут рассматриваться, но наибольшее внимание все же будет уделяться технологиям использования и соглашениям версий FreeBSD серии 6.x Соглашения, принятые в этой книге Для привлечения внимания читателя к важной (или просто интересной) информации, в этой книге использовались перечисленные ниже врезки. НА ЗАМЕТКУ Во врезках "На заметку" приводятся комментарии и другие дополнительные сведения по рассматриваемой на данный момент теме, а также подробные пояснения определенных вопросов. СОВЕТ Во врезках "Совет" предлагаются удобнее клавиатурные комбинации и советы о том, как сделать работу с FreeBSD более эффективной. Внимание! Во врезках "Внимание!" приводится очень важная информация о ловушках, которые могут подстерегать неосторожного пользователя в FreeBSD. Она поможет читателю избежать ненужных проблем. Кроме того, в этого книге также будут встречаться следующие типографские соглашения: • Команды, переменные, имена каталогов и имена файлов выделены моноширинным шрифтом. • Команды и текст, который следует вводить, выделяется моноширинным шрифтом с полужирным начертанием. • Метки-заполнители в описаниях синтаксиса выделяются моноширинным шрифтом с курсивным начертанием: вместо метки-заполнителя должно вводиться фактическое имя файла, значение параметра или другой элемент, в зависимости от того, что собой представляет данная метка-заполнитель.
ЧАСТЬ I Введение в FreeBSD В этой части... Глава 1. Что собой представляет FreeBSD Глава 2. Установка FreeBSD Глава 3. Дополнительные задачи по установке
ГЛАВА I Что собой представляет FreeBSD В этой главе... • Преимущества использования FreeBSD • Что можно делать с помощью FreeBSD? • FreeBSD подходит уже не только для серверов • Краткая история FreeBSD и UNDC • Философия разработки UNIX • FreeBSD в сравнении с другими операционными системами • Логотип FreeBSD
Введение в FreeBSD FreeBSD — это, гр\бо говоря, UNIX. To есть это полнофункциональная операционная система (ОС), в основе которой лежит оригинальное, высоконадежное программное обеспечение (ПО) UNIX, разработанное в Калифорнийском университете в Ьеркли. Она может запускаться на таких платформах, как Intel x86, 64-разрядной Opteron (производства AMD), Athlon 64 и Alpha (производства Intel) и UltraSPARC (производства Sun). FreeBSD можно установить абсолютно бесплатно практически на любом стандартном ПК. Добровольцы со всего мира постоянно совершенствуют FreeBSD, и исходный код системы бесплатно доступен каждому желающему. В этой главе читатель познакомится с некоторыми наиболее важными функциональными возможностями и преимуществами FreeBSD, сможет понять, что в принципе собой представляет эта операционная система и какие задачи она позволяет выполнять, узнает немного о том, как FreeBSD появилась и как ей удалось стать тем, чем она является сегодня, а также о том, чем она отличается от*других операционных систем подобного типа. Преимущества использования FreeBSD Причин, по которым стоит пользоваться операционной системой FreeBSD, существует, наверное, столько же, сколько людей, которые отдают ей предпочтение. Пожалуй, наиболее очевидная причина — это то, что FreeBSD доступна бесплатно, причем и самом что ни на есть прямом смысле этого слова: ее не только можно бесплатно загрузить и установить, но и за нее не нужно платить никаких лицензионных отчислений. Вы можете установить одну копию FreeBSD на стольких компьютерах, на скольких пожелаете, не потратив буквально ни гроша. В отличие от некоторых коммерческих сетевых операционных систем, при использовании FreeBSD на сервере также не нужно платить и ни "за соединение", ни "за пользователя". Однако то, что FreeBSD доступна бесплатно, вовсе не означает, что она хуже коммерческих операционных систем по качеству. Ниже перечислено еще несколько убедительных причин, по которым стоит задуматься о переходе на FreeBSD. • Она чрезвычайно стабильна. Известно, что серверы FreeBSD могут работать без перезагрузки в течение более чем трех лет. • Ей доверяют одни из самых крупных компаний, и она используется на некоторых наиболее загруженных сайтах в мире. Среди этих компаний и сайтов Sony, Yahoo! и The Apache Project. • Ее код открыт для пользователей. Исходный код этой операционной системы полностью доступен для пользователей, то есть они могут изменять его, выполнять в нем проверку средств безопасности, разрабатывать новые функциональные возможности и затем добавлять их в операционную систему. • Для нее доступны тысячи бесплатных пакетов программ. Пользователи FreeBSD могут устанавливать тысячи бесплатных, доступных для UNIX программ для выполнения любых задач, начиная от игры в шахматы и заканчивая моделированием процесса деления клеток и роста бактерий, обработкой текста, редактированием изображений и обслуживанием Web-страниц.
Что собой представляет FreeBSD 39 Глава 1 Что можно делать с помощью FreeBSD? Поскольку FreeBSD поставляется с компиляторами для множества языков программирования, задачи, которые пользователь может выполнять в этой операционной системе, ограничиваются только воображением этого пользователя и тех ническими возможностями имеющегося у него оборудования. Разные организации используют FreeBSD по-разному: одни применяют ее просто для обеспечения возможности обмена файлами на старых машинах с процессорами класса 486, другие — для создания сложных, специальных эффектов и визуализации генерируемых компьютером анимационных изображений. НА ЗАМЕТКУ Спецэффекты для кинофильма "Матрица" создавались и визуализировались на мощном кластере мультипроцессорных систем на базе FreeBSD. Ниже перечислены цели, для которых FreeBSD применяется наиболее часто и которые не требуют наличия навыков в области программирования и установки специально о программного обеспечения: • Совместное использование файлов и принтеров. Доступное бесплатно программное обеспечение Samba (о котором более подробно будет рассказываться в главе 34) позволяет использовать файлы и принтер совместно с компьютерами, работающими под Windows. Благодаря Samba FreeBSD может даже служить главным контроллером домена для сети Windows. • Обслуживание Web-страниц. Как уже упоминалось ранее, FreeBSD обслуживает некоторые из наиболее загруженных Web-сайтов в мире. Даже если никакой Web- сайт для работы в Internet не создается, из FreeBSD все равно может получиться и прекрасный сервер для обслуживания внутренней сети. Пользующееся огромным спросом серверное ПО Apache, которое обеспечивает совместимость с практически каждой платформой в мире, создавалось на основе FreeBSD. • Службы электронной почты. FreeBSD запросто можно использовать в качестве сервера электронной почты: из нее можно сделать систему с IMAP-достуном и шифрованием, или систему со сложным механизмом фильтрации спама, или даже систему с Web-доступом к почте и возможностями календаря. • Маршрутизация, службы DNS и общий доступ в Internet. FreeBSD позволяет превратить даже машину с маломощным процессором серии Pentium в весьма эффективный маршрутизатор, сервер DNS или шлюз для использования одного Internet-соединения на нескольких компьютерах. • Решения для баз данных. Используя FreeBSD и одну из нескольких доступных бесплатно баз данных SQL, можно создать решение, реализация которого с использованием коммерческого ПО вполне могла бы обойтись в несколько десятков тысяч долларов. Если вычислительных возможностей доступных бесплатно баз данных не достаточно для удовлетворения существующих потребностей, можно установить Linux-версию Oracle (или ее бесплатную версию — Oracle Express), ведь под FreeBSD запускаются и хорошо работают практически все Linux-приложения, причем с FreeBSD они даже иногда работают лучше, чем с самой Linux.
40 Введение в FreeBSD Часть I • Специальные решения. Лицензионное соглашение FreeBSD является достаточно либеральным и позволяет использовать код FreeBSD в других приложениях абсолютно бесплатно, что делает ее просто отличным решением для вас, если вы — дизайнер встраиваемых систем или разработчик, принимающий участие в создании одного из тех проектов, в которых применяется код из проекта FreeBSD (таких как проект Mac OS X компании Apple). Если рассматривать каждую из этих задач по отдельности, то в переходе на FreeBSD, вроде, как и нет смысла, и может даже показаться, что лучше перейти на какую-нибудь другую операционную систему, которая более приспособлена для выполнения конкретной задачи. Однако главное достоинство FreeBSD (которым она обладает благодаря тому, что представляет собой ПО с открытым исходным кодом) состоит в том, что она может делать все эти вещи одновременно. Хотите, чтобы машина работала в качестве контроллера домена Windows и при этом выступала в роли файлового сервера AppleShare и репозитория NFS, а также обслуживала Web-сайт с интерфейсом CGI и являлась сервером базы данных SQL? Можете приобрести и отдельно установить ОС Windows Server, сервер Mac OS X и сервер Linux и потратить месяцы на то, чтобы настроить их и сделать так, чтобы они могли нормально функционировать вместе, а можете просто установить FreeBSD на одной единственной машине и сделать это все в одном месте. FreeBSD подходит уже не только для серверов "Ну, все это, конечно, замечательно", — можете сказать вы, — "но мне из этого ничего не нужно. Я не собираюсь создавать сервер или делать что-либо подобное". Не спешите пока закрывать эту книгу и ложить ее обратно на полку. Существует много задач, которые FreeBSD может выполнять как рабочая станция и которые тоже могут заинтересовать вас: • Разработка и тестирование Web-сайтов. Времена Web-страниц, которые могли отображать только статическое HTML-содержимое, давно прошли. Сегодня конкурирующие на рынке Web-сайты используют серверные технологии, такие как CGI, встраиваемые сценарии и серверы баз данных, и отображают содержимое, которое является динамическим и интерактивным. Это означает, что времена, когда Web-сайты тестировались локально путем загрузки в окно браузера страниц с жесткого диска, тоже давно прошли. Сегодня, чтобы разработать Web-сайт произвольной сложности, обязательно нужно иметь Web-сервер, пригодный для разработки и тестирования. Даже если делать Web-сервер доступным для общего пользования не планируется, все равно можно использовать Apache, PHP и одну из бесплатных баз данных SQL на рабочей станции FreeBSD для того, чтобы иметь возможность выполнять разработку и тестирование в автономном режиме, не загружая никаких страниц в службу хостинга. Это может сэкономить много времени и денег в этом не терпящем ни минуты простоя мире. • Разработка и тестирование баз данных в автономном режиме. Еще одним преимуществом локальной Web-разработки является возможность локального построения баз данных. Используя локальную машину FreeBSD, создайте и протестируйте свою базу данных с помощью MySQL или PostgreSQL. Затем заполните ее данными. Когда закончите, экспортируйте содержимое в виде сценария SQL,
Что собой представляет FreeBSD Глава 1 41 загрузите базу данных в службу хостинга и импортируйте ее в любую совместимую с SQL базу данных, которую этот сервер поддерживает, тем самым сразу же превратив тестовые данные в реальные. • Изучение технологий разработки или программирования. Тех, кто мечтал изучить язык программирования, наверняка обрадует тот факт, что после установки FreeBSD тратить сотни долларов на компиляторы и отладчики не придется: все необходимое для изучения технологий программирования и написания мощных приложений здесь уже есть, и только ждет своего часа. • Изучение структуры ОС или UNIX. Если вы являетесь студентом, изучающим вычислительную технику, и вам необходимо исследовать все детали строения операционной системы, наличие доступа ко всему исходному коду реальной операционной системы UNIX может очень даже помочь. Предположим, вам необходимо изучить UNIX для работы или для курса, который вы проходите в колледже. Хотя вы, конечно, можете воспользоваться имеющимся в вашем учебном заведении кластером UNIX для программирования и проведения своих исследований, однако, установив FreeBSD на своей собственной машине, вы сможете спокойно экспериментировать, имея доступ уровня администратора и не боясь повредить критически важные данные. • Использование бесплатного программного обеспечения для создания недорогой рабочей станции. Благодаря тому, что сегодня доступно много бесплатных программ и недорогих графических сред пользователя (таких как KDE и GNOME), FreeBSD запросто можно превратить в очень мощную и недорогую рабочую станцию настольного типа для выполнения самых различных задач. Среди бесплатных приложений, которые доступны для FreeBSD. программы электронной почты, Web-браузеры, текстовые процессоры, электронные таблицы, базы данных, программы автоматизированного проектирования и редакторы изображений. Кроме того, для FreeBSD даже доступна программа типа Winamp, так что ва шей коллекции МРЗ-файлов ничего не угрожает! Возможно, вас уже заинтересовали какие-то из перечисленных в приведенных выше списках задач, которые позволяет выполнять FreeBSD. Однако прежде чем приступать к установке FreeBSD, вы наверное хотите узнать хоть немного о том, как появилась эта операционная система, насколько долго она уже существует на рынке и будет ли она по-прежнему доступна лет через 5 или 10. В следующих разделах вас сначала ждет небольшой экскурс в историю создания UNIX и FreeBSD, а затем вы сможете ознакомиться с философией проектирования систем типа UNIX, которые отличаются о тех, что используются в Windows. Краткая история FreeBSD и UNIX Первая версия операционной системы UNIX была создана в научно-исследовательском центре AT&T Bell Laboratories. Проектом UNIX руководили два человека — Кен Томпсон (Ken Thompson) и Деннис Ритчи (Dennis Ritchie). В принципе можно сказать, что история UNIX началась еще весной 1969 года. В то время несколько компаний решили объединить свои усилия и создать операционную систему с "разделением времени", которая бы позволяла равномерно распределять ограниченные ресурсы мэйнфрейма между множеством пользователей, под-
I ~ I Введение в FreeBSD I I Часть I ключающихся одновременно с удаленных терминалов. Получившаяся операционная система была названа MULTICS; и хотя в ней было реализовано много новых функциональных возможностей и она стала своего рода "шаблоном'1 того, что мы сегодня называем многопользовательской операционной системой, добиться сколько-нибудь заслуживающего внимания успеха в коммерческом плане ей так и не удалось, поэтому в АТ&-Т от этого проекта отказались. Однако, Кен Томпсон, который был одним из членов занимавшейся разработкой MULTICS команды, продолжал трудиться в том же направлении, разрабатывая (с помощью Ритчи и других разработчиков) новую операционную систему, которая была бы похожа на MULTICS, но имела бы меньший размер и более простую структуру, а также могла запускаться не на дорогостоящих мэйнфреймах как раньше, а на мини- компьютерах DEC PDP-7. Эта операционная система получила название UNIX, которое подчеркивало простоту этой системы по сравнению с MULTICS, Чтобы обеспечить поддержку и надежную опору для новой системы, Томпсон и Ритчи создали новый язык программирования — язык С, который значительно ускорил процесс разработки, по сравнению с предыдущими попытками (за основу они взяли использовавшийся для миникомпьютеров PDP-7 язык ассемблера DEC). Язык программирования С и операционная система UNIX (или, если хотите, Unix) являются двумя наиболее важными разработками в истории компьютера и никак не меньше, потому что язык С стал первым "переносимым" языком программирования: написанные на языке С приложения можно было относительно легко переносить на компьютерные платформы другого типа. Поскольку UNIX была написана на языке С, она тоже была "переносимой" и ее можно было запускать на платформах другого типа, приложив относительно небольшое количество усилий Эют прорыв, кажущийся не таким уж большим с современной точки зрения пр ше i к стремительному росту популярности UNIX и нового направлен* я в разработке программного с беспечения, которое мы сегодня воспринимаем как должное. НА ЗАМЕТКУ Если бы не игра "Space Travel" ("Космические путеиествия"), которую Кен Томпсон (Ken Thompson) в свое свободное время разрабатывал для мэйнфрейма GE-645 (служившего платформой для MULTICS), возможно он никогда бы и не решил заняться созданием UNIX Рождение операционной системы BSD Поскольку компания AT&T Bell Laboratories никогда специально не занималась продажей компьютерных операционных систем, она продавала лицензию на пользование операционной системой UNIX и ее исходным кодом различным научным учреждениям за относительно низкую цену. Одним из таких учреждений, которое действительно много сделало для UNIX на раннем этапе ее развития, был Центр по исследованию компьютерных систем (Computer Systems Research Group — CSRG) при Калифорнийском университете в Беркли. Сотрудники этого центра сделали несколько очень важных вещей для UNIX, а именно: разработали файловую систему UFS (UNIX File System) и добавили стек протоколов TCP/IP. В конечном счете в UNIX было внесено столько изменений разработчиками этого центра, что они выпустили свою собственную версию этой операционной системы, которая получила название Berkeley Software Distribution (сокращенно "BSD")
Что собой представляет FreeBSD Глава 1 НА ЗАМЕТКУ Вопреки бытующему мнению, перенос UNIX на платформу DEC VAX впервые был осуществлен не в лабораториях центра CSRG, а в лабораториях AT&T Bell Laboratories, правда, без поддержки системы виртуальной памяти VAX. Разработчики центра CSRG просто позже повторили эту попытку: они перенесли BSD UNIX на платформу VAX и, по ходу процесса, добавили поддержку для архитектуры ее виртуальной памяти. В CSRG решили сделать большую часть исходного кода BSD доступной для всех бесплатно. Также, в 1991 году один из разработчиков этого центра по имени Билл Джолитц (Bill Jolitz) перенес BSD на платформу Intel x86. Получившийся продукт назвали 386BSD. Кроме того, чуть позже Билл Джолитц с еще несколькими своими коллегами из GSPG основали отдельную, коммерческую компанию под названием Berkeley Software Distribution, Incorporated (BSDi), и начали продавать коммерческую версию BSD вместе с исходным кодом. Рождение операционной системы FreeBSD В 1993 году двум группам разработчиков перестало нравиться направление, в котором Билл и Линн Джолитцы развивали 386BSD, поэтому они в*яли доступный бесплатно ("застоявшийся") исходный код и — что впоследствии стало традицией в кругах разработчиков ПО с открытым кодом — начали работать с ним самостоятельно. Разработчики из первой группы занялись разработкой FreeBSD и n[ ^ Bin цель сделать систему настолько простой, наскояько возможно, чтобы ей мех о ш- зоваться обычные, "нетехнические" пользователи и чтобы она мо ла заггусгатьсь н« оборудовании класса Intel x86. Рторая rpvnrn приступила к работ немного i v с. Разработчики из этой гр ппы занялись разработкой версии NetBSD и постав п t перед собой цель сделать так, чтобы BSD могл-i работать на любой платформе. Даже если платформа очень отдаленно напоминает омпьютер, вполне вероятно, что вам все-таки удастся запустить на ней NetBSD. Еще немного позже от второй группы отделилась еще одна, третья группа разработчиков, целью которых было создать са мую безопасную операционную систем}' из всех доступных. На сегодняшний день FreeBSD является наиболее популярной из всех основанных на BSD операционных систем типа UNIX в основном благодаря тому, что она самая универсальная и позволяет выполнять большинство повседневных задач. Сейчас FreeBSD представляет собой полнофункциональную операционную систему, которая подходит для установки любых приложений, начиная от серверных приложений, являющихся самыми чувствительными в плане безопасности и самыми требовательными в плане производительности, и заканчивая настольными, ориентированными специально на пользователей приложениями, которые сильно насыщены графикой. После выхода в 2005 году версии FreeBSD 5.4 проект FreeBSD снова был расширен и на свет появился еще один вариант этой операционной системы — PC-BSD. Версия PC-BSD предназначена специально для работы с настольными приложениями. СОВЕТ Тем, кого FreeBSD интересует как настольная операционная система, стоит заглянуть на Web- сайт http://www.pcbsd.org, где представлена вся информация о версии PC-BSD. На момент написания данной книги PC-BSD находилась еще на ранней стадии развития.
I ~ I Введение в FreeBSD I 44 ' I I Часть I История FreeBSD и UNIX является одной из самых сложных и, в то же время, наиболее увлекательных в компьютерной индустрии, а также гораздо более запутанной, чем было описано здесь. Многочисленные судебные разбирательства, изменения философского направления, параллельная разработка кода, расколы, слияния, новые и заброшенные проекты — в этой еще неоконченной истории подобного добра хоть отбавляй. Ниже перечислены ссылки на Web-страницы, где можно найти более подробную информацию по данной теме: • http: //www .bell -labs. com/his tor у/UN IX/. Здесь подробно описана история развития UNIX в Bell Labs, а также представлены некоторые очень редкие фотографии. • http: // daemon z. org/bugs/hi story. html. Ранние этапы развития UNIX глазами Маршалла Кирка Мак-Кыосика (Marshall Kirk McKusick), который был ключевой фигурой в истории BSD и FreeBSD, начиная со времен CSRG. • http://www.freebsd.org/handbook/history.html. Современная история проекта FreeBSD глазами Джордана Хаббарда (Jordan Hubbard). • http: //www. levenez. com/UNIX/. Замечательная графическая таблица всех версий UNIX, начиная с момента появления этой операционной системы в 1969 году. Эта таблица была составлена и постоянно обновляется Эриком Левене (Eric Levenez), который является страстным поклонником BSD/NeXT. Философия разработки UNIX Продолжать развиваться даже 30 лет спустя UNIX позволяют несколько вещей. Одной из них являехся такое свойство UNIX, как переносимость, о которой уже упоминалось ранее. Однако поклонники этой операционной системы считают, что оставаться "на плаву", когда все старые программы становятся непригодными для использования, UNIX позволяет прежде всего исходная философия ее разработки, определяющая то, как должна работать операционная система. Многие полагают, что UNIX — это очень сложная, строгая и запутанная операционная система. Но для опытных пользователей, UNIX является истинным воплощением в действительность концепции "KISS" ("Keep It Simple, Stupid" — "Будь попроще, дурачок"), которая по праву считается одной из главных в сфере разработки программного обеспечения и подразумевает наличие возможности выполнять очень сложные задачи с помощью устаревших программ при условии их правильного соединения. Философия UNIX состоит в следующем: для каждой задачи должна существовать отдельная небольшая программа, выполняющая только одну эту задачу и делающая это хорошо. Но у разработчиков UNIX возникла еще одна блестящая идея: сделать так, чтобы у пользователя была возможность объединять эти программы вместе для выполнения задач, которые одна программа не смогла бы выполнить сама. НА ЗАМЕТКУ Эта концепция объединения получила название конвейеризации. Ее автором считается разработчик из Bell Labs по имени Дуг Мак-Илрой (Doug Mcllroy), а реализовал ее в UNIX Кен Томпсон (Ken Thompson). (Более подробно о конвейерах будет рассказываться в главе 8.)
Что собой представляет FreeBSD I ~ I rnflafli I 45 I Ниже приводится пример того, как работают такие "конвейеры" программ обработки данных. Представьте, что у вас есть текстовый файл, который вы используете в качестве обычной адресной книги. В этом файле каждому человеку отведена отдельная строка, в которой содержатся следующие данные: имя, адрес, номер телефона, адрес электронной почты и тому подобное. В качестве разделителя между полями используется знак тильды (~), потому что вероятность наличия такого знака в данных внутри самих полей крайне низка. Например, вот как могли бы выглядеть строки в этом файле: Doe, John~505 Some Street-Anytown-NY^55555^505-555-1212^jdoe@email.com Doe, Jane-121 Any Street~Sometown~NY~12121*121-555-1212^jadoe@isp.com Bar, Foo-501 Some Street-Anytown-NY-55555-505-123-4567-foobar@email.com Этот файл может содержать 50 или 500 записей; это, в принципе, не имеет никакого значения. Далее представьте, что вам необходимо изменить организацию данных в этом файле, чтобы решить следующие задачи: получить список всех людей, которые проживают в городе Any town (на месте Any town вставляется фактическое название нужного города), создать список, включающий только имена этих людей и номера их телефонов, отсортировать этот список в алфавитном порядке и распечатать его документальную копию. Выполнить все эти задачи с помощью одной команды нельзя, но вы запросто можете объединить несколько команд вместе в конвейер и добиться нужных результатов. Ниже показан один из способов того, как это можно сделать: # awk 'BEGIN {FS*"-"} $3 — "Anytown" {print "%e\t%s\n",$1,$6}'\ address.txt | sort | lp He переживайте, если вы не совсем понимаете, что делает этот код; он будет более подробно объясняться в главе 10, но, говоря просто, он делает следующее: указывает, что в качестве разделителя должен использоваться знак ~, выбирает строки, у которых значение в третьем поле (в этом поле содержится название города) соответствует значению An у town, и затем распечатывает первое и шестое поле этих строк (в этих полях содержится имя и номер телефона), используя для разделения полей символ табуляции (\t), а для разделения строк — символ новой строки (\п). Он извлекает всю эту информацию из файла address. txt. Выходные данные сразу же (по конвейеру) передаются команде sort, которая сортирует их в алфавитном порядке. После этого они передаются команде 1р, которая распечатывает их на используемом по умолчанию принтере. Для приведенного примера с тремя строками в файле результаты будут выглядеть так: Bar, Foo 505-123-4567 Doe, John 505-555-1212 Хотя для новичка эта цепочка команд может показаться не вполне понятной, пользователь UNIX, пусть даже с небольшим опытом, запросто сможет разобраться в ней и сказать, что она должна делать. Показанная здесь одна единственная строка кода создает простую базу данных, которую, в случае внесения всего лишь нескольких изменений, можно настроить так, чтобы она позволяла выполнять поиск по любому полю и чтобы информация в ней хранилась в определенном (каком вам нужно) виде.
I 71 I Введение в FreeBSD 46 h-r: ; I l Часть I Просто для того, чтобы вы могли понять, насколько мощной может быть такая одна строка кода, взгляните на следующий пример: здесь код из предыдущего примера был немного изменен так, чтобы он распечатывал просто список адресатов. # awk 'BEGIN {FS="~"} $3 ¦- "Anytown"\ (printf "%s\n%s\n$s, $8 $s\n\n",$l,$2,$3,$4,$5}' addreee.txt I lp После выполнения этого кода выходные данные будут выглядеть, как показано ниже: Doe, John 505 Some Street Anytown, NY 55555 Bar, Foo 501 Some Street Anytown, NY 55555 Возможность превращения таких сложных функций в одну единственную цепочку команд является очень важной при написании программ оболочек, как вы увидите в главе 10; используя всего лишь несколько строк кода, состоящих из таких элементарных команд UNIX, вы можете создавать относительно простые сценарии, которые будут выполнять очень полезные задачи и которые вы запросто сможете изменять в соответствии со своими потребностями. Для тех, кому интересно, UNIX — это самая гибкая и легко настраиваемая операционная система из всех, которые доступны сегодня на рынке. UNIX (а, значит, и FreeBSD) таит в себе неимоверно мощные возможности, раскрыв и воспользовавшись которыми, вы сможете выполнять бесплатно различные задачи, не приобретая дорогостоящего специализированного ПО. Именно описанная философия позволяет UNIX оставаться "в цене" независимо от того, насколько быстрым становится оборудование или насколько сложными становятся графические пользовательские интерфейсы; именно она дает UNIX возможность оставаться, в отличие от множества других программ, актуальной в течение стольких лет. FreeBSD в сравнении с другими операционными системами Чтобы понять, чем FreeBSD отличается от других операционных систем, ее следует сравнить с такими операционными системами, как Windows ХР и Mac OS X, которые являются наиболее яркими представителями основного направления в сфере настольных систем, а также с операционной системой Linux, которая является главным соперником FreeBSD среди систем с открытым кодом, что мы и сделаем в этом разделе. Windows ХР Компания Microsoft практикует такой подход: она всегда внимательно выслушивает, что ее клиенты хотят видеть в операционной системе и учитывает их пожелания при подготовке следующих версий. Windows ХР не позволяет особо заглядывать "во внутренности* системы. Она предоставляет пользователю возможность достаточно
Что собой представляет FreeBSD хорошо выполнять целый ряд задач, не разбираясь во внутренних деталях системы. Однако делает она это ценой более низкой производительности, эффективности и, особенно, гибкости. Windows XP имеет достаточно высокие требования к оборудованию, но многие пользователи согласны принять их в обмен на удобство применения, тем более что цены на новое оборудование, как правило, очень быстро начинают падать. Кроме того, из-за графического оформления Windows "опытные пользователи" запросто могут натолкнуться на ограничения. Возможности пользователя ограничиваются возможностями графического интерфейса, то есть пользователь может выполнять только те задачи, для которых предусмотрены кнопки и другие элементы управления. Ниже перечислены некоторые наиболее важные отличия между FreeBSD и Windows XP: • Ядро Windows нельзя настраивать. Ядро — это "сердце" операционной системы; оно отвечает за работу практически всех элементов системы. FreeBSD позволяет создавать новое ядро для операционной системы, настраивая его в соответствии со своими потребностями, активизируя только те функциональные возможности и драйверы устройств, которые необходимы, и добавляя поддержку для новых, разрабатываемых устройств, что может повысить производительность и сократить количество используемых ресурсов памяти, а также избавить от зависимости от официальных производителей драйверов. Windows XP не позволяет собрать ядро заново или настраивать его. И это одна из областей, где Windows XP жертвует определенной долей эффективности и производительности ради простоты в использовании. • Windows XP использует графический интерфейс пользователя для большинства своих задач, тогда как FreeBSD более полагается на командную строку. Графический интерфейс пользователя Windows XP основан на том, что все вещи должны легко находиться, а общие задачи — легко выполняться. Например, настройка сети в Windows XP выполняется через панель управления сетью, при этом доступно множество "мастеров", помогающих в прохождении этого процесса. С другой стороны, в FreeBSD для конфигурирования сети используются текстовые конфигурационные файлы. Настройка сети в этом случае предполагает ручное редактирование одного или большего числа таких файлов. Философия FreeBSD означает большие шансы внесения путаницы, нежели жестко регламентированный интерфейс Windows, однако она же означает и отсутствие возможности повреждения системного реестра, а также сохранение изменений в конфигурации с помощью простой системы контроля версий вроде CVS (или просто в текстовом редакторе). • В Windows XP режим графического интерфейса пользователя работает всегда^ а в FreeBSD он является режимом "по выбору" Хотя графический интерфейс пользователя может сделать рабочую станцию более удобной для исполь ования, на работающем в фоновом режиме сервере он является абсолютно бесполезным, потому что экран этого сервера все равно никто никогда не видит (а еще он может даже стать причиной нарушения системы безопасности). FreeBSD предлагает возможность отключить режим графического интерфейса пользователя и вообще не применять его. Если вы все-таки решите использовать графический пользовательский интерфейс, доступные настольные среды (такие как GNOME, KDE и другие) позволят вам настроить должным образом (то есть в соответствии с существующими потребностями).
48 Введение в FreeBSD Часть I • В Windows для удаленного администрирования требуется специальное программное обеспечение. Поскольку в FreeBSD все задачи можно выполнять из командной строки, удаленное администрирование в FreeBSD не представляет сложности: вы можете подключиться к оболочке командной строки, используя SSH, и затем управлять удаленным компьютером, отправляя простые текстовые команды. В FreeBSD из командной строки могут выполняться абсолютно все связанные с администрированием системы задачи, что делает процедуру удаленного администрирования достаточно простой. Ее можно выполнять с любого терминала (даже с терминала, который не может отображать графику), а также с любой системы, на которой возможен запуск эмулятора терминала. Администрировать FreeBSD можно и с другой системы типа UNDC, с Windows, Macintosh и так далее. В Windows XP, в свою очередь, использование режима графического интерфейса пользователя является обязательным, и поэтому для обеспечения возможности получать доступ к системе Windows удаленно на удаленной системе придется установить специальное клиентское ПО и выполнить ряд графических операций, подразумевающих перемещение окон и курсоров мыши. В случае Windows многие задачи по удаленному администрированию могут выполняться только с машины, на которой либо тоже установлена операционная система Windows, либо на которой установлена операционная система Macintosh и компонент Remote Desktop, либо на которой установлена операционная система Linux или FreeBSD и пакет программ rdesktop. • Любой графический интерфейс пользователя (включая тот, что применяется в Windows XP) по своей природе имеет ограничения, которых в интерфейсе командной строки нет. Графический интерфейс пользователя — это высокоуровневый слой интерфейса пользователя, который находится далеко от ядра и ограничивается только теми возможностями, которые были для него разработаны, то есть в нем доступны только эти функциональные возможности, и не более того. Но, рано или поздно, настанет день, когда "опытному пользователю** захочется сделать что-нибудь такое, чего разработчики операционной системы не учли. Например, ту простую базу данных адресной книги, которая приводилась в предыдущем разделе в качестве примера, создать с помощью программ, имеющихся в Windows, никак не получится. Для создания подобной системы в Windows потребовалось бы установить специальное стороннее ПО. Получить список адресатов (также приводившийся в качестве примера в предыдущем разделе) с помощью программ, доступных в Windows, тоже не получится. Интерфейс командной строки (CLI) в FreeBSD, где команды выполняются на более близком к ядру уровне, предоставляет намного больше возможностей, нежели системы, основанные на графическом пользовательском интерфейсе. Mac OS X Mac OS X — это графическая операционная система производства компании Apple, которая служит практически той же цели, что и Windows XP (то есть она занимает ту же нишу в компьютерном мире), но предварительно заданные потоки работ в которой, по мнению многих, встроены в графический слой более удобным и понятными для пользователя образом, чем в Windows (в конце концов, именно этим Apple и гордится). Поэтому Mac OS X, в принципе, обладает всеми теми же преимуществами и страдает от всех тех же недостатков, что и Windows, среди которых не
Что собой представляет FreeBSD I ~ I " ~~ ~—Глава 1 I I поддающееся настройке ядро и обязательный (вездесущий), ограничивающий возможности графический интерфейс. Плюс к этому Mac OS X может устанавливаться только на патентованном оборудовании, что для FreeBSD является "неслыханным" требованием. Однако, в это же время Mac OS X — это "гибрид*, который представляет собой нечто среднее между операционной системой Windows и операционной системой FreeBSD. В основе Mac OS X лежит самая настоящая архитектура UNIX, с поддерживающим удаленный доступ интерфейсом командной строки, которым одинаково удобно управлять как с удаленной машины Windows или UNIX, так и из командной оболочки FreeBSD. Mac OS X на самом деле разрабатывалась на основе операционной системы NeXTSTEP производства NeXT, которая, в свою очередь, разрабатывалась на основе операционной системы 4.4BSD, то есть на основе той же операционной системы, что и сама FreeBSD. Таким образом, если вам знаком код, скрывающийся за привлекательным графическим интерфейсом пользователя Мае, считайте, что вы в принципе знакомы с FreeBSD. Подобным образом, когда вы закончите читать эту книгу, вы будете знать в целом намного больше о Mac OS X, чем вы знали до этого. Linux Если только последние пять лет вы не жили в пещере, то наверняка слышали о Linux, хотя может и не знаете точно, что это такое. Linux — это версия UNIX, которая в последние годы стала просто чрезвычайно популярной. Как и FreeBSD, Linux представляет собой ПО с открытым кодом и разрабатывалась на добровольных началах (то бишь волонтерами). В отличие от FreeBSD, никакого единого органа, который бы контролировал развитие Linux, нет, и поэтому на сегодняшний день доступно уже более 60 различных дистрибутивов Linux. Между FreeBSD и Linux больше сходств, нежели отличий. Они обе являются прекрасными, многоцелевыми (универсальными) операционными системами и они обе достаточно хорошо отвечают потребностям большинства пользователей. Хотя для Linux доступно больше программ, чем для FreeBSD, практически все доступные для Linux программы очень просто запускаются на FreeBSD, поэтому проблем с совместимостью не возникает. Когда программы, разработанные для Linux, запускаются под управлением FreeBSD, это практически никак не сказывается на их производительности: на самом деле, некоторые программы Linux в FreeBSD работают даже быстрее, чем в самой Linux. Ниже перечислены некоторые наиболее важные отличия между FreeBSD и Linux: • FreeBSD имеет только один дистрибутив, в то время как Linux — более шестидесяти, FreeBSD будет работать одинаково на всех системах, на которых она устанавливается, a Linux — нет. Каждый дистрибутив Linux работает немного по-другому. Например, в Slackware Linux для управления процессом запуска различных служб при загрузке системы используются сценарии управления выполнением BSD-типа. В Debian Linux используются сценарии Sys V, запускающиеся не в такой, как сценарии BSD-типа архитектуре, А в Red Hat Linux тоже применяются сценарии Sys V, но хранятся эти сценарии в другом, не таком как в стандартной версии Sys V UNIX, месте. Это может сбивать с толку пользователей, которые переходят с одного дистрибутива Linux на другой, потому что в другом дистрибутиве некоторые вещи могут работать совсем иначе. (То же можно сказать и о таких версиях FreeBSD, как NetBSD и OpenBSD, но различия между этими
I ZT I Введение в FreeBSD L I Часть I "вариантами" BSD UNIX являются, пожалуй, более фундаментальными и значительными, чем между различными дистрибутивами Linux), • FreeBSD — это завершенная операционная система, которая была разработана и об новляется одной командой разработчиков, a Linux — это только ядро, сопровождаемое Линусом Торвальдсом (Linus Torvalds). Linux не является завершенной операцион-' ной системой. Это просто ядро. Кцк уже упоминалось в разделе, посвященном Windows, ядро — это "сердце" (то есть базовый компонент) операционной системы, который контролирует поток проходящих через систему данных, управляет драйверами устройств и сетевыми соединениями, а также поддерживает систему в рабочем состоянии, пока пользователь возится со своими приложениями. Компании, занимающиеся продажей дистрибутивов Linux, просто берут ядро Linux и добавляют в него пакет других, разработанных для Linux программ. Поскольку каждая компания имеет свое представление о том, что должно быть включено в дистрибутив, программы, которая была доступна в одной системе Linux, в другой системе Linux может не оказаться (хотя, конечно, ее всегда можно загрузить и установить). Этот факт нередко становится причиной возникновения проблем с зависимыми программами при обновлении версий Linux. Например, обновив ядро Linux, вы можете обнаружить, что вам также необходимо обновить несколько других пакетов программ, причем пока вы этого не сделаете, ваша система может даже не загружаться. Поскольку FreeBSD представляет собой завершенную операционную систему, процедуры обновления в целом выполняются легче, потому что они предполагают также обновление и всех зависимых программ. • Linux разрабатывают организации, занимающиеся распространением и продажей этой операционной системы, что приводит к появлению множества параллельных кодовых баз, а изменения в FreeBSD вносятся только с ведома команды ее разработчиков. Предложить внести изменения в проект FreeBSD может любой, и такие изменения могут касаться любой части операционной системы. В случае Linux изменения, вносимые в код ядра, должны быть одобрены самим Линусом Торвальдсом, а изменения, касающиеся какой-нибудь другой области системы, просто становятся частью того или иного дистрибутива. Изменения, вносимые в исходный код FreeBSD, должны быть одобрены главной командой разработчиков, прежде чем они смогут быть добавлены в FreeBSD. Такой подход является более удачным, потому что позволяет пользователям быть уверенными в том, что код был проверен на предмет наличия ошибок людьми, которые хорошо разбираются в том, что они делают, а также в том, что не будет возникать никаких проблем с уже существующим кодом. Последняя проблема очень часто случается с Linux, и именно поэтому после установки многих дистрибутивов оказывается, что в них чего-нибудь да "не работает". Поскольку у FreeBSD имеется только одна кодовая база (которую нередко называют деревом исходного кода), с FreeBSD такая проблема практически не случается. Это были перечислены лишь некоторые, наиболее важные отличия между Linux и FreeBSD. Поскольку у FreeBSD имеется только одна кодовая база, за которой следит главная команда разработчиков, FreeBSD считается более стабильной, чем Linux, и поэтому зачастую больше подходит для использования на производстве. (В разных дистрибутивах Linux акцент делается на разных приложениях, некоторые из которых
Что собой представляет FreeBSD | ~ I Глава 1 I J больше подходят для установки на "любительских" машинах, а некоторые — больше подходят для установки на сложном корпоративном или серверном оборудовании.) Главный недостаток такого подхода заключается в том, что новые функциональные возможности не всегда реализуются в FreeBSD так же быстро, как в Linux. Здесь придется выбирать: вы хотите быть уверенными в стабильности производственной системы или же вы хотите иметь различные модные "штуковины" и "приспособления" и готовы пожертвовать ради них производительностью и стабильностью? NetBSD Предметом гордости NetBSD является количество платформ, на которых она может запускаться. NetBSD пробовали устанавливать на всем, начиная от PDA-компьютеров и заканчивая специализированными игровыми консолями, такими как Sony PS2. Также NetBSD, естественно, без проблем запускается на стандартном оборудовании семейства х86, которое используется в большинстве персональных компьютеров. Главным недостатком NetBSD является то, что она не так удобна для пользователя, как FreeBSD, и не имеет некоторых приложений, которые доступны для FreeBSD. Поэтому для пользователей-новичков, работающих на машинах семейства х86, пожалуй, больше подойдет FreeBSD. OpenBSD Главным преимуществом OpenBSD является ее безопасность. Хотя по большей части эта безопасность обеспечивается стандартной конфигурацией, которую в принципе можно сымитировать в FreeBSD, некоторые вещи доступны только благодаря уникальным функциональным возможностям OpenBSD, таким как возможность шифровать содержимое файла подкачки (файл подкачки — область диска, используемая для виртуальной памяти). Однако, как и NetBSD, OpenBSD совсем не так удобна для пользователя, как FreeBSD, и тоже не имеет многих приложений, которые доступны для FreeBSD. Опять-таки, причина этого состоит в том, что в OpenBSD главный акцент делается на безопасности, что предполагает исключение всех ненужных функциональных возможностей во избежание появления в системе безопасности слабых мест. Поэтому и в данном случае для пользователей-новичков, работающих на машинах семейства х86 и желающих иметь в своем распоряжении как можно больше всевозможных приложений и функций, очевидно больше подойдет FreeBSD. Логотип FreeBSD У Linux есть свой логотип — это пингвин, значит, и у FreeBSD должен быть свой логотип, и он уже есть — это чертенок. Почему именно чертенок? Коротко можно ответить так: это не чертенок, это демон (daemon), а демоны представляют собой фоновые процессы, которые отвечают за выполнение всех необходимых системе автоматизированных задач. В принципе демоны являются очень полезными. Если вы хоть когда-нибудь отправляли электронное письмо или посещали Web-страницу, вы обязательно ипользовались услугами" демона, даже не подозревая об этом. Демоны есть и Windows XP, просто там они так не называются: Microsoft использует для них другое название — "службы".
Введение в FreeBSD Рис. 1.1. Знаменитая иллюстрация логотипа BSD (© Кирк Мак-Кьюсик (Kirk McKusick)). Специально для любителей мультипликации Джон Лвссетер (John Lasseter) из компании Ргхаг нарисовал эту и несколько других версий чертенка НА ЗАМЕТКУ Почитатели "чертенка" решили расширить метафору и настаивают на том, что вилы, или вилка (fork), в руках персонажа указывают на возможность операционной системы "разветвлять" (to fork) новые процессы, то есть создавать дополнительные копии работающих процессов для обработки поступающих запросов; например, она может создавать новый процесс Apache для обслуживания запроса пользователя на просмотр Web-страницы, при этом позволяя Apache продолжать работать и в это же время обрабатывать запросы, поступающие от других пользователей.
ГЛАВА С- Установка FreeBSD В этой главе... • Проверка оборудования • Создание установочных дискет • Загрузка в программу установки • Навигация по программе Sysinstall • Создание разделов и назначение точек монтирования • Выбор дистрибутива • Выбор источника установки • Конфигурирование и настройка системы после установки • Выход из программы Sysinstall и перезагрузка системы • Первая загрузка FreeBSD • Настройка системы X Window System (XI1) • Завершение работы FreeBSD
I ~ I Введение в FreeBSD I 5 I Часть I " Прежде чем использовать FreeBSD, ее, как и Windows или любую другую операционную систему, необходимо установить на жесткий диск. Процедура установки FreeBSD является несколько более сложной и требует немного большего внимания к деталям, чем обычная процедура установки Windows, но приводимые в этой главе инструкции должны помочь вам выполнить ее без проблем. В зависимости от скорости процессора и привода DVD-дисков, процесс установки может занять от 20 до 60 минут (а если FreeBSD устанавливается через сеть, этот процесс может растянуться и на несколько часов). Большая часть времени уходит на копирование файлов, поэтому сидеть неотрывно перед компьютером вам не придется. Я настоятельно рекомендую вам прочитать всю эту главу, от начала до конца, и только потом приступать к установке: это позволит вам ознакомиться с процедурой и подготовится к возможным проблемам. В процессе установки FreeBSD может возникнуть гораздо больше неожиданностей, чем вы, возможно, привыкли встречать при установке Windows, поэтому лучше знать заранее, какую информацию давать программе установке и для чего данный компьютер будет использоваться в производственной среде. Также советую сразу прочитать и главу 3, в которой описываются некоторые важные процедуры, которые тоже может оказаться необходимо выполнить перед установкой, такие как резервное копирование существующих файлов и создание дополнительных разделов на жестком диске без потери данных. ВНИМАНИЕ! Выберите для проведения процедуры установки такое время, когда вас гарантированно не будут отвлекать. Во время установки вы будете выполнять операции, допущение ошибок в которых может привести к повреждению или потере существующих данных. СОВЕТ Сейчас самое время взглянуть на список совместимого оборудования, который приводится в приложении Б, и убедиться в том, что имеющееся оборудование поддерживается. Вы вряд ли захотите продолжать установку, если обнаружите, что главный аппаратный компонент вашей системы не поддерживается FreeBSD. Проверка оборудования Перед тем как приступать к установке, вы должны подготовить некоторые сведения о своем оборудовании на случай, если система не сможет автоматически распознать или сконфигурировать их без вашей помощи. Ниже приводится список сведений об оборудовании, которые могут понадобиться во время установки FreeBSD: • Тип видеокарты и объем установленной видеопамяти. • Руководство по монитору. Для настройки в FreeBSD графической системы управления окнами (X Window System) потребуется знать частоту горизонтального и вертикального обновления (регенерации) изображений на экране монитора. • Если есть модем, номер СОМ-порта (например, СОМ1 или COM2) и номер IRQ (номер запроса прерывания), которые он использует.
Установка FreeBSD • Тип мыши (шинная, подключаемая через последовательный порт, PS/2 или USB) и номер порта, который она использует. • Адрес ячейки памяти и IRQ-номер сетевой карты Ethernet, особенно если это карта старого стандарта ISA. Также очень важно знать модель и название компании-производителя карты. (Многие из продаваемых сегодня карт Ethernet распознаются автоматически, поэтому владение этими сведениями не является обязательным; также эти карты стоят настолько дешево, что, как правило^ лучше приобрести новую карту, если имеющаяся, пусть даже немного, но устарела.) • Если компьютер подключен к сети, также потребуется собрать определенную информацию о сетевом подключении, такую как имя главного компьютера (хоста), IP-адрес, значения маски подсети, адреса DNS-серверов и номер межсетевого маршрутизатора. В случае отсутствия каких-нибудь из этих сведений обра- 4 титесь к администратору сети или поставщику Internet-услуг. (Если компьютер подключен к сети, в которой используется протокол DHCP, автоматически назначающий сетевые адреса, эта информация вам вообще не понадобится.) • Емкость жесткого диска. Для установки FreeBSD с системой X Window System (XI1) и коллекцией портов потребуется около 1.2 Гбайт свободного пространства. Если вы не располагаете этой информацией, и сейчас на вашем компьютере установлена операционная система Microsoft Windows, вы можете собрать необходимые сведения, воспользовавшись программой Device Manager (Диспетчер устройств), которая доступна чс рез панель управления. Более подробную информацию о том, как это делается, вы найдете в документации, прилагавшейся к данной версии операционной системы, или р справочной системе Windows. ВНИЛМНИЬ* j —— Поль*овате 1ям которые хотят перейти с версии FreeBSD 4.x на FreeBSD 5 или FreeBSD 6, следует знать, что предлагаемая в программе установки Sysmstall опция Binary Upgrade (Обновление двоичного кода) им не подходит (потому что она может работать некорректно из-за слишком большой разницы между номерами версий). Тем, кто желает обновить версию FreeBSD 4 до версии FreeBSD 6, лучше поступить следующим образом: сделать резервную копию существующих данньх и установить новую версию с нуля; если такой вариант не совсем подходит, можно попробовать обновить исходный код. Процедура обновления исходного кода выполняется достаточно просто и будет более подробно обсуждаться в главе 19. Создание установочных дискет DVD-диск с FreeBSD, прилагаемый к этой книге, является загрузочным. Если вы планируете устанавливать FreeBSD на компьютер, который поддерживает загрузку с CD/DVD-дисковода, вы, пожалуй, можете пропустить этот раздел. Если же имеющийся привод не поддерживает загрузку, или если вы хотите установить FreeBSD не с DVD-диска, а каким-либо другим способом (например, через сеть), тогда обязательно ознакомьтесь с содержимым этого раздела. Итак, если вы хотите установить FreeBSD через сеть, или если ваш компьютер не позволяет загружаться с DVD-диска, вам необходимо создать три установочные дискеты для того, чтобы вы могли загрузить систему с чистым ядром и сокращенной, ба-
Введение в FreeBSD зовой версией операционной системы, которая потом загрузит всю остальную часть операционной системы с FTP-сервера FreeBSD и установит ее на вашем жестком диске. Установочные дискеты создаются путем копирования на обычные дискеты загруженных с FTP-сервера файлов с образами дискет. ВНИМАНИЕ! Для проведения процедуры установки FreeBSD с помощью установочных дискет с FTP-сервера FreeBSD придется загрузить несколько сотен мегабайт данных, поэтому обязательно проверьте, имеется ли у вас подходящее для выполнения этой задачи соединение с Internet или, по крайней мере, достаточное количество времени, если это соединение работает медленно. Образы установочных дискет можно загрузить с FTP-сервера FreeBSD, который находится по адресу ftp.freebsd.org и подключиться к которому можно с помощью любой программы, обслуживающей FTP-соединения. Образы расположены в каталоге /pub/FreeBSD/releases/i386/6 Л-RELEASE/floppies; здесь предполагается, что самой последней версией FreeBSD, которая была выпущена, является 6.1. Если это уже не так, замените "6.1 * на номер той версии, которая является самой новой на текущий момент. Далее, загрузите три следующих файла: boot.flp, kernl. f lp и kern2. f lp. Если вы создаете установочные дискеты в системе DOS или Windows, также загрузите программу fdimage.exe, которая доступна на FTP-сервере в следующем каталоге: /pub/FreeBSD/tools. СОВЕТ При желании ускорить время отклика и уменьшить нагруэк/ на главные FTP сервер, попробуйте загрузить образы установочных дискет с одного из пйркальных сайтов, и*ля хоста у ко- торых обычно выглядит как "ftp" и какая-нибудь цифра (например, xt^l ^x-.sbsa.org или f tp2. f reebsd. org). Использование менее загруженных зеркальных сайтов може» существенно сократить время получения файлов. Загруженные файлы образов нельзя просто взять и скопировать на дискеты. Для создания установочных дискет из файлов образов предусмотрены специальные процедуры, которые описываются в следующих разделах и демонстрируют, как следует создавать загрузочные дискеты в различных условиях, а именно* в DOS, в Windows, в FreeBSD и в UNIX. Они должны быть записаны на дискеты при помощи одной из процедур, рассматриваемых в следующих подразделах. Прежде чем воспользоваться одним из описываемых далее методов, приготовьте три чистых 3.5-дюймовых дискеты емкостью 1.44 Мбайт. СОВЕТ Для создания установочных дискет лучше использовать совершенно новые дискеты, потому что исходные данные будут записываться на эти дискеты сразу, без проверки их формата и состояния и без проверки на наличие ошибок, а дискета с поврежденными секторами может привести к возникновению ошибок или вообще к аварийному завершению процесса установки. Избавьте себя от ненужных проблем и используйте только совершенно новые дискеты
Установка FreeBSD I __ I Глава 2 I I Создание загрузочных дискет в DOS или Windows Сначала переключитесь в режим командной строки DOS (в современных версиях Windows, чтобы сделать это, нужно просто выбрать в меню Start (Пуск) пункт Run (Выполнить) и в появившемся диалоговом окне ввести команду command). Из домашнего каталога своей учетной записи, который отображается в окне командной строки автоматически, перейдите в каталог, который вы указывали, когда сохраняли файлы fdimage.exe, boot.flp, kernl.flp и kern2.flp. Например, если вы сохраняли эти файлы в каталоге Desktop, вы должны ввести в командной строке DOS следующие команды: C:\Documents and Settings\Administrator> cd Desktop C:\Documents and Settings\Administrator\Desktop> fdimage boot.flp a: Когда выполнение программы завершится, вытащите из дисковода первую дискету и вставьте вторую. Затем введите следующую команду: C:\Documents and Settings\Administrator\Desktop> fdimage kernl.flp a: Повторите процедуру, чтобы создать третью дискету из файла kern2. f 1р. И, наконец, не забудьте присвоить дискетам метки! (Позже вы не раз порадуетесь тому, что сделали это.) Создание загрузочных дискет в FreeBSD или UNIX Если загрузочные дискеты создаются в FreeBSD или UNDC, программа fdimage. ехе не нужна. (Тем не менее, файлы образов дискет boot. f lp, kernl. f lp и kern2. f lp все равно необходимы.) Используйте UNDC-утилиту dd, чтобы записать файлы образов на дискеты побито- во. В FreeBSD нужная команда будет выглядеть примерно так: * dd if=boot.flp of=/dev/fdOc Когда копирование завершится, вытащите из дисковода первую дискету и вставьте вторую. Затем опять воспользуйтесь утилитой dd, чтобы создать вторую дискету. В FreeBSD нужная команда будет выглядеть примерно так: # dd if=kernl.flp of=/dev/fdOc , Повторите описанную процедуру еще раз, чтобы создать третью дискету иЗ файла kern2 . f lp. Обратите внимание, что для того, чтобы приведенные выше команды работали, вы должны иметь доступ по записи к дисководу гибких дисков, имя которого в FreeBSD будет выглядеть как /dev/fdOc. В других операционных системах для дисковода гибких дисков может использоваться какое-нибудь другое имя или "исходное* имя самого дисковода. Например, в Red Hat Linux дисковод гибких дисков может называться /dev/fdO или /dev/floppy. Информацию о том, какое имя следует применять для дисковода гибких дисков, чтобы выполнить запись на дискету с помощью dd, можно найти в документации по используемой версии операционной системы. Теперь, когда установочные дискеты созданы, вы можете приступать к установке.
I ZZ I Введение в FreeBSD I 1 Часть I Загрузка в программу установки ВНИМАНИЕ! Если вы устанавливаете FreeBSD на компьютер, где уже установлена Windows или какая-нибудь другая операционная система, и не хотите утратить эту операционную систему со всеми имеющимися в ней данными, остановитесь и прочтите раздел "Потенциальные проблемы и ограничения систем с двумя режимами загрузки" главы 3. Очень важно, чтобы вы прочитали сначала этот раздел! Невыполнение перечисленных в нем инструкций может привести к утере всех существующих на жестком диске данных! Материал, излагаемый в следующих нескольких разделах, предполагает, что вы либо планируете удалить все имеющиеся сейчас на жестком диске данные, чтобы установить FreeBSD, либо устанавливаете FreeBSD на новый диск, либо уже выполнили инструкции, приведенные в главе 3, чтобы создать место для FreeBSD на диске, на котором уже присутствует еще одна операционная система. А также он предполагает, что установка будет выполняться с DVD-диска, который прилагается к этой книге. Если это не так, прервитесь и сначала прочитайте в главе 3 раздел, посвященный именно выбранному вами методу установки: "Установка FreeBSD через FTP" или "Установка FreeBSD с помощью NFS". Сделав это, вернитесь и следуйте инструкциям, перечисленным ниже. Когда вы будете готовы приступить к установке, вставьте прилагаемый к этой книге DVD-диск в соответствующий привод. (Если вы решили устанавливать FreeBSD с помощью загрузочных дискет, тогда вместо этого вставьте в дисковод А: дискету, на которую вы записали файл boot, flp.) Перезагрузите компьютер. Если необходимо, войдите в программу настройки BIOS и выберите опцию, разрешающую выполнять загрузку с DVD-привода, или опцию, разрешающую выполнять загрузку с дисковода гибких дисков, в зависимости от того, чем вы решили пользоваться: дискетой или DVD-диском. НА ЗАМЕТКУ Также в некоторых версиях BIOS есть функция безопасности, которая не позволяет выполнять загрузку с гибких дисков. Так что если вы решили устанавливать FreeBSD с помощью загрузочных дискет, вам, возможно, придется проверить, нет ли такой функции в вашей версии BIOS, и если есть, настроить ее так, чтобы она позволяла выполнять загрузку с дисковода А:. Информацию о том, как это делается, можно найти в документации, прилагаемой к системе. По мере загрузки системы на экране будут появляться различные сообщения о состоянии FreeBSD. Кроме того, на экране еще будет отображаться специальный, анимированный курсор в форме "крутящегося жезла", указывающий на то, что задача находится в процессе выполнения. Если жезл вращается, значит, система что-то делает. Если жезл остановился и не вращается в течение долгого времени, вполне возможно, что система "зависла". В этом случае следуйте инструкциям, которые перечислены в Приложении В.
Установка FreeBSD НА ЗАМЕТКУ В версиях FreeBSD 6.0 и ниже вместо полноэкранного меню загрузки появится следующее сообщение: FreeBSD/i386 bootstrap loader, Revision 1.1 (root@x64.samsco.home, Thu Nov 3 07:33:10 UTC 2005) I Hit [Enter] to boot immediately, or any other key for command prompt. Booting [kernel] in 9 seconds... _ Нажмите [Enter] для немедленной загрузки или любую другую клавишу для перек д в к мандную строку. Загрузка [ядро] через 9 секунд... _ Увидев такое сообщение, не волнуйтесь и просто нажмите клавишу <Enter>, чтобы продолжить процесс загрузки. На определенном этапе этого процесса, если FreeBSD устанавливается с дискет, на экране появится приглашение вставить дискету под названием "Kernel Floppy l" (это дискета, на которую записывался файл kernl. f lp) и нажать любую клавишу (Insert disk labeled "Kernel floppy Iй and press any key). После того, как содержимое этой дискеты загрузится, последует приглашение вставить следующую дискету — дискету с файлом kern2. f 1р. Затем подобное приглашение появится еще один, последний, раз — нужно будет вставить дискету с файлом boot. f lp. Когда загрузится ядро, на экране появится текстовое меню, предлагающее на выбор несколько опций для запуска FreeBSD. В зависимости от возможностей используемой консоли, в этом меню, справа от списка опций, также будет отображаться ли о в цветном, либо в черно-белом формате "чертенок" (графический символ FreeBSD или логотип FreeBSD в виде текста в кодировке ASCII. Пока что просто нажмите клавишу <Enter>, чтобы выбрать опцию, используемую по умолчанию: Boot FreeBSD (Загрузить FreeBSD). Выбор этой опции приведет к запуску программы Sysinstall. НА ЗАМЕТКУ По мере того как ядро будет определять и инициализировать установленное в системе оборудование, на экране будут появляться соответствующие сообщения. Если в какой-то момент во время этого процесса система "зависнет", следуйте инструкциям, приведенным в Приложении В, чтобы отыскать и устранить проблемы в процедуре запуска. Навигация по программе Sysinstall После завершения загрузки ядра (и при условии, что во время этого процесса не возникло никаких проблем), запустится программа FreeBSD Sysinstall. Первый экран, который вы увидите, будет выглядеть примерно так, как показано на рис. 2.1.
60 Введение в FreeBSD Часть I ctjtni.ef .thf?«i»ti*h* beittf>ylut,inf the . _ t iher«cur? iff^ t*jt «#t v«\ >*в|ьу*и 're- in tt*vvtlh,{»AiE] ^ifc' {ENTERJ/?'.&§№ ?» ™W .Qin к tart - How to u e ttn menu sy te | „ I»rt4 rv^_„_T.v „. il l*fci4rib(f «r; *хэегь if ins^uT »«nf iforettin. *f Fr instruct itpfi:;; NEAfflE fce T.. .-.-tth итп/**/цфн r- Рис. 2.1. Главное меню программы SysinstaU Пользоваться мышью в программе SysinstaU нельзя, но по ней все равно очень легко перемещаться. В табл. 2.1 перечислены клавиши, которые можно использовать для навигации в программе SysinstaU. Таблица 2.1. Клавиши навигации Клавиша навигации Команда Клавиша с изображением стрелки вверх Клавиша с изображением стрелки вниз Клавиша с изображением стрелки влево и клавиша с изображением стрелки вправо Клавиша пробела Клавиша табуляции Позволяет перейти вверх к предыдущему пункту меню. Позволяет перейти вниз к следующему пункту меню. Эти клавиши позволяют выбирать опции в нижней части меню. Например, в главном меню эти клавиши позволяют переключаться между опцией Select (Выбрать) и опцией Exit Install (Выйти из программы установки). В меню, где можно выбирать сразу несколько значений, позволяет выделить или отменить выделение выбранной на текущий момент опции. Действует так же, как и клавиши с изображением стрелки вправо и влево в меню. Эта клавиша позволяет переходить на экранах из одного поля в другое для того, чтобы ввести необходимые данные. Кроме того, большинство опций можно выбрать нажатием клавиши с буквой, ко* торая выделена в их названии: обычно это первая буква. Если вы хотите узнать больше о том, как пользоваться программой SysinstaU, вы можете, оставив выбранной опцию Usage (Правила пользования), нажать клавишу <Enter>, но поскольку обо всем этом будет рассказываться и здесь, я предлагаю вам нажать клавишу с изображением стрелки вниз, чтобы перейти ко второй опции в меню, и выбрать ее\дабы приступить к стандартной установке. После того, как вы выберете опцию Standard (Стандартная), на экране появится сообщение, информирующее о необходимости создать на жестком диске DOS-раздел (f disk): прочитайте его и просто нажмите клавишу <Enter> для продолжения.
Установка FreeBSD l ft. I Глава 2 I I Создание разделов и назначение точек монтирования После того, как вы в сообщении, информирующем о необходимости создать на жестком диске DOS-раздел (f disk), нажмете клавишу <Enter>, произойдет следующее: • Если в системе установлен только один жесткий диск, на экране сразу появится окно редактора разделов FreeBSD (FreeBSD Partition Editor). В этом случае вы можете пропустить следующий раздел, "Выбор жестких дисков", и перейти сразу к разделу "Разбиение диска или дисков на разделы*. • Если в системе имеется более одного жесткого диска, на экране сначала появится меню, предлагающее выбрать, на каком диске или дисках должна быть установлена FreqBSD. В этом случае вам обязательно следует прочитать следующий раздел. ВНИМАНИЕ! Создание разделов и назначение точек монтирования — это операции, допущение ошибки в которых может закончиться потерей всех существующих на жестком диске данных. Если на жестком диске содержатся какие-то важные данные, которые вы бы не хотели потерять, обязательно сделайте их резервную копию, прежде чем приступать к установке. Также, если вы будете устанавливать FreeBSD на диск, на котором уже установлена какая-то другая операционная система, обязательно сначала прочитайте главу 3. Выбор жестких дисков Есчи в системе установлено несколько жестких дисков, на экране появится меню, которое будет выглядеть примерно так, как на рис. 2.2. Меню, которое вы увидите, может выглядеть не совсем так, как меню, показанное на этом рисунке. В табл. 2.2 перечислены и объясняются некоторые основные значения которые могут отображаться в этом меню. Рис. 2.2, Выбор жестких дисков, на которые будет производиться установка FrveBSD
I 77 | Введение в FreeBSD I 1 Часть I Таблица 2.2. Элементы меню — - ' Значение Объяснение adO Первый физический жесткий диск в системе (он называется ATA Disk). Он является ведущим диском на первичном контроллере IDE. Если на компьютере установлена операционная система DOS или Windows, она будет находиться именно на этом диске. dao Это значение похоже на значение adO, но обозначает не первый АТА-диск, а первый SCSI-диск в системе. Если в системе имеются только SCSI-диски и уже установлена операционная система DOS или Windows, она будет находиться именно на этом диске. adl Второй АТА-диск в системе. Он может быть как ведомым диском на главном контроллере, так и ведущим диском на вторичном контроллере, что зависит от конфигурации системы. dal Второй SCSI-диск в системе. В меню, которое вы увидите, также могут присутствовать и такие значения, как ad2 и ad3 или da2, da3 и так далее. Здесь главное помнить, что цифра обозначает номер диска в системе и что нумерация дисков в FreeBSD начинается не с единицы, а с нуля. Используя клавишу пробела, выберите диск или диски, которые хотите использовать для FreeBSD. Для установки FreeBSD можно выбирать не только один, но и несколько дисков. Такой подход применяется достаточно часто и в конечном итоге никак не влияет на выполнение повседневных задач. Другими словами, даже если FreeBSD устанавливается на нескольких дисках, конечному пользователю будет казаться, что она находится на одном единственном диске. В следующем разделе будет показано, почему FreeBSD может быть выгоднее устанавливать на нескольких дисках. Когда вы выберите диск в этом меню, на экране появится окно редактора разделов FreeBSD (FreeBSD Partition Editor), в котором вы сможете отредактировать таблицу разделов данного диска. Когда вы внесете все необходимые изменения в таблицу разделов и выйдете из окна редактора разделов, вы снова вернетесь к этому меню, после чего вы можете либо выбрать еще какой-нибудь диск, чтобы отредактировать его, либо нажать клавишу <Enter> для выхода из меню и продолжения установки. Когда вы закончите редактировать диски, на экране появится окно FreeBSD Disk Label Editor (Редактор меток дисков FreeBSD), о котором более подробно будет рассказываться в разделе, следующем сразу после раздела "Разбиение диска или дис ков на разделы". ВНИМАНИЕ! Если вы собираетесь устанавливать FreeBSD на второй жесткий диск, а на первом жестком диске у вас уже установлена какая-то другая операционная система и никаких изменений на первом жестком диске вы вносить не планируете, вам следует установить такую программу, как диспетчер загрузки для того, чтобы вы при запуске системы могли выбирать, какую операционную систему загружать. Чуть позже FreeBSD предложит опцию, позволяющую установить эту программу. Однако эта программа должна быть установлена на первом диске в системе, а чтобы это произошло, вам придется выбрать в данном меню первый диск. Если вы не хотите вносить никаких изменений в структуру первого диска, просто выберите его в этом меню и затем выйдите из окна редактора разделов (Partition Editor), ничего не редактируя. Далее выберите в этом меню другой
Установка FreeBSD Глава 2 63 Name - adOsl РТуре 12 8 Desc unused freebsd Subtype 0 165 диск и разбейте его на разделы так, чтобы на нем можно было установить FreeBSD. Это позволит FreeBSD установить диспетчер загрузки на первый диск. Если вы этого не сделаете, диспетчер загрузки не будет установлен на первый диск, и вы не сможете загрузить FreeBSD после завершения процесса установки. Разбиение диска или дисков на разделы Вот какая информация будет отображаться в окне редактора разделов (Partition Editor): Disk name: adO FDISK Partition Editor DISK Geometry: 29795 cyls/16 heads/63 sectors = 234436482 blocks (113664MB) Offset Size(ST) End Name PType Desc Subtype Flags 0 63 62 63 30033297 30033359 The following commands are supported (in upper or lower case): A = Use Entire Disk G = set Drive Geometry С - Create Slice F = ' DD' m d D - Delete Slice Z = Toggle Size Units S = Set Bootable I - Wizard m. T = Change Type U = Undo All Changes W = Write Changes Use Fl or ? to get more help, arrow keys to select. Имя диска: adO Редактор разд лов FDISK Геометрия диска: 29795 цилиндров/16 головок/63 сектора 2344 6482 блоков (113664 Мбайт) Смещение Размер Конец Имя Тип Описание Подтип Флаги О 63 62 63 30033297 30033359 adOsl Поддерживаются следующие команды (в нижнем или верхнем регистре) : А - использовать целый диск G = установить геометрию устройства С = создать секцию F = режим 'DD* D - удалить секцию Z = переключить единицы измерения S = сделать загрузочным \ - мастер т. Т = изменить тип U =¦ отменить все изменения W - записать изменения чип Описание 12 unused 8 freebsd Подтип 0 165 Используйте F1 или ? для расширенной справки, а клавиши, со стрелками для выбора.
64 Введение в FreeBSD Часть I В данном случае первая строка сообщает о том, что сейчас редактируется диск adO, который, как упоминалось ранее, является первым АТА-диском в системе. Во второй строке отображаются сведения о конфигурации этого диска. (Если вам не понятно, что они означают, загляните в главу 20. Разбираться в этих сведениях важно только в том случае, если FreeBSD не удается получить их.) В следующих нескольких строках содержится информация о каждом определенном на этом диске разделе. Если это новый диск, или если вы удалили с диска все разделы, прежде чем устанавливать на него FreeBSD, далее будет отображаться только одна строка, информирующая о том, что на диске имеется только один раздел, который является неиспользуемым ("unused") и занимает все доступное на этом диске пространство. В табл. 2.3 вкратце описывается, какие сведения отображаются в каждом столбце. НА ЗАМЕТКУ Если термины, которые будут приводиться дальше (вроде "секторы"), вам не знакомы, прочитайте главу 20, которая посвящена жестким дискам и в которой подробно объясняются все связанные с ними термины. Таблица 2.3. Информация, отображаемая в таблице разделов Столбец Информация Offset Начальный сектор раздела. size (ST) Размер раздела в секторах. End Последний сектор в разделе. Name Имя устройства, которое FreeBSD присвоила этому разделу (если известно). РТуре Числовое обозначение типа раздела (то есть типа, к которому относится данный раздел). Desc Тип раздела. Subtype Дополнительная информация о типе раздела. flags В этом столбце могут отображаться следующие символы: - Раздел выровнен правильно. > Раздел выходит за границы 1024-го цилиндра на жестком диске. Это может сыграть свою роль позже, когда придет время создавать метки для дисков, потому что системные разделы, выходящие за границы 1024-го цилиндра, в некоторых системах приводят к появлению проблем (это ограничение системы BIOS, а не FreeBSD). R Раздел содержит корневую файловую систему, которая в FreeBSD является файловой системой самого высокого уровня. в Раздел поддерживает обработку дефектных участков (BAD 144). С Раздел является разделом FreeBSD. А Раздел является активным (то есть загрузочным).
Установка FreeBSD Глава 2 СОВЕТ Нажмите клавишу <Z>, чтобы преобразовать отображаемые значения размеров в секторы, килобайты, мегабайты или гигабайты. Чтобы выделить все доступное на этом диске пространство под FreeBSD, просто нажмите клавишу <А>, чтобы выполнить команду Use Entire Disk (Использовать весь диск). После этого должна появиться строка, показывающая, что на диске был создан один единственный раздел типа 165 с описанием freebsd. Кроме того, также появится строка, в столбце Desc которой будет отображаться значение unused. Не переживайте по этому поводу: это нормально, даже в случаях, когда для использования выбирается весь диск целиком. Далее, нажмите клавишу <Q>, чтобы выйти из окна редактора разделов (Partition Editor). Ни в коем случае не нажимайте перед этим клавишу <W> (которая выполняет команду Write Changes (Записать изменения)), потому что эта опция предназначена только для внесения изменений в существующие файловые системы, а не для первоначальных процедур установки. ВНИМАНИЕ! Когда для установки FreeBSD выбирается весь диск целиком, с этого диска удаляются все существующие данные. Поэтому если на диске имеются файлы, которые вы не хотите потерять, обязательно сделайте их резервные копии. А если вы вообще хотите сохранить всю имеющуюся на этом диске информацию, тогда, прежде чем продолжить процедуру установки FreeBSD, прочтите главу 3. НА ЗАМЕТКУ Н В отличие от Linux, для FreeBSD создавать множество разделов на одном диске не нужно, хотя вполне возможно, что для хранения файловых систем FreeBSD понадобится более одного раздела. Создать отдельные разделы для различных файловых систем можно с помощью редактора меток дисков (Disk Label Editor). Отличия между "разделами" BSD-типа (секциями) и разделами DOS/Linux-типа будут описаны в главе 20. После этого FreeBSD предложит установить программу FreeBSD Boot Manager (Диспетчер загрузки FreeBSD). Если вы устанавливаете FreeBSD не на первый, а на какой-нибудь другой диск в системе, выберите опцию BootMgr (Диспетчер загрузки). Вам также следует выбрать эту опцию, если FreeBSD не будет единственной операционной системой на этом диске. Если на данный диск устанавливается только операционная система FreeBSD и если диск является первым в системе, вы можете выбрать опцию Standard (Стандартная). Если в системе установлен только один-единственный жесткий диск, далее на экране появится сообщение, информирующее о необходимости создать внутри созданного только что раздела (разделов) fdisk разделы BSD. Нажмите клавишу <Enter>, чтобы перейти в окно редактора меток дисков (Disk Label Editor). Если в системе установлено несколько жестких дисков, вернитесь в меню выбора дисков.
Введение в FreeBSD НА ЗАМЕТКУ Если вы хотите разбить установку FreeBSD на несколько дисков (либо из-за того, что на одном диске не хватает места для полной установки, либо по причинам, связанным с производительностью), выберите любые другие диски, которые хотите использовать для FreeBSD, выполнив для каждого из них все те же шаги, которые описывались в этом разделе. Когда вы создадите разделы на всех дисках, которые хотите использовать для FreeBSD, удостоверьтесь в том, что выделена опция ОК, и нажмите клавишу <Enter>. Редактор меток дисков (Disk Label Editor) Именно в редакторе меток дисков (Disk Label Editor) вы будете создавать файловые системы, в которых фактически будет размещаться FreeBSD. Здесь вы будете делить созданные в редакторе разделов (Partition Editor) разделы (секции) на подразделы (BSD-разделы), закрепляемые за определенными местами в системе» Когда вы впервые отобразите окно этого редактора, оно будет выглядеть примерно так: FreeBSD Disklabel Editor Disk: ad'0 Partition name: adOsl Free: 234436482 blocks (113664MB) Part Mount Size Newfs Part Mount Size Newfs The following commands are valid here (upper or lower case): С = Create D = Delete M * Mount pt. W = Write N = Newfs Opts Q « Finish S « Toggle SoftUpdates Z = Custom Newfs T = Toggle Newfs U = Undo A = Auto Defaults R = Delete+Merge Use Fl or ? to get more help, arrow keys to select. Редактор меток FreeBSD Диск: adO Имя раздела: adOsl Свободно: 234436482 блоков (113664 Мбайт) Раздел Смонтирован Размер ФС Раздел Смонтирован Размер ФС Допустимые команды (в верхнем или нижнем регистре) : С - создать D * удалить М = смонтировать W = записать N * опции ФС (файловая система) Q - завершение S = переключить SoftUpdates Z « специальная ФС Т = переключить ФС U = отменить А = автоматическая настройка R = удалить+слить Используйте F1 или ? для расширенной справки, а клавиши со стрелками для выбора. В этом окне может отображаться информация как об одном, так и о нескольких дисках, что зависит от того, сколько дисков было выбрано для установки FreeBSD. Начиная с FreeBSD 5.0, опция Auto Defaults (Автоматическая настройка) предлагает разумные настройки по умолчанию, которые подходят в большинстве случаев. Если вы не уверены в том, что сумеете правильно создать разделы (эта процедура подробно описывается в следующем разделе), лучше выберите опцию Auto Defaults (Автоматическая настройка) (то есть нажмите клавишу <А>), а затем выйдете из окна редактора, нажав клавишу <Q>, и перейдите в раздел "Выбор дистрибутива" далее в этой главе. Если вы решили использовать несколько дисков, вам придется создавать и настраивать разделы вручную. Если вы вынуждены создавать разделы вручную или если вы не уверены, нужно ли вам создавать специальные разделы, прочитайте следующий раздел.
Установка FreeBSD | ~ I Глава 2 I I Создание разделов вручную Вы должны создать, как минимум, два раздела — один для корневой файловой системы и один для файла подкачки. Однако, "минимальный" подход — не всегда самый лучший подход. Он выглядит заманчиво, потому что исключает вероятность возникновения ситуации, когда в одном разделе вам не хватает свободного пространства, хотя оно так необходимо, а в другом разделе доступно 150 квинтиллионов гигабайт, но использовать их для того, что вам нужно, вы не можете. На самом деле, существует, по крайней мере, одна, достаточно хорошо известная версия Linux, которая предлагает размещать все в корневой файловой системе. Такой подход является опасным по двум причинам. Во-первых, FreeBSD и все остальные версии UNIX представляют собой мощные многофункциональные операционные системы. Они постоянно что-то делают, особенно если установлены на загруженных серверах. В этих системах обычно открыто сразу по нескольку окон, а также довольно часто выполняются операции записи данных на диск. Если в работе такой операционной системы случается сбой, когда внезапно отключается электричество или убирающая офис персона проходится пылесосом по шнуру питания сервера во время, когда выполняется операция записи, не исключено повреждение файловой системы. В зависимости от того, какие данные записывались на диск в момент, когда произошел сбой, повреждение может оказаться очень серьезным и сделать файловую систему абсолютно непригодной для использования. Файловая система вряд ли повредится, если в момент сбоя в работе операционной системе или временного отключения электричества в нее не будут записываться никакие данные. Вот почему лучше использовать несколько файловых систем. Это поможет не только ограничить область повреждения одним разделом (вместо всей системы целиком), но и защитить корневую файловую систему, которая имеет крайне важное значение. В грамотно составленной файловой системе в корневой раздел практически никогда не записываются никакие данные. Вторая причина, по которой размещение всех файлов в одном разделе может оказаться опасным, заключается в том, что это делает сервер более подверженным всевозможным атакам типа DoS (Denial of Service — отказ в обслуживании). Эти атаки могут быть как умышленными, так и случайными, но главное то, что они могут происходить, да и происходят, причем довольно-таки часто. Например, в системе, в которой не были установлены квоты, ограничивающие доступный для пользователей объем пространства, пользователь запросто мог бы специально или случайно (неправильно применив команду копирования файлов) создать файл, который бы занял все свободное пространство в разделе, где расположен его домашний каталог. Если бы в этом разделе были размещены все файловые системы, это привело бы не только к тому, что все остальные пользователи больше не смогли бы сохранять никакие данные в своих каталогах, но и, возможно, к отказу почтовой службы, из-за отсутствия свободного пространства в ее каталоге спулинга, и отказу службы печати, из-за нехватки места для хранения стоящих в очереди заданий на печать. Плюс к этому, еще и Web-сервер мог бы перестать обслуживать пользователей из-за отсутствия возможности записывать данные в файл журнала, syslogd (программа, которая регистрирует сообщения системы) тоже в этом случае лишилась бы возможности фиксировать важные сообщения, что позволило бы хакерам проникать в систему незамеченными. Все программы, которым для работы необходимо создавать временные файлы, выдавали бы ошибку из-за отсутствия свободного пространства в файловой системе tmp.
Введение в FreeBSD Предсказать, когда в файловых системах перестанет хватать места, довольно-таки трудно. Однако, иметь больше разделов, чем нужно, обычно лучше, чем иметь их слишком мало; поэтому я рекомендую создать, как минимум, пять разделов: один для корневой файловой системы (/), один для файла подкачки, один для пользовательской файловой системы (/usr), один для файловой системы var (/var) и еще один, последний, для временных файлов, которые могут создавать пользователи (/tmp). Некоторые рекомендуют размещать файловую систему /var в том же разделе, что и файловую систему /usr, потому что определить, какой объем пространства будет для нее оптимальным, достаточно сложно. Однако я не советую поступать подобным образом, потому что это может сделать систему более подверженной различным атакам типа отказа в обслуживании (особенно если домашние каталоги пользователей тоже находятся в том же разделе, что и файловая система /usr). НА ЗАМЕТКУ FreeBSD может использовать больше памяти, чем фактически установлено в системе, пользуясь так называемой виртуальной памятью. Чтобы использовать виртуальную память, FreeBSD перемещает все неиспользуемые страницы памяти на диск, тем самым освобождая в памяти место для данных, которые нужны в конкретный момент. Когда в странице памяти, которая была перемещена на диск, снова возникает необходимость, FreeBSD перемещает ее обратно в память и, если необходимо, перемещает из памяти на диск какие-нибудь другие данные, чтобы освободить место. Эти операции называются подкачкой, а область диска, в которую перемещаются неиспользуемые на текущий момент страницы памяти, называется разделом подкачки. В табл. 2.4 перечислены некоторые основные каталоги FreeBSD и вкратце описывается, для чего каждый из них предназначен. Эта информация должна помочь вам определиться с тем, какие файловые системы вы хотите разместить в каждом разделе. Обратите внимание на то, что список каталогов, приводимый в этой таблице, является неполным: в нем перечислены только те каталоги, для которых вы можете захотеть создать отдельные разделы. Полный перечень всех каталогов FreeBSD с пояснениями можно найти в главе 12. Таблица 2.4. Каталоги FreeBSD и их предназначение Каталог Предназначение / Это каталог корневой файловой системы. Именно в этом каталоге будут появляться все остальные файловые системы (даже если они находятся в разных разделах, на разных дисках или даже на разных компьютерах и континентах). У корневой файловой системы должен быть свой раздел, и философия FreeBSD гласит, что чем меньше будет этот раздел, тем лучше. 256 Мбайт должно вполне хватить. При наличии проблем со свободным пространством вы можете выделить для него и только 100 Мбайт, но ни в коем случае не меньше этого. Обратите внимание на то, что при указании для корневого раздела размера, меньшего 118 Мбайт, FreeBSD отобразит соответствующее предупредительное сообщение. /boot в каталоге boot размещается ядро, его модули и другие файлы, необходимые для запуска операционной системы. Выделив для каталога /boot отдельный раздел, вы можете создать корневой раздел, выходящий за пределы 1024-го цилиндра. (Обратите внимание, что каталог boot должен полностью помещаться на первых 1 024 цилиндрах.)
Установка FreeBSD I ГГ I Глава 2 I I Окончание табл. 2.4 Каталог Предназначение /usr в файловой системе /user содержится большая часть утилит и программ, к которым будут получать доступ обычные пользователи, поэтому для нее обязательно должен создаваться отдельный раздел. Обычно для раздела /usr выделяется все пространство на диске, которое осталось после создания других разделов, имеющих специальные (рекомендованные) размеры. /usr/local в этом каталоге устанавливаются все сторонние программы, которые не являются частью операционной системы (такие как Web-серверы и программы для работы с базами данных). Некоторые предпочитают создавать для каталога /usr/local отдельный раздел, то есть не помещать его в раздел /usr. Лично я не рекомендую делать это в стандартных случаях. Исключением может быть ситуация, когда у вас установлено несколько жестких дисков, и вы хотите разбить раздел /usr в*целях экономии пространства. /var в этом каталоге хранятся "переменные" файлы или файлы, создаваемые программами во время их работы (такие как файлы данных времени выполнения, файлы баз данных и файлы журналов). Я предпочитаю создавать для /var отдельный раздел. В каталоге /var могут храниться: входящие сообщения, системные журналы, журналы Web-серверов и задания, стоящие в очередь на печать. При выборе размера для раздела /var следует исходить из того, планируется ли в данной системе использовать сервер печати, почтовый сервер или Web-сервер. Обратите внимание, что на загруженном Web-сервере размер файлов журналов всего за пару дней запросто может увеличиться до объема более 100 Мбайт. Если вы собираетесь создавать мощный Web-сервер, то либо выделите для раздела /var достаточно большое количество пространства (1 Гбайт или даже больше), либо готовьтесь к частому выполнению процедуры обновления журнальных файлов. Если вы знаете, что будете получать много электронной почты, вы тоже захотите сделать раздел /var достаточно большим, размером в несколько гигабайт, для того чтобы на нем могла без проблем умещаться каталоги спулинга всех пользователей (которые могут становится очень большими, особенно когда они не обслуживаются). /tmp это каталог, в который программы и пользователи могут записывать свои временные файлы. Он обычно очищается автоматически при каждой перезагрузке. Корректно написанные программы, которым для работы приходится создавать очень большие временные файлы, не должны использовать этот каталог; вместо этого они должны использовать каталог /usr/tmp или /var/tmp, чтобы исключить вероятность переполнения небольшого по размерам корневого каталога. Вы можете либо создать для каталога /temp отдельный раздел (именно такой подход по умолчанию применяется в программе Sysinstall), либо сопоставить его с какой-нибудь областью в разделе /usr. Также обратите внимание на то, что если для выполнения какой-нибудь определенной операции требуется больше временного пространства, нежели доступно, вы можете временно изменить место, используемое для записи временных файлов, для данной конкретной операции. /home Это каталог, в котором хранятся домашние каталоги пользователей. Обычно его размещают в разделе /usr. Если вы уже точно знаете, чтр системой будет пользоваться много пользователей, и что эти пользователи будут создавать много файлов, вы можете захотеть создать для каталога /home отдельный раздел или даже выделить для него целый диск.
Введение в FreeBSD Часть I СОВЕТ Если в системе установлено несколько жестких дисков, вы можете оптимизировать производительность системы, распределив задачи, выполнение которых подразумевает интенсивное использование диска, между этими несколькими жесткими дисками. Например, если вы планируете пользоваться сервером новостей Usenet (который эксплуатирует жесткий диск довольно-таки интенсивно) и Web-сервером (не менее интенсивно использующим жесткий диск), вам лучше разместить каталог сервера новостей и каталог, в котором Web-сервер будет хранить свои страницы, на отдельных дисках. Точно так же, если вы разместите содержимое базы данных на отдельном от статического Web-содержимого диске, вы тоже сможете значительно увеличить производительность Web-сервера. Корневой раздел Если специализированный раздел /boot не используется, первым разделом на диске должен быть корневой (/). Чтобы создать корневой раздел, с помощью клавиш со стрелками выделите в верхней части окна редактора меток дисков (Disk Label Editor) диск, на котором вы хотите разместить корневой каталог (в столбцах Disk (Диск), Partition Name (Название раздела) и Free (Свободно) этого диска обязательно должны быть указаны какие-нибудь значения) и затем нажмите клавишу <С>, чтобы выполнить команду Create Partition (Создать раздел). Появится диалоговое окно с приглашением указать размер раздела (рис. 2.3). Рис. 2.3. Указание размера для раздела Как уже упоминалось ранее в этой главе, 256 Мбайт должно быть вполне достаточно для корневого раздела. В этом диалоговом окне сказано, что для того, чтобы указать размер в мегабайтах, следует просто добавить после обозначающего размер числа букву "М". Поэтому введите здесь 256М (предполагается, что вы хотите создать корневой раздел размером именно 256 Мбайт) и нажмите клавишу <Enter>. Далее последует приглашение выбрать тип для создаваемого раздела. Поскольку в этом разделе будет храниться корневая файловая система, выберите опцию FS - A File System (ФС — Файловая система) и нажмите клавишу <Enter>. После этого на экране появится диалоговое окно с приглашением указать для создаваемого раздела точку монтирования. Точка монтирования (mount point) — это каталог, в котором будет доступна
Установка FreeBSD I ~~ I Глава 2 I I данная файловая система. Поскольку сейчас речь идет о корневой файловой системе, введите в этом окне / и нажмите клавишу <Enter>. После этого ваш экран должен будет выглядеть примерно так: FreeBSD Disklabel Editor Disk: adO Partition name: adOsl Free: 29761379 blocks (113408MB) Part Mount Size Newfs Part Mount Size Newfs adOsla / 256MB UFS1 Y The following commands are valid here (upper or lower case): С = Create D = Delete M = Mount pt. W = Write N = Newfs Opts Q = Finish S = Toggle SoftUpdates Z = Custom Newfs T = Toggle Newfs U = Undo A « Auto Defaults R = Delete+Merge Use Fl or ? to get more help, arrow keys to select. Этот код показывает, что у вас теперь есть файловая система в части adOsla (adOsla — комбинированное имя, состоящее из имени устройства и названия секции, которое FreeBSD использует для ссылки на эту файловую систему), что она размещается в разделе /, занимает 256 Мбайт и относится к файловым системам типа UFS1 (данный тип является стандартным для файловых систем в FreeBSD). Далее потребуется создать раздел подкачки. Раздел подкачки FreeBSD — это операционная система с виртуальной памятью; она может использовать больше памяти, чем фактически доступно в физическом ОЗУ. Для этого она берет и переносит из ОЗУ на диск те страницы программ, которые в настоящий момент не используются. Когда в этих страницах снова возникает необходимость, FreeBSD переносит их с диска обратно в ОЗУ и, если нужно, снова переносит из ОЗУ на диск какие-нибудь другие данные, чтобы освободить место для этих возвращаемых в ОЗУ страниц. Конечно, получение доступа к данным на жестком диске занимает гораздо больше времени, чем получение доступа к данным, которые находятся в ОЗУ, поэтому раздел подкачки ни в коем случае не может заменить ОЗУ Но, тем не менее, раздел подкачки играет очень важную роль в схеме, по которой работает UNIX и все остальные современные операционные системы, а также является главной причинной, по которой ошибки типа "недостаточно памяти" (out of memory) сегодня практически не возникают. Правильная (или неправильная) конфигурация раздела подкачки может значительно повлиять на производительность системы. Ниже приводятся некоторые советы по поводу того, где лучше размещать раздел подкачки: • Размещайте раздел подкачки как можно ближе к началу диска. Доступ к имеющим меньшие номера цилиндрам диска, которые находятся ближе к краю, и считывание с них данных происходит гораздо быстрее, чем доступ и считывание данных с цилиндров, имеющих более высокие номера (они перемещаются быстрее, чем те, что находятся в средней части диска). • Если в системе установлено несколько дисков, то, как правило, раздел подкачки лучше размещать на самом быстром из них.
I ~ I Введение в FreeBSD I I Часть I • Если самый быстрый диск в системе также является и самым загруженным, то есть чаще остальных используется пользователями, Web-серверами, почтовыми агентами и так далее ^ совет из предыдущего пункта можно проигнорировать и разместить раздел подкачки на наименее загруженном из всех дисков в системе. Это не только даст диску больше времени на доступ к разделу подкачки вместо чего-то другого, но также увеличит вероятность того, что считывающие головки будут находиться уже в разделе подкачки, когда потребуется свопинг. Такие, казалось бы, незначительные детали, как время, затрачиваемое головками на то, чтобы добраться до той части диска, в которой находится раздел подкачки, могут играть очень важную роль при серьезных нагрузках и интенсивном свопинге. Итак, сколько же пространства следует выделять под раздел подкачки? Давным- давно, когда ОЗУ было дорогим удовольствием, и на компьютерах большинства пользователей объем ОЗУ составлял от 4 до 16 Мбайт, было принято придерживаться следующего правила: размер раздела подкачки должен примерно в 2.5 раза превышать объем ОЗУ. Но сегодня ОЗУ — это дешевый и доступный аппаратный элемент. Рабочие станции с ОЗУ объемом 1 Гбайт и серверы с ОЗУ объемом 4 Гбайт и больше — в наши дни далеко не редкость. Сегодня рядовой пользователь вполне может позволить себе иметь ОЗУ большего, чем ему нужно на самом деле, объема. Однако дисковое пространство сейчас тоже стоит относительно дешево и поэтому пользователь еще может и укомплектовать свою новую систему диском, большего чем ему в принципе нужно размера. Поскольку увеличить объем ОЗУ намного легче, чем заменить жесткий диск диском большего размера (ведь для этого просто нужно вставить дополнительный модуль памяти), вы можете предпочесть для начала все-таки создать раздел подкачки размером, по крайней мере, в два раза превышающим объем имеющегося ОЗУ. В этом случае, если вы потом решите удвоить объем ОЗУ в своей системе, волноваться об изменении размера раздела подкачки вам не придется, потому что он все же еще будет, по крайней мере, не меньше размера физического ОЗУ и, значит, пригодным для использования. Размер 512 Мбайт является в принципе неплохим вариантом для раздела подкачки, если объем установленного в системе ОЗУ тоже составляет 512 Мбайт или меньше и если дисковое пространство — не проблема. Если возможно, для раздела подкачки всегда следует выбирать размер, по крайней мере, равный объему имеющегося ОЗУ. Если вы планируете заниматься разработкой или отслеживать такую ветвь FreeBSD, как CURRENT, то выполнение этого условия становится практически необходимостью, почему — объясняется дальше. Время от времени возникают такие ситуации, когда ядро операционной системы просто не знает, что делать. Когда это происходит, ядро останавливает работу, выдает ошибку "Kernel panic" ("паника ядра") и затем просто перезагружает систему. Однако если ядро сконфигурировать соответствующим образом, оно в таком случае будет сначала "сбрасывать" содержимое ОЗУ в раздел подкачки и только потом выполнять перезагрузку системы. Содержимое ОЗУ на момент возникновения такой ошибки является важным для программистов, потому что позволяет им выяснить и устранить причину, приведшую к появлению этой ошибки. Если в ОЗУ содержится больше информации, чем может уместиться в разделе подкачки, может произойти следующее:
— _ Установка FreeBSD | ~ I Глава 2 I I • Ядро решит не сбрасывать содержимое ОЗУ в раздел подкачки. Такой сценарий является наиболее вероятным. В этом случае никакая отладочная информация, позволяющая выяснить причину возникновения ошибки "Kernel panic", естественно, доступной не будет. • Если ошибка "Kernel panic" возникла в ядре по причине, неким образом связанной с файловыми системами, не исключено, что ядро начнет сбрасывать содержимое ОЗУ в раздел подкачки и не остановится даже тогда, когда достигнет границ этого раздела, что вполне может закончиться серьезным повреждением файловой системы, следующей сразу за разделом подкачки» Ошибки "Kernel panic" редко случаются в FreeBSD. Но когда они все-таки случаются, возможность сбрасывания содержимого ОЗУ в раздел подкачки оказывается очень кстати, потому что позволяет проанализировать данные, находившиеся в ОЗУ в момент, когда произошла эта ошибка, и попытаться выяснить, что стало причиной ее возникновения. Поэтому раздел подкачки лучше делать размером, по крайней мере, равным объему установленного в системе ОЗУ или даже большим, если дисковое пространство не является проблемой. НА ЗАМЕТКУ Ошибки "Kernel panic" в системах UNIX похожи на небезызвестные ошибки типа "Blue Screen of Death" ("синий экран смерти"), происходящие в системах Windows NT/2000/XR Те кто, привык работать с Windows, могут вздохнуть с облегчением, потому что ошибки "Kernel panic" в FreeBSD возникают гораздо реже, чем ошибки типа "синего экрана смерти" в Windows, особенно если пользователь не использует никаких экспериментальных заплат для ядра и не проходивших тестирование программ. Лично у меня за двенадцать лет работы с FreeBSD ошибка "Kerne! panic" произошла только один единственный раз. Определившись с размером для раздела подкачки, возьмите и создайте его точно так же, как создавали корневой раздел, только в этот раз в диалоговом окне с приглашением указать тип файловой системы выберите вариант Swap — A Swap Partition (Подкачка — Раздел подкачки) ¦ Точки монтирования у разделов подкачки не бывает, поэтому когда вы будете создавать свой раздел подкачки, приглашения указать точку монтирования не последует. Создание остальных разделов После того, как вы создадите корневой (и, возможно, загрузочный) раздел и раздел подкачки, создайте все остальные необходимые разделы, указав для них выбранный заранее размер и подходящие точки монтирования (например, /usr или /var). Не забывайте ставить в начале символ косой черты. СОВЕТ . Если вы предпочитаете позволить Sysinstall автоматически создать все необходимые разделы, просто удалите все разделы, которые создали до этого, и нажмите клавишу <А>, чтобы выбрать опцию Auto Defaults (Автоматическая настройка). Точки монтирования и размеры разделов, устанавливаемые при выборе этой опции, как правило, подходят для всех, кроме очень уж специализированных конфигураций.
_ л , Введение в FreeBSD 74 Часть I Вы можете исправлять допущенные ошибки и создавать разделы заново в любое время на протяжении этого сеанса, потому что все изменения записываются на диск только в самом конце процесса. Просто выделите раздел и нажмите клавишу <Delete>, чтобы удалить его, а затем при помощи клавиши с изображением стрелки вверх перейдите к диску, отображающемуся в верхней части экрана, и нажмите клавишу <С>, чтобы создать новый раздел. Когда в системе установлено несколько дисков, перемещаться по ним можно с помощью клавиш с изображением стрелок вверх и вниз: используя эти клавиши, выделите в верхней части экрана диск, на котором хотите создать раздел. Ниже показан пример того, как может выглядеть окно редактора меток дисков (Disk Label Editor), когда вы закончите создавать разделы: FreeBSD Disklabel Editor Free: 0 blocks (0MB) blocks Disk: adO Disk: adl (0MB) Part adOsla adOslb adOsle adOslf adOslg adlsle Mount / swap /var /tmp /usr /home Partition name: adOsl Size 256MB 756MB 256MB 256MB 48817MB 124664M3 Free: 0 blocks (0MB) Partition name: adlsi Free: 0 Newfs UFSl SWAP UFS1+S UFS1+S UFS1+S UFS1+S Part Y Y Y Y Y Mount Size Newfs The following commands are valid here (uppei or lower case): С » Create D - Delete M ~ Mount pt. W ¦» Write N = Newfs Opts Q - Finish S * Toggle SoftUpdates Z - Custom Newfs T » Toggle Newfs U - Undo A « Auto Defaults R * Delete+Merge Use Fl or ? to get more help, arrow keys to select. Данный пример показывает, что в системе имеется целых два жестких диска, и что каталог /home был размещен на втором диске в отдельном разделе, который занимает все пространство на этом диске. НА ЗАМЕТКУ Если во время создания раздела внизу экрана появится сообщение об ошибке типа "You can only do this in a master partition (see top of screen)" ("Это можно делать только в ведущем разделе (см. вверху экрана)"), значит, вам нужно выделить один из тех разделов с файловыми системами, что отображаются в верхней части экрана. Используя клавишу с изображением стрелки вверх, перейдите к диску, на котором хотите создать раздел, и затем попробуйте создать раздел еще раз. Полезная информация об опции Soft Updates Начиная с версии FreeBSD 5.0, опция Soft Updates (Плавные обновления) по умолчанию является включенной в большинстве файловых систем (кроме той, что находится в каталоге /). Эта опция более подробно будет рассматриваться в главе 12, но уже сейчас вам следует знать, что она способна значительно увеличивать производительность и надежность большинства файловых систем, поэтому ее лучше остав-
Установка FreeBSD I ~ I Глава 2 I I лять включенной. Активизировать опцию Soft Updates можно следующим образом: с помощью клавиш с изображением стрелок вверх и вниз выделите нужную файловую систему и нажмите клавишу <S> (эта клавиша позволяет как включать, так и отключать опцию Soft Updates). У файловой системы с включенной опцией Soft Updates после типа будет стоять +S (например, UFS1+S). Закончив создавать разделы, нажмите клавишу <Q>, чтобы выйти из окна редактора разделов (Partition Editor). Опять-таки, ни в коем случае не нажимайте перед этим клавишу <W>, потому что выполняемая ею команда предназначена для внесения изменений в уже существующие файловые системы, а не для установки новых. Пока вы находитесь в одном и том же сеансе работы с Sysinstall, все вносимые вам изменения хранятся в памяти и не будут применены до тех пор, пока вы не выберите тип установки. На следующем экране вам будет предложено выбрать, какие компоненты FreeBSD вы хотите установить. Выбор дистрибутива На рис. 2.4. показано меню Choose Distributions (Выбор дистрибутивов). Рис. 2.4. Выбор дистрибутива "Дистрибутивом" в FreeBSD называется набор доступных программ, который можно выбрать для установки. Не все программы подходят для всех пользователей: например, если вы не планируете работать с исходным кодом, вам вовсе необязательно его устанавливать. Тем не менее, если у вас достаточно места на диске, рекомендуется выбрать опцию АН (Все). Если вы планируете использовать данную систему только как сервер и точно знаете, что вам не понадобится система X Window System, можете вместо этого выбрать опцию Developer (Разработчик). Если вы выберите дистрибутив, не включающий исходный код, вы не сможете создавать ядро и обновлять систему с помощью программы CVSup (если только вы не загрузите все исходные коды после того, как запустите CVSup, что исключает экономию места, которая возможна при выборе соответствующей опции здесь, то есть в этом меню). Если вы выберете опцию, которая предполагает установку только исходных кодов ядра, но не всех остальных исходных кодов, создавать новое ядро вы сможете, а обновлять систему с помощью CVSup — все равно нет. Если вы новичок, вы наверняка вообще не будете знать, для чего предназначена большая часть всех этих пакетов. Поэтому, рекомен-
I ZZ I Введение в FreeBSD I I Часть! дуется все-таки остановить свой выбор на одном из готовых дистрибутивов, и лучше если это будет дистрибутив АН (Все), НА ЗАМЕТКУ CVSup — это программа синхронизации файлов, которая автоматически обновляет операционную систему FreeBSD, подключаясь к серверам и определяя, что изменилось со времени, когда ее запускали в последний раз. Все изменения автоматически загружаются с сервера и применяются к исходному коду FreeBSD. Такой подход является более быстрым, нежели загрузка всего дерева исходных кодов целиком. Когда используется CVSup, загружаются только те данные, которые изменились. Программа CVSup более подробно будет рассматриваться в главе 19. Выбрать дистрибутив можно следующим образом: выделите нужный дистрибутив и нажмите клавишу пробела. После этого на экране появится диалоговое окно с приглашением установить коллекцию портов FreeBSD. Если вы можете позволить себе потратить 300 Мбайт, вам лучше все-таки установить эту коллекцию (которая более подробно будет рассматриваться в главе 16), потому что она предоставляет удобный механизм для загрузки, установки и настройки тысяч дополнительных программ и компилирует их в соответствии с требованиями именно вашей системы FreeBSD. Когда установлена коллекция портов, установка дополнительных программ превращается в очень простую задачу. С помощью клавиши <ТаЬ> выберите подходящий вариант и нажмите клавишу <Enter>. Далее на экране снова появится меню Choose Distributions (Выбор дистрибутивов). Выбранные дистрибутивы должны быть отмечены крестиком (X); если была выбрана опция АН (Все), крестиком будут отмечены все дистрибутивы. Используя клавишу с изображением стрелки вверх, перейдите к опции Exit (Выход) и затем нажмите клавишу <Enter>. Выбор источника установки На следующем экране вам будет предложено указать источник установки (рис. 2.5). Рис. 2.5. Выбор источника установки
Установка FreeBSD I ZZ I Глава 2 I I В этой главе предполагается, что установка выполняется с прилагаемого к этой книге DVD-диска (или с официальных CD-дисков). Если это не так, то есть если вы выполняете установку с сетевого диска, накопителя на магнитной ленте, FTP-сервера или существующей файловой системы, вам следует сначала прочитать соответствующий вашему типу установки раздел в главе 3. НА ЗАМЕТКУ Если вы выполняете установку с дискет, выберите опцию FTP и нажмите клавишу <Enter>. Далее вам придется настроить свою сетевую карту так, чтобы программа Sysinstall могла получить доступ к FTP-серверу и загрузить установочные файлы операционной системы FreeBSD. На экране появится список доступных в системе сетевых устройств (карт Ethernet) с метками, которые должны помочь определить, какое из этих устройств является подходящим, то есть подключенным к сети: в принципе, правильным вариантом обычно является первое значение в этом списке, нередко включающее имя устройства, такое как fxpO. Чтобы настроить параметры сетевой связи для выбранной карты Ethernet, прочтите раздел "Настройка сети", который находится далее в этой главе, а затем, когда введете всю необходимую TCP/IP-информацию, снова вернитесь сюда. Если вы выполняете установку с CD- или DVD-диска, убедитесь в том, что выбрана опция CD/DVD и нажмите клавишу <Enter>. После этого на экране появится следующее предупредительное сообщение: User Confirmation Requested Last Chance! Are you SURE you want to continue the installation? If you're running this on a disk with data you wish to save then WE STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding! We can take no responsibility for lost disk contents! Требуется подтверждение пользователя Последний шанс! Вы УВЕРЕНЫ, что хотите продолжить установку? Если вы запускаете это на диске с какими-то данными, которые должны быть сохранены, НАСТОЯТЕЛЬНО РЕКОМЕНДУЕМ ПОДГОТОВИТЬ РЕЗЕРВНЫЕ КОПИИ перед продолжением! Мы не можем нести ответственности за утерю содержимого диска! ВНИМАНИЕ! До этого момента никакие изменения на ваш жесткий диск фактически не вносились. Это ваш последний шанс отменить установку. После того, как вы выберите вариант Yes (Да), все созданные вами разделы будут отформатированы и начнется непосредственно процесс установки. Все данные, находящиеся на разделах, которые вы выбрали для использования, будут уничтожены! Если вас устраивают выбранные вами для установки опции, выделите вариант Yes (Да) и нажмите клавишу <Enter>. На экране появится еще одно сообщение, информирующее о том, что в разделе vty4 была запущена так называемая "аварийная" голографическая оболочка, то есть, что в случае допущения какой-нибудь ошибки, вы сможете, нажав клавиатурную комбинацию <Alt+F4>, переключиться в режим командной строки и исправить ее. (Нажав клавиатурную комбинацию <Alt+F2>, вы сможете видеть, какие именно файлы сейчас устанавливаются. Чтобы вернуться экрану Sysinstall, нажмите клавиатурную комбинацию <Alt+Fl>.) Далее начнется процесс
Введение в FreeBSD форматирования разделов. Когда этот процесс завершится, Sysinstall начнет копировать файлы на ваш жесткий диск (диски). Весь процесс установки может как занять всего лишь пятнадцать минут, так и растянуться до нескольких часов, что зависит от того, с какого носителя производится установка. Когда используется CD- или DVD-диск, установка выполняется очень быстро, а когда применяются дискеты, компьютеру приходится загружать всю операционную систему с FTP-сервера, а это несколько сотен мегабайт. Время, которое занимает установка с дискет или по сети, очень сильно зависит от скорости используемого Internet-соединения, и чем медленнее работает это соединение, тем дольше будет выполняться установка. Если нужно, вы можете оставить процесс установки выполняться даже ночью: после его завершения никаких срочных действий с вашей стороны не потребуется. Конфигурирование и настройка системы после установки Когда копирование файлов завершится, появится экран с поздравлениями по поводу того, что вам удалось дойти до этого этапа, а также информацией о том, что далее Sysinstall задаст вам еще несколько вопросов для окончательной настройки системы. Сначала Sysinstall пригласит вас сконфигурировать сетевые настройки, а затем предложит установить время, настроить мышь, выбрать настольную среду (графическую оболочку), установить дополнительные пакеты программ, создать учетные записи и указать пароль пользователя root. Чтобы продолжить, выберите на этом экране опцию ОК и нажмите клавишу <Enter>. * Настройка сети Далее появится диалоговое окно с вопросом о том, не хотите ли вы сконфигурировать какие-то сетевые устройства Ethernet или SLIP/PPR (Этот шаг является необязательным, если вы выполняете установку с дискет, потому что в таком случае вы уже должны были установить все сетевые настройки ранее в процессе.) Если вы располагаете сведениями, необходимым для настройки сети (например, взяли их у системного администратора), вы можете выбрать вариант Yes (Да) и установить параметры подключения к сети сейчас. Если вы не располагаете такими сведениями или если вы хотите создать новое сетевое соединение, но не уверены в том, как это правильно делается, лучше пока пропустите этот шаг (вы всегда сможете вернуться в эту программу и установить все необходимые настройки позже, когда прочтете главы, посвященные работе в сети). ВНИМАНИЕ! Если вы в настоящий момент подключены к сети и поэтому решили пока не тратить время на конфигурирование сетевых устройств, знайте, что после перезагрузки системы вы не сможете снова получить доступ к сети до тех пор, пока не настроите соответствующим образом свои сетевые устройства. Во всех остальных случаях, то есть если вы не подключены к сети или не знаете, какие значения нужно вводить в полях для настройки сетевого соединения, вы можете пока что пропустить этот раздел и вернуться к нему позже, после того как прочитаете посвященные этой теме главы в части IV.
Установка FreeBSD | ZT I "" ~ Глава 2 I I Если вы не хотите сейчас конфигурировать никакие сетевые устройства, просто выберите вариант No (Нет) и переходите к следующему разделу главы. Если же вы все-таки решили настроить сетевые устройства на этом этапе, выберите вариант Yes (Да): после этого появится экран, подобный показанному на рис. 2.6. Рис, 2.6. Выбор сетевого интерфейса для настройки Выделите в списке сетевое устройство, которое хотите сконфигурировать, и нажмите клавишу <Enter>. Обратите внимание на то, что адаптер Ethernet может называться по-разному, что зависит от его производителя и модели. И если выбранный адаптер Ethernet является первым и единственным в системе, его номером будет О (например: fxpO). После того, как вы выберите сетевое устройство, которое хотите сконфигурировать, появится диалоговое окно с приглашением попробовать настроить сетевой интерфейс с помощью сервера IPv6. Если вы точно знаете, что в вашей сети нет сервера IPv6, который мог бы отправить вам конфигурационную информацию, вам следует выбрать вариант No (Нет). Далее последует приглашение попробовать настроить сетевой интерфейс с помощью сервера DHCP. Если в сети имеется сервер DHCP, FreeBSD попытается связаться с ним и получить всю необходимую информацию о вашей сети. Если вы точно знаете, что такого сервера в вашей сети нет, вы должны выбрать вариант No (Нет). Если вы подключены к корпоративной или домашней сети с маршрутизатором и не уверены, доступен в ней сервер DHCP или нет, выберите вариант Yes (Да): в сетях с маршрутизатором в большинстве случаев такой сервер имеется. Если после этого появится экран с заполненными полями, вам не придется выполнять несколько следующих шагов. На следующем экране вы сможете вручную ввести необходимую информацию о вашей сети. О том, что это за информация, более подробно будет рассказываться в главе 22 и 23, но ниже все же приводятся некоторые пояснения, чтобы вам легче было понять, о чем идет речь. На рис. 2.7. показан сам экран Network Configuration (Настройка сети), а в табл. 2.5 объясняется предназначение всех отображаемых на нем полей.
80 Введение в FreeBSD Часть I Рис. 2.7. Настройка сетевого интерфейса Таблица 2.5. Поля, отображаемые на экране Network Configuration (Настройка сети) Поле Описание Общие сетевые параметры для данной системы Host (Главный компьютер) Domain (Домен) IPv4 Gateway (Шлюз IPv4) Name server (Имя сервера) Здесь указывается имя хоста и имя домена системы (в данном примере, это — samba.example.com). Имя домена, в котором находится система (в данном Примере, ЭТО — example.com). Если система будет использовать маршрутизатор для получения доступа к нелокальным сетевым ресурсам (Internet), здесь следует указать адрес этого маршрутизатора. IP-адрес DNS-сервера, который преобразует сетевые имена в IP-адреса. Специальные сетевые параметры для данного сетевого интерфейса IPv4 Address (Адрес IPv4) Netmask (Сетевая маска) Extra Options to if conf ig (Дополнительные параметры для if conf ig) IP-адрес этой системы. Значение сетевой маски сети, к которой будет получать доступ данный интерфейс. Здесь указываются все остальные параметры, которые необходимо передать в конфигурацию сети. Если какая-либо из этих концепций вам неизвестна, то вы лучше, прежде чем приступать к настройке сети, прочитайте сначала главы 22 и 23. ВНИМАНИЕ! Если вы не уверены в том, какие имена или числа следует вводить в полях на экране Network Configuration (Настройка сети), обязательно спросите того, кто разбирается в этом. Никогда не вводите в этих полях просто любые значения, если ваша система сейчас подключена к сети. Если вы, находясь в сети, введете просто случайные числа в поле IPv4 Address (Адрес IPv4) или выбранное наугад имя в поле Host (Главный компьютер), вы обязательно наживете себе врагов как среди сетевых администраторов, так и среди других пользователей сети. Если вы укажете IP-адрес, конфликтующий с другой системой в сети, начнутся всякие неприятности; возможен даже отказ от обслуживания важного сетевого ресурса, если указанный IP-адрес конфликтует с IP-адресом главного сервера.
Установка FreeBSD Глава 2 81 Для перехода по полям используйте клавишу <ТаЬ> или <Enter>. Когда закончите заполнять поля, выделите опцию ОК и нажмите клавишу <Enter>, чтобы покинуть экран Network Configuration (Настройка сети). После этого, в зависимости от типа сетевого интерфейса, может появиться диалоговое окно с приглашением активизировать сетевой интерфейс прямо сейчас. Выберите вариант No (Нет), потому что вы уже практически закончили устанавливать FreeBSD, и скоро все равно будете перезагружать систему. Далее Sysinstall задаст еще несколько вопросов о сети: • Do you want this machine to function as a network gateway? (Хотите ли вы, чтобы данная машина выступала в роли сетевого шлюза?) Если только вы не планируете сделать из этого компьютера сетевой шлюз, который другие системы в сети будут использовать для получения доступа к Internet, или маршрутизатор, который будет обрабатывать сетевой трафик, предназначенный для других систем, выберите вариант No (Нет). В противном случае выберите вариант Yes (Да) и обязательно прочитайте главу 28. • Do you want to configure inetd and network services it provides? (Хотите ли вы настроить сервер inetd и сетевые службы, к которым он предоставляет доступ?) "Суперсервер" inetd — это процесс, который обрабатывает поступающие запросы на получение доступа к службам определенного типа, таким как почтовые службы Telnet, FTP, POP и IMAP и другие. В наши дни службы, которые запускаются через inetd, встречаются все реже, да и сам inetd считается уязвимым местом в системе безопасности. Поэтому, если вы не планируете пользоваться службами, которые предоставляет inetd, или просто не знаете, понадобятся они вам или нет, выберите вариант No (Нет): вы всегда сможете настроить inetd позже, если будет нужно. • Would you like to enable SSH login? (Активизировать протокол SSH?) Здесь выберите вариант Yes (Да). SSH позволяет удаленным пользователям подключаться к программной оболочке FreeBSD (командной строке UNIX) через безопасный, поддерживающий шифрование канал. Уже все знают, что лучше использовать SSH, чем не поддерживающий шифрования альтернативный протокол Telnet, поэтому будет совсем неплохо, если вы заставите всех своих пользователей применять для удаленного доступа не Telnet, a SSH. Однако если вы вообще не хотите, чтобы к вашей машине был возможен удаленный доступ, выберите вариант No (Нет). ВНИМАНИЕ! Активизация протокола SSH означает, что удаленные пользователи, пересылая через сеть свои имена пользователей и пароли, смогут получать доступ к вашей системе и ее интерфейсу командной строки. Хотя SSH является безопасным протоколом, он не сможет защитить ваши данные от атак вроде угадывания или намеренного подбора пароля. Поэтому никогда не используйте протокол SSH в качестве единственного средства защиты от несанкционированного доступа и всегда выбирайте надежный или трудно угадываемый пароль. Для получения более подробной информации о надежных паролях обращайтесь в главу 30.
82 Введение в FreeBSD Часть I Do you want to have anonymous FTP access to this machine? (Разрешить анонимный доступ через FTP?) Я предлагаю выбрать вариант No (Нет), если только вы уже не прочитали главы, посвященные настройке сетевых соединений, такие как глава 27. Вы всегда сможете настроить анонимный доступ через FTP позже, если в этом возникнет необходимость. Do you want to configure this machine as an NFS server? (Хотите сконфигурировать эту машину как сервер NFS?) Сервер NFS позволяет делать каталоги на вашем жестком диске доступным для других пользователей так, чтобы они могли монтировать их, а также записывать или считывать хранящиеся в них данные. Опять-таки, если только вы не прочли главу 33, я советую пока выбрать вариант No (Нет), даже если вы точно знаете, что эта служба вам понадобится. Неправильно настроенная NFS может стать уязвимым местом в системе безопасности. Прочитав главу 33, вы запросто сможете вернуться и настроить NFS должным образом. Do you want to configure this machine as an NFS client? (Хотите настроить этот компьютер так, чтобы он выступал в роли клиента NFS?) Если вам необходимо иметь возможность монтировать на своем диске файловые системы, которые находятся на других компьютерах, вам следует установить и настроить клиентское приложение NFS. И снова, для получения более подробной информации о том, как конфигурируется NFS, обращайтесь в главу 33. Настройка консоли Долее вам будет предложено настроить параметры консоли FreeBSD. С помощью этих раметров вы можете настроить поведение клавиатуры, выбрать экранный и рифт и указать, какую экранную заставку вы хотите использовать. Если в диало- го ом окне с вопросом о том, хотите ли вы настроить параметры консоли, вы вы- Г рите вариант Yes (Да), далее на экране появится меню, подобное тому, которое г жазано на рис. 2.8. r&^&kyffe- \Fi*9*?s%+wc&\s} -}ЩЩх} МЁШИШМ Рис. 2.8. Настройка параметров консоли
Установка FreeBSD Большинство из опций в этом меню не нуждается в явной настройке; для них по умолчанию устанавливаются значения, которые подходят для большинства современных аппаратных средств. Однако вы можете поэкспериментировать с такими параметрами, как Font (Шрифт) и Saver (Экранная заставка), чтобы изменить внешний вид консоли и заставку, которая должна отображаться при отключении экрана, или Repeat (Скорость повтора), чтобы отрегулировать скорость ввода повторных символов при удержании клавиши. Остальные опции, такие как Key map (Карта клавиатуры) и Screen map (Карта экрана), на первый взгляд кажутся менее понятными. Опция Key map (Карта клавиатуры) позволяет изменять раскладку клавиатуры с U.S. English (Английский (США)), которая используется по умолчанию, на другую раскладку, что вам нужно будет сделать, если вы используете клавиатуру с другим набором клавиш. Подобным образом, опция Screen map (Карта экрана) позволяет изменять язык ввода на язык, соответствующий стране, в которой вы проживаете, если язык ввода, используемый по умолчанию, вам не подходит; если вы работаете на более старом оборудовании, которое не допускает смены встроенного шрифта, она позволит вам выбрать способ, которым встречающийся текст должен преобразовываться в текст, который данное оборудование сможет отобразить. И, наконец, опция Ttys (Типы терминалов) позволяет изменять режим эмуляции консольного терминала с применяемого по умолчанию режима терминала VGA (cons25) на другой режим, поведение которого будет соответствовать языку ввода, выбранному в разделе Screenmap (Карта экрана). Выбор часового пояса Далее Sysinstall запросит, не хотите ли вы выбрать часовой пояс для системы. Выберите вариант Yes (Да): появится следующий экран с вопросом о том, настроены ли системные часы на UTC (Coordinated Universal Time — универсальное глобальное время, также называемое средним временем по Гринвичу и зулусским временем). Скорее всего, это не так, поэтому если вы не уверены в том, что системные часы настроены на UTC, выберите вариант No (Нет). После этого появится еще одно меню, в котором вам нужно будет указать регион и страну, а также некоторые другие сведения о том, где вы проживаете. После того, как вы предоставите Sysinstall всю эту информацию, Sysinstall отобразит состоящую из трех букв аббревиатуру, которая соответствует вашему часовому поясу, и спросит, отвечает ли эта аббревиатура действительности. Если она правильная, выберите вариант Yes (Да), в противном случае выберите вариант No (Нет). Вы всегда сможете вернуться и повторить эту процедуру. Совместимость с Linux Следующий вопрос будет о том, хотите ли вы разрешить совместимость с Linux на уровне двоичных кодов. Если вы выберете вариант Yes (Да), Sysinstall установит в вашем разделе /usr так называемую "мини-версию" файловой системы Linux, которая включает совместно используемые библиотеки Linux и другие программы, необходимые для того, чтобы Linux-программы могли запускаться под управлением FreeBSD. Если вы точно знаете, что не будете использовать никаких программ Linux, выберите вариант No (Нет). Но если вы не уверены, лучше выберите вариант Yes (Да). Эта опция может оказаться очень полезной. (На самом деле, большую часть этой книги я написал, пользуясь такой программой Linux, как StarOffice, которую запускал в своей системе FreeBSD как раз через режим совместимости с Linux.)
Введение в FreeBSD Часть I НА ЗАМЕТКУ —— Вы сначала можете подумать, что не хотите устанавливать в своей системе FreeBSD модуль, обеспечивающий совместимость с Linux на уровне двоичных кодов. Если вам доводилось работать с эмуляторами в других операционных системах, вы знаете, как медленно они могут работать. Однако в случае FreeBSD дело обстоит совсем иначе. Поддержка Linux в FreeBSD обеспечивается не через эмулятор, а, скорее, реализуется на уровне ядра. Поддержка Linux в FreeBSD настолько хороша, что большая часть приложений Linux работают в ней так же быстро, как в самой Linux. На самом деле, некоторые приложения работают в FreeBSD даже быстрее, чем в Linux! Настройка мыши В FreeBSD мышью можно пользоваться как в текстовом режиме консоли, так и в графическом интерфейсе X Window System. Драйвер мыши для текстового режима (консоли) дает пользователю возможность копировать и вставлять текст в командной строке или в консольных программах, используя, по возможности, все три кнопки мыши. Если система будет функционировать исключительно в качестве автономного сервера без системы управления окнами и необходимости в консольном указателе мыши, вы можете и не активизировать драйвер мыши. Однако если вы планируете пользоваться FreeBSD как настольной операционной системой, вы точно захотите, чтобы мышь работала, а для этого вам придется настроить и активизировать драйвер мыши. Сначала FreeBSD спросит, подключена ли к системе не USB-мышь. К не USB- мышам относятся мыши PS/2 (которые являются стандартными и применяются в большинстве персональных компьютеров: такая мышь подключается через круглый разъем, который находится рядом с разъемом для клавиатуры) и мыши, которые подключаются через последовательный порт, такой как СОМ1 или COM2. Если вы используете PS/2-мышь или мышь, подключаемую через последовательный порт, выберите вариант Yes (Да), а если ваша мышь подключается через USB-порт, выберите вариант No (Нет) (рис. 2.9). Рис. 2.9. Настройка мыши
Установка FreeBSD На следующем экране будет отображаться несколько ссылок для настройки мыши. Если вы не планируете пользоваться мышью ни в интерфейсе X, ни в текстовом режиме консоли, выберите здесь опцию Disable (Отключить) и не читайте дальше этот раздел. В противном случае выберите опцию Туре (Тип), чтобы указать тип мыши. На следующем экране будет отображаться несколько опций для специализированных мышей и мышей старого образца, но опция, выбираемая по умолчанию (Auto (Авто)), подходит практически для всех доступных сегодня мышей типа PS/2, а также и для USB-мышей. Далее выберите опцию Port (Порт). Если применяется мышь, подключаемая через порт PS/2, выберите опцию Auto (Авто) (которая предлагается по умолчанию). В противном случае выберите порт, соответствующий тому, через который подключается имеющаяся у вас мышь. Интерфейс X Window System предполагает использование всех трех кнопок стандартной мыши. Если ваша мышь имеет только две кнопки, вам придется эмулировать трехкнопочную мышь, указав драйверу мыши интерпретировать одновременное нажатие двух кнопок мыши (которое называется аккордом) как нажатие третьей виртуальной кнопки. Чтобы сделать это, выберите в этом меню опцию Flags (Флаги) и в появившемся после этого диалоговом окне введите -3. Вы также можете здесь ввести -г high, если хотите увеличить скорость движения указателя мыши, или -г low, если указатель двигается слишком быстро, и вы хотите замедлить скорость его движения. Если вам нужны обе эти опции, вы можете ввести их, например, так: -3 -г high. Когда завершите конфигурировать параметры настройки мыши, выберите опцию Enable (Применить), чтобы протестировать и запустить демон мыши. Если мышь была настроена правильно, после этого вы сможете подвигать курсор мыши по экрану. Когда закончите тестировать мышь, выберите вариант Yes (Да), если мышь работала (обратите внимание на то, что в этом меню мышь по-прежнему не будет работать; вам все равно придется пользоваться клавишей <ТаЬ> и клавишами с изображением стрелки вверх и стрелки вниз), или вариант No (Нет), если она не работала. После этого вы вернетесь в меню настройки мыши. Если мышь работала, выберите опцию Exit (Выход). Установка дополнительных пакетов программного обеспечения В диалоговом окне с вопросом о том, хотите ли вы просмотреть коллекцию пакетов программ FreeBSD, выберите вариант Yes (Да). После этого появится меню, откуда вы сможете установить некоторые дополнительные программы. Эти программы пригодятся вам при прочтении нескольких следующих глав. Можете изучать эту коллекцию сколько угодно, чтобы узнать, какие вообще программы доступны. Но пока что я не рекомендую вам устанавливать десятки программ: на данном этапе задача номер один — сделать так, чтобы система, загрузилась, а дополнительные программы можно будет добавить и позже. Поэтому сейчас я советую установить только те пакеты программ, которые вам понадобятся для изучения материала следующих глав. Когда появится меню Choosing Installation Media (Выбор источника установки) с вопросом о том, откуда вы хотите установить пакеты программ, выберите опцию CD/DVD, если вы устанавливаете FreeBSD с прилагаемого к этой книге DVD-диска. В противном случае выберите опцию FTP, чтобы загрузить пакеты с FTP-сервера.
Введение в FreeBSD На рис. 2.10 показано главное меню системы установки пакетов ПО. Рис. 2.10. Установка дополнительных пакетов Навигация по меню системы установки пакетов осуществляется следующим образом: чтобы перемещаться по пакетам и категориям, используйте клавиши с изображениями стрелок, чтобы выбрать (выделить) пакет, используйте клавишу <Enter>, a чтобы отменить выделение — клавишу пробела. Выбрав пакеты в категории, используйте клавишу <ТаЬ>, чтобы выделить опцию О К, и нажмите клавишу <Enter>, чтобы вернуться в главное меню выбора пакетов (где вы сможете выбрать следующую категорию для просмотра). Рядом с пакетами, которые уже были установлены, будет отображаться символ X; отмена выбора таких пакетов приведет к их удалению из системы. Пакеты, рядом с которыми будет отображаться символ D, являются зависимыми (dependency), что означает, что ойи просто необходимы для нормальной работы каких-то других установленных на текущий момент пакетов. В нижней части экрана будет отображаться краткое описание выделенного в текущий момент пакета. НА ЗАМЕТКУ К тому времени, когда эта книга появится на полках книжных магазинов, номера версий некоторых из перечисляемых в данном меню программ могут поменяться. В таком случае выбирать следует вариант, наиболее близкий к тому, что указывается здесь. Например, здесь указывается версия bash-3.0. 1б_1. Если вместо этой версии в вашем меню присутствует версия bash-3.0.17, выберите ее. Я предлагаю вам выбрать пакет bash-3.0. 1б_1, который находится в категории Shells (Программные оболочки). Это очень мощная и удобная программная оболочка для интерфейса командной строки FreeBSD. Пользователям Linux эта оболочка будет знакома, потому что именно она используется по умолчанию в практически в ех дистрибутивах Linux. Специалисты по UNIX также могут установить еще какую- нибудь программную оболочку из этого списка, которая им может понадобиться. Просмотрите столько категорий, сколько хотите, и выберите все пакеты, какие з хотите. Когда завершите выбирать пакеты, вернитесь в главное меню выбора и при помощи клавиши <ТаЬ> выделите опцию Install (Установить); далее нажмите клавишу <Enter>, чтобы установить выбранные пакеты из указанного источника.
Установка FreeBSD I ~ I Глава 2 I I Добавление пользователя Когда процесс установки пакетов завершится, FreeBSp спросит, не хотите ли добавить в систему какие-нибудь учетные записи пользователей. Выберите вариант Yes (Да), чтобы создать обычную учетную запись для себя. Использовать для повседневных задач учетную запись пользователя root опасно, потому что у этой учетной записи нет никаких ограничений, и она может повредить или даже уничтожить важные системные файлы, если вы допустите какую-нибудь ошибку. Использование обычной учетной записи пользователя исключает такую вероятность. На экране User and Group Management (Управление пользователями и группами), который показан на рис. 2.11, выберите опцию User (Пользователь), чтобы добавить в систему нового пользователя. Рис. 2.11. Добавление в систему пользователей и групп После этого на экране появится форма Add a New User (Добавление нового пользователя), которую вы должны заполнить для того, чтобы добавить нового пользователя (рис. 2.12). Рис. 2.12. Форма Add a New User He все поля в этой форме должны быть обязательно заполнены. На самом деле, некоторые из них даже следует оставить пустыми для того, чтобы система смогла самостоятельно выбрать значение, которое будет использоваться по умолчанию. Для
Введение в FreeBSD перехода из одного поля в другое используйте клавишу <ТаЬ>. В следующих разделах приводится описание каждого из этих полей и рекомендации по поводу того, какие значения в них лучше вводить. Поле Login ID Имя пользователя (Login ID) — это имя, которое вы указываете при входе в систему для того, чтобы система могла идентифицировать вас. В поле Login ID (Имя пользователя) по причинам, связанным с совместимостью, разрешается вводить не более восьми символов, хотя в принципе FreeBSD поддерживает имена пользователей длиной до 16 символов. Обычно для имен пользователей применяются инициалы, прозвища (nickname) или комбинации, состоящие из инициалов или букв имени и фамилии. Например, лично я мог бы выбрать имя пользователя вроде brian, briant или btiemann. У каждого добавляемого в систему пользователя должно быть свое, уникальное, имя. Имена пользователей являются чувствительными к регистру и, согласно принятым соглашениям, допускают использование только букв в нижнем регистре. Применять пробелы и специальные символы (кроме дефиса и символа подчеркивания) в именах пользователей не разрешается. Поле UID UID (Идентификатор пользователя) — это числовой идентификатор, который система использует для отслеживания пользователей. Это поле лучше оставить пустым и позволить системе самой выбрать правильное значение. Поле Group В поле Group (Группа) указывается главная группа, членом которой будет добавляемый на данный момент пользователь. Опять-таки, это поле тоже лу пне не трогать и позволить системе выбрать подходящую группу самостоя гельно. Поле Password В поле Password (Пароль) вводится пароль, который будет использоваться для входа в систему. Пароли являются чувствительными к регистру. Ниже представлены некоторые рекомендации по поводу того, как сделать пароль таким, чтобы взломщики (часто называемые хакерами, хотя это не совсем подходящее название для людей, которые без разрешения проникают в чужие компьютерные системы) не могли разгадать их: • Используйте для пароля не менее восьми символов. Короткие пароли легче вычисляются программами, которые были специально разработаны для взлома паролей путем перебора различных буквенных и цифровых комбинаций. • Используйте в паролях одновременно буквы как верхнего, так и нижнего регистра, цифры, а также хотя бы один специальный символ вроде $ или !. • Не пользуйтесь словами из словаря. Существуют специальные программы для взлома паролей, которые перебирают слова из словаря до тех пор, пока не найдут то, которое подойдет. • Не используйте то, что другие люди знают или могут узнать о вас. Другими словами, имя вашего ребенка, кличка кота или название города, в котором вы родились, для пароля подходят мало.
Установка FreeBSD Глава 2 В то же время, неплохо было бы подобрать что-нибудь такое, что легко запоминается. Неплохой способ — объединить вместе части различных слов (не забыв при этом, конечно, использовать буквы как в верхнем, так и в нижнем регистре, несколько цифр и хотя бы один специальный символ). Вы также можете воспользоваться технологией, которую я называю клавиатурной подстановкой: берете слово, которое для вас что-то означает (но другие об этом не знают), и затем заменяете символы в этом слове на символы, которые находятся от них на клавиатуре справа вверху, слева вверху, слева внизу и так далее. Например, слово "Alice" в этом случае может превратиться в слово "QpidSS*. Придумав пароль, внимательно введите его (потому что никакого приглашения подтвердить введенный пароль не последует). Вместо символов на месте пароля будут отображаться звездочки (*). Если вы допустите ошибку при вводе пароля, вы потом не сможете войти в систему (если же с вами все же такое случится, информацию о том, что делать, вы сможете найти в приложении В). Выбрав пароль, нигде не записывайте его: ни на внутренней части столешницы, ни в своем ежедневнике, ни на руке в виде татуировки, ни, тем более, на бумажке, прикрепленной к монитору! (Я знаю, что эти вещи кажутся очевидными, но вы бы удивились, если б узнали, сколько пользователей поступает именно таким образом.) Также никому не говорите, какой у вас пароль, даже сотрудникам, жене (мужу) и своим детям. Поле Full Name В поле Full Name (Полное имя) вы можете ввести свое полное имя либо оставить его пустым (если вы хотите оставить его пустым, удалите из него символы User &). Имейте в виду, что некоторые программы, такие как почтовые программы UNIX, будут использовать это поле для того, чтобы узнать, какое значение им водить в поле From (От) отправляемого электронного сообщения. Поэтому, пожалуй, лучше будет, если вы все-таки введете здесь свое имя. Поле Member Groups Я предлагаю вам ввести в поле Member Groups (Член групп) значение wheel, чтобы стать членом группы "wheel" ("привилегированный пользователь" или "туз"), которая позволит вам становиться пользователем root (то есть суперпользователем или администратором системы), не выходя из системы и не подключаясь к ней заново под другим именем пользователя (хотя пароль пользователя root вам предъявлять все равно придется). ВНИМАНИЕ! Очень важно, чтобы вы создали на этом этапе хотя бы одну учетную запись пользователя в группе wheel: это позволит вам, используя эту учетную запись, подключаться к компьютеру с FreeBSD удаленно, и, становясь пользователем root (с помощью команды su), выполнять операции по администрированию системы. В качестве пользователя root подключиться к этому компьютеру через SSH напрямую не получится (для этого потребуется выполнить некоторые дополнительные операции, которые описываются в главе 13); поэтому, не имея не принадлежащего группе root пользователя, которому можно подключаться удаленно и получать привилегии пользователя root, вы будете буквально как без рук, как только покинете место, где находится главная— машина с FreeBSD.
I ~ I Введение в FreeBSD I 1 Часть I Поле Home Directory В поле Home Directory (Домашний каталог) указывается место, где на жестком диске будет находиться домашний каталог создаваемого пользователя. Лучше оставьте это поле пустым и позвольте системе самостоятельно выбрать подходящий вариант. Поле Login Shell Рабочая оболочка — это используемая по умолчанию программная оболочка, в которую будут попадать пользователи после входа в систему. Если вы раньше последовали моему совету и установили программную оболочку bash, введите в поле Login Shell (Рабочая оболочка) /usr/local/bin/bash (вместе с символами косой черты). Если вы позже решите, что программная оболочка bash вам не нравится, вы запросто сможете заменить ее на другую (о том, как именно это делается, более подробно будет рассказываться в главе 8). НА ЗАМЕТКУ Обратите внимание на то, что поставляемая с FreeBSD встроенная программная оболочка /csh (которая используется по умолчанию и доступна в каталоге /bin/csh) предоставляет такие же возможности, как и программная оболочка tcsh (которая тоже доступна и находится в каталоге /bin/tcsh). Завершив вводить информацию в этих полях, при помощи клавиши <ТаЬ> наведите фокус на кнопку О К и нажмите клавишу <Enter>. Для вас будет создана учетная запись, после чего на экране снова появится меню, которое было показано ранее на рис. 2 Л 2. Выберите опцию Exit (Выход). Установка пароля для пользователя root Когда увидите сообщение об установке пароля администратора системы, нажмите клавишу <Enter>. После этого в нижней части экрана появится подсказка, приглашающая ввести пароль для пользователя root. Она будет выглядеть примерно так: Changing local password for root. New password: Изменение локального пароля для root. Новый пароль: Все приводившиеся ранее в этой главе рекомендации по выбору и защите пароля обычного пользователя здесь имеют в два раза большее значение. Любой, кто знает пароль пользователя root (или может узнать его), сможет получать доступ к любым данным в вашей системе, а также выполнять в вашей системе любые операции. Он сможет считывать конфиденциальную информацию, отправлять ее по электронной почте другим пользователям, изменять или удалять данные из вашей системы и делать любые другие пакости, какие только придут ему в голову. Придумав пароль для пользователя root, введите его в командной строке. Обратите внимание на то, что этот пароль не будет отображаться на экране по мере ввода составляющих его символов. Благодаря этому никто не сможет подсмотреть этот пароль, пока вы его вводите, или прочитать его, и даже увидеть, из скольких символов он состоит (что также является важной информацией для взломщиков паролей).
Установка FreeBSD 1 ~ I Глава 2 I I После того, как введете пароль» нажмите клавишу <Enter>. Последует приглашение подтвердить пароль. Введите пароль снова и нажмите клавишу <Enter>. Если вы дважды введете одинаковые пароли, далее программа установки запросит, не хотите ли вы посетить общее меню настройки, чтобы внести еще какие-нибудь последние изменения. Выберите вариант No (Нет): после этого на экране снова появится глав ное меню. , Выход из программы Sysinstall и перезагрузка системы В главном меню с помощью клавиши табуляции перейдите к опции Exit Install (Выйти из программы установки) и нажмите клавишу <Enter>. Система отобразит приглашение подтвердить намерение выйти из программы установки. Далее она поспросит извлечь все CD-диски, DVD-диски или дискеты из всех дисководов. Сделайте это и выберите вариант Yes (Да). Начнется процесс перезагрузки системы. НА ЗАМЕТКУ Может случиться так, что после нажатия кнопки извлечения на DVD-приводе ничего не произойдет. Не волнуйтесь, FreeBSD не испортила ваш дисковод; она просто заблокировала его, чтобы исключить вероятность случайного извлечения DVD- или CD-диска на середине процесса установки. Если дисковод не открывается, все равно выберите вариант Yes (Да) и подождите, пока начнется перезагрузка системы (вычисление доступного объема памяти и тому подобное) Затем снова нажмите кнопку извлечения. Теперь дисковод должен открыться, и вы сможете и влечь DVD-диск с дистрибутивом FreeBSD. СОВЕТ Во время перезапуска системы вы можете захотеть сразу же зайти в программу настройки BIOS и сконфигурировать систему так, чтобы она больше не пыталась загружаться с DVD-привода Некоторые системы могут зависать на долгое время, пытаясь загрузиться с CD- или DVD-дис если в дисководе нет загрузочного (или вообще никакого) диска. Хотя многие системь в концов, все-таки оставляют бессмысленные попытки и начинают загружаться с жесткого ска иногда проходит целая минута, а то и больше, прежде чем система решает, что она не мож загрузиться с CD- или DVD-диска, и переходит к жесткому диску. Чтобы избежать такой проб - мы, отключите опцию, отвечающую за загрузку с CD/DVD-дисков, в настройках BIOS. (Более под робную информацию о том, как следует изменять настройки BIOS, можно найти в документации прилагаемой к оборудованию.) Первая загрузка FreeBSD При перезапуске системы должно произойти следующее: либо появится меню а грузки с приглашением выбрать операционную систему, которую следует загрузить либо, если FreeBSD является единственной операционной системой на этом диске сразу же начнется загрузка FreeBSD. Если ни то, ни другое не произошло и система либо зависла, либо начала загружать дру1ую опера *ис нную систему, так и не пред жив загрузить FreeBSD, обратитесь к при южению В.
Введение в FreeBSD Часть I Полноэкранное текстовое меню загрузки FreeBSD, предлагающее несколько опций для загрузки FreeBSD в разных режимах и содержащее графический символ ("чертенка") или логотип FreeBSD, представляет собой первый интерактивный этап процесса загрузки. Вы уже встречались с этим меню, когда устанавливали FreeBSD; как и тогда, нажмите клавишу <Enter>, чтобы выбрать опцию Boot FreeBSD (Загрузить FreeBSD), которая предлагается по умолчанию. По мере того, как ядро будет находить и инициализировать установленное в системе оборудование, на экране будут появляться различные непонятные сообщения. Сообщения, генерируемые ядром, будут отображаться в ярко-белом цвете. Когда загрузка ядра завершится, запустится программа init, отвечающая за запуск других процессов и программ в системе. Сообщения, генерируемые этой программой, будут отображаться в светло-сером цвете. Далее система впервые приостановит процесс загрузки и попросит вас ввести что- нибудь с клавиатуры. Выполнение этой странной просьбы необходимо для нормальной работы "энтропийного* генератора системы, представляющего интерес, прежде всего, для тех пользователей, для которых безопасность данных стоит на первом месте. Подача случайных данных энтропийной подситсеме означает, что генератор случайных чисел, являющийся частью FreeBSD, может генерировать по-настоящему случайные числа, которые невозможно взломать или предугадать. Этот генератор случайных чисел используется во многих системах безопасности в FreeBSD, в том числе и для пути данных в самом процессе запуска. Таким образом, когда система приостановит процесс загрузки, вы можете сделать следующее: либо набрать с клавиатуры случайный текст (и затем нажать клавишу <Enter>), если хотите получить систему с хорошей энтропией и высокой степенью безопасности, либо просто сразу нажать клавишу <Enter> и тем самым согласиться на энтропию обычного уровня (третий вариант — просто подождать пять минут; этот вариант равносилен выбору второго варианта). Если вы торопитесь или безопасность данных не сильно волнует вас, просто нажмите клавишу <Enter> для продолжения. Далее FreeBSD начнет генерировать для вашей системы ключи шифрования RSA и DSA (которые используются для безопасной связи в сетях и с Internet); этот процесс занимает несколько секунд, но он тоже является разовым событием. В конечном счете, когда init завершит свою работу, на экране появится следующее сообщение: FreeBSD/i386 (simba.example.com) (ttyvO) login: FreeBSD/i386 (simba.example.com) (ttyvO) пользователь: Конечно же, на вашем мониторе вместо (simba.example. com) будет отображаться имя вашего хоста и вашей сети. Если вы не настраивали сеть, отображаться будет используемое системой по умолчанию имя хоста, которое, скорее всего, будет выглядеть как amnesiac. Войдите в систему, используя имя root. Нажав клавишу <Enter>, введите пароль, который вы установили для пользователя root (опять-таки, отображаться на экране по мере ввода этот пароль не будет). Если вы правильно ввели имя пользователя и пароль, на экране появится приветственное сообщение с краткой информацией о FreeBSD и том, куда следует обращаться за помощью (а также том, как поменять это сообщение или вообще избавится от него). После этого вы окажетесь в командной строке оболочки, которая будет выглядеть примерно так: 92
Установка FreeBSD Copyright (с) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 6.0-RELEASE #0: Thu Nov 3 09:36:13 UTC 2005 # Здесь # — это приглашение на ввод команды и означает, что программная оболочка ожидает ваших распоряжений. К счастью для программной оболочки, есть еще одна задача, которая должна быть выполнена: настройка системы X Window System. Настройка системы X Window System (X11) X Window System, также называемая XI1 (или просто X) — это универсальная система управления окнами для UNIX и Linux. X была разработана в начале 80-х годов прошлого века в исследовательских центрах Массачусетского технологического института. В 1987 году вышла ее одиннадцатая, существенно исправленная версия, после чего она начала распространяться как проект с открытым кодом. Далее ее разработкой занялась такая организация, как X Consortium, которая выпустила еще несколько версий этой системы. Однако в 90-е годы процесс разработки XI1 на некоторое время приостановился, хотя ни довольно сложная клиент-серверная архитектура XII, ни нехватка в ней современных функциональных возможностей не мешали компьютерщикам продолжать экспериментировать с FreeBSD и Linux (и даже еще больше стимулировали их). Но, начиная с 2004 года, новая организация под названием X.org Foundation (основанная корпорацией X Consortium и финансируемая несколькими состоятельными компаниями, такими как IBM, Sun и Hewlett-Packard), опять с новыми силами взялась за модернизацию XII. О повседневных задачах, которые позволяет выполнять XII, более подробно будет рассказываться в главе 5. На данном этапе пока что нужно установить XII на вашем компьютере так, чтобы вы могли запускать графические приложения. Эту задачу никак нельзя назвать легкой. Но поверьте, что раньше ее было выполнять гораздо труднее. Если вы не устанавливали X Window System во время описанного в этой главе процесса или если вы вообще не хотите пользоваться XII, вы можете пропустить этот раздел. Если вы передумаете, то всегда сможете установить XI1 позже, установив пакет хогд или создав в коллекции портов порт /usr/ports/xll/xorg. Более подробную информацию о том, как это делается, можно найти в главе 16. Автоматическое распознавание установленного видеооборудования В основе XI1 лежит так называемый сервер X Server. Это демон, который "предоставляет" окна клиентской программе, которая затем выводит эти окна на экране. Если вы до этого имели дело только с операционными системами Windows, такой подход может показаться вам запутанным. Просто знайте, что XII изначально разрабатывалась для систем кластерного типа, в которых много компьютеров относительно низкой мощности, установленных в лабораториях или общежитиях университетского городка, запускали упрощенные программы управления окнами для запроса окон приложений с центрального сервера (мэйнфрейма). Все вычислительные возможности и все приложения хранились централизованно (то есть находились на
I ~ I Введение в FreeBSD I I Maim.I центральном сервере); в таком контексте был смысл в том, чтобы система управления окнами выполняла свои сложные задачи там, где доступны все вычислительные возможности, потому что это позволяло клиентским компьютерам оставаться маломощными и недорогими. Сегодня мощные настольные компьютеры стоят дешево и доступны в изобилии, а кластерные системы считаются уже просто устаревшими; поэтому сейчас сервер X Server и клиент системы управления окнами (который также называют рабочим столом или диспетчером окон) запускаются на одном и том же компьютере. Это значительно упрощает многие процедуры, касающиеся установки и управления графической средой пользователя в системе UNIX, такой как FreeBSD, однако, не исключает необходимость в выполнении отдельной процедуры для настройки X Server перед настройкой клиентской части. НА ЗАМЕТКУ Дважды убедитесь в наличии информации о таких характеристиках монитора, как частота горизонтальной и вертикальной синхронизации, а также о производителе и модели видеокарты и объеме установленного ОЗУ. Х11 делает все возможное, чтобы определить эту информацию автоматически, но все же существует вероятность того, что вам все-таки придется вводить ее самим на одном из этапов этой процедуры, даже если Х11 вначале удастся определить ее автоматически. Первым делом необходимо запустить утилиту, выполняющую автоматический поиск установленного видеооборудования. Для этого вы должны войти в систему через учетную запись пользователя root (если вы вошли в систему через учетную запись другого пользователя, введите logout и затем снова войдите в систему, но уже как пользователь root). После этого введите: # Xorg -configure Эта программа тестирует видеокарту, определяя набор установленных в ней микросхем и ее возможности, и затем создает файл с базовыми данными о конфигурации системы для X Server. Этот файл, который, кстати, сохраняется в каталоге /root, называется xorg.conf .new. Откройте его, чтобы посмотреть, что в нем есть. Для этого вам нужно воспользоваться следующей командой: # less xorg.conf.new Для перехода со строки на строку используйте клавиши с изображением стрелки вниз и стрелки вверх, а для перехода на предыдущую или следующую страницу — клавишу пробела или клавишу <W>. Далее, отыщите в этом файле раздел под названием Section "Device". В этом разделе будет содержаться информация о вашей видеокарте: Section "Device" ### Available Driver options are:- ### Values: <i>: integer, <f>: float, <bool>: "True"/"False", jfr## <string>: "String", <freq>: "<f> Hz/kHz/MHz" ### [arg]; arg optional #Option "SWcursor" # [<bool>] #Option "HWcursor" # [<bool>] #Option "NoAccel" # [<bool>] #Option "ShowCache" # [<bool>] #Option "ShadowFB" # [<bool>] #Option "UseFBDev" # [<bool>]
Установка FreeBSD Глава 2 95 #Option "Rotate" # [<str>] Identifier "CardO" Driver "nv" VendorName "NVidia / SGS Thomson (Joint Venture)" BoardName "Rival2 8" BusID "PCI:1:0:0" EndSection Обеспечьте, чтобы эта информация соответствовала тому, что вы сами знаете о своей видеокарте, и обратите внимание на значения в полях Driver, Vendor Nam и BoardName. Эти значения вам пригодятся позже, когда вы будете конфигурировать X Server. ^ НА ЗАМЕТКУ Если вы работаете с уже установленной версией FreeBSD 5.2.1 или ниже, вам следует зна ь что с этой версией FreeBSD поставляется не Xorg, а более старая версия Х11, которая назь в т я XFree86. Настройка XFree86 выполняется во многом точно так же, как и Xorg; отличаются только несколько команд. Например, чтобы запустить сценарий автоматического поиска оборудо и вам следует ввести следующую команду: # XFree86 -configure Файл, создаваемый этой программой, называется не xorg.с nf .new, a XF86C ig. e . Тестирование X Server Далее вам необходимо проверить, как работает эта определенная автом иче ки конфигурация. Чтобы сделать это, введите следующую команду: # Xorg -config xorg. conf. new X Server запустится, используя файл с минимальными данными о конф и который был создан только что. Поскольку в этом файле нет информации ни о е- жимах высокого разрешения экрана, ни о возможностях монитора, в лучш м л) i e вы увидите узор в виде черно-серой решетки (похожий на мешковину) и к р о форме креста посередине экрана, как показано на рис. 2.13. Если вы видите экране именно это, считайте, что вам повезло: XI1 будет работать с вашей ео р той, по крайней мере, в своем самом простом режиме отображения. Теперь попробуйте подвигать мышь. Если курсор перемещается, считайте, что вам дважды повезло: у вас еще и драйвер мыши работает. Если нет, пров рь е, к- тивизировали ли вы драйвер мыши во время первоначальной процедуры установ ш если вы этого не сделали, сделайте это сейчас. Для этого введите sysinstall чтобь снова войти в программу Sysinstall. Затем выберите опцию Configure (Наст ойка), а после нее — опцию Mouse (Мышь). Далее следуйте инстр)кциям пр i о мяв разделе "Настройка мыши" ранее в этой главе. Никакие элементы управления в этом тестовом режиме XII отображатьс не будут чтобы завершить тестирование, нажмите клавиатурную комбинацию Ctrl+Al +Back>. После этого на экране снова появится командная строка.
] Введение в FreeBSD J Насть I Рис. 2.13. Тестовый жран, показывающий, что ваша конфигурация Xorg работает ВНИМАНИЕ! Навсегда запомните клавиатурную комбинацию <Ctrl+Alt+Back>: с ее помощью вы всегда сможете выйти из Х11, если что-нибудь пойдет не так. Если изображение на экране отображается неправильно (например, если вместо четкой решетки и курсора вы видите множество волнистых линий), сразу же нажмите комбинацию <Ctrl+Alt+Back>, чтобы закрыть Х11. Если вы позволите Х11 слишком долго работать в режиме представления видеоизображений, который ваш монитор не поддерживает, вы можете серьезно повредить монитор. Настройка Xorg с помощью xorgcf g Следующий шаг — указать XII, как ей следует обращаться с дисплеем. На этом этапе вам придется практически погрузиться в исследования; хотя процедура настройки XI1 прошла долгий путь (то есть претерпела много изменений) за последние годы, процесс определения возможностей монитора по-прежнему выполняется путем проб и ошибок. Ваш монитор имеет несколько разрешений (числа пикселей); их количество зависит от частот вертикального и горизонтального обновления (синхронизации) изображений, которые он поддерживает. Информацию об этих частотах можно найти в документации, которая прилагалась к монитору, когда вы его покупали. Если такой информации там нет, попробуйте поискать ее в Internet. Для этого в соответствующем поле любой поисковой службы, такой как, например, Google, введите имя производителя и модель вашего монитора, а также, если необходимо, ключевые слова вроде "частота обновления" или "вертикальная синхронизация". Монитор с определенным диапазоном частот вертикальной и горизонтальной синхронизации может поддерживать только определенные разрешения; если частота синхронизации является слишком низкой для выбранного разрешения, изображение на мониторе может быть слишком мерцающим, а возможно монитор даже вообще не сможет использовать это разрешение.
Установка FreeBSD I ~ I Глава 2 I I Теперь, когда вы знаете имя драйвера, который необходим для вашей видеокарты, вы можете использовать его для более точной настройки файла конфигурации XII, который вы создали ранее. Чтобы сделать это, вы можете воспользоваться специальной утилитой, которая называется xorgcf g и поддерживает два режима: графический и текстовый. Запустить эту программу в графическом режиме под XII может показаться заманчивым, но пока лучше все же использовать текстовый режим, просто на всякий случай — в текстовом режиме эта утилита работает гораздо лучше. Итак, введите следующую команду: # xorgcfg -textmode НА ЗАМЕТКУ Если вы работаете с более старой версией FreeBSD, которая поставляется с XFree86, используйте следующую команду: # x?86c?g -textmode После того, как загрузятся все модули драйверов, появится полноэкранная текстовая утилита, похожая на Sysinstall. Прочитав информацию на вводном экране, выберите О К: появится экран Main Menu (Главное меню) с несколькими опциями, как показано на рис. 2.14. Рис. 2.14. Экран Main Menu в программе xorgcfg Вам нужно пройти все опции на этом экране. В каждом разделе вы будете настраивать профиль для мыши, клавиатуры, дисплея и так далее и присваивать каждому устройству имя (например, Mouse0, KeyboardO и тому подобное). Сначала выберите опцию Configure Mouse (Настроить мышь) и укажите идентификатор, например, как предлагалось, MouseO. Параметр Auto (Авто), предлагаемый для порта по умолчанию, подходит для стандартной мыши PS/2. Если у вас другая мышь, укажите порт, который подходит для нее. Если необходимо, включите режим эмуляции третьей кнопки и затем укажите драйвер для мыши (обычно подходит драйвер /dev/sysmouse). Далее выберите опцию Configure Keyboard (Настроить клавиатуру), чтобы настроить таким же образом клавиатуру. Выберите соответствующую вашему региону раскладку клавиатуры (например: U.S. English (Английский (США)).
I ГГ I Введение в FreeBSD ____ I _ I Часть I Далее следует настроить монитор. Чтобы сделать это, выберите опцию Configure Monitor (Настроить монитор). На экране, который появится после этого, прокручивайте список частот горизонтальной синхронизации до тех пор, пока не найдете частоту, соответствующую возможностям вашего монитора, согласно значениям, указанным в прилагаемой к нему документации или спецификациях, которые вам удалось найти в Internet. Если вы пользовались этим монитором, когда работали под управлением Windows, это может помочь вам определить его возможности: например, если вы знаете, что вам удавалось работать в режиме 1280x1024, вы можете выбрать такое значение, как 31.5 - 79.0; Monitor That Can Do 1280x1024 @ 74 Hz. Главное, чтобы вы не выбрали слишком высокую частоту: если XII попытается перевести монитор в режим, частота синхронизации которого больше, чем может поддерживать этот монитор, монитор может даже взорваться. Лучше сначала выберите самую низкую частоту для разрешения, которое монитор точно поддерживает; вы всегда сможете выбрать более высокое значение позже. Лучше быть осторожным, чем потом жалеть о содеянном! Далее точно так же выберите частоту вертикальной синхронизации, соответствующую возможностям вашего монитора. Если возможно, постарайтесь выбрать диапазон меньше того, который может поддерживать ваш монитор; если вы знаете, что вам монитор поддерживает 45-120 Гц, выберите диапазон 50-100 или введите значение частоты синхронизации вручную, чтобы оно в точности соответствовало тому, которое указано в документации на монитор. Теперь необходимо выбрать на экране Main Menu (Главное меню) опцию Configure Card (Настроить карту), чтобы указать драйвер для своей видеокарты. Вот где вам пригодится знание характеристик вашей видеокарты; поскольку xorgcfg не считывает эту информацию автоматически из файла, вам придется вводить параметры видеокарты вручную. Войдите в базу данных карты, когда появится соответствующее приглашение, и прокручивайте список до тех пор, пока не увидите запись с соответствующим вашей видеокарте именем производителя и названием модели. НА ЗАМЕТКУ С поддержкой для современных видеокарт в FreeBSD дело обстоит не совсем просто. В базе данных драйверов явно доступны драйверы для практически всех последних моделей карт NVidia, а вот драйверов для карт ATi там, к сожалению, нет. Если вы не можете найти свою карту в списке, выберите опцию Unlisted Card (Карта, не указанная в списке) и переходите к следующему экрану, на котором драйвер можно будет выбрать вручную. Если у вас установлена карта ATI Radeon или какая-нибудь другая из современных карт с 3D- ускорением, возможно, прежде чем Х11 сможет распознать ее, вам придется добавить поддержку для таких карт в ядре. (О том, как выполняется перекомпиляция ядра, более подробно будет рассказываться в главе 18.) И, наконец, последний вариант — выбрать драйвер VESA и разрешение 800x600; такие настройки поддерживают практически все современные видеокарты, хотя о 30-ускорении в этом случае, конечно, не может быть и речи. Выберите драйвер, который подходит для вашей видеокарты. Это может оказаться не так просто сделать, потому что имена драйверов представлены в закодированной форме. Просто знайте, что nv означает драйвер для карт NVidia, ati — драйвер для карт ATI, a mga — драйвер для карт Matrox. Если возможно, выберите тот же драйвер, который был сконфигурирован раньше, на этапе автоматического поиска оборудования, то есть тот, что был указан в поле Driver файла xorg.conf .new.
Установка FreeBSD Далее выберите опцию Configure Screen (Параметры экрана). Здесь вам нужно будет указать качество цветопередачи для вашего монитора. Качество цветопередачи зависит от объема видеопамяти. Современные видеокарты имеют предостаточное количество видеопамяти, и воспроизведение изображений с высоким качеством цветопередачи (24 бита) даже при самом высоком разрешении для них не проблема; но если у вас установлена более старая видеокарта, хорошенько подумайте, какое значение лучше выбрать. Опять-таки, если вы раньше пользовались этим компьютером для работы в Windows, вы должны знать, какое качество цветопередачи с какими разрешениями поддерживает ваша видеокарта; если вы этого не знаете, выберите самое низкое качество, например 8 Bit, 256 Colors (8 бит, 256 цветов). (Вы всегда сможете изменить значение этого параметра позже, либо вернувшись в программу настройки, либо отредактировав конфигурационный файл вручную, если захотите увеличить качество цветопередачи до 16 или 24 битов.) На следующем экране с помощью клавиши пробела и клавиш с изображением стрелок вниз и вверх отметьте все разрешения, которые вы хотите иметь возможность использовать. XII сначала попытается использовать самое высокое разрешение; если ей не удастся перевести дисплей в этот режим, она пойдет дальше по списку и попытается использовать следующее, более низкое разрешение, и так далее. Попробуйте выбрать следующие значения: 1152x864, 1024x768 и 640x480. Это проверенные разрешения, с которыми могут работать практически все мониторы. Затем выберите опцию Configure Layout (Параметры схемы размещения), чтобы задать схему размещения. Это не особенно важно при наличии только одного монитора, клавиатуры, мыши и видеокарты, да и в принципе не очень сложно. И, наконец, выберите опцию Write xorg.conf and Quit (Записать в файл xorg. conf и выйти из программы). Это позволит вам установить новый глобальный конфигурационный файл в каталоге /etc/Xll/xorg.conf для того, чтобы содержащиеся в нем настройки применялись ко всем пользователям, которые будут запускать XII с локальной консоли. Точная настройка файла xorg. conf Закончив работать с программой xorgcfg, вы наверняка захотите отредактировать созданный ею файл вручную в текстовом редакторе, чтобы убедиться в том, что содержащиеся в нем значения являются приемлемыми. Чтобы сделать это, сначала запустите программу редактирования, например, встроенный текстовый редактор ее: # ее /etc/Xll/xorg.conf Для перемещения по содержимому файла пользуйтесь клавишами с изображением стрелок. Отыщите раздел Device и убедитесь в том, что содержащаяся в нем информация в точности соответствует характеристикам вашей карты. Далее, отыщите раздел Screen и проверьте, соответствуют ли указанные в нем режимы отображения режимам, которые, как вы знаете, ваш монитор и карта точно поддерживают. Если вам необходимо внести какие-нибудь изменения, сохраните файл, нажав клавишу <Esc>, а потом <Enter>, после чего выберите опцию Save Changes (Сохранить изменения), когда будете выходить из окна редактора.
Введение в FreeBSD Часть I НА ЗАМЕТКУ : Процедура настройки Х11 более подробно будет описываться в главе 7. В случае если у вас воз- никнут какие-то трудности при настройке Х11 в плане нормальной работы с видеооборудованием (видеокартой и монитором), обращайтесь в эту главу — там вы сможете узнать о дополнительных технологиях по определению подходящих параметров. Проверив и, если нужно, отредактировав файл xorg.conf, запустите XII с помощью следующей команды: # startx Не забудьте нажать клавиатурную комбинацию <Ctrl+Alt+Backspace>, чтобы завершить работу XII, если попадете в режим отображения, который является непригодным для использования или не справляется с синхронизацией видеоизображений; не стоит рисковать своим монитором! Если XII запустится нормально, то она сделает это, используя очень примитивный рабочий стол, который называется диспетчером окон TWM и показан на рис. 2.15. Это почитаемая, но очень простая среда, которая позволяет выполнять только базовые операции с помощью мыши и предоставляет доступ лишь к нескольким окнам и утилитам. В используемой по умолчанию конфигурации вам будет доступно xterm-окно командной строки с заголовком Login (Вход в систему) (которое привязывается к вашему сеансу работы в XII: выйдите из этого окна и вы снова попадете в окно командной строки), еще два xtrem-окна без заголовка, а также часы. Вы можете работать в любом из этих окон точно так же, как в окне командной строки. TWM имеет "нестабильный фокус", что означает следующее: активным окном (то есть тем, в котором вводятся данные с клавиатуры) является то окно, в котором находится указатель мыши; поэтому, если вводимый вами текст появляется не в том окне, в котором вы ожидаете его увидеть, просто переместите указатель мыши в нужное окно и оставьте его там. Также обратите внимание на то, что при запуске каждой новой программы или открытии в программе нового окна вам придется выполнять щелчок кнопкой мыши, чтобы указать место на экране, где вы хотите, чтобы появилось это новое окно. TWM вполне подходит для экспертов и аскетов (то есть пользователей, которые не любят излишеств), но сделать так, чтобы TWM работал как современный графический интерфейс пользователя (GUI), практически невозможно. В этом случае лучше воспользоваться одной из таких замечательных настольных сред, как GNOME, KDE, XFce, Windows Maker и так далее. О том, как можно переключиться с TWM на одну из этих сред, более подробно будет рассказываться в главе 5. Если вы в TWM щелкнете левой кнопкой мыши в области рабочего стола, появится меню с несколькими касающимися управления окнами опциями, среди которых будут и две такие опции, как Restart (Перезагрузка) и Exit (Выход). Обратите внимание на то, что эти опции не означают "перезагрузить компьютер" и "выйти из XII"; они касаются) только TWM и позволяют только (соответственно) перезапускать или завершать процесс TWM, после чего вы остаетесь просто в сеансе XI1 без рабочего стола (диспетчера окон). Завершите пока что работу XII. Для этого либо введите в окне регистрации команду exit, либо воспользуйтесь клавиатурной'комбинацией <Ctrl+Alt+Backspace>.
Установка FieeBSD Глава 2 101 ттшттттштттштш'- ***о Рис. 2.15. Первоначальная схема размещения окон в XII, когда используется TWM Завершение работы FreeBSD FreeBSD (подобно другим версиям UNIX) представляет собой многозадачную и многопользовательскую операционную систему. Она постоянно что-то делает и в ней обычно открыто сразу несколько файлов одновременно. Поэтому вы не можете просто взять и выключить компьютер, когда хотите завершить работу системы FreeBSD. Во-первых, вам нужно указать FreeBSD, что она должна завершить свою работу, для того, чтобы она могла по порядку закрыть все работающие программы и сохранить все открытые файлы. Сделать это прямо сейчас можно с помощью следующей команды: shutdown -h now Эта команда указывает FreeBSD завершить работу системы и, после того как этот процесс завершится, выполнить аппаратный останов работы компьютера (который отличается от его перезагрузки и перехода в однопользовательский режим), а также, что вы хотите, чтобы это было сделано прямо сейчас, а не, к примеру, через пять минут. (Просто обычно в этой команде указывается время задержки для того, чтобы другие пользователи могли получить сообщение, предупреждающее о том, что скоро произойдет завершение работы системы, и успели сохранить все файлы, с которыми они работали.) Введите shutdown -h now в командной строке и нажмите клавишу <Enter>. На экране начнут появляться сообщения, такие как Broadcast message from root и сообщения о состоянии различных завершаемых процессов.
JTI I Введение в FreeBSD I Часть I Дождитесь, когда появится такое сообщение: System halted Please press any key to reboot Система остановлена Пожалуйста, нажмите любую клавишу для перезагрузки Только после этого вы можете спокойно выключить свой компьютер. ВНИМАНИЕ! Никогда не завершайте работу системы FreeBSD, как, впрочем, и любой другой системы типа UNIX, путем отключения электропитания. Это может привести к серьезному повреждению файловых систем. Сначала всегда выполняйте соответствующую процедуру, позволяющую корректно завершить работу системы. О том, как правильно выполняется процедура завершения работы и какие существуют технологии перезагрузки, более подробно будет рассказываться в главе 4.
ГЛАВА з Дополнительные задачи по установке В этой главе: • Резервное копирование существующей файловой системы Windows или Linux • Неразрушающее разбиение жесткого диска на разделы с помощью FIPS • Работа с программой FIPS • Потенциальные проблемы и ограничения систем с двойной загрузкой • Диспетчер загрузки FreeBSD • Альтернативные методы установки FreeBSD
Введение в FreeBSD В главе 2 описывался стандартный процесс установки FreeBSD без осложняющих факторов, таких как процедура настройки диска с двумя режимами загрузки и сосуществование с другими операционными системами. А также в ней предполагалось, что установка FreeBSD выполняется с DVD/CD-диска, а не с какого-нибудь другого из множества возможных носителей. Эта глава по большей части является дополнением предыдущей, потому что в ней будут рассматриваться задачи, которые должны выполняться предварительно на системах, не соответствующих приведенным до этого описаниям. Если вы устанавливаете FreeBSD на компьютер, где уже установлена какая-то другая операционная система, или если для установки FreeBSD вы используете не DVD/CD-диск, а какой-нибудь другой носитель, то прежде чем приступать к установке, обязательно прочтите эту главу. Когда вы выполните все необходимые предварительные операции, о которых рассказывается здесь, вернитесь к главе 2 и приступайте к обычной установке. Многие пользователи, которые до этого не работали с FreeBSD и которым любопытно узнать, что собой представляет эта операционная система, нередко устанавливают FreeBSD на компьютер, на котором уже установлена Windows. В этой главе будет рассказываться о том, как нужно подготовить компьютер для того, чтобы после установки на нем без проблем могли запускаться обе эти операционные системы, а также о том, как установить FreeBSD на компьютер, на котором уже присутствует операционная система Linux. Прочитав эту главу, вы будете знать, как установить FreeBSD так, чтобы при включении компьютера вы могли выбирать, какую систему загрузить: FreeBSD, Windows или Linux. Кроме того, в этой главе мы также вкратце рассмотрим процедуры настройки NFS и FTP, которые являются обязательными в ситуации, когда не доступен ни CD-, ни DVD-диск. Резервное копирование существующей файловой системы Windows или Linux Прежде чем идти дальше, сделайте резервную копию существующей файловой системы Windows или Linux, которую хотите сохранить. Хотя в следующем разделе будет рассказываться о том, как можно безопасно (то есть без потери данных) создать на диске пространство для FreeBSD, ошибки все равно не исключены: можете ошибиться вы, могут ошибиться программы. Лучше иметь резервную копию всей нужной информации: потеряв свои бесценные данные, вы вряд ли сможете утешить себя тем, что зато вы сэкономили свое время и деньги. Для резервного копирования можно использовать следующие носители: перезаписываемые CD- и DVD-диски, диски Zip или Jaz, накопители на магнитной ленте, внешние жесткие диски (то есть те, которые подключаются через порт USB или FireWire) и даже дискеты, если объем информации, которую требуется сохранить, не слишком велик. Помните о том, что делать резервную копию всей операционной системы и установленных программ вовсе не обязательно, потому что эти программы очень легко можно будет установить заново, если конечно у вас сохранились установочные диски. Прежде всего, беспокоиться следует о своих файлах, содержащих данные, заменить которые далеко не так просто. (Конечно, сегодня большая МРЗ- коллекция или библиотека цифровых фотографий запросто может вынудить вас приобрести дешевый внешний диск и скопировать все на него для хранения).
Дополнительные задачи по установке Глава 3 105 Если у вас нет специализированной программы для резервного копирования, вы можете воспользоваться программой-архиватором типа WinZip и с ее помощью сжать все нужные данные и сохранить их на дисках. Также полезной в этом плане может оказаться программа Partimage, которая доступна на сайте по адресу http: // www.partimage.org. НА ЗАМЕТКУ Описание процедур для выполнения резервного копирования выходит за рамки данной книги. Более подробную информацию о том, как выполняется резервное копирование, вы сможете найти в документации по программе, которую вы решили использовать для проведения этой процедуры. После того, как вы создадите резервные копии всех необходимых существующих файлов, вы должны будете освободить место на жестком диске для установки FreeBSD. Существует несколько способов сделать это. • Просто удалить все раздели и разбить диск заново. В этом случае вы потеряете все существующие в системе данные, и вам придется заново устанавливать все установленные на текущий момент программы после того, как вы создадите новые разделы. Этот вариант будет подходящим, если вас не особенно волнуют находящиеся на диске данные, или если у вас нет программы, позволяющей безопасно разбивать диск на разделы, вроде Partition Magic, и если вас не пугает тот факт, что вам придется заново устанавливать Windows или Linux после того, как вы освободите пространство и установите FreeBSD. • Использовать коммерческую программу неразрушсюимо разбиения диска на разделы, такую как Partition Magic Если у ваг есть программа Norton Partition Magic проичвоч ства Symantec, обязательно вослол1»зуйтесь ею. Sro стоящее $69 решение являп ся наилучшим из доступных на сегодняшний день подобных средств и позволяет выделять на жестком диске пространство под FreeBSD без потери существующих данных и конфигураций. Рассмотрение этой программы и способов работы с ней выходит за рамки данной книги. Более подробную информацию по этому вопросу можно найти в документации по Partition Magic. Посвященный Partition Magic Web-сайт находится по следующем)' адресу: http: //www. Symantec. com/ home_homeoffice/products/system_performance/pm80/. • Воспользоваться утилитой FIPS. Эта распространяемая бесплатно программа, которая была написана Арно Шафером (Arno Schafer), позволяет разбивать существующий раздел для создания свободного пространства. FIPS доступна нл прилагаемом к этой книге DVD-диске и поэтому будет рассматриваться в этой главе. Она не является столь совершенным решением, как Partition Magic, но она бесплатная и позволяет получить похожие результаты. Неразрушающее разбиение жесткого диска на разделы с помощью FIPS First (nondestructive) Interactive Partition Splitting, или FIPS — первая, не разрушающая существующих данных, интерактивная технология для разбиения диска на разделы; это программа, позволяющая разбивать жесткий диск на разделы, которая разраба-
Введение в FreeBSD тывалась для запуска в DOS или в режиме DOS под Windows. Она разбивает один раздел DOS на два в указанной вами точке, после чего вы можете использовать один из созданных ею новых разделов для FreeBSD. Обратите внимание на то, что FIPS работает только с DOS-разделами (такими, как FAT 16 или FAT32). FIPS не работает ни с NTFS-разделами (которые используются в Windows NT, 2000 и ХР), ни с Ext2FS/ Ex+SFS-разделами (которые используются в Linux). И, наконец, тем, кто имеет дело с OS/2, следует знать, что с HPFS-разделами FIPS тоже не работает. FIPS имеет несколько ограничений. • Она позволяет разбивать только первичный раздел; разбивать расширенные DOS-разделы она не может. Расширенные DOS-разделы — это так называемые разделы второго уровня, которые достаточно часто используются как в мире DOS/ Windows, так и в мире Linux; они позволяют создавать на диске более четырех поддерживаемых BIOS разделов, разбивая эти разделы на подразделы и затем предоставляя к ним доступ так, будто бы они являются обычными разделами. (FreeBSD не поддерживает расширенные разделы; вместо этого в ней используются секции (slices) и BSD-разделы (BSD partitions), о которых более подробно будет рассказываться в главе 20). Если у вас на компьютере, как и у большинства людей, установлена операционная система Windows, это ограничение вас не касается, потому что в этом случае у вас, скорее всего, имеется один первичный раздел, который занимает весь диск. щ На диске не должно быть более трех разделов. FIPS создает новый первичный раздел указанного объема. Поскольку на диске разрешается иметь только четыре DOS-раздела, при запуске FIPS на вашем жестком диске должно существовать не более чем три раздела. Обратите внимание на то, что это ограничение касается только дисков IDE/ATA, на SCSI-диски оно не распространяется. Если ни одно из этих ограничений к вам не относится и если вы уже подготовили резервные копии всех необходимых данных, вы можете приступать к процедуре разбиения диска на разделы. ВНИМАНИЕ! Разделы Windows ХР часто форматируются как NTFS-разделы Из-за этого FIPS может вообще не работать с Windows ХР (даже с версией Windows XP Home Edition). Если вы используете Windows ХР или NT/2000 с файловой системой NTFS, при желании выполнить процедуру разбиения диска на разделы без потери данных, вам придется приобрести упоминавшуюся ранее коммерческую программу Partition Magic. Запуск утилиты ScanDisk и программы дефрагментации Прежде чем использовать FIPS, вы должны сначала отключить экранную заставку и все назначенные задания, а затем запустить доступную как в DOS, так и в Windows утилиту ScanDisk, чтобы устранить все возможные проблемы на диске. После этого вы должны выполнить дефрагментацию диска (то есть запустить программу дефраг* ментации). Для создания нового раздела (путем разбиения существующего) FIPS необходимо свободное пространство в конце диска. Она не сможет создать раздел, если в последнем секторе диска будут содержаться хоть какие-нибудь данные. Запустив программу
Дополнительные задачи по установке | 77Z Глава 3 I дефрагментации, вы сможете переместить все данные в начало диска и избавиться от ненужных промежутков в середине. ВНИМАНИЕ! Имейте в виду, что программам дефрагментации в Windows 2000 и ХР часто не удается собрать все файлы в цельный кусок; файловая система NTFS не дает это сделать правильно и поэтому программы дефрагментации часто оставляют большие промежутки посередине используемого дискового пространства. Опять-таки, Partition Magic может оказаться наилучшим решением для таких платформ, если FIPS не удается найти цельный кусок свободного пространства достаточного размера. Процесс дефрагментации может занять от нескольких минут до нескольких часов, что зависит от производительности вашего компьютера, размера жесткого диска, его скорости и того, насколько давно на нем выполнялась дефрагментация. Получение FIPS и создание загрузочной дискеты Когда процесс дефрагментации завершится, вы можете запускать FTPS. Загрузить FIPS можно либо с FTP-сервера FreeBSD, который находится по адресу ftp.freebsd.org, либо с одного из зеркальных сайтов, из каталога /pub/FreeBSD/tools/fips.exe. Из этого же каталога можно загрузить и файл restorrb.exe. Если ни один из этих источников не доступен, попробуйте воспользоваться официальным Web-сайтом FIPS, который находится по адресу: http://www.igd.fhg.de/-aschaefe/fips/. Вы должны создать загрузочную дискету и скопировать на нее три упомянутых выше файла. Эта дискета позволит вам загрузиться в MS-DOS (или FreepOS; более подробную информацию об этом режиме можно найти на сайте http://freedos.org) и запустить FIPS. В DOS или Windows98/Me загрузочную дискету можно создать путем ввода в командной строке DOS команды format a:, конечно, при условии наличия чистой дискеты в дисководе А. Ниже показан пример процедуры для создания загрузочной дискеты: С:\> format а: /• Insert new diskette in drive A: and press ENTER when ready... Checking existing disk format. Verifying 1.44M Format complete. System transferred Volume label (11 characters, ENTER for none)? 1,457,664 bytes total disk space 388,608 bytes used by system 1,069,056 bytes available on disk 512 bytes in each allocation unit. 2,088 allocation units available on disk. Volume Serial Number is 031B-0831 Format another (Y/N)? n Вставьте новый диск в дисковод А и нажмите клавишу ENTER...
Введение в FreeBSD Проверка существующего формата диска. Проверка: 1.44 М Форма тирование зав ершено. Система перенесена Метка тома (11 символов; если метка не нужна, нажмите <Enter>) ? Всего доступно на диске: 1,457,664 байт Занято: 388,608 байт Свободно: 1,069,056 байт В каждом блоке памяти: 512 байт Всего на диске доступно: 2,088 блоков Серийный номер тома: 031В-0831 Форматировать другой диск (Да/Нет) ? п С:\> d: D:\> cd tools D:\TOOLS> copy fips.exe a:\ 1 file(s) copied (1 файл (-лов) скопировано) d:\TOOLS> copy reetorerb.exe a:\ 1 file(s) copied (1 файл (-лов) скопировано) D: \TOOLS> copy errors. txt a: \ 1 file(S) copied (1 файл (-лов) скопировано) D:\TOOLS> НАЗАМЬТКУ В Window 2000 и ХР использовать для создания загрузочной дискеты команду format a: нельзя. Эти оо; ее новые операционные системы требуют, чтобы для создания загрузочных дискет использовался интерфейс Windows. Поэтому, если вам необходимо создать загрузочную дискету, например в Windows XP сделайте следующее, вставьте дискету в дисковод А, а затем отыщите диск А, развернув узел My Computer (Мой компьютер); щелкните на нем правой кнопкой мыши и в появившемся контекстном меню выберите пункт Format (Форматировать). Затем отметьте флажок Create an MS-DOS Startup Disk (Создание загрузочного диска MS-DOS) и щелкните на кнопке Start (Начать). Когда вы создадите загрузочную дискету, используйте ее для перезагрузки системы (возможно, вам потребуется зайти в настройки BIOS и указать BIOS, что в случае, когда в дисководе А имеется дискета, следует выполнять загрузку с дискеты). Когда система загрузится, в командной строке DOS введите f ips, чтобы запустить программу FIPS. Работа с программой FIPS При первом запуске FIPS отобразит сообщение, предупреждающее, помимо всего прочего, о том, что эту программу нельзя использовать в многозадачных средах. Прочитав всю содержащуюся в этом сообщении информацию, нажмите любую клавишу для продолжения. Далее, если в системе установлено несколько жестких дисков, FIPS предложит указать дис к, с которым вы хотите работать. Выберите нужный диск. После этого FIPS отобразит таблицу имеющихся на эгом диске разделов, которая будет выглядеть примерно так:
Дополнительные задачи по установке 109 Глава 3 I | Start | I End |Start|Numberof I Part. | bootable | Head Cyl. Sector | System | Head Cyl. Sector I Sector I Sectors I MB + + + + + + + 1| yes | 1 0 1| 06h|12 983 32 | 321 40931214149 2| no | 0 0 0| OOhl 0 0 0 | 0| 0| 0 3| no | 0 0 0| 00h| 0 0 0 | 0| 0| 0 4| no | 0 0 0| 00h| 0 0 0| 0| 0| 0 Checking root sector ... OK (Проверка корневого сектора ... OK) Press any Key (Нажмите любую клавишу) Если на диске имеется несколько разделов, FIPS попросит вас указать, какой именно раздел вы хотите разбить. Если на диске имеется только один раздел, последует приглашение нажать любую клавишу (как и в предыдущем примере). После того, как вы выберете раздел или нажмете какую-нибудь клавишу, FIPS прочитает загрузочный сектор и начнет отображать некоторые дополнительные сведения об этом диске: Bytes per sector: 512 Sectors per cluster: 8 Reserved sectors: 1 Number of FATs: 2 Number of rootdirectory entries: 512 Number of sectors (short): 0 Media descriptor byte: f8h Sectors per FAT: 200 Sectors per track: 32 Drive heads: 13 Hidden sectors: 32 Number of sectors (long): 409312 Physical drive number: 80h Signature: 29h Байтов в каждом секторе: 512 Секторов в каждом кластере: 8 Зарезервированных секторов: 1 Количество FAT-разделов: 2 Количество записей в корневом каталоге: 512 Количество секторов (сокращенный вариант) : О Байт дескриптора носителя: f8h Секторов в каждом разделе FAT: 200 Секторов в каждой дорожке: 32 Головок чтения-записи: 13 Скрытых секторов: 32 Количество секторов (полный вариант) : 409312 Номер физического диска: 8Oh Сигнатура: 29h После того, как FIPS закончит выдавать эти сведения, она отобразит размеры нового и старого разделов и предложит выбрать цилиндр, который должен считаться границей между этими разделами. Используйте клавишу с изображением стрелки вправо или стрелки влево, чтобы уменьшить или увеличить номер цилиндра, с которого будет начинаться новый раздел. Кроме того, вы можете использовать клавишу с изображением стрелки вверх или стрелки вниз, чтобы увеличить или уменьшить размер нового раздела с шагом в 10 цилиндров. Вы также можете использовать начальные ("Start") и конечные ("End") номера головок, цилиндров и секторов, чтобы
I 777 | Введение в FreeBSD указать, как именно вы хотите поделить этот диск; вы можете уменьшать размер существующего раздела (разделов) до тех пор, пока свободного пространства не станет достаточно для установки FreeBSD (указав нужный размер в столбце Size). Обратите внимание на то, что загрузочный раздел FreeBSD должен уместиться целиком на первых 1024 цилиндрах диска, о чем мы еще поговорим чуть позже. Когда закончите, нажмите клавишу <Enter>. СОВЕТ Запишите себе где-нибудь данные о начальном цилиндре созданного раздела. Во время установки FreeBSD они вам помогут определить, правильный ли раздел был выбран для установки FreeBSD. После того, как вы нажмете клавишу <Enter>, FIPS покажет, как будет выглядеть новая таблица разделов, и затем предложит вам на выбор две опции: Edit (Редактировать) и Continue (Продолжить). Если вы выберете вариант Continue (Продолжить), FIPS последний раз спросит вас, уверены ли вы в том, что хотите сохранить изменения в таблице разделов. Здесь будьте очень внимательны! Выбор варианта Yes (Да) приведет к записи всех изменений и завершению работы FIPS. Отменить эту операцию нельзя; если вы сохраните изменения, вернуться к старой конфигурации вы уже не сможете. После того, как вы примените изменения и выйдете из FIPS, вам нужно будет немедленно перезагрузить компьютер. Если при завершении работы FIPS возникнут какие-нибудь ошибки, воспользуйтесь прилагаемым к FIPS файлом README, чтобы узнать, что они означают и что с ними делать. ВНИМАНИЕ! Очень важно, чтобы сразу после выхода из FIPS вы не записывали на жесткий диск никаких новых данных вплоть до перезагрузки. Это может привести к повреждению диска, потому что DOS не будет знать о том, что таблица разделов изменилась до тех пор, пока вы не выполните перезагрузку. После перезагрузки снова запустите FIPS, используя опцию -t. Это позволит вам убедиться в том, что раздел был разбит правильно. Если появятся сообщения об ошибках, восстановите предыдущую таблицу разделов. Чтобы сделать это, запустите файл RESTORRB.EXE и затем снова перезагрузите компьютер. ВНИМАНИЕ! После того, как вы внесете в имеющиеся на диске файловые системы хоть какие-нибудь изменения, использовать файл restorrb.exe для восстановления старой таблицы разделов вы уже больше не сможете. Именно поэтому так важно, чтобы после перезагрузки вы, прежде чем выполнять какие-либо операции, запустили f ips с опцией -t. Если вы запустили f ips с опцией Чи никакие сообщения об ошибках не появились, извлеките дискету из дисковода и снова перезагрузитесь. Когда Windows или DOS загрузится, запустите на том разделе, который вы разбивали, утилиту ScanDisk, чтобы проверить его на наличие ошибок.
Дополнительные задачи по установке | А4Ч 1 Глава 3 I 1 Потенциальные проблемы и ограничения систем с двойной загрузкой Иметь систему с двумя режимами загрузки, то есть такую, где на жестком диске установлены две или более операционных систем и при каждом запуске можно выбирать, какую из этих операционных систем загрузить, вполне возможно. Такая конфигурация является очень удобной во многих ситуациях; если у вас есть только один компьютер, и вы хотите использовать FreeBSD для программирования, a Windows — для игр, система с двумя режимами загрузки является для вас просто идеальным вариантом. Однако при работе в системах с двумя режимами загрузки могут возникать некоторые проблемы, если не предпринять соответствующих мер, чтобы избежать их или справиться с ними. Во-первых, имейте в виду, что вся информация, требуемая для загрузки FreeBSD, должна находиться в пределах первых 1024 цилиндров жесткого диска. Это необходимо для нормальной работы диспетчера загрузки FreeBSD, что означает следующее: когда вы создаете на диске раздел для FreeBSD с помощью FIPS, вы либо должны уместить на первых 1024 цилиндрах весь корневой раздел, либо создать отдельный раздел загрузки и разместить его на этих первых 1024 цилиндрах. Используйте информацию о цилиндрах, которую FIPS отображает в столбцах Start и End, чтобы определить, где начинаются и где заканчиваются ваши разделы. Если вы выберете второй вариант (то есть решите создать отдельный загрузочный раздел, помимо корневого), знайте, что в этом случае корневой раздел не обязательно должен умещаться целиком на первых 1024-х цилиндрах. Обратите внимание на то, что "умещаться целиком* означает, что раздел должен как начинаться, так и заканчиваться на цилиндре с меньшим, чем у 1024-го цилиндра, порядковым номером. Того, что раздел начинается с цилиндра с меньшим, чем у 1024-го цилиндра, порядковым номером, в этом случае будет не совсем достаточно. Если вам для Windows или DOS нужно больше места, чем доступно до 1024-го цилиндра, вы можете снова воспользоваться программой FIPS и разбить раздел Windows или DOS на два, то есть создать в Windows или DOS диск С: и диск D:. Далее вы должны будете разместить между этими дисками С: и D: небольшой раздел, из которого будет загружаться FreeBSD. Этот раздел позже, во время установки FreeBSD, будет использоваться как раздел /boot (и 30 Мбайт для него должно вполне хватить). Во-вторых, когда вы разобьете диск на разделы и начнете заново устанавливать ПО, не забудьте, что сначала следует установить DOS или Windows и лишь потом — FreeBSD. DOS и Windows предполагают, что они являются единственной операционной системой на жестком диске и поэтому при установке, не спрашивая, перезаписывают главную загрузочную запись. Если вы сначала установите FreeBSD, а потом DOS или Windows, диспетчер загрузки FreeBSD перестанет работать, и загрузить FreeBSD у вас больше не получится. Эту проблему можно легко устранить, но лучше избавить себя от этой ненужной головной боли и просто в первую очередь установить DOS или Windows.
I 777 I Введение в FreeBSD I 11Z 1 Чагть! Двойная загрузка для DOS, Windows 95, Windows 98, Windows Me или Windows XP FreeBSD поставляется с диспетчером загрузки (FreeBSD Boot Manager), который позволяет использовать отдельный режим для загрузки различных операционных систем. Просто выберите опцию Install the FreeBSD Boot Manager (Установить диспетчер загрузки FreeBSD) во время установки FreeBSD. После этого каждый раз, когда вы будете запускать систему, на экране будет появляться меню, позволяющее вам путем нажатия соответствующей клавиши выбрать, какую операционную систему вы хотите загрузить — FreeBSD или установленную ранее версию MS-DOS или Windows. СОВЕТ V GAG — это альтернативный диспетчер загрузки от стороннего производителя, который имеет графический интерфейс и является более гибким, чем диспетчер загрузки FreeBSD. Дополнительную информацию можно найти на Web-сайте этого производителя, который находится по адресу http://gag.sourceforge.net/. Двойная загрузка для Linux Если вы хотите сохранить возможность работать с Linux и получить возможность загружать Linux из меню диспетчера загрузки FreeBSD (FreeBSD Boot Manager), установите LILO или GRUB (это диспетчеры загрузки для Linux), но не в главной загрузочной записи (Master Boot Record — MBR), а в начале системного (boot) раздела Linux. Информацию о том, как именно это делается, можно найти в документации по LILO или GRUB. После того, как вы установите диспетчер загрузки Linux, вы сможете загружать Linux из меню диспетчера загрузки FreeBSD. Если вы хотите иметь возможность загружать FreeBSD из LILO или GRUB, прочитайте следующие разделы. Загрузка FreeBSD из LILO Если вы работаете с Linux и хотите загружать FreeBSD из Linux-загрузчика LILO, вы можете достаточно легко это сделать. В Linux откройте файл /etc/lilo.conf для редактирования и добавьте в него следующие строки: other=/dev/hda2 table=/dev/hda labelsFreeBSD Измените строку, начинающуюся с о the r = так, чтобы она отражала имя устройства, которое Linux использует для идентификации вашего диска с FreeBSD. (He забывайте о том, что имена устройств, а также имена жестких дисков, в Linux сильно отличаются от тех, что принято использовать в FreeBSD.) После того, как вы внесете это изменение в конфигурационный файл, переустановите LILO, для чего введите lilo от лица пользователя root.
Дополнительные задачи по установке Глава 3 Загрузка FreeBSD из GRUB Сделать так, чтобы FreeBSD и Linux можно было загружать из диспетчера загрузки GRUB, вы можете следующим образом: откройте файл /boot/grub/grub.conf для редактирования и добавьте в него следующие строки: title FreeBSD 6.1 #1 root (hdO,0,a) kernel /boot/loader Аргументы перед root указывают, где находится корневой раздел FreeBSD; в приводимых ранее примерах этот раздел находился в BSD-разделе секции 0 на главном жестком диске, то есть (hdO, О, а). Если вы при установке использовали другие диски и секции, измените эти номера соответствующим образом. Дополнительную информацию об использовании GRUB с Linux и FreeBSD можно найти по адресу http://geodsoft.eom/howto/dualboot/grub.htm#freebsd. Диспетчер загрузки FreeBSD Чтобы обеспечить себе возможность загрузки нескольких операционных систем, вы можете во время установки FreeBSD установить такую программу, как FreeBSD Boot Manager (Диспетчер загрузки FreeBSD). После установки FreeBSD, вы сможете настроить диспетчер загрузки с помощью программы bootOcf д. Выдача команды bootOcf g -В приведет к установке диспетчера загрузки в главную загрузочную запись (MBR) жесткого диска. Это один из способов восстановить диспетчер загрузки, если Windows пришлось удалить его (что могло произойти, например, если Windows устанавливалась после FreeBSD). Конечно, в случае, если диспетчер загрузки был удален, чтобы использовать команду bootOcf g -В, вам придется загрузиться с загрузочного диска FreeBSD. Кроме того, при желании внести изменения в конфигурацию диспетчера загрузки, вам придется установить его заново, используя эту же команду, только указав после нее все необходимые изменения. bootOcfg является утилитой командной строки. К счастью, большинство ее опций могут вообще никогда не понадобиться, тем не менее, они являются интересными, во всяком случае, в познавательном плане. В табл. 3.1 перечислены только самые основные опции, которые могут пригодиться для внесения изменений в конфигурацию диспетчера загрузки. Таблица 3.1. Опции конфигурации диспетчера загрузки Опция Описание *v bootOcfg будет более подробно описывать выполняемые операции. -b image {образ) Здесь image {образ) — это имя загрузочного образа, который следует использовать. По умолчанию применяется /boot/boot0. -d drive (диск) Здесь drive (диск) — номер, используемый BIOS для ссылки на диск. Обычно это 0x80 для первого диска, 0x81 для второго диска и так далее. -f file (файл) Здесь file {файл) — это имя файла, в котором в случае возникновения проблем должна сохраняться резервная копия главной загрузочной записи (MBR). Если такой файл уже существует, он будет заменен новой версией. 113
114 Введение в FreeBSD Часть I Опция -о тоже поддерживается и позволяет использовать целый ряд разделяемых запятой аргументов, значения которых объясняются в табл. 3.2. Таблица 3.2. Аргументы для bootOcf g -о Аргумент Описание packet Если установленная на данном ПК система BIOS поддерживает такую опцию, этот аргумент укажет bootOcf g использовать для операций ввода-вывода расширения int 0x13 вместо более старой схемы CHS, и тем самым позволит обойти описывавшееся ранее ограничение, касающееся размещения системного раздела в пределах первых 1024 цилиндров. Однако если установленная на данном ПК BIOS не поддерживает такую опцию, использование этого аргумента может привести к зависанию системы при следующей перезагрузке. setdrv Вынуждает bootOcf g использовать для ссылки на диск, с которым вы работаете, номер, указанный в опции -d. noupdate По умолчанию диспетчер загрузки может выполнять запись в главную загрузочную запись (MBR) и обновлять ее (в основном, для установки активных флагов). Это, в свою очередь, может привести к возникновению проблем, если была включена аппаратная антивирусная поддержка, не позволяющая выполнять запись в MBR. Опция noupdate будет предотвращать попытки диспетчера загрузки записать данные в MBR. bootOcfg также поддерживает опцию -s л, где л — это число от 1 до 5, обозначающее секцию (в MS-DOS/Windows вместо слова "секция" (slice) используется слово "раздел" (partition), откуда по умолчанию должна выполняться загрузка в случае отсутствия указаний со стороны пользователя. Кроме того, bootOcfg поддерживает еще и опцию -tn, где л — это число, обозначающее количество "тактов", которое следует выждать прежде, чем загружать используемую по умолчанию операционную систему. В одной секунде примерно 18.2 такта. Альтернативные методы установки FreeBSD Если вы не можете или (по какой-то причине) не хотите устанавливать FreeBSD с прилагаемого к этой книге DVD-диска, у вас есть еще несколько других вариантов. К этим другим вариантам относится установка по сети с помощью FTP или с помощью NFS. Установку по сети особенно удобно выполнять, когда есть доступ к сети, имеющей достаточно хорошую пропускную способность, но нет под рукой DVD-диска или если на компьютере нет рабочего DVD-привода либо установленная версия BIOS не позволяет выполнять загрузку с DVD-дисков. Для многих из серверов и рабочих станций, используемых в производственной среде, установка из сетевого источника является самым быстрым и эффективным способом установки FreeBSD. В случае установки FreeBSD по сети вам нужно будет сначала загрузить мини-версию FreeBSD, которая содержит ядро, программу Sysinstall и больше практически ничего. Если у вас нет возможности загрузиться в программу Sysinstall с установочного DVD-диска, вам придется использовать загрузочные дискеты. Создайте эти три дискеты, следуя инструкциям, которые приводились в главе 2, в разделе "Создание установочных дискет". Затем вставьте первую дискету (boot. f lp) в дисковод гибких дисков и загрузите компьютер; когда последует соответствующее приглашение, вставьте следующие дискеты.
Дополнительные задачи по установке I 7TZ I i—_ — -jig , Глава 3 I " I Установка FreeBSD через FTP FTP расшифровывается как File Transfer Protocol (Протокол передачи файлов). Протокол FTP является одним из наиболее старых методов передачи файлов через Internet, с одного компьютера на другой. Несмотря на то что FTP не поддерживает шифрование данных и поэтому считается небезопасным, он по-прежнему широко применяется и является основным протоколом, который используется для передачи файлов в Internet, как будет показано в главе 27. Вы можете установить FreeBSD прямо с FTP-сервера, но для этого вам потребуется не имеющее временных ограничений высокоскоростное соединение с Internet. Установка через модемное соединение займет очень много времени. Если вы будете устанавливать FreeBSD с сайта FreeBSD или одного из ее официальных зеркальных сайтов, вы сможете подключиться как анонимный пользователь. В таком случае вам не нужно читать следующий раздел. Однако если вы будете устанавливать FreeBSD с FTP-сервера, который не позволяет подключаться анонимным пользователям (такого как FTP-сервер в локальной сети), вам придется выполнить процедуры, описанные в следующем разделе, чтобы сначала настроить имя пользователя. Настройка имени пользователя Sysinstall использует для установки FTP-соединений предварительно сконфигурированное имя пользователя и пароль. В главном меню Sysinstall, которое показано на рис. 3.1, с помощью клавиши с изображением стрелки вниз перейдите к пункту Options (Параметры) и нажмите клавишу <Enter>. В меню Options (Параметры), показанном на рис. 3.2, вы можете указать свое имя пользователя для входа на сервер FTP. При помощи клавиши с изображением стрелки вниз перейдите к опции FTP Username (Имя пользователя для входа на FTP-сервер) и нажмите клавишу пробела. Появится диалоговое окно с приглашением ввести имя пользователя для получения доступа к FTP-серверу; администратор сервера FTP, которым вы будете пользоваться, должен предоставить вам имя пользователя и пароль, которые позволят вам получать доступ к этому серверу. Введите имя пользователя и нажмите клавишу <Enter>. Последует приглашение ввести пароль. Введите нужный пароль и нажмите клавишу <Enter>. По завершении нажмите клавишу <Q>: на экране снова появится главное меню Sysinstall. Рис. 3.1. Главное меню Sysinstall. В этом меню следует выбрать пункт Options
116 Введение в FreeBSD Часть I Ком NFSStCUrt NFS SlOW NFS TCP NFS verelon Э Debugging No Worn Inge Yee to All DHCP IPv6 SklpPCCA» FTP ueernoM Editor Tope Blocketze Extract Detail Reloaee Naee Value Мане Value NO inetall Root / NO Broweer package llnke NO Broweer Exec Л»г/locol/btn/llnke YES Hedla Type *wt yet eet» NO Nedla Tteeout ЭМ NO Package Teep /varAep NO Nevf» Arge -b 16384 -f 2B48 NO Flxlt Coneole eerlol NO Re-ecan Devices *> NO Uee Default» [RESET1] И vl 20 high 6.8-IEL?ASE Uee SPACE to «elect/toggle an opt ton» arrow keys to eove, I? or Fl for «or» help. When you're done, type Q to Quit. [Швлюм cm poem to ue. tnetoad of mmom Рис. 3.2. Меню Options, в котором (помимо всего прочего) можно указать имя пользователя для входа на сервер FTP Выбор установки с FTP-сервера После того, как вы укажете имя пользователя и (если необходимо) пароль для доступа к FTP-серверу, следуйте инструкциям, которые приводятся в главе 2, в разделе "Создание разделов и назначение точек монтирования" и "Выбор дистрибутива", до тех пор, пока не появится экран с приглашением выбрать источник установки. На этом экране выберите опцию FTP или FTP Passive, если сервер, с которого вы планируете устанавливать FreeBSD, находится за брандмауэром (если вы не уверены, спросите об этом своего системного администратора). После этого появится экран с приглашением выбрать сайт, с которого будет выполняться установка (рис. 3.3). Рис. 3.3. Список доступных FTP-cepeepoe, с которых можно установить FreeBSD, Либо выберите ближайший общедоступный сервер, либо вручную укажите нужный URL-adpec Если вы решили установить FreeBSD с одного из ее зеркальных сайтов, выберите из списка тот сайт, который является к вам наиболее близким с географической точки зрения (для того, чтобы скорость загрузки была максимальной). В противном
Дополнительные задачи по установке Глава 3 117 случае выберите опцию URL (URL-адрес), чтобы указать адрес нужного FTP-сервера вручную. В диалоговом окне, которое появится после этого (рис. 3.4), вам нужно будет ввести имя FTP-сервера, а также путь к тому месту, где находятся установочные файлы FreeBSD. На рис. 3.4 показан пример адреса FTP-сайта, который обслуживается хостом lion, расположен в сети exaraple.com и на котором файлы FreeBSD находятся в каталоге /FreeBSD. Inetellee free, и witty ef different Jnetellitter | еееЧе, тепеДле. frwm. ПемеЧае t» en Internet FTP server., If уши'i free « eueeertei el/BV» *rb* then this ( —^- Velue Pleeutrrt cpMclfy the UM. ef « Free!'- ~ , r—j reeets f t» sit*. Thie tit* eust i,>jt;tiii;|!pt,i»n» jereen j i1 Ш'&&%&»' thX» i IVrmn+*и*Л*т»1*Ы dlreceery-«f the ueer eeinf 1 SE ] ? I Рис. 3.4. Выбор специального FTP-сервера путем указания его URL-адреса После того, как вы настроите параметры доступа к FTP-серверу, с которого будет производиться установка, вам нужно будет настроить параметры подключения к сети (рис. 3.5). Чтобы сделать это, выполните процедуру, которая описывалась в разделе "Настройка сети" главы 2. Вам нужно будет выполнить эту процедуру только один раз; после этого вы сможете возвращаться в Sysinstall и выполнять другие задачи, не конфигурируя сетевые параметры снова. Программа Sysinstall будет предлагать вам на выбор две опции: пропустить этот шаг или задать другие параметры подключения к сети. Рис. 3.5. Настройка параметров сети TCP/IP. Эта информация сохраняется в конфигурации TCP/IP системы
Введение в FreeBSD После того, как вы закончите настраивать сетевые параметры, на ваш компьютер начнут загружаться и автоматически устанавливаться различные наборы дистрибутивов. Этот процесс может занять довольно много времени; так что в течение нескольких следующих часов вы вполне можете заняться чем-нибудь другим. Когда процесс копирования файлов завершится, вы можете выполнить шаги, перечисленные в разделе "Конфигурирование и настройка системы после установки" главы 2. Поскольку сетевые параметры вы уже настроили, шаги, касающиеся настройки сети, вы можете пропустить. Обратите внимание, что в этой главе рассказывалось только о том, как FreeBSD можно установить с FTP-сервера. Если вы хотите создать "установочный сервер", который клиенты в вашей локальной сети смогут применять для установки FreeBSD, загляните в главу 27. Создав FTP-сервер и разместив на нем установочные файлы FreeBSD, вы сможете позволить другим системам выполнять с него установку, используя процедуры, описанные в этой главе. Установка FreeBSD с помощью NFS NFS— это сетевая файловая система (Network File System). Она позволяет добавлять в структуру каталогов данного компьютера файловые системы, расположенные на каком-нибудь другом компьютере в сети, и делать содержащиеся в ней файлы доступными для использования так, будто бы они находятся на жестком диске данного компьютера. Процедура совместного использования файлов с помощью NFS будет подробно рассматриваться в главе 33. Вы можете установить FreeBSD через NFS, если в вашей сети есть NFS-сервер и на нем доступны установочные файлы FreeBSD. Если ваш NFS-сервер доступен только через защищенный порт (или оборудование вашего компьютера работает очень медленно), выполните процедуру, описанную в следующем разделе. В противном случае вы можете пропустить следующий раздел и перейти с разу к разделу "Выбор установки через NFS". Настройка Sysinstall для защищенного порта или медленного соединения В главном меню программы Sysinstall (см. рис. 3.1), выберите пункт Options (Параметры) и нажмите клавишу <Enter>. Появится меню Options (Параметры), первой в котором будет указана опция NFS Secure (NFS. Безопасное соединение). Если ваш NFS-сервер работает только через защищенный порт (если вы в этом не уверены, поинтересуйтесь у своего системного администратора), нажмите клавишу пробела, чтобы установить для этой опции значение Yes (Да). Устанавливать значение Yes (Да) для второй опции — NFS Slow (NFS. Медленное соединение) — следует только в том случае, если ваш компьютер является маломощным (например, из семейства процессоров 386) или на нем установлена карта Ethernet с очень низкой производительностью. Такая необходимость возникает крайне редко; единственный случай, когда вам действительно надлежит сделать упомянутую опцию активной, это если вам нужно, чтобы удаленные пользователи могли получать доступ к вашей собственной файловой системе с другого NFS-сервера без ее локального монтирования. Когда вы внесете эти изменения, нажмите клавишу <Q>, чтобы вернуться в главное меню Sysinstall Далее следуйте инструкциям, которые приводятся в главе 2, до тех пор, пока не появится экран с приглашением выбрать источник установки.
Дополнительные задачи по установке I 7ТТ I Глава 3 I I Выбор установки через NFS На экране Choose Installation Media (Выбор источника установки) выберите вариант NFS. После этого появится экран с приглашением ввести имя NFS-сервера и путь каталогу, в котором находятся установочные файлы. В примере, который показан на рис. 3.6, сервер называется lion, а каталог с установочными файлам — install/FreeBSD. Рис. 3.6* Указание пути к установочным файлам FreeBSD, которые расположены на удален- ном NFS-сервере После тою, как вы введете эту информацию, вам нужно будет настроить сетевые пчраметры (гм, рис. 3 5). Чтобы сделать это, следуйте инструкциям, приводившимся в ипве 2, в разделе "Настройка сети". После нас i ройки сетевых параметров с удаленного сервера начнут загружаться и устанавливаться различные наборы дистрибутивов. Этот процесс, естественно, займет больше времени, чем он занимает в случае, когда установка выполняется с CD-диска, но все-таки завершится быстрее, чем в случае, когда установка выполняется с FTP-сервера. Когда копирование файлов завершится, вы можете приступать к выполнению процедур, описывавшихся в разделе "Конфигурирование и настройка системы после установки" главы 2. Поскольку сетевые параметры вы уже настроили для выполнения установки, раздел, посвященный настройке сети, вы можете пропустить. Обратите внимание, что в этой главе рассказывалось только о том, как установить FreeBSD с NFS-сервера. Если вы хотите создать "установочный сервер", который клиенты в вашей локальной сети смогут использовать для установки FreeBSD, загляните в главу 33. Создав NFS-сервер и разместив на нем установочные файлы FreeBSD, вы сможете позволить другим системам выполнять с него установку, используя процедуры, описанные в этой главе.
ЧАСТЬ FreeBSD как настольная система В этой части... Глава 4. Загрузка и завершение работы FreeBSD Глава 5. Работа с системой X Window System Глава 6. Работа с приложениями Глава 7. Дополнительная настройка XI1
ГЛАВА 4 Загрузка и завершение работы FreeBSD В этой главе: • Процесс запуска FreeBSD • Вход в систему FreeBSD • Выход из системы FreeBSD • Завершение работы системы FreeBSD
FreeBSD как настольная система Если вы — пользователь Windows или Мае, во время своего первого сеанса работы с FreeBSD вы сразу же обнаружите некоторые серьезные отличия между FreeBSD и операционной системой, с которой вы привыкли работать. Когда вы впервые запустите FreeBSD, вы увидите не элегантный или яркий графический интерфейс или рабочий стол, а окно командной строки в текстовом режиме, в котором вам нужно будет вести свое имя пользователя и пароль, прежде чем вы сможете выполнять в системе какие-либо другие операции. В этой главе будут описываться процедуры, необходимые для запуска, входа и выхода из системы FreeBSD, а также завершения работы FreeBSD. Неважно, новичок вы или опытный пользователь, эти процедуры станут частью вашей повседневной жизни, когда вы будете работать с FreeBSD, поэтому очень важно понимать, что именно происходит внутри системы во время выполнения. Процесс запуска FreeBSD При запуске FreeBSD на экране начнут появляться различные сообщения, генерируемые ядром и другими запускающимися процессами. Мы пока не будем подробно рассматривать, что означают все эти сообщения (процедура запуска и способы управлению ею будут детально описываться в главе 14), а лишь коротко расскажем о том, что вы будете видеть на экране до того, как появится командная строка. НА ЗАМЕТКУ .— Описания, приводимые в следующих разделах, отображают поведение FreeBSD, запускаемой на платформе х86 (Intel). Хотя процесс запуска на Alpha, SPARC и других платформах в целом сходен, некоторые детали все-таки немного отличаются. Процедура POST и BIOS Первое, что делает компьютер, когда его включают, это запускает процедуру POST (Power-On Self Test — самотестирование при включении). На этом этапе BIOS (Basic Input/Output System — базовая система ввода-вывода) проверяет, какое оборудование установлено на данном компьютере и является ли оно исправным. BIOS по сути представляет собой небольшую порцию программного кода, который находится в микросхеме ПЗУ (Read Only Memory — ROM) или СППЗУ (Erasable [Electrically] Programmable Read-Only Memory — EPROM) материнской платы компьютера. Помимо всего прочего, BIOS отвечает за тестирование оборудования при включении компьютера. Также BIOS отыскивает и тестирует первую часть операционной системы вне жесткого диска. Затем она определяет объем ОЗУ и проверяет устройства PnP (Plug and Play), чтобы узнать, какие ресурсы они могут использовать. На этом процедура POST завершается. Процедура самозагрузки После того, как процедура POST завершится, BIOS приступает к поиску устройства, с которого можно было бы выполнить загрузку. Обычно система начинает загружаться с первого загрузочного устройства, которое она находит. Устройства, поиск которых выполняет BIOS, и порядок, в котором она это делает, зависит от
Загрузка и завершение работы FreeBSD I 77^ I Глава 4 I I конфигурации, которая была задана в программе настройки BIOS (о чем более подробно будет рассказываться в главе 14). Обычно BIOS производит загрузку с первого жесткого диска в системе, но может загружаться и с других устройств, таких как дискеты, CD- и DVD-диски, а также внешние диски, подключаемые через порт USB или FireWire. BIOS может даже загружаться с сетевой карты, если в системе нет жесткого диска, и если она поддерживает загрузку операционной системы с сервера (то есть по сети). Обнаружив загрузочное устройство (в данном случае представим, что этим устройством является жесткий диск), BIOS приступает к процедуре самозагрузки, которая представляет собой многоэтапный процесс, состоящий из нескольких "блоков начальной загрузки" (маленьких программ, которые переносят в память постепенно становящиеся все большими \л большими фрагменты операционной системы), и более подробно будет описываться в главе 14. Выбор загрузочной секции (bootO) Обнаружив загрузочный жесткий диск, BIOS считывает все, что находится в его нулевом секторе. Нулевой сектор также называют главной загрузочной записью (Master Boot Record — MBR). Из-за унаследованных ограничений BIOS, программа, находят щаяся в главной загрузочной записи, может занимать только 512 байт. Потому это очень простая программа, которая знает о диске ровно столько, сколько необходимо для того, чтобы отобразить небольшое, но зато полноэкранное меню "секций" (разделов) или, если использовать профессиональный слэнг, "слайсов" (slice), с которых может быть выполнена загрузка. Ниже показан пример меню, которое может сгенерировать блок bootO: Fl DOS F2 FreeBSD F3 Drive 1 Default: F2 Здесь вы можете, используя функциональные клавиши, выбрать секцию, с которой хотите загрузиться, и, тем самым, операционную систему, которую вы хотите запустить. (Секция— это то, что в других операционных системах называется разделом или BIOS-разделом; подробнее об этом будет рассказываться в главе 14.) После того, как вы сделаете свой выбор, boot 0 отыщет и загрузит все, что находится в загрузочном секторе выбранной вами секции. Если FreeBSD является единственной операционной системой на данном жестком диске, это меню не появится, и загрузочный сектор FreeBSD будет считан незамедлительно. Меню загрузчика и ядро Блоки начальной загрузки bootl и boot2 ведут к программе-загрузчику, в обязанности которой входит предоставить пользователю интерфейс, с помощью которого он мог бы управлять ядром. Как вы увидите, ядро является "сердцем* операционной системы и загружается только после того, как в память будет загружена вся инфраструктура загрузочного дискового раздела. Меню загрузчика, которое так же, как и лежащая в основе процесса запуска схема разделов диска, более подробно будет описываться в главе 14, представляет собой текстовое меню, в котором отображается графический символ (изображение чертенка в формате ASCII) или текстовый логотип FreeBSD, а также ряд опций для загрузки FreeBSD в разные режимы, аналогич-
FreeBSD как настольная система ные режиму Safe Mode (Безопасный режим) и режиму MS-DOS Mode (Режим MS- DOS) в Windows. На рис. 4.1 показан пример того, как может выглядеть это меню. Рис. 4.L Меню загрузчика FreeBSD со списком доступных для выбора режимов загрузки В самом простом и наиболее распространенном случае вы просто во время деся- тисекундной паузы, которую вам предоставит загрузчик, нажмете клавишу <Enter> либо просто дождетесь, когда она закончится. После этого загрузится ядро, и процесс самозагрузки будет завершен. Ядро Стандартное ядро обычно находится в каталоге /boot /kernel и запускается утилитой loader. Как уже упоминалось ранее, ядро является "сердцем'* операционной системы. Оно управляет доступом ко всем аппаратным ресурсам, получаемым как программами, так и пользователями. Большинство строк, которые будут появляться на экране на этом этапе, будут отображаться в виде окрашенного в белый цвет текста с полужирным начертанием, а не в виде обычного экранного текста, который выделяется менее выразительным светло-серым цветом. Упомянутые строки — это так называемые сообщения состояния, которые ядро генерирует для вашего сведения по мере того, как оно находит и инициализирует устройства. Большинство из этих сообщений будут отображаться и исчезать слишком быстро для того, чтобы вы успели их прочитать, но после того, как вы войдете в систему, вы сможете воспользоваться командой dmesg | more и просмотреть их все по одному на отдельных экранах, нажимая клавишу пробела для перехода к следующему экрану. Сообщения, генерируемые ядром при запуске системы, могут представлять для вас интерес по разным причинам (например, они могут помочь вам выявить причину неполадок в оборудовании или определить, какое имя устройства FreeBSD при-
Загрузка и завершение работы FreeBSD I 7TZ I Глава 4 I I своила тому или иному компоненту). Давайте рассмотрим несколько примеров таких генерируемых ядром сообщений. Первый пример позволит понять, какие в принципе сообщения вы будете видеть и что они означают (обратите внимание на то, что ваши сообщения могут отличаться от приводимых здесь, что зависит от типа установленного в вашей системе оборудования): 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 6.1-RELEASE #0: Thu Nov 3 09:36:13 UTC 2005 root@x64.samsco.home:/usr/obj/usr/src/sys/GENERIC В первых трех строках содержится просто информация об авторских правах. В четвертой строке отображается номер версии операционной системы и номер версии ядра (номер версии ядра будет увеличиваться на единицу после каждой перекомпиляции ядра), а также дата и время компиляции ядра. В первой части пятой строки отображается имя пользователя и локальный электронный адрес человека, который скомпилировал ядро. В данном случае, ядро GENERIC было скомпилировано пользователем root@x64 . samsco.home (это внутренний адре<; разработчиков FreeBSD) и просто скопировано в систему во время установки. Если вы компилируете ядро самостоятельно (о том, как это делать, будет рассказываться в главе 18), в этой строке будет отображаться ваш личный электронный адрес и имя хоста вашей машины. Во второй части пятой строки отображается имя каталога, в котором компилировалось ядро. (Специалистам по программированию на языке С будет интересно узнать, что именно здесь они смогут найти некоторые файлы исходного С-кода, файлы заголовков и файлы объектов, из которых компилировалось данное ядро, а также файл сборки ядра.) Следующее сообщение информирует о том, что ядро определило тип центрального процессора и встроенные в него возможности, а также объем доступной в данной системе памяти: Timecounter "i8254" frequency 1193182 Hz quality 0 CPU: Pentium II/Pentium II Xeon/Celeron (400.91-MHz 686-class CPU) Origin = "Genui'nelntel" Id = 0x653 Stepping = 3 Features=0xl83f9ff<FPU, VME,DE,PSE,TSC,MSR,РАЕ,MCE,CXB,SEP,MTRR,. 4>PGE, MCA, CMOV, PAT, PSE36,MMX, FXSR> real memory - 402653184 (3S4 MB) avail memory = 384602112 (366 MB) СОВЕТ Доступ к информации ядра, которая отображается на экране во время загрузки (такая как сообщения о том, кому принадлежат права на пользование продуктом FreeBSD, и сведения о среде, в которой компилировалось ядро) можно получить в любое время: для этого следует просто ввести cat/var/run/dmesg.boot. Это очень удобно, если возникла необходимость выявить неполадки в оборудовании или узнать, какие имена FreeBSD присвоила устройствам. Упоминавшаяся ранее команда dmesg позволяет отображать содержимое буфера сообщений ядра, которое может обновляться новыми сообщениями, если система работает длительное время. После этого сообщения начнут появляться длинные перечни распознанных FreeBSD устройств. Эти перечни будут выглядеть по-разному, что зависит от того, какое оборудование установлено в данной системе. Ниже приводится пример такого
128 FreeBSD как настольная система Часть II перечня, в котором перечисляются такие устройства, как материнская плата, контроллеры шин PCI и AGP, контроллеры АТА, USB-концентраторы и карты Ethernet (обратите внимание на имя драйвера, которое FreeBSD присваивает карте Ethernet — fxpO; это очень важно): npxO: [FAST] npxO: <math processors on motherboard npxO: INT 16 interface cpuO on motherboard pcibO: <Intel 82443BX (440 BX) host to PCI bridge> pcibus 0 on motherboard pirO: <PCI Interrupt Routing Table: 7 Entries> on motherboard pciO: <PCI bus> on pcibO agpO: <Intel 82443BX (440 BX) host to PCI bridge> mem 0xe0000000-0xe3ffffff **>at device 0.0 on pciO pcibl: <PCI-PCI bridge> at device 1.0 on pciO pcil: <PCI bus> on pcibl $PIR: ROUTE_INTERRUPT failed. pcil: <display, VGA> at device 0.0 (no driver attached) isabO: <PCI-ISA bridge> at device 7.0 on pciO isaO: <ISA bus> on isabO atapciO: <Intel PIIX4 UDMA33 controller port Oxlf0-0xlf7,0x3f6,0x170-0x177, *>0x376,0xf000-0xf00f at device 7.1 on pciO ataO: <ATA channel 0> on atapciO atal: <ATA channel 1> on atapciO uhciO: <Intel 82371AB/EB (PIIX4) USB controller> port 0xe000-0xe01f irq 10 at ^device 7.2 on pciO uhciO: [GIANT-LOCKED] 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 pciO: <bridge> at device 7.3 (no driver attached) fxpO: <Intel 82557 Pro/100 Ethernet> port 0xe400-0xe41f mem 0xe9200000-0xe9200fff, <*>0xe9100000-0xe91fffff irq 9 at device 11.0 on pciO miibusO: <MII bus> on fxpO inphyO: <i82555 10/100 media interface> on miibusO inphyO: lObaseT, lObaseT-FDX, lOObaseTX, lOObaseTX-FDX, auto fxpO: Ethernet address: 00:a0:c9:66:7b:32 Следующее сообщение информирует о том, что ядру удалось обнаружить мышь и определить, что это мышь типа PS/2, после чего оно присвоило этой мыши имя устройства psmO для того, чтобы ссылаться на нее дальше с помощью этого имени: psmO: <PS/2 Mouse> irq 12 on atkbdcO psmO: [GIANT-LOCKED] psmO: model Generic PS/2 mouse, device ID 0 fdcO: <Enhanced floppy controller> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isaO fdcO: [FAST] fdO: <1440-KB 3.5" drive> on fdcO drive 0 Ядру также удалось обнаружить контроллер и дисковод гибких дисков, f dcO — это имя устройства, которое оно присвоило контроллеру гибких дисков, a f d0 — имя устройства, которое оно присвоило самому дисководу гибких дисков. (Имя f d0 аналогично имени А:, которое используется для обозначения дисководов гибких дисков
Загрузка и завершение работы FreeBSD Глава 4 129 в Windows/DOS. Именно это имя вы будете указывать, когда захотите получить доступ к этому устройству.) Следующее сообщение информирует о том, что ядру удалось обнаружить звуковую карту SoundBlaster AWE 64, а также о том, какие ресурсы использует эта карта: sbcO: <Creative SB AWE64> at port 0x220-0x22f,0x330-0x331,0x388-0x38b ^irq 5 drq 1,5 on isaO pcml: <SB16 DSP 4.16> on sbcO Обратите внимание, что в данном случае sbcO фактически является именем для целой группы устройств, имеющих отношение к звуковой карте. Звуковая карта использует несколько устройств, в зависимости от того, какими возможностями хочет воспользоваться пользователь, а именно: dsp, через который производится вывод таких файлов, как WAV и МРЗ, и mixer (микшер), позволяющий изменять уровень громкости различных аудиоустройств. Среди сообщений, появляющихся при запуске, могут промелькнуть и такие строки: unknown: <PNP0303> can't assign resources (port) unknown: <PNP0c01> can't assign resources (memory) unknown: <PNP0a03> can't assign resources (port) unknown: <PNP0fl3> can't assign resources (irq) unknown: <PNP0501> can't assign resources (port) unknown: <PNP0700> can't assign resources (port) неизвестное: <PNP0303> не удается назначить ресурсы (порт) неизвестное: <PNP0c01> не удается назначить ресурсы (память) неизвестное: <PNP0a03> не удается назначить ресурсы (порт) неизвестное: <PNP0fl3> не удается назначить ресурсы (irq) неизвестное: <PNP0501> не удается назначить ресурсы (порт) неизвестное: <PNP0700> не удается назначить ресурсы (порт) Эти строки показывают, что ядру удалось обнаружить какие-то устройства Plug and Play (для обозначения которых часто используется аббревиатура ttPnPw), но ему ничего о них неизвестно и поэтому оно не может выделить для них никаких ресурсов. Такие сообщения являются совершенно безобидными. Если вы не хотите их видеть, тогда знайте, что, как сказано в разделе FAQ (часто задаваемые вопросы) на сайте FreeBSD, "разработчики проекта FreeBSD с удовольствием рассмотрят ваши предложения в виде драйверов, которые вы можете отсылать через send-pr". (В принципе, это обращение к вам, специалисты по программированию на языке С, кому практически ничего не стоит написать драйверы устройств и внести свой вклад в развитие проекта FreeBSD как проекта с открытым исходным кодом.) Следующее сообщение информирует о том, что ядру удалось обнаружить жесткие диски и привод CD-ROM; в нем содержатся различные сведения о каждом диске, такие как имя устройства, размер, производитель и модель, геометрические показатели и название контроллера, на котором находится данный диск: adO: 19473MB <Maxtor 92049U6> [39566/16/63] at ata(bmaster UDMA33 adl: 14664MB <IBM-DJNA-351520> [29795/16/63] at atal-master UDMA33 acdO: CDROM <ATAPI 44X CDROM/VER-3.40> at atal-slave UDMA33 Также оно информирует и о том, какой режим доступа использует каждый диск. В данном случае оба жестких диска и CD-ROM используют режим Ultra DMA 33. (Подробнее об этом будет рассказываться в главе 20.)
FreeBSD как настольная система Последнее сообщение показывает, что ядро пытается смонтировать корневую файловую систему: Trying to mount root from ufs:/dev/adOsla Попытка монтирования корневой файловой системы из ufs:/dev/adOsla Тот факт, что система работает, будет указывать на то, что ему удалось это сделать. Смонтировав корневую файловую систему, ядро передаст управление процессу под названием init. Во время выполнения этого процесса на экране будут появляться сообщения светло-серого цвета. Сообщения ядра от других сообщений можно отличить по цвету. Сообщения ядра отображаются белым цветом, а все остальные — светло-серым. init Программа init по сути является первым процессом, который запускается в операционной системе, и поэтому имеет идентификационный номер (process ID), равный 1. init отвечает за запуск всех остальных процессов, которые превращают систему в функциональную операционную систему; но прежде всего init проверяет, являются ли имеющиеся диски пригодными для использования (то есть находятся ли они в подходящей форме). Когда работа FreeBSD завершается корректно, она (FreeBSD) на каждом диске запускает программу под названием sync, чтобы удостовериться в том, что сохранены были все данные, затем демонтирует файловые системы и помечает их флагом "clean" ("чистая"). Этот процесс похож на тот, через который проходит система Windows при завершении работы. Если работа FreeBSD завершается некорректно, флаги "clean" установлены не будут. Проверка целостности файловой системы Первое, что делает init — это проверяет, установлен ли флаг "clean". Если да, init монтирует файловую систему для использования. Если нет, init сначала запускает в этой файловой системе программу f sck, чтобы удостовериться в том, что она не повреждена. Эта программа устраняет все обнаруживаемые повреждения, которые она знает, как исправить, f sck похожа на программу Scandisk, которая используется в Windows, и выполняемая ею процедура похожа на процедуру "Your system was not properly shut down" ("Работа системы была завершена некорректно"), которая выполняется при загрузке Windows после некорректного завершения работы. Если f sck обнаруживает ошибку, которую не может исправить на данном этапе, она переводит систему в однопользовательский режим для того, чтобы системный администратор (которым, возможно, являетесь вы сами, раз уж читаете эту книгу) мог сделать необходимые исправления вручную. Если флаг clean установлен или, если флаг не был установлен, но f sck удалось исправить повреждения, init затем начинает монтировать все файловые системы, которые перечислены в файле /etc/f stab и у которых установлен флаг mount at boot (монтировать при загрузке) (см. раздел "Файл /etc/f stab" в главе12). СОВЕТ При необходимости f sck можно запустить и вручную. Более подробно о f sck и поддерживаемых ею опциях будет рассказываться в главе 12.
Загрузка и завершение работы FreeBSD I ТТ] I Глава 4 I I Сценарии конфигурации системы Смонтировав файловые системы, init считывает сценарии конфигурации системы (также называемые сценариями управления выполнением (Run Control) и сценариями конфигурации ресурсов (Resource Configuration) или, сокращенно, сценариями гс), которые находятся в каталоге /etc и /etc/defaults. Кроме того, init еще проверяет файл /usr/local/etc/rc.d, в котором могут находиться дополнительные сценарии, подлежащие запуску при загрузке системы (это могут быть сценарии для запуска Web-серверов, серверов баз данных или любых других программ, которые должны автоматически запускаться во время загрузки системы). Если вы знакомы с Windows или DOS, то знайте, что эта часть процесса загрузки FreeBSD похожа на ту часть процесса загрузки Windows, когда запускаются файлы config.sys, autoexec.bat, system.ini и элементы системного реестра Windows, отвечающие за опции запуска Windows. НА ЗАМЕТКУ Термин "сценарии гс" на самом деле происходит от термина "RunCom" или "run commands" ("команды запуска"), который появился приблизительно в 1965 году в исследовательских центрах Массачусетского технологического института, где его использовали для обозначения соответствующего средства в системе CTSS. Хотя с тех пор акроним мгсй применялся и во многих других значениях, его основной смысл остается прежним по сегодняшний день: он обозначает набор команд, которые хранятся в файле и запускаются в пакетном режиме. В мире UNIX значение акронима "гс" является настолько понятным, что знать, как он расшифровывается вовсе не обязательно, да многие и не знают. В этой книге мы еще не раз будем ссылаться на сценарии Run Control (для уровней выполнения в стиле Sun) и сценарии Resource Configuration, когда речь пойдет о собственных сценариях запуска FreeBSD. НА ЗАМЕТКУ Для полноты картины следует упомянуть, что init также выполняет проверку на наличие файла /etc/rc. local, который может использоваться для запуска таких программ, как Web-серверы. Однако этот файл считается устаревшим и в следующих версиях FreeBSD уже может не поддерживаться. Поэтому сейчас сценарии запуска рекомендуется размещать не в файле /etc/rc.local, а в файле /usr/local/etc/rc.d. Управление выполнением в BSD и в Sys V Если вы до этого пользовались Sys V UNIX, материал, изложенный в этом разделе, может показаться вам не совсем понятным. Вот вам пояснение: в используемой BSD программе init концепции "уровней выполнения" на самом деле не существует. Здесь скорее имеется однопользовательский режим и многопользовательский режим с сетевой поддержкой. В отличие от Sys V, многопользовательского режима без сетевой поддержки здесь нет. Также здесь нет и файла init tab, а в Sys V он есть. Кроме того, в BSD за (практически) все параметры запуска отвечает один единственный файл, который называется г с. conf. Никаких отдельных файлов, запускающих службы с помощью ссылок в каталогах различных уровней выполнения как в Sys V здесь тоже нет. (Об init более подробно будет рассказываться в главе 14.)
I 7Г1 I FreeBSD как настольная система 132 ¦ getty и login Прочитав сценарии, init запускает на консоли (и нескольких виртуальных терминалах) какую-нибудь программу. Обычно этой программой является программа getty, но не обязательно. Довольно часто вместо getty используется другая программа, которая ^называется xdm. xdm сразу же после загрузки системы запускает графический сеанс регистрации в X Window System (который похож на сеанс регистрации в NT). Запускаемая программа задается в файле /etc/ttys. В этой книге предполагается, что используется программа getty. Программа getty инициализирует терминал (или консоль), а также отвечает за его настройки и параметры безопасности. Опять-таки, эти параметры и их значения задаются в файле /etc/ttys. После того, как вы введете свое регистрационное имя (то есть имя пользователя) и пароль, getty запустит программу login, чтобы проверить их достоверность. Вход в систему FreeBSD После завершения всех процессов запуска на экране появятся примерно такие строки: FreeBSD/i386 (amnesiac) (ttypO) login: В первой строке отображается имя хоста, которое вы указали во время установки, а также значение, показывающее, какое консольное устройство используется для получения доступа к системе (это значение может выглядеть по-разному, что зависит от того, как получается доступ к системе (удаленно или локально) и сколько других пользователей уже подключилось; в данном случае значение ttypO показывает, что используется первый "псевдотелетайп", или удаленный терминал). Введите то имя пользователя, которое вы во время установки создали для обычного (не root) пользователя. Нажмите клавишу <Enter> и затем, когда появится соответствующее приглашение, введите пароль, который вы указали для этого пользователя во время установки. Обратите внимание на то, что пароль отображаться на экране не будет. На самом деле, на экране вообще ничего не будет отображаться. Но вы не волнуйтесь: ваш пароль считывается. После того, как вы введете пароль, программа login проверит базу данных паролей на наличие совпадений. Если ей удастся найти совпадение, на экране появится приблизительно такая информация: Last login: Tue Apr 10 15:19:17 on ttypO Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 6.1-RELEASE #0: Thu Nov 3 09:36:13 UTC 2005 > Если вы вошли в систему через учетную запись обычного пользователя впервые, первой строки (Last login) вы можете и не увидеть. Но зато, когда вы будете входить в систему в следующий раз, эта строка уже будет присутствовать.
Загрузка и завершение работы FreeBSD Глава 4 133 ВНИМАНИЕ! Обращайте внимание на информацию в строке "Last login". Если, например, FreeBSD сообщает, что последний раз вы входили в систему в субботу, 30 сентября, в 14:05:29 (Sat Sept 30 14:05:29), а вы точно знаете, что не пользовались системой, начиная с 23 сентября, значит, кто- то другой в это время подключался к системе через вашу учетную запись. Если подобное случится, немедленно измените свой пароль (воспользовавшись командой passwd и следуя выдаваемым ею инструкциям). Также не забудьте сообщить об этом нарушении системы безопасности своему системному администратору (если только вы сами не являетесь им). А если вы и есть системный администратор, тогда прочтите главу 30; в ней вы сможете узнать о том, что следует делать, если возникли подозрения о нарушении системы безопасности. В остальных строках будет отображаться информация об авторских правах, а также о ядре и дате его сборки. В последней строке будет отображаться приглашение командной оболочки. Появление приглашения командной оболочки означает, что FreeBSD ждет от вас ввода какой-нибудь команды. ВНИМАНИЕ! Обратите внимание на то, что символ, обозначающий приглашение на ввод команды, отображаемый в этом случае, отличается от того, который вы видели в прошлый раз (когда входили в систему через учетную запись пользователя root). В приглашении на ввод команды для пользователя root используется знак фунта (#). А в приглашении на ввод команды для обычного пользователя используется либо знак доллара ($) (если это программная оболочка в стиле Bourne, либо знак процентов (%) или знак < (если это программная оболочка в стиле С). В FreeBSD no умолчанию используется программная оболочка tcsh, которая является программной оболочкой в стиле С. В любом случае, по используемому 8 приглашении на ввод команды знаку вы всегда сможете определить, через какую учетную запись вы вошли в систему: через учетную запись пользователя root или учетную запись обычного пользователя. Если вы вошли в систему через учетную запись пользователя root, будьте предельно внимательны при вводе потенциально опасных команд. ? . Если вы неправильно введете имя пользователя или пароль, FreeBSD отобразит следующее сообщение: Login incorrect login: Неверная регистрация пользователь: В этом случае просто попробуйте ввести имя пользователя и пароль заново. СОВЕТ Если вы неправильно введете имя пользователя или пароль три раза подряд, вам может показаться, что система зависла, потому что ничего не происходит. Не волнуйтесь. Система не висит. Эта задержка возникает в результате срабатывания встроенной в ядро функции безопасности, которая помогает снизить вероятность проникновения в систему программ, взламывающих пароли путем подбора слов. Время задержки может увеличиваться с каждым неправильным вводом имени пользователя или пароля после третьего раза. Просто подождите несколько секунд, и на экране снова появится приглашение ввести имя пользователя и пароль.
FreeBSD как настольная система Выход из системы FreeBSD Когда вы закончили работу с FreeBSD (или вам необходимо ненадолго покинуть свой компьютер), вы должны выйти из системы. Это не позволит никому постороннему воспользоваться вашим компьютером или терминалом и получить доступ к вашей учетной записи во время вашего отсутствия. Чтобы выйти из FreeBSD, просто в командной строке введите logout или exit. После этого на экране должно снова появиться приглашение ввести имя пользователя и пароль для входа в систему, которое вы видели, когда FreeBSD только загрузилась. СОВЕТ Если вы работали над чем-то таким, что вы не хотите, чтобы увидели другие, когда будут проходить мимо вашего компьютера, вы можете очистить экран перед выходом из системы путем ввода в командной строке команды clear. После этого вы можете выйти из системы, как описывалось выше. Завершение работы системы FreeBSD Как уже упоминалось в главе 2, очень важно, чтобы перед выключением питания вы корректно завершили работу FreeBSD (или любой другой ОС Unix). Нарушение этого правила может привести к серьезным повреждениям файловой системы. Диски в UNIX рассматриваются так, будто они содержат файловые системы, которые обслуживаются систематически; если завершить работу Windows, просто резко выдернув шнур питания, после перезагрузки на дисках будут находиться фрагменти- рованные файлы, но система сможет с ними справиться. Однако, FreeBSD — как и большинство UNIX-систем — записывает данные на диск таким образом, что уровень фрагментации остается очень низким, но зато внезапное отключение питания может привести к тому, что система утратит все данные, которые были активными на тот момент. У FreeBSD имеется механизм, который называется Soft Updates и может помочь справиться с этой проблемой; более подробно о Soft Updates будет рассказываться в главе 12. Использование команды shutdown Правильно завершить работу системы можно с помощью команды shutdown, с которой вы уже встречались в главе 2, в разделе "Завершение работы FreeBSD". Однако прежде чем взять и завершить работу системы, ознакомьтесь с несколькими другими опциями этой команды, которые описываются ниже. Базовый синтаксис команды shutdown выглядит так: shutdown option when broadcast message Первый аргумент указывает команде shutdown , что делать, второй аргумент — когда это делать, а третий — какое сообщение должно быть отправлено всем подклю ченным пользователям. В табл. 4.1 перечислены опции, которые могут использоваться на месте элемента option в команде shutdown, и объясняется, что они делают.
Загрузка и завершение работы FreeBSD 135 Глава 4 Таблица 4.1. Опции команды shutdown Опция Результат Опции не указаны Все пользователи выбрасываются из системы, после чего система переводится в однопользовательский режим без сетевой поддержки. Такой подход является не совсем этичным по отношению к пользователям, но зато он быстрый и эффективный. -h Останавливает работу системы. "Р Останавливает работу системы и отключает питание (если система поддерживает автоматического отключение питания, а ядро — управление электропитанием). "г Перезагружает систему. "к Выбрасывает всех из системы и блокирует доступ (то есть больше не позволяет подключаться к системе никому, кроме пользователя root). Однако в случае, когда используется эта опция, система остается в многопользовательском режиме и может работать в сети. Она может пригодиться в ситуации, когда система нуждается в срочном техническом обслуживании, но для выполнения этой задача требуется доступ в сеть. "° Завершает работу системы, не отправляя сигнала программе imt Этой опцией лучше не пользоваться, потому что она не позволяет выполняться используемым программами сценариям завершения работы. "п Если была указана опция -о, эта опция не допускает очистки кэша файловой системы перед завершением работы. Этой опцией лучше никогда не пользоваться, потому что она может привести к потере данных. Аргумент, отвечающий за то, когда должна быть завершена работа, можно задать несколькими способами. Как рассказывалось в главе 2, ключевое слово now указывает команде shutdown выполнить операцию завершения работы немедленно. Команда shutdown также распознает формат +п, где п — это количество минут, которые shutdown должна подождать, прежде чем начать выполнять операцию завершения работы (что дает пользователям время сохранить свои файлы и закрыть свои программы). Вы также можете применять формат yymmddhhmm, чтобы указать точное время, когда должна быть выполнена операция завершения работы. В данном случае у у — это год, mm — месяц, dd — день, hh — часы (в 24-часовом формате) и mm — минуты. Если год, месяц и день не указаны, shutdown предполагает, что операция завершения работы должны быть выполнена сегодня. Если вы укажете время, которое уже прошло, shutdown обязательно обратит на это ваше внимание (то есть вернет соответствующее сообщение об ошибке). Опция broadcast message (широковещательное сообщение) позволяет ввести уведомляющее о завершении работы сообщение, которое будет отправляться всем подключенным пользователям через определенные интервалы времени. Это сообщение начинает рассылаться за 10 минут до завершения работы, и по мере приближения указанного срока отображается пользователям все чаще и чаще. Ниже для примера приводится пошаговое описание типичного процесса завершения работы, в котором используется 10-минутная задержка (не вводите сейчас эту команду, если на самом деле не хотите ждать целых десять минут до завершения работы системы): # shutdown -h +10 Hard disk needs to be replaced
136 FreeBSD как настольная система Часть II Эта команда запустит программу shutdown и будет выполнять ее в фоновом режиме. Работа системы будет остановлена через десять минут. Кроме того, на терминалах всех пользователей появится следующее сообщение: *** System shutdown message from rootQsimba.somewhere.com *** System going down in 10 minutes Hard disk needs to be replaced *** Сообщение о завершении системы от rootQsimba.somewhere.com *** Работа системы будет завершена через 10 минут Требуется произвести замену жесткого диска За пять минут до завершения работы (или сразу же, если в качестве задержки было указано меньше пяти минут), программа shutdown автоматически создаст файл /var/ run /no login. Этот файл будет предотвращать все дальнейшие попытки входа в систему и отображать указанное сообщение о завершении работы каждому, кто будет пытаться получить доступ в систему, shutdown поместит в этот файл информацию о времени завершения работы и текст широковещательного сообщения. В нашем примере каждый, кто попытается войти в систему увидит следующее сообщение: NO LOGINS: System going down at 17:57 Hard disk needs to be replaced Вход в систему запрещен: работа системы будет завершена в 17:57 Требуется произвести замену жесткого диска Когда обратный отсчет указанного для задержки времени заканчивается, выполняются следующие операции: • Программе init отправляется сигнал TERM, что прекращает создание любых новых процессов. • init считывает файл /etc/re.shutdown и выполняет все содержащиеся в нем сценарии завершения работы программ. • Всем процессам отправляется сигнал TERM и предоставляется время на то, чтобы они могли сами спокойно завершиться. • Тем процессам, которые не отвечают на сигнал TERM в течение определенного времени, посылается сигнал KILL, проигнорировать который они просто не могут. Это приводит к принудительному завершению работы процессов. • Данные, находящиеся в кэше, записываются в файловые системы с помощью команды sync. Далее все файловые системы демонтируются, и устанавливается флаг clean. • Останавливается работа ядра. Кроме того, shutdown еще вносит запись в системный журнал, указывая время, когда была выполнена операция завершения работы, и кто ее выполнил. НА ЗАМЕТКУ Завершить работу системы вы можете только в случае наличия у вас прав пользователя root, получить которые вы можете либо подключившись к системе через учетную запись пользователя root, либо воспользовавшись командной su или sudo, которая позволяет определенным пользователям выполнять одноразовые административные задачи.
Загрузка и завершение работы FreeBSD I TTZ J Глава 4 I I Чтобы завершить работу системы прямо сейчас, вы должны перезагрузить компьютер, поэтому введите в командной строке команду su (которая расшифровывается как "super-user", то есть "суперпользователь") и нажмите клавишу <Enter>. Эта команда временно предоставит вам привилегии пользователя root. Введите пароль пользователя root, когда появится соответствующее приглашение. Если после этого вы получите сообщение, информирующее о том, что членам группы, к которой вы относитесь, нельзя использовать команду su, выйдите из системы и снова войдите в нее, но уже через учетную запись пользователя root. Затем, если в системе нет других пользователей, введите следующую команду: # shutdown -h now Как уже упоминалось в главе 2, в многопользовательской системе завершать работу подобным образом вы бы не стали. Вместо этого вы бы как-то предупредили пользователей о том, что скоро работа системы будет завершена. После того, как операция завершения работы будет выполнена, появится следующее сообщение: System halted Please press any key to reboot Работа системы остановлена Пожалуйста, нажмите любую клавишу, чтобы перезагрузить систему Теперь, и только теперь, вы можете спокойно выключить компьютер. Полезная информация о командах halt и reboot Для остановки работы и перезагрузки системы можно использовать и две другие команды: halt и reboot, соответственно. Однако пользоваться ими регулярно не рекомендуется. Ни одна из этих команд не запускает сценарий г с. shutdov/n что может приводить к некорректному завершению работы некоторых npoi рамм. Также ни одна из этих программ не позволяет вам ни указывать время задержки, ни отправлять пользователям предупреждение о завершении работы системы. Поэтому для остановки системы лучше всегда применяйте команду shutdown. Однако у программ halt и reboot есть и свои преимущества. Например, вы можете использовать halt для того, чтобы сделать систему на 100% безопасной для отключения электропитания после того, как вы завершили работу всех многопользовательских процессов с помощью команды завершения (shutdown). Команда reboot тоже может оказаться удобной, если вы работаете в однопользовательском режиме: она просто "убивает" все запущенные процессы при помощи сигнала SIGKILL (который не может быть проигнорирован) и сразу же перезагружает компьютер. Эти команды позволяют сэкономить время в случаях, когда их использование является безопасным, но такие случаи бывают крайне редко. НА ЗАМЕТКУ Если вы до этого работали в DOS или Windows, вы наверняка привыкли пользоваться клавиатурной комбинацией <Ctrl+Alt+Delete> для перезагрузки системы. По умолчанию FreeBSD будет перехватывать сигнал, посылаемый при нажатии этой клавиатурной комбинации, и выполнять те же операции, что и при запуске команды reboot. Это может представлять проблему в ситуации, когда к клавиатуре сервера имеют доступ и обычные пользователи, потому что позволяет им перезагружать систему и без привилегий пользователя root.
5 ГЛАВА Работа с системой X Window System В этой главе... • Знакомство с XII • X Server • Оконные диспетчеры • KDEhGNOME • Работа с оконными диспетчерами • Оконный диспетчер Window Maker
FreeBSD как настольная система В этой главе речь пойдет о программе X Window System, которая также называется XI1 или X и представляет собой в мире UNIX эквивалент операционной среды Windows. Для систем UNIX графические пользовательские интерфейсы, подобные тем, что применяются в Windows и Mac OS X, раньше практически не разрабатывались, а все потому, что системы UNIX чаще всего использовались в роли сервера, где в дружественных к пользователю средах нет почти никакой необходимости. Однако в последнее время многие люди стали заменять свои настольные операционные системы Windows на Linux и FreeBSD, в результате чего стало появляться все больше и больше программ, ориентированных на улучшение старой и очень сложной системы управления окнами XII. X Window System состоит из двух компонентов: сервера X Server и оконного диспетчера. X Server запускается на системе в виде демона и предоставляет приложениям для работы графическую среду. Оконный диспетчер отвечает за внешний вид и поведение среды XII. В этой главе вы сможете подробнее узнать о том, что собой представляют эти два компонента, научиться работать^ в пользовательской среде KDE и настраивать ее, а также переключаться с одного оконного диспетчера на другой, если установленный диспетчер вас не устраивает. Знакомство с X11 XII — это комплект программ, которые были разработаны специалистами Массачусетского технологического института и другими приверженцами ПО с открытым кодом за последние двадцать лет Текущая реализация XII, разработанная и продвигаемая ассоциацией X.org Foundation, называется Xorg. Как уже упоминалось в 1лаве 2 XI1 имеет архитектурную модель типа "клиент-сервер", которая прекрасно подходит для кластерных конфигураций рабочих станций, но может также достаточно хорошо работать и на настольном, используемом единственным пользователем компьютере, если понять концепцию, которая скрывается за ее кажущимся на первый взгляд довольно необычным дизайном: в частности то, почему существует разграничение между такими ее компонентами как X Server (который является, так сказать, ядром этой системы управления окнами, и которому достается вся самая тяжелая работа) и оконный диспетчер. Как и более ранние версии Microsoft Windows, XI1 представляет собой графическую "оболочку**, которая запускается поверх использующего командную строку ядра операционной системы. То есть сначала пользователь попадает в среду командной строки, а затем переходит в управляемый при помощи мыши графический режим, где он может запускать такие приложения, как Web-браузеры и текстовые процессоры. Когда он выходит из сеанса XII, он снова попадает в командную строку оболочки. XII сама по себе имеет очень элементарную структуру. Все, что XII делает — это помещает интерфейс компьютера в "графический режим" (вместо обычного текстового), запуская программы в отдельных окнах, которые могут прорисовываться в разных частях экрана. Однако без оконного диспетчера XII отображает только простые, ничем не украшенные, не имеющие заголовков окна программ, которые нельзя ни передвинуть, ни увеличить, ни уменьшить. XII сама по себе не предоставляет ни меню, ни утилит, ни даже механизма для перемещения окон. Для этого нужен уже оконный диспетчер и другие дополнительные инструментальные средства, все из которых запускаются в среде XI1 и выполняют задачи, обычно считающиеся присущими только настольной среде.
Работа с системой X Window System I 773 I Глава 5 I I Наиболее популярными диспетчерами являются FVWM, Windows Maker, AfterStep и XFce; все они имеют свой особенный внешний вид и поведение, а некоторые из них очень точно повторяют внешний вид и поведение Microsoft Windows, Sun CDE, NeXTSTEP и других популярных пользовательских сред, которые в разные годы разрабатывались для разных операционных систем. Кроме этого, доступны также и более сложные и "отшлифованные" пользовательские среды, которые гораздо больше подходят для повседневного использования системы в качестве настольной, чем обычные оконные диспетчеры; среди них особенно выделяются KDE и GNOME. Установить оконные диспетчеры можно как из коллекции пакетов, так и из коллекции портов, где они доступны в категории /usr/ports/xll-wm (процедура установки ПО с помощью коллекции портов подробно описывается в главе 16). Если вы сконфигурировали систему XI1 во время процесса установки FreeBSD (как описывалось в главе 2, в разделе "Настройка системы X Window System (XI1)") или позже, вы сможете запустить ее сейчас при помощи команды startx. X Server X Server — это базовая среда, позволяющая запускаться графическим приложениям. Сам по себе компонент X Server не особенно полезен: он представляет собой просто механизм, отвечающий за размещение базового окна и прорисовку окон приложений, и не имеет никаких возможностей для управления окнами вроде возможности перемещать окно путем его перетаскивания при помощи мыши. На рис. 5.1 показан X Server, запущенный без оконного диспетчера. Рис. 5Л. Здесь показан сеанс X без оконного диспетчера, который из-за этого является очень примитивным и практически бесполезным
142 FreeBSD как настольная система Часть II В показанном на этом рисунке сеансе XII работают несколько приложений: xterm (окно терминала командной оболочки), часы, калькулятор и программа для обработки изображений GIMP, использовавшаяся для получения данного снимка экрана. Обратите внимание на то, что у окон нет ни строк заголовков, ни рамок. Их нельзя ни увеличить, ни уменьшить, ни свернуть, ни развернуть. Очевидно, что отсутствие таких возможностей делает данный графический пользовательский интерфейс почти совершенно бесполезным. Вот где на сцену выходит оконный диспетчер. Оконные диспетчеры Оконный диспетчер отвечает за то, как выглядит и как работает графическая среда (то есть за ее внешний вид и поведение). И, что, пожалуй, является наиболее яркой демонстрацией преимуществ ПО с открытым кодом, для FreeBSD, благодаря XII, доступна не одна единственная система управления окнами, как это обычно случается с коммерческими операционными система, а десятки различных оконных диспетчеров, поведение которых отличается так же, как и вкусы пользующихся ими людей. Практически все эти оконные диспетчеры поддерживают такую функциональную возможность, как "темы рабочего стола", которая позволяет изменять элементы интерфейса и настраивать их по своему вкусу. Если пользователю не нравится, как XI1 выглядит или работает, он может либо настроить существующий оконный диспетчер, либо вообще переключиться на совершенно другой диспетчер. На рис. 5.2. показан тот же сеанс, что и на рис. 5.1, только на этот раз с диспетчером Window Maker. $L (Creating b9 iwee Tlbraru. Vwotlf&f J* J& A ¦ Creatine Icon setup library /rd Creating plxeap library /root/q Creatine sound library /root/GN Creating sound «at library /rod Installation Finished J maker warning; A-oot/GNuetap/ll t configuration. | weaker uaming: could not allod unaker warning: could not get d wnaker warning; using default 1 unaker warn ng: could not allod junakar warning: could not get d, J & о и * »^J I mm* bated with defaul | Рис. 5.2. Оконный диспетчер, такой как Window Maker, делает пользовательскую среду более совершенной, предоставляя пользователю элементы для управления окнами и утилиты для работы с интерфейсом
т Работа с системой X Window System I 7ТГ I Глава 5 I I На этом рисунке видно, что теперь у окон запущенных приложений имеется строка заголовка и элементы управления, позволяющие разворачивать и закрывать их. Эти окна можно увеличивать, уменьшать и перемещать. В правой части рабочего стола отображается меню, позволяющее запускать приложения щелчком на соответствующей пиктограмме. Если на этом рабочем столе щелкнуть правой кнопкой мыши, появится еще одно меню, в котором можно будет выбирать различные опции. Когда вы впервые сконфигурировали XI1 и запустили свой первый графический сеанс в главе 2, оконным диспетчером, который FreeBSD выбрала по умолчанию, был диспетчер TWM, который предлагает минимальную пользовательскую среду с очень примитивным оформлением окон и минимальным набором элементов управления. В TWM мало что можно делать: можно запускать реализуемые в виде окон программы, вводя их имена в командной строке в окне xterm, можно перемещать окна и изменять их размер, можно завершать процессы, щелкая на них должным образом, и это в принципе все. Ни тебе пиктограмм, ни диспетчера файлов, ни программы для настройки предпочтений. Даже указать рисунок, который должен использоваться в качестве фона рабочего стола, можно только при помощи дополнительных программ. Для опытных пользователей UNIX, которые стараются избегать всяких излишеств, TWM вполне подходит, но если вы будете часто пользоваться XII для работы в графическом режиме, вы почувствуете потребность во всех тех встроенных функциональных возможностях, к которым мы все так привыкли в современных настольных операционных системах. К счастью, для удовлетворения этой потребности FreeBSD предлагает даже не один, а целых два пакета полнофункциональных пользовательских сред, разработанных специально для этой цели: это KDE и GNOME. KDE и GNOME Чуть позже в этой главе мы обязательно расскажем о том, как правильно пользоваться оконными диспетчерами, такими как Windows Maker и FVWM. Однако сейчас давайте обратим внимание на две доступных пользовательских среды, поведение которых больше похоже на поведение Windows и Mac OS X, чем поведение оконных диспетчеров. Как это часто и бывает в мире ПО с открытым кодом, KDE и GNOME, две наиболее широко используемые и наиболее активно совершенствуемые пользовательские среды для UNIX, имеют свои как очень впечатляющие преимущества, так и, что неизбежно, свои определенные недостатки. Также у обеих из них есть свои ярые поклонники среди пользователей бесплатных систем UNIX. В этой книге для демонстрации технологий, необходимых для настройки полнофункциональной графической пользовательской среды в FreeBSD, нам придется выбрать только какой- нибудь один из этих пакетов: в принципе рассматривать подробно оба пакета (то есть и KDE, и GNOME) нет никакой необходимости, потому что они оба предоставляют практически одни и те же преимущества пользователю и имеют аналогичные, а в некоторых случаях даже идентичные, функциональные возможности (например, и в KDE, и в GNOME имеется встроенный Web-браузер и пакет офисных приложений). Среда KDE в работе скорее похожа на Windows названиями интерфейсных элементов и оформлением (например, меню Start (Пуск) и подобными доступным в Windows управляющим кнопкам) и, на момент написания этой книги, более востребована в мире настольных технологий благодаря своим дополните 1ьным функ щ опальным возможностям, таким как возможность преобразования текста в речь и
144 FreeBSD как настольная система Часть II утилита управления паролями. Это делает KDE более привлекательной для обычного пользователя и пользователя-новичка FreeBSD по сравнению со средой GNOME (рис. 5.3), которая имеет более уникальный стиль оформления и набор названий интерфейсных элементов и также является гораздо более упрощенной, чем KDE, из-за чего она больше подходит для опытных пользователей UNIX. По этой причине, а также потому, что версия FreeBSD под названием PC-BSD (с которой вам стоит познакомиться, если вас больше интересуют настольные технологии обработки данных, чем серверные приложения) разрабатывалась на основе именно среды KDE, в данной главе основное внимание будет уделяться среде KDE, a не GNOME. К счастью, процедуры установки KDE и GNOME очень похожи, поэтому если вам удастся успешно установить KDE, вы сможете без особых проблем установить и GNOME. Если хотите, попробуйте установить и ту, и ту другую, чтобы понять, какая из них вам больше подходит. KDE и GNOME представляют собой смелую попытку создать для UNIX и Linux ни что иное, как полнофункциональную многооконную среду, и имеют полный набор графических средств и элементов управления, опубликованную документацию по использованию интерфейса, вспомогательные аплеты и даже свои собственные встроенные приложения. Практически все приложения XII работают независимо от используемого оконного диспетчера, то есть, например, поведение программы, такой как xv, будет одинаковым и FVWM, и в Windows Maker, и в TWM, разным будет только стиль рамки ее окна. Однако программы, написанные для GNOME и KDE (наподобие Web-браузера Konqueror или почтового клиента Evolution), являются специализированными и подразумевают, что их будут запускать только в соответствующих родных средах. & АроЬ at on р а •» Ос fctop Ш Щ 1 а ¦L OwJ J-DX Ей* Edit tt«w Iermmal Tabs Ы*1р 41 О» ktop Pictures 41 file Ed<t yi«w Place* Help ? g»P cturte ^ 1 Item. Fr« space- 1Л <38 la .ft _M_ Рис. 53. GNOME, настраиваемая полнофункциональная пользовательская среда, гораздо меньше похожая на Windows no поведению, чем среда КОЕ
____ Работа с системой X Window System I TTZ I Глава 5 I I Некоторые из этих специализированных приложений не будут работать должным образом или вообще не будут работать до тех пор, пока вы не установите подходящую для них оконную среду: например, если вы запустите приложение GNOME в KDE, в нем может не отображаться текст из-за отсутствия ожидаемой архитектуры шрифтов. Этот недостаток, с точки зрения борцов за чистоту нравов, представляет собой печальный отход от традиционного агностицизма в плане оконных диспетчеров в UNIX, благодаря которому в любой настольной среде (оконном диспетчере) можно было запускать любое приложение. Однако, усовершенствованные технологии, лежащие в основе приложений KDE и GNOME, свидетельствуют о том, что доступные бесплатно настольные среды для UNIX наконец-то начали достигать уровня дисциплинированного пользования, столь популярного в таких настольных системах, как Windows и Mac OS. Установка KDE Несмотря на то что KDE представляет собой объемный пакет программ, устанавливается KDE достаточно легко. Самый простой способ установить KDE — это войти в систему через учетную запись пользователя root (или с помощью команды su временно получить привилегии пользователя root), установить соединение с Internet, если оно еще не установлено, и ввести такую команду: # pkg_add -r Jcde3 Эта команда подключается к FTP-серверу FreeBSD и пытается извлечь с него все необходимые программы, входящее в пакет I?DE 3.x. Этот процесс может занять час времени, а то и больше, поэтому наберитесь терпения; просто установка пакета KDE подразумевает установку и десятка зависимых программ, без которых KDE никак не обойтись. СОВЕТ Вы можете установить нужные пакеты и из программы Sysinstall, как рассказывалось в главе 2. Чтобы сделать это, введите sysinstall и затем перейдите сначала в раздел Configure (Настройка), а затем — в раздел Packages (Пакеты), чтобы отобразить список всех доступных пакетов. Пакет kde3 расположен в категории xll. \ Если выполнить команду pkgadd не удается (например, потому, что необходимых пакетов нет на сервере или по причине того, что при ее выполнении появляется ошибка типа "Broken pipe" ("Нарушенный конвейер")), вы можете попробовать установить KDE другим способом, а именно: самостоятельно скомпилировать KDE из доступного для общественного пользования исходного кода, воспользовавшись коллекцией портов (при условии, что вы установили ее, когда устанавливали FreeBSD в главе 2). О системе пакетов и коллекции портов более подробно будет рассказываться в главе 16. Сейчас пока что просто знайте, что вы должны ввести ряд следующих команд: # cd /usr/ports/xll/kde3 # make # make install # make clean
146 FreeBSD как настольная система Часть II После каждой из этих команд make FreeBSD будет извлекать самую последнюю версию исходного кода для каждого компонента KDE и компилировать ее в двоичный код. Этот процесс может занять несколько часов или даже дн й, что зависит от скорости используемого сетевого соединения и мощности компьютерного оборудования. Наберитесь терпения и дождитесь, когда будут выполнены все эти шаги. НА ЗАМЕТКУ KDE и многие из ее зависимых пакетов представляют собой "интеракт внье" порты что означает следующее: на определенном этапе во время конфигурир вания к ждого из них будет появляться текстовое меню, позволяющее вам выбрать и, наоборо , отмени ь в i6 p компонентов, которые вам нужны или не нужны. Запустив процесс компиляции, лучше далеко не у одите, дабы не получилось так, что FreeBSD отобразит интерактивное меню а в с р ом не , ом жет удлинить процедуру компиляции еще на несколько часов1 ВНИМАНИЕ! Полная установка KDE и всех ее компонентов, выбранных по умолчанию, занимает более 1 Гбайт дискового пространства, а в случае компиляции всех компонентов из исходного кода требуется еще как минимум 1 Гбайт. Убедитесь в том, что у вас есть, по меньшей мере, несколько гигабайт свободного пространства в разделе /us r прежде чем пытаться скомпилировать KDE с нуля. Также по завершении процесса компиляции не забудьте ввести к манду make с , эта коман да удалит весь исходный код и все скомпилированные объекты, которые после установки KDE уже больше не нужны. Вы можете не устанавливать полный комплект kde3, а установить только пакет kde lite, если для работы вам нужна только среда KDE, но не все ее занимающие массу пространства компонентные приложения. Когда все эти шаги выполнятся, KDE будет установлена на вашем компьютере, вам останется только сконфигурировать XII так, чтобы она использовал не оконный диспетчер TWM, что она делает по умолчанию, а графическую оболочку KDE Легче всего это будет сделать, настроив FreeBSD так, чтобы она использовала испетчер KDM, а не просто отображала обычное текстовое приглашение зарегистрир ваться. Включение диспетчера регистрации КОМ Откройте конфигурационный файл терминала etc tys в т ст вом р ак оре наподобие ее: # ее /etc/ttys При помощи клавиш с изображениями стрелок опуститесь до строки начинаю щейся со слова ttyv8; нажмите клавишу <Enter>, чтобы создать под ней нов>ю пу стую строку и введите следующий текст, чтобы активизировать графический диспет чер KDM (KDE Display Manager — диспетчер дисплея KDE): ttyv6 "/usr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 "/usr/XHR6/bin/xdm -nodaemon" xterm off secure ttyv9 " /usr/local/bin/kdm -nodaemon" xterm on se ure # Serial terminals
Работа с системой X Window System I TTZ I Глава 5 I I Затем нажмите клавишу <Escape> и <Enter>, после чего нажмите клавишу <Enter> снова, чтобы сохранить изменения и выйти из программы (то есть из текстового редактора). И, наконец, перезагрузите компьютер с помощью команды shutdown -r now. После перезагрузки на экране должно появится не обычное текстовое приглашение зарегистрироваться в системе, а графический экран регистрации, подобный показанному на рис. 5.4. Wei oroer to I reiBSl) ах s'mt a Ушло. шит -iniroirf^ ь J Рис. 5А. Экран регистрации, отображаемый диспетчером KDE и позволяющий пользователю работать в графическом режиме от запуска до завершения работы системы Введите свое имя пользователя в поле Username (Имя пользователя) (или выберите свое имя в списке пользователей, который отображается в левой части экрана), далее в поле Password (Пароль) введите свой пароль и щелкните на кнопке ОК (или просто нажмите клавишу <Enter>), чтобы начать свой первый сеанс работы в KDE. НА ЗАМЕТКУ KDM не позволяет входить в систему от лица пользователя root; вы должны применять учетную запись обычного пользователя Это мера предосторожности системы безопасности, которая также не позволяет настраивать FreeBSD так, чтобы она автоматически загружалась через учетную запись какого-нибудь пользователя: каждый пользователь при входе в систему FreeBSD всегда обязательно должен предоставлять свое имя пользователя и пароль. НА ЗАМЕТКУ GNOME устанавливается практически точно так же, как и KDE, за исключением некоторых небольших деталей. Установить GNOME можно либо при помощи коллекции пакетов (отыскав в ней в разделе xii пакет gnome2), либо при помощи коллекции портов (отыскав порт /usr/port / xll/gnome2) GNOME не является интерактивным портом и имеет гораздо меньше компонентов, чем КОЕ, поэтому на компиляцию GNOME уходит гораздо меньше времени и для ее установки ребуется гораздо меньше дискового прос ранства.
FreeBSD как настольная система Чтобы активизировать GDM (графический диспетчер, аналогичный диспетчеру KDM), нужно отредактировать не файл /etc/ttys, а файл /etc/rc.conf, который является главным конфигурационным файлом системы и будет более подробно описываться в главе 14. Прокрутите этот файл до конца вниз и добавьте следующую строку: gdm_enable="YES" Сохраните изменения в файле. Если вы раньше активизировали диспетчер КОМ, снова отредактируйте файл /etc/ttys, чтобы отключить этот диспетчер, закомментировав в нем строку ttyv9 (то есть поместив в начале этой строки знак решетки (#)). Затем перезагрузите компьютер. После перезагрузки на экране появится экран регистрации GDM. Среда KDE Когда вы успешно зарегистрируетесь в KDE в первый раз, вас поприветствует состоящий из пяти экранов "мастер", позволяющий настроить KDE в соответствии с имеющимися у вас как у пользователя предпочтениями. На этих экранах вам будет предложено указать вашу страну и язык, выбрать желаемый тип поведения (то есть указать, как себя должны вести окна в KDE — как в Windows, как в Mac OS X, как в классической системе UNIX или в стиле самой KDE) и выбрать "тему", то есть стиль оформления отображаемых в KDE элементов управления. Мастер будет предоставлять вам все необходимые предварительные описания каждого из предлагаемых им поведений и стилей для того, чтобы вы могли себе четко представить, чего именно вы хотите, прежде чем сделать свой выбор; не волнуйтесь, если что, вы всегда сможете изменить выбранные здесь настройки с помощью такой программы KDE, как Control Center (Центр управления), которая доступна в меню К. Когда вы пройдете все этапы мастера, на экране появится заставка и панель индикации, отображающая стадии процесса загрузки; при первом запуске KDE этот процесс обычно занимает больше времени, чем при всех последующих сеансах. Следите за сообщениями об ошибках, которые могут появиться в виде диалоговых окон; обычно они информируют о наличии проблем с оборудованием, например, о том, что не удается запустить аудиосистему, и чаще всего их можно спокойно пропустить. Через несколько мгновений вы окажетесь на рабочем столе KDE, который показан на рис. 5.5. Каждый, кто хоть когда-либо имел дело с Windows, должен сразу же почувствовать себя "уютнее" в KDE, чем в любой другой настольной среде из числа доступных для UNIX. Интерфейс KDE оформлен так, что он очень сильно напоминает рабочий стол Windows: здесь есть и эквивалент меню Start (Пуск) в левом нижнем углу, и панель задач внизу, и регулируемая панель для быстрого запуска наиболее часто используемых приложений, и подобные применяемым в Windows элементы управления окнами, и даже Web-браузер и диспетчер файлов "в одном лице", который называется Konqueror. (На самом деле, как вы очень скоро заметите, имена практически всех компонентов KDE начинаются с буквы "К". Скорее всего, эта буква была выбрана из- за того, что в алфавите она находится перед буквой "С, присутствующей в названии операционной системы Linux.) Пиктограммы на рабочем столе KDE расположены точно так же, как пиктограммы в Windows XP, и даже выглядят почто точно так же. На самом деле, у KDE есть целый ряд функциональных возможностей, которых у Windows нет.
Работа с системой X Window System Глава 5 149 Пиктограммы рабочего стола Location Ec№ Vflew So Bookmarks Iools Settings Mflnckjw tlelp q ao о „> О Location: S /home/btman/Desktop ?>Home Folder ft* A Honrre, You can hide mixer devices In KMIx by clicking on 'Hide" in the context menu that appears when you click with me right mouse button on one of the sliders, Contributed by Stefan ScMmanski чг-*СК System, 1 trash. К Show tips on startup jgrevrousj [Jext \\ ?. е | t т Меню К j-^lg * В 2 4 Useful Tip* - KTJp Ш У $'53' Панель быстрого запуска приложений Переключатель I Область уведомлений рабочего стола Работающие на текущий момент приложения Рис. 5.5. Рабочий стол КОЕ в своей конфигурации по умолчанию с открытым окном браузера Konqueror, в котором отображаются локальные файлы, и окном с советом Например, в KDE при наведении курсора мыши на ту или иную пиктограмму в панели быстрого запуска появляется анимированное всплывающее окно с описанием этой пиктограммы и выполняемых ею действий; при наведении курсора мыши на какую-нибудь пиктограмму на рабочем столе или в окне браузера файлов появляется окно, содержащее множество полезной информации о данном файле (вроде даты, когда этот файл изменялся в последний раз, имени его владельца, строки разрешений, свойственных такому типу файлов метаданных и даже отображаемого для предварительно просмотра эскиза этого файла). При запуске приложения рядом с курсором мыши появляется "подвижная" версия пиктограммы этого приложения, что в принципе чем-то напоминает как анимированные курсоры в Windows, так и подвижные пиктограммы в панели Dock в Mac OS. Любую из этих функциональных возможностей, кстати, можно отключить, если она мешает. НА ЗАМЕТКУ Одним из преимуществ, которое предоставляет и КОЕ, и GNOME, и которого явно нет ни у Windows, ни у Mac OS X, является то, что после регистрации пользователя KDE (и GNOME) пытается восстановить сеанс (окна, которые были открыты, приложения, которые работали, и файлы, которые отображались) до состояния на момент, когда пользователь в последний раз выходил из него.
150 FreeBSD как настольная система Часть II Нельзя сказать, что тем, кто пользовался Windows, в KDE все будет понятно: все равно между KDE и Windows существует целый ряд отличий, которые запросто могут сбивать с толку, и хотя просто изучив меню, можно о многом догадаться, существуют некоторые основные моменты, о которых просто следует знать. Работа с файлами и папками Эквивалентом проводника Windows в KDE является браузер Konqueror; как и Microsoft Internet Explorer, он представляет собой одновременно и Web-браузер, и механизм для навигации по файловой системе. Если вы на рабочем столе щелкнете (один раз) либо на пиктограмме Ноте (Домашний каталог), либо на пиктограмме System (Системный каталог), откроется окно Konqueror, в котором будет отображаться содержимое выбранного вами элемента, то есть если вы щелкнете на пиктограмме Ноте (Домашний каталог), в нем б^удет отображаться содержимое вашего домашнего каталога (в моем случае — это будет содержимое каталога /home/btman), а если вы щелкнете на пиктограмме System (Системный каталога), в нем б)дет отображаться содержимое корневого каталога файловой системы (то есть каталога /). В контексте KDE к каталогам следует относиться как к "папкам" (именно так они и называются в других настольных операционных системах); у каждого из них есть имеющий вид папки значок, на котором можно дважды щелкнуть кнопкой мыши, чтобы перейти на следующий уровень файловой системы. Некоторые папки имеют специальные значки, такие как папка Ноте (Домашний каталог) и папка Desktop (Рабочий стол) (в этой папке содержатся все элементы, которые отображаются на рабочем столе). В этом плане KDE очень похожа на Mac OS X. Konqueror поддерживает три режима навигации, переключиться на которые можно с помощью соответствующих пиктограмм в панели задач окна навигации: • Режим Icon (Значки). В этом режиме файлы и папки отображаются в виде значков и их можно как угодно перемещать и сортировать по имени, дате и другим критериям. • Режим Tree (Дерево). В этом режиме папки отображаются в ви е 'древовид ной" иерархии, подобной той, что отображается в Windows, где их можно разворачивать и просматривать их содержимое • Режим PhotobOOk (Фотоальбом). В этом режиме файлы отображаются справа в виде расположенного вертикально столбца; при щелчке на файле посередине окна появляется эскиз этого файла, который можно увеличивать в масштабе до бесконечности, а также прокручивать назад и вперед с помощью специальных пиктограмм, которые в этом режиме появляются в панели инструментов. СОВЕТ В меню VJew=>View Mode (Вид^Режим просмотра) доступно еще несколько полезных режимов просмотра, среди которых режим MultiColumn (Таблица) (похожий на режим Column (Таблица) в Mac OS X) и режим Info List View (Список) (в котором отображаются такие полезные детали, как количество строк и символов в текстовом файле). Испробуйте все эти режимы, чтобы понять, какой из них вам больше подходит в той или иной части системы. Щелкните правой кнопкой мыши в области рабочего стола или на свободном месте внутри окна папки: появится контекстное меню, очень похожее на аналогичное
Работа с системой X Window System Глава 5 151 меню в Windows (рис, 5.6) и позволяющее создавать новые папки, текстовые файлы, HTML-документы, а также документы, ассоциируемые с любыми другими приложениями, ссылками и прочими элементами KDE. В левой части окна Konqueror расположена небольшая вертикальная панель с ярлыками; она называется SideBar (Боковая панель) и содержит такие пиктограммы, как Bookmarks (Закладки), History (Журнал), Home Folder (Домашний каталог), Root Folder (Корневой каталог) и Services (Службы). Эти пиктограммы позволяют пользователю быстро попадать в наиболее часто необходимые места, а также просматривать журнал предыдущих посещений, чтобы он мог вспомнить, какие страницы он уже просматривали. В эту панель (как и в панель Finder Sidebar в Mac OS X) можно добавлять папки. Для этого нужно просто щелкнуть правой кнопкой мыши в панели SideBar (Боковая панель) и затем в появившемся контекстном меню выбрать элемент, который требуется добавить: Folder (Папку), Bookmarks (Закладки) или Web SideBar Module (Web-модуль боковой панели); последний элемент позволит загружать в левой части окна браузера Konqueror Web-страницы. После того, как новый элемент будет создан, на нем можно будет щелкнуть правой кнопкой мыши и изменить его имя, значок и URL-адрес. Location ?dit ^ew Go gookrnarks loots Settings Jfiflnctow Help E» Location: | Xmome/btma^ri/Desktop ,f^ Home Folaer •4J« "" fegGNUstep [ У Defaults i ^Library | gs Icons •gSBackgrourj -fcSCachedPiv! •eilconSets •fcSPIxmaps •^Sounds fc^SoundSetsj te9 Styles ^Themes A, •eWPrefs 0 0 13 Vacation «Ли v wm.tlff trash. __ _ desktop Create New 9 UP О Back Open With... j# Cervfsfa Prevtew In J Actions J Eroperttes Alt+Up Alt+Uft r# 4 Items - 2 Files (97.2ГХН ТоГйТГ- 2 ГоТОГГ* Рис. 5.6. Окно браузера файлов Konqueror, в котором отображается папка (в режиме 1С0П (Значки)), и появляющееся по щелчку правой кнопкой мыши контекстное меню Просмотр файлов, которые находятся на удаленных томах У KDE имеется встроенная программа-браузер для просмотра удаленных томов, с помощью которой можно подключаться к совместно используемым ресурсам в сети, будь то хоть WebDAV-серверы, FTP-серверы, совместно используемые каталоги Windows или SSH-соединения. Откройте меню К и в разделе Internet (Интернет) выберите пункт KNetAttach (Network Foider Wizard) (KNetAttach (Мастер сетевых папок)). На рис. 5.7 показан первый экран этого мастера.
152 FreeBSD как настольная система Часть II Add Network Folder 'saaaai Select the type of network folder you wish to connect to and press the Next button. О WebFolder (webdav) О Microsoft® Windows® network drive О Secure shell (ssh) о I— L»ipJ Next > | |~?ancel Puc. 5.7. Программа Network Folder Wizard (Мастер сетевых папок), позволяющая получать доступ к часто используемым удаленным томам Выберите тип удаленного тома, к которому вы хотите подключиться, и щелкните на кнопке Next (Далее); введите необходимую аутентификационную информацию, когда появится соответствующее приглашение. Когда вы подключитесь, вам будет предложено сохранить параметры соединения; если вы это сделаете, тогда, когда вы в следующий раз запустите мастер сетевых папок (Network Folder Wizard), вы сможете выбрать это соединение в меню Recent Connection (Последнее соединение). Используя мастер Network Folder Wizard, вы, пожалуй, впервые увидите, как работает поставляемая с KDE программа Wallet (Футляр). Программа Wallet представ ляет собой механизм для запоминания и хранения паролей и похожа на программу Keychain, которая используется в Mac OS X. Каждый раз, когда вы будете подключаться к защищенному паролем ресурсу (такому как удаленная папка или защищенный Web-сайт), KDE будет предлагать вам сохранить пароль, который вы вводите, и сохраняться этот пароль будет как раз в программе Wallet. Когда вы впервые решите сохранить какой-нибудь пароль, KDE предложит вам ввести пароль для защиты самой программы Wallet. После того, как вы сделаете это, Wallet будет автоматически запускаться, когда вы будете входить в KDE, и автоматически предоставлять пароли всем запрашивающим их защищенным службам. ВНИМАНИЕ! Хотя программа Wallet и защищена вашим паролем, не позволяющим никому другому получать к ней доступ, когда она заблокирована, после входа в KDE она автоматически деблокируется; это означает, что если компьютер находится в совместно используемой среде, кто-то другой запросто может присесть у вашего оставленного без присмотра компьютера с запущенным сеансом KDE и получить доступ к хранящимся в Wallet паролям. При наличии подозрений в том, что кто-тЬ другой может пользоваться вашим компьютером без вашего ведома, лучше не сохраняйте пароли в Wallet, а просто запоминайте их.
Работа с системой X Window System 1 ТТГ 1 Глава 5 I 1 Переход в другую рабочую область Посередине панели задач, которая отображается в нижней части экрана, находится элемент, состоящий из четырех пронумерованных соответствующим образом кнопок. Он называется Desktop Switcher (Переключатель рабочего стола), доступен практически во всех оконных диспетчерах XI1 и позволяет работать с виртуальным . рабочим столом в несколько раз большего, чем у экрана размера (в случае KDE большего в целых четыре раза). Все окна, которые вы открываете, автоматически отображаются в главной рабочей области, которая полностью соответствует размерам вашего экрана; но если окон становится так много, что они начинают загромождать экран, не спешите закрывать их: попробуйте перейти в другую рабочую область. Просто щелкните на одной из трех остальных кнопок в элементе Desktop Switcher, и перед вашими глазами появится новый, чистый рабочий стол, не загроможденный никакими окнами. Новые окна, которые вы будете открывать в другой, не главной, рабочей области, будут оставаться в этой области; окна из всех остальных рабочих областей в них будут отображаться только в виде контуров, показывающих, где именно находится то или иное окно, хотя его и не видно. Вы также можете сделать следующее: щелкнуть правой кнопкой мыши на строке заголовка какого-нибудь окна, в появившемся контекстном меню выбрать пункт То Desktop (На рабочий стол) и отправить это окно в какую-нибудь другую рабочую область. Изменение внешнего вида и поведения KDE Как и любой хороший оконный диспетчер XII, KDE имеет практически бесконечное количество опций, позволяющих настраивать рабочий стол и делать его абсолютно уникальным. В KDE доступно далеко не пять или шесть тем, которые предлагаются мастером, когда KDE запускается впервые, а огромное множество полностью готовых тем и состоящих из нескольких частей опций для настройки внешнего вида, которые вы можете использовать как по отдельности, так и вместе, подбирая именно то, что вам нравится. Откройте меню К и выберите в нем пункт Control Center (Центр управления): появится окно размером с экран, как показано на рис. 5.8. Разверните узел Appearance & Themes (Оформление и темы). Здесь доступны различные разделы, позволяющие настраивать внешний вид элементов интерфейса &DE — начиная с раздела Background (Фон) (в котором можно добавить и установить в качестве фона рабочего стола любой рисунок) и заканчивая такими разделами, как Theme Manager (Диспетчер тем) и Window Decorations (Оформление окон). Вы можете потратить несколько часов, работая с этими разделами, прежде чем, наконец, остановитесь на каком-нибудь одном варианте, который будет отвечать именно вашим личным вкусам. Когда вы закончите настраивать внешний вид KDE, не поленитесь и просмотрите остальные разделы, доступные в этом окне. Приложение Control Center (Центр управления) предоставляет доступ ко всем тем же аспектам поведения системы, что и приложение Control Panel (Панель управления) в Windows, и даже больше. Используя предлагаемые здесь средства, вы можете конфигурировать сетевые параметры и работать с учетными записями пользователей прямо из KDE. В остальной части этой книги, в которой больше внимания уделяется удаленным средствам для администрирования системы, нежели средствам, доступным в графическом сеансе
154 FreeBSD как настольная система Часть II консоли, такие вопросы будут рассматриваться только с точки зрения редактирования необходимых текстовых файлов и выполнения команд из оболочки; но если вы предпочтете использовать для выполнения этих задач KDE, знайте, что практически все наиболее распространенные процедуры администрирования системы достаточно хорошо описываются в окне KDE Control Center (Центр управления). gji'j."Щ "УУ+ЧРГЦЦ MWIVw^rb* ¦ШЬДЦ-^ I Oie tfew Settings Help | «5 index | Search | *HeJp I ] I I * II I I + 4r j Appearance & Themes 1 Щ Background - Colors - ЧГ Fonts 4fc Icons -jf Launch Feedback ~tt Screen Saver Splash Screen Ш. Style - У Theme Manager | 1^мУП1 IT! СТ1Г1НИ » Desktop 1 -,> Behavior -J> Multiple Desktops - Panels -Щ Taskbar Window Behavior - Window Specific Settings t Internet & Network k KDE ComDonents ll ¦ ^ Perfphei als I ¦ Ф Regional & Accessibility I ¦ л Security & Pi Ivacy 1 * « Sound & Multimedia Si f % System Administration j Window Decorations Window Decoration | Buttons | Keramik Decoration Options — — Bfirder size: Normal » К Dispjay the window Icon in the capt n bubb П Draw small caption bubbles on active windows В Draw grab bars below windows St Use shadowed text I Keramik preview defaults """^ЩШЯ 1 7 to* x ( Apply Be et Рис. 5.8. Поставляемая с KDE программа Control Center (Центр управления), в которой выполняются все операции по настройке внешнего вида и поведения KDE Приложения КОЕ Главным предметом гордости KDE, помимо схожести по внешнему виду и поведе нию с настольными системами, является огромное количество компонентных приложений, которые устанавливаются вместе с этой средой. Просто загляните в подменю главного меню К и вы увидите, насколько много приложений доступно в каждой категории — десятки, и многие из них являются, с функциональной точки зрения, абсолютно эквивалентными настольным приложениям, которые в мире коммерческого ПО стоят сотни долларов, или, по крайней мере, пытаются выполнять все те же требования. НА ЗАМЕТКУ Следует отметить, что встроенные приложения KDE также обычно оставляют желать лучшего в плане качества взаимодействия с конечным пользователем и наборов полезных опций. К счастью, сторонники ПО с открытым кодом взялись решить эту проблему и уже создали улучшенные альтернативные приложения для практически каждой категории. Подробнее об этих приложения будет рассказываться в главе 6.
Работа с системой X Window System Глава 5 155 Для о о чт бы опи ать подробно все приложения, которые входят в состав KDE, понадоби ся о дел ная книга Поскольку в этой главе была поставлена цель рассмо треть только основные концепции, необходимые для того, чтобы работать в системе XII, а прои водственные и развлекательные приложения будут описываться в главе б, мы сеич с перечислим только несколько самых важных приложений KDE, которыми вы скорее все о, б дете пользоваться часто: • Konqueror. Это не просто браузер файлов, но также и достаточно мощный Web браузер со всеми ультрамодными функциональными возможностями, которые только могут б ть необходимы пользователям Internet на сегодняшний день. П льзовател м Mac OS X будет интересно узнать, что Konqueror разрабатывался на основ того же механизма визуализации HTML — "КНТМЕ' — который Apple испо /ьзовала для своего браузера Safari. • КО/ гее. Пакет офисных приложений, который по своим возможностям похож на пакет Microsoft Works (и, до определенной степени, на пакет Microsoft Of ice). Входящие в пакет KOffice приложения (наподобие KWord, KSpread, KPresenter, Kivio и Krita), хоть и не могут работать с аналогичными приложениями Microsoft Office, Excel, Power Point и тому подобными, дают пользовате лю возможность создавать профессиональные документы, справляясь с этой задачей ничуть не хуже своих коммерческих аналогов. (Пользователи с высокими тре ованиями, скорее всего, захотят установить более мощный пакет офисных пр л жени и, т кои как пакет OpenOffice.org, который будет описан в главе 6.) • KFd't Замечательный, богатый функциональными возможностями текстовый реда TOjb Реда тировать конфигурационные файлы может оказаться намного легче в КЕ it, чем в редакторах командной строки, в которых для навигации и ввода данных можно пользоваться только клавиатурой. • КМ I По о унк щонал ное, основ иное на HTML почтовое приложение, по- д i e О ok и Appl Mail, имеюще все необходимые в наше время функции дл филь ации пама и организации содержимого. • иа П ет пр гр мм для W b разработки, оснащенный средствами редактирования m gemap и режимом WYSIWYG. • KDev lo . Полнофункциональная интегрированная среда разработки (Integrated De elopment En ironment IDE) для С C++. (Однако доступен и более усовер- шенсг вованн и в этом плане продукт, называемый Eclipse.) И э о тольк " е шка айсберга"; в меню каждого из приложений KDE еще доступно очень много других программ, среди которых и программы игрового и раз- влекате 1ьного характера, несомненно, являющиеся самым главным компонентом любой н стольной среды из-за ко орого ее в принципе и стоит устанавливать. Завершен е сеанса КОЕ Заканчивая работать в KDE, не забывайте завершать свои сеанс: вы можете сконфигурировать KDE так, чтобы она блокировала экран при помощи заставки с приглашением ввести пароль, защищая вашу личную информацию, но если компьютером польз ются и дру ие люди, вы точно захотите, чтобы они могли входить в систему, ко а ва н т рядом Выберите в меню К пункт Logout (Выход из системы) и затем вы* б и е л бо Е d Cu rent Session (Завершить текущий сеанс), либо Turn Off Computer клю иль komi ьют р), либо Restart Computer (Перезагрузить компьютер).
FreeBSD как настольная система Работа с оконными диспетчерами Предположим, вы не хотите нагружать свой компьютер "чудищем" вроде KDE (немного громко сказано, но все может быть). Предположим, вместо этого вы хотите, чтобы ваш "настольный интерфейс" в FreeBSD был минимальным, то есть использовал насколько возможно минимальное количество ресурсов компьютера, но при этом давал вам возможность работать с современными графическими приложениями так же легко, как и в Windows. Раньше и KDE, и GNOME были обычными оконными диспетчерами. Эти программы, облегченные настолько, насколько это возможно (дабы избежать лишней нагрузки на маломощные клиенты в кластерах, где они запускались), служили одной единственной цели: позволять пользователям перемещать окна во время сеанса XII. В то время в оконных диспетчерах не было ни систем меню, ни изощренных диспетчеров оформления (тем), ни экранных заставок, ни, конечно же, офисных приложений и браузеров файлов. Пользователи не могли отображать и просматривать файлы в виде значков, даже если хотели, так же как, естественно, они не могли передвигать их по рабочему столу. Рабочий стол представлял собой не более чем просто пространство для окон. Краткое знакомство с TWM должно было уже вам позволить понять, какими были "настольные возможности" в мире UNIX в то время, когда появилась XII. Однако времена изменились. KDE и GNOME показали, что создание полнофункциональной пользовательской среды вроде той, что применяется в Windows, вовсе не является невыполнимой задачей. Теперь, когда это оказалось так, традиционные оконные диспетчеры оставили в покое: больше от них никто не требует, чтобы они предоставляли такие же функциональные возможности, как и коммерческие операционные системы. Поэтому сейчас они могут спокойно сфокусироваться на том, что они делают лучше всего, то есть на обеспечении максимальной гибкости в плане возт можностей настройки с минимальным потреблением ресурсов и минимальным количеством навязываемых возможностей. Как вы видели в начале главы, оконные диспетчеры берут существующие окна и украшают их своими собственными элементами. За управление окнами отвечает такой компонент XI1, как X Server; оконные диспетчеры дают окнам возможность передвигаться и взаимодействовать, в то время как XI1 выполняет серверные задачи, необходимые для прорисовки их содержимого. Поскольку -X Server и оконный диспетчер работают как независимые процессы, оконный диспетчер можно запросто поменять на другой, просто завершив работу предыдущего диспетчера и запу стив новый прямо во время одного и того же сеанса XII. Установка оконных диспетчеров Наиболее популярными сегодня среди десятков доступных являются следующие оконные диспетчеры: • TWM. Представитель "старой школы"; минимальный на вид, быстрый в исполнении и чрезвычайно экономный в плане потребления ресурсов. Используете^ в FreeBSD в качестве оконного диспетчера по умолчанию до тех пор, пока щ будет заменен каким-нибудь другим оконным диспетчером.
Работа с системой X Window System I 7TZ I Глава 5 I I • Window Maker. Клон NeXTSTEP; предлагает возможности, аналогичные таким возможностям NeXT, как панель Dock (Стыковка) и утилита Preferences (Настройки). • FVWM. Удобный для глаз оконный диспетчер, поддерживающий отображение полупрозрачных миниатюр и сглаживание цветов. • Blackbox. Минимальный на вид интерфейс, который, тем не менее, выглядит очень приятно с эстетической точки зрения и является исключительно гибким в плане настройки. И еще один плюс: он разрабатывался для FreeBSD. Каждый из этих оконных диспетчеров, как и десятки других, можно установить из коллекции пакетов, где оконные диспетчеры доступны в разделе xll-wm, или из коллекции портов, где оконные диспетчеры доступны в разделе /usr/ports/xll-wm. Чтобы понять, что собой представляет тот или иной оконный диспетчер и что он может, посетите посвященный ему Web-сайт; у каждого оконного диспетчера имеется посвященный ему Web-сайт, который указан в файле pkg-descr, хранящемся в соответствующем этому оконному диспетчеру каталоге порта. На домашнем Web- сайте практически каждого оконного диспетчера имеется галерея снимков экрана и перечень функциональных возможностей, а также информация о том, какая цель преследовалась при разработке данного оконного диспетчера, то есть, разрабатывался ли он как оконный диспетчер, который должен использовать минимальное количество ресурсов памяти, или же как диспетчер, который должен эмулировать операционную систему Amiga, либо как оконный диспетчер, который должен стать самой гибкой в плане возможностей настройки настольной средой за всю историю. Многие оконные диспетчеры являются достаточно небольшими и все они, конечно, доступны бесплатно вместе с исходным кодом, поэтому вам будет совсем нетрудно установить сразу несколько из них и за один присест попробовать, как они все работают, дабы понять, какой из них вам подходит больше всего. СОВЕТ На Web-сайте "Window Managers for Xй ("Оконные диспетчеры для системы X"), который находится по адресу http://www.xwinman.org, можно найти снимки экрана и сравнительные характеристики практически всех наиболее популярных оконных диспетчеров для Х11 из тех, что доступны на сегодняшний день. Выбор оконного диспетчера, который должен использоваться по умолчанию Когда используется обычный оконный диспетчер, диспетчер регистрации типа KDM или GDM, который запускается во время загрузки системы и отображает свое собственное окно регистрации, обычно не доступен. Вместо этого каждый пользователь запускает сеанс XII путем ввода в командной строке команды startx. Эта команда считывает находящийся в домашнем каталоге пользователя файл .xinitr. Ав этом файле как раз и содержится команда, которая отвечает за запуск оконного диспетчера. То есть вам нужно просто создать такой файл, если он еще не существует, и добавить в него соответствующую команду. Если вы уже определились с тем, какой оконный диспетчер хотите использовать, сделать так, чтобы именно он всегда запускался после ввода команды startx, вы мо-
FreeBSD как настольная система жете, указав его имя в файле .xinitr при помощи какого-нибудь текстового редактора, например, такого, как текстовый редактор ее. Для этого введите команду ее .xinitrс и затем добавьте следующую строку, например, если хотите, чтобы в качестве вашего оконного диспетчера всегда вызывался диспетчер FVWM: exec fvwm Сохраните файл. С этого момента, когда вы будете вводить startx, ваш сеанс XII будет запускаться с оконным диспетчером FVMW. Просто измените содержимое этого файла, если захотите использовать какой-нибудь другой оконный диспетчер. НА ЗАМЕТКУ В случае KDE и GNOME имена команд, которые вы должны вызывать, если хотите, чтобы КОЕ и GNOME запускались после ввода команды startx, а не после запуска KDM или GDM, выглядят не совсем обычно, а все из-за более сложной природы этих настольных сред. То есть для KDE вы должны поместить в файл .xinitrc следующую команду: exec startkde А для GNOME — такую команду: /usr/XHR6/bin/gnome-session Файл .xinitrc является сценарием оболочки. Вы можете воспользоваться этим фактом и сделать так, чтобы при запуске XII выполнялась целая среда сеанса (подробнее об этом будет рассказываться в главе 7). Оконный диспетчер Window Maker Чтобы продемонстрировать некоторые функциональные возможности, являющиеся типичными для большинства простых оконных диспетчеров, мы сейчас рассмотрим такую программу, как Windows Maker, которая считается наиболее популярным оконным диспетчером среди опытных пользователей, предпочитающих избегать всяких излишних функциональных возможностей (и, следовательно, предполагаемой ими нагрузки на процессор и ресурсы памяти), которые поставляются со средами вроде KDE и GNOME. Window Maker по своему внешнему виду и поведению напоминает ныне уже не используемую настольную среду операционной системы NeXTSTEP, которую многие называют одной из самых прогрессивных и функциональных настольных сред из всех когда-либо создаваемых и которая уже много лет спустя после своего расцвета легла в основу операционной системы Mac OS X. Многие функциональные возможности, которые сегодня считаются возможностями Мае, вроде панели Dock (Стыковка), первоначально появились в NeXTSTEP и поэтому присутствую/г и в Windows Maker. На рис. 5.9 показан рабочий стол Window Maker. Ниже перечислены основные функциональные возможности рабочего стола Window Maker. • Ряд кнопок в правой части рабочего стола называется панелью Dock (Стыковка). Если вам доводилось работать с Mac OS X, панель Dock (Стыковка) должна быть вам уже знакома, хотя может и показаться более примитивной по срав нению с ее современной версией в стиле Apple. Хотя размещать произвольно пиктограммы на рабочем столе, как это можно делать в Windows и KDE, в
Работа с системой X Window System Глава 5 159 Window Maker нельзя, зато в нем можно добавлять в панель Dock квадратные кнопки для запуска наиболее часто используемых приложений. Главным преимуществом этих добавляемых в панель Dock кнопок по сравнению с произвольно перемещающимися пиктограммами является то, что они никогда ничем не перекрываются, даже разворачиваемыми окнами. То есть кнопки быстрого запуска приложений всегда остаются доступными. Помимо кнопок быстрого запуска приложений в панели Dock (Стыковка) также могут размещаться так называемые "мини-программы", например, такие как показанная на рис. 5.9 программа типа "часы/календарь". Узнать больше о панели Dock (Стыковка) вы сможете в разделе "Работа с панелью Dock" далее в этой главе. Элемент Clip (Быстрое переключение) -L Меню Applications (Приложения) Меню Windows (Окна) „О, и Шеи f Панель Dock (Стыковка) l.-ar 1 jLL^t, Работающие на текущий момент приложения Рис, 5,9, Рабочий стол Window Maker не является полнофункциональной пользовательской средой как KDE, но все-таки имеет много эффективных функциональных возможностей для работы с приложениями XII Пиктограммы, представляющие функционирующие на текущий момент приложения, в принципе работают так же, как и пиктограммы в панели задач Windows. Например, двойной щелчок на той или иной из них позволяет восстановить свернутое окно. Меню Applications (Приложения) похоже на меню Start (Пуск) в Windows. Получить доступ к этому меню можно, щелкнув правой кнопкой мыши на любой пустой области рабочего стола.
FreeBSD как настольная система • Меню Windows (Окна) представляет собой перечень открытых на текущий момент окон. Щелчок на элементе в этом меню приведет к тому, что соответствующее ему окно будет перенесено на передний план, а также станет активным. Получить доступ к этому меню можно, щелкнув средней кнопкой мыши на пустой области рабочего стола. (Те, у кого двухкнопочная мышь, смогут получить доступ к меню Windows (Окна) нажав одновременно левую и правую кнопку мыши.) • Кнопка Clip (Быстрое переключение) в Window Maker позволяет переходить с одного виртуального рабочего стола на другой (то есть из одной рабочей области в другую); на всех этих рабочих столах могут отображаться свои окна и приложения. Чтобы перейти на следующий или предыдущий рабочий стол, нужно просто щелкнуть на соответствующей стрелке, которая изображена этой кнопке. Работа с окнами Window Maker, как и любой другой оконный диспетчер, имеет свою собственную парадигму в отношении кнопок управления окнами. Все необходимые элементы управления имеются; нужно просто знать, что какой из них делает. К счастью, пиктограммы элементов управления обычно являются достаточно понятными и пиктограммы в Window Maker — не исключение. Операции перемещения и изменения размеров окна выполняются в Window Maker практически тем же образом, что и Windows или Mac OS: чтобы передвинуть окно, нужно щелкнуть и перетащить строку заголовка этого окна, а чтобы изменить размеры окна, нужно щелкнуть и перетащить границы этого окна. Щелчок на пиктограмме в левом конце строки заголовка окна приводит к сворачиванию этого окна до пиктограммы, отображаемой в нижней части экрана. (Двойной щелчок на этой пиктограмме позволит, соответственно, восстановить окно.) Щелчок на пиктограмме с изображением крестика (х) в правом конце строки заголовка приводит к закрытию окна. А двойной щелчок на самой строке заголовка сворачивает окно по направлению вверх так, что отображаться остается только одна строка заголовка (этот эффект получил название WindowShade). Восстановить свернутое подобным образом окно можно, снова дважды щелкнув на строке заголовка. При необходимости развернуть окно или выполнить какие-то другие связанные с окном операции, можно щелкнуть на строке заголовка правой кнопкой мыши и получить доступ к целому специальному меню опций. СОВЕТ Обратите внимание на опции Close (Закрыть) и Kill (Завершить работу), доступные в меню, которое появляется после щелчка правой кнопкой мыши на строке заголовка. Чем они отличаются? Опция Close (Закрыть) позволяет просто закрыть окно. Она аналогична щелчку на пиктограмме с изображением крестика (х), которая отображается в правом конце строки заголовка. Опция Kill (Завершить работу), однако, отправляет сигнал kill работающей в этом окне программе. Она может пригодиться для завершения работы ведущего себя неадекватно приложения, которое не реагирует на команду Close (Закрыть). Однако пользоваться командной Kill (Завершить работу) следует только в том случае, если не удается выполнить команду Close (Закрыть). Команда Close (Закрыть) завершает работу приложения постепенно и позволяет ему выполнить все свои обычные задачи перед закрытием (например, спросить пользователя, не желает ли он сохранить
Работа с системой X Window System редактирующиеся файлы). Команда ЮН (Завершить работу) просто немедленно прерывает работу приложения. Это в некоторых случаях заканчивается потерей каких-нибудь данных или не удалением файлов времени выполнения (которые могут привести к появлению ошибок в приложении, если его запустят снова), потому что приложения не могут выполнить свои обычные операции завершения работы, когда их закрывают подобным образом. Именно поэтому командой Kill (Завершить работу) следует пользоваться только в крайнем случае. Меню в Window Maker Как уже упоминалось ранее, получить доступ к меню в Window Maker можно, щелкнув на пустой области рабочего стола. Щелчок правой кнопкой мыши позволяет получить доступ к меню Applications (Приложения), а щелчок средней кнопкой (или одновременное нажатие левой и правой кнопок, если это двухкнопочная мышь) — к меню Windows (Окна). Если вы откроете меню и затем решите, что не хотите выбирать в нем никакие опции, закрыть его вы сможете, щелкнув той же кнопкой мыши опять-таки где-нибудь на пустом месте рабочего стола. Обычно после того, как в меню выбирается какая-нибудь опция, оно исчезает. Однако если вы хотите, чтобы меню осталось на рабочем столе, вы можете щелкнуть левой кнопкой мыши на его строке заголовка. Когда вы это сделаете, в правой части строки заголовка меню появится пиктограмма с изображением крестика (х), позволяющая закрыть это меню, когда в этом возникнет необходимость. Как главные, так и дополнительные (вложенные) меню можно "закреплять** на рабочем столе, для чего нужно просто щелкнуть левой кнопкой мыши на строке заголовка выбранного меню. Работа с панелью Dock Панель Dock (Стыковка) в Window Maker представляет собой обычную панель кнопок и отображается в правой части экрана. Одной из ее главных обязанностей является отображение кнопок, запускающих приложения. Добавить такую кнопку на панель Dock (Стыковка) очень просто. Для любого работающего приложения в левой нижней части экрана будет отображаться соответствующая пиктограмма. Чтобы добавить эту пиктограмму в панель Dock (Стыковка), вы должны, удерживая левую кнопку мыши, перетащить ее под кнопку, которая на текущей момент является самой последней кнопкой в панели Dock (Стыковка). Когда пиктограмма окажется в корректной позиции, вокруг нее появится белая рамка. Отпустите кнопку мыши, и в панели Dock (Стыковка) будет создана новая кнопка. Двойной щелчок на этой кнопке будет приводить к запуску приложения. Если вы позже решите, что эта кнопка вам больше не нужна, просто щелкните на ней левой кнопкой мыши и, удерживая кнопку мыши нажатой, перетащите ее с панели Dock (Стыковка) на пустую область рабочего стола. Затем отпустите кнопку мыши, и кнопка запуска исчезнет. Порядок расположения кнопок в панели Dock (Стыковка) можно менять, просто перетаскивая эти кнопки из одного места в другое. Тем не менее, обратите внимание на то, что перетаскивать кнопки в панели Dock (Стыковка) можно только вверх или вниз. Перетаскивание кнопки запуска влево приведет к удалению этой кнопки с панели. Чтобы изменить свойства какой-нибудь из кнопок в панели Dock (Стыковка), щелкните на ней правой кнопкой мыши и не отпускайте кнопку мыши до тех пор, пока не
FreeBSD как настольная система оявится всплывающее меню. Наведите курсор мыши на пункт Settings (Параметры) этом меню и только затем отпустите кнопку мыши. После этого появится диало- овое окно Docked Application Settings (Параметры приложений, отображаемых в анели "Стыковка"), позволяющее настраивать внешний вид и функции расположен- [ых в панели Dock (Стыковка) кнопок запуска, например, указывать, должно ли абонируемое с той или иной кнопкой приложение запускаться при входе пользователя систему, или должна ли кнопка приложения быть "закреплена" (то есть защищена т удаления путем перетаскивания за пределы панели Dock (Стыковка)). При желании переместить всю панель Dock (Стыковка) целиком, просто щелкни- е левой кнопкой мыши на самой верхней кнопке в этой панели и, удерживая ее, [еретащите панель туда, куда вам нужно: вы можете перетащить ее вверх или вниз в равой части экрана или вообще перетащить ее в левую часть экрана, если вам так олыие нравится. Остановка и использование DockApp-приложений Существует целый ряд приложений, которые специально разрабатывались для ого, чтобы запускаться в панели Dock (Стыковка), среди них: приложение типа часы/календарь" (wmCalClock), диспетчеры сетевого трафика, диспетчеры произ- одительности системы и проигрыватель CD-дисков. На рис. 5.10 показан пример акого приложения. Рис. 5.10. Приложение wmCalClock является примером приложения, которое было специально разработано для того, чтобы запускаться в панели Dock (Стыковка) В коллекции портов доступно достаточно много приложений для панели Dock Стыковка), также для удобства называемых DockApp-приложениями (процедура становки ПО из коллекции портов FreeBSD будет подробно описываться в главе 6). Отдельной категории для таких приложений в этой коллекции, к сожалению, [ет: они разбросаны по разным категориям в соответствии с функциями, которые >ни выполняют, и целями, которым они служат. Однако вы можете посетить специ- льную Web-страницу, на которой все имеющие отношение к Window Maker и, соот* ;етственно, к DockApp-приложениям, порты перечислены в логическом порядке; эта траница доступна по адресу http://www.freebsd.org/ports/windowraaker.html рис. 5.11). СОВЕТ Dockapps.org (http://dockapps.org) — это независимый Web-сайт, отслеживающий DockApp- приложения для Windows Maker. Если вы найдете здесь DockApp-приложение, которое захотите установить, попробуйте отыскать его в коллекции портов своей системы с помощью команды locate. Например, чтобы отыскать приложение wmCalClock, вы можете попробовать ввести такие команды: # locate wmCalClock # locate -i wmcalclock /usr/ports/xll-clocks/wmcalclock Ага, теперь уже видно, что это приложение находится в разделе xll-clocks.
Работа с системой X Window System Глава 5 163 IBB ттт штт ?i*w So fiodtmtjrt» Ioola Jtfndow fciefp I Back Лнош» >? Bookmarks «dfmonlla oro, -/mozitl*2tn« -afmozdtv.org ¦ f* 1J http:/Avww.frtebad,orB/portf/winc^[ jbtamrchj ** w* d Reload $ op > grtFrP*BSP production PPtfiflH ffQ pra^uctfon (UMtVl RdCdtO Snapshot FreeBSD Ports; Window maker Ports to support the WindowMafcer window manager. » Parted Aoehcatmns ' «Bj Xll ftls msnaaer uslnfl WINGS library Dockable In WlndowMakar Long detcnpfaon I Рдскдяе I Sourest I Main Web Sits Mvntammd by: Frltt Hf IPIIthmtVs/taftmuni htwn.df Aeoures•XFrtB« i'ftrtticH.S.O. i>MH.tt,fl,3. fanpranfiB-a.a.M. fi oetftrftO 14. b. р,гпаЦе,3 6fl_2. loep, 6b,J. HbXft 2.1 7- ltbiconv-1 9 2, J.. libunaM.14. okqconfio 0 19. pnq-l,2.B 2. trff-3f7.4,. у J Ate Astern. KU&D К»<гсспЯУ<г,ляР-г,? Л WlndowMsker dockepp to control XScrasnSavor long dgwipttffp I Easbmi 2лиаяя. I Main Web Site. Mmintwnedby homiBsourosirnollcHy nst Reqitns Xf ee|» I brartt -4 & Q. ffg«U tt.Q- fpnt»nfia-2 3,2,1- fr««typ«2-2 l idj ItbdockdpD-O 6 }¦¦ nkotonflg 019 Д/во/гЛе^гл.Щ. »v 4*» ^ ca Лиг. 5.//. Раздел Web-страницы, в котором перечислены различные доступные в виде портов приложения для панели Dock (Стыковка) в Window Maker Если вы найдете на этой Web-странице приложение, которое вас заинтересует, посмотрите, что указано в строке Also listed In (Также доступно в). Например, на рис. 5.11, вверху страницы приводится описание приложения FSViewer. арр-0 . 2 . 5_2. В следующей после этого описания строке Also listed in (Также доступно в) указано, что приложение FSViewer. арр-0.2 .5_2 также доступно в категории Xll-fm. Это значит, что в коллекции портов FreeBSD имеется категория xll-fm и что именно там вы и сможете найти приложение FSViewer. арр-0.2.5_2. DockApp-приложения для Window Maker устанавливаются точно так же как и любые другие приложения (о том, как именно выполняется процедура установки приложений, вы сможете узнать в главе 16). Когда DockApp-приложение уже установлено, запустить его можно, щелкнув правой кнопкой мыши на пустой области рабочего стола и затем в появившемся всплывающем меню Applications (Приложения) выбрав пункт Run (Выполнить). После этого появится диалоговое окно Run (Запуск программы), показанное на рис. 5.12. В диалоговом окне Run (Запуск программы) следует ввести имя приложения, которое требуется запустить, и затем щелкнуть на кнопке ОК. Указанное DockApp- приложение запустится в виде небольшой пиктограммы, которая будет отображаться в нижней части рабочего стола и которую можно будет добавить в панель Dock (Стыковка), если данное приложение планируется запускать регулярно. После того, как вы добавите приложение в панель Dock (Стыковка), вы можете сконфигурировать его так, чтобы оно автоматически запускалось при каждом запуске Window Maker. Чтобы сделать это, сначала отобразите диалоговое окно Docked Application Settings (Параметры приложений панели "Стыковка"), щелкнув правой
164 FreeBSD как настольная система Часть II кнопкой мыши на пиктограмме приложения и выбрав в появившемся меню пункт Settings (Параметры). В этом окне отметьте флажок Start When Window Maker Is Started (Запускать при запуске Window Maker) и затем щелкните на кнопке ОК, чтобы закрыть диалоговое окно. Теперь это DockApp-приложение будет запускаться автоматически каждый раз, когда вы будете запускать Window Maker. Рис. 5.12. Диалоговое окно Run (Запуск программы) по- зваляет запускать приложение путем ввода его имени СОВЕТ У многих DockApp-приложений имеются возможности для настройки, какие именно — зависит от приложения. Часто эти возможности имеют вид опций, передаваемых программе при запуске. Для многих DockApp-приложений будут устанавливаться свои страницы руководства, получить доступ к которым можно будет путем ввода в командной строке консоли команды man и имени интересующего приложения (например: man wmCalClock). Настройка Window Maker Вы можете настроить Window Maker по своему вкусу. Например, вы можете поменять рисунок рабочего стола, изменить цветовую схему и так далее. В следующих разделах мы расскажем, как именно выполняются эти и другие операции настройки в Window Maker. Изменение темы рабочего стола Тема рабочего стола влияет на цветовую схему, а также на фоновый рисунок рабочего стола. Чтобы изменить тему, щелкните правой кнопкой мыши на пустой области рабочего стола и в появившемся всплывающем меню Applications (Приложения) выберите пункт Appearance (Оформление). В меню Appearance (Оформление) выберите пункт Themes (Темы), чтобы отобразить список доступных установленных тем. Чтобы применить какую-нибудь новую тему, просто щелкните на ней в этом списке. Изменение стиля Вы также можете изменить цветовую схему, которая используется для оформления рамок окон, строк заголовков, меню, а также панели Dock (Стыковка). Все это называется "изменением стиля". Итак, чтобы изменить стиль, щелкните правой кнопкой мыши на пустой области рабочего стола и в появившемся всплывающем меню Applications (Приложения) выберите сначала пункт Appearance (Оформление), а затем — пункт Styles (Стили). В Window Maker доступно много различных стилей.
Работа с системой X Window System Глава 5 165 Настройка фона рабочего стола Существует несколько способов настроить фон рабочего стола в Window Maker, а именно: выбрать один из нескольких сплошных цветов, или один из градиентных узоров, или специальный рисунок, который должен использоваться в качестве фона рабочего стола. Если у вас есть рисунок, который вы хотите использовать в качестве фона, вы должны поместить его в следующий каталог в своем домашнем каталоге: GNU step/Libra r у /Window Maker/Backgrounds Поместив рисунок в этот подкаталог, щелкните правой кнопкой мыши на пустой области рабочего стола, чтобы отобразить меню Applications (Приложения). В этом меню выберите последовательно пункты Appearance (Оформление), Background (Фон), чтобы получить доступ к списку возможных фоновых рисунков. Рисунок, который вы добавили в указанный каталог, будет указан в этом списке. (Если вы не знаете, как правильно выполняются операции копирования и перемещения файлов, обратитесь в главу 8.) СОВЕТ Если выбранный вами рисунок слишком мал, чтобы покрывать весь рабочий стол, Window Maker сделает несколько копий этого рисунка и разместит их одну за другой в виде мозаики для того, чтобы заполнить все доступное пространство. Конечно, если в качестве рисунка вы выбрали фотографию, такой режим отображения фонового рисунка вас вряд ли устроит. Чтобы избежать этого, убедитесь в том, что разрешение вашего рисунка совпадает с разрешением рабочего стола. Например, если разрешение рабочего стола составляет 1024x768 пикселей, вы должны сделать так, чтобы у вашего рисунка было такое же разрешение. Изменить размер рисунка можно в любой программе редактирования изображений. Если у вар нет такой программы, вы можете установить такую мощную программу, как GIMP, которая бесплатно доступна в коллекции портов, в категории graphics. Утилита Preferences Для внесения дополнительных изменений в настройки Window Maker можно воспользоваться утилитой Preferences (Настройки). Чтобы получить доступ к этой утилите, дважды щелкните кнопкой мыши на соответствующей этой утилите кнопке в панели Dock (Стыковка). Как именно выглядит эта кнопка, можно увидеть на рис. 5ЛЗ. Рис 5.13. Чтобы открыть в Window Maker программу Preferences (Настройки), нужно щелкнуть на запускающей ее кнопке в панели Dock (Стыковка) В верхней части окна утилиты Preferences (Настройки) отображается ряд кнопок, щелкая на которых можно получать доступ к различных параметрам настройки. Полоса прокрутки, расположенная под этими кнопками, позволяет отображать остальные кнопки. В левом нижнем углу окна утилиты Preferences (Настройки) имеется флажок Balloon Help (Всплывающая подсказка). Если отметить этот флажок, при наведении курсора на кнопки будут появляться всплывающие окна с описанием
FreeBSD как настольная система того, какие опции конфигурации доступны для каждой из них. Если вы не знакомы с Window Maker, рисунок на кнопке может ни о чем вам не говорить. Конфигурирование настроек Window Maker Конфигурационные настройки разбиты по категориям, у каждой из которых имеется своя собственная пиктограмма в отображающейся в окне утилиты Preferences (Настройки) панели инструментов. Подвигайте полосу прокрутки вправо и влево, чтобы увидеть все доступные категории. Например, если вы передвинете полосу прокрутки влево, вы сможете увидеть кнопку с изображением мыши. Щелкните на этой кнопке, чтобы отобразить панель Mouse Preferences (Параметры настройки мыши), которая показана на рис. 5.14 и которая позволяет настраивать параметры мыши. Рис. 5.14. В этом диалоговом окне можно настраивать мышь. Помимо всего прочего, здесь можно задавать скорость движения курсора мыши и скорость выполнения двойного щелчка А вот еще одна опция, которая может вас заинтересовать: щелкните на кнопке, которая выглядит как строка заголовка окна (на рис. 5.14 эта кнопка находится справа от кнопки Mouse Preferences (Параметры настройки мыши)). В диалоговом окне, которое появится после этого, вы сможете создать специальную цветовую схему, если ни одна из доступных по умолчанию схем вам не подходит. Настройка меню Applications Утилита Preferences (Настройки) также позволяет настраивать меню Applications (Приложения). Чтобы сделать это (то есть, чтобы настроить меню Applications (Приложения)), находясь в окне утилиты Preferences (Настройки), щелкните на кнопке с изображением меню Applications (Приложения) (если вы отметили флажок Balloon Help (Всплывающая подсказка), при наведении курсора мыши на эту кнопку появится подсказка вроде: Edit the menu for launching applications (Позволяет отредактировать меню, отвечающее за запуск приложений)). После этого на экране появится диалоговое окно, показанное на рис. 5.15. Процедура настройки меню Applications (Приложения) является достаточно простой и объясняется в списке Instructions (Инструкции), который отображается в правой части этого диалогового окна. Вы можете перетаскивать элементы из доступ-
Работа с системой X Window System ного в этом же диалоговом окне списка New Items (Новые элементы) и размещать их там, где вы хотите, чтобы они находились в меню Applications (Приложения). Когда вы будете это делать, на экране будет появляться диалоговое окно с приглашением указать имя элемента, программу, которую он должен загружать и тому подобное. Вы также можете удалять элементы из меню Applications (Приложения), просто перетаскивая их за пределы этого меню. Рис. 5.15. Щелчок на кнопке Application Menu (Меню приложений) (вокруг которой при наведении па нее фокуса появляется белый контур) позволяет отобразить диалоговое окно Applications Menu Definitions (Параметры настройки меню приложений). С помощью доступных в этом окне опций вы сможете настроить меню Applications (Приложения) Завершение работы Window Maker и Х11 Напомним, что Window Maker запускается поверх XII, а XII сама тоже является всего лишь графической оболочкой, которая запускается поверх работающего в режиме командной строки ядра FreeBSD. Когда вы выходите из Window Maker, вы также выходите и из XII, после чего снова попадаете в командную строку. Щелкните правой кнопкой мыши на пустой области рабочего стола и в появившемся после этого меню Applications (Приложения) выберите пункт Exit (Выход). Щелкните на кнопке О К, чтобы подтвердить, что вы действительно хотите завершить свой сеанс. После завершения сеанса Windows Maker и работы XII должен снова появиться текстовый экран с командной строкой, тот, где вы в самом начале запускали XII. Если вы хотите сейчас еще и компьютер выключить, введите команду shutdown, как описывалось в главе 4.
6 ГЛАВА Работа с приложениями В этой главе... • Запуск приложений с графическим пользовательским интерфейсом и интерфейсом командной строки • Работа с текстом • Офисные приложения • Создание и редактирование изображений с помощью GIMP • Аудиоприложения • Сетевые приложения • Работа с Java-приложениями
FreeBSD как настольная система Какой бы надежной и эффективной не была операционная система, от нее мало толку, если под ее управлением нельзя запускать полезные приложения. К счастью, даже в бесплатной операционной системе, такой как FreeBSD, можно установить тысячи первоклассных приложений, которые будут стоить не больше, чем сама FreeBSD (то есть ничего не стоить). Это верно как тогда, когда речь идет о настольной рабочей станции, так и тогда, когда речь идет о монтируемом в стойку сервере: приложения, доступные и для той, и для другой цели, в большинстве случаев являются высококачественными, полнофункциональными эквивалентами наилучших пакетов ПО, которые существуют в мире коммерческого ПО, и обладают такими преимуществами ПО с открытым кодом, как надежностью, безопасностью и отсутствием платы. В этой главе речь пойдет о приложениях, которыми вам придется пользоваться чаще всего для выполнения таких наиболее распространенных на настольных системах задач, как редактирование текста, обработка документов, управление изображениями, обработка электронной почты и просмотр Web-страниц. Эти приложения обычно не устанавливаются как часть самой операционной системы FreeBSD, но многие приложения, интегрируемые с настольной средой KDE или GNOME, устанавливаются вместе с ними (см. главу 5). Также здесь будет рассказываться о применяющихся текстовых эквивалентах приложений, запускаемых под KDE или GNOME; вы должны знать, как можно отредактировать текст и прочитать электронной сообщение, даже если на вашем компьютере не установлена XII. FreeBSD предлагает хорошо продуманный и отлаженный механизм для установки стороннего ПО (подробнее об установке приложений будет рассказываться в главе 16). Некоторые из наиболее распространенных пакетов ПО, такие как пакет OpenOffice.org, являются ровно настолько же отлаженными и полнофункциональными, как их коммерческие аналоги, и поставляются со своими собственными процедурами, справочными системами и средствами технической поддержки. Однако ПО с открытым кодом имеет и свои недостатки: поскольку каждый пакет написан кем-то другим и ни один из них (за очень редким исключением) не поставляется компанией, заинтересованной в предоставлении помощи своим клиентам, у такого ПО часто отсутствует подробная или пригодная в практическом смысле документация, и службы технической поддержки попросту не существует (если, конечно, вы не считаете технической поддержкой получение ответов на Web-форумах пользователей). Запуск настольных приложений под FreeBSD может оказаться очень выгодным для вас и предоставлять вам намного больше преимуществ, нежели дорогостоящий набор коммерческих приложений, но вы должны быть готовы к неизбежному столкновению с недостатками ПО с открытым кодом, которое никогда не является столь же "завершенным'*, как коммерческое. НА ЗАМЕТКУ Кроме тысяч "родных" (то есть, разработанных специально для FreeBSD) приложений, FreeBSD также может запускать большинство Linux-приложений с помощью своего модуля совместимости с Linux, что значительно расширяет набор доступных приложений и позволяет вам выбирать приложения практически для любой цели, включая коммерческие приложения, разработанные и выпущенные в бинарной форме для Linux. Если вы обнаружите, что вам необходимо запустить какое-нибудь Linux-приложение, но режим совместимости с Linux во время установки FreeBSD вы не активизировали, просто добавьте в файл /etc/rc.conf следующую строку и перезагрузите компьютер: linux enable=HYES"
Работа с приложениями I ~—. I " Глава 6 I I Конечно же, в этой главе не будет описана даже половина всех доступных для FreeBSD приложений, нб зато в ней будут приведены примеры некоторых наиболее популярных приложений из разных категорий. Вы запросто можете попробовать установить дополнительные пакеты программ, не рассматриваемые в этой главе: просмотрите коллекцию портов (/usr/ports) и следуйте инструкциям, которые приводятся в главе 16, чтобы установить заинтересовавшую вас программу. Это ничего не стоит, поэтому терять вам особо-то нечего. НА ЗАМЕТКУ В этой главе будут рассматриваться приложения, подходящие для использования на рабочей станции. Серверные приложения, такие как Web-серверы, FTP-серверы и серверы электронной почты, здесь рассматриваться не будут. Если вам необходимо настроить одну из таких служб, вы сможете найти необходимую информацию в части V, в главах которой подробно описываются процедуры настройки этих служб. Запуск приложений с графическим пользовательским интерфейсом и интерфейсом командной строки Существуют два вида приложений, которые могут запускаться в FreeBSD: приложения с графическим пользовательским интерфейсом (Graphical User Interface — GUI), которые запускаются в контексте пользовательской среды XII, такой как KDE или GNOME, и приложения с интерфейсом командной строки (Command Line Interface — CLI), которые запускаются в текстовом режиме и работают в терминальном окне или системной консоли. Приложения с интерфейсом командной строки (далее для краткости называемые СЫ-приложениями) чаще всего используются в мире UNIX; среди них текстовые редакторы вроде ее и vi, программы для работы с электронной почтой, такие как Pine, и текстовые Web-браузеры наподобие Lynx. Когда вы запускаете CLI-программу, вы вводите ее имя в командной строке оболочки, после чего эта программа, как правило, занимает весь контекст вашего терминала, будь то весь экран системной консоли, терминальное окно, вызванное в сеансе XII, или сеанс Telnet или SSH, через который вы получаете доступ к системе FreeBSD с удаленного компьютера. Размер окон локального или удаленного терминала в настольной системе с графическим пользовательским интерфейсом (такой как клиент SSH или система Windows) можно изменять как угодно, а вот CLI-программа, запускаемая в таком окне, как правило, занимает все пространство в этом окне; по умолчанию размер окна терминала и размер физического экрана консоли составляет 80 столбцов в ширину и 25 строк в высоту. Запущенная CLI-программа доминирует в сеансе программной оболочки до тех пор, пока вы не выйдете из нее, после чего на экране снова появляется основное окно программной оболочки.
FreeBSD как настольная система СОВЕТ Если вы работаете в локальной консоли, не забывайте о том, что вы можете переключаться с одного виртуального терминала на другой, нажимая клавиатурную комбинацию <Alt+F2>, <Alt+F3> и так далее Это может оказаться очень удобным в ситуации, когда вам необходимо выполнить операции командной строки на одном экране и в то же время отредактировать файл или прочитать электронное сообщение на другом экране. НА ЗАМЕТКУ Путь (path) — это перечень каталогов, перечисленных в конфигурационном файле программной оболочки (.cshrc или .profile), который указывает программной оболочке, где ей следует искать программы, имена которых вы вводите в командной строке. По умолчанию путь включает такие каталоги, как /us r/bin, /usr/sbin и /us r/ local /bin; поскольку большинство сторонних приложений устанавливаются в каталог /usr/local/bin, программная оболочка сможет найти их там, если вы просто введете имя программы в командной строке. Однако если программы, которую вы хотите запустить, нет ни в одном из каталогов, перечисленных в вашем пути, вам придется указать к этой программе весь путь целиком, например: # /home / frank/myapp В целях безопасности домашний каталог и текущий каталог (обозначаемый с помощью точки) по умолчанию в путь не включаются. Чтобы запустить программу, которая находится в текущем каталоге, такую как программа для оболочки, написанием которой вы сейчас занимаетесь, используйте префикс ./: # ./myscript.sh Для получения более подробной информации о конфигурационных файлах оболочки обращайтесь в главу 9. Приложения с графическим пользовательским интерфейсом (далее для краткости называемые GUI-приложениями) могут запускаться несколькими способами, что зависит от того, какая программа применяется в качестве настольной среды в данной системе. Самый простой способ вызвать GUI-приложение в сеансе XII — это ввести его имя в командой строке внутри терминального окна (такого как окно KTerm в KDE); когда вы это сделаете, это приложение создаст в пределах настольной среды свое собственное окно со своими собственными меню и палитрой (то есть первичными компонентами), если необходимо. Терминальное окно, из которого вы запускали программу, однако, станет бесполезным, и будет оставаться таковым до тех пор, пока вы не выйдете из этой программы; команды, вводимые с клавиатуры, будут иг норироваться, и командная строка не появится снова на экране до тех пор, пока вы не воспользуетесь функцией Exit (Выход) программы или не нажмете клавиатурную комбинацию <Ctrl+C> (нажатие этой клавиатурной комбинации обычно приводит к завершению работы любой запускавшейся через командную строку программы). Более элегантный способ запустить GUI-приложение из терминального окна- это ввести после имени программы символ &; это укажет программной оболочке отделить запущенный процесс, перевести его в фоновый режим и вернуться к интерактивной подсказке: # mozilla &
Работа с приложениями Глава б 173 Используя такой синтаксис, вы сможете работать в своем терминальном окне и при этом запускать новые, независимые GUI-приложения, которые не будут к нему привязаны и будут нормально функционировать, несмотря на то, что терминальное окно остается открытым. Эти технологии удобны, если в системе используется простой оконный диспетчер, такой как Windows Maker, как рассказывалось в главе 5. Однако если используется KDE или GNOME, доступна еще парочка дополнительных и даже более удобных способов для запуска GUI-приложений. KDE и GNOME имеют специальные средства для добавления программ, с их собственными пиктограммами, в меню К (если речь идет о KDE) или в меню Applications (Приложения) (если речь идет о GNOME), так чтобы пользователь мог отыскивать их через графический интерфейс и запускать точно так же, как в Windows. Если программы, которую желает запустить пользователь, в этих меню нет, тогда он может воспользоваться функцией Run Command (Выполнить команду), которая находится в меню К и показана на рис. 6.1, чтобы указать программу по имени и запустить ее независимо, то есть отдельно от всех терминальных окон. В GNOME эта функция доступна в меню Applications (Приложения) и называется Run Application (Запустить программу). В других оконных диспетчерах вроде Window Maker такая функция тоже имеется, хотя она может называться и по- другому (например, в Window Maker она называется Run... (Выполнить...). СОВЕТ И GNOME, и KDE позволяют добавлять функцию запуска команд в панель быстрого запуска, тем самым предоставляя пользователю возможность получать доступ к своим приложениям даже еще быстрее. # Enter the name of the application you want to run or the URL you want to view Command: mozllla Options »| Run || fiance! Рис. 6.1. Диалоговое окно Run Command (Выполнить команду) в KDE. В GNOME это окно называется Run Application (Запуск программы) Работа с текстом Текстовые редакторы являются одними из наиболее часто используемых — и наиболее важных — приложений. Наличие навыков по редактированию текста обязательно для выполнения практически любой описываемой в этой книге задачи, поэтому, чем раньше вы подберете для себя текстовый редактор после установки FreeBSD, тем лучше.
FreeBSD как настольная система В отличие от текстового процессора, текстовый редактор работает только с простыми текстовыми файлами (которые в FreeBSD могут иметь любое имя и любое расширение, а не только . txt). Сохранять измененные шрифты, стили, поля или любую другую подобную информацию в документе он не позволяет, потому что простые текстовые файлы не поддерживают отображение таких сведений о форматировании. Большая часть системы FreeBSD имеет дело с простыми текстовыми файлами, начиная от конфигурационных файлов и заканчивая файлами документации; вы будете работать с ними постоянно. Ниже перечислены некоторые наиболее распространенные цели, для которых может использоваться текстовый редактор. • Редактирование конфигурационных файлов системы. FreeBSD, как и большинство других версий UNIX, управляет поведением системы в основном с помощью текстовых конфигурационных файлов. Для редактирования этих файлов необходим текстовый редактор, позволяющий выполнять запись в простой текстовый файл. Приложения вроде текстовых процессоров, такие как KWord или OpenOffice, являются слишком сложными для выполнения подобной задачи: помимо того, что они требуют наличия настольной среды, подобной KDE или GNOME, они еще также имеют склонность сохранять файлы в каких-нибудь отличных от обычного текста форматах, в результате чего система, когда ей необходимо запустить приложения или перезагрузиться, больше не может прочитать их. (Конфигурационные файлы системы и способы взаимодействия с ними будут рассматриваться в главе 14.) • Создание или изменение исходного программного кода. Текстовый редактор может использоваться для написания кода, сообщающего компьютеру, что он должен делать. Хотя во многих языках этот код преобразуется в машинный язык программой, которая называется компилятором, исходные инструкции все равно записываются в виде простого текста. Эти инструкции называются исходным кодом. В главах 10 и 11 будут описываться два популярных в FreeBSD языка, с помощью которых можно писать код в текстовом редакторе. • Создание и изменение Web-страниц. Web-страницы пишутся на языке HTML (HyperText Markup Language — язык гипертекстовой разметки). Хотя для создания Web-страниц доступно много программ, которые используют графический пользовательский интерфейс и режим WYSIWYG (What You See Is What You Get— что видишь, то и получаешь), в конечном счете, все равно получается простой текстовый файл с дескрипторами элементов управления форматированием, который может понять Web-браузер. Многие люди по-прежнему предпочитают создавать Web-страницы вручную в текстовом редакторе, потому что это позволяет им пользоваться абсолютно всеми возможностями HTML. Помимо этого, текстовый редактор также можно применять для написания PHP-кода и JavaScript-сценариев, а также других расширенных функциональных возможностей Web-дизайна, которые позволяют делать содержимое Web- страниц интерактивным. • Сложный набор текста. Для FreeBSD доступны некоторые очень богатые функциональными возможностями наборные языки. Как и HTML, наборные языки обычно используют простые текстовые файлы с содержащимися в них специальными дескрипторами форматирования для управления расположением и внешним видом текста. Хотя сегодня эти языки по большей части заменили текстовые процессоры (потому что с текстовыми процессорами легче рабо-
Работа с приложениями Глава 6 175 тать, и они позволяют видеть, как на самом деле будет выглядеть текст), не исключено, что возникнет ситуация, когда для выполнения определенной задачи вы предпочтете или будете вынуждены использовать именно наборный язык. Если вы ученый или инженер, для вас может оказаться интересным язык ТеХ и его расширенная версия LaTeX, потому что они позволяют выполнять чрезвычайно сложное форматирование с помощью математических формул. В следующих разделах мы более подробно рассмотрим некоторые из доступных в FreeBSD встроенных решений для редактирования текста, такие как текстовый редактор ее и текстовый редактор vi. После этого мы расскажем о некоторых более современных графических текстовых редакторах, которые являются частью пользовательской среды KDE и GNOME. Использование редактора ее Программа Easy Editor (Простой редактор) или, сокращенно, ее, устанавливается по умолчанию как часть операционной системы FreeBSD. Как становится понятно из названия, Easy Editor представляет собой базовый текстовый редактор, который проектировался так, чтобы с ним было легче работать, чем с некоторыми другими традиционными текстовыми редакторами UNIX. Чтобы вызвать ее, просто введите ее в командной строке, или введите ее, а затем — имя файла, который хотите отредактировать. На рис. 6.2 показан пример сеанса ее с пустым документом. *[ (escape) лепи Ау search proept *k delete line *p prev It *g prev page *o aeoii code *x search *l undelete line *n next li Av next page 4i end of file *o begin of line *w delete word *b back i char H begin of file N» end of line *r restore word *f forward 1 char *c command *d delete char *j undelete char *z next word Рис. 6.2. Пример сеанса ее. Клавиатурные комбинации, отображающиеся в верхней части окна, позволяют получать доступ к различным функциональным возможностям Использование клавиатурных комбинаций в ее Знак вставки (Л), присутствующий в каждой из перечисленных клавиатурных команд, обозначает клавишу <Ctrl>. Большинство из опций в этом меню не требуют объяснения, но некоторые из них все же заслуживают особого внимания. В табл. 6.1 перечислены все такие опции и объясняется их предназначение.
176 FreeBSD как настольная система Часть II Таблица 6.1. Клавиатурные комбинации в ее Клавиатурная комбинация Операция, которую она выполняет <Ctrl+0> <Ctrl+C> <Ctrl+Y> <Ctrl+X> <Ctrl+G> и <Ctrl+V> Вызывает командную строку, в которой можно ввести ASCII-значение. Эту клавиатурную комбинацию удобно использовать для вставки специальных символов, которых нет на клавиатуре, и которые требуют, чтобы их ASCII-значения вводились напрямую. Изменяет верхнее меню, а также, в нижней части экрана, вызывает командную строку, в которой можно ввести одну из перечисленных вверху команд. Чтобы покинуть командную строку просто нажмите клавишу <Enter>, не вводя команды. Вызывает поисковую подсказку. Здесь можно ввести выражение, которое необходимо отыскать в файле. После нажатия клавиши <Enter> будет найдено первое (от текущей позиции курсора) вхождение указанного выражения. Повторяет поиск, выполнявшийся с помощью клавиатурной комбинации <Ctrl+Y>, y\ отыскивает следующее вхождение указанного выражения. Как говорится в меню, эти клавиатурные комбинации позволяют переходить сразу на следующую или на предыдущую страницу файла. Для этой цели также можно использовать и клавиши <Page Up> и <Раде Down>. Клавиатурные комбинации <Ctrl+G> и <Ctrl+V> существуют на тот случай, если на используемом терминале вдруг не окажется клавиш <Page Up> и <Раде Down>. Настройка и конфигурирование ее Если в вашем домашнем каталоге существует файл под названием .init.ee, ее при каждом запуске будет считывать содержащиеся в нем параметры конфигурации. Вы можете создать этот файл вручную или выбрать нужные параметры настройки из списка опций настройки ее. Чтобы получить доступ к этому списку, находясь в ее, нажмите клавишу <Esc>, чтобы открыть главное меню, как показано на рис. 6.3. Далее нажмите клавишу <Е>, чтобы выбрать меню Settings (Параметры), или при помощи клавиши с изображением стрелки вниз выделите в этом меню пункт Settings (Параметры) и затем нажмите клавишу <Enter>, чтобы отобразить меню режимов (рис. 6.4). В меню Modes (Режимы), которое показано на рис. 6.4, вы можете включить или отключить любую опцию, либо нажав клавишу с соответствующей этой опции буквой, либо выделив при помощи клавиши с изображением стрелки требуемую опцию и затем нажав клавишу <Enter>. В табл. 6.2 перечислены различные опции настройки и вкратце объясняется, что они делают.
Работа с приложениями 177 Глава б Ч (escape) immu Ay док* prapt ^ delete line *p prev U *0 pr#v page *o ascH code Ax search Al undelete line *n next It *v next page *u end of file *o begin of line *w delete word *b ьос* l char *t begin of /tie *e end of line *r restore *>rd *f forward 1 char *c coemand *d delete Az next word main nenu D leave editor b) help c) f1le operation» d) redraw есгеел m) settings fУ eearch 9) elecelIgneous press Esc to cancel Pue. 63. Главное меню в ее *[ (escape) eenu *y search prompt *k delete line *p prev И *g prev t *o are it cade *x search *l undelete line *n next 11 *v next I *u end of file *a be ack 1 char *t begin of file *e en KgSSBBSeBBfl orward * С"0* «*c conmond *d de П modes eenu Ц ext word D tabs to spaces OFF b) case sensitive search OFF c) eargtns observed IFF d) autOHxa-agraph f areat OFF e) etghtbit characters ON f) info window ON a) eeocs key bindings ON h) right eargin 79 t) 16 btt characters OFF j) save editor configuration I press Esc to cancel & Рис. в А. Если в главном меню ее выбрать пункт Settings (Параметры), появится список опций настройки Таблица 6.2. Опции настройки ее Опция Tabs to Spaces (Символы табуляции в символы пробела) Margins Observed (С учетом полей) Описание По умолчанию отключена. Когда она включена, все жестко закодированные символы табуляции преобразуются в символы пробела. Может пригодиться для языков программирования, в которых символы пробела имеют важное значение (таких как Python и FORTRAN). По умолчанию отключена. Когда эта опция включена, ее завершает строку у правого поля и начинает новую строку автоматически (то есть автоматически переходит на следующую строку). Когда она отключена, переход на следующую строку не происходит до тех пор, пока пользователь вручную не вставит символ новой строки.
178 FreeBSD как настольная система Часть II Окончание табл. 6.2 Опция Описание Info Window По умолчанию включена. Когда эта опция включена, в верхней части (Информационное окно) экрана отображается окно с перечнем клавиатурных комбинаций и выполняемых ими команд. Когда она отключена, это окно не отображается. Вам, пожалуй, лучше оставить эту опцию включенной до тех пор, пока вы хорошо не изучите все клавиатурные комбинации. Right Margin Размер правого поля. По умолчанию размер правого поля соответ- (Правое поле) ствует ширине стандартного 80-символьного терминального дисплея. 16 Bit Characters Эта опция отвечает за то, как будут обрабатываться 16-битные сим- (16-битовые символы) волы (как два 8-битных символа или как один 16-битный символ). Устанавливать значение для этой опции следует только в том случае, если применяется набор символов, в котором на каждый символ используется по шестнадцать битов, например, такой как Unicode. Последняя опция в этом меню — Save Editor Configuration (Сохранить конфигурацию редактора) — записывает конфигурационную информацию в файл . init. ее. Когда вы выберите эту опцию, ее запросит, куда именно вы хотите записать конфигурационный файл: в текущий или в домашний каталог. Если вы запишете этот файл в домашний каталог, указанные в нем параметры конфигурации будут по умолчанию применяться ко всем файлам, которые вы будете создавать и открывать в ее. Если вы запишете его в текущий каталог, указанные в нем параметры будут перекрывать параметры по умолчанию, заданные в конфигурационном файле, который находится в домашнем каталоге, каждый раз, когда ее будет запускаться из этого каталога (то есть каталога, который сейчас является текущим). Редактор vi Редактор vi был одним из первых редакторов, которые были разработаны для операционных систем типа UNIX. На сегодняшний день он по-прежнему является одним из наиболее мощных редакторов из всех доступных и поставляется как стандартный с практически каждой операционной системой типа UNIX. Он также был сделан доступным для использования на нескольких не UNIX системах, среди которых Microsoft Windows и OS/2. К сожалению, начинающие пользователи находят его слишком сложным и трудным для изучения. В отличие от других редакторов, таких как ее, в vi передвинуть курсор в нужное место в файле с помощью клавиш с изображением стрелки и начать вводить текст нельзя: вам придется познакомиться с определенными режимами редактирования и клавиатурными комбинациями, чтобы выполнять задачи, которые вы привыкли решать в других, более современных редакторах. Так зачем же учиться пользоваться редактором vi? На самом деле существуют две причины, по которым стоит это сделать. Во-первых, вы можете быть практически полностью уверены, что vi будет доступен в любой системе типа UNIX, с которой вам когда-либо доведется работать. Если в будущем вам вдруг придется работать в какой-то незнакомой системе Linux или UNIX и возникнет необходимость отредактировать текстовый файл, не исключено, что vi окажется единственным доступным редактором.
Работа с приложениями Глава 6 179 Вторая причина, по которой все-таки стоит научиться пользоваться редактором vi, состоит в том, что как только вы познакомитесь с различными используемыми в нем клавиатурными комбинациями и командами, вы поймете, что это редактор с очень мощными возможностями. Если при работе с компьютером вы предпочитаете пользоваться только клавиатурой (то есть не любите пользоваться мышью), вы еще также обнаружите, что в vi вы сможете работать гораздо быстрее: vi был разработан так, что к большинству его команд получать доступ можно, не убирая рук с клавиатуры. СОВЕТ Третья причина, по которой стоит научиться пользоваться редактором vi, заключается в том, что его команды оказываются удобными во многих самых неожиданных местах в FreeBSD. Например» если вы используете команду less, чтобы просмотреть файл постранично, вы можете воспользоваться доступными в vi командами для поиска, чтобы передвигаться по страницам этого файла и отыскивать определенные строки текста. Вы также обнаружите, что в vi применяются многие те же условные обозначения, что встречаются в регулярных выражениях, такие как символ $, который в vi тоже обозначает конец строки. Это позволит вашим мозгам "работать в правильном направлении", если вы будете программировать на Perl или других языках, которые используют регулярные выражения. Чтобы запустить vi с пустым файлом, введите vi. Чтобы запустить vi и загрузить определенный файл для редактирования, введите vi, а затем — имя нужного файла. Если файла с именем, которое вы ввели, не существует, vi решит, что это новый файл. На рис. 6.5 показан сеанс vi с новым, готовым к редактированию файлом. Рис. 6.5. Редактор vi, готовый к редактированию нового файла. В строке состояния, которая отображается в нижней части экрана, содержится информация о редактируемом файле; обратите внимание на каталог, который используется для временного хранения файлов Окно vi выглядит достаточно простым и скучным, не так ли? Первым вы, скорее всего, заметите то, что при вводе текста vi ничего не делает и только издает звуковой сигнал: никакой вводимый вами текст не вставляется. Вы также можете нажать определенные клавиши и увидеть странно выглядящие сообщения в строке состояния, которая отображается в нижней части экрана. А все дело в том, что у vi
180 FreeBSD как настольная система Часть II имеется несколько режимов работы, и, скорее всего, вы запустили vi в том из них, в котором ввод данных с клавиатуры невозможен. Когда редактор vi запускается впервые, он запускается в командном режиме, в котором нажатия клавиш интерпретируются как команды для редактора, а не как текст, который должен быть вставлен в документ. Чтобы переключиться в режим, позволяющий вводить текст в документе, вы должны нажать клавишу <А>, <1> или <0> или воспользоваться клавишей <Shift>, чтобы вызывать альтернативные команды, в зависимости от того, в каком месте в документе вы хотите, чтобы отображался этот текст. • Команда а расшифровывается как "append", что в переводе означает "добавить". В этом режиме вводимый вами текст будет вставляться сразу после символа, на котором на текущий момент находится курсор. • Команда A (<Shift+A>) помещает курсор в конце текущей строки и позволяет вам начать вводить дополнительный текст. • Команда I расшифровывается как "insert", что в переводе означает "вставить". В этом режиме вводимый вами текст будет вставляться перед символом, на котором на текущий момент находится курсор. • Команда о расшифровывается как "open", что в переводе означает "открыть". В случае ввода этой команды после символа, на котором на текущий момент находится курсор, будет вставлена новая строка. Затем vi переместит курсор на эту новую строку и перейдет в режим вставки, позволив вам вводить в этой строке текст. • Команда О (<Shift+0>) похожа на команду о, только она вставляет пустую строку над строкой, в которой на текущий момент находится курсор, и позволяет вам вводить текст в ней. НА ЗАМЕТКУ В vi регистр, в котором вводятся клавиатурные команды, имеет значение, потому что такие команды обычно вводятся вместе с другими символами для создания какой-нибудь более сложной команды (такой как 75G, например). Поэтому, если указывается использовать "команду q*, знайте, что это означает, что вы должны нажать только клавишу <0>, а если указывается использовать "команду Q", значит, вы должны нажать <Shift+Q>. Эти две команды имеют совершенно разные значения! Если вы захотите вернуться обратно в командный режим после того, как вошли в режим ввода текста, нажмите клавишу <Esc>. При переходе в командный режим vi по умолчанию подаст соответствующий звуковой сигнал. СОВЕТ Не забывайте о том, что если вы пытаетесь ввести текст, a vi в ответ на ваши действия просто издает звуковые сигналы или делает другие непонятные вещи, это, скорее всего, означает, что вы находитесь в командном режиме. Нажмите клавишу <А>, <1> или <0>, чтобы перейти в режим ввода текста. Также, если вы не знаете точно, в каком режиме находитесь, просто нажмите клавишу <Esc>, чтобы переключиться в командный режим (если вы уже находитесь в командном режиме, просто ничего не произойдет). После этого вы можете нажать клавишу <А>, <|> или <0>, чтобы перейти в режим ввода текста. Если вы по ошибке нажмете в командном режиме какие- нибудь не те клавиши и тем самым внесете в документ ненужные изменения, попробуйте нажать клавишу <U>, чтобы отменить их (в большинстве случаев результат будет положительным).
Работа с приложениями Глава 6 181 Перемещение курсора в vi В режиме ввода текста для перемещения курсора обычно можно использовать клавиши с изображением стрелки и клавиши <Page Up? и <Page Down>. Однако редактор vi разрабатывался с расчетом на то, что в нем будут выполняться определенные операции по редактированию, а не для того, чтобы предоставлять пользователю свободу действий в этой области, которая доступна во многих современных текстовых редакторах, работающих по принципу WYSIWYG ("что видишь, то и получаешь"; режим полного соответствия). Это означает, что в командном режиме vi для перемещения курсора могут использоваться и многие другие клавиши, а не только клавиши с изображением стрелки; все они выполняют определенные команды, которые описываются в табл. 6.3. Таблица 6.3. Команды для перемещения курсора, доступные в командном режиме vi Команда Действие h Передвигает курсор влево на один символ j Передвигает курсор вниз на один символ к Передвигает курсор вверх на один символ 1 Передвигает курсор вправо на один символ w Передвигает курсор вперед на одно слово ь Передвигает курсор назад на одно слово е Передвигает курсор в конец следующего слова О Передвигает курсор в начало строки $ Передвигает курсор в конец строки ) Передвигает курсор в начало следующего предложения { Передвигает курсор в начало предыдущего предложения } Передвигает курсор в начало следующего абзаца f Передвигает курсор в начало предыдущего абзаца G Передвигает курсор в конец текущего документа Л Передвигает курсор на первый символ в строке, который не является символом пробела н Передвигает курсор на первую строку на экране L Передвигает курсор на последнюю строку на экране Обратите внимание, что для каждой из перечисленных в этой таблице команд (за исключением команды G) по умолчанию в качестве единицы измерения используется один. Например, команда j передвигает курсор вниз на одну строку, команда к передвигает его вверх на одну строку, команда w передвигает курсор вправо на одно слово и так далее. Вы можете изменить это используемое по умолчанию поведение. Для этого просто введите перед командой число, соответствующее значению, которое вы хотите использовать. Например, при выполнении следующей команды курсор переместиться не на одну, а на пять строк вниз: 5j
182 FreeBSD как настольная система Часть II При выполнении следующей команды, курсор переместится на 75-тую строку в текущем файле (то есть в файле, который сейчас редактируется): 75G При выполнении следующей команды, курсор переместится на строку, которая находится на пять строк выше самой нижней строки на экране: 5L Такой синтаксис подходит для всех перечисленных в табл. 6.3 команд, кроме команды А, которая передвигает курсор на первый, не являющийся пробельным, символ в документе. СОВЕТ Если вы вводите число, а за ним — одну из предыдущих команд, a vi не делает ничего, кроме того, что подает звуковой сигнал, скорее всего, это означает, что вы ввели число, выходящее за рамки допустимого диапазона. Например, если вы введете 560G для того, чтобы передвинуть курсор на 560-ю строку, а в документе имеется всего 557 строк, vi в ответ просто издаст звуковой сигнал и тем самым сообщит, что не может выполнить указанную операцию. К сожалению, никаких сообщений об ошибках, позволяющих понять, что именно не так, vi отображать не будет. Прокручивание экрана в vi Помимо клавиш для перемещения курсора, которые описывались в предыдущем разделе, в vi также можно использовать клавиатурные комбинации для прокручивания экрана. Эти клавиатурные комбинации перечислены в табл. 6.4. Таблица 6.4. Прокручивание экрана в vi Клавиатурная комбинация Действие <Z>, а потом <Enter> Передвигает строку, в которой находится курсор, вверх экрана <Z>, а потом клавиша с изо- Передвигает строку, в которой находится курсор, вниз экрана Сражением знака минус (-) <Z>, а потом клавиша с изо- Передвигает строку, в которой находится курсор, в центр экрана бражением точки (.) <Ctrl+U> Прокручивает текст на пол-экрана вверх <Ctrl+D> Прокручивает текст на пол-экрана вниз <Ctrl+F> Прокручивает текст на целый один экран вперед <Ctrl+B> Прокручивает текст на целый один экран назад <Ctrl+E> Прокручивает текст на одну строку вниз <Ctrl+Y> Прокручивает текст на одну строку вверх Команды для редактирования текста Использование vi становится особенно запутанным, когда дело доходит до изменения существующего текста. Клавиши <Backspace> и <Delete> не будут делать то, чего вы от них, скорее всего, ожидаете. Вместо этого вам придется нажимать другие клавиши в командном режиме vi, чтобы удалить текст тем способом, к которому вы
Работа с приложениями I 7ГГ Глава 6 привыкли, или чтобы перезаписать существующий текст. В табл. 6.5 перечислены различные доступные в vi команды для редактирования текста. Таблица 6.5. Доступные в vi команды для редактирования текста Команда Действие D Удаляет текст, начиная с текущей позиции курсора и до конца строки. d<3 Удаляет всю текущую строку целиком. ndd Здесь л — это число строк, которое нужно удалить. Например, ввод команды 5dd приведет к удалению текущей строки, а также четырех следующих за ней строк. р Вставляет содержимое буфера памяти (которое могло быть "вырезано" или скопировано в него с помощью соответствующих команд, которые будут описываться чуть позже). гс Здесь с — это символ. Эта команда позволяет заменить символ, на котором в текущий момент находится курсор, символом, указанным после г. R Текст, вводимый после R, будет перезаписывать текущий текст, начиная с текущей позиции курсора до тех пор, пока вы нажмете клавишу <Esc>, чтобы вернуться в командный режим. s Удаляет текущую строку и начинает вставлять текст в теперь уже пустой строке. х Удаляет символ, стоящий после курсора, и передвигает на его место символ, находящийся справа, чтобы заполнить пробел. х Удаляет символ, стоящий перед курсором, и передвигает на его место символы, находящиеся справа, чтобы заполнить пробел. Изменяет регистр символа, на котором сейчас находится курсор. J Объединяет текущую строку с предыдущей и удаляет получившуюся пустую строку. Операции с файлами и завершение работы vi Несколько команд vi касаются загрузки и сохранения файлов. В табл. 6.6 перечислены различные доступные для этих операций цепочки команд. Таблица 6.6. Операции с файлами в vi Команда Действие zz Сохраняет изменения в текущий файл и затем завершает работу vi. • wq Сохраняет изменения в текущий файл и затем завершает работу vi (то есть делает то же, что и zz). :w Сохраняет изменения в текущий файл. :w! Сохраняет изменения в текущий файл, перезаписывает файл с таким же именем, если такой уже существует. • q Завершает работу vi. Если имеются несохраненные изменения, vi выдает соответствующее сообщение и его работа не завершается. •q- Завершает работу vi, даже если имеются несохраненные изменения. Все несохраненные изменения будут утрачены.
184 FreeBSD как настольная система Часть II Окончание табл. 6.6 Команда Действие • е Загружает в vi указанный файл для редактирования. Если указанный файл не су- filename ществует, будет создан новый файл. ¦ е! Утрачивает все изменения (то есть не сохраняет никаких изменений) и заново загружает сохраненный файл с диска. ВНИМАНИЕ! Обратите внимание на то, что в конце некоторых из перечисленных в табл. 6.3 команд стоит восклицательный знак (!). Такие команды являются просто более сильным вариантом соответствующих команд без восклицательного знака, что обычно означает подавление предупредительного сообщения и немедленное выполнение запрашиваемой операции. Например, выполнение команды :q! приведет к немедленному завершению работы vi — никакое сообщение с приглашением сохранить изменения не появится. При использовании команд с восклицательным знаком в конце следует соблюдать предельную осторожность. Поиск и замена текста в vi В vi также доступно несколько команд для выполнения операций поиска и замены. Все эти команды перечислены и объясняются в табл. 6.7. СОВЕТ Многие из этих команд похожи на команду просмотра страниц l ess: вы запросто можете использовать команды поиска vi при прочтении системной документации с помощью less. Таблица 6.7. Доступные в vi команды для поиска и замены текста Команда Действие /pattern / или п ?pattern :s/patternl/pattern2 :%s/patternl/pattern2 Здесь pattern (шаблон) — это элемент, который необходимо отыскать, vi выполняет в файле поиск первого вхождения указанного шаблона. Повторяет предыдущий поиск, отыскивая следующее вхождение шаблона в файле. Здесь pattern (шаблон) — это элемент, который необходимо отыскать, vi выполняет поиск первого вхождения указанного шаблона в файле в обратном направлении. Повторяет предыдущий поиск, отыскивая следующее вхождение шаблона в файле (опять-таки в обратном направлении). Передвигает курсор на скобки или фигурные скобки, соответствующие тем, на которых сейчас находится курсор. Эта команда может оказаться полезной для программистов. Заменяет каждое вхождение patternl (шаблон 1) на pattern2 (шаблон2) в текущей строке. Заменяет каждое вхождение patternl (шаблон 1) на pattern2 (шаблон2) во всем файле.
Работа с приложениями Глава 6 185 В этой таблице не были указаны несколько других команд для поиска и замены, которые используются довольно редко. Здесь были перечислены только те команды, которыми вы, скорее всего, будете пользоваться наиболее часто. Копирование, вырезание и вставка текста в vi Чтобы скопировать текст в буфер в vi, используйте команду у. Эта команда "заталкивает" текст в буфер. В табл. 6.8 перечислены различные способы использования команды Y. Таблица 6.8. Доступные в vi команды для вырезания текста Команда Действие У" Помещает (копирует) слово, на котором на текущий момент находится курсор, в буфер. У? Помещает в буфер текст, находящий в промежутке от текущей позиции курсора до конца текущей строки. УУ Помещает в буфер всю текущую строку. После копирования текста в буфер вы можете вставить его в любом месте в документе, переместив курсор в нужную позицию и воспользовавшись командой р или Р (которая расшифровывается как "put", что в переводе означает "поместить" или "вставить"). Команда р вставляет текст в документе после курсора, а команда Р — перед курсором. После того, как вы "вставите" текст, он все равно остается в буфере. Поэтому вы можете снова воспользоваться командой р или Р и вставить этот текст в еще каком-нибудь месте документа. Если вы хотите вырезать текст, а не скопировать его, воспользуйтесь одной из команд удаления. Например, команда 5dd вырежет текущую и четыре следующих строки, и также скопирует их в буфер. После этого эти строки можно будет вставить в другом месте в документе с помощью команды р или Р. ВНИМАНИЕ! vi хранит только тот текст, который был скопирован или "вырезан" последним. Другими словами, если вы воспользуетесь командой dd, чтобы вырезать/удалить какую-нибудь строку текста, а затем позже воспользуетесь командой уу, чтобы скопировать какую-нибудь строку текста, текст, помещенный в буфер после операции dd, будет заменен текстом, скопированным при операции уу (то есть существующий в буфере текст будет перезаписан). Это означает, что текст, удаленный при операции dd, будет больше недоступен, и отменить эту операцию удаления тоже уже будет нельзя. vi имеет еще много мощных функциональных возможностей; если мы начнем их все здесь описывать, у нас получится пособие не по FreeBSD, a no vi. Когда вы познакомитесь с vi, вы согласитесь, что это очень мощный редактор, который предлагает быстрый и надежный способ для редактирования документов. Если вы хотите узнать больше о vi, прочтите какую-нибудь книгу по этой теме.
186 FreeBSD как настольная система Часть II Графическое редактирование текста с помощью KEdit или gedit KDE поставляется с полнофункциональным текстовым редактором, который похож на "Блокнот" в Windows и называется KEdit. Эту программу можно найти в меню К, в разделе Editors (Редакторы). GNOME тоже поставляется с текстовым редактором типа "Блокнота", который называется gedit и который можно найти в меню Applications (Приложения), в разделе Accessories (Стандартные), где он указан под названием Text Editor (Текстовый редактор). Окно gedit показано на рис. 6.6. Работа в любом из этих текстовых редакторов очень похожа на работу с "Блокнотом" в Windows: для выполнения операций, таких как открытие и сохранение файлов, используется меню File (Файл), а для выполнения операций вроде копирования и вставки выделенного при помощи мыши текста — меню Edit (Правка) (и соответствующие клавиатурные комбинации). Как показано на рис. 6.6, эти редакторы также предоставляют функциональные возможности, которых в "Блокноте" вы не найдете: например, gedit автоматически выделяет части текста распознаваемых файлов программ (таких как файлы сценариев программной оболочки) другим цветом и шрифтом с полужирным начертанием, хотя это специальное форматирование в простых текстовых файлах все равно не сохраняется. Это специальное форматирование особенно важно для программистов, которым возможность видеть переменные, выделенными одним стилем, а операторы управления выполнением программы — другим, очень помогает. t**^(^вшшашяштшшшшшшлйшыл^ о * ЕНе Edit yjew search toots Documents fcjelp . Q e» \ Q • a 4 * ! New Open « i*» ' Pnnt ' i i'j f» ^cups.ah.eample X г * ~~ ~ *~ #### OS-Dependent Configuration in lS_ON^/sbin/chkconfig . if $IS_0N verbosej then ECH0=eeho else ECHO»! fi ECHO 0K«s ECHO ERROR-s Ж Copy i * Find unanip ' IRIX*) ¦BSD*) IS ON*: FCHP*echo tn 1. Col 1 Puc. 6.6. gedit, встроенный текстовый редактор в GNOME. Эквивалентен редактору KEdi t в KDE
Работа с приложениями Глава 6 НА ЗАМЕТКУ Если вы запустили KDE или GNOME от имени отличного от root пользователя (а так и должно быть), вы обнаружите, что не можете напрямую редактировать конфигурационные файлы системы, права на редактирование которых имеются только у пользователя root. В KDE вы можете обойти эту проблему, щелкнув на кнопке Options (Параметры) в диалоговом окне Run Command (Выполнить команду), отметив флажок Different User (Другой пользователь) в появившейся после этого панели и затем указав имя пользователя и пароль пользователя root для того, чтобы получить привилегии пользователя root (которые будут действительными только для текущего процесса (сеанса) KEdit). В GNOME такой возможности, к сожалению, нет; вам придется либо запустить GNOME от лица пользователя root {что очень опасно), либо просто сохранить отредактированный файл в папке, в которой вам разрешено выполнять запись, а затем воспользоваться командной su в терминальном окне, чтобы сымитировать привилегии пользователя root, и переместить отредактированный файл обратно на его место. Именно из-за необходимости выполнять так много лишних операций даже пользователи KDE и GNOME для работы с конфигурационными файлами системы часто предпочитают пользоваться текстовыми редакторами, имеющими не графический интерфейс, а интерфейс командной строки. Офисные приложения То, что вы пользуетесь операционной системой с открытым кодом, вовсе не означает, что вам придется обходиться без "рабочих** приложений, к которым вы привыкли, когда применяли Windows. Долгое время офисные приложения, способные заменить коммерческие, но крайне необходимые приложения Microsoft Office, были дефицитом в мире ПО с открытым кодом, но сегодня на рынке доступно уже несколько замечательных офисных пакетов, которые предоставляют все те же функциональные возможности, что и Microsoft Office, и даже больше. KDE поставляется со встроенным офисным пакетом, который называется KOffice. KOffice включает одиннадцать приложений; среди них такие приложения, как KWord, KSpread, KPresenter и Kivio, которые по своим функциональным возможностям соответствуют таким приложениям, как Word, Excel, PowerPoint и Visio. В KOffice также доступно приложение Krita, которое представляет собой мощную программу для работы с изображениями типа Photoshop, и еще несколько других приложений, которых в пакете Microsoft Office нет. Приложения пакета KOffice можно найти в меню К, в разделе Office (Офисные приложения). Пользователям GNOME придется устанавливать офисные приложения отдельно, но главное что они есть: AbiWord — это текстовый процессор наподобие Word; Gnumeric — это приложение типа электронной таблицы* a GNOME-DB — это программа для работы с базами данных. AbiWord можно найти в коллекции портов или пакетов FreeBSD, в категории editors, a Gnumeric — в разделе math. Однако, пока в пакете GNOME Office-больше никакие другие приложения не доступны, поэтому возможно вы захотите попробовать работать с приложениями из пакета KOffice (многие из которых спокойно запускаются и в GNOME) или же воспользоваться третьим из доступных для FreeBSD офисным пакетом. OpenOffice.org (так называется и сам офисный пакет, и Web-сайт, на котором его можно найти) — это вариант разработанного корпорацией Sun пакета StarOffice, исходный код которого был сделан полностью доступным и в основе которого лежат новые стандарты функциональной совместимости. OpenOffice 2.0 (эта версия является самой последней на сегодняшний день) включает шесть приложений: Writer,
188 FreeBSD как настольная система Часть II Impress и Calc, которые по своим функциональным возможностям соответствуют Word, PowerPoint и Excel, а также Math (редактор математических формул), Draw (программа для работы с векторной графикой и создания диаграмм, подобная Visio) и Base (серверное приложение для работы с базами данных). На рис. 6.7 показано, как выглядит окно программы Writer. Erie Edit View |ns«rt Fftrmat Table look Window Help fy Default «¦ BftstraamVeraSenf Ў 12 s / и. m x ш •» ss * * Д-»"&- к _1_ i ::» S ^ ^ lS V i ifc ¦"* « :* - OpenOfflce.org Demonstration OpenOffice Wnter has a lot of features you'd expect to find in commercial office applications such as §реЩ&Пбс?щд, ш-line images, and automatic bulleted lists: 1. Drag-and-drop from the desktop 2. AnJjaiJaftgd fonts 3. 100» WSRT STD jHYP * Рис. 6.7. OpmOffice.org Writer, прекрасная подобная Microsoft Word про- грамма, которая распространяется с открытым кодом и предлагает множество уникальных функциональных возможностей OpenOffice 2.0 можно найти в коллекции портов и пакетов FreeBSD, в категории editors. Если вы решите загрузить OpenOffice 2.0 через Internet, скорее всего, вы от- дадите предпочтение пакетной версии, потому что полная версия со всем исходным кодом занимает 262 Мбайт и на ее компиляцию может уйти огромное количество времени. Если найти этот пакет с помощью команды pkg_add -r openoffice-2.0 не удается, зайдите на сайт OpenOffice.org и, следуя по ссылкам, загрузите FreeBSD- версию этого пакета, а затем установите его, воспользовавшись командой pkg_add имя-файла-пакета. Функциональная совместимость Когда речь заходит об офисных приложениях, распространяемых с открытым кодом, у всех, естественно, возникает вопрос о функциональной совместимости поддерживаемых ими файловых форматов. Одно дело иметь замечательную программу обработки текстов или полнофункциональную электронную таблицу для создания и распечатки своих собственных файлов, но какой от них толк, если с их помощью нельзя ни открывать документы, присылаемые коллегами по работе, ни создавать документы, которые те могли бы прочитать в Microsoft Word, Excel или PowerPoint? Разработчикам всех трех упоминавшихся здесь офисных пакетов было очень хорошо известно об этом существующем уже много лет "камне преткновения**. Поэтому
Работа с приложениями | 7Г7 I Глава 6 I I разработчики OpenOfflce.org создали формат, который называется OpenDocument. Этот формат представляет собой основанную на XML расширяемую архитектуру, и он получил одобрение OASIS (это организация, занимающаяся разработкой стандартов для основанных на XML форматов данных в офисных документах). Целью как OASIS, так и OpenDocument является сделать так, чтобы в будущем текстовые документы, электронные таблицы и другие, имеющие очень важное значение, виды офисных документов не привязывались к одному единственному приложению, а могли нормально открываться в других приложениях без потери своих функциональных возможностей. Компании, среди которых ЮМ, одобрили формат OpenDocument и сейчас занимаются разработкой приложений, которые будут его поддерживать. Корпорация Microsoft, которая до настоящего время контролировала файловые форматы для Word, Excel, PowerPoint и других выпускаемых ею офисных приложений, пока (по не совсем понятной причине) отказалась принимать формат OpenDocument и предпочла продвигать свой собственный "полуоткрытый" основанный на XML стандарт для документов; но Microsoft является спонсором организации OASIS, поэтому можно не сомневаться, что в ближайшем будущем этот вопрос станет источником проблем и разногласий. Пока что же он остается открытым и активно обсуждается; более подробную информацию и все последние новости об успехах формата OpenDocument можно найти на Web-сайте OpenOffice.org. Тем не менее, все описываемые в этой главе офисные приложения — KOffice, GNOME Office и OpenOfflce.org — позволяют читать документы Microsoft Word и Excel. Запись в документы форматов Microsoft, однако, они поддерживают хуже. Предметом гордости OpenOfflce.org является возможность создания полностью совместимых с продуктами Microsoft файлов в таких программах, как Writer, Calc и Impress; этим же может похвастаться и программа AbiWord. Программа Gnumeric, однако, позволяет только импортировать файлы Excel, но не экспортировать их. А приложения из пакета KOffice, такие как KWord и KSpread, пока имеют только фильтры, которые поддерживают импортирование документов Microsoft Office; выполнять в них запись они пока еще не разрешают. (Последние новости о состоянии функциональной совместимости приложений KOffice можно найти по адресу http: //kof f ice. org/f ilters.) Поскольку функциональная совместимость является главной задачей и самой привлекательной характеристикой пакета OpenOffice.org (который доступен для всех коммерческих платформ, а не только ддя UNIX), он, скорее всего, окажется наиболее подходящим вариантом для вас, если вам необходимо иметь возможность работать с совместимыми с Microsoft Office приложениями, какую бы настольную среду вы не использовали. Создание и редактирование изображений с помощью GIMP Для FreeBSD доступно несколько программ, позволяющих работать с графикой или редактировать изображения, вроде программы bitmap, которая позволяет создавать фоновые узоры и указатели мыши, и программы Xfig, позволяющей делать рисунки и иллюстрации. KDE и GNOME тоже поставляются с простыми программами для редактирования изображений, такими как программа KolorPaint, которая является эквивалентом программы Microsoft Paint, и программа Krita, которая пред-
190 FreeBSD как настольная система Часть II ставляет собой полнофункциональное приложение типа Photoshop и входит в пакет KOffice. Однако самой значительной и полнофункциональной программой для работы с графикой в мире ПО с открытым кодом на сегодняшний день является программа GIMP. GIMP (GNU Image Manipulation Program — Программа манипулирования изображениями GNU) — это доступная бесплатно программа для редактирования изображений, которая разрабатывалась как часть проекта GNU. Она обладает множеством усовершенствованных функциональных возможностей, среди которых слои, фильтры, пути и поддержка для ввода данных с планшетных ПК. Она создавалась с целью предоставить пользователям бесплатный вариант Adobe Photoshop и поэтому названия многих опций в GIMP будут вам знакомы и понятны, если вы знакомы с Photoshop. К схеме расположения элементов в GIMP, однако, придется какое-то время привыкать. GIMP распознает большинство популярных форматов изображений, в частности BMP, GIF, JPEG, PNG, PCX и TIFE GIMP также может считывать файлы PostScript и даже считывать и записывать файлы в формате PSD (Photoshop). GIMP можно найти в коллекции портов и пакетов FreeBSD, в категории graphics. Установив GIMP, вы можете просто ввести gimp в терминальном окне сеанса XII или воспользоваться окном Run Application (Запуск приложения) или Run Command (Выполнить команду), как описывалось ранее в этой главе. На рис. 6.8 показано основное окно панели управления GIMP в самом простом его виде, без дополнительных палитр и окон. Ешгш*шл№*т® \ Eile ?tns tjelp ] И» «* N 4J Ч» Щ / ? а * А «ъяавт <2и Б 9 J a A \р & & & * | 1 ь J ^ J Рис. 6.8. Главное окно панели управления GIMP позволяет получать доступ к раз- личным доступным в GIMP средствам, а также загружать и сохранять файлы Отправной точкой в GIMP, как правило, служит меню File (Файл). С его помощью можно открыть существующий файл, создать новый файл или получить изображение (либо из снимка экрана, либо с поддерживаемого сканера, если он установлен). На рис. 6.9 показано диалоговое окно Open Image (Открытие файла) в GIMP. В нем сначала отображается ваш домашний каталог, из которого вы запросто можете перейти в папку, где находятся файлы изображения; выберите какой-нибудь файл изображения, и его миниатюра сразу же появится в панели предварительного просмотра, которая находится в самой правой части окна. Вы также можете воспользоваться выпадающим меню Select File Type (Тип файлов), чтобы просмотреть весь перечень файлов, которые может открывать GIMP.
Работа с приложениями Глава 6 191 :ШШШ^ШШШ9^ |e>DtiktQp S Fikiyitem J_= I Bb'hwiif' | Nam* 0> Desktop *>QNU»tep (&Timpl«tii Qbttmtp.tifF hbleekbo*.tiff Oblth Dfliti p«ta hfii.3 Qfil4 In nrwnrt trfF Ў | Modified | p| 11/12/05 11Д2/05 11/07/05 11ДЭ/05 [J 11/13/05 g Tuesday Щ 11/10/05 № 11/10/05 1 11/10/05 1 11/10/05 i nn?«v% E P/avlew glmpl.tiff 31.4 KB 200х272рЫе1е RGB, 1 Layer All Files > Select File Дуре (Automatically Detected) S8a«'p | If Cancel B»Qpen I Puc. 6.9. Открытие файла в GIMP. В окно открытия файлов встроено окно для предварительного просмотра, а также фильтры для фильтрации файлов по типам Открыв нужный файл (или создав новый) вы можете использовать различные кисти и инструменты редактирования (которые доступны в большом количестве и многие из которых являются копией аналогичных опций Photoshop), чтобы отредактировать изображение. Используйте слои, чтобы отредактировать части изображения, не причиняя вреда, и пути, чтобы нарисовать плавные кривые, которые вы затем сможете "заштриховать" линией выбранного стиля. И, наконец, сохраните файл в формате XCF, который является используемым по умолчанию форматом в GIMP, или выберите формат Photoshop PSD, чтобы создать файл, который смогут открывать пользователи Photoshop и в котором сохранится вся информация о созданных вами слоях и путях. В диалоговом окне Save Image (Сохранение файла) укажите тип выходного файла, просто включив в имя файла необходимое расширение; например, для сохранения изображения как файла TIFF в поле для имени файла введите имя. tiff. Аудиоприложения Поддержка звуковых и мультимедийных устройств в FreeBSD стала значительно лучше за последние годы, а ведь долгое время ее вообще практически не было. Сегодня FreeBSD поддерживает достаточно большое количество различных популярных звуковых карт, будь то хоть подключаемые устройства типа устройств серии SoundBlaster производства компании Creative или интегрируемые в материнскую плату наборы звуковых микросхем типа микросхем серии nForce производства NVIDIA. Если у вас установлена одна из этих или множества других популярных звуковых карт, шансы, что FreeBSD будет ее поддерживать с помощью своего собственного драйвера, очень высоки. Даже если у FreeBSD нет своего собственного драйвера для поддержки вашей звуковой карты, скорее всего, вы сможете приобрести нужный вам драйвер у компании 4Front Technologies. Звуковые драйверы для FreeBSD б.дс (и более ранних версий) доступны за $49 на официальном Web-сайте этой компании, который
I 777 I FreeBSD как настольная система 192 I '* I Часть II находится по адресу http://www.opensound.com; там также доступны и бесплатные демонстрационные версии драйверов. Активизация звуковой поддержки В конфигурации по умолчанию у FreeBSD нет активной аудиоподсистемы. Звуковые драйверы доступны в коллекции модулей ядра, по одному для каждого типа популярной звуковой карты» Чтобы добавить звуковую поддержку, вам придется загрузить соответствующий модуль ядра. Все звуковые драйверы находятся в каталоге /boot/kernel, и названия у всех них начинаются с префикса snd_. Если определить на глаз, соответствует ли модель имеющейся звуковой карты какому- нибудь из модулей ядра по названию, вам не удается, воспользуйтесь посвященным поддерживаемому оборудованию разделом "FreeBSD Handbook" ("Руководство по FreeBSD"), который доступен по адресу http://www.freebsd.org/releases/6.OR/ hardware-i386.html#SOUND (укажите в этом адресе номер своей версии FreeBSD). Например, карта SoundBlaster Audigy 2 поддерживается драйвером snd_emulOkl. СОВЕТ Если вы все еще не уверены, какой драйвер следует использовать, или не можете найти свою звуковую карту в списке поддерживаемого оборудования на сайте руководства, вы можете попробовать воспользоваться модулем общего назначения snd_driver. Это мета-драйвер, который загружает в ядро сразу все звуковые драйверы одновременно, что может заставить вашу звуковую карту заработать. Однако все-таки лучше точно узнать, какой драйвер нужен: одновременная загрузка множества модулей ядра чревата дестабилизацией системы. Поэтому, загрузив драйверы, воспользуйтесь командной cat /dev/sndstat, чтобы точно узнать, какой именно драйвер используется. Узнав, какой драйвер нужно использовать, добавьте его в файл /boot/loader .conf для того, чтобы сделать так, чтобы он загружался во время загрузки системы: snd_emulOkl_load="YES" Затем перезагрузите компьютер. Если вы не хотите перезагружать компьютер, вы можете воспользоваться командой kldload, и загрузить модуль ядра немедленно: # kldload snd_emulOkl Затем введите команду kldstat, чтобы удостовериться в том, что звуковой драйвер загрузился. Активизировав подходящий звуковой драйвер и перезагрузив систему, введите dmesg | more, чтобы проверить вывод dmesg, генерируемый ядром. Отыщите в нем информацию, подтверждающую то, что звуковая карта была обнаружена при загрузке системе и работает нормально. Например, в моей системе вывод dmesg содержит следующие строки: sbcO: <Creative SB AWE64> at port 0x220-0x22f, 0x330-0x331, 0x388-0x38b irq 5 drq 1,5 on isaO pcml: <SB16 DSP 4.16> on sbcO Этот вывод показывает, что FreeBSD обнаружила звуковую карту SoundBlaster AWE 64, и сообщает адреса памяти и порт IRQ, которые занимает эта карта. Восполь-
Работа с приложениями Глава 6 193 зуйтесь командной /dev/sndstat, чтобы узнать больше о состоянии звуковой карты и убедиться в том, что система распознала ее правильно. Если FreeBSD не удается обнаружить вашу звуковую карту, попробуйте воспользоваться звуковыми драйверами 4Front. Как уже упоминалось, их можно получить по адресу http://www.opensound.com. СОВЕТ Чтобы ускорить процесс загрузки системы, вы, возможно, захотите скомпилировать драйвер звуковой карты в ядро так, чтобы FreeBSD не приходилось загружать его динамически при каждом включении или перезагрузке компьютера. Чтобы сделать это, добавьте в конфигурационный файл ядра — /usr/src/sys/i386/conf /MYKERNEL — две следующих строки: device sound device "snd_eraulOkl" Используйте соответствующий звуковой драйвер, указанный во второй строке. Затем перекомпилируйте ядро (процедура перекомпиляции ядра подробно описывается в главе 18). Обратите внимание на то, что когда звуковая поддержка добавляется (встраивается) в ядро, она может конфликтовать со звуковыми драйверами 4Front, если таковые приобретались; поэтому, не забудьте удалить эти драйверы из файла /boot/loader .conf, если вы их туда добавляли. НА ЗАМЕТКУ Обычно в FreeBSD генерировать аудиовывод одновременно может только одно приложение; если одно приложение запустило звуковое устройство, вы можете получить ошибку типа "не удается открыть /dev/desp!". Если подобное случится, попробуйте воспользоваться командной fstat I grep /dev/dsp, чтобы узнать, не занимает ли приложение, которое вы оставили запущенным (или которое запустил другой пользователь), устройство звукового вывода. Использование микшера Следующий шаг в настройке звука после загрузки модулей ядра со звуковой поддержкой связан с тем, чтобы с помощью микшера настроить подходящие уровни звукового вывода различных звуковых источников и установить диапазоны частот. Получить доступ к микшеру FreeBSD можно из командной строки. Чтобы сделать это, в командной строке оболочки или терминальном окне введите mixer и нажмите клавишу <Enter>. После этого ваша система выдаст примерно такие сообщения: Mixer vol is currently set to 75:75 Mixer bass is currently set to 50:50 Mixer treble is currently set to 50:50 Mixer synth is currently set to 75:75 Mixer pcm is currently set to 75:75 Mixer speaker is currently set to 75:75 Mixer line is currently set to 75:75 Mixer mic is currently set to 0:0 Mixer cd is currently set to 75:75 Mixer igain is currently set to 0:0 Mixer ogain is currently set to 50:50
194 FreeBSD как настольная система Часть II Эти сообщения демонстрируют установленные для каждого имеющегося в системе аудиоустройства уровни звукового вывода (значения приводятся в процентах от О до 100). Числа, разделенные знаком двоеточия, представляют левый и правый стереоканал каждого звукового компонента. Большинство элементов в этом списке не требует пояснения, но некоторые из них все же заслуживают особого внимания: • Mixer vol — это главный регулятор громкости для всех аудиоустройств. • Mixer pcm — это устройство, через которое воспроизводится большая часть аудиоданных. Именно это устройство будет отвечать за громкость воспроизведения файлов WAV, MP3, Real Audio и тому подобных. • Mixer synth — отвечает за уровень громкости синтезатора. Обычно влияет на файлы MIDI. • Mixer cd — отвечает за уровень громкости воспроизведения звуковых компакт- дисков. • Mixer line — отвечает за уровень громкости устройства, подключаемого к линии в разъеме звуковой карты. • Mixer igain — отвечает за уровень усиления громкости входящего потока. • Mixer ogain — отвечает за уровень усиления громкости исходящего потока. При желании изменить какой-нибудь из этих уровней, вы можете ввести mixer, a затем — имя устройства и требуемый уровень. Например, если вы введете следующую команду, уровень громкости вывода CD-устройства будет увеличен до девяноста процентов как в левом, так и в правом стереоканале: • mixer cd 90 Если вы хотите указать разные уровни для левого и правого канала, введите два значения, разделив их символом двоеточия. Например, если вы введете следующую команду, в левом канале уровень громкости будет увеличен до 100 процентов, а в правом — до 80. • mixer cd 100:80 Во время загрузки системы для большинства параметров микшера по умолчанию устанавливается значение, равное семидесяти пяти процентам. Если вы хотите, чтобы при загрузке системы для этих параметров по умолчанию устанавливались другие значения, у вас есть два варианта. Первый — создать в каталоге /usr/local/etc/rc.d загрузочный файл и включить в него список нужных команд микшера. Назвать этот файл можно как угодно. Например, вы можете назвать его mixer set. Ниже показан пример содержимого такого файла: mixer vol 80:80 mixer cd 90:90 mixer pcm 50:50 От имени пользователя root создайте такой файл в каталоге /usr/local/etc/ red и сохраните его под именем mixerset, например. Далее, сделайте этот файл исполняемым, выполнив следующую команду: • chmod u+x mixerset
Работа с приложениями Глава 6 195 Перечисленные в этом файле команды теперь будут выполняться при каждой загрузке системы, и тем самым для параметров микшера будут устанавливаться требуемые значения. СОВЕТ Если описанные шаги вам не совсем понятны, прочитайте главы 8 и 14, в которых приводится более подробная информация по этой теме. Второй вариант — добавить команды в сценарий регистрации (о котором более подробно будет рассказываться в главе 11). Откройте в своем любимом текстовом редакторе либо файл .profile, либо файл . login (в зависимости о того, какую программную оболочку вы используете) и добавьте в него те команды микшера, которые вы хотите изменить. Например, вы можете захотеть добавить в этот файл следующие строки: mixer vol 80:80 mixer cd 50:50 mixer pcm 90:90 В отличие от загрузочного файла, для внесения изменений в этот файл наличие привилегий пользователя root не обязательно. Более того, эти изменения будут вступать в силу не при загрузке системы, а при регистрации. Преимущество такого подхода заключается в том, что если системой пользуется не один, а несколько пользователей, каждый из них может создать свой собственный набор параметров настройки микшера, отвечающих его личным предпочтениям. Каждый раз, когда этот пользователь будет регистрироваться в системе, применяться будут его личные (специальные) настройки микшера. Микшеры в Х11 Тем, кто предпочитает иметь дело с графическим интерфейсом, интересно будет узнать, что для микшера доступно сразу несколько работающих на базе XII интерфейсов. Среди них KMix для KDE и GMix для GNOME, оба из которых являются стандартными компонентами соответствующих настольных сред. На рис. 6.10 показан интерфейс программы xmixer, которую можно найти в коллекции портов и пакетов FreeBSD, в разделе audio. ] 5»! ?*1 Jte]' Mof f 9ю» f 1»«Ы jp gynth|* Pern ^* 8pkr { Un* jf Ш jf CO \ iGifr f OGilnf ||[iJB EJE JiJi ЩШШ PUE fi-lf g&B ШРШ PUB EJE PUP || Puc. 6.10. xmixer, программа с графическим интерфейсом для настройки распознаваемых каналов звукового драйвера Используя пиктограммы xmixer, которые похожи на те, что применяются в Windows, вы можете визуально изменять уровень громкости левых и правых каналов
I 7Г7 I FreeBSD как настольная система 196 II Часть II (или полностью блокировать их) любого устройства звукового вывода, которое распознает FreeBSD. Вы также можете отключать определенные каналы, если они вам не нужны или если вы хотите сделать их беззвучными. Воспроизведение МРЗ-файлов в Х11 с помощью ХМ MS Теперь, когда вы настроили аудиоустройство, вы наверняка захотите воспроизвести с его помощью какие-нибудь звуки. Да, ваша МРЗ-коллекция будет работать в FreeBSD. Но для этого вам понадобится такая программа, как XMMS (X Multimedia System), которая представляет собой клон Winamp для FreeBSD и других систем типа UNIX и доступна в коллекции портов и коллекции пакетов FreeBSD в категории multimedia. НА ЗАМЕТКУ У KDE имеется свой собственный встроенный проигрыватель медиа, который называется Noatun. Если вы используете KDE, вы можете предпочесть работать с этой программой, а не с XMMS. В GNOME, в свою очередь, файлы МРЗ, Ogg Vorbis и другие типы аудиофайлов могут воспроизводиться с помощью такой программы, как Totem Movie Player. После установки XMMS вы можете запустить ее с помощью команды xmms, выдав ее либо в командной строке программной оболочки, либо в терминальном окне, либо в диалоговом окне Run Command (Выполнить команду) или эквивалентном ему окне Run Application (Запуск приложения) (если используется настольная среда GNOME). Вы также можете создать для XMMS записи в меню и ярлыки на рабочем столе, если знаете, что будете пользоваться этой программой регулярно. На рис. 6.11 показано окно XMMS, в котором также открыто окно микшера и окно со списком файлов для воспроизведения. Рис. 6.11. МРЗ-проигрыватель XMMS. Пользователи Windows, которые применяли проигрыватель Winamp, быстро разберутся в XMMS, потому что предлагаемые в XMMS элементы управления практически ничем не отличаются от тех, что доступны в Winamp
Работа с приложениями I 77Z I Глава 6 1 I Да, XMMS даже поддерживает обложки Winamp, и вам даже не нужно их предварительно извлекать из архива. Просто поместите свои заархивированные обложки для Winamp в каталог .xmms/Skins, который находится в вашем домашнем каталоге. Щелкните на пиктограмме, которая расположена в самом верхнем левом углу окна XMMS, затем выберите в меню Options (Параметры) пункт Skin Browser (Обложки). Появится диалоговое окно, в котором вы и сможете выбрать нужную обложку. СОВЕТ Для того, чтобы вы могли использовать заархивированные обложки, вам придется установить программу unzip, которая доступна в коллекции портов и пакетов FreeBSD и находится там в категории archivers. Помимо обложек Winamp, вы также можете использовать и обложки XMMS, которые в огромном количестве доступны по адресу http: //www.xmms.org/skins .php. Также как и обложки Winamp, их можно просто копировать в каталог .xmms/Skins, не извлекая из архива. Обложки XMMS обычно распространяются в виде файлов с расширением .tar .gz. Это популярный архивный формат для систем типа UNIX, который похож на формат ZIR XMMS также поддерживает различные подключаемые модули визуализации и ау- диоэффектов. Многие из них можно найти в коллекции портов и коллекции пакетов FreeBSD, в категории multimedia. НА ЗАМЕТКУ Вы можете создавать свои собственные файлы МРЗ или Ogg Vorbis из своей CD-коллекции, используя любое из нескольких приложений для копирования данных с компакт-дисков, которые доступны для командной строки, Х11 или KDE/GNOME. KDE поставляется с приложением KAudioCreator, a GNOME — с приложением Sound Juicer, оба из которых будут отыскивать в оперативной базе данных информацию о записанных на CD-диске композициях и применять ее к импортируемым композициям, когда вы будете их кодировать. Однако, если вам нужен полный набор функциональных возможностей для работы с музыкальными файлами, тогда вам лучше установить такое приложение, как Amarok (для КОЕ), которое представляет собой замечательную программу для работы с музыкой и списками воспроизведения с множеством усовершенствованных функциональных возможностей, которых нет даже в iTunes, или приложение Songbird, которое представляет собой музыкальную базу данных в стиле iTunes для Linux и которое FreeBSD сможет запускать в режиме эмуляции Linux. Сетевые приложения Для FreeBSD доступно огромное количество сетевых приложений. В этом разделе речь пойдет о Web-браузерах, программах по обработке электронной почты и FTP- приложениях, которые можно устанавливать в FreeBSD. Web-браузеры для Х11 В FreeBSD на выбор доступно сразу несколько замечательных Web-браузеров. Все они предлагают усовершенствованные функциональные возможности вроде воз-
FreeBSD как настольная система можности просмотра Web-страниц с вкладками и блокировки всплывающих окон, что очевидно делает их более привлекательными по сравнению с Web-браузерами, предлагаемыми для Windows. Главное место в мире Web-браузеров занимают браузеры семейства Mozilla, история которых началась во времена перехода компании Netscape на разработку ПО с открытым кодом, когда она была вынуждена признать, что проиграла борьбу на рынке коммерческих браузеров браузеру Microsoft Internet Explorer. За следующие несколько лет команда разработчиков Netscape с помощью тысяч добровольцев со всего мира создала механизм визуализации Gecko, браузер Mozilla (а также его коммерческий аналог Netscape 6/7) и, наконец, межплатформенный браузер Firefox, который получил широкое признание, какого команда Netscape не видела с 1996 года. В это же время Gecko был использован во многих альтернативных проектах браузеров, таких как Epiphany (этот настольный и Web-браузер впоследствии был встроен в GNOME). Тем временем на основе более новых и быстрых механизмов визуализации также разрабатывались и альтернативные браузеры, такие как Konqueror (встроенный браузер KDE), который был создан на основе KHTML. KHTML был настолько эффективным и совершенным, что послужил основой для браузера Safari, который разработала корпорация Apple и который был встроен в Mac OS X. Если вы работаете в KDE, в качестве браузера вы можете использовать приложение Konqueror, а если в GNOME — то приложение Epiphany. Однако, в любой из этих настольных сред, как, впрочем, и если применяется простой оконный диспетчер, браузер Mozilla или Firefox будет наилучшим выбором. НА ЗАМЕТКУ Поскольку Firefox является межплатформенным браузером, который может запускаться как в Windows, Mac OS X, так и в FreeBSD, вы можете установить его на всех своих компьютерах, какая бы операционная система на них не использовалась; вы также можете воспользоваться централизованной системой закладок, такой как del.icio.us для обеспечения согласованности в работе браузера на разных платформах. И Firefox, и Mozilla доступны в коллекции портов и пакетов FreeBSD, в категории www. Установив браузер, вы можете запустить его либо с помощью команды mozilla или firefox (в зависимости от того, какой из этих браузеров вы установили), либо выбрав его в меню приложений в KDE или GNOME. При первом запуске браузер Firefox предоставляет вам возможность импортировать ваши предпочтения, закладки и другие данные из предыдущей установки Netscape или Mozilla. Выберите подходящую опцию и щелкните на кнопке Next (Далее), чтобы пройти через процесс импортирования, если в этом есть необходимость. Когда вы сделаете это, можете начинать пользоваться Firefox (рис. 6.12) и всеми его современными функциональными возможностями, которые сделали этот браузер таким популярным на всех платформах. У Firefox имеется очень много опций настройки, получить доступ к которым можно, выбрав в меню Edit (Правка) пункт Preferences (Настройки). Вы можете изменить многие аспекты внешнего вида и поведения Firefox, включая то, как он будет обрабатывать сохраняемые ссылки на просматривавшиеся Web-страницы, пароли, вводимые в полях форм данные и cookie-наборы.
Работа с приложениями Глава 6 199 звди E<le Edit View fio Bookmark» Ioolt Help тштшввшшаш ' Ф Ъл1 •* http./A«ww.mozilla.corn/fir«fox/cer * © Go Й* •^Getting Started U»Uteat Haadl nt* Welcome to Firefox Redely to experieme the Гм fox diff lentW Heie are some tip & to ks for getting started Check out these cool features • T>bh»d Browsing. Surf more than one website at the tame time t* make browsing m re convenient • Uve Bgpkmarlca • peed up-to-date headlines from your favorite websites and Ы g« • Search Bar - Find what you want when you want Customize your browser Get the latest media pluqint for watching movies and Search playing gamee n your { ftnd Extensions j browser. Extend the power of Firefox with mno alive We can make tome reeommaryfowna. or you can search for yourself. Add search engines Vbeve put a few popular ear h sites in the ^r^ Рис. 6.12. Web-браузер Firefox. Щелкните на пиктограмме с округлым узором в форме цветка, которая находится в конце строки меню, чтобы узнать о дополнительных, более интересных возможностях Firefox и том, как ими пользоваться Web-браузер Lynx Lynx — это Web-браузер с интерфейсом командной строки, который запускается в текстовом режиме и не имеет никаких графических возможностей. Он пытается визуализировать Web-страницы в формате, наиболее близком к тому, в котором они бы отображались в графическом браузере. Работать в Web с браузером Lynx становится все труднее и труднее в наши дни, потому что он не поддерживает изображений, фреймов, JavaScript, CSS, Flash и прочих технологий, которые делают сегодняшние Web-страницы такими, какие они есть. Поскольку на многих сайтах в качестве ссылок используются изображения и дескрипторы ALT не применяются, это может привести к появлению навигационных проблем в Lynx, которые будет трудно или вообще невозможно обойти. Однако Lynx по-прежнему остается незаменимым средством для загрузки важных файлов или получения важной информации с утилитарных сайтов, например, для загрузки репозиториев или документальных архивов, особенно если используется система, на которой не установлена XII. На рис. 6.13 показано окно Lynx с загруженным в нем (теперь достаточно "недружественным" к Lynx) Web- сайтом FreeBSD. Lynx по-прежнему может работать со многими сайтами, хотя навигация в них теперь не всегда оказывается такой уж простой задачей. Для перехода по ссылкам в окне браузера используйте клавиши с изображением стрелки вверх и стрелки вниз; для перехода на одну ссылку вперед или назад применяйте клавиши с изображением стрелки вправо и стрелки влево. Клавиша пробела выполняет тоже действие, что и клавиша <Page Down>. Чтобы перейти на другЪй Web-сайт, введите G; после этого появится приглашение ввести URL-адрес. Чтобы завершить работу Lynx, нажмите клавишу <Q>.
200 FreeBSD как настольная система Часть II The FreeBSD Project (pi of 9) | FreeBSD Security Mvteories FreeBSD СМИЕ Project***» Skip site navigation (1) Skip section navigation (2) Header And Logo ol/ Peripheral Links * Text Size: ¦ Contact Arrow keys: Up and Down to Move. Right to follow a link.; Left to go back. h>lp Options P>int G)o h>in screen Q)uit /search [deletej-hiatory list | Рис. 6.13. Web-сайт FreeBSD в окне браузера Lynx Lynx доступен в коллекции портов и пакетов FreeBSD, в категории www. Более подробную информацию о Lynx и его опциях настройки можно найти на соответствующей странице руководства: man lynx. СОВЕТ Lynx постепенно вытесняют более полнофункциональные текстовые браузеры, такие как w3m и link, оба из которых доступны в категории www коллекции портов и пакетов. Эти браузеры пытаются визуализировать такие элементы, как фреймы, таблицы и меню, что выходит за пределы возможностей Lynx. FTP FTP (File Transfer Protocol — протокол передачи файлов) — это проверенный временем, надежный метод передачи файлов между системами. Пользователям Windows протокол FTP может быть знаком только в качестве способа для загрузки ПО с центрального сервера распространения; но, являясь владельцем системы FreeBSD, вы сможете превратить свою собственную машину в FTP-сервер и тем самым обеспечить себе возможность передачи файлов в двух направлениях с минимальным количеством затрат. (Подробнее о том, как именно это делается, будет рассказываться в главе 27.) Использование FTP для загрузки файлов — это утилитарная область, которая никогда особо не разрабатывалась для приложений с графическим пользовательским интерфейсом в мире ПО с открытым кодом. Традиционный способ передачи файлов через FTP представляет собой довольно старый способ и предполагает просто выполнение программы ftp в командной строке. Чтобы запустить сеанс FTP, введите ftp, а затем — имя сервера, к которому вы хотите подключиться. Например, для подключения к FTP-серверу FreeBSD необходимо ввести следующую строку: # ftp ftp.freebsd.org
Работа с приложениями Глава 6 201 Когда вы сделаете это (если соединение будет успешно установлено), на экране через какое-то время появится следующее сообщение: Connected to ftp.freebsd.org. 220 ftp.FreeBSD.org NcFTPd Server (licensed copy) ready. Name (ftp.freebsd.org:btman): Подключено к ftp.freebsd.org. 220 ftp.FreeBSD.org Сервер NcFTPd (лицензированная копия) готов. Имя (ftp.freebsd.org:btman): Вы можете подключиться к приватному FTP-серверу, на котором вам потребуется создать для себя отдельную учетную запись пользователя, а можете — к серверу общего доступа, на котором разрешено регистрироваться как анонимному пользователю. Если вы подключились к приватному серверу, в командной строке с подсказкой Name введите название своей учетной записи и нажмите клавишу <Enter>, а затем, когда появится соответствующее приглашение, введите свой пароль. Если вы подключились к общественному серверу, введите специальное имя пользователя anonymous. После этого вы увидите следующее сообщение: 331 Guest login ok, send your e-mail address as password. Password: $31 Гостевой вход разрешен, в качестве пароля укажите свой электронный адрес Пароль: На общественных FTP-серверах средством для регистрации подключающихся пользователей служат пароли, в качестве которых предлагается указать свой электронный адрес; будет это действительный электронный адрес и выдуманный — решать вам. Введите в качестве пароля электронный адрес (настоящий или придуманный, как хотите). Обратите внимание на то, что вводимый вами пароль отображаться на экране не будет. Когда вы зарегистрируетесь, на экране появится приветственное сообщение, а затем какое-нибудь такое сообщение: Remote system type is UNIX. Using binary mode to transfer files. ftp> Удаленная система: UNIX. Для передачи файлов будет использоваться бинарный режим. ftp> Далее вы можете использовать многие те же команды, что и в локальной оболочке, для навигации по FTP-серверу. (Более подробно команды программной оболочки и правила работы с ними будут рассматриваться в главе 8.) В табл. 6.9 перечислены некоторые наиболее часто используемые в сеансах FTP команды. Вы также можете ввести после приглашения f tp> команду help, чтобы получить список всех доступных команд. Если после help вы введете одну из перечисленных в этом списке команд, вы получите краткое описание того, что эта команда делает.
202 FreeBSD как настольная система Часть II Таблица 6.9. Команды, наиболее часто используемые при работе с FTP Команда Действие Is cd pwd led binary put filename (имя файла) remotename (удаленное имя) mput filel (файл!) file2 (файл 2) get filename (имя файла) localname (локальное имя) mget filel (файл!) file2 (файл 2) Отображает содержимое каталогов удаленного хоста. Переводит в другой каталог на удаленном хосте. Отображает текущий каталог удаленного хоста, в котором вы сейчас находитесь. Переводит в другой каталог на локальном хосте. (Эта команда доступна лишь в некоторых клиентских программах FTP.) Передает файлы в бинарном режиме (этот режим следует использовать для передачи любых файлов, кроме текстовых). Передает файлы в режиме ASCII (этот режим следует использовать для передачи только обычных текстовых файлов и то только если это действительно необходимо). Задачей режима ASCII является преобразование символов конца строки в текстовых файлах из формата, в котором они используются на исходном хосте, в формат, принятый на целевом хосте. Если файлы передаются из UNIX в Windows или наоборот, режим ASCII играет важную роль; но между системами UNIX в преобразовании нет никакой необходимости, поэтому в таком случае этот режим не имеет никакого значения (то есть использовать его не нужно). Копирует файл filename (имя файла) на удаленный хост. Если путь к файлу filename (имя файла) не указывается, предполагается, что он находится в текущем каталоге. Если не указывается целевой файл, файл filename (имя файла) будет размещен на удаленном хосте в текущем каталоге и иметь такое же имя, как и локальный файл. (Эта команда будет работать только при наличии разрешения записывать данные в каталог на удаленной машине.) Аргумент remotename (удаленное имя) является необязательным; если он вводится, файлу, скопированному на удаленный хост, присваивается указанное в нем имя. Копирует перечисленные файлы на удаленный хост. Эти файлы помещаются в текущий каталог на удаленном хосте. (Чтобы эта команда работала, потребуется наличие разрешения на выполнение записи данных в каталог на удаленной машине.) Копирует файл с удаленного хоста на локальную систему. Если путь не указывается, предполагается, что файл находится в текущем каталоге на удаленном хосте. Если не указывается целевой файл, файл копируется на локальную систему с тем же именем. Аргумент localname (локальное имя) является необязательным; если он задается, файлу на локальном хосте присваивается указанное в нем имя. Извлекает перечисленные файлы с удаленного хоста. Эти файлы размещаются в локальной системе в текущем каталоге. В этой команде также можно применять групповой символ * для извлечения из каталога всех файлов, которые отвечают заданным критериям.
Работа с приложениями Глава 6 203 Окончание табл. 6.9 Команда Действие mkdir dirname (имя каталога) rmdir dirname (имя каталога) или rm dirname (имя каталога) del filename (имя файла) bye или quit Создает на удаленной машине каталог под названием dirname (конечно, при условии наличия у использующего ее пользователя соответствующих прав). Удаляет с удаленной машины каталог под названием dirname (конечно, при условии наличия у использующего ее пользователя соответствующих прав). Удаляет с удаленной машины файл filename (имя файла) (конечно, при условии наличия у использующего ее пользователя соответствующих прав). Разрывает соединение с удаленным хостом и завершает работу программы FTP, возвращая пользователя в программную оболочку. Например: f tp> help Commands may j $ account append ascii bell binary bye case cd cdup chmod close cr debug delete dir disconnect edit epsv4 exit be abbreviated. features fget form ftp gate get glob hash help idle image led less lpage lpwd Is macdef mdelete mdir mget mkdir Commands are: mis mlsd mist mode modtime more mput mreget msend newer nlist nmap ntrans open page passive pdir pis pmlsd preserve progress prompt proxy put pwd quit quote rate revbuf recv reget remopts rename reset restart rhelp rmdir rstatus runique send sendport set site size sndbuf status struct sunique system tenex throttle trace type umask unset usage user verbose xferbuf ? ftp> help mdir mdir lis^t contents of multiple remote directories ftp> Более подробную информацию об использовании FTP вы сможете найти на соответствующей странице руководства. Чтобы получить доступ к этой странице, просто введите в командной строке оболочки команду man ftp. Также не лишним для вас будет прочитать в главе 8 разделы, посвященные командам для работы с файлами, потому что команды, используемые в FTP, очень на них похожи. В листинге 6.1 показан пример того, как может выглядеть сеанс FTR
204 FreeBSD как настольная система Часть II Листинг 6.1. Пример сеанса FTP # ftp ftp.freebsd.org Trying 62.243.72.50.. . Connected to ftp.freebsd.org. 220 ftp.FreeBSD.org NcFTPd Server (licensed copy) ready. Name (ftp.freebsd.org:btman): anonymous 331 Guest login ok, send your complete e-mail address as password. Password: 230-You are user #113 of 1000 simultaneous users allowed. 230- 230 Logged in anonymously. Remote system type is UNIX. Using binary mode to transfer files. f tp> Is 502 Unimplemented command. 227 Entering Passive Mode (62,243,72,50,247,103) 150 Data connection accepted from 12.104.153.15:4481; transfer starting. drwxr-xr-x 3 ftpuser ftpusers 512 Oct 12 09:27 pub drwxr-xr-x 3 ftpuser ftpusers 512 Oct 12 10:48 sug 226 Listing completed. f tp> cd pub/FreeBSD/tools 250 "/pub/FreeBSD/tools" is new cwd. ftp> get gunzip.exe local: gunzip.exe remote: gunzip.exe 227 Entering Passive Mode (62,243/72,50,245,41) 150 Data connection accepted from 12.104.153.15:4542; transfer starting *=>for gunzip.exe (37178 bytes) . 100% | *************************************| 37178 42.41 KB/s 00:00 226 Transfer completed. 37178 bytes received in 00:00 (42.38 KB/s) f tp> bye 221 Goodbye. # Если вы бы предпочли работать в XII с каким-нибудь графическим клиентом FTP, знайте, что в категории ftp доступны несколько использующих GUI-интерфейс клиентских приложений FTP. Среди них ряд таких, которые интегрируются в KDE (типа приложения Kasablanca), и несколько таких, которые работают в любой настольной среде (вроде программы f tpcube), а также парочка таких, которые работают одинаково хорошо в обоих режимах (типа программы gf tp). Эти полнофункциональные клиентские FTP-приложения обычно поддерживают шифрование SSL/TLS, многопоточную обработку, управление сайтами (закладки) и передачу файлов путем перетаскивания. Однако, хотя они и являются столь удобными и дружественными к пользователю, большинство пользователей UNIX все равно предпочитают применять для выполнения своих повседневных задач, связанных с передачей файлов, проверенный временем FTP-клиент с интерфейсом командной строки. Приложения электронной почты Приложение электронной почты было разработано для Internet одним из первых и по сей день остается одной из самых популярных и необходимых программ. Для
Работа с приложениями | ГГГ I Глава 6 I I FreeBSD доступно множество клиентских приложений электронной почты, как с графическим интерфейсом, так и с интерфейсом командной строки. Как администратору FreeBSD, вам придется установить клиентские приложения электронной почты не только для себя, но и для всех пользователей, которым вы хотите разрешить доступ к вашей системе: они могут предпочесть пользоваться не графическим клиентом на своей машине Windows, а клиентом с интерфейсом командной строки, таким как Pine, прямо на сервере FreeBSD. В этом разделе мы рассмотрим несколько наиболее популярных клиентских приложений электронной почты, доступных как для командной оболочки, так и для XII. СОВЕТ Помимо Internet-соединения, вам также нужно будет сконфигурировать и настроить агент передачи сообщений (Mail Transfer Agent — МТА), такой как Sendmail, прежде чем вы сможете пользоваться каким-либо из этих клиентских приложений электронной почты. Кроме того, при необходимости извлекать почту с сервера РОРЗ или IMAP поставщика услуг Internet, вам также нужно будет сконфигурировать службу вроде Fetchmaii. He все из рассматриваемых здесь клиентских приложений требуют соблюдения этого условия, поскольку некоторые из них могут передавать почту самостоятельно; но если вы амбициозны и любите, чтобы все было по правилам, вы пожалуй все равно предпочтете применять Fetchmaii вместе с локальным агентом передачи сообщений (МТА). Такая конфигурация предоставляет намного больше возможностей при работе с электронной почтой, потому что предполагает использование "родной" системы обработки почты FreeBSD и позволяет программной оболочке или утилитам, таким как xbif f, уведомлять вас о поступлении нового электронного сообщения. Эти возможности будут недоступны, если вы будете пользоваться встроенными функциями почтового клиентского приложения. Более подробно о том, как именно можно настроить FreeBSD для отправки и получения электронной почты, будет рассказываться в главе 25. Программа Pine Pine — это клиентское приложение электронной почты и новостей с текстовым интерфейсом, которое разрабатывалось с расчетом на "нетехнических" пользователей UNIX (например, студенты университетов). Благодаря тому, что им относительно легко пользоваться, и тому, что оно имеет интерфейс программной оболочки, любое количество удаленных пользователей, которые регистрируются на удаленном терминале, могут эффективно обрабатывать свою электронную почту, не устанавливая никаких объемных клиентских приложений электронной почты на своих собственных компьютерах. Программа Pine доступна в коллекции портов и пакетов FreeBSD; ее можно найти в категории mail. На рис. 6.14 показано главное меню Pine. К сожалению, Pine имеет репутацию плохо спрограммированного и небезопасного приложения. Хотя все известные на сегодняшний день проблемы с безопасностью в этом приложении были устранены, многие эксперты по системам безопасности считают, что в Pine есть еще много других уязвимых мест, которые пока просто не были обнаружены. Некоторые из них даже утверждают, что количество таких необнаруженных уязвимостей исчисляется тысячами. Вы будете предупреждены об этих потенциальных проблемах с безопасностью, когда будете устанавливать Pine. Если вы решите сделать Pine доступным для других пользователей, вы обязательно должны предупредить и их о трудностях в плане безопасности, которые могут у них возникнуть при работе с этим приложением.
FreeBSD как настольная система 7 с I к 3 Q Copyright J Help | other cms HELP С0ЛР09Е MESSAGE MESSAGE INDEX ADORESS BOOK SETUP QUIT 1989-2665. PINE it immfPTMBif - Get help u»tng Pine - Сиро» and «nd a «mage - View neeeagw in current folder . i**»***,** - Configure Pine Options - Leave the Pine progroi о trocteeork of the University of «othlngton. 1 PrevCied 1 RelNotM | P-UtFldr»] ] NextQri | KBLocfc Рис. 6*14, Пользовательский интерфейс программы Pine основан на меню, и навигация по нему осуществляется с помощью клавиш с изображениями стрелок или путем нажатия клавиш с буквами, соответствующими тем, что указаны перед элементами меню Если безопасность исключительно важна для вашей системы (например, если в вашей системе хранятся конфиденциальные данные, к которым у этих пользователей имеется доступ), пожалуй, лучше вообще запретить пользоваться Pine (другими словами, не устанавливать Pine или удалить ее, если она уже установлена). Это может несколько расстроить ваших пользователей, но в некоторых ситуациях безопасность важнее удобства пользователей. Доступны и другие почтовые программы, которые ваши пользователи смогут применять (например, программа Mutt, которая является одним из наиболее популярных альтернативных вариантов, и более подробно будет описываться в следующем разделе). Хотя эти программы могут и не быть такими удобными в использовании как Pine, они, как правило, являются намного более безопасными. ВНИМАНИЕ! Хотя открывать электронное сообщение от имени пользователя root всегда считается плохой идеей, в случае Pine этого не следует делать категорически. А все из-за природы некоторых потенциальных уязвимостей в Pine, которые могут позволить злонамеренному пользователю выполнить в вашей системе от имени пользователя Pine какой-нибудь произвольный код, просто отправив на имя этого пользователя (даже на имя пользователя root) сообщение со специально поврежденным заголовком. Поэтому, всю корреспонденцию пользователя root лучше пересылать на учетную запись обычного пользователя и читать ее через эту учетную запись. Более подробную информацию о том, как выполняется пересылка электронных сообщений, можно найти в главе 25. СОВЕТ Вы можете и не хотеть использовать Pine для работы с электронной почтой, однако есть еще одна причина, по которой все же стоит установить эту программу: Pine поставляется с текстовым редактором pico, который представляет собой внутренний механизм Pine для составления сообщений, но также доступен и в виде отдельной программы. Многие пользователи предпочитают пользоваться pico, а не ее, vi или любым другим текстовым редактором с интерфейсом командной строки, из-за его понятного и эффективного, управляемого нажатиями клавиш интерфейса и функции автоматического выравнивания строк текста.
Работа с приложениями Глава 6 207 Программа Mutt Mutt — это еще одно клиентское приложение электронной почты с текстовым интерфейсом для FreeBSD и других операционных систем типа UNIX. Оно доступно в коллекции портов и пакетов FreeBSD, в категории mail. На рис. 6.15 показан главный экран Mutt* ввпшкшкшшта— 22 0 F Nov 16 То rootticomp-fr ( 23 0 F Nov 17 То rootteoep-fг < 24 0 F Nov 17 То rootecosp-fr i 25 0 F Nov 10 То rootecoep-fr < 26 0 F Nov 18 То rootecomp-fr < 60) comp-freebsd daily run output 14) comp-freebsd security run output 59) comp-freebsd dolly run output 14) comp-freebsd security run output 59) coep-freebsd dotty run output 26 0 F 29 0 F 30 OF 31 OF 32 0 33 0 F 34 0 F 35 0 F 36 0 F 370 F 38 0 F 39 0 F 48 OF 41 OF 42 0 F Nov 19 To rootecoep-fг { NOV 19 TO rootecoep-fr ( Nov 28 To rootocosp-fr { Nov 28 To rootocoep-fr I Nov 28 hail Delivery 9 \ Nov 21 To rooteconp-fr I Nov 21 To rootecoep-fr I Nov 22 To rootoeoep-fr ( Nov 22 To roottcoep-fr i Nov 23 To rootecomp-fr l Nov 23 To rootecoep-fr { Nov 24 To rootteonp-fr i Nov 24 To rooMcoep-fr | Nov 25 To rooteconp-fr j Nov 25 To root*coep-fr ( 59) 8) 14J 59) 162) И) S3 55) i«> 55) coep-freebsd daily run output coep-freebsd weekly run output coep-freebsd security run output coep-freebsd daily run output Posteoster notify: tee transcript for dot coep-freebsd security run output coep-freebsd dai ly run output coep-freebsd security run output ooep-freebsd dotly run output coep-freebsd security run output coep-freebsd dotly run output coep-freebsd security run output coep-freebsd doily run output coep-freebsd security run output coep-freebsd doily run output Рис. 6.15. Хотя программа Mutt не имеет такого же, как у Pine простого, основанного на меню интерфейса, она является намного более безопасной, чем Pine, а также предлагает больше опций для настройки Mutt представляет собой "помесь почтовых клиентов", отсюда и появилось название "Mutt", что в переводе означает "дворняжка". А все потому, что это относительно новое клиентское приложение, которое пытается объединять в себе все лучшие функциональные возможности Elm (очень старого клиентского приложения электронной почты, которым сейчас почти никто не пользуется) и Pine (которое разрабатывалось как более удобный в использовании вариант Elm). У Mutt имеется много приверженцев, которые могли бы подтвердить, что оно прекрасно справляется с этой задачей. Mutt — очень сложная программа с богатым набором функциональных возможностей, которая по сей день активно разрабатывается и совершенствуется. Рассмотрение сферы применения и конфигурирование Mutt выходит за рамки данной книги. На Web-сайте Mutt, находящемся по адресу www.mutt. org, доступно очень много хорошей документации и справочных пособий, в которых подробно описываются функциональные возможности и конфигурация этой мощной программы. uuencode и uudecode Нельзя не упомянуть о uuencode и uudecode. uuencode (UNIX-to-UNIX Encode — кодирование Unix-Unix) — это метод преобразования двоичных файлов в простой текст для того, чтобы их можно было пересылать по электронной почте, поскольку SMTP (стандартный протокол для пересылки электронной почты через Internet) может обрабатывать только данные, имеющие вид простого текста. Без uuencode и других методов инкапсуляции бинарных файлов пересылка электронных сообщений с вложениями и вставленными изображениями была бы невозможной.
208 FreeBSD как настольная система Часть II Чаще всего клиентское приложение электронной почты будет выполнять кодирование и декодирование вложений автоматически; Pine, например, будет обнаруживать вложенные файлы и представлять их в виде ссылок, так чтобы вы сразу могли сохранить их, а не заставлять вас декодировать их самостоятельно. Однако не всегда все будет происходить так гладко. Например, вы можете получить электронное сообщение с вложением, которое почтовому клиенту не удастся декодировать правильно, и которое будет отображаться в виде сотни бессмысленных строк текста: begin 644 gunzip.exe M35HZN 4D "ч .16 /6Н s, 4 (* $Q: . 3 '_\8X&W"<F_S9 (N /M& M4,_XN&\#'EMX9n+[F@(%F0 !X/$#,N058OL@AP$N"0'В7Л,10R,70ZX!ч?= M#B;_A\7X#A3HQ?@*%4[HH?_K'\(AD,l>_(/&!-MW<.,"_#>X(~GX#@S@)0]W MBP<F"T<,,==2+Y5W+D/V44U-KD/U8SV*0A!%HD/@/E/@l=*<6E/@?N,C>@J/X M$8BCA % \H] 7#NG0NEY/@ . $+OML *NA 4X (N,_NA ! #A [0@OZA [X$/) =_A [X$/CN MA!ч #".[X#E[U"E=6QT;Z$!\ч1077С48(%L-¦AP;[FE(#QP4&",,@WB"C/B&) Здесь показано, как могут выглядеть первые несколько строк закодированного uuencode файла. В строке begin содержится имя файла, в который будет сохранен этот файл после декодирования. Чтобы декодировать этот файл, сохраните вложение (или электронное сообщение), содержащее непонятно выглядящий текст в файл в целевом каталоге. Например, предположим, что вы сохранили сообщение в файле program. txt. Теперь вы можете воспользоваться следующей командой, чтобы декодировать его: # uudecode program.txt Эта команда декодирует файл и запишет его содержимое в файл с именем, которое было указано при кодировании. В данном примере в результате выполнения этой команды получился бы файл с именем gunzip.exe. Если вам необходимо закодировать файл, вы можете сделать это с помощью следующей команды (здесь предполагается, что файл, который вы хотите закодировать, называется gun zip. exe): # uuencode gunzip.exe gunzip.exe > gunzip.txt Первый аргумент в этой команде — это имя файла, который необходимо закодировать (в данном случае, это файл gunzip.exe), второй — имя выходного файла, который должен создаваться при декодировании этого файла (обычно имя этого файла будет совпадать с именем входного файла, как и в данном примере), и третий — операция переадресации выходных данных в файл под названием gunzip.txt, который будет содержать закодированный файл. Знак > показывает программной оболочке, что выходные данные должны отправляться в место, указанное справа от него. Если вы не зададите этот аргумент, выходные данные будут отправляться на экран. Операция > позволяет направить выходные данные по конвейеру прямо в почтовую программу^ если, например, вы хотите отправить закодированный файл кому-нибудь по электронной почте, как в данном примере: # uuencode gunzip.exe gunzip.exe | mail -в "Вот нужная вам программа" asmith@ somewhere.com Более подробно о переадресации входных/выходных данных и конвейерах будет рассказываться в главе 8.
Работа с приложениями Глава 6 209 СОВЕТ Другие виды кодировки, такие как Base64, являются даже еще более распространенными сегодня, чем uuencode. Если вы получите по электронной почте файл в кодировке Base64, чтобы декодировать его, вам, скорее всего, понадобится еще одна программа наподобие UUDeview (которая доступна в разделе converters коллекции портов и пакетов FreeBSD). Почтовые клиенты с графическим пользовательским интерфейсом Увеличение числа полнофункциональных клиентских приложений электронной почты для Windows и Mac OS X, получающих почту через РОРЗ и IMAP, неизбежно привело к появлению соответствующих приложений в таких полнофункциональных настольных средах, как KDE и GNOME. Если вам нужны функциональные возможности вроде фильтрации спама, интегрированной адресной книги, составления сообщений в режиме WYSIWYG, вложения графических объектов, взаимодействия с папками путем их перетаскивания, возможности создания множества учетных записей и пользователей, определения правил фильтрации сообщений и других подобных функций, без графического клиентского приложения вам никак не обойтись. Если вы используете машину с FreeBSD в качестве рабочей станции и у вас есть учетная запись POP или IMAP, через которую вы привыкли получать свою почту, вам будут доступны несколько вариантов, в зависимости от того, какую настольную среду вы выбрали. Пользователи KDE отдадут предпочтение программе KMail, которая показана на рис. 6Л6. Пользователи GNOME смогут применять встроенную программу Evolution или встроенное приложение Balsa, которое должно устанавливаться отдельно, но разрабатывалось с расчетом на GNOME. А приложение Thunderbird, создаваемое вместе с Firefox теми же людьми, вообще является замечательным полнофункциональным вариантом для пользователей любой настольной среды. мтштштшжшттшшж ?lle Edit yiew ?o Fojder Message loots Settings Help &~ aitolol QO 4 Л Folder w - feSLocal Folders e*JnbOX j-^outbox tgsent-maJI M trash J drafts ДМу IMAP Account ^Searches Unread Total к Re: Wild e-mail \л Re: Wlkl e-mail l^Your Apple Order 40954064 Has B. & Search: J Status: | ©Any Status Subject Л Your Apple Order 40918161 Has В.. Sender do not reply@appl. ¦ ШИШИ- Lance Perry Lance Perry do not reply@appl. Date (Or^ 2005-11 2005 12 2005-12" . Friday 2C У#ог А#р* *Гё»Г 4«»1«1«14Ч«« •••о^тчи»* Prom: do_not repty@apple com To: btman@mac com Date: 2005-12-03 01:48 Customer Name: Brian Tlemann Order Number: 40918161 M Invoice Number: 9227892877 Description Type Encoding Size : |@Your Apple Order 40918161 Has Been Sh... mul... 7blt . . KB " body part Plat... base64 ... KB' 5 messages, 0 unread. Рис. 6.16. KMail, полнофункциональное и современное почтовое клиентское приложение для KDE
I ГТГ I FreeBSD как настольная система II Часть II Работа с Java-приложениями Для того чтобы иметь возможность пользоваться всеми функциями в Web, а также различными межплатформенными приложениями, вы наверняка захотите установить Java. Эта имеющая вид "виртуальной машины" программная среда, созданная и запатентованная корпорацией Sun Microsystems, доступна бесплатно на сайте FreeBSD Foundation (http://www.freebsdfoundation.org/downloads/java.shtml) и, после загрузки всех соответствующих файлов, может быть установлена с помощью команды pkg_add, как показано ниже: # pkg_add diablo-jdk-freebsd6-1.5.0.06.00.tbz # pkg_add diablo-jre-freebsd6-1.5.0.06. OO.tbz В коллекции портов FreeBSD имеется целая отдельная категория Java, содержащая множество приложений и утилит для программирования, которыми вы сможете пользоваться в получившейся после установки этих файлов среде Java, и Web-страницы, включающие программы Java, будут работать так, как надо. На момент написания этой книги самой последней стабильной версией пакета JDK (Java Development Kit — комплект разработчика для Java) и JRL (Java Runtime Library — библиотека времени выполнения Java) для FreeBSD была версия 1.5. Если вам нужны более ранние версии (для целей совместимости, например), можете установить порты jdklS (или jdkl4 и jdkl3), которые были выпущены до официального лицензионного соглашения между FreeBSD Foundation и Sun и предполагают выполнение более сложной процедуры установки, чем предлагается в официальной версии JDK/JRE 1.5. Большинство пользователей предпочтут иметь дело с официальным запатентованным ПО FreeBSD Foundation, нежели с портами более ранних версий. НА ЗАМЕТКУ Компилятор Java сам написан на языке Java, что делает возможным написание Java-приложений на любой платформе, на которой установлены пакеты JDK и JRE, в том числе и FreeBSD. Установка Java-приложений Многие Java-приложения не были включены в коллекцию портов FreeBSD. Однако, поскольку Java-приложения но самой своей природе являются "переносимыми" и "совместимыми на бинарном уровне", вы можете устанавливать и запускать в FreeBSD любое написанное на Java приложение, не компилируя его. Процедуры установки Java-приложений выглядят по-разному, поэтому прежде чем устанавливать такое приложение, не забудьте ознакомиться с содержимым файла README и любой другой документации, которая поставлялась с этим приложением. Java-приложения иногда поставляются в виде сжатых Java-архивов. Такие архивы имеют расширение .jar. Чтобы распаковать Java-архив, следует ввести Java -jar, a затем — имя заархивированного файла.
Работа с приложениями 211 Глава 6 Запуск Java-приложений Java-приложения следует запускать при помощи Java Runtime Engine. Чтобы запустить Java-приложение, вызовите программу Java, указав после нее имя файла Java- класса. Многие приложения содержат множество файлов классов: узнать, какой из этих файлов вам нужен, вы сможете из поставляемой с этим приложением документации. Файлы Java-классов имеют расширение .class. Иногда Java-приложения поставляются в сжатом формате. Такие приложения могут запускаться прямо в сжатом виде и распаковываться на лету. В такой ситуации интерпретатор Java следует вызывать с опцией -jar. НА ЗАМЕТКУ Детально рассмотрение Java выходит за рамки данной книги. Более подробную информацию о Java можно найти на Web-сайте Java по адресу http: //j ava. sun. com. Тем, кто всерьез хочет научиться программировать на языке Java, следует обратиться к одной из многочисленных доступных на рынке книг.
ГЛАВА 7 Дополнительная настройка Х11 В этой главе... • Конфигурирование XII с помощью сценария xorgconfig • Что собой представляет файл xorg. conf • Тестирование конфигурации XII • Персональный файл .xinitrc • Работа со шрифтами • Использование удаленных клиентов XI1 • Использование графического диспетчера XDM
I Г7Т | FreeBSD как настольная система II Часть II В главах 4, 5 и 6 описывались некоторые основные концепции X Window System (XI1). XI1 — это очень мощная серверная оболочка, которая может делать намного больше, чем просто предоставлять базовые графические возможности, о которых рассказывалось до сих пор. В зависимости от вычислительной среды, вам могут потребоваться преимущества разносторонности и дополнительные функциональные возможности, для которых XI1 разрабатывалась изначально, например, в кластерной вычислительной среде вы можете сделать так, чтобы центральный сервер XII через сеть отображал окна на удаленных клиентских компьютерах. Или же, при наличии множества пользователей UNIX в кластере или совместном пользовании одним компьютером, вы наверняка захотите сделать так, чтобы каждый пользователь мог настраивать свой сеанс XII по своему вкусу, используя конфигурационные файлы XII. В этой главе как раз и пойдет речь об этих и других дополнительных функциональных возможностях XII. Но сначала вы ознакомитесь с технологиями для оптимизации графической производительности видеокарты и средств отображения. Конфигурирование Х11 с помощью сценария xorgconf ig Во время первоначальной процедуры установки FreeBSD, которую вы выполняли в главе 2, вы использовали полноэкранную программу xorgcf g для настройки базовой конфигурации оборудования для своего сервера XII. Из-за разнообразия доступных сегодня в мире видеокарт и дисплеев и из-за того, что процедура конфигурирования XII во многом больше напоминает искусство, нежели науку, вполне вероятно, что одной программе xorgcf g не удалось настроить XII для вашего компьютера так, как следует. Возможно, у вас не получилось запустить монитор с разрешением выше, чем 640x480, или, скажем, у вас не получилось установить качество цветопередачи более высокое чем "8 бит (256 цветов)". Возможно даже, что вам не удалось отыскать подходящий видеодрайвер в базе данных xorgcgf и пришлось выбирать драйвер наугад. А, возможно, у вас вообще не получилось запустить XII, потому что она перескакивала с одного "мерцающего" или нестабильного графического режима на другой и ей никак не удавалось подобрать тот, который будет работать стабильно. В Xorg имеется еще один сценарий конфигурации, который может помочь - xorgconf ig. Эта программа представляет собой линейный сценарий, который задает ряд вопросов и конфигурирует XI1 на основании предоставляемых ответов; ей намного сложнее пользоваться, чем xorgcf g, и кажется, что многие из задаваемых ею вопросов дублируют вопросы, задаваемые xorgcf g, но она предлагает намного более длинный список наборов видеомикросхем и рекомендует наиболее подходящую для существующего оборудования комбинацию частот синхронизации и качества цветопередачи (глубины цвета). ВНИМАНИЕ! 1 Неправильное использование этой программы при настройке параметров видеооборудования может закончиться его физическим повреждением. Хотя многие современные мониторы имеют встроенные схемы защиты и будут отключаться в случае, если вы попытаетесь запустить их с более высокой, чем они могут поддерживать, частотой обновления, некоторые мониторы все-таки будут пытаться отобразить экран с указанной частотой обновления, даже если их оборудование не способно с ней справиться. Результатом может стать серьезное повреждение монитора.
Дополнительная настройка XI1 Глава 7 ВНИМАНИЕ! Программа xorgconfig перезаписывает существующий файл xorg.config. Если у вас есть рабочий файл xorg.config и вы хотите поэкспериментировать с новой конфигурацией, вы обязательно должны сначала сделать резервную копию существующего файла. Файл xorg.config хранится в каталоге /etc/xli/xorg.conf. Сохраните копию этого файла в каталоге /etc/ xorg.conf.bak (или каталоге с каким-нибудь подобным именем), прежде чем продолжать. Сделав это, вы сможете легко восстановить предыдущую конфигурацию, если новая конфигурация не будет работать, просто скопировав файл с резервной копией обратно в каталог /etc/Xll/xorg. conf. Чтобы использовать эту программу, вы должны войти в систему через учетную запись пользователя root. Используя учетную запись пользователя root, введите xorgconfig в командной строке и нажмите клавишу <Enter>. На экране появится следующее сообщение This program will create a basic xorg.conf file, based on menu selections you make. The xorg.conf file usually resides in /usr/XHR6/etc/Xll or /etc/Xll. A sample xorg.conf file is supplied with Xorg; it is configured for a standard VGA card and monitor with 640x480 resolution. This program will ask for a pathname when it is ready to write the file. You can either take the sample xorg.conf as a base and edit it for your configuration, or let this program produce a base xorg.conf file for your configuration and fine-tune it. Before continuing with this program, make sure you know what video card you have, and preferably also the chipset it uses and the amount of video memory on your video card. SuperProbe may be able to help with this. Press enter to continue, or ctrl-c to abort. Эта программа создаст базовый файл xorg.conf на основе значений, которые вы выберите в меню. Файл xorg.conf обычно размещается в каталоге /usr/XHR6/etc/Xll или /etc/Xll. С Xorg поставляется пример файла xorg.conf; он сконфигурирован для стандартной карты VGA и монитора с разрешением 640x480. Эта программа попросит ввести путь к файлу, когда будет готова выполнить запись. Вы можете либо взять за основу файл xorg.conf и отредактировать его в соответствии со своей конфигурацией, либо позволить этой программе самой создать базовый файл xorg.conf для вашей конфигурации и затем просто откорректировать его. Прежде чем продолжить работу с этой программой, убедитесь в том, что у вас есть под рукой сведения об установленной на вашем компьютере видеокарте, а также, желательно, о микросхеме, которую она использует, и доступном на ней объеме видеопамяти. Возможно, в этом вам сможет помочь SuperProbe. Нажмите клавишу <Enter>, если хотите продолжить, или клавиатурную комбинацию <Ctrl+C>, если хотите выйти из этой программы. Прочитав эту информацию, нажмите клавишу <Enter> для продолжения. Первым делом вам нужно будет настроить мышь. 215
216 FreeBSD как настольная система Часть II ВНИМАНИЕ! Дважды проверяйте значения, которые вводите в xorgconf ig. Это программа не умеет "прощать" ошибки и опечатки. Если вы случайно введете не то значение и не заметите этого до нажатия клавиши <Enter>, вернуться назад и исправить ошибку вы уже не сможете. Вам придется нажать клавиатурную комбинацию <Ctrl+C>, чтобы выйти из программы, а затем начинать настройку параметров полностью заново. Настройка мыши ВНИМАНИЕ! Мышь PS/2 считается во многом "капризной". Одна из главных проблем состоит в том, что материнская плата и операционная система не могут распознать мышь, которая подключается к компьютеру после загрузки; но еще больший риск состоит в том, что материнскую плату может закоротить, если эту мышь отключить во время работы компьютера. Всегда проверяйте, чтобы все не-USB устройства были подключены к компьютеру до его включения и ни в коем случае не отключайте их на протяжении всей его работы. Экран программы xorgconf ig, позволяющий настраивать мышь, будет выглядеть примерно так: First specify a mouse protocol type. Choose one from the following list: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Auto SysMouse MouseSystems PS/2 Microsoft Busmouse AceCad GlidePoint IntelliMouse Logitech MMHitTab MMSeries MouseMan ThinkingMouse The recommended protocol is Auto. If you have a very old mouse or don't want OS support or auto detection, and you have a two-button or three-button serial mouse, it is most likely of type Microsoft. Enter a protocol number: Сначала укажите тип используемого мышью протокола. Выберите подходящий протокол из следующего списка: 1. Auto 2. SysMouse 3. MouseSystems 4. PS/2 5. Microsoft 6. Busmouse 7. AceCad 8. GlidePoint
Дополнительная настройка XII Глава 7 217 9. IntelliMouse 10. Logitech 11. MMHitTab 12. MMSeries 13. MouseMan 14. ThinkingMouse Рекомендуется выбирать протокол "Auto". Если ваша мышь очень старой модели или вы не хотите пользоваться ни поддержкой ОС, ни функцией автоматического определения, или же если ваша мышь имеет две или три кнопки и подключается через последовательный порт, скорее всего, для нее подойдет вариант "Microsoft". Введите номер протокола: Просто введите номер, под которым указан тип имеющейся у вас мыши, и нажмите клавишу <Enter>. В большинстве случаев и для большинства стандартных мышей PS/2 и USB, выбор варианта 1 (Auto) является наилучшим решением, особенно если мышь работала, когда вы выбирали вариант Auto в программе Sysinstall или xorgcf g. Если она не работала, воспользуйтесь следующими советами, чтобы определить тип имеющейся у вас мыши. • Если ваша мышь имеет девятиштырьковый D-образный разъем в том месте, где она подключается к компьютеру, это "последовательная" мышь (мышь, подключаемая через последовательный порт). В таком случае вам следует выбрать вариант 3, 5, 10 или 13. Обратите внимание на то, что практически все подключаемые через последовательный порт мыши будут работать с вариантом 3 и 5, а все более новые мыши Logitech — с вариантом 5 или 13. Вариант 10 подходит только для мышей Logitech очень старой модели. (Сделайте себе одолжение и потратьтесь на новую мышь PS/2.) • Если ваша мышь имеет небольшой круглый разъем-вилку, которая вставляется в гнездо рядом с гнездом для клавиатуры, это мышь PS/2. Для любой мыши PS/2 следует использовать вариант 4. Даже если это мышь производства Microsoft, но она имеет разъем PS/2, для нее все равно следует выбирать вариант 4. Перечисленные варианты мышей Microsoft подходят только для мышей, подключаемых через последовательный порт. • Если вы устанавливаете FreeBSD на ноутбук, вам, пожалуй, следует выбрать для встроенного указательного устройства вариант 4, потому что оно, скорее всего, будет работать через внутренний порт PS/2. Это касается как указательных устройств типа сенсорной панели, так и указательных устройств типа сенсорных кнопок. После того, как вы введете номер, представляющий тип имеющейся у вас мыши, и нажмете клавишу <Enter>, появится следующее сообщение: If your mouse has only two buttons, it is recommended that you enable Emulate3Buttons. Please answer the following question with either 'y' or 'n'. Do you want to enable Emulate3Buttons? Если на мыши доступны только две кнопки, рекомендуется активизировать режим Emu late3Buttons. Пожалуйста, ответьте на следующий вопрос путем ввода либо "у", либо "л". Вы хотите активизировать режим Emulate3Buttons?
218 FreeBSD как настольная система Часть II Первую строку этого сообщения следует воспринимать не как рекомендацию, а как обязательное требование, то есть если на вашей мыши доступны только две кнопки, вы не просто, когда хотите, а обязательно должны активизировать режим эмуляции трех кнопок (Emulate3Buutons). Практически все оконные диспетчеры в XII используют все три кнопки мыши, а некоторые из них (такие как Window Maker) даже предполагают нажатие средней кнопки для получения доступа к важным меню. Если у вас двухкнопочная мышь, вы должны ответить здесь у (то есть нажать клавишу <Y>); это позволит вам в дальнейшем, нажимая одновременно две кнопки мыши, имитировать нажатие средней кнопки трехкнопочной мыши. Далее последует приглашение ввести имя устройства, к которому подключена мышь: Now give the full device name that the mouse is connected to, for example /dev/ttyOO. Just pressing enter will use the default, /dev/sysmouse. Mouse device: Теперь полностью введите имя устройства, к которому подключена мышь, например, /dev/ttyOO. Если вы сразу нажмете клавишу <Enter>, будет выбран вариант, используемый по умолчанию, то есть /dev/sysmouse. Устройство мыши: Если для типа мыши вы выбирали вариант Auto или если ваша мышь работала, когда вы настраивали ее в Sysinstall или xorgcf g, просто нажмите здесь клавишу <Enter>, чтобы использовать стандартный системный драйвер мыши. В противном случае, если только вы не связали фактическое устройство, к которому подключена ваша мышь, с драйвером /dev/sysmouse, введите здесь имя этого устройства. В табл. 7Л перечислены значения, которые здесь можно вводить, в зависимости от типа имеющейся мыши. Таблица 7.1. Имена устройств для мышей различных типов Тип мыши - Устройство мыши Мышь PS/2 (или мышь, встроенная в панель ноутбука) /dev/psmO Мышь, подключаемая через последовательный порт С0М1 /dev/cuadO Мышь, подключаемая через последовательный порт COM2 /dev/cuadl Мышь, подключаемая через последовательный порт COM3 /dev/cuad2 Мышь, подключаемая через последовательный порт COM4 /dev/cuad3 Шинная мышь /dev/mseO Введите в командной строке подходящее имя устройства и нажмите клавишу <Enter>. Выбор клавиатуры / На следующем экране вам нужно будет указать тип имеющейся у вас клавиатуры: Please select one of the following keyboard types that is the better description of your keyboard. If nothing really matches, choose "Generic 104-key PC"
Дополнительная настройка XII Глава 7 219 1 Generic 101-key PC 2 Generic 102-key (Intl) PC 3 Generic 104-key PC 4 Generic 105-key (Intl) PC 5 Dell 101-key PC 6 Everex STEPnote 7 Keytronic FlexPro 8 Microsoft Natural 9 Northgate OmniKey 101 10 Winbook Model XP5 11 Japanese 106-key 12 PC-98xx Series 13 Brazilian ABNT2 14 Acer AirKey V 15 ACPI Standard 16 Azona RF2300 wireless Internet Keyboard Enter a number to choose the keyboard. Пожалуйста, выберите один из следующих типов клавиатур, который наиболее точно описывает вашу клавиатуру. Если ничего не подходит, выберите вариант "Generic 104-key PC" 1 Generic 101-key PC 2 Generic 102-key (Intl) PC 3 Generic 104-key PC 4 Generic 105-key (Intl) PC 5 Dell 101-key PC 6Everex STEPnote 7 Keytronic FlexPro 8 Microsoft Natural 9 Northgate OmniKey 101 10 Winbook Model XP5 11 Japanese 106-key 12 PC-98xx Series 13 Brazilian ABNT2 14 Acer AirKey V 15 ACPI Standard 16 Azona RF2300 wireless Internet Keyboard Введите номер, чтобы выбрать клавиатуру. СОВЕТ В некоторых системах верхнюю часть этого списка может быть не видно. Если это так в вашем случае, вам придется нажать клавишу <Enter> несколько раз, чтобы пройти весь список до конца и вернуться в его начало. Обратите внимание на то, что хотя сразу отображаются только 16 типов клавиатур, на самом деле на момент написания этой книги в xorgconf ig были перечислены целых 93 специфических модели клавиатур. Этот список доступных раскладок клавиатур слишком длинный, чтобы умещаться на одном экране. Поэтому, вы можете нажать клавишу <Enter>, чтобы отобразить следующий экран с перечнем раскладок. Если, дойдя до конца списка, вы снова нажмете клавишу <Enter>, вы опять вернетесь в начало этого списка.
220 FreeBSD как настольная система Часть II Если у вас клавиатура с английскими буквами, выберите здесь вариант 1 или 3 и нажмите клавишу <Enter>. Последует приглашение выбрать раскладку по языку (то есть язык ввода): 1 U.S. English 2 U.S. English w/ IS09995-3 3 U.S. English w/ deadkeys 4 Albanian 5 Arabic 6 Armenian 7 Azerbaijani 8 Belarusian 9 Belgian 10 Bengali 11 Bosnian 12 Brazilian 13 Bulgarian 14 Burmese 15 Canadian 16 Frenph Canadian 17 Croatian 18 Croatian (US) Enter a number to choose the country: 1 Английский (США) 2 Английский (США) с кодировкой ISO9995-3 3 Английский (США) с клавишами диакритических знаков 4 Албанский 5 Арабский 6 Армянский 7 Азербайджанский 8 Белорусский 9 Бельгийский 10 Бенгальский 11 Боснийский 12 Бразильский 13 Болгарский 14 Бирманский 15 Канадский 16 Канадский французский 17 Хорва тский 18 Хорватский (США) Введите номер, чтобы выбрать язык ввода: Опять-таки, чтобы просмотреть весь этот список (который содержит 90 наименований), используйте клавишу <Enter>. Пользователи, проживающие в США, скорее всего, выберут вариант 1. После этого появится следующее сообщение: Please enter a variant name for 'us' layout. Or just press enter for default variant Пожалуйста, введите имя варианта для раскладки nusn. Или просто нажмите клавишу <Enter>, чтобы выбрать вариант, предлагаемый по умолчанию. Как правило, вводить здесь какое-то специальное значение не требуется; поэтому просто нажмите клавишу <Enter>, чтобы перейти к следующему вопросу:
Дополнительная настройка XII I „ I Глава 7 I I Please answer the following question with either ' y' or ' n'. Do you want to select additional XKB options (group switcher, group indicator, etc.)? Пожалуйста, введите "у" или пп", чтобы ответить на следующий вопрос. Хотите ли вы выбрать дополнительные опции ХКВ (групповой выключатель, групповой индикатор и так далее) ? Введите здесь п, если только вы не хотите переназначить какие-нибудь клавиши. Если вы все-таки хотите переназначить какие-то клавиши (или просто посмотреть, какие опции доступны для этого), нажмите клавишу <Y>. После этого на экране появится парочка меню, предлагающих выполнить различные операции, например, превратить клавишу <Caps Lock> в клавишу <Ctrl> (эта опция может заинтересовать специалистов по Emacs) или поменять местами клавиши <Caps Lock> и <Ctrl>. Введите номер опции, которую вы хотите выполнить, и затем нажмите клавишу <Enter>. Если вы хотите выйти из меню, ничего не делая, просто нажмите клавишу <Enter>, не указывая никакого номера опции. Настройка монитора В этом разделе программы настройки вы будете конфигурировать различные параметры своего монитора типа частот горизонтальной и вертикальной синхронизации. ВНИМАНИЕ! Следующие несколько вопросов в программе настройки предполагают конфигурирование параметров, которые в случае некорректной настройки могут нанести вред монитору. Обязательно убедитесь в том, что выбранные диапазоны частот не превышают те, которые может поддерживать ваш монитор. Воспользуйтесь прилагавшейся к монитору документацией, чтобы узнать больше о том, какие частоты синхронизации ваш монитор способен поддерживать. Первый экран, который вы увидите, будет выглядеть так: Now we want to set the specifications of the monitor. The two critical parameters are the vertical refresh rate, which is the rate at which the whole screen is refreshed, and most importantly the horizontal sync rate, which is the rate at which scanlines are displayed. The valid range for horizontal sync and vertical sync should be documented in the manual of your monitor. Press enter to continue, or ctrl-c to abort. Теперь нужно установить параметры монитора. Двумя наиболее важными параметрами являются частота вертикальной синхронизации, которая представляет собой частоту, на которой обновляется весь экран, и частота горизонтальной синхронизации, которая представляет собой частоту, на которой отображаются сканируемые строки. Подходящий диапазон частот должен быть указан в прилагавшемся к вашему монитору руководстве пользователя. Нажмите клавишу <Enter>, чтобы продолжить, или клавиатурную комбинацию <Ctrl+C>, чтобы отменить операцию. Нажмите в этом сообщении клавипгу <Enter>, чтобы продолжить. Если вы еще этого не сделали, возьмите руководство, прилагаемое к вашему монитору (или отыщите спецификацию на него в Internet) и посмотрите, какие диапазоны частот
222 FreeBSD как настольная система Часть II синхронизации он поддерживает. Частоты синхронизации имеются даже у жидкокристаллических (LCD) мониторов. Один замечательный ресурс для поиска спецификаций на популярные мониторы всех производителей находится по адресу http://www.monitorworld.com/Monitors/. СОВЕТ Если вам не удается найти информацию о частотах синхронизации ни в руководстве монитора, ни в базе данных MonitorWorld.com, вы можете попробовать сделать следующее: если вы пользовались этим монитором в Windows или если вы можете подключить его к машине с Windows, отобразите окно Display Properties (Свойства: Экран), перейдите на вкладку Settings (Параметры), щелкните на кнопке Advanced (Дополнительно), а затем перейдите на вкладку Monitor (Монитор), чтобы увидеть, какую частоту обновления экрана Windows выбрала для вашего монитора. Узнав, какой диапазон частот горизонтальной синхронизации поддерживает ваш монитор, отыщите его в списке, предлагаемом сценарием: You must indicate the horizontal sync range of your monitor. You can either select one of the predefined ranges below that correspond to industry standard monitor types, or give a specific range. It is VERY IMPORTANT that you do not specify a monitor type with a horizontal sync range that is beyond the capabilities of your monitor. If in doubt, choose a conservative setting. hsync in kHz; monitor type with characteristic modes 1 31.5; Standard VGA, 640x480 @ 60 Hz 2 31.5 - 35.1; Super VGA, 800x600 @ 56 Hz 3 31.5, 35.5; 8514 Compatible, 1024x768 @ 87 Hz interlaced (no 800x600) 4 31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Hz interlaced, 800x600 @ 56 Hz 5 31.5-37.9; Extended Super VGA, 800x600 @ 60 Hz, 640x480 @ 72 Hz 6 31.5-48.5; Non-Interlaced SVGA, 1024x768 @ 60 Hz, 800x600 @ 72 Hz 7 31.5 - 57.0; High Frequency SVGA, 1024x768 @ 70 Hz 8 31.5-64.3; Monitor that can do 1280x1024 @ 60 Hz 9 31.5-79.0; Monitor that can do 1280x1024 @ 74 Hz 10 31.5 - 82.0; Monitor that can do 1280x1024 @ 76 Hz 11 Enter your own horizontal sync range Enter your choice (1-11) : Вы должны указать диапазон частот горизонтальной синхронизации, который поддерживает ваш монитор. Вы можете либо выбрать подходящий диапазон из предлагаемого ниже списка преопределенных диапазонов, которые соответствуют стандартным мониторам, либо указать специальный диапазон. ОЧЕНЬ ВАЖНО, чтобы вы не указали тип монитора с частотой горизонтальной синхронизации, выходящей за рамки возможностей вашего монитора. Если вы сомневаетесь, выберите более умеренное значение. Частота горизонтальной синхронизации в КГц; типы мониторов с характерными режимами 1 31.5; Standard VGA, 640x480 Q 60 Гц 2 31.5-35.1; Super VGA, 800x600 @ 56 Гц 3 31.5, 35.5; 8514 Compatible, 1024x768 $ 87 Гц с чересстрочной разверткой (режим 800x600 отсутствует) 4 31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Гц с чересстрочной разверткой, 800x600 в 56 Гц
Дополнительная настройка XI1 I «лл I Глава 7 I 1 5 31.5 - 37.9; Extended Super VGA, 800x600 Q 60 Гц, 640x480 в 12 Гц 6 31.5-48.5; Non-Interlaced SVGA, 1024x768 в 60 Гц, 800x600 в 72 Гц 7 31.5 - 57.0; High Frequency SVGA, 1024x768 в 70 Гц 8 31.5-64.3; Монитор, который может поддерживать 1280x1024 @ 60 Гц 9 31.5-79.0; Монитор, который может поддерживать 1280x1024 @ 74 Гц 10 31.5-82.0; Монитор, который может поддерживать 1280x1024 @ 76 Гц 11 Ввести свой собственный диапазон частот горизонтальной синхронизации Введите подходящий номер (1-11) : Если вы точно знаете, какой диапазон частот горизонтальной синхронизации поддерживает ваш монитор, выберите вариант 11, чтобы ввести диапазон вручную. В противном случае выберите предопределенный диапазон, не превышающий диапазон, который, как вы знаете, может поддерживать ваш монитор. Другими словами, выберите меньший диапазон, чем тот, с которым, по вашему мнению, может справиться ваш монитор, для гарантии того, что монитор не будет работать на пределе своих возможностей. После того, как вы выберете одно из предопределенных значений или введете точный диапазон частот горизонтальной синхронизации, поддерживаемый вашим монитором, нажмите клавишу <Enter>, чтобы перейти к следующему экрану, на котором вам нужно будет указать для монитора диапазон частот вертикальной синхронизации: You must indicate the vertical sync range of your monitor. You can either select one of the predefined ranges below that correspond to industrystandard monitor types, or give a specific range. For interlaced modes, the number that counts is the high one (e.g. 87 Hz rather than 43 Hz) . 1 50-70 2 50-90 3 50-100 4 40-150 5 Enter your own vertical sync range Enter your choice: Вы должны указать частоту вертикальной синхронизации монитора. Вы можете либо выбрать подходящий диапазон из предлагаемого ниже списка преопределенных диапазонов, которые соответствуют стандартным мониторам, либо указать специальный диапазон. Для режимов с чересстрочной разверткой, учитываться будет не нижнее, а верхнее значение (то есть, например, не "43 Гц", а "87 Гц") . 1 50-70 2 50-90 3 50-100 4 40-150 5 Введите свой собственный диапазон частот вертикальной синхронизации. Введите номер подходящего варианта: Опять-таки, очень важно, чтобы вы не выбрали частоту вертикальной синхронизации больше той, которую может поддерживать ваш монитор; если вы это сделаете, то можете нанести вред вашему монитору. Если вы точно знаете, какой диапазон частот вертикальной синхронизации поддерживает ваш монитор, выберите вариант 5 и затем введите этот диапазон. В противном случае вы можете выбрать одно из четырех первых предопределенных значений, опять-таки убедившись в том, что оно не превышает диапазон, с которым, как вы знаете из опыта работы с Windows, мо-
I ГГТ I FreeBSD как настольная система I I Часть II жет справляться ваш монитор. Сделав свой выбор, нажмите клавишу <Enter>, чтобы перейти к следующему экрану: You must now enter a few identification/description strings, namely an identifier, a vendor name, and a model name. Just pressing enter will fill in default names. The strings are free-form, spaces are allowed. Enter an identifier for your monitor definition: Теперь вам предстоит ввести идентификатор, имя производителя и название модели вашего монитора. Если вы просто нажмете клавишу <Enter>, будут использованы значения по умолчанию. Никаких ограничений на ввод этих сведений нет; разрешается использовать пробелы. Введите идентификатор, описывающий ваш монитор: Введенная на этом экране информация будет включена в файл xorg.conf, который программа сгенерирует сразу же после того, как вы закончите вводить все значения. Здесь вы всего-навсего определяете метки, которые помогут вам различать блоки параметров в конфигурационном файле; вовсе необязательно, чтобы вводимые значения отвечали каким-либо принятым соглашениям. Вы можете просто нажать здесь клавишу <Enter> и тем самым позволить xorgconf ig использовать значения по умолчанию, такие как My Monitor (Мой монитор). Настройка видеокарты Далее появится сообщение, информирующее о необходимости настройки видеокарты. Прочитав это информационное сообщение, нажмите клавишу <Y>; это позволит вам получить доступ к имеющейся в Xorg базе данных видеокарт, которая будет выглядеть примерно так: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 * Generic VESA compatible * Generic VGA compatible * Unsupported VGA compatible ** 3DLabs, TI (generic) ** 3Dfx (generic) ** ATI (generic) ** ATI Radeon (generic) ** ATI Rage 128 based (generic) ** Alliance Pro Motion (generic) ** Ark Logic (generic) ** Chips and Technologies (generic) ** Cirrus Logic (generic) ** Cyrix MediaGX (generic) ** DEC TGA (generic) ** Intel i740 (generic) ** Intel i810 (generic) ** Linux framebuffer (generic) ** Matrox Graphics (generic) [glint] [tdfx] [ati] [radeon] [rl28] [apm] [ark] [chips] [cirrus] [cyrix] [tga] [i740] [1810] [fbdev] [mga] Enter a number to choose the corresponding card definition. Press enter for the next page, q to continue configuration. 0 * Обобщенная VESA-совместимая 1 * Обобщенная VGA-совместимая
Дополнительная настройка XII Глава 7 225 2 * Неподдерживаемая VGA-совместимая 3 ** 3DLabs, TI (обобщенная) [glint] -* 4 ** 3Dfx (обобщенная) [tdfx] 5 ** ATI (обобщенная) [ati] 6 ** ATI Radeon (обобщенная) [radeonj - 7 ** AT J Rage 128 based (обобщенная) [r!28] 8 ** Alliance Pro Motion (обобщенная) [apm] 9 ** Ark Logic (обобщенная) [ark] 10 ** Chips and Technologies (обобщенная) [chips] - 11 ** Cirrus Logic (обобщенная) [cirrus] - 12 ** Cyrix MediaGX (обобщенная) [cyrix] 13 ** DEC TGA (обобщенная) [tga] 14 ** Intel i740 (обобщенная) [И40] 15 ** Intel i810 (обобщенная) [1810] 16 ** Linux framebuffer (обобщенная) [fbdev] 17 ** Matrox Graphics (обобщенная) [mga] Введите номер, чтобы выбрать подходящее определение карты. Нажмите клавишу <Enter>, чтобы перейти к следующей странице, или клавишу <q>, чтобы продолжить настройку. Опять-таки, список имеющихся в базе данных карт слишком длинный, чтобы умещаться на одном экране (на момент написания этой книги он включал 566 наименований). Поэтому нажимайте клавишу <Enter> для перехода на следующую страницу. Когда вы дойдете до конца списка, нажатие клавиши <Enter> позволит вам вернуться в его начало. Если вам не удается найти значение, в точности соответствующее производителю и номеру модели вашей видеокарты, в этом списке, просто нажмите клавишу <Q>, чтобы выйти из него. Не выбирайте модель только потому, что ее название звучит знакомо: модели с похожими именами вовсе необязательно используют похожее оборудование или имеют похожие возможности. Однако в начале списка предлагается около 30 "обобщенных" видеодрайверов, которые можно выбирать, если данная конкретная модель в списке отсутствует. Например, если у вас установлена видеокарта ATI Radeon 9200, и этой конкретной модели карты ATI в списке нет, просто прокрутите список вверх и выберите вариант под номером 6, в котором предлагается обобщенный драйвер для всех карт Radeon. Если все остальные варианты не работают, выберите вариант под номером 0 или под номером 1, чтобы установить обобщенный драйвер для карт VEGA или VGA много возможностей он предоставлять не будет, но зато точно будет работать. Если вам удалось найти имя производителя и название модели вашей видеокарты в этом списке, введите номер, под которым они указаны, и затем нажмите клавишу <?nter>. После этого на экране появится сообщение с информацией о выбранной вами видеокарте, например, такое: Your selected card definition: Identifier: Matrox Millennium G400 Chipset: mgag400 Driver: mga Do NOT probe clocks or use any Clocks line. Press enter to continue, or ctrl-c to abort. Выбранное вами определение карты: Идентификатор: Matrox Millennium G400 Набор микросхем: mgag400
226 FreeBSD как настольная система Часть II Драйвер: тда Не тестируйте синхронизатор и не вводите никакие строки, содержащие слово "Clocks" Нажмите клавишу <Enter>, чтобы продолжить, или клавиатурную комбинацию <Ctrl+C>, чтобы прервать операцию. После того, как вы нажмете клавишу <Enter>, чтобы продолжить, появится сообщение с приглашением ввести некоторую дополнительную информацию о видеокарте, начиная с доступного в ней объема памяти (ОЗУ): Now you must give information about your video card. This will be used for the "Device" section of your video card in xorg.conf • It is probably a good idea to use the same approximate amount as that detected by the server you intend to use. If you encounter problems that are due to the used server not supporting the amount memory you have, specify the maximum amount supported by the server. How much video memory do you have on your video card: 1 256K l-l 2 3 4 5 6 7 8 9 10 11 12 256K 512K 1024K 2048K 4096K 8192K 16384K 32768K 65536K 131072K 262144K Other Enter your choice: Теперь вы должны предоставить информацию о своей видеокарте* Эта информация будет использована для соответствующего видеокарте раздела "Device" в файле xorg.conf. Лучше указать приблизительный объем памяти, такой же, как поддерживает сервер, который вы планируете использовать. В случае возникновения проблем из-за того, что используемый сервер не поддерживает имеющийся объем памяти, укажите максимальный объем, поддерживаемый сервером. Какой объем видеопамяти доступен в вашей видеокарте: 1 2 3 4 5 6 7 8 9 10 11 12 256 Кбайт 512 Кбайт 1024 Кбайт 2048 Кбайт 4096 Кбайт 8192 Кбайт 16384 Кбайт 32768 Кбайт 65536 Кбайт 131072 Кбайт 262144 Кбайт Другой Введите номер подходящего варианта:
Дополнительная настройка XI1 I T7Z I Глава 7 I I Объем видеопамяти определяет разрешение и глубину цвета (качество цветопередачи), которые ваша карта сможет поддерживать. Убедитесь в том, что указываете точное значение доступного в карте объема ОЗУ; если вы зададите слишком низкое значение, вы не сможете пользоваться некоторыми режимами с более высокими разрешениями, а также преимуществами высокого качества цветопередачи, но если вы укажете слишком высокое значение, XI1 может пробовать запускать карту в режиме, который та не способна поддерживать. Вреда карте это не принесет, но будет отнимать лишнее время при каждом запуске XII, потому что XII будет сначала пытаться запустить этот "нерабочий** режим и только потом переходить к более простому режиму. Практически все доступные сегодня видеокарты имеют 32 Мбайт и более видеопамяти; этого вполне достаточно для воспроизведения 24-битовой цветовой схемы (а это 16.7 миллиона цветов) даже при самых высоких разрешениях. Максимальное значение, которое сценарий xorgconf ig позволяет выбрать сразу — это 262144 Кбайт, что соответствует 256 Мбайт видеопамяти. Если ни одно из предлагаемых значений не соответствует объему видеопамяти вашей видеокарты, выберите вариант под номером 12 и укажите правильное значение вручную. Не забывайте о том, что это значение следует задавать в килобайтах; преобразовать мегабайты в килобайты вы можете, умножив значение в мегабайтах на 1024. Далее нажмите клавишу <Enter>, чтобы перейти к следующему экрану: You must now enter a few identification/description strings, namely an identifier, a vendor name, and a model name. Just pressing enter will fill in default names (possibly from a card definition) . Your card definition is Matrox Millennium G400. The strings are free-form, spaces are allowed. Enter an identifier for your video card definition: Теперь вы должны ввести идентификатор, имя производителя и название модели видеокарты. Если вы просто нажмете клавишу <Enter>, будут использованы значения по умолчанию (которые, возможно, будут взяты из определения карты) . Определение вашей карты - Matrox Millennium G400. Никаких ограничений на ввод этих сведений нет; разрешается использовать пробелы. Введите идентификатор для определения своей видеокарты: Если тип видеокарты вы выбрали из списка видеокарт, здесь уже будут предложены значения для идентификации/описания видеокарты. Я рекомендую вам оставить их. Если найти свою карту в списке видеокарт вам не удалось, введите здесь краткое описание для своей видеокарты и затем нажмите клавишу <Enter>. Далее xorgconf ig начнет вам задавать различные вопросы. Какие именно это будут вопросы, зависит от того, удалось вам найти свою видеокарту в списке или нет. Дальше вам следует прочитать тот раздел, который соответствует вашему случаю (то есть если ваша видеокарта присутствовала в списке базы данных, вам следует прочитать раздел "Выбор видеокарты из базы данных и сохранение конфигурационного файла"; если найти свою видеокарту в базе данных вам не удалось, прочитайте раздел "Настройка видеокарты, которой нет в базе данных, и сохранение конфигурационного файла").
228 FreeBSD как настольная система Часть II Выбор видеокарты из базы данных и сохранение конфигурационного файла Если вы выбрали определение карты из списка базы данных, на экране появится меню сконфигурированных на текущий момент видеорежимов. Ниже показан пример того, как может выглядеть это меню: For each depth, a list of modes (resolutions) is defined. The default resolution that the server will start-up with will be the first listed mode that can be supported by the monitor and card. Currently it is set to: "1280x1024" "1024x768" "800x600" "640x480" for 8-bit "1280x1024" "1024x768" "800x600" "640x480" for 16-bit "1280x1024" "1024x768" "800x600" "640x480" for 24-bit Modes that cannot be supported due to monitor or clock constraints will be automatically skipped by the server. 1 Change the modes for 8-bit (256 colors) 2 Change the modes for 16-bit (32K/64K colors) 3 Change the modes for 24-bit (24-bit color) 4 The modes are OK, continue. Enter your choice: Для каждого значения качества цветопередачи доступен список режимов (разрешений). Разрешением, которое сервер будет использовать по умолчанию при запуске, будет первое из перечисленных в списке разрешении, которое может поддерживать монитор и видеокарта. Сейчас выбраны такие режимы: "1280x1024" "1024x768" "800x600" "640x480" для качества 8 бит "1280x1024" "1024x768" "800x600" "640x480" для качества 16 бит *1280х1024" "1024x768" "800x600" "640x480" для качества 24 бит Режимы, которые не могут поддерживаться из-за ограничений монитора или синхронизатора, сервер будет автоматически пропускать. 1 Изменить режимы для качества цветопередачи 8 бит (256 цветов) 2 Изменить режимы для качества цветопередачи 16 бит (32К/64К цветов) 3 Изменить режимы для качества цветопередачи 24 бита (24-битный цвет) 4 Режимы выбраны правильно, продолжить. Введите номер подходящего варианта: Вы наверняка захотите внести здесь какие-нибудь изменения, потому что по умол* чанию XII запустится с разрешением 640x480, которое является слишком низким, чтобы быть пригодным для использования. Если у вас 17-дюймовый монитор, вы, скорее всего, пожелаете выбрать разрешение 1024x768 или даже выше, в зависимости от ваших потребностей. Вы всегда сможете отредактировать эти параметры и настроить разрешение монитора так, как вам нужно, позже, после того, как поработаете с XII достаточно долго для того, чтобы понять какое пространство на экране вам необходимо.
Дополнительная настройка XII Глава 7 СОВЕТ Конечно, если у вас жидкокристаллический (LCD) монитор, вы захотите отключить все разрешения кроме того, что является для него "родным". Жидкокристаллические мониторы с интерполированными разрешениями обычно смотрятся очень плохо. Вы также захотите определиться с тем, какое качество цветопередачи (то есть значение глубины цвета) использовать. Как правило, чем качество цветопередачи выше, тем лучше. Однако, если видеопамяти не слишком много, качеством цветопередачи и разрешением, возможно, придется немного пожертвовать. В принципе, в большинстве приложений разницы между 24-битовым и 16-битовым качеством цветопередачи видно не будет; однако, разница между 16-битовым и 8-битовым качеством цветопередачи точно будет ощутимой, и будет выражаться в постоянном смешении цветовых палитр и размытости градиентных переходов. Хотя личные предпочтения всегда являются решающим фактором, вот что рекомендую я. • Если разрешение, которое вы хотите установить, не позволяет использовать более высокое, чем 8-битовое, качество цветопередачи (256 цветов), лучше уменьшите разрешение до уровня, который позволяет использовать 16-битовое качество цветопередачи. Однако если для воспроизведения более 256-ти цветов вы должны уменьшить разрешение до значения, меньшего 1024x768, вам следует всерьез задуматься о покупке более новой видеокарты. • Если разрешение, которое вы хотите установить, позволяет использовать 16- битовое качество цветопередачи, но не позволяет использовать 24-битовое качество цветопередачи, уменьшать разрешение для того, чтобы сделать возможным использование 24-битового качества цветопередачи, пожалуй, не стоит. В большинстве случаев, если только вы не будете делать что-нибудь такое, где количество цветов играет чрезвычайно важную роль (например, обрабатывать графические данные), вы вряд ли заметите разницу между 16-битовым и 24-битовым качеством цветопередачи. Определившись с качеством цветопередачи, которое должно использоваться по умолчанию, вы захотите внести изменения в линию режимов для этого качества цветопередачи (если только вы не планируете использовать по умолчанию разрешение 640x480, потому что в таком случае никаких изменений вносить не требуется). Введите номера, под которыми указаны нужные вам режимы, и нажмите клавишу <Enter>. Например, если вы хотите, чтобы по умолчанию использовалось 24-битовое качество цветопередачи, вам следует выбрать вариант 3. После этого появится следующий экран, который будет выглядеть примерно так: Select modes from the following list: 1 "640x400" 2 "640x480" 3 "S00x600" 4 "1024x768" 5 "1280x1024" 6 "320x200" 7 "320x240" 8 "400x300" 9 "1152x864"
FreeBSD как настольная система а "1600x1200" b "1800x1400" с "512x384" d "1400x1050" Please type the digits corresponding to the modes that you want to select. For example, 432 selects "1024x768" "800x600" "640x480", with a default mode of 1024x768. Which modes? Выберите режимы из следующего списка: 1 2 3 4 5 6 7 8 9 а Ь с d "640x400" "640x480" "800x600" "1024x768" "1280x1024" "320x200" "320x240" "400x300" "1152x864" "1600x1200" "1800x1400" "512x384" "1400x1050" Пожалуйста, введите цифры, соответствующие режимам, которые вы хотите выбрать. Например, если вы введете 432, выбраны будут следующие режимы: "1024x768" "800x600" "640x480", причем по умолчанию будет использоваться режим "1024x768" Какие режимы? Введите номер, под которым указано разрешение, которое должно использоваться по умолчанию при первом запуске XII. Например, если вы хотите, что при запуске XII по умолчанию использовалось разрешение 1024x768, введите номер (цифру) 4. Если вы хотите иметь возможность переключаться с одного разрешения на другое, вы можете ввести здесь несколько номеров в виде одной строки. Первым следу- ет ввести номер, под которым указано разрешение, которое должно использоваться по умолчанию, а далее — номера разрешений, которые должны использоваться следующими при поступлении команды изменить разрешение экрана (обычно такая команда выполняется путем одновременного нажатия клавиши <Ctrl>, клавиши <Alt> и клавиши с изображением знака плюс или минус). Например, если вы хотите, чтобы по умолчанию использовалось разрешение 1024x768, но также было доступно разрешение 800x600 и разрешение 640x480, введите здесь 432. Многие люди не имеют привычки менять разрешение экрана после того, как они установили его. Если вы никогда не изменяли разрешение экрана, когда работали в системе Windows или Macintosh, скорее всего, вы не будете изменять его и работая в FreeBSD. Поэтому, если только вы не знаете наверняка, что вам нужно будет переключаться с одного разрешения на другое по той или иной причине, укажите здесь только какое-нибудь одно разрешение.
Дополнительная настройка XI1 Глава 7 231 СОВЕТ Экспериментируя здесь с параметрами настройки Х11, не забудьте указать, по крайней мере, одно "безопасное" разрешение, такое как 640x480 (которое числится под номером 2). Это позволит Х11 использовать это разрешение, если поместить систему в режим, который вы хотите, у нее не получится, например, потому, что вы неправильно указали частоты синхронизации монитора или объем памяти видеокарты. Вы всегда сможете удалить этот параметр позже, отредактировав вручную файл xorg. conf. Когда вы выберете разрешение (разрешения), которое хотите использовать для данного качества цветопередачи, нажмите клавишу <Enter>, чтобы продолжить. После этого появится сообщение, запрашивающее о виртуальных экранах: You can have a virtual screen (desktop), which is screen area that is larger than the physical screen and which is panned by moving the mouse to the edge of the screen. If you don't want virtual desktop at a certain resolution, you cannot have modes listed that are larger. Each color depth can have a differently-sized virtual screen. Please answer the following question with either ' y* or *n'. Do you want a virtual screen that is larger than the physical screen? Вы можете создать виртуальный экран (рабочий стол): это экранная область, которая занимает больше места, чем физический экран, и прокручивается при наведении курсора мыши на край экрана. Если вы не хотите создавать виртуальный рабочий стол на определенном разрешении, использовать режимы, занимающие больше места, чем физический экран, вы не можете. Для каждого качества цветопередачи можно создавать виртуальный экран другого размера. Пожалуйста, ответьте на следующий вопрос путем ввода "у" или "л". Вы хотите создать виртуальный экран, занимающий большую площадь, чем физический экран? Создание виртуального экрана, занимающего большую площадь, чем физический экран (эта опция традиционно используется в XI1 ив мире Windows/Mac практически не поддерживается) означает, что ваш монитор, который может быть ограничен в разрешении, будет отображать только часть области рабочего стола XII; вы сможете прокручивать виртуальный экран, наводя курсор мыши на границы отображаемой области. НА ЗАМЕТКУ Многие пользователи находят виртуальные экраны больше раздражающими, нежели полезными, потому что работать с ними неудобно и неэффективно, и поэтому создают их только тогда, когда из-за ограниченных возможностей видеокарты они вынуждены устанавливать очень низкое разрешение (вроде 640x480). Однако для пользователей с плохим зрением эта функциональная возможность может оказаться истинной находкой: она дает возможность, используя низкое, очень удобное для чтения разрешение, делать шрифт текста большим и разборчивым, а также панорамировать изображение на экране путем эмуляции доступной в Mac OS X функции масштабирования (которая сама была разработана специально для такой цели). Если вы решите, что виртуальный экран вам все-таки нужен, вам далее придется указать разрешение, которое вы хотите использовать для этого экрана. Выберите желаемое разрешение и нажмите клавишу <Enter>.
232 FreeBSD как настольная система Часть II Если вы решите, что виртуальный экран вам не нужен, вы вернетесь к экрану с режимами для разного качества цветопередачи, который демонстрировался ранее. Ниже показано, как теперь будет выглядеть этот экран: For each depth, a list of modes (resolutions) is defined. The default resolution that the server will start-up with will be the first listed mode that can be supported by the monitor and card. Currently it is set to: "1280x1024" "1024x768" "800x600" "640x480" for 8-bit "1280x1024" "1024x768" "800x600" "640x480" for 16-bit "1024x768" for 24-bit Modes that cannot be supported due to monitor or clock constraints will be automatically skipped by the server. 1 Change the modes for 8-bit (256 colors) 2 Change the modes for 16-bit (32K/64K colors) 3 Change the modes for 24-bit (24-bit color) 4 The modes are OK, continue. Enter your choice: Для каждого значения качества цветопередачи доступен свой список режимов (разрешений), Разрешением, которое сервер будет использовать по умолчанию при запуске, будет первый из перечисленных в списке режимов, который может поддерживать имеющийся монитор и видеокарта. Сейчас выбраны такие режимы: "1280x1024" "1024x768" "800x600" "640x480" для качества 8 бит "1280x1024" "1024x768" "800x600" "640x480" для качества 16 бит "1024x768" для качества 24 бит Режимы, которые не могут поддерживаться из-за ограничений монитора или синхронизатора, сервер будет автоматически пропускать, 1 Изменить режимы для качества цветопередачи 8 бит (256 цветов) 2 Изменить режимы для качества цветопередачи 16 бит (32К/64К цветов) 3 Изменить режимы для качества цветопередачи 24 бита (24-битный цвет) 4 Режимы выбраны правильно, продолжить. Введите номер подходящего варианта: Обратите внимание на изменения в строке для 24-битового качества цветопередачи. Теперь в ней указано только разрешение 1024x768. Если вы не планируете использовать несколько режимов цветопередачи, можете не обращать внимания на остальные строки и оставить их в таком, каком они есть, виде. Если же вы все-таки собираетесь применять несколько режимов цветопередачи, тогда просто введите номер строки со следующим качеством цветопередачи, которое вы хотите сконфигурировать, и выполните описанные выше шаги, чтобы указать для него необходимые разрешения. Когда вы завершите конфигурировать все режимы, которые хотели бы настроить, выберите вариант под номером 4 (The Modes Are OK, Continue (Режимы выбраны правильно, продолжить)), чтобы перейти к следующему разделу. Далее последует приглашение указать качество цветопередачи (глубину цвета), которое должно использоваться по умолчанию:
Дополнительная настройка XI1 Глава 7 233 Please specify which color depth you want to use by default: 1 1 bit (monochrome) 2 4 bits (16 colors) 3 8 bits (256 colors) 4 16 bits (65536 colors) 5 24 bits (16 million colors) Enter a number to choose the default depth. Пожалуйста, укажите, какая глубина цвета должна использоваться по умолчанию: 1 1 бит (монохромный) 2 4 бита (16 цветов) 3 8 бит (256 цветов) 4 16 бит (65536 цветов) 5 24 бита (16 миллионов цветов) Введите номер, под которым указана глубина цвета, которая должна использоваться по умолчанию. Просто выберите номер, под которым указано качество цветопередачи (глубина цвета), которое вы решили использовать ранее, и нажмите клавишу <Enter>. После выбора нужного качества цветопередачи (глубины цвета) появится сообщение с вопросом о том, не хотите ли вы сохранить изменения: I am going to write the xorg.conf file now. Make sure you don't accidentally overwrite a previously configured one. Shall I write it to /etc/Xll/xorg.conf? Я собираюсь сейчас записать файл xorg.conf. Убедитесь, что это не приведет к случайному перезаписыванию уже сконфигурированного файла. Можно записать его в файл /etc/Xll/xorg.conf? Введите у, чтобы записать новый файл xorg.conf file. Если файл xorg.conf уже существует, он будет перезаписан (то есть, заменен новым файлом). После того, как вы введете у и нажмете клавишу <Enter>, xorgconf ig отобразит следующее сообщение: File has been written. Take a look at it before running •startx' . Note that the xorg.conf file must be in one of the directories searched by the server (e.g. /etc/Xll) in order to be used. Within the server press Ctrl, alt and ¦ + ¦ simultaneously to cycle video resolutions. Pressing Ctrl, alt and backspace simultaneously immediately exits the server (use if the monitor doesn't sync for a particular mode) . For further configuration, refer to the xorg.conf(5) manual page. Файл был записан. Просмотрите его, прежде чем выполнять команду startx (то есть прежде чем запускать XII). Обратите внимание, что для того, чтобы файл xorg. conf мог использоваться, он должен находиться в одном из просматриваемых сервером каталогов. Находясь на сервере, нажмите одновременно клавишу <Ctrl>, клавишу <А11> и клавишу с изображением знака плюс (+), чтобы протестировать разрешения монитора. Одновременное нажатие клавиши <Ctrl>, <Alt> и <Backspace> позволит немедленно завершить работу сервера (используйте эту клавиатурную комбинацию, если монитор не справляется с синхронизацией изображений в каком-нибудь определенном режиме) . Информацию о том, как настроить дополнительные параметры, вы сможете найти на следующей странице руководства: xorg.conf (5).
234 FreeBSD как настольная система Часть II На этом ваша работа со сценарием будет завершена, и на экране снова появится командная строка. Ваш файл xorg.conf был записан и готов к тестированию. Далее вы можете сразу же перейти к разделу "Тестирование конфигурации XII". Настройка видеокарты, которой нет в базе данных, и сохранение конфигурационного файла Если найти нужную видеокарту в списке видеокарт базы данных вам не удалось (то есть если вы нажали клавишу <Q> вместо того, чтобы выбрать один из предложенных драйверов для видеокарт), xorgconf ig первым делом попросит вас указать объем видеопамяти, доступный в вашей карте: Now you must give information about your video card. This will be used for the "Device" section of your video card in xorg.conf. It is probably a good idea to use the same approximate amount as that detected by the server you intend to use. If you encounter problems that are due to the used server not supporting the amount memory you have, specify the maximum amount supported by the server. How much video memory do you have on your video card: 1 256K 2 512K 3 1024K 4 2048K 5 4096K 6 8192K 7 16384K 8 32768K 9 65536K 10 131072K 11 262144K 12 Other Enter your choice: Теперь вы должны предоставить информацию о своей видеокарте. Эта информация будет использована для формирования соответствующего видеокарте раздела "Device" в файле xorg.conf. Лучше указать приблизительный объем памяти, такой же, как поддерживает сервер, который вы планируете использовать. В случае возникновения проблем из-за того, что используемый сервер не поддерживает имеющийся объем памяти, укажите максимальный объем, поддерживаемый сервером. Какой объем видеопамяти доступен в вашей видеокарте: 1 256 Кбайт 2 512 Кбайт 3 1024 Кбайт 4 2048 Кбайт 5 4096 Кбайт 6 8192 Кбайт 7 16384 Кбайт 8 32768 Кбайт 9 65536 Кбайт 10 131072 Кбайт 11 262144 Кбайт 12 Другой Введите номер, под которым указано подходящее значение:
Дополнительная настройка XI1 I ГГГ I Глава 7 I I Если вы знаете, какой объем видеопамяти имеет ваша видеокарта, выберите его из списка или введите вручную (в килобайтах), выбрав вариант 12. В противном случае вы можете выбрать какое-нибудь нереально высокое значение, такое как отображаемое под номером 9 (64 Мбайт); это значение не повлияет на конфигурацию карты, а укажет xorgconfig, какие разрешения экрана и качество цветопередачи (глубину цвета) ей следует вам предлагать. Вы всегда сможете отредактировать файл конфигурации XII после того, как завершите работу с этим сценарием, и указать в нем видеорежимы, которые не будут заставлять вашу карту работать на пределе своих возможностей и будут отвечать действительности. You must now enter a few identification/description strings, namely an identifier, a vendor name, and a model name. Just pressing enter will fill in default names (possibly from a card definition) • The strings are free-form, spaces are allowed. Enter an identifier for your video card definition: blah Теперь вы должны ввести идентификатор, имя производителя и название модели видеокарты. Если вы просто нажмете клавишу <Enter>, будут использованы значения по умолчанию (которые, возможно, будут взяты из определения карты). Никаких ограничений на ввод этих сведений нет/ разрешается использовать пробелы. Введите идентификатор для описания (определения) видеокарты: Далее xorgconfig предложит ввести идентификатор для видеокарты. Поскольку модель карты вы не выбирали, этот идентификатор будет играть очень важную роль при проведении диагностических процедур в будущем; поэтому введите метку которая наиболее точно описывает вашу видеокарту. На следующем экране вам нужно будет указать качество цветопередачи (глубину цвета), которое должно использоваться по умолчанию: Please specify which color depth you want to use by default: 1 1 bit (monochrome) 2 4 bits (16 colors) 3 8 bits (256 colors) 4 16 bits (65536 colors) 5 24 bits (16 million colors) Enter a number to choose the default depth. Пожалуйста, укажите, какая глубина цвета должна использоваться по умолчанию: 1 1 бит (монохромный) 2 4 бита (16 цветов) 3 8 бит (256 цветов) 4 16 бит (65536 цветов) 5 24 бита (16 миллионов цветов) Введите номер, соответствующий глубине цвета, которая должна использоваться по умолчанию. Просто выберите номер, под которым указано подходящее качество цветопередачи (глубина цвета), и нажмите клавишу <Enter>. После этого xorgconfig спросит, не хотите ли вы сохранить изменения: I am going to write the xorg.conf file now. Make sure you don't accidentally overwrite a previously configured one. Shall I write it to /etc/Xll/xorg.conf?
FreeBSD как настольная система Я собираюсь сейчас записать файл xorg.conf. Убедитесь, что это не приведет к случайному перезаписыванию уже сконфигурированного файла. Можно записать его в файл /etc/X11 /xorg.conf? Введите у, чтобы записать конфигурационный файл. Если такой конфигурационный файл уже существует, он будет перезаписан (то есть, заменен новым файлом). Записав конфигурационный файл, xorgconf ig отобразит показанное ниже сообщение и завершит свою работу: File has been written. Take a look at it before running 'startx1 . Note that the xorg.conf file must be in one of the directories searched by the server (e.g. /etc/Xll) in order to be used. Within the server press Ctrl, alt and '+* simultaneously to cycle video resolutions. Pressing Ctrl, alt and backspace simultaneously immediately exits the server (use if the monitor doesn't sync for a particular mode) . For further configuration, refer to the xorg.conf(5) manual page. Файл был записан. Просмотрите его, прежде чем выполнять команду startx (то есть прежде чем запускать XII) . Обратите внимание, что для того, чтобы файл xorg. conf мог использоваться, он должен находиться в одном из просматриваемых сервером каталогов. Находясь на сервере, нажмите одновременно клавишу <Ctrl>, клавишу <Alt> и клавишу с изображением знака плюс (+), чтобы протестировать разрешения монитора. Одновременное нажатие клавиши <Ctrl>, <Alt> и <Backspace> позволит сразу же завершить работу сервера (используйте эту клавиатурную комбинацию, если монитор не справляется с синхронизацией изображений в каком-нибудь определенном режиме). Информацию о том, как настроить дополнительные параметры, вы сможете найти на следующей странице руководства: xorg.conf (5) . По умолчанию XII запустится с разрешением 640x480. Вы, скорее всего, захотите изменить это разрешение на более высокое. Для этого вам придется вручную отредактировать конфигурационный файл xorg.conf, о котором более подробно будет рассказываться уже в следующем разделе. Что собой представляет файл xorg. conf Как и за большинство компонентов FreeBSD, за конфигурацию XII отвечает конфигурационный файл, вся информация в котором хранится в виде простого текста. Исходный конфигурационный файл XII находится в каталоге /etc/Xll и называется xorg.conf. Этот файл создает и изменяет утилита xorgcfg (которая представляет собой программу с основанным на меню интерфейсом и которая описывалась в главе 2), а также утилита xorgconf ig (которая представляет собой сценарий конфигурации с текстовым интерфейсом и которая описывалась в предыдущих разделах этой главы). Эти программы сделали процедуру настройки XII намного более простой по сравнению с тем, какой она была, когда файлы нужно было создавать и редактировать полностью вручную. Однако и сейчас тоже бывают ситуации, когда без внесения изменений в конфигурационный файл вручную просто никак не обойтись. Например, если вашей видеокарты не оказалось в списке базы данных, вам может понадобиться вручную внести в этот файл изменения, чтобы откорректировать его в соответствии с возможностями данной видеокарты. Еще одна ситуация, когда может потребоваться внести из-
Дополнительная настройка XI1 I „_ 1 Глава 7 I I менения вручную — это если вы хотите внести изменения в параметры XII, которые xorgconf ig не затрагивает, такие как скорость выполнения двойного щелчка или скорость движения указателя мыши. Если вы просто хотите внести одно или два небольших изменения в конфигурацию XII, вы можете предпочесть отредактировать конфигурационный файл XII вручную вместо того, чтобы проходить всю процедуру настройки заново с помощью xorgconf ig. Прежде чем вносить изменения в файл xorg. conf, сначала сделайте его резервную копию для того, чтобы вы могли быстро отменить изменения, если они вдруг приведут к появлению проблем. Например, вы можете скопировать файл /etc/Xll/xorg. conf в файл /etc/Xll/xorg.conf .bak. Сделав резервную копию, откройте файл /etc/ Xll/xorg.conf в своем любимом текстовом редакторе (о том, как пользоваться текстовыми редакторами, поставляемыми с FreeBSD, рассказывалось в главе 6). Синтаксис, используемый в файле xorg.conf Файл xorg.conf поделен на несколько разделов. Каждый раздел отвечает за определенное устройство или параметр конфигурации и начинается с ключевого слова Section, за которым следует имя самого раздела в кавычках. Заканчивается каждый раздел ключевым словом EndSection. Тело разделов имеет очень удобный для чтения вид. Комментарии, или строки, которые XII игнорирует, начинаются со знака фунта (#). Ниже показан пример раздела из файла xorg.conf: Section "Module" # This loads the DBE extension module. # Эта команда загружает модуль расширения DBE. Load "dbe" # Double buffer extension # Расширение двойного буфера # This loads the miscellaneous extensions module, and disables # initialization of the XFree86-DGA extension within that module. # Эта команда загружает модуль прочих расширений и отключает # инициализацию расширения XFree86-DGA в этом модуле. Subsection "extmod" Option "omit xfree86-dga" # don't initialize the DGA extension # не инициализировать расширение DGA EndSubSection # This loads the font modules # Эти команды загружают модули шрифтов Load "typel" # Load "speedo" Load "freetype" # Load "xtt" # This loads the GLX module # Эта команда загружает модуль GLX # Load "glx" # This loads the DRI module # Эта команда загружает модуль DRI # Load "dri" EndSection
FreeBSD как настольная система В файле xorg. conf перед этим разделом идут несколько строк с комментариями, которые здесь не были показаны, но которые объясняют, для чего предназначен этот раздел. В данном случае раздел Module отвечает за загрузку динамических модулей (эти модули загружаются, когда сервер начинает поддерживать различные компоненты системы). Например, команды, которые перечислены после слов # This loads the font modules (Эти команды загружают модули шрифтов), загружают динамические модули для поддержки различных типов шрифтов. В данном случае пер вая команда Load загружает модуль, который поддерживает шрифты Adobe Type 1, а вторая активная команда Load — модуль f reetype, который представляет собой доступный бесплатно модуль и позволяет XII использовать коммерческие шрифты TrueType. Кроме главных разделов, в файле xorg. conf ig также могут присутствовать и подразделы. Подраздел — это раздел в разделе. Такие разделы начинаются с ключевого слова Subsection, следом за которым идет заключенное в кавычки имя самого подраздела, и заканчиваются ключевым словом EndSubSection. Как и главные разделы, они имеют очень удобный для чтения вид. В следующих разделах этой главы будут рассматриваться различные разделы и подразделы, которые могут встречаться в файле xorg.conf. Раздел "Module" Раздел Module (Модуль) отвечает за загрузку динамических модулей для поддержки компонентов XII, таких как различные типы шрифтов. Загружаемые динамически модули не являются частью двоичного кода XII; эти модули загружаются по мере необходимости при запуске XII. Преимуществом загружаемых динамически модулей является то, что они загружаются только при необходимости. Ненужные модули не загружаются, и поэтому на них не расходуется лишняя память и ресурсы системы. Например, если шрифты TrueType нигде в системе не используются, в поддержке шрифтов TrueType в XII тоже нет необходимости, а это значит, что строка Load "f reetype" может быть помещена в комментарий. Модули, подлежащие загрузке, начинаются с ключевого слова Load, за которым следует имя самого модуля в кавычках. Например, вот как будет выглядеть строка, загружающая модуль, который поддерживает шрифты TrueType: Load Mfreetype" Раздел "Files" Этот раздел похож на используемую XII переменную среды PATH. Раздел Files указывает XII, где в системе ей следует искать различные необходимые файлы. Единственная часть в этом разделе, которую вы когда-нибудь можете захотеть изменить — это та, которая указывает XII, где она должна искать шрифты. Строка каждого из каталогов шрифтов начинается с ключевого слова FontPath, за которым еле дует заключенное в кавычки название самого каталога. Например, следующая строка указывает, где находятся шрифты Adobe Type 1: FontPath Vusr/XllR6/lib/Xll/fonts/Typel/w
Дополнительная настройка XI1 Именно в этот каталог устанавливаются все загружаемые и приобретаемые шрифты Adobe Туре 1. Об используемых в XII шрифтах более подробно будет рассказываться чуть позже в этой главе, в разделе "Работа со шрифтами". Если вы решите добавить каталоги шрифтов, знайте, что то, как называется каталог, значения не имеет. Например, нигде не сказано, что шрифты Adobe Type 1 обязательно должны храниться в каталоге под именем Туре 1. Это условное название было использовано только для того, чтобы вам легче было догадаться, шрифты какого типа находятся в этом каталоге. Раздел "ServerFlags91 В разделе ServerFlags файла xorg.conf содержатся некоторые глобальные параметры, которые управляют поведением XII. Некоторые из этих параметров генерируются программой xorgconf ig и включают комментарии, поясняющие их предназначение. По умолчанию все параметры в этом разделе закомментированы. Кроме того, все строки в этом разделе начинаются с ключевого слова Option, за которым следует заключенное в кавычки название самого параметра. Например, следующая строка отключает команду, выполняемую нажатием клавиатурной комбинации <Ctrl+Alt+Backspace>, которая незамедлительно завершает работу X Server: Option "DontZap" В следующих разделах этой главы приводится краткое описание некоторых (хоть и не всех) встречающихся в разделе ServerFlags параметров, которые могут вам пригодиться. Параметр "NoTrapSignals" Если этот параметр не закомментирован (то есть, включен), XII будет не просто завершать работу в случае возникновения ошибки, а еще и создавать базовый файл дампа. Это может стать причиной некорректной работы консоли после аварийного завершения работы XII. Вам лучше оставить эту строку закомментированной, если только сбои в работе X Server у вас не происходят слишком часто. В этом случае активизация данного параметра позволит вам создать базовый файл дампа, который является просто бесценным средством для выявления проблем и неполадок. Даже если вы не программист и ничего не понимаете в файле дампа, он все равно вам очень пригодится, если вы вдруг решите отослать отчет об ошибках разработчикам проекта Xorg. Параметр "DontZap" Если этот параметр не закомментирован, завершать сеанс X Server нажатием клавиатурной комбинации <Ctrl+Alt+Backspace> будет нельзя. Вам ни в коем случае не следует активизировать этот параметр, если только вы уже не протестировали свою конфигурацию XII и не уверены в том, что она работает правильно. Этот параметр может пригодиться при настройке киоска или общественного компьютера, где важно, чтобы у пользователей не было возможности выйти из работающего приложения или завершить сеанс XII.
FreeBSD как настольная система Параметр "DontZoom" Если этот параметр не закомментирован, переключение с одного видеорежима на другой путем нажатия клавиатурной комбинации <Ctrl+Alt++> и <Ctrl+Alt+-> будет невозможным. По умолчанию эти клавиатурные комбинации будут позволять вам переключаться между различными видеорежимами, если вы сконфигурировали несколько разрешений. Чуть ли не единственная ситуация, когда вы можете захотеть активизировать этот параметр — это если у вас установлены программы, в которых эти клавиатурные комбинации служат для каких-то других целей. В таком случае активизация этого параметра позволит вам запретить XI1 перехватывать такую клавиатурную комбинацию и переключать режимы на середине вашей работы. Параметр "DisableVidMbdeExtension" Если этот параметр не закомментирован, он не будет позволять программе xvitune вносить какие-либо изменения в видеосистему. В многопользовательской системе этот параметр лучше активизировать, чтобы запретить пользователям работать с программой xvidtune, потому что неумелое использование этой программы может закончиться повреждением монитора. Обратите внимание на то, что если сделать эту строку активной, запускать программу xvidtune все равно будет можно, а вот вносить с ее помощью изменения в видеосистему — нельзя. Все остальные параметры в этом разделе, которые присутствуют в конфигурационном файле, генерируемом сценарием xorgconf ig, пожалуй, лучше не трогать. Другие параметры, по умолчанию отсутствующие в разделе "ServerFlags" Существует еще несколько параметров, которые могут оказаться интересными для вас, но которых в конфигурационном файле, генерируемом программой xorgconf ig по умолчанию, нет. Рассматривать их все мы не будем, но обязательно перечислим те из них, которые являются наиболее полезными. Если вы захотите добавить какой- нибудь из следующих параметров, просто добавьте соответствующую, выделенную полужирным строку в раздел ServerFlags файла xorg.config. • Option "AllowMouseOpenFail". По умолчанию, если серверу X Server не удаст- ся обнаружить мышь или другое указательное устройство, он не запустится и завершит свою работу, выдав ошибку. Добавление этой строки позволит серверу запускаться даже в случае отсутствия доступа к мыши или другому указательному устройству. Если только вы не пытаетесь пользоваться XII без мыши (или другого указательного устройства), добавлять этот параметр вам, очевидно, не имеет смысла. • Option "BlankTime" "12й. Этот параметр будет очищать экран по истечении количества минут, указанного на месте п. Если этого параметра нет, будет применяться значение по умолчанию, которое равняется десяти минутам. • Option "StandbyTime" nn". Этот параметр будет переводить монитор в ждущий режим по истечении количества минут, указанного на месте л. Если этого параметра нет, будет использоваться значение по умолчанию, которое равняет ся двадцати минутам.
Дополнительная настройка XI1 I ГТ] I Глава 7 I I Этот параметр поддерживается не всеми видеодрайверами и работает только с мониторами, которые поддерживают функции управления режимом энергосбережения (DPMS). Использовать его можно только в том случае, если в разделе Monitor файла xorg.config (который будет описываться чуть позже в этой главе) явно указано, что данный монитор может поддерживать DPMS. • Option "OffTime" "л". Этот параметр будет отключать монитор по истечении количества минут, указанного на месте л. Если этого параметра нет, будет использоваться значение по умолчанию, которое равняется сорока минутам. Этот параметр поддерживается не всеми видеодрайверами и работает только с мониторами, которые поддерживают функции управления режимом энергосбережения (DPMS). Использовать его можно только в том случае, если в разделе Monitor файла xorg.conf ig (который будет описываться чуть позже в этой главе) явно указано, что данный монитор может поддерживать DPMS. • Option "NoPM". Этот параметр будет отключать некоторые события, имеющие отношение к управлению режимом энергосбережения. По умолчанию функция, отвечающая за управление режимом энергосбережения, активизируется во всех системах, которые могут ее поддерживать. Добавлять этот параметр стоит только в случае возникновения странных проблем, которые, как вам кажется, вызваны событиями, связанными с режимом энергосбережения. В этот раздел также могут добавляться и другие параметры, но они используются гораздо реже. Узнать, что это за параметры, вы можете, воспользовавшись руководством (man) и отыскав в нем страницу, посвященную файлу xorg.conf. Раздел "inputDevice" В этом разделе конфигурируются устройства ввода. В конфигурационном файле xorg.conf может присутствовать несколько разделов InputDevice. Обычно он содержит, по крайней мере, два таких раздела: один для клавиатуры и один для мыши или другого указательного устройства. С разделами InputDevice ассоциируется несколько ключевых слов. Первое — это ключевое слово Identifier. За ним следует название, описывающее данное устройство. XII в принципе все равно, как вы назовете устройство, но лучше, чтобы вы использовали название, достаточно четко описывающее устройство, так чтобы вам самими же потом было понятно, о каком устройстве идет речь. Второе ключевое слово — это ключевое слово Driver. После этого ключевого слова указывается имя драйвера для данного устройства (в кавычках). Наиболее распространенными являются драйверы "keyboard" и "mouse", но могут встречаться и некоторые другие, такие как драйвер "mi его touch", который используется для сенсорных экранов. В остальной части раздела InputDevice содержатся различные параметры, отвечающие за поведение данного устройства. В следующих разделах мы рассмотрим два наиболее типичных раздела InputDevice (для клавиатуры и для мыши), а также ряд доступных для них параметров. Конфигурирование параметров клавиатуры Ниже показан пример первой части раздела InputDevice для клавиатуры:
I ITT I FreeBSD как настольная система I I Часть II Section "InputDeviсе" Identifier "Keyboard!." Driver "kbd" Для настройки поведения клавиатуры доступен целый ряд параметров. Ниже перечислены наиболее часто используемые из них. • Option "Protocol". Если этот параметр отсутствует или закомментирован, будет использоваться значение по умолчанию, то есть Standard. Менять здесь что-либо, пожалуй, не имеет смысла. • Option "AutoRepeat" "x у". Этот параметр отвечает за скорость ввода повторных символов при удержании клавиши на клавиатуре. Число, указываемое на месте х, представляет время задержки, в миллисекундах, перед началом повтора символа, а число, задаваемое на месте у — количество раз в секунду, которое должен повторяться символ. По умолчанию время задержки составляет 500 миллисекунд, а количество повторов — 30 раз в секунду. • Option "XkbRules" "xorg". Этот параметр отвечает за то, как будут интерпретироваться различные аспекты поведения клавиатуры. В большинстве случаев здесь следует оставлять значение "xorg". Изменить это значение вам может понадобиться только в случае, если вы выбрали в xorgconfig нестандартный тип клавиатуры. • Option "XkbModel" "pel04". Если вы пользуетесь 105-клавишной Windows- клавиатурой, здесь будет указано значение "рс105". Если вы используете 101-кла- вишную клавиатуру, не имеющую клавиш для Windows, здесь будет указано значение "pel01". Эти значения также подходят и для ноутбуков. Хотя клавиш на ноутбуках, как правило, меньше, они обычно имеют возможность эмулировать дополнительные клавиши. • Option "XkbLayout" "us". Здесь в большинстве случаев будет указано значение "us". Если вы используете платформу Japanese PC-98, вы захотите изменить это значение на "пес/jp". Опять-таки, пожалуй, самый лучший способ установить нужное значение для этого параметра — это запустить xorgconfig. • Option "XkbOptions" "ctrl: swapcaps". Если этот параметр не закомментирован, он будет менять клавиши <Caps Lock> и <Ctrl> местами, то есть делать из клавиши <Caps Lock> клавишу <Ctrl>, а из клавиши <Ctrl> — клавишу <Caps Lock>. Вы можете захотеть активизировать этот параметр, если вы специалист по Emacs (в Emacs клавиша <Ctrl> является одной из основных) или если вы привыкли к раскладке клавиатуры UNIX, в которой клавиша <Ctrl> находится на том месте, где на клавиатурах ПК находится клавиша <Caps Lock>. Конфигурирование параметров мыши Ниже приведен пример первой части раздела Input Devi се для мыши: Section "InputDeviсе" • Identifier and driver • Идентификатор и драйвер Identifier "Mouse1" Driver "mouse" Option "Protocol" "Auto" Option "Device" " /dev/sysmouse"
Дополнительная настройка XII Далее приводятся и описываются некоторые из наиболее часто используемых в этом разделе параметров. • Option "Protocol" "protocol". Здесь protocol — это тип применяемой в системе мыши. Этот параметр являет обязательным: без него X Server просто вообще не будет работать. Многие пользователи смогут указать здесь значение Auto, чтобы позволить X Server попытаться автоматически определить используемый мышью протокол. В наши дни с этим проблем обычно не возникает; но если этот вариант не сработает, можно будет попробовать другие. Ниже перечислено несколько более полезных протоколов. • Протокол Logitech используют только очень старые, подключаемые через последовательный порт мыши производства Logitech. Для мышей Logitech более новой модели следует указывать протокол Microsoft или MouseMan. • Используйте протокол PS/2 для любой PS/2-мыши. PS/2-мышь — это та мышь, которая имеет небольшой разъем-вилку круглой формы. • Если у вас ноутбук, встроенное в него указательное устройство (такое как сенсорная панель или сенсорные кнопки), возможно, будет работать с протоколом PS/2. Я советую вам сначала попробовать использовать значение Auto и изменить его только в том случае, если мышь не будет распознана или не будет работать правильно. t Option "Device" " devi сел а me". Этот параметр указывает, какое устройство управляет мышью. Этот параметр является обязательным: без него X Server просто вообще не будет работать. В табл. 7.1 (которая приводилась ранее в этой главе) перечислены некоторые наиболее распространенные имена устройств, на которых может находиться мышь. Обратите внимание на то, что в этом параметре на месте devicename должно указываться имя используемого для мыши устройства. • Option "Buttons" "л". В большинстве случаев количество кнопок на мыши будет определяться автоматически; если этого не случится, вы можете использовать этот параметр, чтобы указать X Server, сколько кнопок доступно на вашей мыши. Здесь л — это количество имеющихся у мыши кнопок. Наиболее часто встречающимися значениями являются 2 и 3, хотя в принципе поддерживаются значения от 2 до 5. Если вдруг окажется так, что на вашей мыши доступно целых пять кнопок, воспользуйтесь этим. • Option "Emulate3Buttons". Этот очень важный параметр позволяет двухкно- почной мыши работать как трехкнопочной (то есть эмулировать третью кнопку). Если у вас двухкнопочная мышь, вы обязательно захотите активизировать этот параметр, потому что XII предполагает частое использование всех трех кнопок мыши. Если вы активизируете этот параметр, вы сможете эмулировать среднюю кнопку мыши, нажимая одновременно левую и правую кнопки (одновременное нажатие кнопок мыши также называется "аккордом").
244 FreeBSD как настольная система Часть II • Option "Emulate3Timeout" "л". Если параметр Emulate3Buttons включен, он будет отвечать за количество миллисекунд, которое может пройти между щелчком правой и щелчком левой кнопкой мыши прежде, чем XI1 больше не будет интерпретировать это действие как щелчок средней кнопкой мыши. Другими словами, и левая, и правая кнопка мыши должны быть нажаты именно в этот промежуток времени для того, чтобы это действие трактовалось как щелчок средней кнопкой мыши. Здесь, п — это количество миллисекунд, которое может пройти. Если этот параметр отсутствует, а параметр Emulate3Buttons был активизирован, будет использоваться значение по умолчанию, которое равняется 50 миллисекундам. Раздел "Monitor" В этом разделе конфигурируются частоты вертикальной и горизонтальной синхронизации. Он начинается с ключевого слова Identifier, за которым следует заключенное в кавычки имя, идентифицирующее данный монитор. То, какое имя вы выберете, не имеет особого значения. Также в этом разделе обязательным является присутствие и двух других ключевых слов: HorizSync и VertRef resh. О них более подробно будет рассказываться в следующих разделах этой главы. В разделе Monitor могут присутствовать также и другие параметры, но в них не так часто возникает необходимость. Полную информацию о доступных параметрах вы сможете найти на странице руководства xorg.conf. HorizSync HorizSync — это поддерживаемая монитором частота горизонтальной синхронизации, в килогерцах. Она может быть указана несколькими способами. • В виде диапазона. Этот способ обычно используется при настройке многочастотных мониторов (а сегодня практически все мониторы на основе электронно-лучевой трубки являются многочастотными). Например, для монитора, способного поддерживать частоты горизонтального обновления в диапазоне от 44 до 76 килогерц вы могли бы указать здесь такое значение: HorizSync 44-76. • В виде одного значения. Если ваш монитор является монитором с фиксированной частотой, то есть поддерживает одну частоту, вы можете просто указать после HorizSync эту частоту (например, так: HorizSync 35.2). • В виде списка. Если ваш монитор поддерживает несколько фиксированных частот, вы можете перечислить их после HorizSync в виде списка, разделив запятыми (например, так: "HorizSync 31.5/ 35.2й). • В виде списка диапазонов. Если ваш монитор поддерживает более одного диапазона частот, но между этими диапазонами есть такой, который он не поддерживает, вы можете просто перечислить все поддерживаемые им диапазоны в виде списка (например, так: "HorizSync 15-25, 30-50"). VertRefresh После ключевого слова VertRefresh перечисляются частоты вертикальной синхронизации, которые может поддерживать данный монитор. Значения частот верти-
Дополнительная настройка XI1 | ГТГ I Глава 7 I I кальной синхронизации можно указывать во всех тех же форматах, что и значения частот горизонтальной синхронизации. ВНИМАНИЕ! Указание для HorizSync и VertiRefresh значений, выходящих за рамки диапазона, который может поддерживать монитор, может привести к повреждению или полному выходу из строя монитора. Всегда очень внимательно проверяйте, не указали ли вы значения, выходящие за рамки поддерживаемого диапазона. Точно узнать, какие частоты поддерживает монитор, вы можете либо из прилагавшейся к монитору документации, либо на сайте производителя (или же по адресу http://www.monitorworld.com/Monitors/database). Раздел "Device" В этом разделе конфигурируется графический адаптер (видеокарта). Как и многие другие разделы, он начинается с ключевого слова Identifier, за которым следует заключенное в кавычки имя, идентифицирующее само устройство. Также обязательным является и ключевое слово Driver, сопровождаемое заключенным в кавычки именем используемого для видеокарты драйвера. Например, если у вас установлена видеокарта NVIDIA TNT2, эта строка должна выглядеть следующим образом: Driver "nv" Если у вас установлена поддерживаемая видеокарта, вам будет легче настроить ее с помощью xorgconf ig (как описывалось ранее в этой главе), чем делать это вручную в файле xorg. conf. Однако если по какой-то причине вы будете вынуждены или захотите настроить видеокарту вручную, знайте, что полный список поддерживаемых карт вместе с драйверами, которые должны для них использоваться, доступен по адресу http://wiki.x.org/wiki/VideoDrivers и в приложении Б. Также в этом разделе довольно часто используется ключевое слово VideoRam для указания доступного в видеокарте объема видеопамяти. Например, если в вашей видеокарте доступно 16 Мбайт ОЗУ, эта строка должна выглядеть так: VideoRam 16384 Как вы узнали ранее в этой главе, объем видеопамяти указывается в килобайтах; в двоичной математике один килобайт на самом деле равняется 1024 байтам. Поэтому не забудьте умножить указанное на вашей видеокарте значение в мегабайтах на 1024, чтобы получить значение, которое можно указать в конфигурационном файле. Для графических устройств доступны и некоторые другие параметры, но для большинства видеокарт они не нужны. Полный список всех доступных параметров вы сможете найти на странице руководства xorg.conf. Также вы наверняка захотите заглянуть на Web-страницу по адресу http: //х • org/ X11R6. 8 .2/doc/RELNOTES3. html #9, чтобы узнать, нет ли там никаких рекомендаций, касающихся конкретно вашего типа видеокарты, а также указаний по поводу того, какие параметры должны задаваться для карт именно такого типа.
FreeBSD как настольная система Часть II СОВЕТ Если вам не удается найти драйвер для своей видеокарты, не отчаивайтесь: может быть не все еще потеряно. Возможно, удастся заставить вашу видеокарту работать с помощью драйвера VESA. Драйвер VESA представляет собой спецификацию обобщенного Super VGA, которую до определенной степени поддерживают многие видеокарты. Если вам придется использовать этот драйвер, знайте, что ускоренные функциональные возможности вашей видеокарты не будут поддерживаться полностью, также как не будут полностью поддерживаться и все разрешения и степени качества цветопередачи, с которыми ваша видеокарта может справляться. Но это лучше, чем ничего, и может позволить вам использовать видеокарту, для которой на текущий момент ни одного драйвера для Х11 не доступно. Если вы будете вынуждены прибегнуть к такому варианту, не забывайте почаще проверять базу данных поддерживаемых карт, потому что драйверы (поддержка) для новых видеокарт добавляются в нее регулярно. Раздел "Screen" В разделе Screen параметры монитора конфигурируются в сочетании с параметрами видеокарты для создания схемы "отображения", которая будет работать с X Server. Начинается этот раздел с ключевого слова Identifier, которое содержит заключенное в кавычки имя, идентифицирующее данную конкретную комбинацию монитора и видеокарты. В файле xorg.conf может быть несколько разделов Screen, но никак не меньше одного. Использоваться будет тот раздел Screen, который встречается цервым, если только в разделе ServerLayout не будет указано, что применяться должен какой-нибудь другой из них. Указав идентификатор для раздела Screen, вы также должны будете указать ключевые слова "devicename" (имя устройства), "monitorname" (имя монитора) и DefaultDepth "л". Другие доступные параметры используются крайне редко; узнать больше о них вы сможете на странице руководства xorg.conf. • Device "devicename". Это имя графического устройства (видеокарты), которое должно использоваться по умолчанию для данной конфигурации экрана. Здесь на месте devicename вы должны указать ту же строку, что отображается в разделе Identifier графического устройства, которое вы настраивали ранее в этом файле. • Monitor "monitorname". Это имя монитора, который должен использоваться по умолчанию для данной конфигурации экрана. Здесь на месте monitorname вы должны указать ту же строку, что отображается в разделе Identifier монитора, который вы конфигурировали ранее в этом файле. • Def aultDepth "л". Это глубина цвета (качество цветопередачи), которая должна использоваться по умолчанию для данной конфигурации экрана. Допустимыми значениями, которые могут указываться на месте л, являются 8, 16 и 24 (при условии, что видеокарта поддерживает все эти три значения глубины цвета). Подраздел "Display" После того, как вы сконфигурируете раздел Screen, вы должны будете сконфигурировать для экрана подраздел (подразделы) Display, чтобы указать разрешения и циклический порядок для каждого доступного значения глубины цвета (качества
Дополнительная настройка XI1 I T7Z I Глава 7 I I цветопередачи). В конфигурационном файле обязательно должен присутствовать хотя бы один подраздел Display для используемого по умолчанию значения глубины цвета, иначе X Server просто не запустится. Однако таких разделов может быть и больше, по одному на каждое значение глубины цвета. Первая строка в этом подразделе будет содержать ключевое слово Depth, сопровождаемое значением глубины цвета, для которого собственно и предназначается этот подраздел. Ниже показан пример того, как могут выглядеть первые две строки в этом подразделе: Subsection "Display" Depth 24 Третьей здесь обязательно должна указываться строка режимов, состоящая просто из ключевого слова Modes и списка разрешении, которые должны поддерживаться. По умолчанию будет использоваться то разрешение, которое стоит первым. Разрешения, перечисленные после него, будут применяться при нажатии клавиатурной комбинации <Ctrl+Alt++> и <Ctrl+Alt+->. Обратите внимание, что в некоторых системах эти клавиатурные комбинации могут быть недоступны. Ниже показан пример строки режимов: Modes "1024x768" "800x600" "640x480" В этом примере для данной глубины цвета по умолчанию будет использоваться разрешение 1024x768. При нажатии клавиатурной комбинации <Ctrl+Alt++> или <Ctrl+Alt+-> будет использоваться, соответственно, разрешение 800x600 и 640x480. XII позволяет создавать виртуальный экран, занимающий больше места, чем экран с установленным разрешением. Например, вы можете установить для экрана разрешение 800x600 и создать виртуальный экран размером 1024x768. Мы рассказывали об этом в предыдущем разделе этой главы, когда описывали процедуру настройки XII с помощью программы xorgconf ig. Если вы решите, что вам нужен виртуальный экран, вы можете воспользоваться параметром "Virtual resolution" и указать, каким должно быть разрешение виртуального экрана. Например, если вы добавите параметр "Virtual 1024x768", будет создан виртуальный экран размером 1024x768. Если разрешение фактического экрана ниже этого, видна будет только часть экрана. Чтобы просмотреть невидимые части экрана, вам придется перетаскивать указатель мыши к краям экрана: это позволит вам прокручивать экран влево, вправо, вверх или вниз, в зависимости от того, к какому краю вы передвинете указатель. В этом разделе также могут задаваться и некоторые другие параметры, но в них очень редко возникает необходимость. Полный список всех доступных для использования в разделе Display параметров вы сможете найти на странице руководства xorg.conf. Раздел "ServerLayout" Раздел ServerLayout является необязательным. Если он отсутствует, использоваться будет первый встречающийся в файле xorg.conf раздел Screen и раздел InputDevice (то есть подраздел Keyboard и подраздел Mouse). Если раздел ServerLayout все-таки существует, он будет применяться во время сеанса X для выбора нужного раздела Screen и InputDevice из множества доступных в конфигурационном файле.
248 FreeBSD как настольная система Часть II Ключевое слово Identifier является обязательным и сопровождается заключенной в кавычки строкой, которая содержит имя данной серверной раскладки. Ниже перечислены некоторые другие элементы, которые могут использоваться в разделе ServerLayout. • Screen "screenname". Это конфигурация экрана, которая должна использоваться для данного устройства. Здесь screenname — это имя, указанное после ключевого слова Identifier в разделе Screen, который должен применяться для данной серверной раскладки. • Input Devi се п keyboardname" "CoreKeyboard". Этот параметр задет, какой подраздел Keyboard должен использоваться для данной серверной раскладки. Здесь keyboardname — это имя, указанное после ключевого слова Identifier в подразделе Keyboard, который вы хотите использовать. Следующее после этого значение CoreKeyboard указывает, что данная клавиатура должна использоваться по умолчанию. • Input Devi ce "mousename" "CorePointer". Похож на предыдущий параметр, только указывает, какой подраздел Mouse должен использоваться для данной серверной раскладки. Опять-таки, следующее после него значение CorePointer указывает, что данная мышь должна применяться по умолчанию. В раздел ServerLayout также могут добавляться строки Option. Если такие строки добавляются и если указанные в них параметры конфликтуют с параметрами, перечисленными в других разделах, тогда эти параметры (данного раздела) будут перекрывать все остальные параметры. Для файла xorg. conf доступны и другие опции, но они используются очень редко. И снова, полную информацию обо всех доступных опциях конфигурации вы сможете найти на странице руководства xorg.conf. Тестирование конфигурации Х11 Когда вы завершите работать с xorgconf ig и/или вручную отредактируете файл xorg.conf и сохраните свои изменения, можете протестировать X Server. Введите startx в командной строке, чтобы запустить систему XII. Если все в порядке, ваш экран сначала станет пустым, а затем на нем проявится клетчатый узор с небольшим крестиком (х) посередине, как было показано на рис. 2.15 в главе 2. Крестик — это указатель мыши. Еще через несколько секунд появится оконный диспетчер, указатель мыши приобретет более знакомую форму стрелки белого или черного цвета и его станет можно перемещать по экрану. Если передвинуть курсор не удается или если XI1 вроде запускается, но потом завершает свою работу, выдавая ошибку, перепроверьте содержимое файла xorg.conf, чтобы убедиться в том, что все параметры в нем сконфигурированы правильно. ВНИМАНИЕ! Если вы запустили Х11, но изображение на экране имеет искаженный вид или вы слышите пронзительно высокий звуковой сигнал, немедленно выключите монитор или нажмите клавиатурную комбинацию <Cth+Alt+Backspace>, чтобы уничтожить сеанс X Server. Любой из этих симптомов означает, что либо используется слишком высокая частота обновления и монитор с ней не справляется, либо что выходной трансформатор строчной развертки в мониторе вот-вот сгорит. Уничтожив сеанс X Server, измените значения частот синхронизации и разрешений для вашего монитора в файле xorg. conf или с помощью сценария xorgconf ig.
Дополнительная настройка XI1 Глава 7 249 Если вы вводите startx и ваш монитор становится пустым, а затем как будто отключается или переходит в режим приостановки (меняется цвет сигнальной лампы источника питания, экран начинает мерцать или вы слышите, как на мониторе разряжается статическое электричество), возможно, это означает, что вы запустили монитор с параметрами, с которыми он не может справиться. Нажмите клавиатурную комбинацию <Ctrl+Alt+Backspace>, чтобы уничтожить сеанс X Server. После этого на экране должно восстановиться изображение и опять появиться командная строка. Далее измените значения частот синхронизации и разрешений в файле xorg. conf или с помощью сценария xorgconf ig, указав менее высокие значения, и снова попробуйте запустить XII. Получив рабочую конфигурацию XII, вы можете захотеть настроить какие-то отдельные аспекты ее поведения в соответствии со своими личными предпочтениями. В следующем разделе речь пойдет о персональном файле .xinitrc, который служит для этого, и который находится в вашем домашнем каталоге. Персональный файл .xinitrc О конфигурации X Server пользователям волноваться не нужно; эта задача выполняется на корневом (root) уровне системы, запускаясь в виде демона по запросу клиентов (оконных диспетчеров). Оконные диспетчеры представляют собой пользовательские процессы, и каждый пользователь может выбирать оконного диспетчера по своему вкусу, не обращая внимания на ограниченные возможностями оборудования разрешения, которые были указаны в файле xorg. conf. Каждый пользователь может настроить внешний вид и поведение своего сеанса XII с помощью файла сценария программной оболочки, который находится в его домашнем каталоге и называется .xinitrc. В этом файле можно указать, какой оконный диспетчер должен вызываться для работы на клиентской стороне клиент-серверной архитектуры XI1 во время сеанса X. Его также можно применять для указания приложений, которые должны загружаться автоматически при каждом запуске XII, цвета фона экрана и расположения фонового рисунка. Каждая из этих операций предполагает внесение изменений в файл . xinitrc, каких именно — вы увидите в следующих разделах. Смена оконного диспетчера В категории xll-wm коллекции портов (и коллекции пакетов) FreeBSD доступно много оконных диспетчеров. Упоминавшийся ранее оконный диспетчер Blackbox является одним из наиболее популярных, и он показан на рис. 7.1. Информацию о том, как работать с коллекцией портов FreeBSD, можно найти в главе 16. Blackbox — это идеальный вариант оконного диспетчера для пользователей, которые не хотят, чтобы оконный диспетчер "путался под ногами". Он также является идеальным вариантом для систем с недостаточным количеством ресурсов. Blackbox очень часто используется как оконный диспетчер на серверах. Однако приводимые в этом разделе инструкции подходят для любого устанавливаемого оконного диспетчера.
250 FreeBSD как настольная система Часть II НА ЗАМЕТКУ KDE и GNOME ведут себя не совсем так, как обычные оконные диспетчеры. Если вы хотите, чтобы при запуске Х11 вызывалась настольная среда KDE, а не графический диспетчер KDM, используйте следующую строку в файле .xinitrc: exec startkde Для GNOME применяйте такую строку: /usr/XI1R6/bin/gnome-seesion Г'ВД-Г '¦¦¦«;¦'¦")»7"»"" ' V (¦"""У'ту ей* до» ы*<р т ф ф ЛьЪЪ ХЪ f f> А * * * Ъ Щ Шь Ш Т J & & и * Pressure мга*м(у Г Fade out Г* mcrtnwntal Г U** olor from gradient Ql ¦! * Ь15и0 J4U шшшшяатшшштщ ite+ifci ?? i (p | ¦ J » f a | + j, t if ¦¦«¦ -ШгМ-" ¦ l»yr«, channel*. Path». Undo ¦-¦"¦¦"^ 1о!звРм' I u Рис. 7.1. Blackbox - это очень маленький и быстрый оконный диспетчер. Он содержит лишь несколько декоративных опций и использует очень мало системных ресурсов После установки нового оконного диспетчера из коллекции портов или пакетов FreeBSD, чтобы воспользоваться им, вы должны будете отредактировать свой персональный файл .xinitrc. Чтобы сделать это, откройте файл .xinitrc, который находится в вашем домашнем каталоге, в своем любимом текстовом редакторе. Если файл еще не существует, он будет создан. В данном случае все, что вы хотите — это указать XII, какой оконный диспетчер ей следует использовать, поэтому потребуется только добавить в этот файл одну строку. Для Blackbox эта строка будет выглядеть так: exec blackbox У каждого оконного диспетчера исполняемый файл называется по-своему; поэтому просмотрите файл pkg-plist, доступный в каталоге порта установленного оконного диспетчера, чтобы узнать название его исполняемого файла, и задайте его здесь
Дополнительная настройка XI1 | ГГЗ I Глава 7 I 1 I на месте blackbox. Добавив подходящую команду exec в файл .xinitrc, сохраните его и выйдите из редактора; при следующем запуске XI1 на экране появится уже новый оконный диспетчер. Рассмотрение процедур настройки всех оконных диспетчеров, кроме Window Maker (который описывался в главе 5), выходит за рамки данной книги. Более подробную информацию о заинтересовавшем вас оконном диспетчере вы сможете найти на соответствующем Web-сайте, который обычно указан в файле pkg-descr. (В частности, информация о Blackbox доступна по адресу http: //blackboxwm. sourcef orge • net/.) НА ЗАМЕТКУ В коллекции портов FreeBSD, в разделе xll-wm, доступны также и многие другие оконные диспетчеры. Более подробную информацию, а также снимки экрана других популярных оконных диспетчеров, можно найти на Web-сайте http: //www.xwinman.org. Автоматический запуск приложений Не забывайте о том, что .xinitrc представляет собой сценарий программной оболочки, который выполняется при запуске XI1 (то есть когда вводится команда startx). Это означает, что в него можно добавлять любые команды, которые должны выполняться при каждом запуске XII, включая определенные приложения X, такие как окна xterm и популярные, следящие за производительностью системы утилиты. Все приложения, которые должны запускаться автоматически, следует добавлять перед вызовом оконного диспетчера и завершать амперсандом (&). (Обратите внимание, что перед амперсандом обязательно должен стоять символ пробела.) В таком случае они будут запускаться в фоновом режиме и отделяться от выполняющей сценарий оболочки, позволяя ей переходить к следующей команде. Если не завершать каждую команду амперсандом, она будет запускаться на переднем плане, блокируя для сценария возможность получения доступа и запуска оконного диспетчера. Ниже показан пример файла . xinitrc, который запускает терминальное окно X и часы X, а также оконный диспетчер Blackbox: xterm & xclock & exec blackbox Многие из программ, которые можно запускать в сеансе X, имеют опции, позволяющие точно указывать, где и как они должны появляться. Например, чтобы указать, что окно xterm должно занимать 80 столбцов в ширину и 25 строк в высоту и размещаться в точке 100 пикселей по горизонтали и 50 — по вертикали, нужно использовать такую строку: xterm -geometry 80x25+100+50 & С помощью похожих аргументов можно вызывать и многие другие программы; примеры вы сможете найти на соответствующих страницах руководства (как правило, после опции geometry).
I „л I FreeBSD как настольная система 252 I I Часть II Установка цвета фона и фонового рисунка Многие оконные диспетчеры и графические оболочки (настольные среды) вроде Windows Maker и GNOME имеют встроенные возможности для установки цвета фона и фоновых рисунков. Однако, у некоторых более простых оконных диспетчеров, таких как FVWM и wm2, подобных возможностей, к сожалению, нет. Установить цвет фона и фоновый рисунок можно путем вызова из файла .xinitrc соответствующих внешних программ; подробнее об этом — уже в следующих разделах. Установка цвета фона По умолчанию XII имеет достаточно уродливый клетчатый фон, который, кажется, был специально сделан для того, чтобы глазам было настолько трудно воспринимать его, насколько возможно. Программа xsetroot позволяет устанавливать сплошной или узорчатый цвет фона. В каталоге /usr/XHR6/lib/Xll/rgb. txt находится файл, в котором по именам перечислены все доступные цвета. Ниже показан пример того, как можно изменить цвет фона на сплошной: xsetroot -solid ForestGreen i Попробуйте ввести эту команду в окне xterm, чтобы установить для фона оливковый цвет (ForestGreen). Если вы хотите, чтобы это изменение было постоянным, можете поместить эту команду в свой файл .xinitrc перед командой, запускающей оконный диспетчер. Например, следующая строка будет устанавливать для фона оливковый цвет и затем запускать оконный диспетчер twm: xsetroot -solid ForestGreen & exec twm Цвет, который вы используете, должен быть допустимым, то есть это должен быть один из цветов, перечисленных в файле rgb. txt, а если в названии этого цвета присутствует символ пробела, его следует заключить в кавычки. Помимо установки цвета или узора для рабочего стола, xsetroot также позволяет изменять внешний вид указателя мыши. Более подробную информацию об установке узорчатых цветов фона и изменении указателя мыши с помощью специальных растровых рисунков вы сможете найти на соответствующей странице руководства, воспользовавшись командной man xsetroot. Вы можете создавать свои собственные рисунки для применения в качестве фона рабочего стола или в качестве указателей мыши с помощью программы bitmap, которая устанавливается вместе с XII (то есть как часть XII) и показана на рис. 7.2. Установка фонового рисунка XI1 не имеет никакой специальной программы, которая бы позволяла устанавливать на фоне рабочего стола в полную величину какие-либо рисунки (то есть, "обои"). Для этой цели в XII традиционно используется программа xv, которая представляет собой программу для просмотра изображений, xv доступна в коллекции портов FreeBSD, в категории graphics, xv, работающая в интерактивном режиме, показана на рис. 7.3.
Дополнительная настройка XI1 Глава 7 Рис. 7.2. Программа Ы tmap, позволяющая создавать рисунки, которые затем с помощью программы xsetroot можно использовать в качестве фоновых узоров или указателей мыши Рис. 7.3. xv позволяет не только устанавливать фоновый рисунок в XII: она также представляет собой полнофункциональную программу для просмотра изображений, которая может использоваться интерактивно
I TZZ I FreeBSD как настольная система 254 xv поддерживает большинство популярных форматов изображений, таких как GIF, JPEG, BMP и PNG, и, соответственно, позволяет использовать в качестве фонового рисунка изображение в любом из них. Следующая команда демонстрирует, как xv можно применять для загрузки изображения в качестве фонового рисунка для XII: xv -root -quit /hone/btman/images/myimage.jpg Эта команда указывает xv загрузить изображение myimage.jpg в окно root (которым является фон оконного диспетчера). Она также указывает xv, что та должна завершить свою работу сразу же после того, как загрузит изображение. (Благодаря этому, необходимость добавлять амперсанд в конце командной строки, если она включается в сценарий запуска, отпадает.) Сделать так, чтобы это изображение загружалось как фоновый рисунок при каждом запуске XII, можно, добавив в файл .xinitrc, например, такую строку: xv -root -quit /home /foobar/ linages /my image, jpg exec twm Существуют и другие опции, которые вы можете захотеть использовать с программой xv, когда будете применять ее для загрузки фоновых рисунков: это опция -max, которая изменяет размер изображения так, чтобы оно занимало весь экран, и опция -maxspect, которая изменяет размер изображения так, чтобы оно занимало весь экран, но при этом сохраняло свой нормальный внешний вид. Работа со шрифтами Рано или поздно вы наверняка захотите установить в XI1 какие-нибудь дополнительные шрифты для своих приложений (таких как GIMP). Хотя XI1 поддерживает несколько типов шрифтов, чаще всего устанавливаются шрифты типа Adobe Type 1 и TrueType. Шрифты обоих этих типов являются чрезвычайно популярными, потому что они поддерживаются Windows и Macintosh, а также более новыми версиями Xorg. Тысячи шрифтов Туре 1 и TrueType доступны бесплатно для загрузки на различных Internet-сайтах. Также доступны и коммерческие (платные) версии шрифтов обоих этих типов, и XII может использовать их, независимо от того, как они упакованы: как шрифты для Windows или как шрифты для Мае. Поскольку шрифты Adobe Type 1 и TrueType являются наиболее популярными, в следующих разделах будет рассказываться о том, как используются и конфигурируются именно эти типы шрифтов. Проверка файла xorg. conf на наличие в нем поддержки для шрифтов Первое, что вам нужно сделать — это убедиться в том, что в файле xorg.conf содержатся модули, необходимые для поддержки шрифтов, которые вы хотите испольг зовать. Файл xorg.conf подробно описывался ранее в этой главе, в разделе "Что собой представляет файл xorg.conf". Вы должны проверить наличие в разделе Module этого файла (/etc/Xll/xorg.conf) подходящей строки Load. Для поддержки шрифтов Adobe Type 1 необходима следующая строка Load: Load "typel"
Дополнительная настройка XI1 I ГГГ Глава 7 I Для поддержки шрифтов TrueType необходима такая строка Load: Load "freetype" Эти строки должны находиться в файле xorg.conf после такого заголовка: Section "Modules" Вы также должны убедиться в том, что разделе Files существует подходящий каталог для хранения новых шрифтов. Чтобы сделать это, отыщите в файле xorg. conf строки, начинающиеся со слова Font Path. Если вы устанавливаете шрифт TrueType, я рекомендую вам добавить после последнего оператора Font Path в файле, отвечающего за хранение всех шрифтов TrueType, следующую строку; FontPath H/usr/XllR6/lib/Xll/fonts/TrueType/w Добавив эту строку, сохраните файл и затем выйдете из редактора. Создание каталогов и установка шрифтов Далее вы должны создать каталог, если он еще не существует. Чтобы сделать это, от имени пользователя root выполните следующую команду: mkdir /usr/XHR6/lib/Xll/fonts/TrueType Эта команда позволяет создать каталог для шрифтов TrueType. I НА ЗАМЕТКУ I Вы можете заметить, что Х11 является подсистемой, которая не подчиняется традиционному отделению поддерева /usr/local от остальной части системы, о чем более подробно будет рассказываться в главе 12. Устанавливая дополнительные шрифты для использования в Х11, вам лучше поступить следующим образом: создать для них в пределах файловой системы FreeBSD отдельный каталог наподобие /usr/local/xii/f onts (с соответствующими подкаталогами для различных типов шрифтов) и затем, воспользовавшись строками FontPath в файле xoxg.-cuivf, указать Х11 искать эти шрифты там. В таком случае, если вам придется выполнять резервное копирование и переносить данные системы в новую установку, ваши загруженные и приобретенные шрифты будут безопасно храниться вместе со всеми остальными данными в каталоге usr/local. Создав каталог для шрифтов, скопируйте файлы шрифтов, которые вы хотите добавить, в соответствующие подкаталоги. Шрифты Туре 1 следует копировать в подкаталог /usr/XHR6/lib/Xll/f onts/Typel, а шрифты TrueType — в подкаталог /usr/XllR6/lib/Xll/fonts/TrueType. Для работы со шрифтами, в принципе, необходим доступ только для чтения, поэтому вы можете изменить права на доступ к шрифтам так, чтобы все пользователи могли получать к ним доступ только для чтения. Делается это с помощью следующей команды: # chmod 444 fontnsmm Здесь font name — это, конечно же, имя файла шрифта, который вы только что установили. (Убедитесь в том, что вы сейчас находитесь в правильном каталоге шрифтов. Если вы плохо знакомы с базовыми командами программной оболочки и не знаете, как перейти из одного каталога в другой, прочитайте главу 8.) Далее вам придется запустить парочку программ, чтобы правильно настроить установленные шрифты.
FreeBSD как настольная система Для настройки шрифтов TrueType вам понадобится программа ttmkf dir. Она доступна в коллекции портов FreeBSD, в каталоге xll-fonts. Для настройки шрифтов Adobe Type 1 вам потребуется программа type 1 inst, которая также доступна в коллекции портов FreeBSD, в каталоге xll-fonts (имя порта, в котором она находится, выглядит как; p5-typelinst, поскольку это пакет Perl). Процедура установки программ из коллекции портов подробно описывается в главе 16. Скопировав шрифты в подходящий каталог, убедитесь в том, что вы находитесь в этом самом каталоге, и введите в командной строке следующую команду: # ttmkfdir > fonts.scale (если речь идет о шрифтах TrueType) или # type1inst > fonts.scale (если речь идет о шрифтах Adobe Type 1). Теперь вам осталось выполнить только еще одну команду — mkfontdir, которая распознает новые шрифты и добавляет их в конфигурационный файл шрифтов. Чтобы настроить масштабируемые шрифты, подобные Туре 1 и TrueType, вы должны выполнить эту команду с опцией -е. Для этого, опять-таки, сначала убедитесь в том, что вы находитесь в том каталоге, в который скопировали шрифты, а затем выполните в командной строке следующую команду: # mkfontdir -e /us г / XI1R6/lib/font/encodings Перезапустите Xll (если вы сейчас работаете в ней); после этого ваши новые шрифты должны стать доступными для использования. НА ЗАМЕТКУ Каждый раз, когда вы будете добавлять новые шрифты, вы должны будет снова использовать программу ttmkf dir или typelinst, а затем выполнять соответствующую команду mkfontdir. Использование удаленных клиентов Х11 В разделяемой клиент-серверной архитектуре XII приложения могут запускаться на центральном хосте и перенаправлять свои выходные и входные данные на удаленный хост, как это часто делается в вычислительных системах кластерного типа и университетских городках. Использование удаленного клиента может оказаться полезным, например, если имеется необходимое для совместной работы графическое приложение, которое обслуживается достаточно мощным сервером, и требуется возможность управлять им с рабочей станции, у которой не хватает мощности для его запуска. Такая конфигурация также может оказаться полезной в ситуации, когда центральное приложение стоит очень дорого и согласно лицензии может использоваться только для одной установки, но необходимо, чтобы к нему можно было получать доступ с оснащенного XI1 клиентского компьютера, который расположен в университетском городке; XII делает такую систему возможной и прозрачной, а также весьма экономически выгодной. В некоторой степени такое удаленное использование XI1 похоже просто на применение SSH для входа в удаленную систему и запуска приложения с текстовым интерфейсом. Приложение фактически запускается
Дополнительная настройка XI1 1 7TZ I Глава 7 I I и работает на сервере, а выходные и входные данные просто пересылаются на вашу систему. XII позволяет работать подобным образом как с текстовыми, так и с графическими приложениями. Однако по умолчанию эта возможность отключена и, прежде чем ей можно будет воспользоваться, она должна быть активизирована. При использовании удаленных клиентов в XII сбивать с тс»лку может то, ЧТО в этом случае термины "клиент" и "сервер", так сказать, "меняются местами" (то есть имеют противоположные значения). В терминологии сетей "клиент" — это хост, который запускает приложения, находящиеся на другой системе, которая, в свою очередь, называется "сервером". Однако в XI1 сервер запускается на локальной системе, а клиент находится на удаленной системе. В принципе, клиент в XI1 — это любая программа, которая запускается под XII. Еще больше усложняет дело то, что X Server может запускать клиент, расположенный на удаленной системе, которая фактически является сервером. Например, вы могли бы загрузить в X Server находящееся на удаленной системе графическое клиентское приложение для администрирования баз данных. В этом случае ваш клиент находился бы на удаленной системе, которая сама по себе являлась фы сервером баз данных. Для того чтобы любая подобная схема работала, система, на которой вы хотите отображать выходные данные и работать с данными удаленного приложения XII, должна выполнять XII. Однако X Server вовсе не обязательно должен находится в системе такого же типа. X Server может запускаться на другой системе FreeBSD, на системе Linux, Solaris или Mac OS X. Эта система даже не обязательно должна быть системой типа UNIX. Существуют и пакеты X Server для Windows, которые позволяют отображать удаленные приложения XII, выполняемые под FreeBSD. Сейчас многие из них являются коммерческими, но пакет X Server для Windows под названием Cygwin/X доступен бесплатно (по адресу http: //х. cygwin. com/), поэтому вы в принципе можете попробовать, как будет работать распределенная система X, и с машины Windows. По умолчанию X Server не будет позволять удаленным приложениям отображаться на вашем экране, Существует несколько способов исправить эту ситуацию. Наиболее популярный, хотя и не самый безопасный, из них — воспользоваться программой xhost. Использование программы xhost для позволения удаленным приложениям отображаться локально xhost будет позволять удаленным приложениям, запускаемым на другой системе, отображаться локально в вашей системе и извлекать с нее принадлежащие им входные данные. Чтобы просмотреть текущие параметры настройки xhost, введите xhost без аргументов. Вот что xhost вернет вам: # xhost access control enabled, only authorized clients can connect включена функция контроля доступа, подключаться могут только авторизованные клиенты В данном случае отображаться на данной системе смогут только те из запускаемых на удаленных системах приложений, которые перечислены в списке авторизованных клиентов этой системы. Этот список сейчас пуст, что означает следующее: на текущий момент никаким клиентам не разрешено отправлять свой вывод (изображение) данной системе.
258 FreeBSD как настольная система Часть II Если вы хотите иметь возможность запускать удаленные приложения, находящиеся на хосте под названием lion, вы должны добавить его имя в список авторизован- ных клиентов. Для этого воспользуйтесь следующей командой: # xhost +lion lion being added to access control list в список контроля доступа добавляется клиент lion Если вы теперь введете xhost без аргументов, система вернет следующее сообщение: access control enabled, only authorized clients can connect INET:lion.example.com включена функция контроля доступа, подключаться могут только авторизованные клиенты INET:lion.examp1е.com Удаленный хост lion (которым, согласно контексту наших предыдущих примеров, может быть мейнфрэйм, расположенный в лаборатории на территории университетского городка и выполняющий чрезвычайно дорогую систему автоматизированного проектирования или приложения визуализации) теперь может отображать свои приложения XI1 на вашей локальной системе. Такая конфигурация обладает одним недостатком: каждый, у кого на lion есть учетная запись, сможет отправлять вывод своих приложений вашей системе, хотите вы того или нет. Это может представлять серьезную угрозу для системы безопасности в среде с ненадежными пользователями (то есть теми, которым нельзя доверять на 100%). Поэтому использовать xhost в таких средах не рекомендуется; существуют и другие, более безопасные методы, позволяющие добиться аналогичных результатов. Они вкратце будут описываться чуть позже в этой главе. Также, если вы все-таки решили использовать xhost, лучше предоставляйте хосту право на доступ к вашей системе только тогда, когда он вам нужен, и удаляйте это право сразу же после того, как закончите работать с удаленным приложением. Чтобы лишить хост права на доступ к системе, вы можете выдать команду вроде: # xhost -lion lion being removed from access control list хост lion удаляется из списка контроля доступа После этого удаленный хост lion больше не сможет отображать свои приложения на вашей системе. Также существует способ полностью отключить в xhost функцию контроля доступа так, чтобы к системе могли подключаться любые клиенты, когда они захотят. Такой подход лучше никогда не использовать, потому что он представляет серьезную угрозу для системы безопасности. Но если вы по какой-то причине все-таки захотите им воспользоваться, выполните следующую команду: # xhost + access control disabled, clients can connect from any host функция контроля доступа отключена, к системе могут подключаться любые клиенты, с любого хоста Чтобы снова включить функцию контроля доступа, введите xhost -. Система о? ветит следующим сообщением: access control enabled/ only authorized clients can connect функция контроля доступа включена, подключаться могут только авторизованные клиенты
Дополнительная настройка XII ВНИМАНИЕ! Из-за угрозы для системы безопасности, которая возникает при использовании xhost, вы, как минимум, пожелаете настроить брандмауэр так, чтобы он не позволял несанкционированным пользователям, находящимся за пределами внутренней сети, получать доступ к портам, которые применяются программой xhost. xhost использует порты в диапазоне от 600 до 6063. Процедура настройки брандмауэра подробно описывается в главе 30. После того, как вы сконфигурируете систему так, чтобы она позволяла удаленным приложениями отображаться в ней, вы должны будете подключиться к удаленной системе и запустить приложение. Сделать это вы сможете с помощью Telnet, SSH или rlogin (не забывая о том, что Telnet и rlogin являются методами не поддерживающей шифровгшие связи и, поэтому, могут представлять серьезную угрозу для системы безопасности). СОВЕТ Если вы подключаетесь к удаленной системе через X Server, запущенный в Windows, обязательно используйте только то приложение Telnet или SSH, которое поставляется с пакетом X Server. Поскольку приложению Telnet, поставляемому с Windows, ничего не известно о X Server, оно не будет выполнять правильно процедуры, описываемые в следующих разделах. Также, как уже упоминалось ранее, оно не поддерживает шифрования и потому представляет серьезную угрозу для системы безопасности. Запуск удаленного приложения Чтобы запустить приложение на удаленном хосте и сделать так, чтобы оно отображало свой вывод в локальной системе, вы должны указать в переменной среды DISPLAY на удаленном хосте имя своей локальной системы. Вы можете сделать это из сеанса SSH. Обычно, чтобы запустить удаленное приложение и отобразить его на своей локальной системе, в окне соединения с удаленным хостом можно ввести следующую команду (в данном примере предполагается, что локальный хост имеет имя simba): # DISPLAY=simba:0; export DISPLAY # xcalc 6 Этот код подходит для любой программной оболочки в стиле Bourne (то есть для sh, korn и bash). Если вы имеете дуло с оболочкой в стиле С (вроде csh или tcsh), замените первую строку следующей: # setenv DISPLAY simba: О Этот код должен запустить на удаленном хосте приложение xcalc и отобразить его вывод на вашем экране. Переменная среды DISPLAY имеет такой синтаксис: DISPLM^hostname: display^: screen! Здесь display^ практически всегда имеет значение 0, а аргумент screen^ вообще можно не задавать, если только речь не идет о системе с множеством экранов.
FreeBSD как настольная система СОВЕТ Убедитесь в том, что вы вводите информацию в окне SSH, которое подключено к удаленному хосту. Ввод информации в локальном окне xterm не принесет нужных результатов. Другие способы управления доступом клиентов Существуют и другие способы для указания того, каким хостам разрешается отображать приложения на локальном хосте. Некоторые из них являются более безопасными, чем метод, предполагающий использование программы xhost, который описывался здесь. Рассмотрение этих других методов и процедур их применения выходит за рамки данной книги. Однако необходимую информацию об этом вы сможете найти на странице руководства XSecurity. (Обратите внимание на то, что регистр букв в названии этой страницы руководства имеет значение.) Использование графического диспетчера XDM Мы уже рассказывали (в главе 5), как используются графические диспетчеры KDM и GDM, встроенные в KDE и GNOME. Эти диспетчеры обеспечивают приятную работу в графическом режиме с момента запуска системы и до момента ее выключения, гарантируя безопасный вход в сеанс KDE или GNOME пользователей, подключающихся через локальную консоль, и исключая для них возможность получения доступа к оболочке командной строки. KDM и GDM даже можно сконфигурировать так, чтобы они запускали пользовательские сеансы XI1 в других, отличных от KDE и GNOME, пользовательских средах или оконных диспетчерах. Однако эти методы могут оказаться неподходящими для вас, если вам необходимо, чтобы у всех пользователей системы была возможность настраивать свои сеансы XII, включая сценарии запуска .xinitrc, используя другие оконные диспетчеры, то есть не KDE и GNOME. XDM — это традиционный диспетчер регистрации с графическим интерфейсом для системы XII, который подходит для любого оконного диспетчера и настольной среды (графической оболочки). Когда он загружается при запуске системы, он отображает не текстовое, а графическое приглашение зарегистрироваться в системе. Это графическое приглашение похоже на экран регистрации в Windows 2000/XP и предлагает выполнить те же действия, что и KDM и GDM, но выглядит намного менее ярко и изысканно. Однако если вы захотите, то сможете "украсить" его своими собственными рисунками или картинками. _ Если вы хотите использовать XDM в своих сеансах XII, вы должны отредактировать файл под названием .xsession, который находится в вашем домашнем каталоге. Этот файл является XDM-эквивалентом файла .xinitrc, который используется при регистрации через консоль. Он должен содержать команду, запускающую нужный оконный диспетчер, а также команды, запускающие приложения, которые должны запускаться автоматически во время загрузки. Все команды в файле .xsession должны заканчиваться амперсандом (&) для того, чтобы они запускались в фоновом режиме. Ниже показан пример того, как может выглядеть файл .xsession: exec wmaker xterm &
Дополнительная настройка XI1 Глава 7 Это файл будет запускать оконный диспетчер Window Maker, а после регистрации—приложение xterm. Обратите внимание на то, что в отличие от файла .xinitrc, файл .xsession обязательно должен быть исполняемым; иначе он просто не будет работать. Кроме того, эти два файла вообще могут быть одинаковыми: вы можете сэкономить себе немного времени, просто сначала сделав файл .xsession символьной ссылкой на файл .xinitre и затем сделав его исполняемым: # In -s .xinitrc .xsession # chmod +x .xinitrc Вы можете запускать XDM вручную, вводя в командной строке не startx, a xdm, но это, в принципе, не очень хорошая идея по двум причинам. 1. Никаких дополнительных удобств это вам не дает; на самом деле, вам даже придется проходить процедуру регистрации дважды: один раз в командной строке и один раз уже непосредственно в XDM. 2. Если вас волнует безопасность консоли, тогда в этом вообще нет ничего хорошего, потому что любой сможет подойди к компьютеру и нажать клавиатурную комбинацию <Ctrl+Alt+Backspace>, чтобы уничтожить сеанс XDM, а после этого он автоматически попадет в запущенный вами как пользователем root сеанс программной оболочки. Более правильный подход — сделать так, чтобы XDM запускался автоматически во время загрузки так же, как KDM или GDM (о чем более подробно рассказывалось в главе 5). Процедура настройки XDM очень похожа на процедуру настройки KDM: для того, чтобы XDM вызывался автоматически, вам нужно просто отредактировать файл /etc/ttys и активизировать уже существующую в нем строку ttyv8: ttyv5 "/usr/libexec/getty Pc" cons25 on secure ttyv6 Vusr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 u/usr/XllR6/bin/xdm -nodaemon" xterm on secure ttyv9 "/usr/local/bin/kdm -nodaemon" xterm off secure # Serial terminals Обязательно убедитесь, что в пятом поле установлено значение on. В то же время, если вы ранее конфигурировали диспетчер KDM (как в данном примере), отключите этот диспетчер, установив в соответствующем ему поле значение off. Сохраните файл и перезагрузите систему. При следующей загрузке системы XDM должен загрузиться автоматически. В случае уничтожения сеанса XDM, XDM будет просто снова запускаться самостоятельно, не позволяя пользователям попадать в сеанс программной оболочки пользователя root. XDM имеет очень много опций для настройки, но их рассмотрение выходит за рамки контекста данной книги. Более подробную информацию об этих опциях и различных конфигурационных файлах, доступных для настройки XDM, вы сможете найти на соответствующей странице руководства. 261
ЧАСТЬ FreeBSD и командная строка В этой части... Глава 8. Работа с командной оболочкой Глава 9. Настройка командной оболочки Глава 10. Программирование в командной оболочке Глава 11. Основы программирования на языке Perl /
ГЛАВА 8 Работа с командной оболочкой В этой главе... • Что собой представляет командная оболочка • Выбор командной оболочки для FreeBSD • Смена командной оболочки • Получение справки в командной оболочке • Основные операции для работы с файлами в командной оболочке • Команды для обработки текста • Конвейеры и переадресация ввода-вывода • Завершение команд и редактирование хронологии
FreeBSD и командная строка В части I подробно описывалась процедура установки и настройки FreeBSD, а в части II — графические пользовательские среды (GNOME, KDE и другие оконные диспетчеры), позволяющие делать так, чтобы FreeBSD работала подобно доступным сегодня на рынке настольным операционным системам. Хотя графическая оболочка XII дает пользователю возможность делать удивительные и поистине замечательные вещи, более сложным и в то же время более прямым методом для взаимодействия с операционной системой, раскрывающим действительную мощь UNIX, является командная оболочка (shell), которой пока что в этой книге уделялось минимум внимания. В настоящей главе мы сначала кратко расскажем о нескольких доступных для FreeBSD командных оболочках, затем сравним их функциональные возможности, а потом покажем, как пользоваться командной оболочкой, и как, применяя технологии наподобие переадресации ввода-вывода и конвейеризации, можно управлять данными более простым и более гибким образом, чем возможно при любых других подходах. Что собой представляет командная оболочка Командная оболочка UNIX — это интерфейс между пользователем и ядром операционной системы, который является одним из главных компонентов операционной системы и отвечает за выполнение процессов. В MS-DOS такой командной оболочкой является командная строка DOS, в которой вы вводите команды для того, чтобы поработать со своими файлами и данными в них. В более широком смысле настольные среды Windows и Macintosh тоже являются командными оболочками, потому что хотя они и выглядят более ярко и понятно, чем интерфейсы командной строки, которые они собой заменяют, они выполняют для вас, как для пользователя, те же самые функции: интерпретируют ваши команды и передают их ядру операционной системы. Командная оболочка выступает в роли своего рода "переводчика", потому что она "переводит" человеческий язык на машинный язык, который может понимать ядро, а также транслирует машинный язык, используемый ядром, в язык, понятный людям. Когда вы входите в систему FreeBSD, программа оболочки выполняется от вашего имени, и когда вы вводите команды, вы фактически работаете в этой программе. Без командной оболочки вы ничего не сможете ввести. Термины "командная оболочка" (shell) и "ядро" (kernel) применяются для описания операционной системы, где самые внутренние функции командного обеспечения, способные получать доступ к оборудованию компьютера, защищены от пользователей» которые могут взять и случайно выполнить какой-нибудь небезопасный код. Считается, что эти пользователи существуют во "внешнем" слое, который находится еще дальше от оборудования, чем ядро, и эта граница в UNIX является даже еще более четкой, поскольку здесь пользователям разрешается подключаться к системе с набором полномочий (см. главу 13) еще более низкого уровня, чем у ядра. Командная оболочка служит своего рода интерфейсом между этими двумя дискретными слоями операционной системы, "скорлупой", защищающей нежную мякоть "ореха", которым в данном случае является FreeBSD. В ее обязанности входит предоставление пользователям безопасного, структурированного способа для получения доступа к ядру и аппаратным устройствам, которыми оно управляет. Как командный интерпретатор, командная оболочка берет команды пользователей и преобразует их в процессы, которые затем, через ядро, получают доступ к файлам и устройствам. Также в ее обязанности входит не позволять пользователям выполнять небезопасный код, который
Работа с командной оболочкой может повредить ядро, а также помогать им находить и выполнять программы, заставляющие систему работать. На рис. 8.1 показаны взаимоотношения между системным оборудованием, ядром, командной оболочкой и пользователем. Рис. 8.1. Взаимоотношения между оборудованием, ядром, командной оболочкой и пользователем О роли ядра более подробно будет рассказываться в главе 18. Сейчас просто знайте, что ядро — это специальный фрагмент программного кода, который управляет и координирует все операции других программ (и действия пользователей) с оборудованием компьютера. Обычно беспокоиться о ядре не нужно, потому что оно является прозрачным для пользователя и выполняет свою работу в фоновом режиме, а раз его "не видно", значит и волноваться о нем не стоит. В UNIX командной оболочкой практически всегда называют только командные оболочки с интерфейсом командной строки (Command-line Interface — CLI), которые внешне вообще мало похожи на программы: все, что вы видите, когда работаете с командной оболочкой, это приглашение на ввод команды и текст, который вы вводите (а также вывод программ, которые вы запускаете). Командная оболочка сама по себе является такой минимальной на вид, что отличить одну командную оболочку от другой бывает очень трудно. В этой главе, однако, мы покажем, насколько важными могут оказаться эти не заметные на первый взгляд отличия между командными оболочками. Выбор командной оболочки для FreeBSD Для FreeBSD доступно множество различных командных оболочек, начиная от оболочек наипростейших моделей и заканчивая оболочками, которые загружаются с определенными функциональными возможностями. Некоторые командные оболочки являются очень строгими в плане синтаксиса, который нужно использовать при вводе команд, и требуют, чтобы пользователи четко следовали определенным правилам, когда вводят команды; другие командные оболочки позволяют повторять и редактировать применявшиеся ранее команды и автоматически расширять командные строки с помощью клавиши <ТаЬ>. В этой главе мы, конечно, рассмотрим не
FreeBSD и командная строка все командные оболочки (подобное вообще вряд ли возможно), а только некоторые наиболее поЪулярные из них. Все описываемые здесь командные оболочки можно установить из коллекции портов (то есть из каталога /usr/ports/shells) или кол* лекции пакетов; подробнее об этом — в главе 16. Командная оболочка Bourne (sh) и POSIX Командная оболочка Bourne, часто называемая просто sh, была одной из первых командных оболочек и достаточно часто используется и сегодня. Исходная версия командной оболочки Bourne была разработана Стивеном Буэном (Steven Bourne), который тогда работал в компании Bell Labs, для операционной системы AT&T UNIX. Позже, в FreeBSD, как и во многих других версиях UNIX, командная оболочка Bourne была заменена усовершенствованной версией, которая получила название "POSIX*. Эта версия предоставляет целый ряд функциональных возможностей, которая исходная версия sh не предлагала, вроде возможности выполнять рудиментарное редактирование командных строк и получать доступ к выполнявшимся ранее командам (а именно к таким, которые выполнялись в режиме редактирования vi и вызывались путем ввода set -о vi). Однако для каждодневного использования возможности sh являются достаточно ограниченными, поэтому многие пользователи наверняка предпочтут перейти на какую-то более функциональную командную оболочку (по умолчанию FreeBSD назначает для всех новых пользователей командную оболочку sh; о том, как можно настроить эту предлагаемую по умолчанию командную оболочку, более подробно будет рассказываться в главе 13). Сила командной оболочки sh заключается в ее гибкости. Принятие вводимых пользователем команд является далеко не единственной ее функцией; однако ее наиболее часто используют в качестве работающего по сценариям командного интерпретатора. Вы можете передать процессу sh файл сценария — список команд (в мире MS-DOS также называемый пакетным файлом (batch file)) — и sh будет запускать этот сценарий и выполнять содержащиеся в нем команды, автоматизируя выполнение даже наиболее сложных операций командной строки. Сценарии командной оболочки могут представлять собой нечто гораздо большее, чем просто списки команд; благодаря управлению потоком выполнения, переменным и обработке на основе анализа ситуаций, сценарии командной оболочки могут превращаться в самые настоящие полнофункциональные языки программирования (подробнее об этом будет рассказываться в главе 10). Хотя очень мало людей пользуется командной оболочкой sh как пользовательским интерфейсом во время своей повседневной работы, она все равно лежит в основе огромного количества сценариев для командной оболочки, которые можно вызывать в виде команд в FreeBSD. Командная оболочка С (csh) Командная оболочка С — это традиционная командная оболочка BSD. Разработ- чики в Berkley видели все ограничения, от которых страдала первоначальная командная оболочка UNIX Bourne, и поэтому в процессе разработки операционной системы BSD создали свою собственную командную оболочку. Командная оболочка С называется так потому, что ее собственный синтаксис программирования очень сильно напоминает язык программирования С. Благодаря своей интерактивной природе командная оболочка С обладает множеством преимуществ по сравнению с командной оболочкой Bourne, среди которых возможность управления заданиями и
Работа с командной оболочкой I Г7Г I Глава 8 I I возможность получения доступа к введенным ранее командам. Также она поддерживает файл сценария выхода из системы, то есть программу, которая выполняется, когда пользователь покидает командную оболочку (у большинства версий командных оболочек Bourne (sh и ее вариантов) упомянутой поддержки нет). Помимо этого, командная оболочка С поддерживает конфигурационный файл, который считывается каждый раз, когда запускается новая подоболочка, если только это не оболочка по умолчанию (исходная командная оболочка Bourne такой возможности не имеет). Командная оболочка С является полной противоположностью командной оболочки Bourne в том, что она идеально подходит для интерактивного пользования, но никак не подходит для программирования. Некоторые программисты настаивают на том, чтобы программы для командной оболочки писались в командной оболочке С, но из-за ее более непонятного и требовательного синтаксиса, эта задача может превратиться в настоящее испытание на выносливость и закончиться разочарованием или вообще не принести никаких результатов; поэтому практически все программы для командной оболочки в FreeBSD написаны на языке программирования sh, а не на несовместимом языке csh. Хотя командная оболочка С прекрасно подходит для интерактивного использования, к тому же всегда была очень популярной, она немного устарела: сегодня доступны и более усовершенствованные версии интерактивных командных оболочек. НА ЗАМЕТКУ | | В современных версиях FreeBSD исходную командную оболочку С (csh) заменила командная оболочка tcsh. На самом деле, командная оболочка С (csh) нередко служит просто ссылкой на командную оболочку tcsh. Подробнее об этой командной оболочке будет рассказываться чуть позже в этой главе. Командная оболочка Korn (ksh или pdksh) Чтобы не отставать от компании Berkeley, компания AT&T в 1986 году выпустила свою командную оболочку — командную оболочку Korn. Эта командная оболочка была разработана Дэвидом Корном (David Korn) и стала ответом компании AT&T на командную оболочку С. Командная оболочка Korn обратно совместима с командной оболочкой Bourne. Как и командная оболочка С, она позволяет управлять заданиями, получать доступ к выполнявшимся ранее командам, назначать командам псевдонимы и создавать конфигурационный файл для подоболочек. Однако на этом возможности командной оболочки Korn не исчерпываются, потому что она также имеет целый ряд полезных опций для программистов вроде возможности расширения за счет новых команд и совместимости синтаксиса со многими другими командными оболочками и командными интерпретаторами. Командная оболочка является очень популярной и поставляется сегодня с очень многими коммерческими версиями UNIX (однако, не с FreeBSD). pdksh — это общедоступная версия командной оболочки Korn. Именно этой версией вы можете пользоваться бесплатно в FreeBSD, установив ее из коллекции портов FreeBSD, о чем более подробно будет рассказываться в главе 16.
I ГГ7 | FreeBSD и командная строка Пользователям, которые знакомы с vi и Emacs, командная оболочка Когп понравится, а вот начинающим пользователям UNIX, скорее всего, больше по душе будет командная оболочка bash (которая описывается далее). Командная оболочка Bourne Again (bash) Командная оболочка Bourne Again — это командная оболочка, совместимая с командной оболочкой Bourne, которая была разработана компанией Free Software Foundation (FSF — фонд свободного программного обеспечения). Командная оболочка bash является командной оболочкой по умолчанию практически во всех дистрибутивах Linux. Как и в командной оболочке Когп, совместимость с оболочкой Bourne в командной оболочке bash означает, что она может использоваться для запуска сценариев sh. В применении она похожа на командную оболочку Когп, но имеет даже еще больше функциональных возможностей, среди которых встроенная справочная система, возможность интуитивного редактирования командных строк и возможность редактирования хронологии команд с помощью клавиш с изображениями стрелок (пользователь может просто нажать клавишу с изображением стрелки вниз или стрелки вверх, чтобы перейти к какой-нибудь выполненной ранее команде, а затем — нажать клавишу с изображением стрелки влево или стрелки вправо и отредактировать командную строку, на которой он сейчас находится), а также чрезвычайно мощные функции работы с хронологией и просто-таки бессчетное количество переменных среды. Единственной реальной проблемой командной оболочки bash является то, что с большинством коммерческих версий UNIX она, как стандартная программа, не поставляется. Из-за этого программы, написанные специально для bash, могут хуже переноситься на другие платформы UNIX, нежели программы, написанные для Bourne. Командная оболочка tcsh Командная оболочка tcsh представляет собой усовершенствованную версию командной оболочки С. (Как в ее названии расшифровывается буква *Ч"? Она расшифровывается как TENEX; TENEX — это операционная система для платформ DEC PDP-10, поведение командной строки которой первоначально и должна была имитировать tcsh.) Она предлагает много новых функциональных возможностей по сравнению с командной оболочкой С, среди которых возможность автоматического завершения имен файлов и возможность редактирования командных строк с помощью интуитивных элементов управления как в bash (то есть при помощи клавиш с изображениями стрелок), tcsh также имеет несколько замечательных функциональных возможностей, которые не поддерживает даже bash, вроде способности проверять вводимые пользователем команды, распознавая среди них потенциально опасные, и затем запрашивать подтверждение их выполнения (например, посредством сообщения наподобие "Are you sure you want to delete ALL files" ("Вы уверены в том, что хотите удалить ВСЕ файлы?")). tsch прекрасно подходит для интерактивного использования: она во многом даже лучше bash. К сожалению, она имеет множество тех же недостатков, что и командная оболочка С, в том, что касается программирования. Однако опять-таки, практически никто не пишет сценарии в стиле csh и поэтому данные недостатки
Работа с командной оболочкой I „1 I Глава 8 I I tcsh почти никак не влияют на степень ее пригодности в роли применяемого для повседневной работы пользовательского интерфейса. Командная оболочка zsh Z Shell, или zsh — это командная оболочка, предназначенная для удовлетворения всех потребностей. По дизайну она похожа на командную оболочку Когп, в ней реализованы все популярные функциональные возможности как оболочки bash, так и оболочки tcsh (из-за чего она, кстати, занимает немало места и испоЛьзует существенные ресурсы памяти), но она также имеет и свои собственные, уникальные функциональные возможности, такие как усовершенствованная универсализация файловых имен (то есть возможность поиска по именам файлов), возможность редактирования командных строк и возможность привязки клавиш, благодаря которым, собственно говоря, ей и отдают предпочтение многие заядлые пользователи UNIX, а особенно те из них, кто привык работать с поддерживающим привязку редактором Emacs. Какую командную оболочку лучше выбрать? Итак, какую же командную оболочку вам тогда следует выбрать? Для изучения материала, излагаемого в этой главе, то, какую оболочку вы выберете, не имеет особого значения: большинство стандартных команд FreeBSD работают одинаково во всех командных оболочках. Отличия между командными оболочками проявляются только при выполнении более сложных задач, таких как изменение переменных командной оболочки, присваивание псевдонимов и написание программ для оболочки. Во время своей повседневной работы вы заметите, что некоторые из функциональных возможностей более совершенных командных оболочек (наподобие возможности повторно вызывать выполнявшиеся ранее команды с помощью клавиш с изображениями стрелок или возможности автоматически завершать имена команд с помощью клавиши <ТаЬ>) просто-таки необходимы вам для нормальной работы и душевного спокойствия. А это означает, что вам нужно будет установить командную оболочку pdksh, bash или tsch (которую рекомендуется использовать в FreeBSD). Если вы не планируете заниматься программированием в командной оболочке, вам прекрасно подойдет оболочка tcsh (которая в FreeBSD является эквивалентом оболочки csh). В противном случае вам лучше выбрать pdksh или bash, поскольку, когда вы приступите к программированию, вам не придется отвыкать от уже выученных команд и изучать новые, то есть вы спокойно сможете применять все выученные для работы в этой командной оболочке команды также и для программирования в ней. В этой главе для демонстрации примеров командных строк в основном будет использоваться командная оболочка bash, дабы облегчить понимание материала, излагаемого в главе 10, которая посвящена программированию в командной оболочке. Смена командной оболочки Командной оболочкой по умолчанию для пользователя root в FreeBSD является csh (на самом деле — tcsh). Однако если вы — не пользователь root, вам по умолчанию может быть назначена какая-нибудь другая командная оболочка. Чтобы узнать, с какой командной оболочкой вы сейчас работаете, введите следующую команду, где \
I TZT I FreeBSD и командная строка I Z7Z I ЧагтьШ f oo — это ваше регистрационное (пользовательское) имя, а # — символ, представляющий собой приглашение на ввод команды: • grep foo /etc/passwd Не волнуйтесь, если вы не знаете, что означает эта команда. Вы будете знать это и многое другое, когда дочитаете эту главу до конца. Эта команда возвращает строку, которая выглядит примерно так: foo:*:1001:1001::Foo Bar:/home/f00:/bin/csh Строка на вашем экране, возможно, будет отличаться от показанной. Пока что вас должно интересовать только последнее поле в ней (которое в данном примере выглядит как /bin/csh). В нем содержится информация об используемой по умолчанию командной оболочке; в данном случае это командная оболочка csh. В результирующей строке, которую получите вы, возможно, будет содержаться одно из следующих значений: • /bin/sh — командная оболочка POSIX Bourne. • /bin/csh — командная оболочка С, которая фактически является жесткой ссылкой, или псевдонимом, на командную оболочку tcsh. Если ваша командная оболочка называется /bin/csh, знайте, что это значит, что на самом деле речь идет о командной оболочке tcsh. • /bin/tcsh — командная оболочка tcsh. • /us r/ local /bin/ ksh — командная оболочка Korn. • /usr/local/bin/bash — командная оболочка bash. Предположим, что вы хотите перейти на другую командную оболочку, например, на Bourne Again Shell, то есть bash. Чтобы установить командную оболочку bash, выберите ее из коллекции пакетов (в категории shells), доступной на прилагаемом к книге DVD-диске, или скомпилируйте ее из портов, следуя инструкциям, приведенным в главе 16. После ее установки выйдите из системы и снова войдите, чтобы активизировать изменения, то есть сделать так, чтобы FreeBSD поняла, что команда bash теперь является рабочей. Чтобы запустить командную оболочку bash, просто введите в командной строке команду bash для начала нового сеанса с использованием оболочки bash. Этот экземпляр bash фактически запустится внутри вашего исходного сеанса csh, то есть когда вы завершите работу с bash, вы снова вернетесь в csh. В главе 9 мы расскажем о том, как можно полностью сменить командную оболочку, то есть сделать так, чтобы при входе в систему сразу запускался сеанс bash, а не csh. ВНИМАНИЕ! В отличие от DOS, Windows и VMS, UNIX и FreeBSD являются чувствительными к регистру, то есть регистр вводимых букв (прописные или строчные) в них имеет значение. Например, имена Grep, grep и greP никак не связаны между собой, если речь идет о FreeBSD. Это является одним из основных источников ошибок, допускаемых новичками. Если при вводе приводимых в этой главе команд вы получите сообщение об ошибке вроде No such file (Файл не существует) или No such directory (Каталог не существует), проверьте, все ли буквы в команде вы ввели в точности в том регистре, в котором было указано.
Работа с командной оболочкой I TZ7 I Глава 8 I I Когда вы запустите новую оболочку, приглашение на ввод команды изменится. Дело в том, что в разных оболочках эти приглашения по умолчанию выглядят по-разному Если вы вошли в систему через учетную запись пользователя root (с помощью csh) и ваш компьютер называется simba, когда вы запустите bash, вы увидите, что приглашение на ввод команды изменится следующим образом: simba# bash root@simba# Приглашение на ввод команды # традиционно означает, что вы используете учетную запись пользователя root (и тем самым напоминает вам о ваших потенциально опасных возможностях). Если вы вошли в систему через учетную запись обычного пользователя, поскольку csh использует символ %, a bash — символ $, эти же две строки будут выглядеть так: %bash btman@simba$ Обратите внимание на то, что в csh по умолчанию в приглашении отображается имя хоста данного компьютера и больше ничего, если вы являетесь пользователем root, и не отображается вообще никакая информация, если вы являетесь обычным пользователем. В bash в приглашении по умолчанию отображается как ваше имя пользователя, так и имя хоста компьютера, а также с помощью заключительного символа указывается, являетесь вы пользователем root или нет. Это поведение запросто можно изменить; о том, как это сделать, будет рассказываться в главе 9. Получение справки в командной оболочке Команды, которые можно вводить в оболочке, практически всегда представляют собой имена находящихся где-то в системе исполняемых программ. Некоторые команды являются внутренними и специфическими для каждой конкретной оболочки (такие как команда alias), но большинство из них обязательно соответствует какой-то установленной программе. Секрет эффективного использования командной оболочки заключается в знании того, что делает каждая из этих программ. Вот где может пригодиться встроенное "руководство". Получить доступ к этому руководству можно с помощью команды man, а отыскать в нем информацию о любой интересующей команде или программе — с помощью, например, такой команды: # man Is Введя эту конкретную строку, вы сможете получить полный, приспособленный для удобного просмотра перечень документации по команде Is ("list" — "список") и всех доступных для использования с ней опций. Применяя этот же подход, вы сможете получить информацию о любой установленной программе и необходимом для работы с ней синтаксисе, независимо от того, поставлялась она сразу с FreeBSD или же была установлена позже. Для просмотра содержимого страниц руководства вы можете пользоваться клавишей пробела, клавишами с изображением стрелки и клавишами <Page Up> и <Page Down>. Чтобы отыскать какую-нибудь определенную строку, вы можете нажать клавишу с изображением символа косой черты (/) и затем ввести нужный текст. Чтобы завершить работу с руководством, вы должны просто нажать клавишу <Q>.
274 FreeBSD и командная строка Часть III Поиск страниц в руководстве Иногда вы можете знать, что хотите сделать, но быть не уверенными в имени команды, которая нужна для этого. В таком случае вы можете использовать вместе с командой man опцию -к, чтобы указать общую, интересующую вас концепцию и получить список возможных команд, которые могут помочь ее выполнить. Иногда вам придется проявить достаточную изобретательность для того, чтобы команда man -k вернула нужные результаты. Например, предположим, что вы хотите получить информацию о командах, позволяющих выполнять поиск в текстовых файлах определенных слов или словосочетаний либо показывающих все места в файле, где встречается данное слово или словосочетание. Вы наверняка предположите, что в именах и описаниях таких команд должно присутствовать слово "search" ("поиск"). Поэтому вы сначала можете попробовать ввести команду man -k search, как показано в листинге 8.1. Эта команда вернет список всех соответствующих записей в базе данных what is, словарь программ и их описания. (Вывод этой команды в вашей системе может выглядеть несколько иначе, что зависит от того, какое программное обеспечение у вас установлено.) Листинг 8.1. Использование команды man -k 1 # пап -к search apropos (1), whatis(l) - search the whatis database bios(9), bios_sigsearch(9), bios32_SDlookup(9), bios32(9) - Interact with PC BIOS bsearch(3) - binary search of a sorted table devclass_find(9) - search for a devclass device_find_child(9) - search for a child of a device lkbib(l) - search bibliographic databases lookbib(l) - search bibliographic databases lsearch(3), lfind(3) - linear searching routines manpath(l) - determine user's search path for man pages res_query(3), res_search(3), resjnkquery(3), res_send(3), res_init(3), dn_comp(3), dn_expand(3) - resolver routines tsearch(3), tfind(3), tdelete(3), twalk(3) - manipulate binary search trees Search::Dict(3), look(3) - search for key in dictionary file # шал -к аеатсЬ apropos (1), whatis (1) - поиск в базе данных whatis bios (9) , bios_sigsearch (9), bios32_SDlookup (9), bios32 (9) - Взаимодействие с BIOS bsearch (3) - бинарный поиск в сортированной таблице devclass_find(9) - поиск класса устройства device_find_child(9) - поиск дочернего класса устройства lkbib(l) - поиск по библиографическим базам данных lookbib(l) - поиск по библиографическим базам данных 1 search (3),lfind(3) - линейные процедуры поиска manpath(l) - определение пользовательского пути поиска страниц руководства res_query (3), res^search (3), res^mkquery (3), res^send (3), res^init (3), dn_comp (3) / dn_expand (3) - процедуры paспознавателя tsearch (3), tfind(3), tdelete(3), twalk (3) - операции с деревьями бинарного поиска Search::Diet (3), look(3) - поиск ключа в файле словаря
Работа с командной оболочкой I TZZ I = гН Z70 Глава 8 I . I Возможно, это не совсем то, что вам было нужно. Данные результаты, похоже, отображают поисковые процедуры, которые больше подходят для программистов, работающих с языком С. Поэтому дальше вы можете попробовать поискать ключевое слово pattern (образец), как показано в листинге 8.2, потому что вам нужна команда, позволяющая отыскивать в текстовых файлах определенные слова и словосочетания, то есть образцы. Листинг 8.2. Еще одна попытка найти нужную информацию с помощью команды man -к # man -к pattern gawk(l) - pattern scanning and processing language glob(3), globfreep) - generate pathnames matching a pattern grep(l), egrep(l), fgrep(l), zgrep(l) - print lines matching a pattern lptest(l) - generate lineprinter ripple pattern menu_pattern(3) - get and set a menu's pattern buffer # man -k pattern gawk(l) - сканирование образца и обработка языка glob (3), glob free (3) - генерация имен путей, соответствующих образцу grep(l), egrep(l), fgrep(l), zgrep(l) - печать строк, соответствующих образцу Iptest(l) - генерация пульсирующего образца для построчного принтера menujpattern (3) - извлечение и установка буфера образцов меню Эти результаты выглядят более подходящими: особенно ряд команд со словом grep. Они похожи на средства для поиска образцов в файлах, которые вы как раз и искали. Теперь вы можете ввести man grep, чтобы прочитать страницу руководства, посвященную команде grep, и убедиться, что эта команда действительно делает то, что вам нужно. Краткие описания команд Возможна и другая ситуация: вы можете знать имя команды, но не знать в точности, что именно она делает (например, если вы "рыскаете" по каталогу /usr/bin или /usr/games). В этом случае вы можете использовать вместе с командной man опцию -f, чтобы получить краткое (умещающееся в одной строке) описание команды. Например, предположим, что вы нашли в каталоге /usr/games команду рот и хотите знать, что она делает. # man -f pom pom(6) - display the phase of the moon # man -t pom pom (6) - отображение фазы луны Строка (6) в конце имени команды обозначает раздел руководства, из которого было взято описание для этой команды. Разделы руководства Онлайновые руководства состоят из девяти разделов, которые описываются в табл. 8.1.
276 FreeBSD и командная строка Часть III Таблица 8.1. Разделы руководства Раздел Описание 1: User Commands (Пользовательские команды) 2: System Calls (Системные вызовы) 3: Subroutines (Подпрограммы) 4: Devices (Устройства) 5: File Formats (Форматы файлов) 6: Games (Игры) 7: Miscellaneous (Разное) 8: System Administration (Администрирование системы) 9: Kernel Interfaces (Интерфейсы ядра) В этом разделе содержится информация о пользовательских командах, таких как is, rm, ср и grep. Именно этим разделом вы, вероятно, будете пользоваться наиболее часто во время изучения и работы с FreeBSD. В этом разделе содержится информация о различных доступных для FreeBSD API-интерфейсах. Этот раздел будет представлять интерес, прежде всего, для тех, кто программирует на языке С. В этом разделе содержится информация о подпрограммах, также называемых библиотечными функциями. Опять-таки, этот раздел будет представлять интерес, прежде всего, для тех, кто программирует на языке С. В этом разделе содержится другая полезная информация для С-программистов, такая как информация о способах взаимодействия с драйверами устройств в FreeBSD. В этом разделе содержится информация о форматах различных конфигурационных файлов системы, таких как файлы crontab, отвечающие за выполнение запланированных заданий, и сценарии гс, отвечающие за процедуру запуска системы. Этот раздел, естественно, является самым важным. В нем содержатся указания по поводу того, как пользоваться различными играми и другими средствами развлекательного типа, которые поставляются с FreeBSD. Если вам не удается отыскать интересующую вас тему в других разделах, скорее всего, вам удастся найти ее здесь. В этом разделе содержится информация о командах, касающихся администрирования системы, таких как команда f sck, которая позволяет выполнять проверку файловых систем. В этом разделе содержатся дополнительные сведения, которые могут оказаться полезными для программистов, такие как сведения о технологиях взаимодействия с ядром на языке С. Некоторые команды имеют несколько ссылок. Например, ссылка crontab встречается как в разделе 1, где описывается сама команда crontab, так и в разделе 5, где описывается формат файла crontab. Если, используя команду man, номер раздела в руководстве вы не укажете, вы попадете в тот раздел, в котором встречается первая соответствующая ссылка: в случае с командной man crontab это означает, что вы попадете в раздел 1, где описывается синтаксис команды crontab. Если вам нужна информация о форматах файлов из раздела 5, вам следует использовать команду man 5 crontab, а не man crontab.
Работа с командной оболочкой I TZZ I Глава 8 I I Основные операции для работы с файлами в командной оболочке Одной из главных возможностей при использовании любой операционной системы является возможность работать с файлами: копировать, перемещать, переименовывать, создавать и удалять их. В современных графических операционных системах реализованы сложные наглядные технологии для выполнения этих задач, подобные перетаскиванию значков файлов между папками. Однако в командной строке такие операции с файлами требуют выдачи определенных команд. Средства, доступные в FreeBSD для работы с файлами, по большей части похожи на аналогичные средства в MS-DOS. Если вам доводилось раньше работать с MS-DOS, вы легко усвоите излагаемый далее в этой главе материал. Если нет, возможно, вам придется прибегнуть к помощи дополнительных источников. Как FreeBSD хранит файлы Как и многие другие современные операционные системы, FreeBSD хранит файлы в виде иерархической, древовидной структуры. Файловую систему FreeBSD можно представить себе как шкаф картотеки, а каждый том на жестком диске — как один ящик в этом шкафу. Структурная иерархия FreeBSD состоит из множества высокоуровневых каталогов, или точек монтирования, за которыми закрепляются тома дисков, а внутри каждого из томов находится любое количество каталогов (или, как их еще часто называют,, "папок"). Каталоги могут содержать файлы, а также другие каталоги. Эти каталоги и файлы аналогичны папкам и документам в ящике шкафа картотеки. В Windows и Macintosh используются файловые системы точно такого же типа. Единственным отличием является то, что в Windows и Mac OS X, как и в настольной среде GNOME или KDE в FreeBSD, пользователь видит графическое представление папок и файлов в окне графического диспетчера файлов. В командной строке FreeBSD можно видеть только текстовое представление этих элементов. Когда пользователь входит в FreeBSD через командную строку командной оболочки, он попадает в свой домашний каталог, который находится на несколько уровней ниже каталога самого высокого уровня на системном диске. В Mac OS X и современных версиях Windows при переходе в режим командной строки реализуется точно такое же поведение; обе эти системы управляют множеством пользователей в стиле системы UNBC, размещая домашние каталоги всех пользователей внутри какого-нибудь специального каталога на системном диске. О структурах каталогов более подробно будет рассказываться в главе 12. Пока что же давайте разберемся с тем, что собой представляет домашний каталог пользователя. У каждого пользователя в системе UNK (за определенным исключением) имеется свой собственный домашний каталог. Ваш домашний каталог — это как ваш ящик в шкафу картотеки или ваш собственный "виртуальный жесткий диск". Здесь вы можете создавать, удалять, копировать и перемещать файлы, а также создавать и удалять каталоги. Ваш домашний каталог — это ваше личное пространство в FreeBSD-системе, получать доступ к которому не может больше никакой другой пользователь (кроме разве что пользователя root), если только вы специально не сконфигурируете какие-нибудь его части соответствующим образом. Способность работать с файлами и
ZZZ 1 FreeBSD и командная строка 278 —~ тт. I I Часть III каталогами в своем домашнем каталоге является очень важным навыком. В следующих нескольких разделах будут рассматриваться различные доступные для выполнения этих задач команды. Просмотр содержимого каталогов Чтобы просмотреть содержимое каталога, в котором вы находитесь, используйте команду Is. Вызываемая без опций, команда Is выдает приблизительно такой вывод: * 18 Mail letter-to-boss program proposal-draft fbu mail program, с Сам по себе этот вывод является не особенно полезным: он не говорит ничего ни о содержимом файлов, ни даже о том, с чем мы все-таки имеем дело — с файлами или каталогами. Is поддерживает несколько опций, которые позволяют изменять ее поведение по умолчанию. Наиболее полезной из них является опция -F, которая дает возможность получать больше информации о типе каждого файла в списке. Например: # 18 -F Mail/ letter-to-boss program* proposal-draft fbu@ mail/ program.с Теперь вам известно немного больше о записях в этом списке. А вот что означают символы, следующие после них: Символ Описание , / Этот элемент является подкаталогом текущего каталога. * Этот элемент является исполняемым двоичным файлом или сценарием. @ Этот элемент является ссылкой на другое место на жестком диске. Этот символ работает аналогично ярлыкам в Windows или псевдонимам в Mac OS X. Обратите внимание на исполняемый файл program. В отличие от Windows, в FreeBSD исполняемые файлы не должны обязательно иметь расширение • com, . ехе или bat. Информация о том, является файл исполняемым или нет, содержится в "полномочиях", которые хранятся вместе с файлом в виде атрибутов. Вы практически никогда не увидите в FreeBSD исполняемый файл с расширением . ехе или . com: его указание не является обязательным. В этом списке перечислены не все символы, которые могут появиться при использовании команды Is -F. Чтобы просмотреть полный перечень возможных символов, введите man Is и отыщите абзац, посвященный опции -F. Современные версии команды Is также поддерживают опцию -G, которая указывает Is использовать разные цвета для выделения разных типов файлов. Однако не все терминалы могут отображать цвета, а в терминальном окне xterm цвета отображаются, только если его сконфигурировать как цветной xterm. (Это можно сделать, присвоив переменной TERM значение xterm-color; о присваивании значений переменным более подробно будет рассказываться в главе 9.) Тем не менее, консольный терминал по умолчанию может отображать цвета.
' Работа с командной оболочкой I TZT I Глава 8 I 1 По умолчанию Is не отображает скрытые файлы, которые скрываются на основании их начинающихся с точки имен (и потому также часто называются файлами с точкой— dot files). Чтобы отобразить скрытые файлы, используйте команду Is с опцией -а: • la -а .forward .mailrc ..profile Mail .hushlogin .mysql_history .project fbu .addressbook .login .rhosts .login.conf mail .muttrc .sh-history .cshrc .mail_aliases Большинство из этих скрытых файлов являются конфигурационными файлами, в которых хранится информация различного рода типа профильной информации о настройках командной оболочки, адресной книги для почтовой программы и спи* ска вводившихся команд для функций работы с хронологией командной оболочки. Существуют две основных причины, по которым эти файлы лучше оставлять скрытыми: • Так они не загромождают каталог, то есть не мешают выполнять обычные операции. • В результате становится намного труднее случайно удалить важные конфигурационные файлы, потому что файлы с точками не учитываются при поиске файлов посредством команд с групповыми символами. Если вы хотите получить более подробную информацию о файлах и каталогах в списке, используйте опцию -1, как показано в листинге 8.3. Листинг 8.3. Пример вывода Is -1 # Is -1 total 3 drwx 2 btman btman 512 Feb 15 16:04 Mail lrwxr-xr-x 1 btman btman 15 Mar 20 06:55 fbu -> /home/btman/documents/books/fbsd -rw-r~r~ 1 btman btman 782 Mar 15 09:21 letter-to-boss drwx 2 btman btman 512 Mar 24 15:12 mail -rwx 1 btman btman 15221Feb 21 18:11 program -rw-r—r— 1 btman btman 1571 Feb 21 17:51 program.с -rw-r—r— 1 btman btman 2521 Feb 25 18:51 proposal-draft Каждая запись включает шесть разных полей, которые отображают разную информацию и описываются ниже, в порядке слева направо: • Полномочия и другие атрибуты файла. В первом поле в листинге Is -1 отображается информация о полномочиях и атрибутах файла. Об этом поле более подробно будет рассказываться в главе 13. Пока что же просто знайте, что информация в нем показывает, можно ли данный файл читать, изменять и выполнять как команду. • Количество ссылок. В этом поле отображается число, представляющее количество существующих в данном файле ссылок. Каждый обычный файл имеет, по крайней мере, одну ссылку (на самого себя), а каждый каталог — по крайне ' мере две ссылки: одну на самого себя и одну на свой родительский каталог.
280 FreeBSD и командная строка Часть III • Пользовательское имя владельца данного файла и название группы, к которой относится владелец. Эти два поля более подробно будут описываться в главе 13. Пока что же просто знайте, что содержащаяся в них информация показывает, кто является владельцем данного файла и какой группе принадлежит данный файл. • Размер файла. В этом поле отображается размер файла в байтах. • Время последнего изменения. В этом поле отображается дата и время последнего изменения файла. • Имя файла. В этом поле отображается имя файла. Файлы, имена которых выглядят так, как показано ниже, являются ссылками: fbu -> /home/btman/documents/books/fbu В данном случае запись fbu фактически является ссылкой на /home/btman/ documents/books /fbu. Эту ссылку можно использовать в любое время, когда потребуется сослаться на данный каталог, вместо того, чтобы вводить полный путь к нему. Команда Is может принимать несколько разных опций одновременно. Например, вы можете использовать с ней одновременно опцию -1 (подробное описание), опцию -t (сортировка по времени последнего изменения) и опцию -г (сортировка в обратном порядке) и получить список файлов в каталоге, отсортированный так, что вы сможете быстро увидеть, какие файлы изменялись последними: • Is -lrt /var/spool/mqueue/ total 180 -rw 1 root daemon 131913 Apr 19 2005 dfg3J6hRq61454 -rw 1 root daemon 4436 Sep 25 18:16 d±g8QlGmF96201 -rw 1 root daemon 2922 Sep 27 08:05 dfg8R*-56F874 64 -rw 1 root daemon 283 Sep 27 20:54 dfg8S3s6p770o? -rw 1 root daemon 336 Sep 28 07:09 dfg8SE98Z239^J -rw 1 root daemon 320 Sep 28 11:59 dfg8SIxUv57877 -rw 1 root daemon 344 Sep 29 07:37 dfg8TEbE365707 -rw 1 root daemon 360 Sep 29 10:22 dfg8THMim85609 -rw 1 root daemon 306 Sep 29 11:00 dfg8TI07g90919 -rw 1 root daemon 246 Sep 29 13:34 dfg8TKYvp!4024 Навигация по файловой системе Команда cd служит для перехода из одного каталога в файловой системе в другой. Имена каталогов назначения могут указываться несколькими способами, как показано в табл. 8.2. СОВЕТ Может случиться так, что вы забудете, в каком каталоге находитесь. Команда pwd (pwd расшифровывается как "present working directory" ("текущий рабочий каталог")) отображает на экране имя текущего каталога. Пользуйтесь ею всегда, когда захотите вспомнить, в каком каталоге находитесь. (Да, вы еще можете настроить приглашение командной оболочки так, чтобы в нем всегда отображалось имя текущего каталога. О том, как именно это можно сделать, будет рассказываться в главе 9.)
Работа с командной оболочкой , ^fl Глава 8 Таблица 8.2. Использование команды cd Команда Результат cd Позволяет сразу перейти в домашний каталог. cd / Каталоги, имена которых начинаются с символа /, называются абсолютными путями. Они всегда берут свое начало в корневом каталоге системы (который является каталогом самого верхнего уровня). Символ /, используемый сам по себе, позволяет перейти прямо в корневой каталог. cd /usr/local/bin Позволяет перейти в каталог bin, который находится в каталоге local, который, в свою очередь, находится в каталоге us г, который находится в корневом (самом верхнем) каталоге. cd bin или cd . /bin Позволяет перейти в каталог bin, находящийся в текущем каталоге (если таковой имеется). Если такого каталога не существует, cd возвращает ошибку. Каталоги и файлы, имена которых начинаются не с символа /, имеют отношение к текущему каталогу, в котором вы сейчас находитесь. Вводить . / не обязательно, но будет неплохо, если вы все-таки приучите себя это делать. cd .. или cd.. / .. обозначает родительский каталог того каталога, в котором вы сейчас находитесь. Эта команда позволяет перейти в каталог, находящийся на один уровень выше того каталога, в котором вы сейчас находитесь. Добавлять символ / в конце этой команды не обязательно. cd .. /bin Позволяет перейти в каталог bin, если тот расположен в родительском каталоге того каталога, в котором вы находитесь на текущий момент. cd .. /.. /bin Позволяет перейти в каталог bin, расположенный на два уровня выше того каталога, в котором вы находитесь на текущий момент. Копирование файлов и каталогов Чтобы скопировать файл (файлы) из одного места в другое, используйте команду ср. В качестве аргументов она принимает список файлов, которые необходимо скопировать, и пункт назначения, то есть название места, куда эти файлы следует скопировать. Если указывается несколько файлов для копирования или используется групповой символ, пунктом назначения должен быть каталог. В табл. 8.3 приводится несколько примеров применения команды ср. ВНИМАНИЕ! По умолчанию команда ср просто перезаписывает содержимое существующего файла, если файл случайно копируется в уже существующий файл. Например, команда ср f ilel f ile2 заменит содержимое файла f iie2 содержимым файла f ilel, если файл с именем f 11е2 уже существует. Вы можете сделать так, чтобы FreeBSD спрашивала вас прежде, чем перезаписывать существующие файлы: для этого используйте с командой ср опцию -1 ("interactive" — интерактивный режим). Если вы хотите рекурсивно скопировать какой-нибудь каталог и все его содержимое, включая все хранящиеся в нем подкаталоги, в другое место, используйте вместе с командной ср опцию -R.
282 FreeBSD и командная строка Часть III Таблица 8.3. Использование команды ср Команда Результат ср filel file2 ср filel /archive/ ср filel mystuff/newfile ср filel file 2 /archive/ Копирует существующий файл с именем filel в новый файл с именем f iie2. Копирует файл filel в каталог archive, который является подкаталогом корневого каталога. (Заключительный символ косой черты (/) является необязательным, но будет неплохо, если вы приучите себя его добавлять: в этом случае, если каталог archive не существует, файл не будет копироваться в новый файл с именем archive, вместо этого будет возвращаться сообщение об ошибке.) Копирует файл filel в каталог mystuff, находящийся в текущем каталоге. Если newfile — это имя существующего подкаталога в каталоге mystuff, файл filel будет скопирован в подкаталог newfile. Если newfile не является подкаталогом, файл filel будет скопирован в подкаталог mystuff и получит имя newfile. Копирует файл filel и file2 в каталог archive, находящийся в корневом каталоге. Например: # ср -R dirl dir2 Выполнение этой команды приведет к тому, что все содержимое каталога dirl будет скопировано в новый каталог под названием dir2. Если каталог dir2 уже существует, внутри него будет создан новый каталог с именем dirl и все содержимое будет скопировано туда. Если в каталоге dir2 уже имеется каталог с именем dirl, содержимое текущего каталога dirl будет просто добавлено в каталог dirl, расположенный внутри каталога dir2. Все файлы в каталоге, имеющие такие же имена, перезаписываются, поэтому будьте осторожны, используя опцию -R (или используйте ее вместе с опцией -i, чтобы получать предупреждение о предстоящей перезаписи файлов). Также обратите внимание на то, что скопированные файлы будут иметь те же полномочия, что и оригиналы, если вы являетесь их владельцем. Команда ср -R игнорирует umask, или полномочия по умолчанию, которые используются для создания новых файлов. Для гарантии того, что все полномочия сохранятся, используйте эпцию -р (ср -Rp). ВНИМАНИЕ! Следите за тем, чтобы случайно не вставлять специальные символы (такие как символ пробела, \ ; и тому подобные) при вводе команд в оболочке. Например: # ср -R /* /old Эта команда рекурсивно копирует все содержимое каталога root в подкаталог old, который тоже находится внутри каталога root. Конечно, это также означает, что содержимое самого подкаталога old копируется в отдельный подкаталог внутри него, который тоже называется old. В результате получается цикл, бесконечно копирующий содержимое подкаталога old. На скоростном жестком диске это может привести к довольно быстрому заполнению всего диска.
Работа с командной оболочкой Глава 8 283 Перемещение и переименование файлов и каталогов Перемещение и переименование элементов в FreeBSD выполняется так же, как и в UNIX: для этого используется команда mv (mv — это сокращение от "move" ("переместить")). В табл. 8.4 приведено несколько примеров использования этой команды. Таблица 8.4. Использование команды mv Команда Результат mv f ilel f ile2 Переименовывает файл f ilel в файл f ile2. mv /dirl /dir2 Переименовывает каталог dirl в каталог dir2. mv f ilel /dir2/ Перемещает файл f ilel в каталог dir2, который расположен в корневом каталоге. mv filei /dir2/file2 Файл filel перемещается в каталог /dir2 и переименовывается в файл f ile2. Удаление файлов и каталогов Для удаления файлов служит команда rm (rm расшифровывается как "remove" ("удалить")). Без опций rm удаляет все перечисленные в ее командной строке файлы, но не каталоги. Если вы хотите удалить каталог и все, что в нем находится, используйте вместе с rm опцию -R. В табл. 8.5 приводится несколько примеров использования команды rm. Таблица 8.5. Использование команды rm Команда Результат rm filel Удаляет файл filel. rm filel file2 Удаляет файл filel и file2. rm -r dirl Удаляет каталог dirl и все, что в нем находится. В табл. 8.6 перечислены некоторые (но не все) другие опции, поддерживаемые командой rm. Таблица 8.6. Опции, которые можно использовать с командой rm Опция Результат -f Позволяет rm выполнить удаление, не запрашивая подтверждения, даже если файл помечен как файл только для чтения. Используйте эту опцию с осторожностью. -i Запрашивает подтверждение перед удалением каждого файла. Эту опцию удобно применять, когда rm используется с групповыми символами (подробнее об этом — чуть позже) или с опцией -R. -Р Перед удалением трижды перезаписывает файлы случайными образцами данных. Эту опцию удобно использовать для удаления уязвимых файлов, потому что она снижает вероятность их восстановления с помощью опции -w. -w Пытается отменить удаление файла, который был до этого удален с помощью команды rm. Эта опция работает только при определенных обстоятельствах, поэтому на нее не следует особо рассчитывать.
1 ГГТ I FreeBSD и командная строка I 84 I Часть III Создание и удаление каталогов Команда mkdir служит для создания каталога. Если вы не укажете путь в командной строке, mkdir решит, что каталог должен быть создан как подкаталог текущего каталога. Например, введите mkdir workdocs и в том каталоге, в котором вы сейчас находитесь, будет создан новый каталог с именем workdocs. Чтобы создать сразу целый ряд каталогов, используйте опцию -р; например, если вы введете mkdir -p workdocs /chapters /chapterl, будет создан не только каталог chapterl, но также и каталоги chapters и workdocs, если они еще не существуют. Для удаления каталогов служит команда rmdir. Эта команда удалит каталог только в том случае, если в нем ничего нет, то есть если он пуст. Если вы используете эту команду вместе с опцией -р, она удалит указанный каталог и все содержащиеся в нем подкаталоги, опять-таки при условии, что они пусты. Если вам нужно удалить каталоги, в которых имеются файлы, тогда используйте не эту команду, а команду rm -R. Команда touch Команда touch служит в основном для двух целей: для создания пустого файла и для изменения времени последнего доступа или последнего изменения существующего файла. Ее базовый формат выглядит следующим образом: touch filename где filename — это имя файла, который вы хотите создать или изменить. Команда touch поддерживает несколько опций, которые позволяют указывать, как именно должно быть изменено значение времени последнего доступа или изме нения файла. Подробное описание этих опции вы сможете найти в руководстве, воспользовавшись командной man touch. Создание ссылок Как уже упоминалось ранее, вы можете создавать файлы или каталоги, которые будут служить ссылками, указывающими на другие места в файловой системе. Это может оказаться очень удобным и избавить вас от необходимости вводить длинные имена путей или проходить несколько уровней папок при работе с графическим пользовательским интерфейсом. Ссылки в принципе похожи на ярлыки, которые применяются в Windows. Однако между ними имеется несколько важных отличий, о которых более подробно будет рассказываться в следующих разделах. Существует два вида ссылок: жесткие и мягкие. Жесткие ссылки Жесткая ссылка — это элемент каталога, который указывает на тот же самый внутренний узел (физическое место на жестком диске) как на другой файл. Фактически существует только один файл, два или более элемента каталога указывают на одни и те же физические данные на жестком диске. По умолчанию команда In (In расшифровывается как "link" ("ссылка")) создает жесткие ссылки. Например: # In /home/btman/documents/books/fbsd/filel.txt ./file.txt
Работа с командной оболочкой Эта команда создает в текущем каталоге запись filei .txt, которая указывает на то же место на жестком диске, что и запись /home/btman/documents/books/fbsd/ fi lei .txt. Теперь можно получать доступ к одному и тому же файлу, используя любую из этих записей (при наличии такой ссылки можно было бы войти в систему и ввести не vi documents /books/ fbsd/ f i lei. txt, а просто vi f ilel. txt, чтобы отредактировать этот файл). Если сейчас применить к этой ссылке команду Is -1, ее вывод будет выглядеть примерно так: -rw 2 btman users 26896 Mar 25 19:18 file.txt Она выглядит так же, как и любой другой простой старый файл, не так ли? А все потому, что она действительно является простым обычным файлом для всех практических целей. Единственной визуальной подсказкой, позволяющей понять, что это — ссылка, является следующее после строки полномочий число 2. Это число показывает, что на данный внутренний узел (физическое место) на жестком диске указывают целых две записи в каталоге. Любые изменения, которые будут внесены в этот файл или соответствующую ему запись в каталоге, проявятся во всех остальных записях, которые указывают на это же место. Например, если внести изменения в полномочия в этой записи, эти изменения также появятся и в исходной записи в каталоге /home/btman/documents/books/fbsd/filel .txt. Время изменения файла здесь соответствует тому, которое указано в исходной записи каталога. Размер файла здесь также соответствует размеру, указанному в исходной записи каталога. Если удалить исходную запись из каталога /home/btman/documents/books/fbsd/ filel .txt, эта запись будет удалена, а число, отражающее количество имеющихся ссылок, уменьшится на один. Однако файл все равно будет существовать, потому что останется еще одна ссылка, указывающая на это же место на жестком диске (та, которую создали вы). Файл не будет удален до тех пор, пока не будут удалены все его жесткие ссылки и пока число, отражающее количество имеющихся ссылок, не уменьшится до нуля. Жесткие ссылки имеют два важных ограничения: • Они не могут использоваться для создания ссылок на каталоги. • Они не могут пересекать границы файловой системы (например, нельзя создать ссылку в каталоге /usг, указывающую на какой-нибудь элемент в каталоге /var). При необходимости создать ссылку на каталог или пересечь границу файловой системы вам придется использовать мягкую ссылку. Мягкие ссылки Мягкие ссылки (также называемые символическими ссылками) с точки зрения пользователя похожи на ярлыки в Windows и псевдонимы в Mac OS X. В отличие от жесткой ссылки, символическая ссылка представляет собой отдельный файл, у которого имеется свой собственный внутренний узел (физическое пространство) на жестком диске. Символическая ссылка — это просто файл, в котором содержится указатель на другой файл. Чтобы создать символическую ссылку, используйте вместе с командной In опцию -s. Например: • In -s /home/btman/documents/books/fbsd/filel.txt file.txt Если вы примените к этой ссылке команду Is -1, она станет выглядеть так:
286 FreeBSD и командная строка Часть III lrwxr-xr-x 1 btman users 31 Mar 25 19:56 file.txt -> ^/home/btman/documents/books/fbsd/filel.txt Обратите внимание на отличия между этой версией и жесткой ссылкой. • В полномочиях не перечислены полномочия целевого файла, на который указывает эта ссылка. Кроме того, вносить изменения в атрибуты символической ссылки (такие как полномочия, имя владельца или название группы) нельзя. Это можно делать, только работая с целевым файлом. • На месте числа, отражающего количество существующих ссылок, указана цифра 1, а не 2. Дело в том, что символическая ссылка, по сути, представляет собой файл, который указывает на другой файл; это не просто запись в каталоге, которая указывает на какое-то место на жестком диске (как этот делает жесткая ссылка). • Размер файла не тот, какой можно было ожидать. Размер, указанный здесь - это размер файла, содержащего ссылку, а не целевого файла, на который эта ссылка указывает. • Время изменения файла тоже не то. Здесь отображается время, когда в последний раз изменялась эта ссылка, а не когда изменялся целевой файл. • Имя файла (после символа ->) — это имя файла, на который указывает данный файл. Также, в отличие от жесткой ссылки, при удалении исходного файла, на который указывает символическая ссылка, удаляются реальные блоки данных файла, и ссылка становится просто бесполезным элементом, то есть она остается, но перестает работать. Однако если ссылка удаляется с помощью команды rm, целевой файл остается нетронутым. СОВЕТ Если вы пытаетесь получить доступ к файлу и постоянно получаете сообщение об ошибке вроде No such file or directory (Такой файл или каталог не существует), но вывод команды is четко показывает, что такой файл там есть, скорее всего, это означает, что вы пытаетесь воспользоваться символической ссылкой, которая больше не работает, то есть что целевого (или родительского) файла, на который указывает эта ссылка, больше не существует. Используйте вместе с командной is опцию -1 и проверьте, не является ли файл, к которому вы пытаетесь получить доступ, символической ссылкой. Если это так, проверьте, существует ли на самом деле файл, на который она указывает. Обратите внимание на то, что удаление и даже просто перемещение файла может привести к тому, что все его символические ссылки станут нерабочими. Выбор того, ссылки какого типа использовать — это дело не только вкуса. Делая такой выбор, обязательно следует учитывать ситуацию. Например, если вам необходимо указать на файл, расположенный в той же файловой системе что и та, в которой вы сейчас находитесь, вам лучше использовать жесткие ссылки, потому что они предоставляют информацию о фактических файлах и не становятся нерабочими, если исходные файле удаляются или перемещаются. Однако если вам необходимо создать ссылку на каталог или файл, который расположен в другой файловой системе, вы должны использовать символические ссылки. Символические ссылки намного легче обнаружить с помощью команды Is и они, как правило, являются более разнообразными и понятными, нежели жесткие ссылки.
Работа с командной оболочкой Глава 8 НА ЗАМЕТКУ Жесткие ссылки также имеют одно преимущество по сравнению с символическими: они не занимают внутренний узел (то есть не занимают никакого физического пространства). Это может показаться не столь уж важным, однако на жестком диске доступно строго определенное количество внутренних узлов, и они вполне могут исчерпаться, если вы будете создавать множество маленьких файлов на диске, даже если у вас было много свободного дискового пространства. Когда индексные дескрипторы закончатся, вы больше не сможете создавать никаких файлов до тех пор, пока не удалите какие-то уже существующие файлы и тем самым не освободите часть индексных дескрипторов. Универсальные опции Многие (хотя и не все) команды для работы с файлами, доступные в FreeBSD, поддерживают опции, перечисленные в табл. 8.7. Однако прежде чем использовать эти опции, обязательно по руководству проверьте, правильный ли синтаксис вы используете: в некоторых командах хорошо известные опции могут применяться для совершенно неожиданных целей! Таблица 8.7. Универсальные опции, подходящие для большинства используемых в оболочке команд Опция Результат _i Работает в интерактивном режиме и запрашивает подтверждение перед выполнением той или иной операции с каждым файлом, если эта операция может нанести вред существующему файлу. -v Позволяет команде описывать выполняемые ею действия. Другими словами, с этой опцией команда будет выводить на экране пояснительные сообщения для каждой выполняемой ею операции. ~Ч Запрещает команде описывать выполняемые ею действия (то есть выполняет функцию, противоположную той, которую активизирует опция -v). Другими словами, с этой опцией команда не будет выводить никаких сообщений о состоянии во время выполнения. ~f Позволяет выполнить операцию без подтверждения, даже при отсутствии у файла полномочий на выполнение подобных операций (например, вы могли бы использовать эту опцию для удаления файла, не спрашивая о том, является ли он файлом с доступом только для чтения, при условии наличия у вас прав на выполнение записи в каталоге, в котором расположен этот файл). ВНИМАНИЕ! Как вы, наверное, заметили, многие команды UNIX, имеющие отношение к работе с файлами и каталогами, делают то, что им говорят, не задавая никаких вопросов, даже если это может привести к уничтожению существующих файлов. UNIX не предостерегает вас, как это делает Windows и DOS. UNIX считает, что вы точно знаете, что делаете, когда даете ту или иную команду. Поэтому, если вы не полностью уверены в том, что делаете (например, вы не уверены, есть в каталоге, в который вы собираетесь скопировать другой каталог, файлы с такими же именами или нет), лучше используйте со всеми перечисленными командами опцию -i. В этом случае вы будете получать предупреждение, если введенная вами команда может привести к повреждению существующих файлов.
288 FreeBSD и командная строка Часть III Метасимволы и операции с групповыми символами Все упоминавшиеся ранее команды также поддерживают метасимволы и групповые символы, тем самым позволяя вам задавать соответствие одному или большему количеству символов в имени файла. ВНИМАНИЕ! Пользователям DOS: прежде чем вы решите пропустить этот раздел главы, потому как думаете, что знаете все о групповых символах, обратите внимание на то, что эти символы ведут себя в UNIX и FreeBSD совсем не так, как в DOS. Частично это связано с тем, что в UNIX точка (.) является просто еще одним используемым в именах файлов символом. UNIX не придает точке какого-то особого значения, как это делает DOS. А это значит, что если команда del * практически ничего не сделает в DOS, команда rm * в UNIX приведет к удалению всех видимых файлов в текущем каталоге! Будьте предельно осторожны с групповыми символами в UNIX, особенно если вы привыкли иметь с ними дело в DOS. В FreeBSD в основном пользуются тремя операциями с групповыми символами. Эти операции перечислены в табл. 8.8. Таблица 8.8. Операции с групповыми символами Операция Значение ? Соответствует одиночному символу. Например, команда f ile?. txt соответствует файлам с именами filel .txt, file2. txt и f ileA. txt. Однако именам вроде filel0.txt или fileAB.txt она, к сожалению, соответствовать не будет. * Соответствует любому количеству неизвестных символов. Например, команда f * соответствует файлам с именами f, foo, file, filel.txt, file2.txt, fileA.txt, filel0.txt И fileAB.txt. [ ] Соответствует диапазону символов. (Эта операция будет более подробно описываться в следующем разделе, поскольку требует дополнительных пояснений, уместить которые полностью в этой таблице не представляется возможным.) Соответствие диапазонам символов Вы можете задавать соответствие диапазонам символов, заключая их в скобки. Например, команда file [1-3] будет соответствовать файлам с именами filel, file2 и file3, но не file4. Такой подход применим и в отношении символов: file [а-с] будет соответствовать файлам с именами f ilea, f ileb и file с. СОВЕТ Имея дело с диапазонами символов, важно помнить, что соответствие выполняется на основании числового ASCII-значения символа. Например, при вводе команды file [A-b] будут отобраны не только файлы f ileA и f ileB, но также и файл f ileB, f ileC, fileD, f ileE и так далее вплоть до самого файла f ilez. А все дело в том, что в ASCII-таблице заглавные буквы (буквы верхнего регистра) находятся перед строчными (буквами нижнего регистра). Поэтому каждый раз, когда вы будете указывать в качестве начальной буквы в диапазоне заглавную букву, а в качестве конечной — строчную, все заглавные буквы, начиная от той, которую вы указали, и, заканчивая буквой Z, тоже будут считаться подходящими. Более подробную информацию об ASCII-значениях МОЖНО найти ПО адресу http: //www.lookuptables.com/.
Работа с командной оболочкой Вы также можете задавать соответствие одному из нескольких символов, просто помещая их в список. Например, команда file[1234]* вернет любой файл, имя которого начинается с символов filel, file2, file3 или file4, независимо от того, что следует после них (то есть после этих символов). Обратите внимание, что в этом примере используются сразу две операции с групповыми символами ([ ] и *), что вполне допустимо. И, наконец, вы еще можете применять вместе с групповыми символами логическую операцию НЕ, которую в bash представляет восклицательный знак (!), а в tcsh — знак вставки (А). Например, команда file[!1234] вернет все файлы, имена которых начинаются со слова file, кроме файлов filel*, file2*, file3* и file4*. ВНИМАНИЕ! Будьте предельно внимательны, используя групповые символы с такими командами, как rm, потому что если вы допустите ошибку, последствия могут быть самыми ужасными. Например, предположим, что вы хотели ввести rm note*, но случайно ввели rm note *. Командная оболочка интерпретирует символ пробела как разделитель аргументов. В результате этот случайно вве-. денный между словом note и звездочкой (*) символ пробела превращает данную команду из команды "удалить все файлы, начинающиеся со слова note" в команду "удалить файл note и затем удалить все остальные файлы в каталоге"! Поэтому дважды или даже трижды проверяйте то, что вводите, когда используете групповые символы с такими командами, как rm. (А еще лучше пользуйтесь опцией -i, чтобы заставить rm отображать предупредительное сообщение перед каждым * удалением.) Также, четырежды перепроверяйте все команды, в которых используете опцию -R (R — это сокращение от "recursive" ("рекурсивно")), которая в случае неправильного применения может привести к полному уничтожению вашей системы. СОВЕТ Работая с групповыми символами и потенциально опасными командами, вы еще можете воспользоваться следующим приемом: сначала, в качестве "пробного прогона" перед выполнением окончательной команды, использовать групповой символ с командой is, а не с командой, которую вы на самом деле собираетесь применить. Затем, чтобы выполнить настоящую, потенциально опасную команду, с помощью клавиши с изображением стрелки вверх найдите в хронологии "безвредную" команду is и просто измените в ней имя команды на необходимое. Поверьте, принятие всех возможных мер предосторожности стоит того, чтобы избежать опасных опечаток! Замечания касательно имен файлов Включать в имена файлов символы пробела разрешается, но если вы будете это делать, вам придется помещать имена таких файлов в кавычки для того, чтобы командная оболочка могла интерпретировать их как один аргумент, а не как имена двух отдельных файлов, или использовать символ обратной косой черты (\), чтобы отменить эти символы пробела и сделать так, чтобы они интерпретировались буквально. Поэтому рекомендуется использовать в именах файлов вместо символов пробела символы подчеркивания. Такие имена файлов и читать будет удобно, и заключать в кавычки не нужно. Также, примерно по той же причине, старайтесь не применять в именах файлов специальные символы: вы не раз похвалите себя за это позже, когда вам доведется получать к этим файлам доступ.
FreeBSD и командная строка Часть III ВНИМАНИЕ! Одна из главных и наиболее серьезных проблем с именами файлов, содержащими пробелы, состоит в том, что они могут стать причиной случайного удаления файлов, которые на самом деле не нужно было удалять. Например, представим, что существуют три файла: первый называется business, второй — letter, а третий — business letter. Предположим, вы решаете удалить файл business letter, но при выдаче команды rm забываете заключить его имя в кавычки. Как мы помним, если символ пробела не заключен в кавычки, командная оболочка воспринимает его как разделитель аргументов. Поэтому забытый вами при выдаче команды rm символ пробела приведет к тому, что удалены будут файлы letter и business, а файл business letter останется нетронутым. А ведь вы совсем не то хотели сделать. Это еще одна хорошая причина, по которой не стоит использовать символы пробела в именах файлов, хотя это также и хороший пример случая, когда доступные в современных командных оболочках функции завершения имен файлов (которые умеют правильно преобразовывать символы пробела) могут как сэкономить вам время, так и защитить от опечаток. Необычные имена файлов Большинство имен файлов в UNIX имеет простой, предсказуемый вид: алфавитно-цифровые символы, заглавные и строчные буквы и отсутствие пробелов. Однако, это не более чем простая договоренность: UNIX полностью поддерживает имена файлов, содержащие любые специальные символы, такие как пробелы, кавычки, скобки и другие странно выглядящие знаки, которые могут встречаться в файлах Windows и Macintosh, где работать с именами файлов в командной строке нет никакой необходимости. Единственный символ, который не разрешается использовать в именах файлов в UNIX — это символ левой косой черты (/). Однако, хотя большинство программ UNIX будут создавать файлы только с "правильно ведущими себя" именами, в именах файлов, которые исходно создавались на компьютерах Windows и Macintosh, при переносе на компьютер FreeBSD (no FTP или другим способом) могут появиться пробелы или другие необычные символы, и вам нужно будет знать, что с ними делать. Например, ниже показан листинг каталога, в котором присутствует несколько файлов со странными именами: * File\l.txt file4.txt file6.txt File 1 file"3".txt \ file5.txt Эти имена файлов показаны только в демонстрационных целях. Ни в коем случае не пытайтесь создать такие имена на практике! Первым особым случаем здесь является файл с именем *. Как его можно удалить? Если вы новичок в UNIX, вашей первой реакцией, скорее всего, будет просто ввести команду rm *, ведь она по идее и должна удалить файл с именем *, не так ли? Да, она, конечно, удалит этот файл, но не следует забывать о том, что командная оболочка интерпретирует символ звездочки (*) как групповой символ. Поэтому выполнение этой команды приведет к удалению не только этого, но и всех остальных файлов в каталоге! А это вовсе не то, что вам нужно. Для случаев, подобных этому, командная оболочка поддерживает так называемый символ отмены — символ обратной косой черты (\). Он указывает оболочке, что она должна интерпретировать следующий за ним символ в строке как обычный символ вместо того, чтобы интерпретировать его каким-то особым образом, как она должна
Работа с командной оболочкой | _Q<| I Глава 8 I I была бы делать в противном случае (то ^сть в случае отсутствия символа обратной косой черты). Таким образом, в рассматриваемом примере правильной командой будет rm — i \*: она удалит только ненужный файл, оставив остальные нетронутыми. Вторым проблемным файлом является файл с именем FileM. txt. В данном случае символ отмены (\) содержится в самом имени файла. Ввод команды вроде rm FileM. txt приведет к появлению следующего сообщения об ошибке: Filel.txt: No such file or directory (Filel.txt: такого файла или каталога не существует). А все потому, что здесь символ \ просто указывает оболочке воспринимать символ 1 как обычный символ, что она бы и так делала. Здесь можно поступить следующим образом: отменить сам символ отмены. То есть сделать так: # rm -i File\U.txt Далее, давайте разберемся с файлом File 1. Командная оболочка интерпретирует символы пробела как разделители аргументов, поэтому команда rm File 1 не удалит этот файл. Взамен она попытается удалить два файла: файл с именем File и файл с именем 1. Для того чтобы оболочка интерпретировала эту строку не как два, а как один аргумент, ее следует заключить в кавычки. Следовательно, в данном случае нужно использовать такую команду: rm -i "File 1" (или rm -i File\ 1). А как же быть с файлом file "3" .txt? Опять-таки, если вы просто введете rm file"3" • txt, вы увидите следующее сообщение об ошибке: file3. txt: No such file or directory (file3.txt: такого файла или каталога не существует). Дело в том, что оболочка интерпретирует символ " как специальный символ. А это значит, что его следует отменить с помощью символа обратной косой черты (\). Следовательно, в данном случае команда должна выглядеть так: rm -i f ile\ "3\" . txt (хотя команда rm -i f f ile"3". txt' тоже сработает). СОВЕТ Обратите внимание на то, что во всех приводившихся примерах с командной rm также использовалась опция ~i, которая запрашивает подтверждение перед удалением файла. Будет совсем неплохо, если у вас войдет в привычку пользоваться этой опцией при удалении файлов с непредсказуемыми именами. В этом случае вы сможете всегда быть уверенными в том, что выполняемая вами команда сделает именно то, что вы ожидаете, и не удалит файлы, которые вы вовсе не собирались удалять. Куда делся файл? Такое случается со всеми из нас. Время от времени мы создаем новые файлы или сохраняем файлы и затем просто не можем вспомнить, куда мы их поместили. Для таких ситуаций в FreeBSD имеется команда find, которая имеет несколько нестандартный синтаксис. Ниже показан пример использования этой команды: # find . -пап» "lostfile*" Эта команда отыщет все файлы, имя которых начинается со слова lostfile и которые находятся в текущем каталоге или любом другом каталоге внутри текущего. Обратите внимание на то, что в случае выполнения поиска из корневого каталога (root) проверяться будет каждый подкаталог во всей системе и даже подкаталоги, находящиеся на других дисках или за пределами точек монтирования NFS. На больших дисках на это может уйти очень много времени. Существуют различные опции,
292 FreeBSD и командная строка Часть III позволяющие контролировать, до какого уровня в иерархии каталогов будет доходить команда find и то, будет, она пересекать границы файловых систем или только просматривать текущую файловую систему. Команду find также можно применять для поиска файлов на основании и таких критериев, как владелец, группа и размер, а не только по имени. Более подробную информацию о команде find вы сможете найти на страницах руководства (с помощью команды man find). Существует также похожая команда, которая называется locate. Она не выполняет поиск фактического файла, а просто просматривает список имеющихся в системе файлов, который хранится в ее базе данных. Из-за того, что locate пользуется базой данной, она работает гораздо быстрее, чем find. Недостаток locate заключается в том, что в системе могут существовать файлы, о которых ее базе данных может быть ничего неизвестно, и которые она по этой причине неспособна обнаружить. В зависимости от системы, база данных locate обычно обновляется один раз в день или, иногда, один раз в неделю (частоту обновления этой базы данных можно регулировать; подробнее об этом вы сможете узнать, воспользовавшись командами man locate и man updatedb). В принципе это все, что вам необходимо знать для того, чтобы работать с файлами в командной строке. Хотя в этой части были рассмотрены далеко не все доступные команды, с теми из них, которыми вы, скорее всего, будете пользоваться регулярно, вы познакомились, и к тому же узнали, где, если что, следует искать дополнительную информацию. Узнать больше обо всех описывавшихся здесь командах и их опциях, вы сможете на соответствующих страницах руководства. Команды для обработки текста Одной из главных целей, которые преследовала компания AT&T при разработке UNIX, было упростить обработку текстовых данных. UNIX и FreeBSD имеют огромное количество команд для обработки текстовых данных из командной строки. В этой главе будут рассматриваться не все доступные для работы с текстом команды, а только те из них, которые являются наиболее полезными. Разумно применяя по несколько команд, вызывающих небольшие, но гибкие, работающие в режиме командной строки утилиты для обработки текста, вы сможете брать обычный текстовый файл и извлекать из него информацию подобно настоящему волшебнику. Подсчет строк, слов и символов Для подсчета количества строк, слов или символов в текстовом файле используйте команду wc. Когда команда wc применяется без опций, она возвращает все три этих показателя. Например, следующая команда сообщает, что на текущий момент в текстовом файле, который содержит текст текущей главы, имеется 1160 строк, 7823 слов и 51584 символов: # wc chapter08 1160 7823 51584 chapter08 wc поддерживает опцию -1, которая позволяет ей отображать только количество строк, опцию -w, позволяющую ей отображать только количество слов, и опцию -с, которая позволяет ей отображать только количество символов. Вы можете как угодно комбинировать эти опции, тем самым настраивая отображаемые командной wc сведения так, как вам нужно.
Работа с командной оболочкой Глава 8 293 Просмотр текстовых файлов: less и more more и less когда-то были двумя отдельными командами, а теперь это просто два разных названия одной и той же программы, которая очень часто используется для просмотра текстовых файлов в UNIX. Вы можете использовать команду less (или more) для отображения текстовых файлов, по одному экрану за раз. Кроме того, вы можете выполнять в просматриваемом файле поиск определенных строк текста, а также прокручивать файл назад и вперед либо на любое количество строк, либо просто используя клавиши с изображениями стрелок. В табл. 8.9 приведено несколько примеров команд, которые могут использоваться в программе less. Таблица 8.9. Команды, которые разрешается использовать в программе less Команда Действие /pattern Если вы на месте слова pattern укажете образец, который хотите найти, less отыщет его в файле. Пробел или f Прокручивает текст на один экран вперед. Если перед нажатием клавиши пробела вы введете какое-нибудь число, less прокрутит текст вперед на указанное количество строк. Ь Прокручивает текст на один экран назад. Если перед b вы введете какое- нибудь число, less прокрутит текст назад на указанное количество строк. Клавиша с изображе- Позволяют переходить, соответственно, на одну строку вверх или вниз. нием стрелки вверх и клавиша с изображением стрелки вниз # я Если вы на месте # укажете какое-нибудь число и затем введете g, less перейдет именно на эту конкретную строку в файле. # % Если вы на месте # укажете какое-нибудь число в диапазоне от О до 100, less перейдет в ту часть файла, которая соответствует указанному вами числу в процентном отношении. с Перемещает в конец файла. ч Завершает работу программы less. Здесь были перечислены только самые основные опции, которыми вы, скорее всего, будете пользоваться в программе less. Однако в этой программе доступно и много других опций. В руководстве страница, посвященная less, занимает почти 2000 строк. Всю необходимую информацию о других опциях и командах, которые предлагает less, вы сможете найти именно на этой странице (обратите внимание, что для получения доступа к этой странице руководства вы должны использовать команду man less, анелшп more). Просмотр только верхней или нижней части текстового файла Если вы хотите просмотреть только несколько первых или только несколько последних строк файла, вы можете воспользоваться командой head или tail.
I ooi I FreeBSD и командная строка По умолчанию команды head и tail отображают первые десять и последние десять строк файла, соответственно. Вы можете изменить количество подлежащих отображению строк, воспользовавшись опцией -п и указав после нее нужное число (например: tail -100 log.txt). Что касается команды tail, вы можете также использовать с ней опцию -f, если хотите сделать так, чтобы она постоянно обновляла отображаемые строки новыми по мере их добавления в конце файла. Это может оказаться удобным для мониторинга какого-то журнального файла на предмет новых, записываемых в него в реальном времени сообщений. Поиск по образцу Предметом гордости UNIX является возможность быстро отыскивать в коллекции файлов определенный фрагмент текста, например, чье-то имя, команду, которую нужно запомнить, функцию в программе или наименование службы в журнальном файле. Стандартные предназначенные для работы в командной строке средства UNIX позволяют очень эффективно выполнять операции поиска такого рода. Для поиска по образцу в текстовых файлах можно пользоваться командами из серии grep. Всего доступно целых три различных команды grep: упрощенная (старая) команда grep, которая просто выполняет поиск образцов и базовых регулярных выражений; команда egrep, которая может выполнять поиск расширенных регулярных выражений (и подразумевает применение целого ряда специальных символов для определения образцов переменных); команда f grep, которая выполняет поиск фиксированных строк (то есть строк, которые должны полностью совпадать по буквам, безо всяких групповых символов). Раньше в некоторых руководствах UNIX команда fgrep также называлась "fast grep" ("быстрая команда grep*), потому что считалось, что она должна работать быстрее, чем обычная команда grep. Сегодня ее так больше практически нигде не называют. Предположим, что требуется выполнить в файле textf ile поиск образца cat. Наиболее простая подходящая для этого команда grep выглядит так: # grep cat textf ile Эта команда проверяет каждую строку в файле textf ile и выводит все те строки, в которых встречается образец cat. Обратите внимание на то, что эта команда ищет совпадения с образцом, а не со словом. Это означает, что кроме слова cat, также будут отобраны и слова catnip, catbird, catfish и concatenate, потому что все они со держат строку cat. Если вы хотите отыскать только конкретно слово cat, заключите строку-образец в кавычки и поместите по обеим ее сторонам символы пробела, как показано ниже: # grep " cat " textfile Однако обратите внимание и на то, что в этом случае отбираться будут только те вхождения слова cat, которые встречаются в середине предложения; если вхож дение cat находится в начале или конце строки или если после него стоит точка эта команда grep его учитывать не будет. Вы можете настроить образец поиска так чтобы он отвечал вашим личным потребностям. С командной grep наиболее часто используются следующие опции: -i, которая позволяет ей выполнять поиск без учета регистра, -с, которая позволяет ей пода влять отображение совпавших строк и выводить на экран только число, отобража
Работа с командной оболочкой Глава 8 295 ющее количество обнаруженных совпадений, -п, которая позволяет ей отображать номер строки перед каждой строкой, в которой было обнаружено совпадение, и -v, которая позволяет ей выполнять обратную операцию и выводить только строки, не совпадающие с указанным образцом. Рассмотрение возможностей команды egrep, которая может выполнять поиск расширенных регулярных выражений, выходит за рамки этой главы, зато о регулярных выражениях будет подробно рассказываться в главе 10. Сортировка текста в файле Вполне возможно, что когда-нибудь вы захотите просмотреть текст в файле в определенном, отсортированном виде. Например, может, вы захотите взять список имен и отсортировать его в алфавитном порядке, или взять список расходов и отсортировать в нем строки по числам. Для этого вы сможете использовать команду sort. По умолчанию эта команда выполняет сортировку на основании ASCII-значений и не игнорирует начальный символ пробела. В табл. 8.10 перечислены некоторые наиболее часто используемые с этой командой опции. Таблица 8.10. Опции, которые можно использовать с командой sort Опция Результат -d Выполняет сортировку по принципу "телефонной книги", то есть игнорирует все, кроме букв, цифр и пробелов. -Ь Игнорирует начальные пробелы в строках при сортировке. -f Преобразует буквы нижнего регистра в буквы верхнего регистра. Создает впечатление, что выполняется сортировка с учетом регистра. -п Выполняет сортировку по числовому значению в поле. -t Изменяет разделитель, используемый при сортировке для обозначения конца одного поля и начала следующего поля. По умолчанию для разделения полей служит символ пробела. -и При наличии в исходных данных двух идентичных строк, эта опция отображает в отсортированных выходных данных только одну из них. -г Отображает отсортированные данные в обратном порядке. -о Отправляет результаты не на экран, а в выходной файл, имя которого указано сразу после -о. Эта опция, по сути, позволяет добиться того же эффекта, что и технология переадресации вывода в файл (о которой более подробно речь пойдет далее в этой главе). —i^H^^^^^^^^^^^^—^И— II ¦¦!¦¦¦¦¦¦ ¦ ¦¦ - ¦ ^¦ ¦ II I I I. ИММ^^^^^— Если в строке команды sort указать несколько файлов, она их сцепит. Если при указании нескольких файлов использовать опцию -т, команда sort будет работать быстрее за счет слияния все указанных в файлов в один. Однако для того, чтобы опция -т работала правильно, каждый входной файл должен быть отсортирован индивидуально.
I ГГ7 I FreeBSD и командная строка I 2Э6 1 ЧагтцШ Замена строк с помощью команды tr Команда tr ("translate" — "транслировать") позволяет выполнять в текстовом файле поиск всех вхождений определенной строки и заменять их новой строкой. Базовый синтаксис команды tr выглядит следующим образом: # tr 'a-z' 'A-Z» Эта команда заменяет все строчные буквы заглавными. По умолчанию tr получает свои входные данные со стандартного ввода (а таковым, как правило, является клавиатура) и отправляет свои выходные на стандартный вывод (которым, как правило, является экран). В большинстве случаев это не очень удобно, поэтому команда tr нередко применяется вместе с переадресацией ввода и вывода. О переадресации ввода и вывода более подробно будет рассказываться чуть позже в этой главе; а вот как должна выглядеть команда tr для того, чтобы она получала входные данные из файла и отправляла свои выходные данные тоже в файл, показано ниже: # tr 'a-z» 'A-Z' < filel > file2 Эта команда прочитает файл filel, заменит в нем все строчные буквы заглавными и сохранит полученный новый файл как файл с именем file2. С командой tr также можно использовать опцию -d. В таком случае tr просто просмотрит файл и удалит каждое вхождение указанного символа. Например, следующая команда удалит из файла filel все вхождения заглавной буквы Л и Б и сохранит результаты в файле file2: # tr -d 'АВ' < filel > file2 Команда tr является чрезвычайно гибкой. Когда она используется с соответствующими конвейерами, переадресацией и опциями, она может решать очень многие задачи, касающиеся обработки текстовых данных, для которых все пользователи так часто пишут специальные сценарии на Perl, не догадываясь, что они просто изобре- тают заново колесо. Отображение только определенных частей строк в текстовых файлах Иногда вас может интересовать только определенная часть строки в файле (например, только первая половина каждой строки) или вы можете захотеть сделать так чтобы строки были разделены по точкам или символам табуляции и на экран выво- дилось только содержимое третьего поля каждой из этих строк. Чтобы "вырезать" из файла только какие-то определенные поля или части для отображения, вы можете ис пользовать команду cut. Например, предположим, что имеется текстовый файл под именем phone. txt, в котором содержится следующая простая адресная книга: Doe, John-105 Some Street-Anytown-NY-55555-123-555-1212 Doe, Jane~105 Some Street~Anytown~NY-55555~123-555-1212 James, Joe~251 Any Street-Sometown~CA~51111-321-555-1212 Если вас интересуют только первые пять символов каждой строки, вы можете и пользовать такую команду: cut 1-5 phone.txt, в которой аргумент -с (1-5) — этс перечень позиций символов (которыми в данном случае являются символы от до 5). Вывод этой команды будет выглядеть следующим образом:
Работа с командной оболочкой I ITZ I Глава 8 I I # cut -с 1-5 phone.txt Doe, Doe, James Но команду cut даже еще удобнее применять для вырезания только определенных полей из строки с обычными разделителями. Следующая команда вернет первое поле из набора строк, поделенных на части символами табуляции: # cut -f l phone.txt По умолчанию cut ожидает, что поля отделяются друг от друга символами табуляции. Однако вы можете изменить символ, выступающий в роли разделителя полей, любым другим, каким захотите. В данном случае, в нашем текстовом файле с адресной книгой в качестве разделителя используется не символ табуляции, а символ ~. Указать, какой символ должен применяться в качестве разделителя, можно с помощью опции -d: # cut -f 1 -d • ~ • phone. tact Doe, John Doe, Jane James, Joe Здесь мы указали cut отображать только первое поле, а также что в роли разделителя выступает символ ~. Поскольку первый символ ~ стоит после имени, эта команда выводит только имя человека и пропускает всю остальную информацию. Аналогичным образом мы можем получить список всех пользователей в системе, применив команду cut к файлу /etc/passwd: # cut -f 1 -d ': ¦ /etc/passwd frank bob alice joe simba lee Форматирование текста с помощью команды fmt Команда fmt форматирует текст, преобразовывая его (по умолчанию) в строки, содержащие по 65 символов. Ее наиболее удобно использовать, когда необходимо подготовить текстовый файл к отправке по электронной почте, но также можно применять и для решения других простых, связанных с форматированием задач. Например: Until he extends his circle of compassion to include all living things, man will not himself find peace. — Dr. Albert Schweitzer Человек не сможет обрести покой до тех пор, пока его круг заслуживающих сострадания не будет охватывать всех живых существ» — Доктор Альберт Швейцер Здесь в первой строке содержится целых 105 символов, то есть она слишком длинная, чтобы умещаться в одной строке на текстовом дисплее (или даже на графическом дисплее с низким разрешением). В результате с ней может случиться следу-
I ITZ I FreeBSD и командная строка I 9 1 Часть III ющее: либо программа, используемая для чтения почты, разорвет ее в каком-нибудь неожиданном месте (например, посередине какого-нибудь слова), либо содержащийся в ней текст будет выходить за правую границу экрана, вынуждая читателя прокручивать экран, чтобы прочитать остальную его часть, (Если вам доводилось получать электронные сообщения, имеющие вид одной очень длинной строки, то вы знаете, что почтовые программы не умеют правильно разбивать строки для отображения.) Нас может спасти команда fmt. Обычно она используется примерно так: # fmt quote.txt Until he extends his circle of compassion to include all living things, man will not himself find peace. — Dr. Albert Schweitzer Далее мы можем направить этот вывод либо в почтовую программу, либо в файл и затем отправить по электронной почте уже этот файл в виде вложения. Ниже показан пример, позволяющий лучше увидеть результаты применения команды fmt: Until he extends his circle of compassion to include all living things man will not himself find peace — Albert Schweitzer Вот как этот текст будет выглядеть после применения к нему команды fmt: Until he extends his circle of compassion to include all living things man will not himself find peace — Dr. Albert Schweitzer В этом разделе были рассмотрены некоторые из наиболее полезных команд для работы с текстом. Комбинируя эти различные команды, вы сможете выполнять достаточно сложные задачи, например, анализировать журналы Web-серверов и выявлять намечающиеся в них тенденции. Конечно, все эти команды имеют свои ограничения. Натолкнувшись на них, вы можете захотеть использовать для обработки текстовых данных программы вроде sed и awk. Рассмотрение sed и awk выходит за рамки данной книги (им посвящены отдельные книги), но вы должны знать, что они существуют в вашей системе FreeBSD и могут использоваться для выполнения некоторых очень сложных, связанных с обработкой текста задач. Итак, как же вы можете комбинировать команды, чтобы делать еще более полезные вещи? Вот где в игру вступают такие технологии, как конвейеризация и переадресация ввода-вывода. Конвейеры и переадресация ввода-вывода Одним из аспектов, которые делают UNIX столь мощной системой, является тот факт, что в ней выходные данные одной команды могут использоваться в качестве входных для другой команды и что конечные выходные данные могут отправляться не только на экран, но и в другие места. Вы можете получить список файлов или
Работа с командной оболочкой выходные данные программы, переслать их по конвейеру команде grep, чтобы избавится от ненужных строк, и затем пропустить их через команду f mt для того, чтобы сделать их удобными для чтения — и все это в одной командной строке. Выполнение операций подобного рода очень часто оказывается полезным при проведении процедур по администрированию системы типа обработки файлов журналов либо при аудите файловой системы. Например, команда Is обычно отображает список файлов каталога на экране, но вы запросто можете сделать так, чтобы ее вывод отправлялся не на экран, а в файл: # Is > filelist.txt В случае выполнения данной команды будет создан файл f ilelist. txt, содержащий список файлов текущего каталога. Это называется переадресацией вывода. Если список файлов каталога слишком длинный, чтобы целиком помещаться на экране, вы можете отправить выходные данные этой команды (по конвейеру) программе less, как показано ниже: # Is | less Напомним, что команда less отображает отправленный ей текст по одному экрану за раз. Это не позволит списку файлов каталога выходить за границы экрана до того, как вы сможете прочитать его. А что если вы захотите отправить цитату Альберта Швейцера (Albert Schweitzer) кому-нибудь по электронной почте? Вместо того чтобы вводить эту цитату вручную в электронном сообщении, вы можете отправить файл, содержащий цитату, в виде входных данных команде mail. Вообще-то существует целых два способа сделать это и оба из них дают абсолютно одинаковый результат. Первый: вы можете воспользоваться командной cat ("catenate" — "связать"), которая распечатает файл на экране и отправит выходные данные программе mail, как показано ниже. # cat quote.txt | mail ueeraddreee Второй: вы можете воспользоваться технологией, которая называется переадреса- цией ввода. Ниже показана команда, позволяющая добиться точно такого же эффекта, но с помощью переадресации ввода: # mail useraddress < quote,txt В данном случае мы указали команде mail, что подлежащее отправке сообщение она должна получить не с клавиатуры, а из файла quote .txt. Хотя обе приведенных команды делают одно и то же, вторая команда является более эффективной, потому что ей не приходится вызывать программу cat. Вместо этого она позволяет командной оболочке выполнить переадресацию. Переадресация ввода и вывода может выполняться в одной и той же команде. Например, вы можете указать команде tr, которая описывалась ранее в этой главе, что она должна получать входные данные из файла f ilel, а выходные данные отправлять в файл f ile2: # tr 'a-z' 'A-Z' < filel > fil«2 СОВЕТ L Чтобы никогда не путаться в том, какой символ использовать < или >, запомните, что стрелка должна указывать в том направлении, куда будут идти данные.
I „л I FreeBSD и командная строка I I Часть III Вы можете объединять несколько конвейеров в одну команду: # cut -f 1 -d ' ' access.log | sort | uniq -с I more Это — один из самых простых способов извлечения полезной информации из совместимого с NCSA файла журнала Web-сервера. В частности, данная команда извлекает поле 1, в котором содержится сетевой адрес каждого обращения, передает его (по конвейеру) команде ysort, а затем пересылает уже отсортированные выходные данные команде unique -с. Последняя подсчитывает количество вхождений идентичных строк и затем отображает каждую уникальную строку, указывая перед ней количество раз, которое она повторялась, после чего передает эти свои выходные данные команде more для того, чтобы их можно было читать, не прокручивая экран. Таким образом, эта команда сообщает, сколько обращений было сделано к данному Web-серверу с каждого сетевого адреса. Вы также можете использовать вместе конвейеры и переадресацию ввода-вывода: # cut -? 1 -d ' ' /var/log/httpd-access.log | sort | uniq -c > hits.txt Эта команда делает то же самое, что и предыдущая, только не отображает выходные данные на экране, а записывает их в файл. Истинная мощь FreeBSD проявляется при творческом подходе к применению конвейеров и переадресации ввода-вывода. (Показанную команду можно сделать даже еще более полезной, воспользовавшись aw к, но об этом будет рассказываться уже в главе 10.) Завершение команд и редактирование хронологии Теперь, когда вы ознакомились с некоторыми основными командами, доступными для использования в командной строке, давайте рассмотрим несколько дополнительных возможностей, предлагаемых более современными командными оболочками. Если вы не знаете точно, установлена у вас оболочка bash (либо какая-то другая оболочка) или нет, вы можете запросто узнать это, воспользовавшись встроенной функцией завершения команд, которая имеется в tcsh, bash и других укомплектованных разнообразными функциональными возможностями оболочках. Введите первые несколько букв имени какой-нибудь команды (две или три, просто чтобы посмотреть, как работает эта функция). Если вы ввели достаточное для идентификации программы количество букв из ее имени, остальная часть команды будет дополнена автоматически. Если вы ввели буквы из имени программы в количестве, не достаточном для того, чтобы командная оболочка могла понять, чего вы хотите, последует соответствующий звуковой сигнал или какое-нибудь другое извещение, что зависит от того, какая терминальная программа используется, после чего вы, нажав либо снова клавишу <ТаЬ> (если речь идет об оболочке bash), либо клавиатурную комбинацию <Ctrl+D> (в оболочке tcsh), сможете получить список всех возможных вариантов завершения данной команды: # has[Tab] basename bash bashbug
Работа с командной оболочкой Глава 8 ВНИМАНИЕ! \- Клавиатурная комбинация <Ctrl+D> также применяется для удаления символа, находящегося справа от курсора, и еще для выхода из сеанса tcsh (если нажимается на пустой строке). Поэтому будьте осторожны! Функция завершения команд при помощи клавиши <ТаЬ> работает и с именами файлов: # Is show/Tab7 showchars.cgi* showfavepics.cgi* showprofile.cgi* showuploads.cgi* showcomments.cgi* showpopular.cgi* showrequests.cgi* Возможность редактирования хронологии команд тоже является одной из главных функциональных возможностей усовершенствованных командных оболочек. Когда вы вводите команды, каждая из них помещается в буфер и хранится там на протяжении всего текущего сеанса; то, какое именно количество команд может храниться в буфере, определяется в конфигурационном файле командной оболочки (в командной оболочке tcsh, например, в этом буфере по умолчанию может храниться не более 100 команд). Вы можете прокручивать список команд, которые вводили, вверх и вниз с помощью клавиш с изображением стрелки вверх и стрелки вниз; затем вы можете нажимать клавишу <Enter>, чтобы снова выполнить выбранную команду, или при помощи других клавиш с изображениями стрелок редактировать команды, исправляя ошибки либо изменяя их так, чтобы они давали другой результат. Каждая команда также заносится в находящийся в вашем домашнем каталоге файл хронологии, который называется .history, если речь идет о командной оболочке tcsh, или ,bash_history, если речь идет о командной оболочке bash. Это позволяет хранить команды не только текущего, но и предыдущих сеансов; однако, хотя файл хронологии и может читать только его владелец, вы все равно можете посчитать его уязвимым местом в системе безопасности. В конце концов, нужен ли вам на самом деле файл, содержащий все когда-либо вводимые вами команды? Если нет, вы спокойно можете удалить его, не боясь никаких нежелательных последствий (в этом случае вам грозит только одно: вы не сможете просматривать команды из предыдущих сеансов). Чтобы удалить файл хронологии, введите rm -/.history или rm ~/.bash_history, в зависимости от того, какую командную оболочку вы используете. Вы даже можете сделать так, чтобы эта операция выполнялась автоматически, добавив соответствующую команду rm в свой файл . logout или ,bash_logout, о чем будет рассказываться уже в главе 9.
ГЛАВА 9 Настройка командной оболочки В этой главе... • Добавление командных оболочек в систему и предоставление к ним доступа • Использование альтернативных командных оболочек • Файлы инициализации командной оболочки • Настройка среды командной оболочки • Переменные среды и переменные оболочки
I ГТТ I FreeBSD и командная строка 1 304 1 Часть 111 Независимо от того, решите вы работать со своей системой FreeBSD через графический пользовательский интерфейс XII или нет (особенно в качестве администратора), вам все равно придется иметь дело с командной оболочкой. Командная оболочка предоставляет все возможности, необходимые для выполнения даже самых сложных задач, а также определяет условия работы пользователя, которые простыми никак не назовешь. В этой главе речь пойдет о том, как можно настроить командную оболочку так, чтобы ею было удобно пользоваться и в качестве среды программирования, и в качестве пользовательского интерфейса. Мы уже рассказывали об основных возможностях командной оболочки и том, что с ней можно делать, в предыдущей главе. В той главе мы говорили о командной оболочке как об интерфейсе командной строки, рассмотрели различные командные оболочки, которые могут использоваться в FreeBSD, а также показали, какие команды доступны в оболочке для управления системой. Теперь мы более подробно остановимся на самой командной оболочке и посмотрим, как ее можно применять для множества пользователей, которым может быть разрешен доступ к данной системе, и как ее можно настроить по своему вкусу. Добавление командных оболочек в систему и предоставление к ним доступа Многих пользователей, скорее всего, устроит используемая в FreeBSD по умолчанию оболочка /bin/tcsh (то же, что и оболочка /bin/csh). Эта командная оболочка предоставляет такие возможности, как возможность редактирования командных строк, возможность автоматического завершения команд с помощью клавиши <ТаЬ>, возможность просмотра хронологии (то есть вводившихся ранее команд) и все остальные усовершенствованные возможности, отсутствующие в более старых командных оболочках. Однако тот факт, что в FreeBSD по умолчанию применяется командная оболочка tcsh, а не bash (которая обычно используется в Linux), указывает на едва заметные философские отличия между традицией BSD и структурой System V (которая во многом соответствует архитектуре Linux), существующие столько же, сколько существует сама система UNIX. Эти философские отличия раньше имели намного более важное значение, нежели сейчас. Коммерческие аспекты UNIX периодически начинают поддерживаться и развиваться то в одном лагере, то в другом, и за последние годы существенно не изменились; однако более важное философское отличие между Linux и FreeBSD кроется в отличиях между лицензионными соглашениями GNU и BSD. Вот где таится разгадка того, почему в Linux отдается предпочтение оболочке bash, а в FreeBSD — оболочке tcsh. Поскольку bash разрабатывалась как программа для GNU и поскольку в Linux обычно используется программное обеспечение, создаваемое в соответствии с условиями лицензионного соглашения GNU General Public License (GPL), bash является в Linux командной оболочкой по умолчанию. Наборы функциональных возможностей bash и tsch в принципе похожи, только доступ к ним получается по-разному; процесс конфигурирования и поведение во время выполнения у этих двух оболочек тоже не сильно отличаются. Если вы привыкли работать в Linux, то, возможно, предпочтете установить командную оболочку bash, чтобы остаться в знакомой среде. С другой стороны, может вы — опытный пользователь UNK, и до этого работали с системой, в которой была установлена командная оболочка ksh или zsh. Установка
Настройка командной оболочки | TTZ I Глава 9 I 1 и использование этих оболочек также не является проблемой в FreeBSD, как будет показано в следующем разделе этой главы. НА ЗАМЕТКУ Те, кто программирует в командных оболочках, отдают предпочтение оболочкам в стиле Bourne, примером которых как раз и является командная оболочка bash, а все потому, что у таких оболочек никогда не возникает проблем с совместимостью ни с какими сценариями оболочки, которые могут существовать в системе; вы можете выполнить сценарий оболочки в bash так же легко, как и в sh. Сделать это с командными оболочками С (csh или tcsh) нельзя, потому что их синтаксис программирования сильно отличается. Однако реальность UNIX сегодня такова, что сценарии оболочки обычно вызывают свои собственные интерпретаторы, указывая их в своих первых строках (например, так: #!/bin/sh) и, следовательно, то, какая командная оболочка используется для их выполнения, становится не важным. Поэтому у вас все равно не будет возникать практически никаких проблем, даже если вы все-таки решите оставить и пользоваться в FreeBSD командной оболочкой tcsh. В остальных разделах этой главы будут рассматриваться оболочки tcsh и bash и описываться отличия в конфигурации и способы использования. Что касается других оболочек, здесь вам придется разбираться самим, для чего вам потребуется просто установить нужную оболочку, а затем прочитать посвященную ей страницу в руководстве (с помощью команды man). Установка командных оболочек из коллекции портов или коллекции пакетов В FreeBSD программное обеспечение рекомендуется устанавливать из коллекции портов или пакетов; необходимая для выполнения этой задачи процедура будет подробно описываться в главе 16. В этой же главе мы просто расскажем вам, как пользоваться коллекцией портов и пакетами для работы с программным обеспечением. Однако в следующем разделе мы все-таки рассмотрим некоторые основные команды и процедуры, необходимые для установки новых командных оболочек. Установка из пакетов Самый простой способ установить новую оболочку — это воспользоваться программой Sysinstall и предлагаемым в ней окном диспетчера пакетов. Запустите sysinstall, выберите опцию Configure (Настройка), а затем — Packages (Пакеты). После этого укажите источник установки: CD/DVD (CD/DVD-диск), если у вас имеется установочный диск FreeBSD, или FTP (FTP-сервер), если диска у вас нет. Когда на экране появится перечень пакетов, перейдите в категорию shells и просмотрите список доступных командных оболочек. Нажимайте клавишу пробела, чтобы отметить крестиком (х) каждую оболочку, которую вы хотите установить. Когда вы закончите выбирать оболочки, нажмите клавишу <ТаЬ>, чтобы навести фокус на кнопку ОК и затем нажмите клавишу <Enter>; после этого на экране снова появится главное меню пакетов. При помощи клавиши с изображением стрелки вправо выделите опцию Install (Установить) и нажмите клавишу <Enter>. На экране со списком выбранных пакетов и приглашением подтвердить установку выберите ОК. После этого выбранные программы начнут автоматически загружаться и устанавливаться. Когда этот процесс завершится, выйдите из программы Sysinstall, вернув-
FreeBSD и командная строка шись к опции Exit (Выход), которая находится в верхней части меню Configuration (Настройка), а затем выберите опцию Exit Install (Выход из программы установки) из опций, отображающихся внизу экрана. Командная оболочка (оболочки), которые вы выбрали, теперь установлены. Вы можете убедиться в том, что они установлены, заглянув в каталог /usr/local/bin и отобразив страницу руководства, посвященную той или иной установленной оболочке (например, с помощью команды man bash). Имеется даже еще более простой способ установить командную оболочку — сделать это прямо из командной строки, например, так, как показано ниже: # pkg_add -r bash Если все нормально, этой одной команды будет достаточно, чтобы извлечь и установить порт с центрального FTP-сервера FreeBSD. Однако в случае появления проблем при попытке получить доступ к репозиторию пакетов или если запрашиваемый пакет окажется недоступным, вы должны будете вместо этого скомпилировать оболочку прямо из коллекции портов; чтобы сделать это, перейдите в каталог /usr/ ports/shells, отыщите порт, соответствующий оболочке, которую вы хотите установить и затем скомпилируйте ее из загруженного исходного кода (эта процедура будет подробно описываться в главе 16). НА ЗАМЕТКУ После установки любых новых программ вам может понадобиться ввести rehash (если вы пользуетесь tcsh), чтобы заставить командную оболочку заново прочитать конфигурационные файлы и перечисленные в вашем пути доступные программы; если вы этого не сделаете, то не сможете получить доступ к этим программ до тех пор, пока не выйдете из системы и не войдете в нее заново. Файл /etc/shells Файл /etc/shells — это очень важный системный файл, о котором вы обязательно должны знать, работая с командными оболочками. В этом файле содержатся имена абсолютно всех установленных в системе командных оболочек и полный путь к ним. Ниже показан пример содержимого файла /etc/shells, взятый с рабочей системы, в которой было установлено три дополнительных командных оболочки: # cat /etc/shells # $FreeBSD: src/etc/shells,v 1.5 2000/04/27 21:58:46 ache Exp $ # # List of acceptable shells for chpass(l) . # Список приемлемых командных оболочек для chpass(l). # Ftpd will not allow users to connect who are not using # one of these shells. # Ftpd не позволит подключаться тем пользователям, # которые не используют эти оболочки. /bin/sh /bin/csh /bin/tcsh /usr/local/bin/bash /usr/local/bin/zsh /usr/local/bin/ksh
Настройка командной оболочки I TTZ 1 i Глава 9 I I Задачей файла /etc/shells является указывать, какие программы оболочки считаются "допустимыми". Программа chsh (о которой более подробно будет рассказываться чуть позже) не разрешит обычному пользователю заменить командную оболочку, предлагаемую ему по умолчанию, на какую-то другую программу, которую администратор не указал в файле /etc/shells. Эта мера предосторожности позволяет быть уверенным в том, что пользователь не сможет изменить командную оболочку, запускающуюся для него по умолчанию после того, как он войдет в систему, на программу, которая для этого не предназначена. Особенно проблематичными являются 51*ш?Й1рограммы, то есть программы, запускаемые при помощи действительного идентификатора пользователя, которому они принадлежат (подробнее об этом — в главе 13). Если setuid-программа принадлежит пользователю root, она может выполнять любое действие с привилегиями пользователя root; понятное дело, что совсем нежелательно, чтобы обычный пользователь мог получать эти привилегии, просто регистрируясь в системе. Командная оболочка пользователя указывается в базе данных пользователей /etc/master.passwd, в десятом поле соответствующей данному пользователю записи (или в седьмом поле в /etc/passwd). Например: /etc/master, passwd: btman:*:$l$LXZkCuzD$70a8LyRgbjYOb.XrXiBad.:1001:1001::999066364:0: ^Brian Tiemann: /home/btman: /usr/local/bin/ksh /etc/passwd: btman: *: 1001:1001::Brian Tiemann: /home/btman: /usr/local/bin/ksh Если указанная в этом поле оболочка (в данном примере это оболочка /usr/ local/bin/ksh) присутствует в файле /etc/shells, пользователю разрешается регистрироваться в системе, используя такие службы, как FTP. Если нет, пользователю в доступе отказывается. Также файл /etc/shells применяется для генерации списка доступных оболочек, которые могут назначаться пользователю во время процесса adduser, о чем более подробно будет рассказываться в главе 13. Каждый раз, когда вы устанавливаете командную оболочку из коллекции портов или пакетов, как описывалось выше, в файл /etc/shells автоматически добавляется соответствующая запись. Обратите внимание на то, что хотя изменять используемую по умолчанию командную оболочку на программу, не перечисленную в файле /etc/ shells, разрешено только администратору (то есть пользователю root), обычный пользователь все равно может входить в систему через оболочку, независимо от того, присутствует используемая им оболочка в файле /etc/shells или нет. База данных shells также отвечает за доступ к системе через FTP. Администраторы нередко допускают следующую ошибку: устанавливают командную оболочку не из коллекции портов или пакетов, а посредством какого-то другого метода (а в таком случае соответствующая запись в файл /etc/shells не добавляется) и затем просто "переключают" пользователя на эту новую оболочку (потому что администраторам разрешено это делать). После этого пользователь без проблем может подключаться к системе через Telnet или SSH, но при попытке получить доступ к системе через FTP он вдруг по какой-то непонятной причине получает отказ. Решить эту проблему можно, просто удостоверившись, что командная оболочка этого пользователя присутствует в файле /etc/shells. Поэтому, устанавливая командные оболочки, всегда используйте коллекцию портов или пакетов, это позволит вам быть уверенным в том, что оболочки устанавливаются корректно, и избежать подобных ошибок.
FreeBSD и командная строка Использование альтернативных командных оболочек Каждый пользователь может изменить назначенную ему по умолчанию командную оболочку в любое время. Существует масса причин, по которым он может захотеть сделать это. Может, он привык работать с Linux и, соответственно, с bash, как описывалось ранее, или перенес с другой системы уже настроенную среду, которая может работать только с определенными оболочками (подробнее об этом — далее в этой главе). Какой бы ни была причина, изменить командную оболочку в принципе легко. Замена командной оболочки во время сеанса работы Самый простой способ использовать альтернативную оболочку — эту запустить ее из существующей. Если вашей оболочкой по умолчанию является tcsh, а вы хотите воспользоваться bash (если конечно bash установлена в вашей системе), просто введите bash, чтобы запустить в своем сеансе tcsh сеанс новой оболочки bash, как показано ниже: # bash bash-2.04# Теперь, когда вы решите выйти из системы, вам придется сделать это дважды: то есть сначала вам придется выйти из процесса bash, а потом — из исходного процесса tcsh. Вы будете отключены от системы только тогда, когда завершите работу той оболочки, через которую подключались к системе. Замена командной оболочки, используемой по умолчанию Вам вполне может надоесть запускать вторую оболочку из оболочки по умолчанию после каждого входа в систему. Хотя вы можете сделать так, чтобы эта операция выполнялась автоматически, добавив соответствующую команду для второй оболочки в файл .login (этот файл представляет собой сценарий инициализации, который выполняется при запуске оболочке и будет подробнее описываться в разделе "Файлы оболочек tcsh и csh: . cshrc, . login и . logout" далее в этой главе), это все равно означает запуск одной оболочки внутри другой, что не особенно эффективно. К счастью, любой пользователь может поменять свою оболочку на любую другую программу из тех, что перечислены в файле /etc/shelis. Для выполнения этой задачи используется программа chsh (chsh расшифровывается как "change shell* ("сменить оболочку")). Эта программа ведет себя по-разному на разных платформах. На некоторых платформах, таких как Linux, chsh ведет себя как интерактивная утилита командной строки, которая приглашает вводить новые значения, одно за другим. В FreeBSD, однако, chsh ведет себя точно так же, как программа chpass, chfn и другие подобные утилиты для работы с учетными записями пользователей. Все они являются жесткими ссылками друг на друга и служат одной и той же цели. В обязанности chsh (и аналогичных ей программ) входит открытие сведений о пользователях в текстовом редакторе и предоставление возможности изменять значения в любых из доступных полей. В качестве текстового редактора по умолчанию используется редактор vi, однако это поведение можно переопределить, присвоив переменной среды EDITOR в качестве значения имя какой-нибудь другой программы,
Настройка командной оболочки 1 ГТГ 1 Глава 9 I I подобной ее или pico, например. (О переменных среды мы более подробно поговорим в следующем разделе.) Чтобы изменить свою собственную командную оболочку, введите chsh. Если вы являетесь пользователем root, вы можете изменить командную оболочку другого пользователя, просто указав в качестве аргумента имя этого пользователя. Например: # chsh frank #Changing user database information for frank. Shell: /bin/csh Full Name: Frank Allen Office Location: Office Phone: Home Phone: Other information: # chsh frank ^Изменение информации из базы данных для пользователя frank. Командная оболочка: /bin/csh Полное имя: Frank Allen Расположение офиса: Телефон офиса: Домашний телефон: Другая информация: Работа в vi является непростой задачей для новичка; по правилам использования этой программы написаны целые книги, хотя ее дизайн сложным никак не назовешь. Поэтому давайте пока что сконцентрируем внимание только на основных командах, которые вам будут нужны для изменения назначенной по умолчанию оболочки. Отчасти столь сложной для освоения программу vi делает тот факт, что ее внутренние команды являются такими запутанными и должны вводиться с такой предельной точностью, что в ней очень легко допустить ошибку, из-за которой важные данные могут быть случайно удалены, повреждены или стать просто недоступными. Если вы все-таки допустили ошибку, нажмите клавишу <Escape> и затем введите знак двоеточия (:) и q!, после чего нажмите клавишу <Enter>. Это позволит вам выйти из vi без сохранения изменений: Предположим, вы хотите сменить оболочку пользователя по имени Фрэнк (frank) навсегда с /bin/csh на /usr/local/bin/bash. Чтобы сделать это, введите chsh frank — появится экран vi. На этом экране с помощью клавиш с изображением стрелки переместите курсор в начало слова csh, поставив его непосредственно после второй косой черты (/). Вы не можете просто начать удалять и вводить текст; vi работает совсем не так. Вместо этого введите с (что означает "change" — "изменить"), а затем — w (что означает "word" — "слово"). В конце слова, которое вы хотите изменить, появится знак доллара ($): Shell: /bin/tcs$
I Г7Г | FreeBSD и командная строка II Часть III Далее на месте слова csh введите bash и нажмите клавишу <Esc>, чтобы выйти из режима изменения слов. После этого название командной оболочки должно выглядеть так: /bin/bash. Затем установите курсор после первой косой черты (/), то есть непосредственно перед словом bin, и введите команду i (i означает "insert"— "вставить"), чтобы курсор стал "рабочим". Затем введите /usr/local и нажмите клавишу <Esc>. После этого строка оболочки у вас должна выглядеть так: /usr/ local /bin/bash. Теперь введите знак двоеточия (:), чтобы перейти в командную строку программы, и затем введите команду w ("write" — "записать"). Нажмите клавишу <Enter>, чтобы сохранить файл. И, наконец, введите : q и нажмите клавишу <Enter>, чтобы выйти из программы. Файл, который вы только что записали, на самом деле является временным файлом и находится в каталоге /etc. Если ваши изменения являются допустимыми, они будут считаны из этого файла и автоматически добавлены в файлы /etc/ master .passwd и /etc/passwd. После этого каждый раз, когда данный пользователь будет входить в систему, использоваться будет не оболочка /bin/csh, а оболочка /usr/local/bin/bash. Использование других программ в качестве командных оболочек Существует возможность назначить пользователю в качестве командной оболочки программу, которая специально для этой цели не разрабатывалась; например, программы вроде /sbin/nologin не делают ничего, кроме того, что выводят какое-нибудь текстовое сообщение и завершают работу, тем самым не позволяя пользователю войти в систему (такие программы могут назначаться в качестве наказания для тех пользователей, которые нарушили правила пользования системой). Также пользователю может быть нужна программа, позволяющая работать в режиме командной строки не с файловой системой UNIX, а с какими-то другими службами (например, с игровым клиентским приложением TinyFugue). Кроме того, вы еще можете назначить пользователю в качестве командной оболочки какую-нибудь несуществующую программу, чтобы вообще исключить для него возможность входа в систему. Вы даже можете, если хотите, назначить пользователю в качестве командной оболочки такую программу, как /usr/bin/mail (это похожая на оболочку программа для чтения почты), хотя это означает, что этот пользователь сможет только читать почту и ничего более. С другой стороны, может быть, именно такую политику вы как раз и решили воплотить на своем сервере. Если вы укажете несуществующую командную оболочку, программа chsh отобразит соответствующее предупредительное сообщение, но, тем не менее, все равно послушно запишет ее в базу данных пользователей. В назначении пользователю в качестве командной оболочки какой-то несуществующей программы нет ничего неправильного; это лишь значит, что данный пользователь вообще не сможет войти в систему. Вы просто помните, что программа, назначаемая в качестве оболочки, работает следующим образом. • Если программа, назначенная в качестве оболочки, успешно запускается и подключается к pty (псевдотерминалу), пользователь проходит регистрацию, входит в систему и делает там все, что нужно до тех пор, пока не завершит работу оболочки и тем самым не отключится от pty.
Настройка командной оболочки Глава 9 311 • Если программа оболочки не запускается, к pty ничего не подключается, и командная строка перед пользователем не появляется. Вместо этого пользователю отображается сообщение об ошибке. В зависимости от терминальной программы, это сообщение об ошибке может выглядеть как сообщение о введении неправильного пароля или как сообщение об отказе протокола. В сеансе командной строки Telnet о возникновении ошибки может свидетельствовать явный отказ в выполнении программы оболочки после отображения нескольких регистрационных сообщений, как показано ниже: FreeBSD/i386 (simba.example.com) (ttyp2) login: frank Password: Last login: Sun Nov 13 23:38:17 from 172.21.17,1 Copyright (c) 1992-2005 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 6.0-RELEASE (GENERIC) #0: Thu Nov 3 09:36:13 UTC 2005 Welcome to the system! Today's news: nothing. You have mail. login: /usr/local/bin/foosh: No such file or directory Connection closed by foreign host. Добро пожаловать в системуI Сегодняшние новости: отсутствуют. Поступила новая почта. login: /usr/local/bin/foosh: такой файл или каталог не существует Доступ закрыт внешним хостом. Общие регистрационные сообщения, отображаемые FreeBSD перед запуском командной оболочки пользователя, можно изменять. Например, если у вас есть пользователь или группа пользователей, которые каким-либо образом нарушили установленные в системе политики (например, если они прибегали к технологиям взлома), вы можете запретить им доступ в систему, назначив им в качестве командных оболочек несуществующие программы и объяснив причину этих примененных к ним санкций в файле /etc/motd. Файл /etc/motd — это обычный текстовый файл, который система отображает в виде сообщения (почему его, кстати, как раз еще также называют сообщением дня) каждому пользователю сразу после того, как примет его пароль, но перед тем, как установит, является ли его командная оболочка действительной, как и было показано в приведенном выше примере. Соответствующим образом отредактировав этот файл в любом текстовом редакторе, вы сможете отобразить всем своим пользователям, включая тех, у кого оболочки являются недействительными, любую информацию, с которой им, на ваш взгляд, необходимо ознакомится при регистрации. НА ЗАМЕТКУ Из-за разнообразия методов получения доступа к системе UNIX, иногда для выполнения законных требований вы сможете, а иногда и не сможете использовать эту реализованную в виде файла /etc/motd систему извещения пользователей. Если по закону или согласно установленной политики вы обязаны уведомлять пользователей о внесении изменений в условия соглашения об использовании, такие как политики обеспечения конфиденциальности личной информации пользователей, мы вам настоятельно рекомендуем сделать так, чтобы ваша система извещения проходила проверку у адвоката.
I ГТГ I FreeBSD и командная строка II Часть III Существует еще один даже еще более удобный (и правильный) подход — назначить пользователю в качестве командной оболочки программу, которая является не командной оболочкой, а программой, выводящей информативные сообщения. /sb in /no login — это встроенная программа, которую вы можете указать в качестве командной оболочки пользователя, чтобы запретить ему регистрироваться в системе. Она представляет собой сценарий командной оболочки и делает следующее: выводит одно единственное сообщение и завершает работу. Это сообщение является достаточно коротким и милым: You have mail. This account is currently not available. Connection to simba.example.com closed. Поступила новая почта. Данная учетная запись на текущий момент недоступна. Доступ к simba.example.com закрыт. Обратите внимание на то, что программа /sbin/nologin успешно запустилась, подключилась к pty, должным образом завершила работу и освободила pty. Тот факт, что она не отображает никакой интерактивной командной строки, вовсе не делает ее менее подходящей для применения в качестве командной оболочки. Такой метод отключения учетной записи будет работать с любой терминальной программой, как если соединение устанавливается через терминал, так и если оно устанавливается через SSH, и к тому же он не подразумевает отображение ни предупредительных сообщений, ни сообщений об ошибках, что делает его очень элегантным и гибким. На самом деле, в качестве командной оболочки может назначаться любая программа, независимо от того, является она интерактивной или ист. Вы можете сделать своей командной оболочкой программу /bin/Is или /usr/bin/finger, если хотите. Что даже еще более удобно, вы можете создать свой собственный сценарий или программу и сделать так, чтобы она выполнялась при регистрации в системе какого-то определенного пользователя. Таким образом, вы можете настроить в своей системе интересные службы, например, систему типа "библиотеки*, в которой гости смогут регистрироваться и работать с меню, выполнять определенные команды или просто читать какую-нибудь отображаемую на экране полезную информацию. Перед вами открываются практически бесконечные возможности. ВНИМАНИЕ! Нельзя не предупредить о следующем: если вы решили написать на языке С или каком-нибудь другом языке обработчик регистрации с целью предоставления каких-то специальных служб, подразумевающих выделение пространства под буфер, не забывайте о том, что буферы могут переполняться и чем это грозит! Подобные уязвимые в плане безопасности места наиболее часто встречаются в сетевых службах; если злонамеренному пользователю удастся отыскать и воспользоваться возможностью переполнения буфера в программе, которую вы разработали самостоятельно, и если окажется, что ее еще и каким-то образом можно заставить выполнить исполняемый код от имени пользователя root (например, если это программа setuid и ее владельцем является пользователь root), он без труда проникнет в вашу систему. Будьте очень внимательны и осторожны в этом вопросе, и обязательно изучайте все приемы безопасного программирования, прежде чем приступать к написанию специализированной программы для обработки входящих соединений.
Настройка командной оболочки Файлы инициализации командной оболочки Настало время рассказать о том, как вы можете настроить свою командную оболочку так, чтобы она делала то, что вы хотите. Вы можете создать псевдонимы, чтобы упростить имена некоторых наиболее часто используемых вами команд, вы молсете заставить определенные программы запускаться автоматически при каждом вашем входе в систему, вы можете присвоить нужные значения различным переменным, вы можете сделать еще много чего другого. Все эти задачи выполняются в файлах инициализации и конфигурации командной оболочки, которые существуют как на глобальном уровне, так и на уровне отдельных пользователей. Поскольку tcsh и bash имеют абсолютно разные наборы конфигурационных файлов, мы будем рассматривать их по очереди. FreeBSD поставляется с общесистемными и пользовательскими конфигурационными файлами как для tcsh, так и для bash, так чтобы с tcsh на bash можно было переключаться и на уровне системы, если в этом возникнет особая необходимость (хотя, сказать по правде, такая необходимость не возникает практически никогда). НА ЗАМЕТКУ Когда создается новый пользователь, конфигурационные файлы командной оболочки, назначаемой по умолчанию, копируются из каталога /usr/share/skel (префикс dot, присутствующий в имени каждого из этих файлов, при этом опускается) в домашний каталог нового пользователя. Если вы хотите, можете скопировать эти создаваемые по умолчанию файлы в каталог /usr/local/share/skel, внести в них необходимые изменения и затем модифицировать файл /etc/adduser .conf так, чтобы скопировать их уже из этого нового места. Используйте эту технологию для внесения глобального, вытесняющего изменения в конфигурации оболочек по умолчанию всех пользователей еще до их создания. Файлы оболочек tcsh и csh: . cshrc, . login и . logout При запуске tcsh (и csh) первым просматривает общесистемный конфигурационный файл /etc/csh.cshrc, а сразу после него — пользовательский конфигурационный файл /etc/csh. login. Обратите внимание на то, что в FreeBSD существуют оба этих файла, но их содержимое закомментировано (листинг 9.1). Листинг 9.1, Глобальные файлы /etc/csh.cshrc и /etc/csh. login # cat /etc/csh. cshrc # $FreeBSD: src/etc/csh.cshrc,v 1.3 1999/08/27 23:23:40 peter Exp $ # # Общесистемный файл .cshrc для csh(l) . # cat /etc/csh. login # $FreeBSD: src/etc/csh.login,v 1.21 2004/06/06 11:46:27 schweikh Exp $ # # System-wide .login file for csh(l) . # Общесистемный файл .login для csh (1) . I Uncomment this to give you the default 4.2 behavior, where disk # information is shown in K-Blocks # Удалите комментарий, чтобы получить поведение 4.2 по умолчанию, # когда информация о дисках показывается в К-блоках # setenv BLOCKSI2E К
Т7Т I FreeBSD и командная строка Часть III # # For the setting of languages and character sets please see # login.conf(5) and in particular the charset and lang options. # For full locales list check /usr/share/locale/* # Для настроек языков и наборов символов, пожалуйста, смотрите # login.conf (5) и, в частности, опции charset and lang, # Для просмотра полного списка региональных настроек см. /usr/share/locale/* # # Read system messages # Читать системные сообщения # msgs -f # Allow terminal messages # Разрешить терминальные сообщения # mesg у Приведенный листинг показывает, что эти конфигурационные файлы в принципе ничего не делают, однако могут, если вы того захотите. Любое вносимое в них изменение типа активизации строки mesg у (которая отвечает за терминальные сообщения) применяется глобально (то есть, как минимум, ко всем пользователям, запускающим csh или tcsh). Оно может быть переопределено, только если в конфигурационных файлах отдельных пользователей, которые работают так же, как и общесистемные конфигурационные файлы, и считываются из домашнего каталога пользователя сразу же после них (например, файл . login считывается сразу же после файла .cshrc), будет задано какое-то другое поведение. Создаваемый по умолчанию файл .cshrc, который расположен в каталоге /usг/ share/skel/dot.cshrc, делает ряд в целом очень полезных вещей для настройки среды командной оболочки. Например, он создает несколько псевдонимов для сокращения названий команд: alias h history 25 alias j jobs -1 alias la Is -a alias If Is -FA alias 11 Is -1A Также он определяет путь поиска для программ: set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin Vusr/local/bin /usr/XHR6/bin $HOME/bin) А еще в нем устанавливаются значения для различных переменных среды, которые отвечают за поведение командной оболочки при выполнении тех или иных задач: setenv setenv setenv EDITOR PAGER BLOCKSIZE vi more К В нем также задаются и некоторые другие вещи. Чтобы увидеть их все, вы можете просто открыть файл . cshrc, находящийся в вашем домашнем каталоге. Файл .login, который считывается следующим, представляет собой место, где пользователь может указать все программы, которые должны запускаться автоматически каждый раз, когда он будет входить в систему. Например, в файле . login, копируемом по умолчанию из каталога /usr/share/skel/dot. login, в виде прове
Настройка командной оболочки I 771 I Глава 9 I 3 I рочного условия указана программа fortune, так что каждый раз, когда пользователь входит в систему, ему отображается какая-нибудь выбираемая наугад шутка или полезный совет касательно возможностей FreeBSD: [ -х /usr/games/fortune ] && /usr/games/fortune freebsd-tips Кроме того, и администратор, и обычный пользователь могут делать так, чтобы и при завершении сеанса работы с системой выполнялись определенные команды. Например, вы могли бы написать сценарий, удаляющий из каталога /tmp все временные файлы, владельцем которых является определенный пользователь, и захотеть, чтобы он выполнялся каждый раз, когда этот пользователь будет выходить из системы; для этого вам нужно было бы просто поместить вызов этого сценария в файл /etc/csh. logout, который в своем исходном виде не имеет никакого существенного содержимого: # cat /etc/csh.logout # $FreeBSD: src/etc/csh.logout,v 1.3 1999/08/27 23:23:41 peter Exp $ # # System-wide .logout file for csh(l). To есть, при выходе пользователя из системы также будет считываться и находящийся в его домашнем каталоге файл . logout, если он существует, но по умолчанию такой файл для каждого пользователя в отдельности не создается. НА ЗАМЕТКУ Показанные в этом разделе файлы считываются tcsh, когда она запускается в качестве назначенной по умолчанию пользователю командной оболочки. Существуют и многие другие случаи, в которых может запускаться tcsh: например, она может запускаться и как не имеющая отношения к пользователю оболочка для выполнения какого-нибудь сценария оболочки С и, следовательно, вызываться из строки интерпретатора этого сценария. При таких обстоятельствах, файлы . login и .logout (так же, как и их общесистемные эквиваленты) конечно же игнорируются. Файлы bash: .profile, . shrcM .bash_logout Если вы решили использовать в качестве командной оболочки не tcsh, a bash, она будет работать практически тем же самым образом: сначала она будет считывать общесистемные конфигурационные файлы и файлы инициализации, а затем переходить к уже непосредственно конфигурационным файлам пользователей. Первым идет файл /etc/profile, который (как и файл /etc/csh.cshrc) не содержит никакой существенной информации, кроме нескольких примеров опций, которые вы можете захотеть активизировать (листинг 9.2). Листинг 9.2. Глобальный файл /etc/profile # cat /etc/profile # $FreeBSD: src/etc/profile,v 1.14 2004/06/06 11:46:27 schweikh Exp $ I # System-wide .profile file for sh(l) . # Общесистемный файл .profile для sh(l). f f Uncomment this to give you the default 4.2 behavior, where disk # information is shown in K-Blocks
316 FreeBSD и командная строка Часть III # Удалите комментарий, чтобы получить поведение 4.2 по умолчанию, # когда информация о дисках показывается в К-блоках # BLOCKSIZE=K; export BLOCKSIZE # # For the setting of languages and character sets please see # login.conf(5) and in particular the charset and lang options. # For full locales list check /usr/share/locale/* # You should also read the setlocale{3) man page for information # on how to achieve more precise control of locale settings. # Для настроек языков и наборов символов, пожалуйста, смотрите # login, conf (5) и, в частности, опции charset and lang. # Для просмотра полного списка региональных настроек см. /usr/share/locale/* # Можете также обратиться к man-странице setlocale (3) за информацией # о том, как более точно управлять региональными настройками» # # Read system messages # Читать системные сообщения # msgs -f # Allow terminal messages # Разрешить терминальные сообщения # mesg у Обратите внимание на то, что файл /etc/profile объединяет в себе функциональные возможности файлов /etc/csh. cshrc и /etc/csh. login. Он является единственным глобальным файлом bash в системе; отдельного глобального файла со сценарием выхода из системы для bash не существует. Следующим файлом для bash является пользовательский файл .profile, который в первую очередь устанавливает значения для различных переменных среды (для переменной PATH включительно) и экспортирует их в стиле командной оболочки Bourne: # remove /usr/games and /usr/XHR6/bin if you want # если хотите, удалите /usr/games и /usr/XHR6/bln PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/bin: ^/usr/XHR6/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 # serial line. # Use cons2511 for iso-* fonts # Настройка TERM обычно выполняется через /etc/ttys. Переопределяйте, # только если уверены, что никогда не будете входить в систему через # telnet, xterm или последовательный канал. # Используйте cons2511 для шрифтов iso-* # TERM=cons25; export TERM BLOCKSIZE=K; export BLOCKSIZE EDITOR=vi; export EDITOR PAGER=more; export PAGER # set ENV to a file invoked each time sh is started for interactive use, # установка ENV на файл, который вызывается при каждом запуске sh # для интерактивного использования. ENV=$HOME/.shrc; export ENV [ -х /usr/games/fortune ] && /usr/games/fortune freebsd-tips
Настройка командной оболочки | T7Z I Глава 9 I I В предпоследней строке переменной ENV в качестве значения присваивается файл . shrc, который также расположен в домашнем каталоге пользователя. Он счи- тывается следом за файлом .profile и, подобно файлу .cshrc, отвечает за создание псевдонимов для команд и выполнение ряда других задач вроде настройки отображаемого оболочкой приглашения на ввод команды, которые по умолчанию имеют в нем закомментированный вид: # some useful aliases # некоторые полезные псевдонимы alias h-'fc -l' alias j=jobs alias m=$PAGER alias 11='Is -laFo' alias l='ls -1' alias g='egrep -i' # # be paranoid # # будьте параноиком # alias cp=*cp -ip' # alias mv='mv -i' # alias rm=' rm -i' # # set prompt: чNusername@hostname$ ¦ ' # # установка подсказки: ч>username@hostname$ ' ' # PS1=" 4whoami4(Гhostname | sed 's/\ ..*//' 4" # case *id -u% in # 0) PS1="${PS1}# ";; # *) PS1="${PS1}$ ";/ # esac # search path for cd(l) # путь поиска для cd(l) # CDPATH=.:$HOME Как и tcsh, которая читает файл .logout, bash будет считывать и выполнять файл .bashlogout, если он есть (но по умолчанию такой файл, опять-таки, не создается). Эта возможность была создана скорее для удобства пользователей, чем для безопасности администраторов; есть много способов, с помощью которых пользователь может выйти из командной оболочки, и нет никакой гарантии, что сценарий выхода из системы будет выполняться правильно в каждом из них. НА ЗАМЕТКУ Показанные в этом разделе главы файлы используются bash как "исходные" (то есть считываются ею как конфигурационные файлы), если она запускается в качестве используемой по умолчанию командной оболочки пользователя. Однако если bash запускается для какой-нибудь другой цели, она считывает не файл .profile, а файл .bashrc. Этого файла в FreeBSD обычно не существует. Настройка среды командной оболочки Вы уже увидели несколько примеров (как для tcsh, так и для bash) того, как можно настроить поведение командной оболочки с помощью предлагаемых по умолчанию параметров и опций в ее конфигурационных файлах. Они также являются и
FreeBSD и командная строка прекрасными примерами того, как можно расширить функциональные возможности своей командной оболочки. Однако есть еще несколько вещей, которые вы можете сделать сами. К тому же, некоторые из доступных опций просто не совсем понятно продемонстрированы в файлах по умолчанию. В этом разделе мы расскажем о том, какие еще способы существуют для настройки tcsh и bash. В большинстве случаев они представляют собой команды, которые могут выполняться либо из командной строки, либо из какого-нибудь из конфигурационных файлов оболочки. НА ЗАМЕТКУ 1 Полную информацию обо всех доступных встроенных командах (одни из которых доступны только в csh/tcsh, другие — только в sh/bash, а третьи — и там, и там) можно найти в руководстве, воспользовавшись командной man builtin. Настройка tcsh В следующих разделах будут описываться некоторые наиболее популярные технологии настройки пользовательской среды, доступные для пользователей tcsh. Создание псевдонимов Наиболее популярной технологией настройки командной оболочки является создание псевдонимов. Эта технология подразумевает замену первого слова команды любой необходимой командной строкой. Псевдонимы могут существенно облегчить работу, особенно когда речь идет об определенных сложных командах, которыми вам приходится пользоваться регулярно. Пример самого простого псевдонима можно найти в файле .cshrc: alias 11 Is -1А Этот псевдоним, как вы, наверное, уже догадались, заменяет команду типа 11 /usr/local командой Is -1А /usr/local. Но что если вы хотите также заменить и аргументы, чтобы не вводить их полностью каждый раз? Вы можете сделать это при помощи очень богатого и в то же время очень компактного синтаксиса tcsh для командной строки. Он очень подробно описывается на соответствующей странице руководства (man tcsh), но для цели, которая преследуется здесь, вам будет достаточно просто знать, что на первый аргумент команды в псевдониме можно сослаться с помощью элемента \ !: 1, а на все остальные — соответственно, с помощью \! :2, \!: 3 и так далее. Следовательно, вы можете создать такой псевдоним: alias lookup grep \!: 1 /etc/passwd Это позволит вам извлекать информацию о пользователях, применяя команды типа lookup frank. Команда unalias позволяет удалить псевдоним, как показано ниже: unalias lookup Настройка приглашения оболочки Вы можете настроить приглашение оболочки, просто установив подходящее значение для переменной оболочки prompt. Вы можете включить в него вывод любой
Настройка командной оболочки I ГТГ | Глава 9 I I команды, например, такой как команда hostname или pwd, заключив ее в так называемые "левые кавычки" (ч v), так же как это делается в сценариях Perl. Кроме того, можно сделать так, чтобы в нем отображалось значение переменной "номер команды", отражающей номер, под которым данная команда следует в файле хронологии оболочки, при помощи символа !. Показанный ниже пример является достаточно сложным, но зато он демонстрирует использование всех этих приемов, а также применение sed ("stream editor" — "редактор потоков"; текстовый процессор, обрабатывающий передаваемый ему текст в неинтерактивном режиме) для сокращения вывода команды hostname до его цервого элемента: # set prompt»"{4whoamiN@4hostname | sed xs/\. .*//'ч:! > " {root@www:23} Переменная оболочки prompt также может отражать наименование текущего каталога, для этого ей в качестве значения следует присвоить команду pwd ("present working directory" — "текущий рабочий каталог"): # set prompt»" { 4pwd% : !} " {/usr/local/etc:24} Обратите внимание на то, что в этих примерах были показаны команды, выполняемые прямо в самой командной строке оболочки для того, чтобы вы сразу могли увидеть, как они влияют на ее внешний вид; если команду set prompt включить в файл .cshrc, изменения можно будет увидеть только при следующем входе в систему. Настройка пути команд Путь команд (command path) — это перечень мест, в которых tcsh должна искать программы, имена которых вводятся в виде команд. Настройка пути команд в tcsh подразумевает присвоение переменной оболочки path (подробнее о переменных оболочки и переменных среды будет рассказываться чуть позже в этой главе) в качестве значения массива, представляющего собой заключенный в скобки список каталогов всех команд. Добавлять элементы "на лету" в этот окруженный скобками массив нельзя. Это следует делать следующим образом: добавить новый элемент, а затем снова выполнить всю команду set целиком. Вот почему путь лучше задавать в каком-нибудь из конфигурационных файлов, а не в командной строке. Согласно правилам синтаксиса, наименования каталогов следует заключать в скобки, разделяя их символами пробела. Ниже показан пример оператора set path, который добавляет в путь команд некий гипотетический каталог /usr/local/mystuff: set path - (/sbin /usr/sbin /bin /usr/bin /usr/local/bin /usr/contrib/bin Wusr/XllR6/bin /usr/local/sbin /usr/games . /usr/local/mystuff) Настройка раскладки символов stty — это еще одна полезная встроенная команда. Она позволяет изменять раскладку символов и может вам очень пригодиться в случае, если программа терминала отправляет вашим программам какие-то неожиданные символы. Чаще всего подобная проблема возникает из-за путаницы между символами удаления (<Delete>) и возврата (<Backspace>) или в символах, которые используются в качестве разделителя строк. Первое, что нужно сделать — это посмотреть, как раскладка символов выглядит сейчас:
FreeBSD и командная строка ^ Часть III " # stty -a speed 38400 baud; 60 rows; 80 columns; Iflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo -extproc iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -ignbrk brkint -inpck -ignpar -parmrk oflags: opost onlcr -ocrnl -oxtabs -onocr -onlret cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow -dtrflow -mdmbuf cchars: discard = A0; dsusp = AY; eof = AD; eol = <undef>; eol2 = <undef>; erase = л?; intr = ЛС; kill = AU; lnext = AV; min = 1; quit = A\; reprint = AR; start = AQ; status = AT; stop = AS; susp = AZ; time = 0; werase = AW; Обратите особое внимание на список cchars, в котором отображаются клавиатурные комбинации для определенных команд терминала. Далее, если вы хотите, например, чтобы символ удаления (erase) отображался как АН (<Ctrl+H>), используйте следующую команду: stty erase AH Другие полезные советы по настройке tcsh Пользователям систем с общим доступом может пригодиться так называемый режим наблюдения (watch). После того, как вы войдете в систему, этот механизм будет информировать вас о том, кто еще подключен к системе. Чтобы активизировать его, используйте следующую строку в файле . cshrc: set watch=(l any any) set who="%n has %a %1 from %M." Кроме того, вы, скорее всего, захотите отключить в tcsh переменную autologout, которой по умолчанию присваивается значение, равное 60 минутам. Эта переменная разрывает соединение, если терминал находится в бездействии более часа. Отключить переменную autologout довольно просто, нужно просто добавить в конфигурационный файл следующую строку: unset autologout; И, наконец, если для присваивания значений переменным, отвечающим за поведение оболочки, вы будете использовать соответствующие конфигурационные файлы сценариев (а не командную строку), вам не придется отключаться и снова регистрироваться в системе для того, чтобы изменения вступили в силу; вместо этого вы сможете просто воспользоваться встроенной командной rehash, которая выполняет принудительное считывание всех конфигурационных файлов. Настройка bash В следующих разделах будут описываться некоторые наиболее популярные технологии настройки пользовательской среды, доступные для пользователей bash. Создание псевдонимов Псевдонимы в bash работают не совсем так, как в t;csh. Псевдоним и строка, которую он заменяет, отделяются друг от друга знаком равенства, а не пробелом или 320
Настройка командной оболочки I ТГ^ I Глава 9 I I символом табуляции. Кроме того, в bash нет механизма, позволяющего заменять аргументы, как в tcsh, поэтому псевдоним lookup, который мы создали в tcsh, создать в bash без многочисленных дополнительный усилий не получится. Ниже показан пример простого псевдонима в стиле bash, который может быть помещен в файл .profile: alias 11-'Is -laFo' Настройка приглашения оболочки Настройка приглашения оболочки в bash может оказаться очень интересным делом. Поскольку переменные оболочки в bash не реализованы таким же логическим образом как в tcsh, лучшее, что можно сделать — это создать соответствующие переменные среды (например, PS1 и PS2), из них командная оболочка как раз будет считывать подлежащие отображению строки. Сделать так, чтобы в приглашении отображался электронный адрес, как было в примере с tcsh, в bash можно при помощи такого кода (обратите внимание на стоящий перед символом ! символ обратной косой черты; в bash он не имеет такого специального значения, как в tcsh): # PSl="{4whoajni4e%hostname | eed 4s/\. .*//'* :\! > " {root@www:17} Сделать так, чтобы в приглашении отображалось имя текущего рабочего каталога, можно, соответственно, с помощью такого кода: # PSl="{4pwd4:\!} " {/root:18} Для того чтобы эти команды, изменяющие внешний вид приглашения оболочки, выполнялись каждый раз, когда вы будете входить в систему, не забудьте поместить их в файл .profile. Настройка пути команд Установка пути команд в bash предполагает присваивание значения переменной среды PATH. В этом контексте путь представляет собой строку со списком имен каталогов, которые отделены друг от друга знаком двоеточия; в файле .profile, который создается по умолчанию, эта строка используется вместе с оператором export для публикации переменной PATH в среде: PATH=/sbin: /bin: /usr/sbin: /usr/bin: /tier/games: /usr/local/bin : Vusr/XllR6/bin:$HOME/bin; export PATH Чтобы добавить в путь какие-нибудь каталоги, сначала разделите команды на три отдельных строки, как показано ниже: PATH=/sbin; /bin: /usr/sbin: /usr/bin: /us r /games: /usr/local/bin: Vusr/XllR6/bin:$H0ME/bin PATH=$PATH:/usr/local/mystuff export PATH Это позволит вам быть уверенными в сохранности и правильном изменении стандартного, исходного пути, а также отдельно работать с изменениями, которые вы вносите в путь собственноручно. О необходимости в экспортировании переменных речь пойдет в следующем разделе.
I ГГГ I FreeBSD и командная строка I 3ZZ I ЧаетПИ Переменные среды и переменные оболочки Одно из главных отличий между tcsh и bash заключается в способе, которым каждая из них обрабатывает переменные. Существуют два вида переменных, с которыми можно работать: переменные оболочки и переменные среды (они подробно будут рассматриваться в главе 10). Давайте посмотрим, чем они отличаются и где используются. Переменные среды Какой бы командной оболочкой вы не пользовались, у вас всегда есть переменны среды (переменные, содержащие значения, которые "путешествуют" с вами на протяжении всего сеанса работы и передаются всем программам, которые вы запускаете в этом сеансе). Переменные среды обусловливают поведение определенных запускаемых вами программ. Например, программа chf n запускает текстовый редактор, указанный в переменной среды EDITOR, а переменная TERM указывает командной оболочке, как отформатировать текст, чтобы он корректно отображался на экране. Переменная BLOCKS IZE отвечает за то, в каких единицах измерения будет отображаться вывод таких команд, как du и df (в килобайтах, половинках килобайтов или в чем-то другом). Программа вовсе не обязательно должна являться рабочей (то есть используемой по умолчанию) командной оболочкой, чтобы иметь доступ к переменным среды: каждая программа имеет доступ к тому же набору переменных, что и программа, вызвавшая ее. Какой бы ни была ваша командная оболочка, вы можете просмотреть все переменные среды, воспользовавшись командой printenv, как показано в листинге 9.3, Листинг 9.3. Пример вывода команды printenv # printenv PATHN/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:/usr/contrib/bin: 4>/usr/XllR6/bin:. MAIL=/var/mail/btman BLOCKSIZE=lk FTP_PASSIVE_MODE=YES USER=btman LOGNAME^btman HOME=/home/btman SHELL=/bin/tcsh SSH_CLIENT=192.168.173.230 50095 22 SSH_TTY=/dev/ttypO TERM=vtl00 HOSTTYPE=FreeBSD VENDOR^intel OSTYPE=FreeBSD MACHTYPE=i386 SHLVL=1 PWD-/home/btman GROUP=users HOST=simba.example.com REMOTEHOST=192.168.173.230 PATHSET=true EDIT0R=vi VISUAL=pico
Настройка командной оболочки Переменные среды не следуют никаким непреложным правилам; они представляют собой абсолютно традиционные переменные, которые предположительно должна суметь прочитать любая программа, такие как переменные USER и PATH, но вы можете создать любую переменную, какую захотите, и присвоить ей любое произвольное значение для любой нужной цели. Чтобы установить значение для переменной из оболочки, вы можете использовать синтаксис одного из двух видов, в зависимости от того, о какой оболочке идет речь. Например, чтобы установить для воображаемой переменной COLOR значение gold в tcsh, введите следующую строку: # setenv COLOR gold Чтобы сделать то же самое в bash, вы должны сначала установить значение для этой переменной в локальном контексте сеанса, а затем экспортировать ее в среду оболочки, как показано ниже: # COLOR=gold # export COLOR Обратите внимание, что переменная среды должна обязательно иметь какое-нибудь значение: она не может просто существовать в среде с нулевым или неопределенным значением. Переменные оболочки Помимо переменных среды, во время рабочего сеанса также будут доступны и другие переменные, из другого, отдельного набора. Эти переменные, называемые переменными оболочки, применяются только к текущему сеансу и не влияют ни на какие другие процессы. Они понятны только одному процессу оболочки. Если говорить на языке программистов, переменные оболочки существуют в "локальном* контексте, в то время как переменные среды существуют в "глобальном" контексте и могут наследоваться другими программами. Переменные оболочки в tcsh традиционно обозначаются строчными буквами, а в bash — заглавными, но это не является обязательным условием. Просмотреть переменные оболочки можно с помощью команды set. Значения переменным оболочки в tcsh тоже присваиваются, как ни удивительно, с помощью команды set. Переменную оболочки можно установить в tcsh, и не присваивая ей значения: # set history=100 # set noclobber В bash вы просто устанавливаете переменную, не экспортируя ее: # VISUAL=pico Команда unset позволяет удалить переменную оболочки, как показано ниже: # unset auto logout О переменных оболочки и среды, а также о том, каким образом их свойства наследования применяются при создании сценариев для оболочки, более подробно будет рассказываться в главе 10, посвященной гораздо более сложной теме: технологиям написания программ оболочки.
ГЛАВА Программирование в командной оболочке В этой главе... • Зачем нужно уметь программировать на языке оболочки • Простая программа оболочки • Переменные • Взаимодействие с пользователем • Арифметические операции в программах оболочки • Циклы • Условные операторы • Значение состояния завершения • Функции ф Дескрипторы файлов • Отладка сценариев оболочки • Дополнительные возможности, доступные для программирования в оболочке Когп о
FreeBSD и командная строка Часть III В главе 8 было показано, как можно управлять командной оболочкой интерактивно из командной строки. Для обычного пользователя командная оболочка выглядит просто как командная строка, в которой он может вводить команды и запускать другие более крупные и более полезные программы. Но вы могли не осознать того, что в оболочку встроен мощный язык программирования, и что, находясь в командной строке оболочки, вы фактически находитесь в середине "программы", которую вы сами же и пишете, строка за строкой, при помощи каждой команды, которую вводите. А это значит, что вы можете написать целый сценарий оболочки (который, возможно, представляете себе как "командный файл", хотя сценарии оболочки являются куда более мощными), полный команд, которые вам в противном случае приходилось бы вводить вручную, и тем самым создать программу, которую вы затем сможете запускать по своему усмотрению. Программированием на языке оболочки можно пользоваться для всего, начиная от автоматизации выполнения повторяющейся последовательности команд и заканчивая написанием сложных интерактивных программ, обрабатывающих текстовые данные для хранения и извлечения информации в простых базах данных. Модульная структура операционной системы FreeBSD позволяет вызывать из программы оболочки любую команду FreeBSD. Кроме того, если подходящую команду в FreeBSD найти не удается, можно объединить несколько команд в одной строке, то есть создать так называемый конвейер и тем самым получить новую команду, которая будет делать именно то, что нужно. Как еще будет рассказываться в этой главе, конвейеры берут выходные данные одной команды и используют их в качестве входных данных для другой команды. В FreeBSD имеются сотни таких модульных команд, каждая из которых выполняет пусть небольшую, но зато очень конкретную задачу. В этой главе мы покажем, как можно написать простую программу оболочки и как при программировании в оболочке используются переменные, арифметические операции и циклы. Мы также расскажем о применении условных операторов, дескрипторов файлов и других дополнительных технологий программирования оболочек для выполнения в FreeBSD разнообразных важных задач. Программы оболочки предлагают команды для выполнения поиска в текстовых файлах, объединения текста из двух файлов в один единственный файл, форматирования текста в столбцах, "вырезания" только определенных полей из текстовых файлов, подсчета количества символов, слов и строк в файле, выполнения математических операций, создания резервных копий файлов, архивирования и разархи- вирования файлов и многого другого. Если вам не удается найти ни команды, ни конвейера, который бы делал то, что вам нужно, вполне возможно, что вы сможете найти подходящую бесплатную программу в Internet и воспользоваться ею в своей программе оболочки. А все наиболее важные технологии, необходимые для извлечения максимальной пользы из программирования на языке оболочки, вы сможете найти здесь, э этой главе. Зачем нужно уметь программировать на языке оболочки Программированию на языке оболочки нередко предпочитают написание сценариев на языке Perl или каком-нибудь другом интерпретируемом языке, и рассматривают его просто как "разрекламированную" версию программирования командных 326
Программирование в командной оболочке Глава 10 327 файлов в DOS, но как администратор системы UNIX, вы обнаружите, что умение писать и интерпретировать сценарии оболочки является действительно очень полезным навыком. В самом простом своем виде программирование на языке оболочки действительно напоминает программирование командных файлов в DOS тем, что может применяться для выполнения хранящейся в файле последовательности команд, которые также могли бы выполняться и из командной строки! Однако программы оболочки могут быть куда гораздо более гибкими и сложными, чем простая пакетная программа DOS и, более того, создание сценариев на языке оболочки имеет несколько определенных уникальных преимуществ даже по сравнению с созданием сценариев на таких языках, как Perl и С. Ниже перечислены семь главных причин, по которым каждый пользователь FreeBSD должен научиться программировать на языке оболочки. • Язык оболочки прост для изучения. Если вы работаете с командной строкой FreeBSD регулярно, вы наверняка уже знакомы со многими из тех команд, которые можно применять в программах оболочки. • Программу оболочки, выполняющую нужную задачу, в большинстве случаев можно написать за 5-10 минут, в то время как написание аналогичной программы на языке С или каком-то другом языке программирования может занять несколько часов или даже дней. • Создавая программы оболочки, можно сэкономить массу времени и сил. Например, зачем обрабатывать 100 текстовых файлов вручную, чтобы внести одно единственное изменение, когда можно написать программу оболочки с циклом for, которая сделает это автоматически? • Программируя на языке оболочки, можно научиться многим новым и более эффективным способам работы с FreeBSD. Делая это, вы обнаружите немало полезных команд, о существовании которых вы и не подозревали, а также путей решения различных задач, о которых иначе вы никогда бы и не узнали. Возможно, вы даже полюбите командную строку FreeBSD больше, чем графический интерфейсе XII или, скажем, Windows. Зачем тратить деньги на покупку новой программы, выполняющей определенную задачу, когда добиться выполнения этой задачи можно, и просто объединив несколько команд FreeBSD вместе в конвейер? • Не нравится, как работает существующая команда? С помощью языка оболочки вы можете написать новую команду, потратив на это всего лишь несколько минут. Одной из вещей, которая делает систему FreeBSD такой мощной, является лежащая в ее основе философия, которая гласит: "делай все так, как тебе хочется". Существует множество способов добиться одного и того же результата и все они по-своему хороши. • Язык оболочки, пожалуй, идеально подходит для изучения в качестве первого языка программирования, потому что он позволяет сконцентрироваться на изучении логики программирования и других ключевых технологиях, работая с уже знакомыми командами, которые мгновенно предоставляют нужные результаты. • Умение программировать на языке оболочки — это навык, одинаково полезный везде в мире UNIX, поэтому он вам пригодится не только при работе с FreeBSD, но и при работе с Linux, Solaris, Mac OS X и любой другой системой типа UNIX.
FreeBSD и командная строка Более того, некоторые из наиболее важных компонентов FreeBSD фактически представляют собой сценарии оболочки, среди них сценарии конфигурации ресурсов, которые находятся в каталоге /etc, и сценарии запуска и остановки, которые находятся в файле /usr/local/etc/red и отвечают за выполнение сторонних программ-демонов (подробнее о них будет рассказываться в главе 14). Наличие знаний в области программирования на языке оболочки позволит вам понимать, как работают эти сценарии и, следовательно, принимать более грамотные решения в случае возникновения проблем с конфигурацией системы. Умение программировать на языке оболочки можно сравнить с домкратом в багажнике машины: большую часть времени он просто валяется там, занимая место. Но когда вы вдруг прокалываете колесо, вы очень рады тому, что не поленились и положили его туда. Вам самим же выгодно потратить время на изучение командной оболочки, того, как она интерпретирует команды, как передает выходные данные одной команды по конвейеру, чтобы использовать их в качестве входных данных для другой команды, а также на изучение сотни специализированных команд FreeBSD, которые могут вам пригодиться для создания новых команд, когда вы будете писать свои собственные сценарии оболочки. Начать этот процесс изучения вы можете с рассмотрения простой программы оболочки, что вас и ждет в следующем разделе. НА ЗАМЕТКУ В первой части этой главы будут описываться команды, доступные во всех оболочках Bourne-типа, а во второй — усовершенствованные функциональные возможности командных оболочек Кот и POSIX, используемые в FreeBSD. Если вам необходимо написать программы оболочки, которые будут запускаться в других системах, и какие командные оболочки будут доступны там, вы точно не знаете, лучше применяйте команды, доступные во всех командных оболочках Bourne. Если вы этого не сделаете, может оказаться так, что ваши программы просто не будут работать в других системах, потому что в них установлена командная оболочка Bourne более старой версии. НА ЗАМЕТКУ Технологии написания сценариев на языке оболочки С в этой главе рассматриваться не будут. Хотя писать сценарии оболочки, используя оболочку С, можно, ее синтаксис программирования является гораздо более ограниченным, чем несовместимый синтаксис, применяемый в оболочках в стиле Bourne, и в нем нет многих очень полезных для сценариев оболочки функциональных возможно- стей (вроде функций и возможностей переадресации stdout и stderr). Если для входа в систему вы используете оболочку С (csh или tcsh), но знаете, что будете часто заниматься разработкой сценариев и программ оболочки, вам лучше переключиться на bash (это современная версия оболочки Bourne) для лучшей совместимости сеансов и упрощения процедуры тестирования. СОВЕТ Все о сценариях оболочки в одной главе никак не расскажешь. Если вы хотите узнать больше о них, обратитесь к специализированным книгам.
Программирование в командной оболочке 1 ГГ7 I Глава 10 I I Простая программа оболочки Первым ритуалом, который должен пройти каждый начинающий программист, является написание классической программы "Hello World!". Ниже показан один из способов того, как ее можно создать на языке программирования оболочки Bourne. Введите текст, приведенный в листинге 10.1, в своем любимом текстовом редакторе (номера рядом со строками указаны только для ссылки, не вводите их, когда будете вводить код). Листинг 10.1. Базовая программа оболочки 1. #!/bin/sh 2. 3. # Легендарная программа Hello World, реализованная 4. # на языке программирования оболочки Bourne 5. 6. echo 7. echo "Hello World!" 8. echo 9. exit 0 Сохраните эту программу в виде файла с именем hello. (Запомните, в UNIX расширение в имени файла не имеет значения и поэтому его указывать не обязательно.) Далее вы должны сделать этот файл исполняемым. Вы можете сделать это следующей командой: # chmod u+x hello Эта команда дает владельцу файла разрешение выполнить его. Если вас волнует безопасность, вы можете предпочесть вместо этой команды использовать такую команду: # chmod 700 hello Эта команда гарантирует, что только вы сможете получать доступ к данному файлу- каким-либо образом, и что никакие другие пользователи не смогут даже читать его. Для получения более подробной информации по данному вопросу обращайтесь в главу 13. СОВЕТ Традиционно сценарии оболочки имеют расширение . sh, чтобы любой мог, просматривая перечень файлов каталога, быстро определить, что данный файл является сценарием оболочки. Однако указание расширения не является обязательным условием, и в некоторых случаях вы можете предпочесть не использовать его, чтобы упростить ввод команд (вы можете просто опустить его, так же как и в случае файлов . ехе в DOS). Например, если вы пишете сценарий оболочки* для конечных пользователей, которые не имеют ни малейшего представления о том, что означает расширение . sh, вы спокойно можете и не указывать его, как в этом примере. Выполните файл. Ниже показана команда, которую вы должны ввести, и вывод, который она вернет: # ./hello Hello World!
FreeBSD и командная строка НА ЗАМЕТКУ Перед именем команды следует обязательно ввести префикс . /, обозначающий, что данная команда ссылается на программу, которая находится в текущем каталоге (.), а не в одном из тех каталогов, которые перечислены в пути, таком как каталог /usr/iocal/bin, например. Вы, конечно, можете добавить текущий каталог (.) в свой путь, выполнив соответствующие, описанные в главе 9 шаги, но это не очень-то хорошая идея, особенно если вы являетесь пользователем root: вы ведь не хотите увеличить вероятность случайного выполнения какой-нибудь старой программы, которая у вас где-то осталась. Запуск таких программ от лица пользователя root далеко небезопасен! НА ЗАМЕТКУ : Поскольку сценарии оболочки являются интерпретируемыми, делать их исполняемыми или даже помещать в их начале строку интерпретатора для того, чтобы запустить их, вовсе не обязательно. Если хотите (хотя этот метод и является менее "инкапсулированным", чем предыдущий), можете запустить сценарий, указав его имя в качестве аргумента в команде, вызывающей саму оболочку /bin/sh. В таком случае вы сможете выполнить программу, даже если сценарий не был помечен как исполняемый и не содержит строки интерпретатора: # sh hello Построчный анализ сценария оболочки Теперь давайте более подробно проанализируем строки кода в приведенной для примера программе оболочки и посмотрим, что каждая из них делает. * Строка под номером 1. В этой строке содержится магическая последовательность символов #!, указывающая выполняющейся оболочке, что далее следует сценарий, который должен интерпретироваться заданной после #! програм мой. В данном случае она указывает FreeBSD, что для интерпретации остальной части сценария та должна использовать интерпретатор оболочки Bourne, то есть /bin/sh. Если бы это был сценарий Perl, здесь могла бы присутствовать программа /usr/local/bin/perl. А если бы это был сценарий Python, то программа /usr/local/bin/python и так далее. • Строки под номерами 2 и 5. В этих строках ничего не указано. Командная оболочка игнорирует пробелы, если только они не заключены в кавычки (подробнее об этом — чуть позже в этой главе). Пробелы позволяют делать программу более читабельной. Строки под номерами 3 и 4. В этих строках содержатся комментарии. Строки комментариев в программах оболочки всегда начинаются с символа # и полное тью игнорируются интерпретатором. Они необходимы, например, для того, чтобы программист, написавший сложную программу полгода назад и решивший сейчас CHdua к ней вернуться, смог быстро вспомнить, что именно она делает, или для того, чтобы другой пользователь, если ему понадобится, мог понять, как работают определенные части кода. Строка под номердм 6. Команда echo берет все получаемые данные и пере дает их в STDOUT (то есть на "стандартный вывод", которым обычно является
Программирование в командной оболочке Глава 10 331 экран). Однако можно сделать так, чтобы echo отправляла выходные данные не на экран, а в какое-нибудь другое место, например, в файл. В данном случае команда echo просто распечатывает на экране (STD0UT) пустую строку, делая выходные данные сценария более читабельными. • Строка под номером 7. Команда echo, содержащаяся в этой строке, распечатывает на экране (STD0UT) строку Hello World!. Кавычки указывают интерпретатору, что все, что находится внутри них, должно интерпретироваться как один единственный аргумент (то есть, что оболочка должна интерпретировать строку как один длинный параметр, а не как несколько отдельных, разделенных пробелами параметров). Без кавычек командная оболочка будет воспринимать символ пробела как разделитель между аргументами. В данном случае кавычки являются необязательными, но чуть позже в этой главе вы увидите, почему они могут оказаться важными. Будет совсем неплохо, если вы приучите себя всегда брать в кавычки строки вроде этих. • Строка под номером 8. Команда echo, содержащаяся в этой строке, тоже просто распечатывает на экране пустую строку. • Строка под номером 9. Команда exit, содержащаяся в этой строке, завершает работу программы и возвращает вызывавшей ее программе (таковой обычно является рабочая, то есть используемая по умолчанию оболочка, но это может быть и какая-то другая программа, например, еще какой-нибудь сценарий оболочки, возможно, вызываемый автоматически в указанное время) значение ее состояния завершения. Если в качестве значения состояния завершения возвращается значение 0, это означает, что работа программы была завершена корректно. Если возвращается другое значение, это означает, что во время завершения работы программы произошла какая-то ошибка. Вы можете указывать любой код завершения, какой захотите (в любое время в программе) и тем самым сообщать вызывающей оболочке различные подлежащие проверке во время выполнения условия, на основании соблюдения или несоблюдения которых она затем должна выполнять то или иное действие. В такой короткой программе, как эта, установка значения состояния завершения не является обязательной. Если значение состояния завершения не устанавливается явно, в качестве него будет возвращаться значение состояния завершения последней выполнявшейся в сценарии команды. Конечно, о существовании значения состояния завершения лучше знать, потому что оно будет играть более важную роль, когда вы начнете создавать более длинные и более сложные программы оболочки. Чуть позже в этой главе вы увидите, как используя в сценарии оболочки значение состояния завершения команды, можно сделать так, чтобы решение о том, какое действие должно быть выполнено дальше, принималось автоматически. Однако в принципе необходимости в установке такого значения возникать не должно; если сценарий написан правильно, он будет сам завершаться со значением 0. В противном случае он будет наследовать условие ошибки из одной из своих строк, а такую проблему вы, как программист, уже должны каким-то образом решать, а не маскировать при помощи оператора exit.
I ГТ7 I FreeBSD и командная строка I 33Z I Чат III Использование команды printf Предыдущую программу также можно было написать, используя команду printf, а не echo. Команда printf выполняет похожую функцию, но предоставляет намного больше возможностей в том, что касается форматирования выходных данных. В листинге 10.2 показано, как программу "Hello World!" можно переписать, заменив команду echo командой printf. Листинг 10.2. Использование команды printf вместо команды echo 1. #!/bin/sh 2. 3. # Легендарная программа Hello Word, реализованная 4. # на языке программирования оболочки Bourne 5. 6. printf и\пНе11о World!\n\n!" Если запустить эту программу, ее вывод будет выглядеть точно так же, как и вывод предыдущей программы. Однако это только первый пример того, что позволяет делать команда printf. Если вам раньше доводилось программировать на языке С или Perl, синтаксис команды printf покажется вам знакомым. Символ обратной косой черты (\) здесь тоже представляет собой так называемый символ отмены, который обычно указывает, что находящийся сразу же после него символ должен интерпретироваться буквально (то есть точно так же как если бы он был заключен в кавычки или окружен символами пробела), но в определенных комбинациях этот символ приобретает совершенно иное, специальное значение. В данном случае \п — это символ новой строки. А это значит, что, используя команду printf, мы можем избежать тех двух команд echo, которые вставляли пустые строки, следующим образом: просто добавив в строку, которую хотим распечатать, два символа новой строки. Мы добавили в конце строки целых два символа новой строки, потому что printf не вставляет автоматически символ новой строки в конце распечатываемой, то есть для того, чтобы получить пустую строку в выходных данных, нам нужно указать не один, а два символа новой строки. Ниже показан пример, в котором команда printf не вставляет автоматически пустую строку в конце: printf "Hello " printf "World!\n\n" Эти две строки в сценарии оболочки будут генерировать вывод "Hello World!", даже несмотря на то, что они указаны как два отдельных оператора. А все потому, что команда printf не добавляет автоматически в конце оператора символ новой строки (под которым в UNIX подразумевается символ возврата каретки), как это делает команда echo. Если бы в показанных выше двух строках кода вместо команды printf применялась команда echo, слова "Hello" и "World!" распечатывались бы на экране в виде двух отдельных строк. Этот пример показывает, насколько более точно команда printf позволяет форматировать выходные данные по сравнению с командой echo; конечно, используя ее, приходится более явно выражать свои намерения, но зато она является и гораздо более гибкой. В табл. 10.1 перечислены различные символы форматирования, которые поддер живает команда printf.
Программирование в командной оболочке Глава 10 333 Таблица 10.1. Символы для форматирования вывода, которые можно использовать с командой printf Символы для форматирования Описание \а Выдача терминалом звукового,сигнала. Раньше, во времена телетайпов, эта команда активизировала настоящий звонок на телетайпной машине. В наши дни для подачи звукового сигнала обычно используется динамик компьютера. \ь Печатает символ обратной косой черты. \f Печатает символ подачи страницы (экран очищается или, если речь идет о выводе данных на принтер, извлекается текущая страница и загружается новая). \г Печатает символ возврата каретки (курсор возвращается в начало строки, но на следующую строку не передвигается). Таким образом, все предыдущие данные в этой строке перезаписываются данными, указанными после /г. \п Печатает символ новой строки (который передвигает курсор в начало следующей строки). \t Печатает символ табуляции. \v Печатает символ вертикальной табуляции, который равнозначен символу новой строки без символа возврата каретки. V Печатает символ одиночной кавычки. \" Печатает символ двойной кавычки. \\ Печатает символ двойной обратной косой черты. \пит Печатает ASCII-значение восьмеричного одно-, двух- или трехбитового значения пит. Скорее всего, вам никогда не понадобится использовать эту опцию в программе оболочки. Конечно, просто возможность выводить заготовленные сообщения на экране является не особенно полезной. Вам нужно, чтобы программа могла выдавать разный вывод в зависимости от того, какие данные она получает. Вот где в игру вступают переменные. Переменные На уроках алгебры вы узнали, что в алгебраических уравнениях на месте неизвестных величин могут использоваться буквы, и что эти буквы называются переменными. В программировании применяется схожая концепция, только здесь переменные могут содержать не только числа, но и строки (то есть целые наборы символов). При программировании на языке оболочки вы будете иметь дело с переменными двух типов: с переменными оболочки и с переменными среды. Главное отличие между ними состоит в том, что переменные среды доступны другим сценариям и программам, вызываемым из программы оболочки, в то время как переменные оболочки доступны только самому сценарию. Переменные, применяемые при программировании на языке оболочки, не являются строго типизированными: их не нужно объявлять или определять их тип перед
FreeBSD и командная строка использованием, как это следует обязательно делать в других языках программирова ния. В языке оболочки все переменные хранятся в виде строк. Присваивание значений переменным В самой простой форме создать переменную и присвоить ей значение в команд ной строке можно следующим образом: myVar=5 Значение 5 теперь хранится в переменной myVar. Чтобы получить доступ к хра нящейся в переменной информации, используйте перед именем переменной знаь доллара ($). Например, команда ${myVar} отправит на стандартный вывод (STDOUT), которым, как вы помните, обычно является экран, значение 5. НА ЗАМЕТКУ Операторы, присваивающие значения переменным — это единственное место, где пробелы имеют значение. Например, оператор mvar=5 присвоит значение 5 переменной myVar, а оператор myVar « 5 вернет ошибку, потому что оболочка попытается интерпретировать myVar не как имя переменной, которой следует присвоить данное значение, а как имя команды, которую следует выполнить. Круглые скобки являются необязательными, но могут помочь повысить удобо читаемость кода: они упрощают поиск переменных при быстром просмотре кода. Использовать их или нет — решайте сами. Значение одной переменной также может быть присвоено другой переменной. Например: myVarB-$myVar Эта строка кода присваивает все, что находится в переменной myVar, переменной myVarB. Если переменная myVarB уже содержит какое-то значение (например, число 5), это значение перезаписывается новым. Кроме тсцр, еще также можно присвоить переменной в качестве значения вывод какой-нибудь команды, или прочитать ввод с STDIN (со стандартного ввода, которым обычно является клавиатура) и сохранить его в переменной. О том, как именно это делается, будет рассказываться чуть позже в этой главе. Создание переменной среды во многом похоже на создание переменной оболочки, единственным отличием является то, что переменную среды нужно экспортировать из контекста сценария, прежде чем она станет частью среды. Это можно еде лать с помощью оператора export, как показано ниже: MYVAR=5 export MYVAR Здесь мы сначала создаем переменную под названием MYVAR, а затем экспорта руем ее, в результате чего она становится переменной среды, доступной для всех остальных оболочек, которые запускаются из данной оболочки.
Программирование в командной оболочке I ГГ7 I Глава 10 I I Имена переменных Имена переменных чувствительны к регистру и могут содержать буквы, цифры и символы подчеркивания. Однако начинаться с цифры имя переменной не может, да и символов подчеркивания в начале имен переменных тоже лучше избегать. Используйте описательные имена, чтобы сделать код программы более удобным для чтения. Например, догадаться, что содержит переменная с именем avg_rainf all, намного легче, чем догадаться, что может содержать переменная под названием xyzl23. ВНИМАНИЕ! Использовать в именах переменных слова, которые уже представляют собой имена каких-нибудь команд оболочки, нельзя, равно как и нельзя применять в них и никакие "зарезервированные слова", имеющие в языке оболочке специальное значение наподобие слов if и case. СОВЕТ В общем случае, в именах локальных переменных принято использовать строчные буквы (буквы в нижнем регистре), а в именах переменных среды — заглавные буквы (буквы в верхнем регистре). Однако некоторые предпочитают комбинировать строчные и заглавные буквы в именах локальных переменных для того, чтобы они хоть как-то отличались от имен других команд оболочки, которые практически всегда состоят только из строчных букв. Взаимодействие с пользователем Теперь вы знаете, как создавать переменные так, чтобы они содержали различные данные; но без входных данных от пользователя значения ваших переменных никогда не будут меняться. Командная оболочка предоставляет способ для получения входных данных с STDIN. Обычно эти входные данные будут вводиться пользователем (или браться из файла, если STDIN был перенаправлен). Для считывания входных данных, вводимых пользователем, следует использовать команду read. В листинге 10.3 показана слегка измененная версия программы "Hello World!", которая считывает входные данные с STDIN (обычно клавиатура) и затем работает с ними. Листинг 10.3. Считывание входных данных с STDIN 1. #!/bin/sh 2. 3. # Измененная программа Hello World, которая принимает # входные данные с клавиатуры 4. 5. echo 6. echo -n "Пожалуйста, введите свое имя: " 7. read name 8. echo 9. echo "Здравствуйте, ${имя}!" 10. echo
336 FreeBSD и командная строка Часть III При выполнении эта программа делает следующее (то есть работает следующим образом): Пожалуйста, введите свое имя: Брайан Здравствуйте, Брайан! Обратите внимание на три следующих важных строки в коде этой программы. • Строка под номером 6. В этой строке команда echo используется с новой опцией: -п. Опция -п подавляет символ начала новой строки, который обычно отправляется в конце оператора echo. В результате этого курсор остается в той же строке, то есть после текста Пожалуйста, введите свое имя:. • Строка под номером 7. В этой строке команда read принимает входные данные с STDIN (которым в данном случае является клавиатура). Пользователь здесь может ввести какую-то строку текста. После нажатия клавиши <Enter> команда read берет все данные, которые ввел пользователь, и сохраняет их в переменной name. Команда read подразумевает кавычки, поэтому вводимая строка сохраняется в переменной точно в таком же виде, в котором ее вводит пользователь, то есть со всеми пробелами. • Строка под номером 9. В этой строке команда echo используется для вставки содержимого переменной name в строку, начинающуюся со слова Здравствуйте и заканчивающуюся восклицательным знаком; далее, как только окончательный вариант строки будет готов, она отправляет эту строку на экран. Фигурные скобки, опять-таки, являются необязательными. Команда read может принимать в качестве аргументов множество переменных. В таком случае пробел выступает в роли разделителя, позволяя понять, какие данные к какой переменной относятся. В листинге 10.4 показан пример использования нескольких переменных с командой read. Листинг 10.4. Использование нескольких переменных с командой read 1. #!/bin/sh 2. 3. echo 4. echo -n "Введите три числа, разделив их пробелами или символами табуляции: и 5. read varl var2 var3 6. echo 7. echo "Значение переменной varl: ${varl}" 8. echo "Значение переменной var2: ${var2}" 9. echo "Значение переменной var3: ${var3}" 10. echo Ниже показан пример вывода программы из листинга 10.4: Введите три числа, разделив их пробелами или символами табуляции: 557 2024 57240 Значение переменной varl: 557 Значение переменной var2: 2024 Значение переменной va3: 57240 Количество пробелов во входных данных, получаемых с клавиатуры, роли не играет. При присваивании значений нескольким переменным read интерпретирует все пробелы как разделители аргументов, чтобы определить, какие данные должны быть сохранены в каждой переменной.
Программирование в командной оболочке | TTZ I Глава 10 I I Если read получает меньше аргументов, чем имеется переменных в ее списке, тем переменным, на которые не хватило значений в перечне аргументов, просто не присваиваются значения. С другой стороны, если read получает больше аргументов, чем имеется в ее списке, все "лишние" аргументы присваиваются самой последней переменной в этом списке, например: Введите три числа, разделив их пробелами или символами табуляции: 1234567890 Значение переменной varl: 1 Значение переменной var2: 2 Значение переменной var3: 34567890 Обработка аргументов командной строки Получать информацию от пользователя можно также путем считывания аргументов, которые он вводит в командной строке. Командная оболочка автоматически сохраняет до девяти аргументов командной строки в специальных внутренних переменных. Писать какой-либо отдельный код, чтобы считать эти аргументы, не нужно: для этого следует всего лишь обратиться к переменным с именами от $ 1 до $9. Поставляемая с FreeBSD командная оболочка POSIX также позволяет сохранять больше аргументов командной строки в переменных и затем, соответственно, получать к ним доступ с помощью ${10}, ${11} и так далее. Но этого следует избегать, если не исключено, что программа будет запускаться и на других системах, потому что традиционная оболочка Bourne способна обрабатывать только аргументы командной строки от $1 до $9. В переменной $0 сохраняется имя самой программы, в переменной $@ — список всех аргументов, которые она может принимать, а в переменной $# — число, соответствующее количеству аргументов, которое ей на самом деле было передано. В листинге 10.5 показан пример того, как могут обрабатываться аргументы командной строки в сценарии. Листинг 10.5. Аргументы командной строки в сценарии 1. #!/bin/sh 2. 3. echo * 4. echo "Название программы: $0" 5. echo "Общее количество полученных аргументов: $#" 6. echo "Строка со всеми аргументами: #@" 7. echo "Ваше имя: $1" 8. echo "Ваша фамилия: $2" 9. echo Вот как будет работать эта программа: # ./yourname Брайан Таймэн Название программы: ./yourname Общее количество полученных аргументов: 2 Строка со всеми аргументами: Брайан Таймэн Ваше имя: Брайан Ваша фамилия: Таймэн
FreeBSD и командная строка НА ЗАМЕТКУ Доступная в FreeBSD оболочка POSIX также поддерживает команду getopts, которая предлагает более гибкий способ для обработки аргументов командной строки с помощью программы оболочки. Мы еще вернемся к ней, когда будем рассматривать усовершенствованные функциональные возможности языка оболочки Когп. Однако, при написании программ на языке оболочки Bourne (то есть использующих sh) для других (не FreeBSD) платформ UNIX, командой getopts лучше не пользоваться, потому что она не является стандартным компонентом традиционной оболочки Bourne и поэтому может стать причиной, по которой эти программы не будут работать в некоторых системах. Подстановка команд Подстановка команд подразумевает выполнение команды и присвоение ее вывода переменной. Подлежащая выполнению команда должна заключаться в левые кавычки (). Смотрите, не путайте левые (также называемые обратными) кавычки с одиночными кавычками. Символ обратной кавычки (*) обычно находится на клавиатуре на той же клавише, что и символ ~. Ниже показан пример использования обратных кавычек: todaysDate=ч dateч Эта приведенная в качестве примера строка кода выполняет команду date и присваивает ее вывод в качестве значения переменной todays Date. После этого доступ к содержимому этой переменной можно получать точно так же, как и к содержимому любой другой переменной. Арифметические операции в программах оболочки Хотя в исходной версии оболочки Bourne и нет встроенных арифметических функций, выполнять арифметические операции все равно можно с помощью технологии подстановки команд и команды ехрг. Например: var3=expr varl + var2* Эта строка кода складывает значения, содержащиеся в переменных varl и var2, и затем сохраняет результат в переменной var3. Обратите внимание, что аргументы должны отделяться от операции пробелами. Конструкция ехрг varl+var2 ожидаемого результата не даст. Команде ехрг под силу только очень простые математические операции: она может иметь дело лишь с целыми числами. Ввод чисел с плавающей точкой приведет к появлению ошибки. Изменение порядка операций с помощью скобок не поддерживается. Если при делении получается число с остатком, остаток отбрасывается. Например, при делении 5 на 2 у команды ехрг получается 2. При желании извлечь остаток от деления, вы можете воспользоваться операцией %. Например, ехрг 5 % 2 вернет 1 (5 / 2 s 4 и 1 в остатке). i Символы, имеющие специальное значение в оболочке, должны сопровождаться символом обратной косой черты (\). Например, команда ехрг 2 * 2 не будет ра-
Программирование в командной оболочке I ГГ7 I ГпянаШ I 339 I ботать, потому что оболочка интерпретирует символ * как операцию с групповыми символами. Для того чтобы она интерпретировала символ * в качестве операции умножения, перед ним следует поставить символ обратной косой черты, то есть так: ехрг 2 \* 2. Таким образом, символ обратной косой черты не дает командной оболочке интерпретировать следующие после него символы как имеющие специальное значение. ехрг также может вычислять выражения типа "истина/ложь". Если выражение истинно, ехрг возвращает значение 1, а если ложно, возвращает 0. Например: ехрг 2 + 2 = 4 + 1 Эта команда вернет 0 (потому что равенство является ложным). Следующая команда вернет 1 (поскольку равенство является истинным): ехрг 2 + 2 = 3 + 1 Операция ! = поменяет смысл равенства на обратный, потому что она означает "не равно". Поэтому, например, выражение ехрг 5 ! = 3 вернет 1 (то есть будет истинным). ехрг также конечно может и выполнять такие операции сравнения, как "меньше" (<) и "больше" (>). Опять-таки, поскольку символы < и > имеют специальное значение для оболочки, при использовании с командной ехрг перед ними обязательно следует ставить символ обратной косой черты, дабы они интерпретировались как математические операции. Как и операция "равно" (=), операции "меньше" (<) и "больше" (>) при вычислении возвращают 1, если указанное в них выражение является истинным, и 0, если выражение является ложным. Например, команда ехрг 5 \> 4 вернет 1 (потому что указанное выражение является истинным). Также поддерживаются и операции вроде "больше или равно" (\>=) и "меньше или равно" (\<=). Команда ехрг позволяет сравнивать не только числа, но и строки. Например, ехрг "Длинная строка, совпадающая во всем кроме" = "Длинная строка, совпадающая во всем корме" вернет 0 (потому что данное выражение является ложным: указанные в нем строки совпадают не полностью). Хотя команда ехрг прекрасно подходит для простых сценариев оболочки, как уже упоминалось ранее, ее возможности достаточно ограничены. При необходимости выполнить какую-нибудь математическую операцию над числами с плавающей запятой, добавить сложные выражения, изменяющие порядок операций, и тому подобного, используйте команду be, которая сама по себе уже является языком программирования и обеспечивает большую гибкость при работе с математическими операциями, чем доступно в обычном языке оболочки. Вы можете добавить выражения в свою программу оболочки, а затем передать их команде be. В программе, которая показана в листинге 10.6, команда be применяется для вычисления сразу как длины, так и площади окружности. Обратите внимание на то, что она используется вместе с оп цией '1 (это не цифра 1, а строчный вариант буквы L), которая указывает, что be должна пользоваться стандартной библиотекой математических функций. Листинг 10.6. Использование команды be для вычисления длины и площади окружное и 1. #!/bin/sh 2. 3. # Следующая программа вычисляет 4. # длину и площадь окружности 5.
340 FreeBSD и командная строка Часть III 6. pi-"3.14159265" # Присваиваем значение числа пи переменной 7. 8. # Сообщаем пользователю, что делает эта программа, 9. # и просим его указать радиус окружности 10. 11. echo 12. echo "Эта программа вычисляет длину и площадь" 13. echo "окружности." 14. echo 15. echo -n "Пожалуйста, введите радиус окружности: " 16. read radius 17. 18. # Теперь с помощью be вычисляются ответы, которые сохраняются в переменных. 19. 20. circumference=4echo "$radius*$pi" | be -1ч 21. area»4echo "$radiusA2*$pi" | be -l4 22. 23. # Наконец, ответы отображаются пользователю, а программа завершается 24. 25. printf "\п\пДлина окружности: \t$circumference\n" 26. printf "Площадь окружности: \t\t$area\n\n" Многие из использованных в этой программе концепций уже объяснялись в разделах "Переменные" и "Взаимодействие с пользователем*. Поэтому вместо того, чтобы рассматривать все строки подряд, мы остановимся лишь на тех из них, в которых встречаются новые и/или важные для нормального функционирования программы концепции. • Строка под номером 6. В этой строке относительно точное значение числа к присваивается переменной под именем pi. Я акцентирую на этом внимание, потому что это очень удобный прием. Вы, конечно, можете и вводить число 3 Л4159265 каждый раз заново, когда вам будет нужно использовать число я в программе. Но присвоение этого иррационального числа переменной может оказаться удобным по двум причинам. Во-первых, это сделает вашу программу просто более удобочитаемой, сократив до минимума количество длинных числовых строк, которые обязательно должны были бы присутствовать в ней в противном случае. Во-вторых, это сделает ее более удобной в сопровождении. Если вы позже решите, что значение числа я должно быть более точным, вам нужно будет изменить только одно число, указанное там, где вы присваивали значение переменной pi. А если вы вместо того, чтобы создать переменную pi, будете везде в программе вводить фактическое число я, то если потом вы вдруг решите увеличить точность значения пи, вам придется изменять каждое вхождение числа п по отдельности. Этот прием также помогает при отладке; объявление всех переменных в одном месте и постоянная ссылка на них означает, что любая опечатка будет выявляться быстрее, а значит и устранить ее будет легче. • Строка под номером 16. Как уже объяснялось ранее, команда read считывает данные с STDIN. Команда read, указанная конкретно в данной строке, считывает значение, введенное пользователем, и сохраняет его в переменной radius.
Программирование в командной оболочке | ГТТ I Глава 10 I I • Строка под номером 20. В этой строке посредством подстановки команды и конвейера вычисляется длина окружности, и полученное значение сохраняется в переменной circumference. Поскольку команда be не может принимать выражения прямо из командной строки, мы использовали команду echo, чтобы отобразить подлежащее вычислению выражение, и затем (по конвейеру) передали ее вывод команде be. • Строка под номером 21. Эта строка похожа на строку под номером 20. Знак вставки (А) в выражении представляет в be операцию возведения в степень. В данном случае возводится значение, содержащееся в переменной radius, во вторую степень (вы наверняка помните из уроков геометрии, что площадь окружности равняется квадрату радиуса, умноженному на число я). Использовать скобки, чтобы изменить порядок выполнения операций, в данном случае не нужно, потому что, как вы наверняка помните из уроков алгебры, операция возведения в степень имеет более высокий приоритет, чем операция умножения. Следовательно, вы можете быть уверены в том, что операция возведения в степень будет выполняться раньше, чем операция умножения. • Строки под номерами 25 и 26. Эти строки отображают результаты пользователю. Здесь использовалась команда printf, потому что она позволяет отобразить результаты более удобным образом. Наличие опции ~t приводит к созданию символов табуляции, в результате чего числа отображаются ровно в столбик. Данная программа является простейшим примером применения команды be. Команда be обладает довольно-таки мощными возможностями и может выполнять гораздо более сложные операции, чем были показаны здесь. Узнать больше о ее возможностях как в сценариях оболочки, так и в отдельных программах, вы можете, прочитав соответствующую страницу руководства, доступ к которой осуществляется по команде man be. Циклы Иногда необходимо, чтобы операция повторялась до тех пор, пока не будет удовлетворено определенное условие (или наоборот до тех пор, пока определенное условие не перестанет выполняться). Вот где в игру вступают циклы. Для таких случаев оболочка Bourne поддерживает три различных конструкции циклов, а именно: цикл while, цикл until и цикл for. Давайте рассмотрим их все по очереди. Цикл while Цикл while принимает в качестве аргумента какое-то подлежащее проверке условие и выполняет указанные внутри его тела операторы снова и снова до тех пор, пока это условие остается истинным. Другими словами, весь содержащийся в теле такого цикла код продолжает выполняться до тех пор, пока это не приведет к такому изменению в переменных программы, что проверяемое условие станет ложным. Если условие оказывается ложным уже при первой проверке, цикл вообще не выполняется. Например, в программе, которая показана в листинге 10.7, цикл while используется для того, чтобы досчитать до 20 и отобразить эти числа на экране.
I ГТГ I FreeBSD и командная строка I 3 Z I Часть 111 " Листинг 10.7. Использование цикла while 1. #!/bin/sh 2. # Считаем от 1 до 20 3. i«l 4. while [ $i -le 20 ] 5. do 6. echo $i 7. i=4expr $i + l4 8. done Здесь встречается несколько новых концепций. • Строка под номером 3. В этой строке переменной i просто присваивается начальное значение 1. Обычно переменную i воспринимают в качестве счетчика цикла; как и в математике, г обычно расшифровывается как increment, что означает инкремент, или приращение. Это один из редких случаев, когда для переменной можно не придумывать описательное имя. • Строка под номером 4. Команда while, указанная в этой строке, содержит подлежащее проверке условие, которое заключено в квадратные скобки. Квадратные скобки на самом деле представляют собой сокращенное обозначение команды test, принимающей в качестве аргументов два операнда и операцию, которая должна использоваться для их сравнивания. Вы будете часто пользоваться этой командой при написании сценариев на языке оболочки. К сожалению, команда test имеет немного странный синтаксис. -1е в данном примере означает "меньше или равно". Это, в свою очередь, означает, что цикл будет повторяться до тех пор, пока значение переменной i будет меньше или равно 20. В табл. 10.2 перечислены все математические операции, которые поддерживает эта команда. Таблица 10.2. Математические операции, поддерживаемые командой test Опция Действие -eq Возвращает значение "истина", если операнд 1 равен операнду 2. -пе Возвращает значение "истина", если операнд 1 не равен операнду 2. -gt Возвращает значение "истина", если операнд 1 больше операнда 2. -де Возвращает значение "истина", если операнд 1 больше или равняется операнду 2. -it Возвращает значение "истина", если операнд 1 меньше операнда 2. ~1е Возвращает значение "истина", если операнд 1 меньше или равняется операнду 2. • Строка под номером 5. Содержащийся в этой строке оператор do указывает, что следующие далее команды должны выполняться на каждой итерации цикла. Все операторы, находящиеся между оператором do и оператором done, считаются частью цикла. • Строка под номером 6. Содержащаяся в этой строке команда echo выводит текущее значение переменной i.
Программирование в командной оболочке I ГТГ I Глава 10 I I • Строка под номером 7. В этой строке посредством подстановки команды ехрг значение переменной i увеличивается на 1, после чего получившееся новое значение снова присваивается переменной i. • Строка под номером 8. В этой строке содержится оператор done, который обозначает конец цикла. На этом этапе программа снова возвращается к оператору while и снова проверяет указанное в нем условие. Если значение переменной i по-прежнему меньше или равно 20, все находящиеся в цикле операторы опять начинают выполняться. Если значение переменной i больше 20, цикл завершается и управление переходит к следующему сразу после оператора done оператору (в данном случае — к оператору в строке 9, который просто завершает работу программы с кодом завершения 0, означающим успешное выполнение). Обратите внимание на отступы перед операторами, которые являются частью цикла. Они упрощают идентификацию операторов, относящихся к циклу, при быстром просмотре исходного кода программы. Командная оболочка игнорирует отступы, поэтому данную программу можно было написать, и не используя их. Однако рекомендуется всегда выделять циклы с помощью отступов (то есть использовать клавишу табуляции или определенное количество пробелов) для того, чтобы их легче было находить при быстром просмотре исходного кода программы. СОВЕТ Пробел между символом открывающей квадратной скобки ([) и подлежащим проверке условием является обязательным, равно как и пробел, стоящий сразу же после закрывающей квадратной скобки 0)« Отсутствие любого из них приведет к возникновению ошибки. Например, команда [ $VarA -gt 5 J будет работать, а команда l$v?rA -gt 5 J —нет. Цикл until Цикл until в принципе можно назвать противоположностью цикла while. Он выполняется до тех пор, пока проверяемое условие остается ложным. Когда проверяемое условие становится истинным, цикл завершается. Если условие оказывается истинным уже при первой проверке, цикл вообще не выполняется. Цикл while и цикл until очень похожи. Обычно в программе можно использо вать любой из них и добиваться тех же результатов, npoctfо изменяя соответствующим образом проверяемое условие. Например, вы можете переписать показанную в предыдущем примере программу так, чтобы в ней применялся цикл until, а не while, внеся в нее только два изменения в строке под номером 4: 4. until [$i -gt 20 ] Эта программа будет выполнять ту же функцию, что и предыдущая, в которой использовался цикл while, с той лишь разницей, что теперь цикл будет повторяться до тех пор, пока значение переменной i будет больше 20, а не до тех пор, пока о о будет оставаться меньшим или равным 20, как это было раньше. Результат будет та ким же.
I ГТТ I FreeBSD и командная строка I I Часть 111 Логические операторы И/ИЛИ в циклах while и until Циклы while и until также могут работать с логическими операторами И и ИЛИ. Логический оператор И, обозначаемый как &&, дает истинное значение только в том случае, если оба условия являются истинными. Логический оператор ИЛИ, обозначаемый с помощью | |, дает истинное значение, если хотя бы какое-нибудь одно из условий является истинным. Код, показанный в листинге 10.8, демонстрирует пример применения логического оператора И, которая обеспечивает выполнение цикла, если оба операнда окажутся истинными (то есть если значение переменной VarA будет равно 1 и значение переменной VarB будет больше 7); в данном случае второй операнд не является истинным (потому что значение переменной VarB равно 5, что никак не больше 7), поэтому цикл выполняться не будет. Листинг 10,8. Использование логического оператора И 1. #!/bin/sh 2. 3. # Демонстрация использования логического оператора И 4. VarA=l 5. VarB=5 6. while [ $VarA -eq 1 J && [ $VarB -gt 7 ] 7. do 8* echo "Значение переменной VarA равно 1 и значение переменной VarB больше 7" 9, done В данном примере оператор echo не будет выполнен. Поскольку цикл while в данном случае требует, чтобы были соблюдены оба условия, проверка заканчивается неудачей, в результате чего возвращается значение 0 (обозначающее, что условие является ложным). Код, показанный в листинге 10.9, похож на тот, что приводился в листинге 10.8, только в нем в конструкции while используется логический оператор ИЛИ, а не И. А это значит, что теперь истинным должно быть только какое-нибудь одно из условий. Следовательно, поскольку в этой программе значение переменной VarA всегда будет равно 1, оператор while будет выполняться снова и снова, до бесконечности (то есть пока вы не нажмете клавиатурную комбинацию <Ctrl+C>). Листинг 10.9. Использование логического оператора ИЛИ 1. #!/bin/sh 2. 3. # Демонстрация использования логического оператора ИЛИ 4. VarA=l 5. VarB=5 6. while [ $VarA -eq 1 ] I I [ $VarB -gt 7 ] 7. do 8. echo "Значение переменной VarA равно 1 или значение переменной VarB больше 7" 9. done
Программирование в командной оболочке | TTZ | ГпаиаШ I 345 I Цикл for Цикл for отличается от циклов while и until. Вместо того чтобы проверять истинность или ложность условия, он просто выполняет операторы, перечисленные внутри его тела, по одному разу для каждого из аргументов, которые он получает в виде списка. При создании циклу for передается переменная. После каждого выполнения цикла этой переменной в качестве значения присваивается следующий аргумент в списке. И так цикл for продолжает выполняться до тех пор, пока в списке не закончатся аргументы, после чего цикл завершается, и программа переходит к следующей команде. В листинге 10.10 показана программа, в которой цикл for используется вместе с командой be (о которой мы уже рассказывали ранее в этой главе) для отображения всех значений, получающихся при извлечении корня квадратного из чисел от 10 до 20. Листинг 10.10. Использование цикла for 1. #!/bin/sh 2. # Вывод на экран значений корня квадратного чисел от 10 до 20 3. for num in sjot 10 10 20ч 4. do 5. square_root=4echo "scale=5; sqrt($num)" I be -Iх 6. echo $square_root 7. done Вывод этой программы будет выглядеть так: 3.16227 3.31662 3.46410 3.60555 3.74165 4.00000 4.12310 4.24264 4.35889 4.47213 Обратите внимание на следующие строки в этой программе, они имеют важное значение. • Строка под номером 3. В этой строке программы содержится цикл for. Здесь встречается новая команда, которая называется j ot и может выполнять много полезных операций с числами, например, распечатывать строку чисел и генерировать случайные числа. В данном случае с помощью команды jot печатается строка из 10 чисел, начинающаяся с числа 10 и заканчивающаяся числом 20 (10 10 20). Цикл for по очереди присваивает каждое из этих значений переменной num и затем выполняет для каждого из них перечисленные внутри него операторы. • Строка под номером 5. В этой строке используется команда be для вычисления квадратного корня значения, которое хранится в переменной num. Оператор scale=5 указывает команде be, что она должна масштабировать (усекать) выходные данные до пяти значащих цифр после десятичной точки. Также обратите
346 FreeBSD и командная строка Часть III внимание на стоящую после оператора scale точку с запятой. Символ точки с запятой может использоваться вместо символа новой строки для разделения множества находящихся в одной строке операторов. Функция sqrt в команде be берет число в скобках и возвращает квадратный корень этого числа. Поскольку оболочка использует не переменную, а значение, которое она содержит, команда be фактически получает число, хранящееся в переменной, а не имя этой пе- ременной. И, наконец, в конце строки под номером 5 вывод передается самой команде be. Опция -1 указывает команде be загрузить библиотеку математических функций, в которой как раз и доступна необходимая ей функция sqrt. Команда shift Команда shift похожа на цикл for. Используя ее вместе с циклом while можно сделать так, чтобы при вызове данной программы оболочки цикл выполнялся по одному разу для каждого аргумента командной строки. Как уже упоминалось ранее в этой главе, аргументы командной строки хранятся в пронумерованных переменных (вроде $1, $2, $3 и так далее вплоть до $9). Команда shift передвигает эти переменные влево на одну позицию после каждого выполнения. Это означает, что каждый раз, когда встречается команда shift, информация, которая на текущий момент хранится в переменной $1, "выходит за край'*, информация, которая на текущий момент хранится в переменной $2, переносится в переменную $1, и так далее до конца списка. В листинге 10.11 показан пример использования команды shift. Листинг 10.11. Использование команды shift 1. #!/bin/sh 2. # Демонстрация использования команды shift 3. while [ $# -ne 0 ] 4. do 5. echo "В переменной \$1 теперь хранится значение $1." 6. shift 7. done 8. echo А вот как может выглядеть вывод этой программы: # . /shiftl abode В переменной $1 теперь хранится значение а. В переменной $1 теперь хранится значение Ь. В переменной $1 теперь хранится значение с. В переменной $1 теперь хранится значение d. В переменной $1 теперь хранится значение е. Здесь следует обратить внимание на такие строки. • Строка под номером 3. В этой строке начинается цикл while. В разделе "Обработка аргументов командной строки" рассказывалось, что в переменной $# хранится информация о количестве аргументов командной строки. Этот цикл while будет^ выполняться до тех пор, пока значение переменной $# не станет равно нулю. Когда это произойдет, это будет означать, что все аргументы командной строки были обработаны, и цикл завершится.
Программирование в командной оболочке | 7TZ I Глава 10 I I • Строка под номером 5. В этой строке с помощью команды echo на экран выводится текущее значение переменной $1. Обратите внимание, что для того, чтобы это значение на самом деле было выведено на экран, перед символом $ должен стоять символ обратной косой черты (\), не позволяющий командной оболочке интерпретировать его как символ, имеющий специальное значение. • Строка под номером 6. Когда выполняется указанная в этой строке команда shift, переменные сдвигаются на одну позицию влево. Переменная $1 "выходит за край" и поэтому становится недоступной, переменная $2 занимает место переменной $1, переменная $3 — переменной $2 и так далее. Команда shift (и цикл for) наиболее часто применяются в таких программах оболочки, которые принимают в качестве аргументов командной строки список имен файлов и затем выполняют над каждым указанным в командной строке файлом ряд определенных операций. Операторы true и false Единственной задачей операторов true и false при программировании на языке оболочки является возврат, соответственно, значения типа "истина" (0) и "ложь" (1). Эти операторы могут использоваться для создания бесконечных циклов. При наличии условия, которое может вывести программу из бесконечного цикла, написание кода, создающего такой цикл, может оказаться полезным. Именно так пишутся программы, которые должны все время находиться в активном состоянии и ожидать ввода данных, вроде Web-серверов. В листинге 10.12 показан пример программы с бесконечным циклом. Листинг 10.12. Создание бесконечного цикла при помощи оператора true 1. #!/bin/sh l 2. # Следующая программа выполняет бесконечный цикл. 3. while true 4. do 5. echo "Эта строка будет распечатываться все время." 6. done 7. echo "Эта строка не будет распечатываться никогда, потому что программа" 8. echo "никогда не будет выходить из цикла." 9. exit 0 # Эта программа никогда не будет завершать свою работу корректно, 10. # потому что она никогда не будет доходить до этой точки. Очевидно, что показать пример вывода этой программы здесь мы не можем, потому что он будет бесконечным. В строке 3 выполняется проверка условия на истинность. И поскольку проверяемый аргумент (true) никогда не вернет значение типа "ложь", цикл будет выполняться бесконечно. Команды в строках 7, 8, 9 и 10 не будут выполняться никогда, потому что у программы никогда не будет получаться выйти из цикла. (Чтобы завершить работу этой программы, нажмите клавиатурную комбинацию <Ctrl+C>.) Прерывание цикла Иногда бывает необходимо прервать цикл еще до проверки необходимого для его завершения условия и перейти сразу к остальной части сценария. Существует целых
348 FreeBSD и командная строка Часть III два оператора, которые можно использовать для прерывания цикла без завершения работы программы. Первый оператор — это break, а второй — continue. Оператор break Оператор break завершает цикл сразу же, когда встречается, независимо от того, было выполнено необходимое для завершения этого цикла условие или нет. В листинге 10.13 показана слегка измененная версия программы с бесконечным циклом, которая приводилась в предыдущем примере (в листинге 10.12). Листинг 10,13. Прерывание цикла 1. #!/bin/sh 2. # Следующая программа выполняет бесконечный цикл. 3. while true 4. do 5. echo "Эта строка будет распечатываться все время... Но...") 6. break 7. done 8. echo 9. echo "Оператор break завершает цикл" 10. echo "и передает управление оператору, который следует сразу же" 11. echo "после цикла." Вот как будет выглядеть вывод этой программы: Эта строка будет распечатываться всегда... Но... Оператор break завершает цикл и передает управление оператору, который следует сразу же после цикла. При более сложной реализации это мог бы быть цикл, ожидающий ввода каких- нибудь данных с консоли пользователя или их поступления по сети; он мог бы постоянно выполнять проверку на наличие того или иного файла или значения переменной, и в случае выполнения этого условия, завершаться посредством оператора break. Обычно считается более правильным писать циклы так, чтобы необходимые для их завершения условия реагировали должным образом на соответствующие входные данные, и по возможности избегать применения оператора break. Однако в очень сложных программах оператор break может являться чуть ли не единственным способом "выбраться из пробки". Оператор continue Оператор continue вынуждает цикл немедленно вернуться к началу и заново проверить условие. Все операторы, которые следуют в цикле после него, не выполняют- ся. В листинге 10.14 показана еще одна несколько измененная версия программы с бесконечным циклом из листинга 10.12. Листинг 10.14. Повторный запуск цикла перед его завершением 1. #!/bin/sh 2. # Следующая программа выполняет бесконечный цикл. 3. while true 4. do
Программирование в командной оболочке Глава 10 5. echo "Эта строка будет распечатываться все время." 6. continue 7. echo "А эта строка не будет распечатываться никогда, даже несмотря на то," 8. echo "что она находится внутри цикла, потому что идущий перед ней" 9. echo "оператор continue вынуждает цикл вернуться к началу и заново" 10. echo "проверить условие." 11. done 12. echo "Эта строка не будет распечатываться никогда, потому что программе" 13. echo "никогда не будет удаваться выйти из цикла." 14. exit 0 # Работа этой программы никогда не будет завершаться корректно, 15. # потому что программа никогда не будет доходить до этой точки. Эта программа будет бесконечно выводить строку "Эта строка будет распечатываться все время.". Все остальные строки, указанные в операторах echo внутри цикла, не будут распечатываться никогда, потому что идущий перед ними оператор continue будет все время прерывать цикл и возвращать его к началу, вынуждая снова и снова проверять условие. Условные операторы Условные операторы выполняются только в том случае, если определенное условие или условия являются истинными. В целом существуют три вида условных операторов: это операторы if, операторы case и логические операторы И/ИЛИ. Они являются одними из наиболее основных и самых полезных конструкций в программировании; они отвечают за управление ходом исполнения программы (выполняя определенные блоки кода в зависимости от возвращаемого после проверки условия результата), а также способность программы вести себя правильно при получении определенных ожидаемых аргументов (которые обычно обрабатываются операторами case). Операторы if Операторы if проверяют числовые выражения, указанные в квадратных скобках (которые, как уже упоминалось ранее, являются просто сокращенным обозначением команды test). Если проверяемое условие оказывается истинным, операторы, находящиеся внутри блока if, выполняются. Если условие оказывается ложным, происходит одно из двух. • Ничего не происходит. Операторы, содержащиеся внутри блока if, просто игнорируются, и программа продолжает выполняться так, будто бы их там вообще и не было. • Если внутри блока if имеется оператор else, начинают выполняться операторы, указанные после этого оператора else. Другими словами, операторы else позволяют создавать в программах процедуры типа "если условие истинно, следует сделать то-то и то-то, а если условие ложно, следует сделать то-то и то-то, но не то и другое вместе". Например, в листинге 10.15 показана программа, в которой с помощью оператора if проверяется количество переданных ей аргументов командной строки. Если был предоставлен один или более аргументов командной строки, программа начинает выполнять операции, перечисленные в блоке then. Если не было передано ни 349
I ГГ7 I FreeBSD и командная строка I 1 Часть III одного аргумента командной строки, программа просто завершает свою работу, не выполняя никаких операций. Листинг 10.15. Использование оператора if 1. #!/bin/sh 2. # Программа ifprog, демонстрирующая один из способов применения оператора if. 3. if [ $# -ge 1 ] 4. then 5. echo "Вы предоставили $# аргументов командной строки." 6. fi 7. echo 8 echo "Завершение работы программы..." 9. echo Ниже показаны два примера вывода этой программы: Пример 1: # ./ifprog filel file2 file3 Вы предоставили 3 аргумента командной строки. Завершение работы программы.., Пример 2: # ./ifprog Завершение работы программы... Оператор if в строке под номером 3 проверяет, является ли количество предоставленных аргументов командной стоки равным или больше 1 (используя для этого магическую переменную $#, которая как раз и хранит информацию о количестве аргументов командной строки). Если да, выполняются операторы, перечисленные между then и fi ("fi" — это "if наоборот. Этот элемент обозначает конец блока if.) Если нет, операторы, находящиеся внутри блока if, пропускаются и управление переходит к следующему сразу после f i оператору, который в данном случае просто информирует пользователя о том, что работа программы завершается. Использование оператора else Эту программу можно сделать более удобной для пользователя, включив в нее оператор else так, чтобы программа могла информировать пользователя о том, как ею правильно пользоваться, а не просто завершать свою работу, как она это делает сейчас. В листинге 10.16 показана откорректированная таким образом версия программы ifprog. Обратите внимание на операнд в строке 3: это цифра 1, а не строчный вариант буквы L. Листинг 10.16. Более дружественный к пользователю способ применения операторов if 1. #!/bin/sh 2. # Программа ifprog, демонстрирующая один из способов применения оператора if. 3. if [ $# -ge 1 ] 4. then 5. echo "Вы предоставили $# аргументов командной строки." 6. else 7. echo "Использование: $0 с файл! файл2..."
Программирование в командной оболочке Глава 10 8 echo 9 exit l 10. fi 11. echo 12. echo "Завершение работы программы..." 13. echo Теперь если количество аргументов командной строки окажется меньше одного (1), программа выполнит операторы, перечисленные в блоке else, и отобразит сообщение о правилах ее использования (напомним, что в переменной $0 содержится имя вызывавшейся команды). Также обратите внимание на строку под номером 9, которая указывает программе немедленно завершить свою работу с кодом завершения 1 (показывающим, что работа программы завершилась с ошибками). В случае выполнения операторов в блоке else операторы в строках под номерами 10-14 выполнены не будут. Часть then в операторе if является обязательной, а часть else — нет. Как вы увидели, операция, указанная в части then, выполняется, если проверяемое оператором if выражение оказывается истинным. Однако иногда бывает необходимо сделать так, чтобы операция выполнялась, только если выражение оказывается ложным, и не выполнялась, если оно оказывается истинным. Добиться такого эффекта можно, указав двоеточие в качестве метки-заполнителя, например, так: if [ $myVar -gt 5 ] then : # Ничего не делать и продолжить после окончания блока if else # Здесь идут операторы, выполняемые, если условие оказывается ложным fi Использование оператора elif Иногда бывает нужно сделать так, чтобы проверялось не одно, а два или более различных условий и, в зависимости от результатов, выполнялись различные действия. В такой ситуации может помочь оператор elif ("еИГ — это сокращение от "else iF). Когда в программе присутствуют операторы elif, сначала программа выполняет оператор if. Если проверяемое им условие оказывается истинным, выполняются указанные в нем операции, после чего программа переходит к выполнению оператора, который следует сразу после блока if (то есть после f i). Если проверяемое им условие оказывается ложным, дальше проверяется условие, указанное в первом операторе elif. Если оно оказывается истинным, выполняются операторы внутри него, после чего управление сразу переходит к оператору, который находится в конце блока if. Если оно оказывается ложным, проверяется условие, указанное во втором операторе elif, и так далее. И так проверки условий продолжаются до тех пор, пока программе не встретится выражение, которое окажется истинным. Если ни одно из условий не оказывается истинным, либо ничего не происходит, либо выполняются операторы, находящиеся внутри блока else, если таковые имеются. В листинге 10.17 для примера показана программа, позволяющая играть в простую игру в угадывание чисел, в которой используются многие из рассмотренных нами команд и операторов, операторы if, elif и else включительно. Обратите внимание на то, что в строке 10 используется команда jot. В данном случае она представляет собой
I TZZ I FreeBSD и командная строка I 35Z 1 ЧзгтиШ целую небольшую утилиту командной строки, которая генерирует случайные числа, и поэтому в качестве аргументов ей после опции -г передается количество возвращаемых результатов (1), число, меньше которого нельзя загадывать (1), и число, больше которого нельзя загадывать ($up_limit). Листинг 10,17. Простая игра в угадывание чисел 1. #!/bin/sh 2. # Игра в угадывание чисел 3. clear 4. guess_count=l # Создаем переменную счетчика попыток # и присваиваем ей значение 1 5. echo 6. echo "Игра в угадывание чисел, написанная в виде сценария оболочки Bourne." 7. echo 8. echo -n "Введите предельное число, числа выше которого загадывать нельзя: " 9. read up_limit 10. rnd_number-4 jot -r 1 1 $up_limit4 # Извлекаем случайное число 11. echo 12. echo "Загадано число между 1 и $up_limit." 13. echo 14. echo -n "Пожалуйста, введите число между 1 и $up_limit, которое, по вашему ^мнению, было загадано: " 15. read guess 16. # Сверяем введенный в качестве отгадки вариант со случайным числом. 17. while true 18. do 19. if [ $guess -gt $rnd_number ] 20. then 21. echo 22. echo "Вы указали слишком большое число. Попробуйте угадать загаданное ^>число еще раз. " 23. guess_count=>expr $guess_count + 1% 24. echo -n "Пожалуйста, введите число между 1 и $up_limit, которое, по ^вашему мнению, было загадано: " 25. read guess 26. elif [ $guess -It $rnd_number ] 27. then 28. echo 29. echo "Вы указали слишком маленькое число. Попробуйте угадать загаданное ^>число еще раз." 30. guess_count=4expr $guess_count + 1ч 31. echo -n "Пожалуйста, введите число между 1 и $up_limit, которое, по ^вашему мнению, было загадано: " 32. read guess 33. else 34. break 35. fi 36. done 37. # Программа доходит до этой точки, когда игрок угадывает правильное число. 38. echo 39. echo "Правильно!" 40. echo 41. echo "Вы угадали число с $guess_count попыток." 42. echo
Программирование в командной оболочке Глава 10 Ниже показан пример вывода этой программы: Игра в угадывание чисел написанная в виде сценария командной оболочки Bourne Введите предельное число, числа выше которого загадывать нельзя: 10 Загадано число между 1 и 10. Пожалуйста, введите число между 1 и 10, которое, по вашему мнению, бьшо загадано: 5 Вы указали слишком маленькое число. Попробуйте угадать загаданное число еще раз. Пожалуйста, введите число между 1 и 10, которое, по вашему мнению, было загадано: 8 Вы указали слишком большое число. Попробуйте угадать загаданное число еще раз. Пожалуйста, введите число между 1 и 10, которое, по вашему мнению, было загадано: 7 Правильно! Вы угадали число с 3 попыток. Практически все концепции, которые встречаются в этой программе, должны быть вам уже знакомы. • Строка под номером 3. Просто очищает экран. • Строка под номером 4. Инициализирует переменную guess_count, в которой будет храниться информация о количестве предпринятых пользователем попыток, и присваивает ей в качестве начального значения значение 1. • Строки под номерами 23 и 24. Увеличивают значение переменной guess_count на 1 после каждой неудачной попытки угадать число. • Строка под номером 10. С помощью команды jot извлекает случайное число в диапазоне между 1 и тем числом, которое пользователь указал в качестве верхнего предела, и присваивает его в качестве значения переменной rand_number. • Строка под номером 17. Начинает бесконечный цикл. • Строка под номером 19. Проверяет, является ли число, которое ввел пользователь, больше того, которое выбрала программа. Если да, пользователю отображается соответствующее сообщение, значение переменной guess_count увеличивает на 1, и программа приглашает игрока выбрать другое число. После того, как игрок выберет другое число, это число сохраняется в переменной guess, и цикл while начинает выполняться с начала. Если нет (то есть если число, которое ввел пользователь, оказывается не больше того случайного, которое выбрала программа), начинает выполняться оператор el if, проверяющий, является ли введенное пользователем число меньше того, что выбрал компьютер. Если да, игроку отображается соответствующее сообщение, значение переменной guess_count увеличивается на 1, и программа приглашает игрока повторить попытку. После того, как игрок введет новое число, цикл while начинает снова выполняться с самого начала. • Строка под номером 33. И, наконец, если ни одно из условий не оказывается истинным, начинает выполняться оператор else (осуществлять проверку здесь нет никакой необходимости, потому что если число и не больше, и не меньше загаданного числа, значит оно равно ему). В данном случае оператор else просто прерывает бесконечный цикл, в результате чего управление программой переходит к оператору, следующему сразу за оператором done. 353
354 FreeBSD и командная строка Часть III • Строки под номерами 39 и 41. Указанные в этих строках операторы просто информируют пользователя о том, что ему удалось угадать правильное число, и о том, сколько попыток ему для этого потребовалось (отображая значение пере менной guess_count). В операторах if , как и в циклах, тоже можно использовать логические операторы И (обозначаемый как &&) и ИЛИ (обозначаемый как I I) и делать так, чтобы операции выполнялись только в том случае, если удовлетворяются оба условия (оба условия истинны), или только в том^ случае, если удовлетворено хотя бы какое-то одно из перечисленных условий (истинно хотя бы одно из условий). Операторы case Сделать так, чтобы одна и та же переменная проверялась в нескольких условиях, можно не только с помощью операторов if — существует и гораздо более эффективный способ. Оператор case принимает в качестве аргумента переменную и затем, в зависимости от значения этой переменной, использует различные блоки операторов. В листинге 10.8 показан пример, в котором оператор case применяется для создания генератора случайных цитат. Листинг 10.18- Использование оператора case для генерирования случайных цитат 1. #!/bin/sh 2. # Генератор случайных цитат. 3. quote_num=s j ot -r 1 1 5Ч 4. case "$quote_num" in 5. 1) echo 6. echo "\"Человек не сможет обрести покой до тех пор, пока его круг" 7. echo "заслуживающих сострадания не охватит всех живых существ Л"" 8. echo "— Альберт Швейцер" 9. echo ;; 10. 2) echo 11. echo "\"Что касается совершенства, то только знать о нем недостаточно," 12. echo "мы должны стремиться к нему и уметь правильно применить его.\,,и 13. echo "— Аристотель" 14. echo ;; 15. 3) echo 16. echo "\"Воображение важнее знаний. Ибо знания имеют свой предел," 17. echo "а воображение может охватить все на свете.\"" 18. echo "— Альберт Эйнштейн" 19. echo ;; 20. 4) echo 21. echo "\"Выживают не самые сильные виды и не самые разумные, а те," 22. echo "которые наиболее быстро приспосабливаются к изменениям.\"" 23. echo "— Чарльз Дарвин" 24. echo ;; 25. esac В строке под номером 3 с помощью, опять-таки, команды jot генерируется случайное число в диапазоне от 1 до 4. Блок оператора case начинается в строке под номером 4.
Программирование в командной оболочке Глава 10 355 В данном случае оператор case имеет следующий синтаксис: case variable in, где variable — это имя переменной, значение которой должно проверяться. В строке под номером 5 выполняется первая проверка. Все, что находится слева от скобки, обозначает условие, которое собственно и проверяет оператор case. Как и оператор if, оператор case останавливается, когда ему попадается первое совпадение, выполняет соответствующие обнаруженному совпадению операторы и затем сразу "перепрыгивает" на строку под номером 25, то есть на ту, в которой содержится слово esac ("esac" — это "case" наоборот). В конце всех операторов, которые должны выполняться при соблюдении того или иного условия, стоит двойной знак точки с запятой: он может размещаться как в отдельной строке, так и в той же строке, что и последний оператор, как в данном примере. Оператор case также может принимать в качестве аргументов групповые символы оболочки. Например: case "$myVar" in а) # операторы, которые должны выполняться, если значением # переменной $myVar окажется а . i b)# операторы, которые должны выполняться, если значением # переменной $myVar окажется b *) # операторы, которые должны выполняться, если значением # переменной $myVar окажется любое другое значение Этот код будет проверять, является ли значением переменной $myVar значение а или Ь, и если да, выполнять указанные для них операторы. В противном случае он будет проверять третье условие, в котором указан групповой символ и для выполнения которого, следовательно, подходящим окажется любое значение. Поэтому, если значением переменной $myVar окажется ни а и ни Ь, выполняться будут операторы последней группы. Оператор case также поддерживает и такие групповые символы, как символ ?, который работает в операторе case так же, как и в оболочке (а как он работает в оболочке, вы видели в главе 8), и символ |, который позволяет оператору case принимать ряд опций. Например, при проверке условия Y | у) соответствовать будет как значение Y, так и значение у. Для соответствия с диапазоном символов можно заключить множество необходимых символов в квадратные скобки. Например, при проверке условия [Yy] | [Yy] [Ее] [Ss]) в операторе case соответствовать будет как значение у, так и значение yes в любой комбинации заглавных и строчных букв. CGI-программы Вам наверняка встречались Web-сайты, на которых при каждой загрузке отображается какая- нибудь выбираемая наугад цитата или на которых при каждом обновлении страницы отображается новая, тоже выбираемая наугад, картинка. Программа, показанная в листинге 10.18 (которая использует оператор case для отображения цитат), является одним из примеров того, как можно реализовать подобные эффекты. Такие программы называются CGf-программами и предоставляют Web-серверам возможность запускать внешние программы и затем отправлять вывод этих программ через Internet браузеру. Узнать больше о CGI-программах вы сможете в главе 26.
FreeBSD и командная строка Логические условные операции И/ ИЛИ Логические условные операции И/ИЛИ могут стать кратчайшим способом реализации операторов if. Они используют значение состояния завершения первой команды для того, чтобы определить, нужно ли запускать вторую команду. Ниже показан пример команды оболочки, которая в одной единственной строке умещает сразу несколько концепций программирования: # tar cvfz backup.tar.gz documents/2004/* && rm -r documents/2004 Эта команда в принципе означает следующее: "если первая операция выполнится успешно, выполнить вторую операцию. Если первая операция не выполнится, не выполнять вторую операцию". Другими словами, "выполнению подлежат А и В. Если выполнить А не удается, значит, В тоже выполнять не нужно". В данном случае сначала будет предпринята попытка посредством команды tar упаковать все файлы, которые имеются в каталоге documents/2004, в файл backup.tar.gz. Если эта one рация выполнится успешно, также будет выполнена и команда, указанная после &&, которая удалит каталог documents/2004. В противном случае (то есть если команда tar завершится не со значением 0, а с каким-то другим значением), операция, указанная после &&, выполняться не будет (зачем же удалять каталог, если его не удалось заархивировать). | | — это операция ИЛИ, которая в принципе означает следующее: "если А выполнить не удается, выполнить В. Но если А удалось выполнить, выполнять В не нужно". Например: # tar cvfz backup. tar. gz documents/2000/* | | echo "He удалось выполнить ^операцию архивации." В данном случае, если операция архивации пройдет успешно (то есть если команда tar завершится со значением 0), оператор, указанный после | |, выполняться не будет. Однако если выполнить операцию архивации не удастся (то есть если команда tar вернет в качестве значения состояния завершения не значение 0, а какое-то другое значение), оператор, указанный после | |, будет выполнен, в результате чего на экран будет выведено сообщение об ошибке. Значение состояния завершения Практически все программы в FreeBSD, когда они завершают свою работу, возвращают значение, отображающее их состояние на этот момент. Обычно они возвращают 0, если завершение работы прошло нормально, или другое число, если что-то пошло не так. Одни программы будут возвращать значение 1, обозначающее ошибку общего характера, другие — какое-нибудь другое числовое значение, в зависимости от того, какая именно проблема возникла. Информацию о том, что означает тот или иной код ошибки, обычно можно найти на соответствующей программе странице встроенного руководства (то есть, выдав команду man и указав в ней в качестве аргумента имя программы, которая сгенерировала этот код ошибки). Значение состояния завершения последней запускавшейся программы хранится в волшебной переменной $?. Вот вам несколько примеров: # Is > /dev/null # echo $? 0
Программирование в командной оболочке I TZZ I Глава 10 I I # Is -2 /dev/null Is: illegal option — 2 usage: Is [-ABCFGHLPRTWabcdfgiklnoqrstul] [file ...] # echo $? 1 В первом примере выполнение команды завершается нормально, поэтому переменной $? присваивается значение 0 (вывод команды был направлен в /dev/null в этом примере исключительно для краткости, то есть, дабы упростить пример). Однако во втором примере команде Is в качестве аргумента передается недопустимая опция. В результате чего выполнение команды завершается сообщением об ошибке, и переменной $? присваивается значение 1. СОВЕТ ¦ Если вы часто занимаетесь программированием, возможно, вы захотите изменить внешний вид приглашения оболочки так, чтобы в нем отображался маркер $?, для того, чтобы значение состояния завершения предыдущей команды было у вас всегда перед глазами. Вы можете использовать значение состояния завершения для принятия автоматических решений в своих сценариях оболочки. Предыдущий пример с логическими операторами И/ИЛИ уже продемонстрировал эту технологию в полной мере. Он показал, как успешное или неудачное выполнение одной команды может влиять на то, будет выполняться следующая команда или нет. Оператор И/ИЛИ, приведенный в предыдущем разделе, можно было бы написать и в виде оператора if: if tar cvfz backup.tar.gz documents/2004/* then rm -r documents/2004 else echo "He удалось выполнить операцию архивации" fi Этот пример объединяет в себе сразу два примера из предыдущего раздела. Оператор if считывает значение состояния завершения команды tar. Если оно равно нулю, выполняются операторы в блоке then, и каталог, который архивировался, удаляется. Если оно отлично от нуля, операторы в блоке then не выполняются и вместо них выполняются операторы в блоке else. Значение состояния завершения также удобно использовать с командой test. Как команда test может использоваться с математическими выражениями, вы уже видели. Но ее еще удобно применять для проверки существования файла, как показано в следующем примере: if [ -f program.conf J then : # ничего не делаем else touch program.conf fi Этот код выполняет проверку на предмет наличия файла program, conf. Если этот файл существует, возвращается значение 0 и выполняется оператор then. В данном случае оператор then ничего не делает» (Ничего не делать ему указывает знак
FreeBSD и командная строка Часть III двоеточия; остальная часть строки — это просто комментарий.) Если такого файла не существует, возвращается значение 1 и выполняется оператор else, который в данном случае создает этот файл с помощью команды touch. Команда test может проверять не только то, существует файл или нет. Она также может проверять атрибуты и тип файла. В табл. 10.3 перечислены все опции, которые поддерживает команда test, а также объясняется, что они означают. Таблица 10.3. Проверка атрибутов файлов в программах оболочки Опция Действие -f Файл существует и представляет собой обычный файл. -d Файл существует и представляет собой каталог. -s файл существует и размер его больше нуля. -г Файл существует и доступен для чтения. -w Файл существует и доступен для записи. -х Файл существует и представляет собой исполняемый файл. Установка значения состояния завершения Практически во всех сценариях, которые приводились в этой главе в качестве примеров, при помощи оператора exit устанавливалось значение состояние завер шения, поэтому сейчас вы уже должны хорошо себе представлять, для чего это значение используется. Когда это значение явно не задается, программа возвращает значение состояния завершения той команды, которая выполнялась последней. Когда это значение задается явно, оно сохраняется в переменной $?, подобно аналогичным значениям других программ. Кроме того, значение состояния завершения программы оболочки, опять-таки, так же как и аналогичные значения остальных программ, может считываться какой-то другой программой для принятия решения по поводу того, что следует делать дальше. Это может оказаться удобным, например, в случае, когда программа оболочки вызывается из другой программы оболочки. Также не забывайте, что использовать в качестве значения состояния завершения можно не только 0 и 1. Вы можете размещать операторы exit во множестве различных точек в программе, делая так, чтобы выполнялась проверка различных условий ошибки и для каждого из них, соответственно, возвращалось разное значение состояния завершения (главное, чтобы это бь*ло положительное число). Вы можете применять в одной и той же программе сразу несколько разных значений состояния завершения для описания разных условий ошибки, которые затем вызывающая программа (например, ваша используемая по умолчанию оболочка или какой-нибудь сценарий оболочки) будет интерпретировать и предпринимать соответствующие действия. Ниже показан пример кода, в котором используется несколько значений состояния завершения: if [ -r program.conf ] then : # ничего не делаем else exit l fi 358
Программирование в командной оболочке Глава 10 359 if [ "touch /tmp/program.lock ] then : # ничего не делаем else exit 2 fi # основные операторы программы exit 0 Эта программа сначала проверяет, доступен ли файл program.conf (то есть, может ли она прочитать его). Если да, она переходит к проверке следующего условия if. Если нет, она немедленно завершает свою работу, возвращая в качестве значения состояния завершения значение 1. Предположим, программе удалось прочитать файл program.conf, тогда она попытается создать файл /tmp/program.lock. Если у нее получится это сделать, она продолжит свою работу. А если нет, она немедленно завершит свою работу, вернув в качестве значения состояния завершения значение 2. И, наконец, при условии успешного выполнения обеих этих операций, программа приступит к выполнению основных своих операторов и затем, когда закончит их выполнять, завершит свою работу со значением состояния 0, которое везде обозначает успех. Эта программа могла бы вызываться из другой программы и затем возвращать свое значение состояния завершения этой программе. А вызывающая программа затем могла бы принимать на основании полученного от этой программы значения различные решения. Перехват сигналов завершения работы Как вы уже знаете, работу программ в FreeBSD можно завершать, отправляя им различные сигналы kill, такие как универсальный сигнал "прерывания", а также при помощи различных клавиатурных команд наподобие <Ctrl+C>. (Узнать больше о команде kill и используемых с ней числовых сигналах вы сможете в главе 15.) Проблема здесь состоит в том, что если, например, программа создает на время выполнения временные файлы и пользователь вдруг прерывает ее работу нажатием клавиатурной комбинации <Ctrl+C>, не дав ей выполниться до конца, программа не успевает "убрать за собой ", то есть все ее временные файлы остаются на диске, занимая столь драгоценное дисковое пространство. К счастью, командная оболочка предоставляет способ для перехвата подобных сигналов прерывания. В листинге 10.19 для примера показана простая программа, демонстрирующая, как могут перехватываться сигналы прерывания. Листинг 10.19. Программа, перехватывающая сигналы прерывания 0. #!/bin/sh 1. # Программа, демонстрирующая перехват сигналов прерывания 2. trap 4echo "Получен сигнал прерывания. Завершение." 1>&2ч 1 2 3 15 3. echo -n "Введите число: " 4. read num 5. exit 0 В этой программе создается ловушка для перехвата таких сигналов прерывания, как 1, 2, 3 и 15. Действия, выполняемые этой ловушкой, перечислены внутри одиночных кавычек. Если вы запустите эту программу и, когда появится приглашение ввести число, не число введете, а нажмете клавиатурную комбинацию <Ctrl+C>, вы
360 FreeBSD и командная строка Часть III тем самым отправите этой программе сигнал 2 (INT), который заставит сработать ловушку, в результате чего на экране появится сообщение Получен сигнал прерывания . Завершение, и работа программы будет завершена. Вы также можете использовать команду echo для перенаправления выходных данных. Выражение 1>&2 в операторе echo указывает, что вывод команды echo должен вместо STD0UT отправляться на STDERR ("standard error" — стандартное устройство для вывода ошибок, которым обычно являегся экран, но в качестве которого может быть указан и журнальный файл). Такой подход позволяет сделать так, чтобы сообщения состояния отделялись от значимых выходных данных, а также исключает вероятность случайной отправки по конвейеру вывода одной команды другой или его отправки вообще в какое-то другое место вместе с остальными выходными данными программы. Будет неплохо, если вы всегда, когда будете создавать сообщения об ошибке, будете с помощью выражения 1>&2 отправлять выходные данные в STDERR. Обычно, конечно, вы будете применять ловушки для решения простых задач вроде удаления ненужных временных файлов или снятия блокировки. При необходимости выполнения в ловушке множества операций из нее лучше сделать функцию (функции будут рассматриваться чуть позже в этой главе). Если вы хотите сделать так, чтобы пользователи не могли завершать работу вашей программы нажатием клавиатурной комбинации <Ctrl+C>, вы можете создать ловушку и не указать в кавычках никакой операции: trap ч ч 2 Благодаря этой строке сигнал 2 будет полностью игнорироваться. Программа может содержать несколько ловушек, и в зависимости от того, как завершается ее работа, могут выполняться различные действия. Ловушка для сигнала О будет срабатывать при всех видах завершения работы программы, как обычных, так и аварийных. Ловушка для других сигналов будет срабатывать только в случае получения одного из этих сигналов. В табл. 10.4 перечислены сигналы, которые перехватываются наиболее часто. Таблица 10.4. Наиболее часто перехватываемые сигналы прерывания и выполняемые при них действия Сигнал прерывания Действие 0 Выход (то есть завершение работы). 1 HUP — зависание сеанса (или отключение). 2 INT — прерывание работы (<Ctrl+C>). 3 QUIT - выход (<Ctrl+\>). 15 TERM — обычная команда kill. НА ЗАМЕТКУ Вы можете перехватывать сигнал 15 (сигнал по умолчанию, отправляемый командой kill). Вы также можете перехватывать практически все другие сигналы, которые могут отправляться командой kill. Однако перехватывать сигнал 9 (sigkill) вы не можете, sigkill используется в качестве последней возможности завершить работу программы, когда все остальные методы уже не помогают. Следовательно, он не может ни перехватываться, ни игнорироваться.
Программирование в командной оболочке | ГТЗ I Глава 10 I I Функции Функции — это готовые наборы операторов, которые могут вызываться посредством одной единственной команды. Их практически можно считать "мини-программами", работающими внутри других программ. Используя функции в своих программах оболочки, вы сможете значительно упростить себе жизнь по двум причинам. Во-первых, при необходимости выполнить сложную операцию сразу во многих местах в программе, вы сможете просто ввести имя соответствующей функции, а не вводить весь код заново каждый раз, когда будет нужно выполнить эту операцию. Во- вторых, если вы позже решите, что эта операция должна работать по-другому, вам придется внести соответствующее изменение только в функцию, а не просматривать весь код и изменять его отдельно везде, где встречается эта операция. В листинге 10.20 показан пример того, как можно создать функцию (здесь создается простая функция, которая удаляет все временные файлы после завершения работы программы), а затем пример того, как ее можно вызвать. Листинг 10,20. Использование функции 1. #!/bin/sh 2. on_exit () { 3. rm -rf /tmp/myprogram.* 4. mv logfile logfile.old 5. mail foo@bar.com < report.txt 6. } 7. trap on__exit 0 1 2 3 15 Сначала указывается имя функции (on exit), затем — круглые скобки и левая (открывающая) фигурная скобка. Между фигурными скобками находится тело функции. Дальше функцию можно вызывать так же, как если бы это была npoi рамма, то есть, используя ее имя. Как уже упоминалось ранее, функции, по сути дела, являются "мини-программами" внутри других программ. То есть каждый раз, когда вы будете вводить имя этой функции, будут выполняться все расположенные внутри ее фигурных скобок операторы. Тем не менее, существует одно важное отличие между вызовом функции и вызовом программы. Функция запускается в текущей оболочке, а программа — в подобо- лочке. Это означает, что функция может изменять переменные оболочки и переменные среды в программе, которая ее вызывает. Внешняя же программа, вызываемая из программы оболочки, не может изменять в вызывающей программе ни переменные оболочки, ни переменные среды. Дескрипторы файлов Дескрипторы файлов — это символические идентификаторы, которые присваиваются файлам и псевдофайлам каждый раз, когда ядро запускает какой-нибудь процесс. Именно их процесс затем использует для записи выходных данных и считывания входных данных. По умолчанию открываются три таких дескриптора.
FreeBSD и командная строка Часть ill Дескриптор Значение F-H. О stdin. Именно отсюда обычно берутся входные данные. Как правило, такие данные вводятся с клавиатуры, но можно сделать и так, чтобы они считыва- лись из файла или какого-нибудь другого источника. F • Н. 1 STDOUT. Именно сюда обычно отправляются выходные данные. Как правило, такие данные отправляются на экран, но, как вы видели, можно сделать так, чтобы они отправлялись и в какое-то другое место. F.H. 2 stderr. Именно сюда обычно поступают стандартные сообщения об ошибках. Опять-таки, как правило, эти сообщения отправляются на экран, но можно сделать так, чтобы они отправлялись и в другое место. Дескрипторы файлов облегчают написание программ оболочки и делают их более эффективными. Команда exec позволяет создавать новые дескрипторы файлов для того, чтобы отправлять выходные данные программы им, а не тем, что используются по умолчанию. Предположим, вы хотите создать программу, которая будет записывать множество строк в файл. Вы можете поступить следующим образом: использовать команду echo и явно отправлять ее выходные данные в файл (при помощи операции >) или использовать команду printf и открывать и закрывать дескриптор файла каждый раз, когда будете ее указывать. Но возможен и третий вариант. В листинге 10.21 показан пример того, как, ссылаясь на дескрипторы файлов напрямую, вы можете сделать программу как более легкой для написания, так и более эффективной. Листинг 10.21. Использование дескрипторов файлов для переадресации выходных данных 1. #!/bm/sh 2. # Открываем дескриптор F.H. 1 (STDOUT) 3. exec > testfile.txt 4. # Отправляем какие-нибудь данные в STDOUT, которые ^>теперь поступят в файл testfile.txt) 5. echo "Строка 1 файла" 6. echo "Строка 2 файла" 7. echo "Строка 3 файла" 8. echo "Строка 4 файла" 9. echo "Строка 5 файла" 10. exit 0 Оператор exec во второй строке этого приведенного в качестве примера кода указывает, что вместо STDOUT (стандартного вывода) теперь используется файл testfile.txt. В результате все строки echo отправляются не на экран, а в файл testfile.txt, хотя выходные данные и не перенаправляются явно в этот файл в операторах echo. Когда данных, которые нужно записать в файл, очень много, такой подход является более эффективным, нежели подход, предполагающий выполнение переадресации выходных данных в каждой отдельной команде, а также и более простым для кодирования. Такой подход также очень удобно использовать с дескрипторами STDIN и, соот* ветственно, с командой read. Пример можно видеть в листинге 10.22.
Программирование в командной оболочке Глава 10 363 Листинг 10.22. Использование дескриптора файла для переадресации входных данных 1. #!/bin/sh 2. # Открываем дескриптор файла F.D. 0 (STDIN) 3. exec < testfile.txt 4. while read string 5. do 6. echo $string 7. done При условии наличия файла testf ile. txt из предыдущего примера, вывод этого кода будет выглядеть следующим образом: Строка 1 файла Строка 2 файла Строка 3 файла Строка 4 файла Строка 5 файла Ну, и что в этом такого замечательного? Этот код демонстрирует очень важную концепцию использования дескриптора файла с командной read, позволяющую сценарию считывать файл, состоящий из множества строк, и работать с каждой из строк этого файла отдельно. Поскольку дескриптор файла не закрывается после каждого вызова команды read, read запоминает, какую строку она считывала последней, и перемещает курсор на следующую строку в файле. Таким образом, команда read автоматически считывает все строки файла строго по очереди. Отладка сценариев оболочки При написании сценариев оболочки, какой бы сложности они ни были, рано или поздно все равно начинают появляться ошибки. Хотя полнофункциональной программы отладки у оболочки нет, некоторые элементарные возможности для отладки она все-таки предоставляет, а именно: позволяет отслеживать (трассировать) каждое выполняемое ею действие. Включить функцию трассировки можно, добавив в конце строки #! /bin/sh в сценарии -xv, то есть эта строка должна выглядеть следующим образом: #!/bin/sh -xv Переключатель -х указывает оболочке выводить каждую команду в STDERR, добавляя перед ней знак плюс (+). Переключатель -v переводит оболочку в режим расширенных сообщений. Эффект от этого в том, что сценарий начинает записывать все, что он делает, в специальный файл ошибок, что, естественно, значительно облегчает процедуру отладки. Будет даже еще лучше, если вы отправите выходные данные по конвейеру команде more или less, чтобы они не исчезали с экрана быстрее, чем вы сможете их прочитать, а также если вы настроите STD0UT и STDERR на одно и то же место так, чтобы вы могли одновременно просматривать и выходные данные сценария, и ошибки. В листинге 10.23 показан простой пример кода; введите его в файле xvtest и сделайте этот файл исполняемым.
364 FreeBSD и командная строка Часть III Листинг 10.23. Простой пример трассировки #!/bin/sh -xv # Демонстрация применения трассировки при отладке сценария оболочки result=4echo "2 * 12 / (2 + 2)" I be4 echo $result exit 0 Выполнить эту программу так, чтобы иметь возможность просматривать одновременно и данные со STDOUT, и данные со STDERR, а также так, чтобы выходные данные отправлялись через конвейер в программу more можно, воспользовавшись для ее вызова такой командой: # ./xvtest 2>&1 | more СОВЕТ Передавать выходные данные через конвейер в программу more (или less, что одно и то же) имеет смысл только в том случае, если сценарий не является интерактивным, то есть не требует участия пользователя. При отладке интерактивных сценариев выходные данные лучше передавать в программу tee, чтобы данные со stdout и stderr попадали в файл. Этот файл затем можно прочитать в другом окне терминала программой less (нажимая клавиатурную комбинацию <Shift+F> для того, чтобы она автоматически отображала новые, идущие в конце файла данные). \ Программа сгенерирует следующий вывод: 1- #!/bin/sh -xv 2. # Демонстрация применения трассировки при отладке сценария оболочки 3. result-4echo "2 * 12 / (2 + 3)и | Ьсч 4. + echo 2 * 12 / (2 + 3) 5. + be 6. + result*4 7. echo $result 8. + echo 4 9. 4 10. exit 0 11. + exit 0 { Теперь мы видим все, что эта программа делала, В строках со знаком плюс (+) в начале отображаются результаты действий программы. Например, в строке под номером 3 переменной result присваиваются результаты вычислений. В строках 4, 5 и 6 отображаются предпринятые программой по этому поводу действия. В частности, в строке под номером 4 мы видим, что программа выполнила команду echo, в строке под номером 5 — что она выполнила команду be, а в строке под номером 6 — что она выполнила операцию присваивания значения переменной, в результате которой переменной result было присвоено значение 4. Этот пример также иллюстрирует работу технологии подстановки значений переменных. Посмотрите на строки 7, 8 и 9. В строке под номером 7 указывается выполнить оператор echo, В строке под номером 8 мы видим, что программа прочитала оператор echo, подставив значение переменной, в результате чего этот оператор стал выглядеть так: echo 4. И, наконец, в строке под номером 9 мы уже видим, как программа отобразила фактический вывод оператора echo (4).
Программирование в командной оболочке I TTZ I Дополнительные возможности, доступные для программирования в оболочке Когп Командная оболочка Когп (которую, как рассказывалось в главе 8, можно установить отдельно), содержит некоторые усовершенствованные функциональные возможности наподобие встроенных арифметических функций и массивов, которые позволяют создавать более простые и более эффективные сценарии. Однако следует дважды подумать, прежде чем применять эти функциональные возможности в сценарии, потому что сценарии оболочки Bourne запускаются в практически любой системе UNIX, тогда как сценарии оболочки Когп могут и будут запускаться только в той системе, в которой была установлена и доступна оболочка Когп. Если сценарий является очень специализированным (что требует использования усовершенствованных функциональных возможностей оболочки Когп) и будет запускаться только в локальной системе или только в системах, в которых оболочка Когп доступна, его применение не будет представлять никаких проблем. Однако если сценарий пишется для коллективного пользования или если его планируется запускать в разных системах, а какие оболочки доступны в этих системах точно не известно, лучше не рисковать и написать его на языке оболочки Bourne или языке Perl (о котором более подробно будет рассказываться в главе 11). Теперь, когда мы вас уже предупредили о возможных проблемах, можем перейти непосредственно к рассмотрению этих самых усовершенствованных функциональных возможностей, доступных в оболочке Когп. СОВЕТ Многие из технологий, которые будут описываться в этой главе, также подходят и для оболочки POSIX, которая поставляется вместе с FreeBSD под именем /bin/sh. Однако вам точно не следует их использовать в сценарии /bin/sh, если этот сценарий будет запускаться в других системах, где оболочка POSIX как bin/sh не применяется. Из-за наличия в начале этого сценария строки #! /bin/sh, другие системы будут все равно пытаться запустить его. Но они будут сразу же зависать, когда перестанут понимать следующий далее в этом сценарии код из-за того, что он не следует правилам синтаксиса, используемого оболочкой Bourne. СОВЕТ Обратите внимание, что многие из сценариев, написанных для Кот, оболочка bash тоже сможет выполнять. Конечно, для этого вам придется изменить первую строку в сценарии так, чтобы она ссылалась не на Когп, а на оболочку bash. Например, в FreeBSD вам для этого придется заменить строку #! /usr/local/bin/ksh строкой #! /usr/local/bin/bash. В Linux, где bash по умолчанию устанавливается в каталог /bin, вам нужно будет заменить эту строку такой: #! /bin/bash. Однако вы можете использовать и просто строку #! /usr/bin/env bash — такой подход является более общим и будет работать одинаково хорошо на всех системах.
FreeBSD и командная строка Установка командной оболочки Когп Прежде чем вы сможете писать программы для оболочки Когп, вы должны установить в своей системе копию командной оболочки Когп. Оболочка pdksh (Public Domain Korn — общедоступная оболочка Когп) доступна для FreeBSD как на DVD-диске в виде пакета в категории shell (который можно установить либо через программу Sysinstall, либо из командной строки), так и в коллекции портов, в разделе /usr/ ports/shells/pdksh. Чтобы указать своей программе, что она должна запускаться при помощи оболочки Когп, замените стоящую в ее начале строку #! /bin/sh на #/usr/local/bin/ksh. Оболочка Когп полностью "обратно совместима" с Bourne, то есть любой сценарий, написанный для оболочки Bourne, будет также запускаться и с оболочкой Когп, но сценарии, написанные для Когп, в Bourne запускаться не будут. Когда установите оболочку Когп, потратьте еще несколько минут на то, чтобы ознакомится с некоторыми ее дополнительными возможностями (см. следующие разделы), которые позволяют создавать более простые, более мощные и более эффективные программы. Встроенные арифметические функции В оболочке Когп имеются встроенные средства для выполнения арифметических операций* Это означает, что, в отличие от Bourne, в Когп вызывать программу ехрг, чтобы выполнить какую-нибудь арифметическую операцию, не нужно. Однако, арифметические операции оболочки Когп, как и у программы ехрг, ограничиваются только операциями над целыми числами. Но поскольку они являются внутренней функцией, Когп выполняет их гораздо быстрее, чем ехрг. Получать доступ к встроенным арифметическим функциям (Ьболочки Когп можно двумя способами. Первый — с помощью оператора let. Например: let x=7+5 В этой строке переменной х присваивается значение 12. Второй способ — путем заключения выражения в двойные скобки, как показано ниже: ((х-7+5)) Такой подход может оказаться более удобным, нежели подход, подразумевающий применение оператора let. Он также является более удобным для математических операций сравнения, чем применяемый в синтаксисе оболочки Bourne подход, который предполагает использование команды test, а все потому, что он позволяет пользоваться знакомыми математическими обозначениями < и >, а не непривычными -It и -gt. Кроме того, в отличие от ехрг, Когп не требует предварять символы, которые могут иметь для нее особое значение, символами обратной косой черты. Например, строка ехрг 5 \* 3 в Когп может выглядеть так: ((5 * 3)). В табл. 10.5 перечислены все арифметические операции, которые поддерживает оболочка Когп.
Программирование в командной оболочке Глава 10 Таблица 10.5. Математические операции, поддерживаемые оболочкой Кот 367 Операция > < <= t = Описание Сложение. Вычитание. Умножение. Деление. Деление по модулю (возвращает остаток деления). Больше. | Меньше. Больше или равно. Меньше или равно. Равно. Не равно. Верно, если оба выражения не равны нулю. Верно, если хотя бы одно из выражений не равно нулю. Присваивает выражению, находящемуся справа, выражение находящееся слева Прибавляет выражение, находящее справа, к переменной, находящейся слева, и затем сохраняет результат в переменной. Вычитает выражение, находящееся справа, из переменной, находящейся слева, и затем присваивает результат переменной. Умножает выражение, находящееся справа, на переменную, находящуюся слева, и затем присваивает результат переменной. Делит выражение, находящееся справа, на переменную, находящуюся слева, и затем присваивает результат переменной. Делит по модулю выражение, находящееся справа, на переменную, находящую* ся слева, и затем присваивает получившийся в результате этой операции остаток переменной. /= Массивы Командная оболочка Когп также поддерживает массивы. Массив (также часто называемый списком) — это переменная, содержащая множество элементов, в каждом из которых хранится свое отдельное значение. Массивы удобно использовать для объединения связанных между собой элементов. Массив можно сравнить с ящиком, в котором имеется множество различных отделений. У каждого отделения — свой номер. Получить доступ к содержимому того или иного отделения можно, указав имя ящика и номер нужного отделения. Создать массив можно с помощью команды set. Например, предположим, что вы хотите создать массив под названием temperature, содержащий данные о средней температуре в определенном регионе за каждый месяц. Для этого вы можете использовать следующую команду (где опция -А указывает, что массиву должно присвоено имя temperature): set -A temperature 57 52 58 61 63 65 71 70 68 66 64 62
368 FreeBSD и командная строка Часть III Эта команда создаст массив по имени temperature с 12 элементами (по одному на каждый месяц в году). Если вы сразу тестируете все приводимые в этой книге примеры в своей системе, тогда просто введите сейчас эту команду в строке с приглашением оболочки Когп (если вы еще на запустили оболочку Когп, сделайте это, введя в командной строке либо команду ksh, либо команду pdksh). Получить доступ к тому или иному элементу в массиве можно через соответствующий ему индекс, просто указав этот индекс после имени массива. Нумерация элементов в массиве начинается с 0; разрешается использовать и групповые символы. Ниже показано несколько примеров различных способов получения доступа к элементам массива temperature: ksh$ echo $ {temperature [ 0 ] } 57 ksh$ echo ${temperature[11]} 62 ksh $ echo ${temperature[*]} 57 52 58 61 63 65 71 70 68 66 64 62 ksh$ Массивы могут содержать до 512 элементов (0-511). Если вы хотите изменить значение только какого-нибудь одного элемента в массиве, вы можете это сделать, сославшись на этот элемент в виде операции присваивания значения переменной. Например, чтобы изменить значение первого элемента в массиве temperature на 55, сделайте следующее: temperature[0]=55 А вот еще о чем следует помнить, имея дело с массивами. • В отличие от скалярных переменных, при ссылке на массивы фигурные скобки являются обязательными. Команда echo $temperature [1] не даст желаемого результата. Правильно она должна выглядеть так: echo ${ temperature [1]}. • Массивы не могут экспортироваться как переменные среды. Вы, конечно, можете предусмотреть для каждого месяца отдельную переменную, но программа, показанная в листинге 10.24, демонстрирует, как, решив вместо этого использовать массивы, вы сможете сэкономить массу времени на программировании. Листинг 10.24. Массивы в сценарии оболочки Когп 1. #!/usr/local/bin/ksh 2. # Демонстрация массивов и вычисление средней температуры 3. set -A temperature 57 52 58 61 63 65 71 70 68 66 64 62 4. i-0 5. printf "NnMecHuXtXtTeMnepaTypaNnXn" 6. while ((i < 12)) 7. do 8. (( month - $i + 1 )) 9. printf ?,$month\t\t${temperature[$i] }\n" 10 (( total_temp += $ {temperature [$i]} )) 11. (( i +- 1 )) 12. done 13. avg_temp=$(( total_temp / 12 )) 14. echo 15. echo "Средняя температура за год: $avg_temp" 16. echo
Программирование в командной оболочке Глава 10 Вот как будет выглядеть вывод этой программы: Месяц Температура 1 2 3 4 5 6 7 8 9 10 11 12 57 52 58 61 63 65 71 70 68 66 64 62 Средняя температура за год: 63 На первый взгляд код этой программы может показаться устрашающим, но на самом деле в нем нет практически ничего нового, кроме синтаксиса, который несколько отличается от того, которым вы привыкли пользоваться при написании сценариев для оболочки Bourne. Также в нем встречаются некоторые новые логические элементы, с которыми вы до этого не сталкивались, но вы сразу же поймете, что они делают после того, как посмотрите, как работает эта программа. • Строка под номером 1. Здесь видно первое отличие: сценарий начинается не со строки #! /bin/sh, а со строки /usr/local/bin/ksh. Если вы случайно введете здесь строку #! /bin/sh, программа работать не будет, и вы будете получать очень странно выглядящие сообщения об ошибках. • Строка под номером 3. Здесь с помощью команды set создается массив под названием temperature, содержащий 12 чисел, каждое из которых представляет собой значение средней температуры за определенный месяц. • Строка под номером 4. В этой строке переменной i (которая представляет собой счетчик циклов) присваивается значение 0. • Строка под номером 6. В этой строке начинается цикл, который будет выполняться до тех пор, пока значение переменной i будет меньше 12. • Строка под номером 8. В этой строке создается новая переменная под именем month, которой затем в качестве значения присваивается значение переменной i, увеличенное на 1 ($i + 1). Она будет использоваться в выводе программы для распечатки номера текущего месяца. А зачем к значению переменной i нужно добавлять единицу? А затем, что переменная i на текущий момент имеет значение 0, и именно оно будет использоваться для извлечения первого элемента из массива temperature. Поскольку нумерация элементов в массивах начинается с нуля, элементы в массиве temperature пронумерованы от 0 до 11, а нам ведь вовсе не нужно, чтобы номера месяцев отображались в соответствии с этой нумерацией. Поэтому единица и добавляется к текущему значению переменной $i при каждом выполнении цикла. • Строка под номером 9. В этой строке выводится текущее значение переменной month, два символа табуляции и значение одного из элементов массива temperature. Обратите внимание, что здесь используется метод подстановки значений переменных. На месте i подставляется хранящееся на текущий мо- 369
370 FreeBSD и командная строка Часть III мент в переменной $i число, которое интерпретируется как номер элемента, который должен быть извлечен из массива. Строка под номером 10. В этой строке к текущему значению переменной $total_temp прибавляется значение, хранящееся в элементе массива temperature под номером $i, после чего получившееся новое значение сохраняется в переменной $total_temp (то есть старое значение перезаписывается). Таким образом, подсчитывается сумма всех температур, которая будет использоваться позже для вычисления среднегодовой температуры. Строка под номером 11. В этой строке к текущему значению переменной i прибавляется единица. К примеру, при второй итерации цикла, в переменной i будет находиться уже значение 1, а не 0, и, следовательно, распечатываться и прибавляться к значению переменной total_temp будет уже значение второго элемента массива temperature. Оператор в этой строке является последним оператором в цикле. Если значение переменной i все еще меньше 12, цикл начинает выполняться снова. Строка под номером 13. В этой строке, когда цикл завершается, вычисляется средняя температура путем деления суммы всех температур, хранящейся в переменной tot^,l_temp, на 12. Получившееся значение присваивается переменной avg_temp. Строка под номером 15. В этой строке среднее значение температуры за весь год выводится на экран. НА ЗАМЕТКУ Согласно подсчетам этой программы средняя температура за год равняется 63 градусам по Фаренгейту, что является наглядным примером того, что арифметические функции оболочки могут иметь дело только с целыми числами. На самом деле среднее значение температуры за весь год должно выглядеть как 63.083333, но поскольку оболочка не умеет обрабатывать числа с плавающей точкой, она опустила десятичную часть числа и отобразила только целое число 63. Если вам необходима большая точность, вы можете использовать для вычислений команду be так, как было показано в листинге 10.6, где be применялась для вычисления длины и площади окружности с применением значения я. Видите, как эта программа позволила сэкономить нам усилия? Вместо того чтобы проходить каждый месяц вручную, мы смогли воспользоваться циклом, который увеличивал значение переменной на 1 и извлекал значения температуры за каждый месяц автоматически. Если бы мы сохранили значения температур не в массиве, а в отдельных переменных, нам пришлось приложить для выполнения этой задачи гораздо больше усилий. НА ЗАМЕТКУ Если вы хотите попрактиковаться, попробуйте изменить эту вычисляющую среднюю температуру программу так, чтобы в ней использовался цикл for, а не цикл while. Небольшая подсказка: массив может принимать в качестве аргумента групповой символ *, который он воспринимает как команду "показать все имеющиеся в нем элементы".
Программирование в командной оболочке 1 „- I Глава 10 I 1 Подстановка команд Оболочка Когп также поддерживает более удобный синтаксис для выполнения подстановки команд, чем оболочка Bourne. Вместо того чтобы заключать команды в левые (также называемые обратными) кавычки, вы можете сделать следующее: todayDate=$ (date) Старый синтаксис тоже поддерживается. Какой из них вы будете применять в своих сценариях для оболочки Когп — ваше личное дело. Использование команды getopts Команда ge?bpts предлагает более удобный способ для обработки аргументов командной строки, нежели синтаксис в стиле Bourne, который демонстрировался ранее в этой главе. Она позволяет пользоваться стандартным синтаксисом для опций {-option)у который применяется в большинстве команд FreeBSD, а также делает более простой обработку передаваемых опциям аргументов. Базовый синтаксис команды getopts выглядит так: getopts options variable Здесь options — это список допустимых опций, которые могут использоваться в данной программе, a variable — имя переменной, в которой все эти опции должны сохраняться. Наличие двоеточия после опции указывает на то, что эта опция тоже может принимать значение. Это значение будет сохраняться в специальной переменной $0PTARG. Существует еще одна специальная переменная — $0PTIND, в которой будет сохраняться значение обрабатываемого на текущий момент аргумента. Команда getopts выполняется по одному разу для каждой опции, вместе с которой она предоставляется. Если использовать ее с циклом while, цикл будет выполняться под одному разу для каждого предоставленного аргумента командной строки. Ниже показан пример того, как работает синтаксис команды getopts: getopts abc:d: myVar В данном случае допустимыми опциями, которые getopts распознает, являются а, Ь, с и d. Кроме того, после опции end следует значение, которое будет сохранено в переменной $OPTARG. Сами опции будут сохранены в переменной myVar. В листинге 10.25 показан простой пример сценария, в котором применяется команда getopts. Обратите внимание, что данный сценарий также будет работать и в оболочке /bin/sh в FreeBSD, но в других системах, в которых в каталоге /bin/sh установлена не POSIX, а какая-то другая оболочка, и которые не поддерживают команду getopts, его запустить не получится. Листинг 10.25. Использование команды getopts для обработки аргументов командной строки 1. #!/usr/local/bin/ksh 2. # Демонстрация использования команды getopts. 3. for i in 1 2 3 4 4. do 5. getopts abc:d: myVar б. echo "$myVar, $0PTARG" 7. done
I TZT I FreeBSD и командная строка I 37Z I Части III Сохранив этот сценарий в файле с именем test.pdksh, вы сможете вызвать его следующим образом: ^ # ./test.pdksh -а -с foobar -b -d blah Обратите внимание, что порядок, в котором указываются аргументы, значения не имеет. Вывод будет выглядеть так: а, c, foobar Ь, d, blah Если вы не укажете ни одного аргумента, переменная myVar будет содержать вопросительный знак (?). Команда get opts выполняется столько раз, сколько аргументов ей передается. В данном случае после первого выполнения команды get opts переменная myVar будет содержать значение а. После второго выполнения команды get opts переменная myVar получит значение с, а переменная $OPTARG — строку foobar. Благодаря этим переменным, а также упоминавшейся ранее переменной $OPTIND, команда get opts может использоваться в программах оболочки для принятия решений в циклах, условных операторах, операторах case и других описанных в данной главе процедурах.
ГЛАВА Основы программирования на языке Perl В этой главе... • PerleFreeBSD • Основные технологии написания сценариев на языке Perl • Простой сценарий Perl • Дополнительные технологии программирования на языке Perl • Полезные источники информации о языке Perl 1
I TZT 1 FreeBSD и командная строка I I Часть III Perl — это интерпретируемый язык программирования, который особенно хорошо подходит для обработки текста и широко применяется для таких задач, как администрирование систем и создание сценариев с CGI-интерфейсом для активного Web- содержимого. Его название официально расшифровывается как Practical Extraction and Report Language — практичный язык для извлечения данных и создания отчетов (хотя существуют и другие варианты, в том числе и забавные). Perl был создан Ларри Уоллом (Larry Wall) в качестве заменителя для awk, и постепенно превратился в настоящую среду программирования со множеством модулей, разрабатываемых и обслуживаемых огромной командной независимых разработчиков. Уолл по-прежнему остается главным разработчиком Perl и в настоящее время работает над новой, усовершенствованной версией Perl 6. Сегодня практически невозможно работать ни в мире UNIX, ни в Internet, не обладая хотя бы минимальными знаниями Perl. Несмотря на многие структурные несоответствия и сложности, Perl действительно удалось стать удобным средством для написания коротких, но зато очень разнообразных программ для практически любой цели. Как и сценарии оболочки, программы, написанные на Perl, компилироваться того, чтобы они запускались, не нужно; более того, такие возможности Perl, как возможность проверки синтаксиса в свободной форме и встроенные возможности для ввода данных и управления ресурсами памяти, делают его намного более удобным в использовании по сравнению с другими, более традиционными транслируемыми языками вроде С. Именно поэтому Perl могут достаточно эффективно пользоваться даже те, у кого нет особо глубоких знаний в области программирования» В этой главе мы рассмотрим некоторые базовые концепции Perl, дабы вы могли пользоваться его преимуществами, не разбираясь настолько хорошо в программировании, чтобы чувствовать себя ограниченными в возможностях. Эта глава рассчитана на пользователей, у которых уже имеется опыт работы в FreeBSD и которые знакомы с основными концепциями создания сценариев оболочки (описывавшимися в главе 10); здесь Perl будет рассматриваться достаточно подробно для того, чтобы вы смогли сами писать простые сценарии и CGI-программы, а также начать хоть немного разбираться в том, что собой представляют более сложные сценарии, которые существуют сегодня. Проработав изложенный в этой главе материал и примеры, вы затем сможете самостоятельно изучить другие технологии Perl, используя основанные на Perl утилиты, которые доступны в FreeBSD, и любые другие подобные программы (загружая их, например, из Internet). НА ЗАМЕТКУ О языке Perl было написано огромное количество книг. Его преимущества и повсеместность в сегодняшнем мире просто очевидны, а его структура является настолько сложной, что даже те, кто могут похвастаться, что разбираются в Perl, не перестают удивляться тому, какие непредсказуемые задачи он может выполнять. Все заслуживающие внимания книги и другие полезные источники по этой теме будут перечислены в конце главы. Perl в FreeBSD Несмотря на все совместные усилия, которые были приложены для того, чтобы заменить сценарии Perl сценариями оболочки и скомпилированными программами, некоторые программы, входящие в состав базовой конфигурации FreeBSD, все рав-
Основы программирования на языке Perl | „« I Глава 11 I I но на самом деле являются сценариями Perl. Все остальные программы в основном представляют собой скомпилированные двоичные коды, созданные на основе исходного кода, который был написан на языке С, C++ или каком-то другом популярном языке. Эти двоичные коды не могут быть прочитаны человеком или бцстро преобразованы в исходную форму. Код Perl, с другой стороны, компилировать не нужно. Он существует в виде простого текста, легко читается и редактируется, и запускается с помощью интерпретатора Perl (/usr/local/bin/perl). В главе 10 рассказывалось, что сценарий, использующий интерпретатор оболочки, можно написать, просто указав в первой строке этого сценария имя нужного интерпретатора. Сценарии Perl работают аналогично. Разница состоит в том, что если сценарии оболочки в основном оказываются полезным только (выражаясь терминами MS-DOS) как "пакетные программы", которые посредством простой подстановки значений переменных и управления исполнением выполняют последовательности команд так, будто бы те вводятся в командной строке, то Perl является полнофункциональной средой программирования, в которой можно писать такие сложные программы, как системы управления Web-серверами или базами данных. Поскольку программы Perl не компилируются, а интерпретируются, они выполняются медленнее (особенно в начале), чем их аналоги, реализованные на языке С, хотя разработка последних, как правило, занимает больше времени. Главным преимуществом Perl являются доступные в нем возможности для обработки строк и текста; в С с такими возможностями работать очень трудно. Поэтому идеальным приложением для программы Perl является сценарий типа системной утилиты (такой как утилита adduser, которая до недавнего времени была сценарием Perl) или CGI-программа, выполняющая операции со строками или файлами. Perl может хуже справляться со сложными матемашческими задаччми, чем хорошо написанная программа С или C++. Поэтому некоторые мо^ти Perl (вроде модуля хеширования MD5) поставляются с базовыми математическими компонентами, написанными на языке С, для улучшения производительности. Хотя в самой FreeBSD язык Perl встречается уже не во всех тех местах, в которых он встречался раньше, он все равно очень часто используется в сторонних приложениях, таких как Majordomo (популярный диспетчер списков рассылки) и SpamAssasin (профамма для фильтрации почты). В рабочей системе FreeBSD вы наверняка будет сталкиваться с программами Perl не менее часто, чем со сценариями оболочки, поэтому вы должны знать, как^ ними работать. Преимущества Perl Perl обладает такими характеристиками, как удобство в использовании, что свойственно сценариям оболочки (высокоуровневый подход), и разносторонность (универсальность), что свойственно программам С (низкоуровневый подход). В ре- зу 1ьтате получается язык, позволяющий использовать переменные многих, самых разнообразных типов данных (среди которых структуры данных, импортируемые объекты, ассоциативные массивы, многомерные массивы и дескрипторы устройств ввода-вывода), не волнуясь о приведении переменных из одного типа к другому, о выделении и освобождении ресурсов памяти, о предварительном объявлении переменных, о разыменовании указателей, о создании прототипов функций и о выполнении ряда других трудных задач, которые приходится выполнять при программировании на языке С, включая компиляцию двоичных кодов.
FreeBSD и командная строка Часть III Perl обеспечивает неимоверную свободу действий, то есть дает вам возможность делать то, что вы хотите, не вдаваясь в сложные и чреватые ошибками детали низкоуровневого программирования. Именно благодаря высокоуровневым средствам, которые делают Perl таким, какой он есть, Perl так часто выбирается для разработки CGI-программ и серверных Web-приложений, необходимость в которых чрезвычайно возросла за последние годы в связи с развитием электронной коммерции. Главной задачей Perl является предоставление мощных возможностей для выполнения операций со строками, таких как сопоставление образцов, замена и преобразование строк, регулярные выражения и использование структуры, которая значительно упрощает выполнение считывания и записи текстовых файлов с помощью встроенных массивов строк. В Perl нет никакой необходимости объявлять переменную как переменную типа строки, типа целого числа или какого-то другого типа. Perl распознает типы переменных по тому, где в структуре они используются, выделяя для каждой из них необходимое количество ресурсов памяти, когда ее значение изменяется, и применяя нужные операции в соответствии с ее типом. Perl практически бесспорно является самым удобным в использовании и наиболее мощным в плане возможностей для программирования языком из всех популярных и широко применяемых в настоящее время. Он имеет достаточно свободный и гибкий синтаксис, позволяющий допускать множество мелких ошибок, за которые другие языки всегда жестоко карают. Perl является расширяемым (потому что для него в Internet доступны тысячи различных импортируемых модулей библиотек), он хорошо документирован и хорошо поддерживается, а также может использоваться где угодно, на десятках разных платформ. Вы можете быть уверенными в том, что сценарий Perl будет работать одинаково, в какой бы системе вы его не запустили* Linux, Mac OS X, IRIX, Windows или FreeBSD. Недостатки Perl Perl разрабатывался не как язык общего назначения, которым он стал. В начале своего существования он применялся исключительно как язык, позволяющий быстро и легко выполнять различные операции со строками, но затем в него стали добавлять все больше и больше других функциональных возможностей. В результате он по-прежнему остается языком с очень быстрыми и эффективными возможностями для обработки текстовых данных, но является из-за этого не очень-то простым в структурном плане. Хотя преимущества Perl действительно заслуживают похвалы, его дизайн никак не идеален. И хотя гибкость Perl позволяет программисту допускать множество различных ошибок, это выглядит как поощрение к созданию "неаккуратного" кода (так же как гибкие в плане стандартов Web-браузеры воспринимаются как поощрение к созданию недействительного или несовместимого HTML-кода) Perl воспринимает синтаксис, который напоминает язык С, BA§IC, Fortran или даже, в некоторых случаях, обычный английский язык. Хотя это дает Perl как язык)' большую гибкость, это также означает, что написанный на Perl код, кажущийся вполне понятным одному программисту, может оказаться совсем непонятным для другого программиста. Структура Perl позволяет выполнять одну и ту же конкретную задачу множеством разных способов; это делает Perl намного более трудным для изучения после прохождения первого легкого ознакомительного этапа, а также означает, что для многих программистов сопровождение программ Perl будет казаться очень трудным делом до тех пор, пока они не овладеют определенными навыками коди- 376
Основы программирования на языке Perl | TZZ I ! Глава 11 I I рования. По этим и некоторым другим причинам Perl считается своего рода "белой вороной" в семействе языков программирования. Python и другие языки программирования, появившиеся после Perl После того как Perl резко стал чрезвычайно популярным, начали появляться и другие проекты, пытавшиеся устранить его недостатки. А после того как о Perl начали все чаще негативно отзываться в мире программирования серверных программ, появились такие языки, как REBOL, Java и Ruby. Однако среди них всех особо выделяется язык, появившийся приблизительно в то же время, что и сам Perl — Python. Python является даже еще более объектно-ориентированным языком, чем Perl, и имеет гораздо более регламентированный синтаксис. Никакие скобки в стиле С в нем не используются; вместо этого в нем значительную роль играют обозначаемые символом табуляции отступы, которые существенно упрощают иерархическую организацию блоков, управляющих исполнением. В Python также широко используются иерархии объектов и имеющие сильно связанную структуру модули (также называемые словарями), предоставляющие намного более простой и расширяемый интерфейс для взаимодействия с объектами, чем может быть доступен в Perl. Если программы, написанные на Perl, компилируются каждый раз во время выполнения, то Python генерирует компилируемый байт-код (файл .рус) только во время первого выполнения программы, что ускоряет ее выполнение при последующих запусках. Это отчасти необходимо потому, что (как и во всех средах объектно-ориентированного программирования) ради скорости приходится жертвовать структурой. Благодаря своей строгой объектно-ориентированной природе, в которой синтаксическая структура и единственный способ\выполнения каждой конкретной задачи являются главными преимуществами дизайна, программы, написанные на языке Python, потенциально менее подвержены возникновению в них неполадок, нежели программы, реализованные на языке Perl. С языком Python также намного легче работать, потому что в нем гораздо реже встречается запутанный код. Однако в Python нет многих возможностей для обработки текста, которые есть в Perl и за которые его, собственно, так и любят. Хотя Python не является частью базовой конфигурации FreeBSD, он доступен в коллекции портов, в категории /usr/ports/lang/python. Его сторонники становятся все более активными и их аргументы звучат все более убедительно, поэтому не исключено, что совсем скоро уже не Perl, a именно Python будет наиболее популярным интерпретируемым языком программирования. Основные технологии написания сценариев на языке Perl Сценарий Perl очень сильно напоминает сценарий оболочки (о которых речь шла в главе 10). Первая строка (называемая строкой интерпретатора) указывает оболочке, какой интерпретатор ей следует использовать для выполнения остальных команд в сценарии: #! /usr/local/bin/perl Во избежание проблем с совместимостью в системах, где Perl может быть установлен в другом месте, эта строка интерпретатора может выглядеть и так: #!/usr/bin/env perl В остальных строках сценария, как и при создании программ оболочки, выполняются знакомые действия: присваиваются переменные, создаются блоки управле-
I „д I FreeBSD и командная строка 1 1 Часть III ния исполнением программы и циклы, добавляются системные вызовы и операции с устройствами ввода-вывода — и это лишь некоторые основные элементы структуры сценария. Ниже показан простой пример сценария Perl: #!/usr/bin/env perl $string = "Добро пожаловать!"; $hostname - hostname4; if ($hostname eq "uncia") { print $string."\n"; print "date"; } Обратите внимание на то, что для отделения блока if используются фигурные скобки как в языке С, а не синтаксис if/fincase/esac, как в сценариях оболочки. Как и в С, каждый оператор завершается знаком ;, что позволяет в большинстве случаев использовать и операторы, состоящие из нескольких строк. Символ пробела между операторами и операциями тоже является необязательным: между "$а « 1" и "$а=1", например, нет абсолютно никакой разницы. Синтаксис Perl намного больше напоминает синтаксис упрощенной версии С, чем синтаксис языка оболочек. Считайте, что Perl представляет собой нечто среднее между языком сценариев оболочки и языком С и обладает наилучшими функциональными возможностями обоих. Сценарий Perl компилировать не нужно. Это значительно упрощает процесс отладки: вы просто редактируете файл, вносите требуемые изменения, прогоня ете его снова, смотрите, какие еще ошибки появились, и опять редактируете его. Интерпретатор Perl выполняет "компиляцию" во время выполнения и не записывает никакого скомпилированного байт-кода. Это делает Perl более медленным по сравнению с полнофункциональным языком С (и именно поэтому практически все системные функции разрабатываются на С), но он прекрасно подходит для написания сценариев, не особо чувствительных к времени и производительности. СОВЕТ Пока вы только изучаете Perl, вам лучше использовать в строке интерпретатора команду perl -с, которая обеспечивает отображение более подробных пояснительных сообщений при проверке синтаксиса и тем самым очень сильно помогает во время отладки. Чтобы запустить сценарий Perl, вы сначала должны указать, что он является исполняемым. Сделать это вы можете с помощью команды chmod: # chmod +x myscript.pl Далее, вы должны добавить префикс . /, чтобы указать, что сценарий находится в текущем каталоге, потому символа . (обозначающего, что данный каталог является текущим) у вас в пути скорее всего не будет, особенно если вы используете учетную запись пользователя root: # ./myscript.pl Добро пожаловать! Sat Sep 30 15:29:17 PDT 2006
Основы программирования на языке Perl Глава 11 НА ЗАМЕТКУ Поскольку сценарии Perl являются интерпретируемыми, делать их исполняемыми или даже помещать в их начале строку интерпретатора для того, чтобы запустить их, вовсе не обязательно. Если хотите (хотя этот метод и является менее "инкапсулированным", чем предыдущий), можете запустить сценарий в виде аргумента в самой команде perl. В таком случае вы сможете выполнить программу, даже если сценарий не был помечен как исполняемый и не содержит строки интерпретатора: f perl myscript.pl НА ЗАМЕТКУ Perl имеет несколько опций, используя которые либо в строке интерпретатора, либо в командной строке, можно изменить его поведение. Переключатель -w, например, включает режим отображения предупредительных сообщений, где интерпретатор Perl информирует о некорректно написанном коде, который может выполняться, но не является на 100% правильным. Эта опция так часто помогает, что не использовать ее просто грешно. Вы можете использовать переключатель -w одним из следующих способов, если все-таки хотите быть уверенными в правильности разрабатываемого кода: # perl -w myscript.pl или #!/usr/bin/perl -w Переменные и операции Переменная в Perl может представлять собой скаляр, массив или ассоциативный массив (то есть хеш-таблицу), которые являются тремя разными способами хранения данных. Эти данные могут принимать форму числа (выражаемого одним из нескольких разных способов), строки текста или того, что в Perl называется литералом (литералы — это данные наподобие 3 или саг, которые означают в точности то же самое, что они отображают). У скалярных переменных (наиболее распространенного вида) имена начинаются со знака доллара ($). В Perl хорошо то, что здесь никогда не нужно волноваться о том, является ли число целым, с плавающей точкой, коротким, длинным или каким-нибудь еще. Также не нужно и воспринимать строку как массив символов, как указатель на строку в памяти или как что-то еще в таком же роде. Perl обрабатывает все эти аспекты внутренне. В Perl даже не нужно преобразовывать строки в числа и наоборот: Perl поймет, что строка содержит только числа, и позволит умножить ее на какое-нибудь число или выполнить с ней какую-нибудь другую математическую операцию. Вся информация в строке, начиная с первого нечислового символа, игнорируется, то есть 123blah в числовых операциях будет восприниматься как 123, a blah — как ноль. Для изменения этих переменных доступны различные операции, а именно: стандартные математические операции (+, -, = и так далее), операции инкремента/декремента в стиле С (++ и —), компактные составные операции (+=, -=, *= и так далее), а также дополнительные операции, такие как операция возведения в степень (**), операция вычисления остатка от деления (%) и операции сравнения, используемые в условных выражениях (>, <, =>, =<, «и !=). Строки можно связывать с помощью операции . и повторять любое количество раз посредством операции х.
380 FreeBSD и командная строка Часть III В Perl доступно очень много операций, намного больше, чем вы можете себе представить. Чтобы рассмотреть их все, потребуется написать отдельную книгу. Поэтому мы перечислим в табл. 11.1 только те из них, которые действительно могут понадобиться при написании сценариев для FreeBSD. Таблица 11.1. Числовые операции Операция + - • / = += ++ ** % • X > < >= <= == ! = Значение Сложение Вычитание Умножение Деление Присваивание Неявное сложение Приращение Возведение в степень Остаток Конкатенация Повторение Больше Меньше Больше или равно Меньше или равно Равно Не равно Применение $с = $а + $Ь; $с = $а - $Ь; $с = $а * $Ь; $с = $а / $Ь; $с = $а; $с += $а; $с++; $с = $а ** $Ь; $с = $а % $Ь; $с = $а . $Ь; $с = $а х $Ь; - Значение $с 7 1 12 1.333... 4 $с + 4 $с + 1 64 1 43 444 Ниже приведен код, демонстрирующий использование переменных, литералов и операций: $а = 5; $а++; $Ь - $а ** 2; $с = "test" . $b; print "$c"; Это код сгенерирует следующий вывод: test36. Здесь сначала переменной $а присваивается значение 5, которое затем (в результате операции ++) увеличивается до 6. Далее переменной $Ь в качестве значения присваивается значение $а в квадрате, то есть значение 36. Потом переменной $с в качестве значения присваивается строка test с присоединенным к ней значением переменной $Ь. И, наконец, переменная $с (значение которой теперь выглядит как test36) выводится на экран. Если вам все это понятно, значит, вам понятно, как строятся блоки в Perl.
Основы программирования на языке Perl Глава 11 381 Скаляры, массивы и ассоциативные массивы Переменные могут использоваться как отдельно, так и в любом количестве включающих любые величины массивов. Как выглядят скалярные переменные вроде $а, $Ь и $с, вы уже видели в предыдущем примере; скалярная переменная содержит одно единственное число или строку. Но каждая из таких переменных существует сама по себе, а будут случаи, когда вам придется иметь дело с целыми наборами связанных между собой данных. Вот где вам пригодятся массивы: Garrayl = ("blah",5,12.7,$а) ; Garray2 « <$а, $Ь, $с); Массив подчиняется тем же соглашениям об именовании, что и скалярная переменная, за исключением того, что его имя должно начинаться с символа @, а не $. Как видно в этих примерах, указывать какой-нибудь определенный размер или тип данных при объявлении массива не нужно. Массивы могут содержать числа, строки, другие массивы и прочие, какие вы захотите, данные. Для получения доступа к элементу массива следует использовать квадратные скобки. Например, чтобы получить доступ к третьему элементу в показанном выше массиве Qarrayl, вы должны были бы применить $arrayl [2]. Запомните, что нумерация элементов в массиве начинается с нуля! Вы также увидите, что иногда в ссылках на элементы массивов вместо префикса $ используется префикс @. Этот префикс обозначает, что вы можете обратиться к целому "фрагменту" массива, указав не один, а несколько элементов (например: Qarrayl [1,2]). Этот пример по сути сам является массивом с двумя элементами. А если вы укажете @arrayl [2], то будете иметь в виду фрагмент с одним элементом, который в принципе будет представлять собой ту же скалярную переменную и работать тем же образом. Однако, для порядка, вы должны помнить, что на элементы массивов лучше ссылаться через префикс $ (то есть $arrayl[2]), потому что префикс переменной указывает на ее тип. Вы можете использовать различные операции, которые, по сути, являются встроенными функциями, чтобы настроить массивы так, вам нужно. Массивы еще также часто называют списками. В таком контексте массив может рассматриваться как "стек", предлагающий такие операции, как push (), pop (), shift () и unshif t (). Все эти операции описываются в табл. 11.2 и для примера применяются к массиву Garrayl. Таблица 11.2. Операции для работы с массивами Операция Результат Синтаксис push() Добавляет значение в конец push(@arrayl, "test") ; списка (?arrayl = ("blah", 5,12.7, 6, "test") pop 0 Удаляет значение из конца $d = pop (@arrayl) ; списка и возвращает его Garrayl - ("blah", 5,12,7,6b $d = "test" unshift {) Добавляет значение в начало unshif t (Garrayl, "test") ; Списка Garrayl = ("test","blah",5,12.7, 6 shift {) Удаляет значение из начала $d = shift (Sarrayl) ; списка и возвращает его earrayl = ("blah", 5,12.7,6), $d = "test"
FreeBSD и командная строка СОВЕТ Вы можете выполнить каждую из этих операций, присвоив ее вывод новому или даже тому же самому массиву. Следовательно, написав @array3 = push (darrayl, "test"), вы сможете создать новый массив с новым более длинным содержимым и тем самым оставить исходный массив ($arrayl) нетронутым. Даже еще более полезной для работы с массивами является функция sort(). Например, sort (Qarrayl) отсортирует все элементы массива в лексикографическом порядке, интерпретируя их как строки. Вы можете указывать свой собственный алгоритм сортировки и тем самым расширять возможности sort () так, чтобы она делала именно то, что вам нужно. Например, если вы создадите подпрограмму под названием numerically (), сортирующую аргументы в числовом порядке, вы можете сделать следующее: sort numerically (@arrayl) СОВЕТ : Специальные подпрограммы сортировки (о том, как создаются подпрограммы, будет рассказываться чуть позже в этой главе) можно применять для сортировки списков элементов на основании любого (какого захотите) критерия, заставляя их либо сравнивать элементы структур данных, либо выполнять со значениями перед сравнением какие-то сложные вычислительные операции. Любую простую числовую программу сортировки можно сократить до одного единственного оператора <=>, а это значит, что отсортировать массив @arrayl по числам вы сможете и с помощью такой строки: sort <-> (@arrayl); Массивы особенно полезны при работе с реляционными данными как через интерфейс реальных баз данных, так и в простых текстовых файлах с разделителями вроде /etc/passwd. Именно используя массивы, вы сможете получать доступ кот- дельным строкам в файле, считываемом с STDIN (стандартного ввода). О том, как именно это делается, речь пойдет позже в этой главе. СОВЕТ Вы можете извлечь значение размера массива, получив к нему доступ в "контексте скалярной переменной". Самый простой способ сделать это — присвоить список в качестве значения скалярной переменной: $size = @arrayl; Таким образом, вы сможете узнать, что размер массива Garrayi равен 4. Функция split () позволяет создать массив из строки скалярной переменной Она разбивает строку на элементы массива, используя указанный разделитель: $mystring - "Тест(Мое имя|Интересные данные|123"; @mydata = split{/\|/,$mystring)/ Здесь в первой строке переменной $mystring в качестве значения присваивается строка, состоящая из четырех разных фрагментов текста, которые отделены друг от друга символом |. Во второй строке функция split () разбивает строку на четыре
Основы программирования на языке Perl Глава 11 383 части, удаляя выступающие в роли разделителя символы |, и делает эти части элементами массива @mydata. Обратите внимание на то, что для разграничения выражения-разделителя используются символы косой черты (/), а также на наличие символа обратной косой черты (\), который используется для отмены символа ), то есть для того, чтобы символ | интерпретировался как символ-разделитель, а не как какая-нибудь "альтернативная" операция, что будет играть немаловажную роль чуть позже в этой главе, когда будут рассматриваться регулярные выражения. В любом случае, теперь имеется массив @mydata, элементами которого являются следующие строки: Тест, Мое имя, Интересные данные и 123. Ассоциативный массив — это массив особого вида; он похож на хеш-таблицу, в которой различные значения хранятся в виде пар "ключ-значение". Для ссылки на ассоциативный массив используется знак процента (%), но поскольку каждое значение в массиве представляет собой скалярную переменную, для ссылки на отдельные элементы ассоциативного массива может применяться и префикс скалярных переменных, то есть $. Ниже показан пример создания ассоциативного массива: $assocl{keyl} =* "valuel"; $assocl{key2} = "value2"; После этого вы можете применить одну из нескольких доступных для ассоциативных массивов операций сразу ко всему массиву целиком; Gmyvalues = values(%assocl); while (($mykey, $myvalue) ~ each(%assocl)) { print "$mykey -> $myvalue\n"; ) Ассоциативные массивы очень полезны в CGI-приложениях, где все переменные из HTML-форм отправляются на сервер и затем передаются в ассоциативный массив на основе имен полей формы. О программировании CGI-приложений более подробно будет рассказываться в главе 26. Управление выполнением программы Одной из причин, по которым Perl можно считать полнофункциональной средой программирования, а не просто языком сценариев пакетной обработки, является наличие в нем целого набора структур для управления исполнением программы. Именно они позволяют создавать в программах сложные пути и циклы. if/elsif/else Наиболее часто используемой управляющей конструкцией является блок if: if <$a == 5) { # Если $а равняется 5 — print "Это 5\п"; } elsif ($а > 5) { # В противном случае, если $а больше 5... print "Больше 5\п"; } else { # Во всех остальных случаях... print "Должно быть меньше 5\п"; 1
FreeBSD и командная строка Часть III НА ЗАМЕТКУ Обратите внимание на то, что в условной конструкции обязательно должна использоваться операция равенства (==), а не операция присваивания (=). Операция == и другие операции сравнения (перечисленные в табл. 11.1) всегда могут применяться в условных конструкциях. Но если сравниваются строки, вместо них могут использоваться и их строковые эквиваленты: то есть вместо == может указываться eq, вместо < — it, вместо ! = — пе и так далее. foreach Не менее часто в Perl используется и такая управляющая конструкция, как foreach, которая позволяет проходить по всем элементам массива. Показанный ниже в качестве примера оператор foreach делит массив @buffer на отдельные элементы; на время выполнения цикла, которым он управляет, присваивает каждый элемент переменной $line и позволяет использовать его столько раз, сколько имеется элементов в массиве: foreach $line (Gbuffer) { print $line; } Если вы опустите являющееся необязательным имя переменной, ссылающееся на элемент, который должен проверять цикл (в данном примере это — $line), используйте вместо него так называемую переменную "по умолчанию" $_ для ссылки на текущий элемент. Однако здесь лучше все-таки всегда указывать имя переменной, это позволит избежать путаницы в случае множества вложенных циклов foreach. for Perl также поддерживает и стандартный цикл for, который практически ничем не отличается от того, что используется в С. Цикл for выполняется определенное количество раз, вместо того чтобы выполняться столько раз, сколько имеется элементов в массиве, как это делает цикл foreach. Цикл for управляется переменной итерации (обычно такой, которая не встречается больше нигде в сценарии), которая проверяется автоматически до тех пор, пока не достигнет указанного предела. Его аргументы, как и в С, отделяются друг от друга при помощи точки с запятой (;). К ним относятся имя переменной итерации, операция приращения и конечное условие. Ниже показан простой пример цикла for: for ($i; $i++; $i<100) { print "$i\n"; } Этот цикл for распечатает 100 сток, с номерами от 0 до 99. Здесь первый аргумент указывает, что переменной итерации является переменная $i, а второй — что значение переменной $i должно быть инкрементировано. Этот цикл for будет выполняться до тех пор, пока условие, указанное в третьем аргументе, не вернет false, что в данном примере случится сразу же, как только значение переменной $1 достиг нет значения 100.
Основы программирования на языке Perl Глава 11 385 while/until/do И, наконец, в Perl также доступен цикл while, который представляет собой упрощенную версию цикла for без переменной итерации. В качестве аргумента while принимает условный оператор, который выполняется каждый раз, когда начинается цикл, и продолжает выполняться до тех пор, пока условие не станет ложным. Ниже показан простой пример цикла while: while ($i < 100) { $i +- 5; } print "$j\n"; Этот цикл выполнится 20 раз, после чего оператор print отобразит на экране значение 20. Вариантом цикла while является цикл until, который имеет прямо противоположное значение: он продолжает выполняться др тех пор, пока условие остается истинным. Ниже показан пример цикла until, который делает то же самое, что и показанный в предыдущем примере цикл while: until($i -* 100) { $i +- 5; $j++; } print '^jXn"; Этот цикл используется очень редко; программисты, работающие на языке Perl, отдают предпочтение циклу while, задавая соответствующее ситуации условие (которое обычно легче понять) ¦ Еще один способ применения цикла while или until — использовать его в виде конструкции dc.while или do., .until. Такой подход гарантирует, что цикл хоть один раз, но будет выполнен; к тому же в этом случае условие, указанное в условной конструкции, будет проверяться не в начале цикла, а в конце. Ниже показан простой пример цикла do...while: do { $i += 5; $j++; } while ($i < 100); print "$j\n"; Обратные одиночные (левые) кавычки позволяют Perl выполнять любую команду так, будто она выполняется в командной строке или сценарии оболочки. Просто заключите свою команду в обратные одиночные кавычки, и Perl выполнит ее с помощью /bin/sh, дождавшись пока завершится порожденный процесс, прежде чем продолжить. Более того, вывод заключенной в обратные одиночные кавычки команды будет доступен в виде возвращаемого значения, так что вы всегда сможете поместить его в какую-нибудь переменную для того, чтобы использовать позже. Ниже показан наиболее часто встречающийся пример применения этих кавычек: $date « Mate4;
386 FreeBSD и командная строка Часть III Обратите внимание на то, что в конце такой возвращаемой строки обычно стоит \п, а это значит, что вы можете воспользоваться функцией chomp О , чтобы вырезать ее, либо в отдельной строке, либо заключив исходное выражение в скобки: chomp($date ** ч dates); ВНИМАНИЕ! Не забывайте о том, что Perl может и не знать пути к командам. Команды, вызываемые вашим сценарием, могут работать на вашей машине, но если вы перенесете этот сценарий в другую систему, он может там не заработать из-за невозможности найти команды, указанные в обратных одиночных кавычках. Наилучший способ защититься от такой проблемы — это указывать полный путь к каждой вызываемой команде: @who « Vusr/bin/who4; Что касается внешних команд, которые должны будут вызываться из ваших сценариев, вы можете определить их пути в переменных в начале сценария. Объявление этих переменных в разделе, который легко найти, поможет другим пользователям быстро устанавливать их местонахождение и обслуживать их: $who * "/usr/bin/who"; Далее вы можете использовать переменную $who уже в левых одиночных кавычках, например, для вызова программы who. Будьте очень осторожны! Ошибка, в результате которой в переменную $who будет помещено неправильное значение, или специально ориентированная на достижение такого эффекта атака приведет к тому, что сценарий будет выполнять вместо вашей безобидной команды who чьи-то произвольные команды. Аргументы командной строки Вы можете передавать программе Perl в командной строке практически столько аргументов, сколько захотите. Все эти аргументы, разделяемые символом пробела (если только они не заключаются в кавычки), помещаются во время выполнения в массив @ARGV и могут использоваться для любых целей: # ./myscript.pl test "Некоторая строка" 123 $ARGV[0] - теперь test, $ARGV[l] - Некоторая строка, a $ARGV[2] - 123. Этот прием также подходит и для CGI-программ, как будет показано в главе 26. Если вы укажете URL-адрес с применением разделенных символами + аргументов (что является обычным способом передачи аргументов CGI-программам), массив @ARGV будет заполнен точно таким же образом: http://www.example.com/myscript.cgi ?test+Heкoтopaя%20cтpoкa+123 Простой сценарий Perl В сценарии, который показан в листинге 11.1, используются практически все технологии, которые мы успели рассмотреть в этой главе, а также ряд других, о которых речь пока еще не шла.
Основы программирования на языке Perl Глава 11 387 Листинг 11.1. Пример простого сценария Perl (siinpledemo.pl) #!/usr/bin/env perl # <STDIN> - это идентификатор устройства ввода-вывода, ссылающийся # на стандартный ввод. В данном контексте он используется для чтения # вводимого в командной строке текста. Операция chomp удаляет все # символы новой строки/возврата каретки, идущие в конце вводимых строк. print "Пожалуйста, введите свое имя: "; chomp ($name * <STDIN>); srand; # Инициализируем генератор случайных чисел Gnamelist « ("Боб","Джейн","Френк"); @colorlist « ("зеленый","красный","синий","желтый"); foreach $testname (@namelist) { # Вы можете выбрать любой случайный элемент массива, # воспользовавшись функцией rand О colors{$testname} - $colorlist[rand(@colorlist)]; } while (($name,$color) « each(%colors)) { print "$name: $color\n"; undef ($n); # Функция undef() обнуляет значение переменной. Подобна NULL, do { $color - @colorlist[$n+l]; $n++; } until ($color eq "blue"); ) Дополнительные технологии программирования на языке Perl Теперь пришло время рассказать о более интересных вещах, которые можно делать в FreeBSD с помощью Perl, а именно: о получении доступа к файлам, о функциях, модулях и, конечно же, о возможностях обработки текстовых данных, которые являются предметом гордости Perl. Все эти вопросы как раз и будут рассматриваться в следующих разделах. Обработка текстовых данных Главным преимуществом и исходной целью, для которой создавался Perl, как уже упоминалось ранее, являются возможности обработки текстовых данных. Perl разрабатывался на основе более простых средств обработки текста, эффективность которых заключалась в использовании регулярных выражений. Регулярное выражение (также часто называемое regexp или regex) — это очень высокоэффективный способ определения образца, который требуется отыскать в потоке текста. Регулярные выражения можно использовать для выполнения простого поиска строк или изменять их так, чтобы поиск ограничивался только началом или концом строки, группами определенных символов, вложенными строками конкретной длины или любым количеством вхождений указанного образца. Регулярные выражения являются неотъемлемой частью многих различных средств в FreeBSD и других системах типа UNIX, в частности такой занимающейся сопоставлением образцов утилиты, как grep и ее вариантов. Perl предоставляет та-
FreeBSD и командная строка кую же степень гибкости, как и grep, но делает это в полнофункциональной среде программирования. Это то, чего так не хватает практически всем остальным языкам. Например, в С нужно копировать туда-сюда строки из памяти и отыскивать в них символ за символом, что является довольно-таки утомительным и не совсем простым процессом. Выполнение поиска с помощью регулярных выражений Самым простым образцом регулярного выражения является текстовая строка. Чтобы найти регулярное выражение в строке, используйте операцию =~ и окружите регулярное выражение символами косой черты (/): if ($string -~ /abcl23/) { ... Вы можете даже еще упростить этот код, если вы уже получаете текстовую строку, например, из ромбической операции О, которая позволяет циклически просматривать текстовый файл, указанный в командной строке (подробнее об этом — в следующем разделе). Если это так и у вас уже есть переменная $_ (так называемая переменная "по умолчанию", с которой вы уже встречались в разделе, посвященном циклу for each), вы можете выполнить поиск неявно: if </*Ьс123/) { ... НА ЗАМЕТКУ Переменная "по умолчанию" ($_) — бесспорно полезная вещь, но пользоваться ею постоянно не рекомендуется, потому что при наличии множества вложенных циклов очень легко запутаться и забыть, что она означает. Лучше все-таки назначать текущему значению в цикле именованную переменную. Все это, конечно, хорошо и замечательно. А что насчет поиска более сложных образцов? Например, вы можете захотеть изменить образец abcl23 так, чтобы при поиске он считался подходящим только в том случае, если он находится в начале строки. Вы можете сделать это с помощью символа А: /Aabcl23/ Символ $ интерпретируется как указатель того, что образец может считаться подходящим только в том, случае если он находится в конце строки, только тогда, когда он стоит после регулярного выражения. Иначе он воспринимается как префикс в имени переменной. Если вы применяете сразу оба этих символа одновременно, вы сможете указать* что образец abcl23 может считаться подходящим, только если он занимает собой целую строку (то есть, только если в этой строке нет больше никаких данных, кроме этого образца): if </ЛаЬс123$/) { ... И это мы перечислили лишь самые основные элементы, доступные для работы с образцами регулярных выражений. А ведь еще можно применять квадратные скобки, (например, так: [abc]), чтобы указать "класс" символов, состоящий из любых букв (в данном примере это буквы a, b и с), или использовать квантификаторы сразу после любого символа, класса или группы, чтобы указать, сколько раз подряд она может встречаться. В табл. 11.3 приводится список таких образцов (хотя, конечно, и не полный).
Основы программирования на языке Perl Глава 11 Таблица 11.3. Синтаксис регулярных выражений Образец Объяснение Текст 389 ] ' Любой одиночный символ. [abcl23] Любой из символов в группе abcl23. [лаЬс123] Не один из символов, перечисленных в группе abc. [а-g] Все символы между а и g включительно. abcl I abc2 Альтернатива: abcl или abc2. (abcl23) Группирование (для использования с квантификаторами, альтернативами или обратными ссылками). Квантификаторы ? О или 1 предыдущего текста. * 0 или л предыдущего текста (л > 0). 1 или л предыдущего текста (л > 1). Вынуждает * отыскивать минимальное совпадение. Точное повторение предыдущего текста m раз. Повторение предыдущего текста от п до m раз. Повторение предыдущего текста m или более раз. + {т} {т,п} {т,} Привязки $ \ь \в Привязка к началу строки. Привязка к концу строки. Граница слова. Отсутствие границы слова. Служебные коды \х \г \п \f \t \d \w \s \D \W \S \m \cX Отменяет (интерпретирует как литерал) любой символ х, который не совпадает с существующим служебным кодом; например, \. будет интерпретироваться как символ точки, а не как "любой символ". Возврат каретки. Перевод строки. Перевод страницы. Символ табуляции. Цифры (то же самое, что и [0-9]). Буквенные символы (то же самое, что и [a-zA-Z0-9_]). Пробелы (то же самое, что и [\r\t\n\f ]). Не цифры. Не слова. Не пробелы. ASCII-символ ### (в восьмеричной форме). Символ <Ctrl+x> (где х— это любой символ).
I ГГ7 I FreeBSD и командная строка I 1 Часть HI Более того, еще также можно добавлять в конце образца, после конечного символа косой черты (/), различные переключатели и тем самым изменять смысл заданного поиска. Например, добавление переключателя i (вот так: /abc/i) позволит сделать так, чтобы при поиске образца регистр не учитывался. НА ЗАМЕТКУ При группировании в регулярном выражении наивысший приоритет имеют скобки, после них — множители, потом — привязки и только затем — альтернативы. Регулярные выражения могут быть очень сложными. Усовершенствование хорошо составленного регулярного выражения, которое выполняет какую-нибудь чрезвычайно сложную задачу, может стать одной самых увлекательных процедур в вашей работе с UNIX. Изменение текста с помощью операций трансляции Конечно, какой же поиск без возможности выполнения замены. В Perl имеется несколько встроенных операций трансляции: операция "замены" (s///), операция "транслитерации" (tr///) и явные функции для обработки строк, такие как substr (). Чтобы выполнить замену, следует использовать опять-таки операцию =-, но только на этот раз как операцию присваивания, а не как операцию сравнения. Для этого ей в качестве аргументов следует указать операцию s, регулярное выражение, строку замены и любые другие необходимые опции: $mystring =~ s/*test[0-9]/foo/g; А вот еще один более полезный пример, в котором угловые скобки заменяются управляющими HTML-последовательностями для того, чтобы они отображались на Web-странице: $myhtml =~ s/</&lt;/g; $myhtml =~ s/>/figt;/g; g в конце строки означает "global" ("глобально") и указывает операции замены на необходимость "заменить все", то есть каждое вхождение testl, test2 и так далее словом f оо. Если опустить опцию д, заменено будет только первое встретившееся вхождение. Одной из наиболее полезных явных функций для текстовой обработки является substr (). Способы использования этой функции, а также всех других встроенных функций, подробно описываются в любом справочном руководстве по Perl. Поэтому мы не будем вдаваться в особые подробности, а скажем только, что она в качестве аргументов принимает строку, смещение и длину и затем возвращает только эту подстроку. Например: $mystring = "кошки и собаки"; $newstring = substr ($mystring,0,5) ; $newstring в этом случае получит значение кошки. Это уже здорово, но истинная мощь функции substr () проявляется тогда, когда она применяется вместе с функцией index (). Эта функция возвращает позицию, в которой в строке находится данная подстрока:
Основы программирования на языке Perl Глава 11 391 $mystring = "кошки и собаки"; $newstring s substr($mystring,index($mystring," кошки"),index($mystring,"собаки")); В этом случае $newstring присваивается строка "кошки и ". Вы также можете использовать вместо функции index () функцию г index () для поиска последнего вхождения лексемы; это может оказаться удобным при необходимости извлечь базовое имя и расширение файла, загружаемого, например, через Web-форму CGI: $basename = substr ($ filename, 0, rindex ($ filename ,"<")); $ext = substr($filename,rindex($filename,M.M)+1,255); Использование дескрипторов файлов для работы с файлами Perl имеет доступ к тем же основным, помогающим управлять исполнением программ дескрипторам файлов, с которыми мы встречались в главе 10, а именно к: STDIN, STD0UT и STDERR. Более того, возможности для работы с дескрипторами файлов, которые указывают на реальные файлы, в Perl очень обширны и позволяют делать так, чтобы программы обрабатывали файлы любым необходимым образом. С помощью дескрипторов файлов можно открыть файл, передать его в массив, записать информацию в новый файл или даже выполнить все эти операции сразу со многими файлами одновременно. Самым простым дескриптором файлов является ромбическая операция о, у которой в принципе вообще нет никакого постоянного дескриптора: она представляет собой просто способ, позволяющий рассматривать входящий файл (или набор файлов) из командной строки как входной дескриптор файла до тех пор, пока в этом файле остаются строки для считывания. Чтобы воспользоваться ромбической операцией, подготовьте цикл наподобие такого, как показан ниже: while (о) { print $_; } Затем запустите свою программу, указав одно или более имен файлов в командной строке: # ./myscript.pl filel.txt file2.txt ... Это приведет к распечатке содержимого всех указанных файлов, почти так же, как и при использовании команды cat. Такой способ получения доступа к содержимому файлов является удобным и быстрым. Однако он также и достаточно ограниченный; ромбическая операция в принципе представляет собой "вырожденный вариант" истинного дескриптора файла. Давайте рассмотрим несколько заданных должным образом дескрипторов, чтобы увидеть, что они на самом деле могут делать. Название дескриптора файла принято вводить заглавными буквами. Создать его можно командой open (). После этого с ним можно выполнять следующие действия: читать из него информацию, передать в него информацию или закрыть его. Ниже показано, как можно открыть файл и распечатать его строка за строкой:
392 FreeBSD и командная строка Часть III open (FH,"/path/to/filel.txt"); while ($thisline - <FH» { $i++; chomp ($thisline); print "$i: $thisline\n"; } close (FH); Бывает так, что Perl не удается открыть файл, либо потому что он не существует, либо потому что установленные полномочия не разрешают выполнять чтение этого файла, либо еще по какой-то причине. Вы можете перехватить подобные события, воспользовавшись операцией die: если при вычислении выражения управление перейдет к die, он передаст свой аргумент (если таковой имеется) на стандартный вывод и выполнение сценария завершится. Ниже показан наиболее распространенный способ применения операции die при открытии файлов: open (FHf"/path/to/filel.txt") I! die ("Невозможно открыть filel.txt!"); Выполнение записи в файлы является немного более сложной задачей, потому что существует так много различных способов того, как ее можно выполнить. Главное, запомните, что для записи можно применять любой дескриптор, который разрешается использовать в командной строке, такой как > (перезапись) или » (добавление), или даже | (конвейер). Последний может пригодиться, скажем, для того, чтобы сценарий записывал свой вывод в электронное сообщение (обратите внимание на упрощенный метод прохода через массив @contents и распечатки каждой строки): open <FH,">/path/to/file2.txt"); print FH $_ foreach ((^contents); close (FH); open (MAIL," | /usr/sbin/sendmail -oi -t"); print MAIL "From: meXesomewhere-cornVn"/ print MAIL "To: you\@somewhereelse.com\n"; print MAIL "Subject: Важная информация!\n\n"; print MAIL $_ foreach (^contents); close (MAIL); ВНИМАНИЕ! Запомните, что при использовании символов 6 в текстовых строках (в адресах электронной почты, например), перед ними обязательно следует указывать символы обратной косой черты (\), чтобы Perl не воспринимал их как идентификатор массива. Если этого не делать, выполнение сценария будет завершаться выдачей сообщения об ошибке. Дескриптор файла передается в качестве аргумента команде print; здесь важно понимать следующее: если только не был указан какой-то другой дескриптор, предполагается, что*этим аргументом является встроенный дескриптор файлов <STDOUT> (стандартный вывод). Также еще имеется дескриптор <STDIN> (стандартный ввод). Чтобы указать дескриптор устройства ввода-вывода, который должен использоваться по умолчанию, применяйте функцию select (): select (FH);
___^ Основы программирования на языке Perl I Г77 I Глава 11 I I В таком случае вам не придется все время вводить print FH. Однако вам обязательно нужно будет изменить дескриптор обратно на STDOUT, когда вы закончите работать С FH. Для работы с каталогами доступны свои функции: opendir () и readdir (); вы можете открыть каталог и прочитать его содержимое в массив следующим образом: opendir (DIR, "/path/to/dir"); @files * sort readdir (DIR); closedir (DIR); Даже с помощью всего лишь описанных методов вы уже можете делать некоторые очень интересные вещи. Например, вы можете открыть файл /etc/passwd, выбрать оттуда все записи с идентификатором пользователя (UID) больше 1000 и распечатать регистрационные и обычные имена таких пользователей: #!/usr/bin/env perl open (PASSWD, "/etc/passwd") J| die ("Невозможно открыть файл passwdi"); while ($line = @passwd) { # Для каждого члена @passwd... @userdata = split(/:/, $line); # Разбить на столбцы и присвоить @userdata if ($userdata[2] > 1000) { # Если UID больше 1000... print '^usetfdatatO]: $userdata[4]\n"; } ) Вот и готова полезная программа! Именно это и делает Perl таким популярным. Он позволяет создавать программы, затрачивая лишь минимальное количество усилий, что значительно упрощает жизнь. Функции Perl имеет сотни встроенных функций, со многими из которых вы уже познакомились. Эти функции позволяют решать практически все необходимые при программировании задачи, особенно когда знаешь, как добавлять модули Perl, расширяющие доступные функции настолько, насколько это необходимо. Однако, придет время, когда вы, создавая все более сложные программы Perl (в частности такие, которые состоят из множества сценариев Perl, вроде серверных CGI-приложений), захотите определить свои собственные функции (они в Perl называются подпрограммами) для выполнения необходимых вам постоянно задач. Вы можете определять функции в любом, каком захотите, месте в сценарии; для того, чтобы они работали, они вовсе необязательно должны быть уже "объявленными". Ради аккуратности, вы можете предпочесть поместить определения своих функций в конце, или разместить их все в одной строке, или в начале — это не важно. Для примера предположим, что вы хотите сделать так, чтобы некое случайное количество значений передавалось функции, и она складывала эти значения вместе. Для этого вам необходимо воспользоваться следующим синтаксисом: sub sum { $mysum += $_ foreach (@_); $mysum; # Эта строка вычисляет значение $mysum и, таким образом, # определяет значение, которое будет возвращать функция }
I _Q A I FreeBSD и командная строка 1 1 Часть HI Затем вы можете вызвать функцию, указав перед ее именем в качестве префикса символ &: $newsum * &sum(45,14,2134, 89) ; Переменная @_ ссылается на список аргументов, во многом подобно тому, как @ARGV представляет аргументы, передаваемые самой программе из командной строки. Чтобы использовать более "традиционную" функцию, такую, которая имеется в практически всех других языках (то есть, которая принимает в качестве аргумента определенное количество именованных переменных), вы можете сделать что-нибудь в таком роде: sub printname { ($name, $number, $passwd) « @_; print "$name/$number" if ($passwd); } При использовании функций возникает целый ряд вопросов, связанных с "глобальным" и "локальным" пространствами имен. В Perl дело обстоит следующим образом: здесь обычно нет никаких локальных функций, все они определяются на глобальном уровне (если только не используется объектно-ориентированный синтаксис, который лежит в основе системы модулей Perl, и будет вкратце описываться чуть позже в этой главе). Все переменные, которые вы определяете в функции, являются глобальными, если только вы специально не укажете, что это не так (например, с помощью операции local ()). Массив @ уже является локальным; каждый раз, когда вызывается функция, массив ее аргументов создается в виде совершенно новой локальной копии. Используя local О, вы можете сделать то же самое и с другими переменными, то есть сделать так, чтобы они считались действительными только в пределах функции, а после ее выполнения не учитывались: sub sura { local($mysum); $mysum +* $_ for each (@_); $mysuir; # Эта строка вычисляет значение $mysum и, таким образом, # определяет значение, которое будет возвращать функция } Операция ту служит той же цели и является более популярной сегодня. Вы можете использовать ту для указания списка локальных переменных: ту ($mysum, $name, $hash); "Строгий режим" (strict mode) — это опция, которую вы можете вызывать в своих сценариях для того, чтобы иметь уверенность в том, что небезопасные конструкции и потоки данных блокируются; действие этого режима распространяется в основном только на глобальные и локальные переменные и функции. (Вызывается строгий режим в начале сценария оператором use strict.) При работе в "строгом режиме" Perl будет отображать соответствующие сообщения в случае неправильного задания локальных переменных в пределах каждой функции и будет разрешать использовать их только после того, как они будут объявлены в операции ту. Содержание памяти в чистоте не представляет сложности в Perl, потомуччто программы Perl склонны выполняться и завершать свою работу без промедления, но такое поведение все равно может гарантировать только правильно составленный код.
Основы программирования на языке Perl Глава 11 395 Модули Perl В каждом хорошем языке имеются какие-нибудь совместно используемые библиотеки, и язык Perl — не исключение. На самом деле, библиотеки Perl (называемые модулями), которые представляют собой фрагменты неисполняемого кода Perl с расширением . pm ("Perl script module* — модуль сценариев Perl) являются, как и коллекция портов FreeBSD, результатом усилий множества независимых, взаимодействующих через Internet разработчиков. Порты и модули на самом деле даже связаны между собой. Код Perl можно поместить в файл . pm, находящийся в том же каталоге, что и сценарий (например, в файл mylib.pm), и затем вызвать его с помощью операции use, не указывая расширение . pm: use mylib; Структура поддержки Perl в FreeBSD установлена в каталоге /usr/local/lib/perl5. Однако никаких модулей Perl там нет: вы сами определяете, какие модули вам нужны (во время работы с системой) и устанавливаете их в этот каталог. В каталоге /usr/ local /lib/perl 5 содержится два подкаталога: в одном хранятся соответствующие страницы руководства (его именем служит номер текущей версии Perl, то есть он может называться, например, 5.8.6), а в другом — сами модули (его имя выглядит как site_perl). Внутри последнего (на уровень ниже) находятся различные каталоги, в которых содержатся группы всех установленных наборов модулей. Также там еще находится каталог i386-freebsd; в нем содержится предварительно скомпилированный код С, который некоторые модули (например, насыщенные математическими операциями алгоритмы) используют для улучшения производительности. Работа с модулями Модули поставляются в виде групп; префикс и название модуля отделяются друг от друга двумя знаками двоеточия (то есть ::), как и в C++. Например, Net:: Telnet — это название модуля Perl, в котором содержатся функции работы с Telnet, a Net:: DNS — это название модуля Perl, предоставляющего функции поиска на серверах имен. Эти модули доступны в подкаталоге Net каталога /usr/local/lib/per 15/ site_perl/5.8.6 в виде файлов Telnet.pm и DNS.pm. Именно этот каталог указан в пути поиска Perl. Для добавления модуля в сценарий применяйте операцию use, например: use Net::Telnet; Теперь вы сможете использовать в своем сценарии любую из доступных в этом модуле функций так, будто бы вы определили ее внутри самого сценария, просто добавляя перед ее именем амперсанд (&). НА ЗАМЕТКУ Некоторые модули Perl требуют, чтобы вы объявляли все функции, которые собираетесь использовать. Например, в модуле Image:: info доступно множество подпрограмм для работы с изображениями, но, предположим, что необходимы только две из них: image_inf о и dim. Они объявляются с помощью операции qw (), которая позволяет указывать массив строк, отделяя их друг от друга пробелами (qw расшифровывается как "quoted words" ("слова в кавычках")): use Image: rlnfo qw(image_info dim);
I ГГГ 1 FreeBSD и командная строка I 396 1 Часть III Данный способ не является единственным, как это часто бывает в Perl: если объявить нужно только одну подпрограмму, это можно сделать, просто заключив ее имя в кавычки: use Image::Info •image_infо•; А как узнать, какие функции доступны в модуле? С помощью perldoc, вот как. Эта утилита работает подобно команде man, и при условии, что модули были установлены должным образом (например, из коллекции портов, как в следующем примере), позволяет просматривать документацию по любому модулю. В листинге 11.2 показан фрагмент документации по модулю Image:: Size. Листинг 11.2. Пример документации по модулю Perl # perldoc Image::Size Image::Size(3) Написанная пользователями документация по Perl Image::Size(3) NAME Image::Size - считывает размерности изображения в нескольких популярных форматах SYNOPSIS use Image::Size; # Извлекаем размер файла globe.gif ($globe_x, $globe_y) » imgsize("globe.gif"); # Для остальных примеров предполагаем, что Х=60/ a Y=4D use Irr.age: :Size 'html^imgsize'; # Извлекаем размер в формате "HEIGHT~X WIDTH^Y" для генерации HTML $size - html_imgsize("globe.gif"); # $size — "HEIGHT«40 WIDTH*60" use Image::Size ,attr_imgsize*; # Извлекаем размер в виде списка, передаваемого программам в файле CGI.pm 8attrs = attr_imgsize("globe.gif"); # Gattrs — ('-HEIGHT1, 40, '-WIDTH1, 60) use Image::Size; # Извлекаем размер буфера в памяти ($buf__x, $buf_y) = imgsize($buf); В такой документации обычно содержится пригодный для использования и точный прототип кода, который можно вставлять в сценарии, а также полный перечень всех доступных функций. Модули Perl и коллекция портов "Корректным'* способом установки модулей Perl считается способ, предполагающий использование коллекции портов, который более подробно будет рассматриваться в главе 16. Перейдите в каталог /usr/ports и посмотрите на различные доступные там подкаталоги. Вы увидите, что названия многих из них начинаются с префикса р5-. В таких подкаталогах находятся модули Perl, которые были встроены в соответствующие порты FreeBSD. (Многие из них также доступны и в виде пакетов.) Модули нередко поставляются со скомпилированными С-компонентами, а
Основы программирования на языке Perl 1 TTZ I Глава 11 I I также многочисленными вспомогательными модулями и документацией, поэтому так важно, чтобы все было установлено в правильном месте. Порты гарантируют это. Порт для модуля Net::Telnet называется /usr/ports/net/p5-Net-Telnet, и такая схема именования применяется для всех модулей: два знака двоеточия (::) заменяются дефисом. В некоторых категориях портов доступны десятки модулей Perl; все они добавлялись туда по мере необходимости. Такая модель распространения позволяет Perl быть расширяемым практически до бесконечности, оставаясь достаточно гибким в своей конфигурации по умолчанию. Чтобы установить модуль из коллекции портов, просто скомпилируйте его так же, как компилировали бы любой другой порт, то есть с помощью команды cd перейдите в каталог, в котором он находится, и затем выполните команды make и make install. Модули Perl поддерживают команду make test, которая выполняет настройку и вычисляет, насколько хорошо данный модуль будет работать в данной системе; она запускается неявно вместе с утилитой make'портов. Для проверки того, какие модули были установлены, можно применять pkg__inf о и pkg_version, что намного проще, чем не забывать просматривать каталог /usr/ local /lib/perl 5. Также можно пользоваться и другими командами pkg_: например, вы можете использовать команду pkg_add, чтобы установить модуль Perl из tar-архива, если хотите, или выдать команду pkg_update, чтобы обновить его, когда появится новая версия. Полезные источники информации о языке Perl Поскольку Perl является таким популярным, совсем не удивительно, что доступно столько источников, в которых можно найти информацию о нем, причем в практически любом формате. Почти каждый, у кого работа связана с написанием и предоставлением содержимого для Internet, вынужден знать хотя бы что-нибудь о Perl, поэтому в книжных магазинах успешно продаются книги по этой теме, а в Web часто задаются и обсуждаются между специалистами по Perl вопросы вроде того, как сделать в Perl то или как сделать в Perl это. В следующих разделах перечисляются некоторые наиболее централизованные и "официальные" источники информации о Perl. Web-сайты Если вам нужно узнать что-нибудь о Perl, вам следует сначала заглянуть в Web. Материал, доступный в Web, конечно, не будет таким же точным или исчерпывающим как в книге, но если у вас нет такой книги, хоть какой-нибудь ответ на интересующий вас вопрос вы обязательно там найдете. www.perl.org www.perl. org — это Web-сайт любителей Perl, который представляет собой независимый источник полезных ссылок и информации о Perl. Здесь доступны списки рассылок, на которые можно подписаться, а также перечень других Web-сайтов, посвященных этой же теме, таких как Web-сайт www. perl doc. com, который является настоящей централизованной базой данных документации по Perl.
FreeBSD и командная строка www.perl.com www.perl.com — это "официальный" посвященный Perl сайт, созданный и обслуживаемый сотрудниками издательства O'Reilly, на котором можно найти все новости о Perl, почитать статьи об его использовании, а также поучаствовать в обсуждениях различных касающихся его вопросов. Этот сайт является, пожалуй, наиболее полным если не в плане справочной информации, то уж точно в плане происходящих каждый день в жизни Perl событий. Книги Почти у каждого пользователя Perl под рукой всегда есть хотя бы одна из популярных книг, выпущенных издательством O'Reilly; более подробных и более удобных в использовании книг о Perl, чем эти, просто не найти. Книга с верблюдом на обложке Книга Programming Perl, Third Edition — это полное справочное руководство по языку Perl, вышедшее в издательстве O'Reilly в 2000 году. Авторами этой книги являются Лэрри Уолл (Larry Wall) (которого называют "отцом" Perl), Том Кристиансен (Тот Christiansen) и Джон Орвант (Jon Orwant). На ее обложке изображен верблюд, который стал графическим логотипом Perl, и она постоянно выходит в новых изданиях, охватывая самые последние разработки в мире Perl, а также считается "исчерпывающей* работой по данной теме. Одним из главных ее преимуществ является организованный в алфавитном порядке раздел с описанием доступных в Perl функций, которому просто нет цены. Книга с ламой на обложке Книга Learning Perl, Fourth Edition, написанная Рэндалом Швартцом (Randal L. Schwartz) и Томом Фениксом (Tom Phoenix) (издательство O'Reilly, 2005 год) является, можно сказать, "младшей сестрой* книги Programming Perl; на ее обложке изображена лама. В ней рассматриваются основные концепции Perl (практически те же самые, что рассматривались в этой главе), причем настолько подробно и увлекательно, что по прочтении язык Perl уже больше никогда не будет казаться читателю "иностранным". Книга-словарь для разработчиков Книга Perl Developer's Dictionary, написанная Клинтоном Пирсом (Clinton Pierce) (издательство Sams Publishing, 2001 год), представляет собой подробный справочник по доступным в Perl функциям и на сегодняшний день считается одной из наиболее исчерпывающих работ по данной теме. Она прекрасно подходит для более опытных пользователей Perl, которых интересуют не уроки по применению Perl, а его синтаксис и методика программирования. Самоучитель Книга Teach Yourself Perl in 24 Hours, которая тоже была написана Клинтоном Пирсом (Clinton Pierce) (издательство Sams Publishing, 2002 год), представляет собой пошаговое руководство для новичков и позволяет очень быстро научиться использовать Perl на практике (Освой самостоятельно Perl за 24 часа; ИД "Вильяме", 2000 год).
Основы программирования на языке Perl I Г7Г I Глава 11 I I Также еще доступна книга Teach Yourself Perl in 21 Days (издательство Sams Publishing, 2002 год), которая представляет собой уже учебное пособие следующего (более глубокого) уровня и содержит огромное количество конкретных примеров. Другие книги Кроме того, рекомендуется почитать следующие книги, посвященные Perl: • Perl: наглядный курс программирования, Пол Уайтхэд и др. ("Диалектика", 2001 год) • Разработка CGI-приложений на Perl, Кевин Мельтцер, Брент Михальски (ИД "Вильяме", 2001 год) • Разработка сетевых программ на Peri, Линкольн Д, Штайн (ИД "Вильяме", 2001 год) • Применение MySQL и Peri в \/[/е1н1риложениях9 Поль Дюбуа (ИД "Вильяме", 2002 год) Архив CPAN CPAN (Comprehensive Perl Archive Network — исчерпывающий сетевой архив Perl) — это место, где все встречающиеся в Net модули Perl были собраны вместе и сделаны доступными для общественного пользования. Кроме этого, здесь еще находятся двоичные дистрибутивы, сценарии и другие средства, а также, для смельчаков, исходный код Perl. Тем не менее, главным достоинством этого архива является все- таки огромный перечень модулей; если в коллекции портов нет модуля, который вы хотите установить, можете быть уверены, что найдете его (а также всю необходимую для его правильного использования документацию) в CPAN. Центральный сайт CPAN доступен по адресу http://www.cpan.org. Но по всему миру существует также и множество зеркальных сайтов CPAN, позволяющих гораздо быстрее получать доступ к имеющемуся в этом архиве содержимому. Вы можете воспользоваться списком "сайтов CPAN" и найти тот сайт, который находится наиболее близко к вам с географической точки зрения, после чего установить для него закладку и тем самым обеспечить себе возможность быстро получать к нему доступ в будущем. Также не забудьте установить закладку и для страницы http: //search. cpan.org, на которой предлагается упрощенный и эффективный механизм для поиска модуля по указанным критериям или документации по используемому модулю.
TbIV ЧАС Системное администрирование В этой части... Глава 12. Файловая система FreeBSD Глава 13. Пользователи, группы и полномочия Глава 14. Конфигурация системы и сценарии запуска Глава 15. Мониторинг производительности, управление процессами и автоматизация задач Глава 16. Инсталляция дополнительного программного обеспечения Глава 17. Печать Глава 18. Конфигурация ядра Глава 19. Поддержание актуальности FreeBSD Глава 20. Добавление жестких дисков Глава 21. Курс выживания в FreeBSD
12 ГЛАВА Файловая система FreeBSD В этой главе... • Структура каталогов FreeBSD • Мониторинг использования файловой системы • Монтирование и размонтирование файловых систем FreeBSD • Монтирование и размонтирование файловых систем из других операционных систем • Монтирование и размонтирование файловых систем компакт-дисков и дискет • Файл /etc/f stab • Проверка и исправление файловых систем с помощью программы f sck • Установка и ввод квот на использование диска • Блоки, файлы и индексные дескрипторы
404 Системное администрирование Часть IV Чтобы понять, как работает FreeBSD, вы должны себе четко представлять, как система управляет файлами, и должны понимать, чем в корне отличается работа с файлами в FreeBSD и в других операционных системах (ОС). В любой операционной системе файлы группируются в каталоги, а доступ к файлам осуществляется посредством файловой системы, которая представляет собой специфическую архитектуру и набор интерфейсов между ядром и данными, хранящимися в системе. Файловых систем насчитывается как минимум столько же, сколько и операционных систем; по сути, их насчитывается даже немного больше, поскольку любая отдельно взятая операционная система может использовать одновременно не сколько различных файловых систем — вопрос лишь в том, будет ли ее ядро поддерживать эти файловые системы. Файловые системы имеют непонятные и сокращенные названия, которые иногда, но не всегда, показывают свое отношение к той или иной системе, В Linux обычно применяется Ext2FS или Ext3FS (а также пару альтернативных файловых систем вроде ReiserFS), в Windows 2000/XP — NTFS, в Мае OS X — в основном используется HFS+, а в Windows 95/98/Me — VFAT (файловая система MS-DOS). В компьютерном мире насчитывается еще очень много файловых систем, каждая из которых обладает определенными техническими преимуществами или предназначена для специального использования. FreeBSD использует BSD Fast Filesystem (FFS — быстрая файловая система FreeBSD), которая заменяет первоначальную UFS (Universal или Unix Filesystem — универсальная файловая система или файловая система Unix, в зависимости от постановки вопроса). Многие из инструментов, о которых пойдет речь в этой главе (например, mount), относятся к UFS как к файловой системе, которая в FreeBSD используется по умолчанию, однако на самом деле это не так. Исходная, "истинная* UFS применялась только в самых ранних ОС UNIX стиля BSD, а в FreeBSD она была заменена совершенно другой файловой системой — FFS. Очень часто названия файловых систем употребляются вперемешку друг с другом, что не совсем верно. FFS обычно используется в FreeBSD, OpenBSD, NetBSD и других операционных системах, включая Mac OS X (основа которой, именуемая Darwin, построена на FreeBSD и на основном дистрибутиве BSD). Это нужно будет учитывать, когда далее в этой главе мы будем обсуждать вопрос монтирования файловых систем из других операционных систем. НА ЗАМЕТКУ Самую полную справку и описание файловых систем, используемых в мире компьютеров, можно найти ПО адресу http: //www. faqs .org/docs/Linux-HOWTO/Filesystems-HOWTO.html. В этой главе вы ознакомитесь с принципами организации файловой системы FreeBSD, узнаете, как разделы жесткого диска подключаются (или монтируются) к ее определенным расположениям, как осуществляется работа с компакт-дисками, дискетами и сетевыми файловыми системами; вы узнаете также, как выполнять монито ринг того, сколько дискового пространства занимает каждая файловая система. Мы поговорим также о технологиях обслуживания, таких как команда f sck, обеспечив» ющих эффективную работу дисков, и рассмотрим вопрос установки квот на иегшг зование дискового пространства пользователями.
Файловая система FreeBSD Глава 12 405 Структура каталогов FreeBSD Если вам приходилось работать с какой-либо операционной системой UNIX или ей подобной, то структура каталогов FreeBSD будет вам знакома (рис. 12.1). usr bin boot cdrom dev etc home lib root sbin var afb^cki/ps brash cfon db log mail run spool tmp Рис. 12.1. Файловая система FreeBSD; показана часть иерархической структуры, начиная с корневого каталога (/) Однако между файловой системой FreeBSD и файловыми системами, используемыми в Linux, Solaris и других ОС семейства UNIX, существует ряд ключевых отличий. Для пользователей, привыкших работать в операционных системах семейства Windows, или в классической среде Macintosh, структура каталогов может показаться чрезвычайно сложной. Как и многое другое в области UNIX, первоначальные причины подобных вещей вроде необычной традиционной схемы именования успели кануть в лету, однако в этой главе мы попытаемся пролить свет на файловую систему FreeBSD. Это будет сделано таким образом, чтобы помочь вам познакомиться поближе с ее причудами, и чтобы вы смогли уютно чувствовать себя в ней. В табл. 12.1 перечислены ключевые элементы файловой системы FreeBSD. Выполните команду Is -F /, и вы получите представление о верхнем уровне файловой системы FreeBSD, включая перечисленные элементы и, возможно, что-нибудь еще, в зависимости от специфики установки и версии FreeBSD. В этой таблице, как и в выходных данных, полученных с использованием флага -F команды Is, каталоги обозначаются косой чертой (/), символические ссылки — значком @, а исполняемые файлы — звездочкой (*). Если сопоставить структуру каталогов в FreeBSD и в похожих операционных системах вроде Linux, то можно найти ряд ключевых отличий. Структура каталогов в FreeBSD является строго контролируемой, и самое простое правило гласит следующее: все, что инсталлирует администратор, помещается в структуру каталогов /usr/ local. Несмотря на то что в других операционных системах пользователи могут инсталлировать свои программы в тот каталог, который им необходим, FreeBSD поддерживает строго структурированные директивы по своим переносимым программам и пакетам, чтобы все инсталлируемые лично вами файлы помещались в структуру /usr/local (более подробно об этом рассказано в разделе "Введение в пакеты" в главе 16). Несмотря на те что по умолчанию программа может помещать свои библиотеки в каталог /var/lib, а свои конфигурационные файлы в каталог /etc, FreeBSD применяет заплаты к сценариям инсталляции (модифицирует их) таким образом, чтобы файлы помещались в каталоги /usr/local/libn /us r/ local /etc, соответственно. По сути, все конфигурационные файлы любых программ вы можете инсталлировать в каталог /usr/local/etc.
406 Системное администрирование Часть IV Таблица 12.1. Ключевые элементы файловой системы FreeBSD Каталог Назначение bin/ boot/ compat@ dev/ etc/ home@ mnt/ proc/ rescue/ Здесь содержатся статически связанные бинарные файлы (автономные программы, которые не зависят от совместно используемых библиотечных модулей, хранящихся отдельно). Эти файлы могут применяться даже тогда, когда вы выполняете аварийную загрузку и не имеете доступа ни к каким файловым системам, кроме /, которую нельзя смонтировать в данных обстоятельствах. Программы в каталоге /bin являются, как правило, программами, ориентированными на пользователя, и командами, не влияющими на работу системы в целом, тогда как программы, расположенные в каталоге /sbin, являются административными программами, которые могут изменять поведение системы (этим объясняется использование префикса "s" (от "system" — система)). Этот каталог содержит ядро (kernel), которое представляет собой главный исполняемый файл системы. Ядро управляет всеми устройствами, организует работу в сети и выполняет множество других задач. В главе 18 мы подробно рассмотрим вопросы, связанные с ядром, В каталоге /boot имеются также конфигурационные и исполняемые файлы, которые используются на этапе загрузки системы. Это символическая ссылка на структуры каталогов, которая обеспечивает совместимость с другими операционными системами, такими как Linux. Во многих установках этот каталог является пустым. Это специальный каталог. Файлы, находящиеся в нем, обычно являются устройствами (device) — файлами специального типа, которые обеспечивают программы интерфейсами к любым устройствам, поддерживаемым ядром. Фактически, dev/ является точкой монтирования, в которой обычно монтируется файловая система устройств — devf s. Давным-давно это был единственный каталог для хранения случайных файлов, которые нельзя было поместить куда-либо еще. Сейчас здесь хранится большинство конфигурационных файлов масштаба всей системы, включая ваши пользовательские (парольные) базы данных и сценарии запуска системы. В зависимости от вашей установки, это может быть простой каталог или символическая ссылка на каталог /usr/home. Здесь содержатся все домашние каталоги обычных пользователей. Если предполагается, что ваша система будет обслуживать большое количество пользователей, которые будут работать с данными, занимающими очень много места, сделайте каталог /home символической ссылкой на каталог /usr/home, чтобы пользовательские данные помещались в раздел /usr, а не в гораздо меньший раздел root, или создайте специальный раздел для каталога /home (см. главу 20). Пустой каталог, который предусмотрен для вашего удобства как точка монтирования, если вам понадобится смонтировать другой диск. Содержит файловую систему процессов (proofs) и является интерфейсом для таблицы процессов. Этот каталог используется ради удобства некоторыми программами, и не является необходимым для работы системы (как правило, в современных системах он не монтируется). Содержит набор жестко связанных программ, которые формируют среду "мини-FreeBSD" в ходе инсталляции системы и в случае аварийных ситуаций, возникающих во время работы в автономном режиме.
Файловая система FreeBSD Глава 12 407 Окончание табл. 12.1 Каталог Назначение root/ Домашний каталог пользователя root. Он не помещается в каталог /home в целях безопасности и является доступным во время аварийной загрузки. sbin/ Содержит системные бинарные файлы, которые компонуются статическим образом. Эти программы отличаются от программ из каталога /bin тем, что они служат для изменения поведения системы, в то время как программы из каталога /bin являются обычными пользовательскими инструментами. sys@ Ссылка на ресурсы ядра (если вы инсталлируете их). tmp/ Содержит временные файлы. Любой пользователь может записывать файлы в этот каталог. Если в файле /etc/rc.conf вы установите переменную clear_tmp_enable="YES", то содержимое каталога /tmp будет удаляться во время каждой загрузки. usr/ Каталог UNIX System Resources — вход в остальную часть системы. Содержит динамически компонуемые программы, файлы пользователей и программы, которые вы инсталлируете самостоятельно. В последующих главах мы будем работать главным образом с этим каталогом. Подкаталоги /usr определяются строго в соответствии с их назначением; наиболее важным подкаталогом для вас, как для администратора FreeBSD, будет каталог /usr/local. var/ Содержит файлы переменных данных (variable file). К ним относятся файлы сре^ы исполнения, используемые программами, журнальные файлы, каталоги подкачки, базы данных и другие элементы, изменяющие обычную работу си- стемы и ее приложений. Если программа устанавливает сценарий запуска таким образом, чтобы он за- тскался во время загрузки системы, то сценарий будет помещен в каталог /usr/ local/etc/re. cL Все, что будет находиться в этом каталоге, будет запускаться во время загрузки, но только после того, как будут запущены сценарии в аналогичном каталоге /etc/red (сценарии запуска базовой системы). НА ЗАМЕТКУ Иерархия файловой системы FreeBSD разработана таким образом, чтобы наиболее точно соответствовать стандарту FHS (Filesystem Hierarchy Standard — стандарт иерархии для файловой системы), хотя он был создан на манер Linux и включает некоторые соглашения, выдвигаемые системой FreeBSD (например, практика помещения файлов Web-содержимого в каталог /srv). Полное описание FHS, включая расшифровки многих загадочных аббревиатур, можно найти по адресу http: //en. wikipedia. org/wiki/Filesystem__Hierarchy_Standard. Преимуществом строго контролируемой структуры является относительно простая поддержка системы FreeBSD, и особенно простое воссоздание системы на новом компьютере (например, при модернизации компьютера, когда устанавливается новое оборудование). Теоретически вы можете скопировать все дерево каталога /usr/local с одного компьютера на другой, и все будет работать одинаково на обоих компьютерах. Однако это довольно рискованное дело, и любая подобная операция может столкнуться с многочисленными непредвиденными трудностями — например, любая нормально используемая система наверняка настраивалась с помощью "хитрых" приемов, которые нельзя будет воспроизвести, если вы просто перемести-
I ТГГ 1 Системное администрирование I °8 I Часть IV те каталог /usr/local на новый компьютер. Тем не менее, такой вид переносимости системы является идеальным, и к нему стремится FreeBSD. Тем не менее, очевидным недостатком регламентированной структуры FreeBSD является то, что если вы попытаетесь перенести программу из Linux или Solarise FreeBSD, то вас может замучить исправление ожидаемых путей. Например, если у вас есть программы, написанные на языке Python в Linux, в которой интерпретатор Python установлен в каталоге /usr /bin/python, то в FreeBSD программы работать не будут, поскольку Python не является частью базовой установки и, следовательно, инсталлируется как /usr/local/bin/python системой портов или пакетов. Вымажете без труда устранить эту проблему для одного или двух файлов, модифицировав их строки интерпретатора, которые определяют, где можно найти Python; а вот перенос установки с сотнями таких программ может сразу же оказаться трудновыполнимой задачей. Чтобы соблюсти совместимость между платформами, можно прибег- нуть к самому простому варианту: нарушить директивы структурирования FreeBSD и сделать так, чтобы символическая ссылка /usr/bin/python указывала на /usr/ local /bin/python. Перенесенные программы тотчас же заработают. СОВЕТ Чтобы справиться с проблемой интерпретаторов вроде Perl и Python, инсталлированных в различных местах в различных системах, можно воспользоваться следующим удобным способом: вместо строки #! /usr/local/bin/python применить строку интерпретатора #! /usr/bin/ env python. Подробное описание файловой системы FreeBSD можно по пучить по команде man hier. Мониторинг использования файловой системы Файловая система FreeBSD представляет собой одну большую иерархию каталогов, начинающуюся с каталога /, являющегося корневым. Каждому разделу жесткого диска (или дисков) назначается его собственная локальная иерархия, и эти разделы присоединяются к структуре файловой системы FreeBSD в различных назначенных точках монтирования (mount point). Чтобы следить за тем, сколько дискового пространства занято вашими данными, вам нужно наблюдать за каждой монтируемой файловой системой, начиная с точки монтирования каждой из них. Идея точек монтирования принадлежит операционным системам типа UNIX и для пользователей Windows непонятна. В Windows/DOS каждому диску в вашей системе назначается буква диска (например, С:), и каждый диск имеет свою собственную независимую файловую систему. Например, компьютер с двумя жесткими дис ками и дисководом компакт-дисков может иметь диски С:, D: и Е:, между которыми может переключаться пользователь. В UNDC есть только одна структура каталогов масштаба всей системы, и все диски в системе монтируются в различных точках структуры, которые администратор выбирает по собственному усмотрению. Здесь можно провести такую аналогию: система Windows напоминает ряд фруктовых деревьев, а система UNDC больше похожа на одно большое дерево, к стволу и ветвям которого прививаются маленькие деревья. Все привитые элементы "дерева" UNIX формируют одну иерархическую структуру (рис. 12.2).
Файловая система FreeBSD Глава 12 Р /dev/ad0s1a А: С: D: FreeBSD Windows Рис. 12.2. Схематические изображения структур файловых систем FreeBSD (UNIX) и Windows no аналогии с деревьями Преимущество структуры этого типа заключается в том, что в вашу систему можно очень легко добавить дополнительное дисковое пространство. Чтобы увеличить пул пространства, доступного для некоторой части иерархии, вам просто нужно смонтировать здесь новый диск или раздел (об этом мы поговорим далее в этой главе). Эта структура имеет и свой характерный недостаток: в подобной файловой системе гораздо сложнее переместить все содержимое одного диска на другой диск. В Windows или Mac OS вы можете переместить всю вашу систему на новый диск большего объема с помощью простой операции перетаскивания, поскольку там каждый диск представляет собой отдельную файловую систему. В системе FreeBSD эта задача существенно усложняется. Иерархическая структура более всего подходит для компьютера-сервера, долго работающего на одном и том же оборудовании, чем для настольного компьютера, в котором данные очень часто переживают аппаратную часть. Команда df (свободное место на диске) Использование команды df ("disk free" — свободное место на диске) является самым прямым способом определения состояния использования диска вашей системы. Изучение данных, производимых командой df, входит в повседневную проверку состояния (более подробно об этом мы поговорим в главе 15, в разделе "Использование планировщика периодических задач"). В процессе своего выполнения эта команда дает подробную информацию о ваших файловых системах и указывает их соответствующие имена устройств.
410 Системное администрирование Часть IV Когда вы выполняете команду df, вы получаете результаты следующего рода: Filesystem /dev/adOsla devfs /dev/adOslf /dev/adOslg /dev/adOsle lK-blocks 128990 1 25799 8027686 257998 Used 74314 1 44 1990866 30586 Avail 44358 0 237316 5394606 227694 Capacity 63% 100% 0% 27% 14% Mounted on / /dev /tmp /usr /var Каждая секция или раздел диска считается "файловой системой" и может быть смонтирован в любой точке в структуре каталога. Результаты выполнения команды df показали, что эта файловая система имеет четыре раздела BSD на ее главном диске IDE (/dev/adO), которые смонтированы в каталогах /, /tmp, /usr и /var. В процессе инсталляции FreeBSD такая установка выбирается по умолчанию. Обратите внимание на то, что для файловой системы / выделено всего лишь около 128 Мбайт, a /var» /tmp имеют по 256 Мбайт; остальная часть диска отведена под каталог /usr. Числа в выходных данных команды dr* не обязательно находятся способом, который вы могли бы предположить. Цифры, которые вы видите, зависят от количества задержек и оценок, вызванных кэшированием и другими процессами. Они будут настолько точными, насколько это позволяет сделать система, в которой эти сведения постоянно собираются из многих постоянно меняющихся источников. ВНИМАНИЕ! Выделять небольшой раздел /var не следует, поскольку журнальные файлы традиционно помещаются в каталог /var/log и известны тем, что они могут бесконтрольно разрастаться. Многие администраторы перемещают /var в каталог /usr/var и создают символическую ссылку /var на него. Все за и против различных стилей разбиения на разделы мы обсудим в главе 20. Команда du (использование диска) Помимо команды df, вам понадобится также более специфический способ наблюдения за использованием пространства на диске, особенно если у вас работает сетевой сервер, обслуживающий большое количество пользователей, кто-либо из ко торых может неожиданно перебросить в свой домашний каталог гигабайты данных. Для этой цели служит команда du ("disk usage" — использование диска). Ниже представлен пример выполнения этой команды: # du -h -d 1 /home/ 23M 9K 31K 1.5M 664K /home/bob /home/fred /home/alice /home/tom /home/pat Команда du показывает размер, в рекурсивном порядке, каждого каталога, нахо дящегося ниже того каталога, в котором вы находитесь в данный момент (или ниже каталога, который вы укажете в командной строке). Вы можете задать переключа тель -d вместе с числом, определяющим глубину рекурсии (чтобы сократить объем выводимой информации); переключатель -п (от англ. human readable— пригодный для чтения человеком) форматирует размеры каталогов в килобайты и мегабайты. Вы можете также использовать опцию -s, которая включает режим "резюме" (от
Файловая система FreeBSD I .. . 1 7 77Г1 411 Глава 12 I I англ. summary). В этом режиме производится одна строка вывода, в которой будет указан совокупный размер всего, что находится в указанном вами каталоге. Чтобы узнать о других опциях команды du, включая управление символическими ссылками, выполните команду man du. Все это, конечно, возлагает ответственность за мониторинг файловой системы на вас, администратора. Не правда ли, было бы здорово, если бы вы могли положиться на систему, и она делала бы все это за вас? К счастью, это можно сделать благодаря квотам (quote), о которых мы поговорим в разделе "Установка и ввод квот на использование диска" далее в ^гой главе. Монтирование и размонтирование файловых систем FreeBSD Теперь мы поговорим о том, насколько многосторонними могут быть файловые системы стиля UNIX. Предположим, что ваша система переросла свой единственный диск (/dev/adO), и вы установили еще один диск в качестве первичного ведомого, отображаемый как /dev/adl (диск SCSI может быть доступен как /dev/daO и так далее). После того как вы разобьете и разметите диск (эта процедура подробно описывается в главе 20), вы получите одну или несколько новых файловых систем, которые можно будет добавить в структуру каталога вашей системы в любой точке, подобно тому, как новую ветку прививают к стволу дерева. Команда mount Предположим, например, что у вас есть система, в которую вы добавили новых пользователей, а они постоянно загружают файлы большого размера в свои домашние каталоги. Вы заметили (с помощью команды df и du), что в разделе /usr практически не осталось места, главным образом из-за увеличения размера каталога /usr/home. Вы надумали добавить еще один накопитель и отдать его на растерзание пользователям. ВНИМАНИЕ! Инструкции из этого раздела лучше всего выполнять, когда ваша система работает в однопользовательском режиме, чтобы ни один из удаленных пользователей или какое-нибудь приложение не смогли нарушить файловые системы в тот момент, когда вы будете работать с ними. Для того чтобы приступить к переконфигурированию ваших файловых систем, вы должны работать прямо в консоли системы, а не из удаленного терминала, и загрузить систему в однопользовательском режиме (на экране загрузчика нужно выбрать опцию 4). Итак, вы приобрели новый диск объемом 400 Гбайт и разделили его на три раздела BSD в одной секции FreeBSD; они доступны как /dev/adlsle (10 Гбайт), /dev/ adlslf (50 Гбайт) и /dev/adlslg (300 Гбайт). Третий раздел вы сделали самым большим по той причине, что вы хотите сделать из него новый "дом" для ваших пользователей; пространство двух других разделов вы планируете добавлять к другим частям системы. Однако на данный момент вас пока что интересует одно: вам нужно сделать из каталога /home новый раздел размером 300 Гбайт для домашних каталогов пользователей.
Системное администрирование Часть IV Пока что каталог /home является символической ссылкой на каталог /usr/home, поэтому сперва вам нужно воспользоваться командой rm /home, чтобы избавиться от символической ссылки. (Сам каталог /usr/home, на который указывает символическая ссылка, не будет затронут этой командой.) Если /home в вашей системе не явля ется символической ссылкой, а является обычным каталогом, используйте команду наподобие mv /home /home.old, чтобы вывести его на время из этого процесса. Теперь давайте создадим точку монтирования для новой файловой системы. Точками монтирования (они известны также как узлы — node) должны быть простые каталоги. Они не обязательно должны быть пустыми, хотя после того как устройство будет смонтировано в непустом катгшоге, все, что изначально находилось в нем, окажется недоступным. Чтобы файлы и смонтированные файловые системы сразу же стали доступными, потребуются объединенные файловые системы, однако на момент написания этой книги эта возможность полностью не поддерживалась. Следовательно, чтобы создать новую точку монтирования, нужно выполнить команду mkdir /home. Теперь все готово к монтированию новой файловой системы. Для стандартных файловых систем FreeBSD для этой цели нужно воспользоваться командой mount. Ваш 300-гигабайтный раздел помечен как /dev/adlslg, поэтому нужно выполнить следующую команду: # mount /dev/adlslg /home Если команда будет выполнена без каких-либо ошибок, вы должны будете иметь возможность немедленно использовать новые файловые системы. Выполните команду df, чтобы посмотреть, все Ли получилось так, как надо: Filesystem /dev/adOsla /dev/adOslf /dev/adOslg /dev/adOsle Proofs /dev/adlslg lK-blocks 128990 257998 8027686 257998 4 39245453 Used 74314 44 1990866 30586 4 0 Avail 44358 237316 5394606 227694 0 39245453 Capacity 63% 0% 27% 14% 100% 0% Mounted on / /tmp /usr /var /proc /home Раздел /home смонтирован и выглядит так, будто бы он готов к работе! Сейчас вы можете переместить файлы из /us r/home (или из /home, о Id, в зависимости оттого, где временно находятся ваши домашние каталоги) в новую файловую систему /home, и ваши пользователи смогут спокойно загружать в них свои файлы. Однако не всегда все делается так просто. Монтирование файловых систем представляет собой одну из областей администрирования системы, в которой всегда можно напороться на "подводные камни" при недостаточно продуманных действиях. Вы можете, например, получить сообщение об ошибке вроде Incorrect super block (Неверный суперблок), а можете получить и менее информативное сообщение, на пример, Invalid argument (Недопустимый аргумент). Эти сообщения обычно во* никают вследствие неправильного определения имени устройства в строке командц mount; соглашения об именовании устройств, используемые системой маркирования в FreeBSD, могут совершенно сбить вас с толку. Файловая система может быть пом? чена как /dev/adlsle, так и /dev/adlsl, в зависимости от того, как производится к ней обращение — в "режиме секции" (slice mode) или в "специальном режиме" (dedi cated mode), а некоторые имена устройств с суффиксами могут перемежаться с более короткими именами. Подобная эзотерика геометрии диска обсуждается в главе 20. 412
Файловая система FreeBSD I л~ I Глава 12 I I Команда mount имеет опцию -f, которая форсирует операцию монтирования даже в тех условиях, когда в любом другом случае она может быть неудачно завершена. Однако если файловая система не будет смонтирована, то обычно в этом ничего страшного не бывает. Гораздо разумнее будет отыскать причину любой ошибки и устранить ее, чем использовать опцию -f. В качестве причины может быть неформатированный диск, файловая система неопределенного типа или "грязная" файловая система, которая не была закрыта должным образом. В последнем случае в файловой системе могут встречаться некоторые несовместимости — их нужно исправить с помощью программы f sck (о ней мы поговорим далее в этой главе, в разделе "Проверка и исправление файловых систем с помощью программы f sck"), прежде чем можно будет монтировать файловую систему. Еще одним полезным аргументом, на который следует обратить внимание, является поле options, в котором вы можете указать любые ключевые слова (флаги) из большого списка кодовых слов, разделяя их запятыми. Наиболее важными являются слова, которые определяют, является ли файловая система только для чтения или для чтения и записи. По умолчанию выбирается файловая система для чтения и записи, однако вы можете использовать опцию -г или rdonly, чтобы сделать ее системой только для чтения. Выполнив команду man mount, вы сможете узнать обо всех опциях команды mount. Команда mount должна выдаваться всякий раз, когда вы вставляете компакт-диск, DVD-диск или дискету в систему; если вы не сделаете этого, вы не сможете обращаться к медиа-ресурсам. Более подробно этот вопрос будет рассмотрен в разделе "Монтирование и размонтирование файловых систем компакт-дисков и дискет'* далее в этой главе. НА ЗАМЕТКУ Монтирование файловых систем обычно может выполнять только пользователь root. Применительно к разделам жесткого диска в этом нет ничего необычного (вы же не хотите, чтобы обычные пользователи вносили беспорядок в иерархию файловой системы в тот момент, когда она работает); а вот если вы будете работать в FreeBSD как пользователь консоли под KDE или GNOM, и захотите смонтировать компакт-диск или аудио-диск, то столкнетесь с проблемами. Из этого лабиринта мы выйдем далее в этой главе. Команда umount Вам будет необходимо также "размонтировать" файловую систему; для этой цели служит команда umount (отличная от unmoumt). Чтобы размонтировать файловую систем)' /home, выполните следующую команду: # umount /home Чтобы получить тот же результат, можно использовать команду umount /dev/adlslg, или даже umount -а, чтобы размонтировать все, кроме корневой файловой системы. Размонтировать файловые системы гораздо проще, чем смонтировать их. В этой процедуре есть только один важный осложняющий фактор: чтобы размонтировать файловую систему, она не должна быть активной в данный момент — другими словами, она не должна использоваться ни ядром, ни каким-либо демоном, ни каким-либо пользовательским процессом. Это означает, что для того чтобы размонтировать систему, подобную /usr и /var, вы должны зарегистрироваться в однопользователь-
414 Системное администрирование Часть IV ском режиме. Для раздела /home, показанного в примере в предыдущем разделе, любые подключенные пользователи будут работать, скорее всего, в своих домашних каталогах, поэтому их необходимо отстранить от работы в системе, прежде чем можно будет приступить к размонтированию /home. Оболочка, хранящая текущие таблицы в вашем настоящем рабочем каталоге, делает "занятой" любую файловую систему, в которой вы находитесь. Этот фактор приводит к наиболее распространенной неожиданности, подстерегающей многих пользователей, впервые экспериментирующих с командами mount и umount: нельзя находиться внутри файловой системы в момент « размонтирования\ Если в момент размонтирования вы находитесь в ней, вы получите сообщение об ошибке типа Device busy (Устройство занято). Чтобы избежать неприятностей, заимейте себе привычку выполнять команду cd / перед размонтирова- нием файловой системы. Подобно mount, команда umount имеет опцию -f для ввода в действие процедуры размонтирования. Но, опять-таки, лучше всего ее не использовать, если в этом нет абсолютной необходимости; операции с файловыми системами могут дестабилизировать работу системы, если их выполнять небрежным образом. Монтирование и размонтирование файловых систем из других операционных систем Технологии, которые вы только что изучили, хорошо подходят для стандартных файловых систем FreeBSD. А если вам понадобится смонтировать диск из компьютера, работающего под управлением Linux, Windows 98 или ХР? Это тоже можно сделать. В табл. 12.2 перечислены файловые системы, которые FreeBSD по умолчанию поддерживает в ядре GENERIC. Таблица 12.2. Файловые системы, поддерживаемые в ядре generic Файловая система Имя fes Быстрая файловая система Berkeley. mfs Файловая система памяти. NFS Сетевая файловая система. msdosfs Файловая система MS-DOS. CD9660 Файловая система ISO 9660 (для компакт-дисков). proofs Файловая система процессов. Кроме этих файловых систем поддерживаются системы, перечисленные в табл. 12.3. Чтобы они могли работать, их нужно скомпилировать в специальное ядро (см. раздел "Компиляция и инсталляция специального ядра" главы 18).
Файловая система FreeBSD 415 Глава 12 Таблица 12.3. Другие доступные файловые системы Файловая система Имя FDESC Файловая система дескрипторов файлов. HPFS Файловая система OS/2. NTFS Файловая система ОС Windows NT. NULLFS Файловая система NULL NWFS Файловая система NetWare. PORTAL Файловая система порталов, SMBFS Файловая система SMB/CIFS (Windows). UMAPFS Файловая система UID Map. UNION Объединенная файловая система. CODA Файловая система CODA. EXT2FS Файловая система Ext2 (Linux); также включает Ext3FS. REISERFS Файловая система ReiserFS (Linux). Одни из этих файловых систем более стабильны в работе, а другие лишены важных возможностей (например, некоторые из этих файловых систем можно монтировать только для чтения; вы не сможете записывать в них данные). Как вы могли видеть ранее, объединенные файловые системы доступны в виде опции, однако они только частично находятся в рабочем состоянии (и поэтому могут повредить вашу систему). Таким образом, использовать их не рекомендуется, если в этом нет особой необходимости. Поддержка EXT2FS и NTFS тоже известна незавершенностью и нестабильностью. Файловые системы, которые не встроены в ядро GENERIC, не включены в этот список. Идеальным условием для файловой системы, не являющейся частью существующего ядра, является следующее: она, а также многие из файловых систем, перечисленных в предыдущих таблицах, должны быть доступны в виде модуля ядра в /boot/kernel. Если файловая система доступна в качестве модуля ядра, она будет автоматически загружаться, когда вы попытаетесь смонтировать файловую систему. На момент написания этой книги к доступным файловым системам, управляемым модулями, относились Ext2FS, ReiserFS, FDESC, CODA, PORTAL, NWFS, NULL, NTFS, UNION, SMBFS, а также ряд других файловых систем, уже скомпилированных в ядро GENERIC и присутствующих в /boot/kernel в целях совместимости. Если вы монтируете файловую систему (например, MSDOSFS), поддерживаемую в ядре, используемом по умолчанию, или же если вы захотели рискнуть и решили смонтировать файловую систему, которая изначально не является встроенной, вы обнаружите, что FreeBSD предлагает набор удобных инструментов для выполнения монтирования. Нижеследующие инструменты доступны в каталоге /sbin (в разных версиях FreeBSD их имена могут отличаться): mount_cd9660 mount_linprocfs mount_nfs4 mount_portalfs mount_std mount_devfs mount_mfs mount_ntfs mount_procfs mount_udf mount_ext2fs mountjmsdosfs mount_nullfs roount_reiserfs mount_umapfs mount fdescfs mount nfs mount nwfs mount smbfs mount unionfs
416 Системное администрирование Часть IV Каждая из этих разновидностей команды mount соответствует той, которая поддерживается в файловой системе, и работает точно так же, как и mount. Идея заключается в том, что инструменты mount_* служат в качестве расширения опции -t команды mount. Опция -t распознает только пару внутренних файловых систем; если вы дадите ей нераспознаваемый аргумент, она выполнит соответствующую автономную команду из предыдущего списка. Например, при использовании -t nf s /mnt инструмент на самом деле выполнит команду mount_nf s /mnt. Зная это, нередко бывает проще всего запустить последний инструмент. НА ЗАМЕТКУ Подробно о стабильности и завершенности, а также о вопросах, связанных с неполной поддержкой типов файловых систем, можно прочитать на man-страницах утилиты mount_*. Каждая из этих страниц дает хорошее представление о том, чего не достает в поддержке данной файловой системы. Например, на man-странице утилиты mount_ntf s говорится об отсутствии возможности полной записи и поддержки сжатых файлов, а man-страница mount_union предупреждает об ограниченных возможностях и потенциальном повреждении данных. Необходимо все уточнять! Монтирование файловой системы Windows/MS-DOS Давайте для начала посмотрим, как монтируется диск Windows 98, который для FreeBSD будет иметь файловую систему MSDOSFS. Чтобы выполнить эту операцию, нужно использовать команду mountains do s. Эта команда может принимать ряд специальных опций, которые здесь мы не будем рассматривать полностью. В качестве примера упомянем лишь -W и -L, которые управляют местным отображением символов для длинных имен файлов, связанных с файловыми системами FAT32/VFAT. Для этого примера вы можете использовать настройки по умолчанию, предполагающие, что будет использоваться кодировка ISO 8859-1, а вы будете производить чтение и запись в файловой системе как пользователь root: # mount msdosfз /dev/adlsl /mnt НА ЗАМЕТКУ Имейте в виду: то, что в системах DOS и Linux называется разделами (partition), в FreeBSD называется секциями (slice), чтобы не спутать их с традиционными разделами BSD (которые являются подразделениями секций). Номер секции определяется литерой s в имени устройства, поэтому si определяет первую секцию, или, как в MS-DOS, раздел. Разделы MS-DOS не содержат никаких подразделов, как подразделы от а до h в BSD; следовательно, поскольку ваша файловая система Windows 98 в устройстве /dev/adlsl использует секцию, а не раздел, вы можете ссылаться на нее с помощью номера секции, а не с помощью дополнительных суффиксов, как при монтировании стандартных файловых систем FreeBSD, в которых применяется запись /dev/adlslg. Хотя вы получаете только четыре раздела MS-DOS на одном диске, вы можете использовать "расширенные разделы DOS", с помощью которых MS-DOS и Linux выполняют подразделение. В случае применения расширенного раздела DOS вы можете получить ошибку типа invalid argument (Недопустимый аргумент). Если это произойдет, обратите внимание на то, что нумерация расширенных разделов DOS начинается с 5, поэтому вашим именем устройства будет /dev/adls5.
Файловая система FreeBSD I TTZ I = гтН 417 Глава 12 I И I При монтировании файловых систем MS-DOS можно применять следующие трюки: монтирование файловых систем с UID/GID, не принадлежащими пользователю root; монтирование файловых систем с маской полномочий для управления доступом пользователей к содержимому файловых систем; перечисление файловых систем с использованием длинных имен файлов (вместо коротких имен файлов "8.3") и другие. Выполнив команду man mount_msdos, вы получите полную документацию по этим опциям. СОВЕТ Дискета Windows содержит имена файлов, которые могут быть в стандартном коротком формате MS-DOS "8.3" или в длинном формате Windows 95/98, который произрастает из метаданных в файловой системе. Если вы монтируете дискету Windows с помощью утилиты mount__msdos, FreeBSD попытается найти любое из этих длинных имен файлов на диске. Если какое-нибудь имя будет найдено, она будет использовать этот формат для перечисления и для взаимодействия с файлами. Если не будет найдено ни одно из этих имен файлов, а будут найдены короткие имена, FreeBSD будет использовать короткий формат. Чтобы заставить утилиту mountjmsdos использовать длинный формат, укажите опцию -1. В случае опции -s будет выбран короткий формат. Монтирование файловой системы Linux Большинство систем Linux используют файловую систему Ext2FS (или ExtSFS, которая тоже обрабатывается модулем Ext2FS ядра FreeBSD). Поскольку ядро GENERIC не поддерживает EXT2FS, то для этой задачи может потребоваться дополнительное действие. Если вам нужно смонтировать диск Linux для выполнения временной работы (например, чтобы скопировать из нее файлы во время одноразовой операции), вы можете просто смонтировать диск с помощью команды mount_ext2f s, которая автоматически загрузит модуль ядра ext2fs.ko и добавит временную поддержку файловой системы Ext2FS в FreeBSD. Это очень удобно, хотя в этом есть и свой недостаток: модуль ядра останется загруженным после того, как вы закончите вашу работу; а вообще, лучше всего не полагаться на загрузку модуля ядра (это может привести к дестабилизации системы или вызвать сбой), а организовать поддержку файловой системы Ext2FS ядром. Если вы намерены постоянно работать с дисками Linux, вы должны собрать специальное ядро, поддерживающее Ext2FS. В главе 18 мы поговорим о том, какие действия включает в себя компиляция и установка специального ядра; в конфигурационном файле вашего специального ядра добавьте следующую строку (желательно в конце блока строк options): options EXT2FS После того как ваша система заработает с новым ядром, вы сможете использовать следующую команду: # mount_ext2f s /dev/adlel /ant Если не учитывать проблемы, связанные с поддержкой ядра и автоматической загрузкой модуля ядра по мере необходимости, mount_ext2f s ведет себя практически так же, как и стандартная утилита mount, поэтому никаких сюрпризов у вас возникать не должно.
Системное администрирование Часть IV Использование команды f disk для сбора информации о разделах Чтобы узнать, с какой файловой системой вы работаете, можно воспользоваться командой f disk. Ниже показан пример выполнения этой команды: # fdisk /dev/adl ******* Working on device /dev/adl ******* parameters extracted from in-core disklabel are: cylinders=1247 heads=255 sectors/track=63 (16065 blks/cyl) Figures below won't work with BIOS for partitions not in cyl 1 parameters to be used for BIOS calculations are: cylinders=1247 heads^255 sectors/track=63 (16065 blks/cyl) Media sector size is 512 Warning: BIOS sector numbering starts with sector 1 Information from DOS bootblock is: The data for partition 1 is: sysid 131, (Linux filesystem) start 63, size 2104452 (1027 Meg), flag 0 beg: cyl 0/ sector 1/ head 1; end: cyl 130/ sector 63/ head 254 The data for partition 2 is: sysid 130, (Linux swap or Solaris x86) start 2104515, size 787185 (384 Meg), flag 0 beg: cyl 131/ sector 1/ head 0; end: cyl 179/ sector 63/ head 254 The data for partition 3 is: sysid 131, (Linux filesystem) start 2891700, size 17141355 (8369 Meg), flag 0 beg: cyl 180/ sector 1/ head 0; end: cyl 1023/ sector 63/ head 254 The data for partition 4 is: <UNUSED> # fdisk /dev/adl ******* Работа с устройством /dev/adl ******* Параметры, извлекаемые из метки диска: цилиндров=1247 головок=255 секторов/дорожку^ 63 (16065 блоков/цилиндр) Цифры, следующие ниже, не будут работать с BIOS для разделов, не находящихся в цилиндре 1 параметры, которые будут использоваться для вычислений BIOS: цилиндров-1247 головок-255 секторов/дорожку= 63 (16065 блоков/цилиндр) Размер сектора носителя составляет 512 Предупреждение: нумерация секторов в BIOS начинается с сектора 1 Информация из блока загрузки DOS: Данные для раздела 1: sysid 131, (файловая система Linux) начало 63, размер 2104452 (1027 Мбайт), флаг О начало: цилиндр 0/ сектор 1/ головка 1; конец: цилиндр 130/ сектор 63/ головка 254 Данные для раздела 2: sysid 130, (свопинг Linux или Solaris x86) начало 2104515, размер 787185 (384 Мбайт), флаг О начало: цилиндр 131/ сектор 1/ головка 0;
Файловая система FreeBSD I Т"7Т"~ = zH 419 Глава 12 I __ конец: цилиндр 179/ сектор 63/ головка 254 Данные для раздела 3: sysid 131, (файловая система Linux) начало 2891700, размер 17141355 (8369 Мбайт), флаг О начало: цилиндр 180/ сектор 1/ головка 0; конец: цилиндр 1023/ сектор 63/ головка 254 Данные для раздела 4: <НЕ ИСП0ЛЬЗУЕТСЯ> Для каждого раздела (или секции, как в FreeBSD) присутствует номер sysid. 131 соответствует файловой системе EXT2FS, а 165 соответствует FreeBSD. Все остальное, что будет распознано при выполнении команды fdisk, можно найти при внимательном рассмотрении файла /usr/ src/sbin/i386/fdisk/fdisk.c, в котором идентификационные номера разделов даются в шестнадцатеричных значениях. Монтирование и размонтирование файловых систем компакт-дисков и дискет Теперь, когда у вас уже имеется некоторый опыт в монтировании различных незнакомых вам файловых систем, перейти к компакт-дискам и дискетам не составит труда. Компакт-диски обычно монтируются как файловые системы CD9660, а дискеты обычно монтируются или как FFS (стандарт FreeBSD), или как MS-DOS. Монтирование компакт-дисков и дискет В отношении компакт-дисков главная хитрость заключается в определении имени устройства. Накопители IDE будут отображаться как /dev/acdOc, накопители SCSI будут иметь вид /dev/cdOc, а смешанные типы нестандартных накопителей будут иметь другие перфиксы. Что касается суффиксов, то суффикс с используется для ссылки на весь диск в "специальном" режиме. Ниже показан пример: # mount_cd0660 /dev/acdOc /cdrom СОВЕТ . Самые последние сведения об именах дисков можно найти по адресу ht tp: / /www. f reebsd .org/ doc/en_US. IS08 8 5 9-1/books/handbook/disks-naming, html, Монтирование компакт-дисков в среде GUI Недостатком архитектуры системы UNIX является то, что для монтирования компакт-дисков вы должны иметь полномочия пользователя root. Обычно это не является проблемой, если вы используете командную строку на физической консоли. Однако если ваш компьютер с системой FreeBSD является настольной рабочей станцией, и если на нем работает большое число пользователей, то при вашей KDE- или GNOM-регистрации будет применяться обычная учетная запись пользователя, а не учетная запись root. Это очень важно с точки зрения безопасности, поскольку таким способом можно снизить риск выполнения в системе потенциально деструктивных операций под учетной записью root; с другой стороны, это приводит к усложнению монтирования компакт-дисков. Чтобы позволить обычным пользователям монтировать компакт-диски в KDE, нужно настроить множество параметров разрешений в учетных записях ваших пользователей и
л0%л | Системное администрирование в вашем устройстве компакт-диска, разрешить настройку прав ядра и даже добавить точки монтирования на уровне пользователя и соответствующих записи в файл /etc/f stab. Описание всей этой процедуры можно найти по адресу http://www.bsdguides.org/guides/freebsd/ beginners/kde_cd_icons .php; с другой стороны, следует отметить, что даже при этой конфигурации только один пользователь одновременно может иметь смонтированный компакт-диск, а другой пользователь не будет иметь к нему доступа до тех пор, пока пользователь, смонтировавший компакт-диск, не размонтирует его. После того как полномочия вашей системы будут установлены должным образом, монтирование компакт-дисков в KDE или GNOME будет происходить плавно. Вам просто нужно будет перейти к дискам системы в окне файловой системы, и щелкнуть или дважды щелкнуть на значке дисковода компакт-дисков. Среда настольной системы автоматически смонтирует диск в фоновом режиме и запустит окно навигации, чтобы вы могли просмотреть его содержимое. Процесс монтирования дискеты очень простой. Используйте имя устройства /dev/fdO (нуль определяет ваш первый дисковод). Ядро тоже содержит сбивающую с толку запись для f dcO, которая ссылается на само устройство контроллера дискеты ISA, a f dO и f dl являются именами устройств для накопителей, связанных с контроллером. Ниже показан пример команды для монтирования дискеты UNIX: # mount /dev/fdO /floppy Дискету MS-DOS можно смонтировать похожим способом: # mount_msdosfs /dev/fdO /floppy Будьте осторожны: дискеты могут быть защищены от записи, компакт-диски обычно используются только для чтения, a FreeBSD во время монтирования не проверяет, разрешена ли на них запись! Если вы монтируете дискету, на которой установлена защита от записи, не определив опцию -г или rdonly, вы будете получать ошибки ввода-вывода всякий раз, когда что-нибудь попытается произвести запись на диск, и конечный результат будет зависеть от стабильности программы, производящей запись. Может произойти все что угодно, начиная от простого сообщения консоли об ошибке, и заканчивая полным "зависанием" системы. Следовательно, если вам нужно смонтировать дискету, защищенную от записи, или компакт-диск из командной строки, не забудьте определить опцию -г или rdonly, чтобы программы даже не пит лись произвести на них запись! Размонтирование компакт-дисков и дискет Другая неприятность при работе с компакт-дисками и дискетами заключается в следующем: так как они являются съемными устройствами, то существует вероятность того, что диск будет извлечен из дисковода в то момент, когда система будет думать, что он еще монтируется. Windows (для примера) динамически монтирует и обновляет устройства всякий раз, когда к ним производится доступ на чтение или запись, а Mac OS X отслеживает такие действия, управляя монтированием диска и физической вставкой/извлечением диска исключительно программными средствами, в результате чего действия пользователей и состояние программных средств будут зависеть друг от друга. FreeBSD (а также другие разновидности UNIX из семейства х86) не может похвастаться ни одной из этих возможностей, поэтому вы должны самостоятельно следить за тем, чтобы система точно воспринимала свои монтируемые диски. Большинство дисководов компакт-дисков блокируют свои лотки на время монтирования диска благодаря программным механизмам извлечения диска, которые зна-
Файловая система FreeBSD Глава 12 421 ют о состоянии медиа-устройств в операционной системе. Такой дисковод не будет реагировать на нажатие кнопки извлечения до тех пор, пока вы не размонтируете устройство. Однако дискету можно механически извлечь ради забавы, а если очень захотеть, то с помощью канцелярской скрепки можно извлечь и компакт-диск. Если монтируемое устройство извлечь до того, как будет завершен процесс размонтирова- ния, а некоторые программы попытаются прочитать или записать на него данные, то это может привести к уже упомянутой дестабилизации системы. Итог таков: всегда нужно помнить о том, что команды unount /cdrom или unmount /floppy необходимо выполнять до извлечения диска. Ваша система ответит вам сторицей. Другие съемные носители Съемные носители информации с каждым днем становятся все сложнее из-за постоянно набирающего темпы развития внешних носителей на основе USB и FireWire и перезаписываемых дисков CD и DVD. Одно время были популярными Zip-дисководы и родственные им устройства, и хотя они постепенно начинают исчезать с рынка, вы все еще можете использовать их. Операционная система FreeBSD поддерживает Zip-дисководы на параллельном порту как устройство vpO, а Zip-дисководы USB — как устройство umass. Однако сейчас разрабатывается масса новых устройств, каждое из которых будет привносить свои сложности в возможность записи, переносимости и монтирования. Ваше понимание вопросов монтирования и размонтирования компакт-дисков и дискет может пригодиться вам при работе с другими съемными носителями в FreeBSD. Файл /etc/fstab Вы можете заинтересоваться тем, нельзя ли сократить весь процесс монтирования, не может ли какая-нибудь программа "выписать рецепт" для всех монтируемых устройств в системе, ведь наверняка та степень гибкости, которую предлагают инструменты mount, будет становиться для пользователя все слабее с течением времени существования системы. После того как вы разберетесь со всеми командами и малопонятными именами устройств, необходимыми для монтирования второго жесткого диска IDE, тома NFS по сети, дискеты MS-DOS и компакт-диска SCSI, неужели вам придется запоминать все эти команды, чтобы смонтировать устройства? Нет, на самом деле существует гораздо лучший способ: использование файла /etc/f stab. Давайте-ка посмотрим на содержимое этого файла, выполнив команду cat /etc/ fstab: Pass# # Device /dev/adOslb /dev/adOsla /dev/adlslf /dev/adOslg /dev/adOsle /dev/acdO /dev/fdO pro с /dev/adlslg Mountpoint none / /tmp /var /usr /cdrom /floppy /proc /home FStype swap ufs ufs ufs ufs cd9660 msdos proofs ufs Options sw rw rw rw rw ro,noauto rw,noauto rw rw Dump 0 1 2 2 2 0 0 0 2 P 0 1 2 2 2 0 0 0 2
422 Системное администрирование Часть IV Этот файл (его содержимое будет изменяться в зависимости от конфигурации вашей системы) говорит системе обо всем, что ей нужно знать о данной точке монтирования: какое устройство связано с ней, какой ожидается тип файловой системы, какие опции монтирования, в каком порядке следует выполнять проверку файловой системы во время загрузки системы. Файл f stab тесно взаимосвязан с командой mount. Благодаря этому союзу, эти два инструмента могут существенно упростить управление файловой системой. Основная функция файла f stab заключается в том, чтобы система получила профиль монтируемых устройств, которые могут быть активизированы во время загрузки. Если в файле f stab будут определены все ваши точки монтирования, вы сможете выполнить команду mount -а, чтобы смонтировать все точки (что и происходит во время загрузки системы). Когда система выполняет серию проверок файловой системы на этапе загрузки, она выполняет команду f sck -p, 4tfобы "привести в порядок* файловые системы и отметить их всех как "clean" ("чистая") (о действиях, выполняемых программой f sck, речь пойдет в разделе "Проверка и исправление файловых систем с помощью программы f sck" далее в этой главе). После этого система выполняет команду mount -a -t nonf s, чтобы смонтировать все файловые системы, перечисленные в файле /etc/f stab, кроме томов NFS. Однако кроме этой функции можно получить еще более удобный результат. После того как точки монтирования будут определены в файле /etc/f stab, вам больше не нужно будет запоминать команду mount, необходимую для ее воспроизводства в интерактивном режиме; сейчас вам необходимо знать лишь имя точки монтирования: # mount /ho Эта команда считывает всю необходимую информацию о каталоге /home из файла f stab. Она знает, что вам требуется устройство /dev/adlslg, что это файловая система UFS (ладно, FFS), и что вам нужно смонтировать ее для чтения и записи. Аналогично, чтобы смонтировать компакт-диск, вам нужно ввести следующую команду: # mount /cdrom Теперь процесс монтирования дисков начинает выглядеть более дружественным к пользователю! Опция noauto в записях /cdrom и /floppy говорит команде mount о том, что эти файловые системы не нужно монтировать во время загрузки. Как и с ресурсами NFS, компакт-диск или дискета не обязательно будут доступными во время загрузки системы, поэтому благодаря опции noauto команда mount не будет бесцельно тратить время в попытках смонтировать диск, которого нет. Однако ничто не мешает смонтировать диск позже — для этой цели понадобится предыдущая команда mount. В четвертом столбце файла f stab вы можете определить любые опции командной строки mount, которые можно применить к данной файловой системе. Например, здесь можно использовать любые опции, перечисленные на man-странице утилиты mount, а также все, что перечислено на странице man mount__* файловой системы, если речь идет о нестандартном типе файловой системы. Пятый столбец в файле /etc/fstab содержит номера уровней дампа. Эти номе* ра использует команда dump, которая представляет собой давно известную утилиту резервного копирования UNIX, и которая работает на основе уровней приоритета. Вы вызываете резервное копирование на определенном уровне дампа; номер уровня дампа говорит утилите dump, на каком уровне нужно запустить резервное копирование каждой файловой системы. Например, файловые системы с уровнем дампа 1 ре-
Файловая система FreeBSD Глава 12 423 зервируются только тогда, когда уровнем дампа является 1 или меньше (уровень дампа 0 показывает полное резервное копирование всех файловых систем). Обратите внимание на то, что если в файле /etc/f stab задать 0, то данная файловая система будет пропускаться даже при выполнении дампа. Шестой, или самый правый, столбец в файле /etc/fstab представляет поле Pass#. Номер прохода является флагом для f sck; номера выше 0 показывают порядок, в соответствии с которым будет производиться проверка файловых систем. Корневая файловая система имеет номер прохода 1, что означает, что она будет проверена первой; затем проверяются системы с номером прохода 2 и так далее до тех пор, пока это позволяет делать оборудование. Номер прохода 0 означает, что файловую систему не следует проверять; это как раз то, что необходимо в отношении компакт-дисков, дискет, разделов подкачки и других ресурсов, которые не могут быть повреждены (или в отношении устройств, которые не боятся повреждений). Подробное описание процедур резервирования и восстановления можно найти в главе 21; там будет детально рассмотрена утилита dump, а также методы резервирования/зеркального копирования, такие как CVSup. Проверка и исправление файловых систем с помощью программы f sck Программа f sck (Filesystem Consistency Check — проверка на непротиворечивость файловой системы) эквивалентна программе ScanDisk от Microsoft и другим утилитам по работе с дисками как минимум в том, какую роль она играет в процессе загрузки, а также в ее интерактивной природе. Программа f sck начинает свое выполнение во время загрузки системы перед самым монтированием файловых систем из /etc/fstab, чтобы удостовериться в том, что все файловые системы являются "чистыми" и готовы к монтированию. Этот режим называется "наведением порядка", и он вызывается с помощью опции -р ("preen"). Однако f sck можно применять также для исправления любых противоречивостей, которые она обнаружит, и для очистки файловых систем, которые не были отмечены "чистыми" ("clean") соответствующим методом закрытия. Программа f sck будет встречаться вам чаще всего во время загрузки, независимо от того, какую роль она играет в вашей жизни. В самых благоприятных условиях она запускается незаметно для вас сразу после идентификации всех устройств, а вы сможете увидеть в консоли всего лишь несколько строчек, подобных следующим: /dev/adOsle: 103469 files, 858450 used, 9066025 free (25777 frags, 1130031 blocks, 0.3% fragmentation) /dev/adOsle: 103469 файлов, 858450 используется, 9066025 свободно (25777 фрагментов, 1130031 блоков, 0.3% фрагментация) НА ЗАМЕТКУ Не стоит беспокоиться по поводу значений, показывающих степень фрагментации в выводе программы f sck. Они выглядят довольно неприятно, однако вы должны иметь в виду, что фрагментация даже на уровне 2-3% (больше, чем в этом примере) является мизерной по сравнению с фрагментацией, которая встречается в Windows. Нередко можно встретить диск D0S/VFAT с
424 Системное администрирование Часть IV 50-процентной и более степенью фрагментации; это как раз объясняет тот факт, почему так хорошо продаются утилиты дефрагментации на рынке настольных систем. Напротив, в файловых системах UNIX связанные между собой секторы удается поддерживать "на лету", поэтому уровень фрагментации остается минимальным. У вас никогда не возникнет необходимости в дефрагментации жесткого диска UNIX. О механизме хранения данных и фрагментации мы поговорим в разделе "Блоки, файлы и индексные дескрипторы" далее в этой главе. Однако если работа системы не была завершена должным образом (если внезапно была прекращена подача электропитания или если кто-то нажал кнопку выключения, не запустив прежде программу shutdown), вы можете столкнуться с проблемами. Файловые системы UNIX отслеживают свою структурную информацию, записывая эти метаданные на диск в синхронном виде, для чего может потребоваться несколько циклов записи. Если работа системы будет прекращена во время записи, метаданные окажутся поврежденными, и файловой системой нельзя будет пользоваться до тех пор, пока она не будет исправлена. Вот тугого как раз и пригодится программа f sck. Если система окажется в "нечистом" состоянии, f sck войдет в свой режим исследования. Она проанализирует каждый блок файловой системы, проверяя метаданные и убеждаясь в их непротиворечивости. Для этого может потребоваться очень много времени, в зависимости от размера файловой системы и скоростных характеристик диска. Если f sck находит противоречивость, которую невозможно исправить автоматически с сохранением целостности данных (подробности можно узнать, выполнив команду man f sck), она спросит вас, хотите ли вы устранить проблему. В большинстве случаев вам придется соглашаться с этим предложением. Однако если вам будет предложено сделать это, то, скорее всего, противоречивость будет настолько серьезной, что вы утратите некоторые данные — обычно это один или несколько файлов, запись которых производилась в момент сбоя; таким образом, можно утверждать, что потеря данных будет несущественной. После того как fsck завершит свою работу, на экране появится приглашение!. Введите boot, чтобы продолжить загрузку, или reboot, чтобы начать процесс загрузки с самого начала. Вариант с перезагрузкой может оказаться оптимальным просто для того, чтобы проверить, что процесс пройдет нормально без какого-либо вмешательства. Тем не менее, программа fsck может работать не только во время загрузки. Вы можете также запустить ее из командной строки в любое время при монтировании файловых систем, хотя этого делать не нужно, если система загружена и работает! Очень важно, чтобы данная файловая система не изменялась, когда вы будете пытаться выполнить проверку на непротиворечивость. Если вам нужно запустить программу fsck на одном из разделов главного диска вашей системы, перейдите в однопользовательский режим: # shutdown +5 Эта команда закроет многопользовательский режим через пять минут после того* как вы выполните эту команду. Естественно, с этого момента все нужно делать на физической консоли. В однопользовательском режиме нельзя удаленно администрировать систему! СОВЕТ Чтобы остановить систему сразу, а не после паузы, выполните команду shutdown now.
Файловая система FreeBSD I T7Z I —А 425 Глава 12 I __1 Как только система окажется в состоянии покоя, вы сможете применить программу fsck к интересующему вас содержимому. Это может быть необходимо, если во время выполнения вы получили сообщение в своем выводе dmesg (часть ежедневно выполняющихся сценариев мониторинга, посылаемая пользователю root), в котором будет сказано, что был найден дефектный индексный дескриптор или дескриптор файла, и вы захотите попасть прямо в проблемное место без перезагрузки. После того как вы запустите программу fsck на одном или всех устройствах (например, с помощью синтаксиса fsck -p /dev/adlslg), вы сможете затем просто выйти из однопользовательской оболочки (введите exit), чтобы активизировать оставшуюся часть многопользовательской системы. Единственный случай безопасного использования программы fsck в многопользовательском режиме — это когда вы пытаетесь монтировать второй диск с некритической или новой файловой системой, которую вы пытаетесь добавить. Программа fsck, выполняемая во время загрузки, проверит только те файловые системы, которые перечислены в файле /etc/f stab. Вместо того чтобы добавлять новое устройство в файл f stab и перезагружать систему, вы можете просто попробовать смонтировать устройство. Если сделать это не удастся, что будет свидетельствовать о необходимости выполнения fsck, то тогда нужно будет воспользоваться ранее показанным синтаксисом. Затем попытайтесь еще раз смонтировать диск. Это монтирование можно безопасно выполнить в многопользовательском режиме, поскольку никто не будет производить запись на устройство, которое еще не было смонтировано. НА ЗАМЕТКУ Работа программы fsck в FreeBSD схожа с работой программы fsck в похожих операционных системах; однако в ней нет таких замечательных особенностей интерфейса, как индикатора выполнения, который имеется в программе fsck в системе Linux. И все же следует иметь в виду, что в основном поведение аналогично. Ведение журналов файловых систем и Soft Updates Существует множество различных решений проблем синхронной записи, которые приводят к фрагментации и потере указателей файлов. В наши дни вам часто приходилось слышать о ведении журналов файловых систем, таких, например, как Ext3FS и Journaled HFS+, которые заносят в журнал все операции записи до их выполнения. Этот журнал существенно ускоряет работу программы fsck, поскольку ей не приходится комбинировать всю файловую систему — она знает о местонахождении противоречивостей и о способах их устранения. Операционная система FreeBSD не поддерживает ведение журнала файловых систем, но зато она поддерживает возможность Soft Updates (Плавные обновления). В то время как ведение журнала файловых систем осуществляется через журнальный файл действий записи, Soft Updates (которая, начиная с FreeBSD 4.5, встроена в ядро GENERIC, или ядро по умолчанию, и включена для всех недавно созданных дисковых разделов) предлагает другую технологию, которая обеспечивает те же преимущества. Soft Updates использует предварительно вычисленные упорядоченные записи, чтобы исключить необходимость во внешнем журнале; вместе с тем, Soft Updates защищает целостность метаданных, чтобы обеспечить непротиворечивость файловой системы на таком же уровне, или еще лучше, как и при ведении журналов. Кроме того, она
426 Системное администрирование Часть IV характеризуется более высокой производительностью, чем ведение журналов; файловая система может быть активизирована непосредственно во время загрузки, после чего производится проверка на непротиворечивость с помощью автоматических снимков в фоновом задании. Soft Updates можно активизировать в любой или во всех ваших файловых системах. Опция переключения в утилите Disk Label Editor (эта утилита служит для разбиения диска на подразделы и назначения их различным точкам монтирования; об этом мы поговорим в разделе "Создание меток диска" в главе 20) позволит вам настроить Soft Updates для любых разделов или файловых систем, по вашему желанию. Soft Updates особенно эффективна при использовании в файловых системах, содержащих часто изменяемые данные, например e/varn/usr. Необязательный демон diskchecked поддерживает Soft Updates. Инсталлируемый из портов или пакетов, diskchecked работает в фоновом режиме и периодически проверяет целостность файловой системы, существенно сокращая зависимость от программы f sck во время загрузки и снижал риски, связанные с внезапным прекращением работы. Конфигурационным файлом этого демона является /usr/local/ etc/diskchecked.conf; выполнив команду man diskchecked, вы сможете ознакомиться с инструкциями и примерами использования этого файла. Любые ошибки, которые найдет diskchecked, регистрируются с помощью службы syslogd, которая описана в разделе "Системный регистратор (syslogd) и файл syslog.conf" главы 14. Во время выполнения diskchecked вы можете использовать команду ps, чтобы посмотреть ход его выполнения: t ре -ах | grep diskcheckd 253 ?? Ss 0:00.28 cuskcheckd: adO :3.26% (diskcheckd) Дополнительную информацию о Soft Updates и сравнения этой возможности и систем ведения журналов можно найти по адресам http://www.mckuick.com/softdep/ и http://www.ece.emu•edu/~ganger/papers/CSE-TR-254-95/. Использование программы f sck для восстановления поврежденного суперблока Скорее всего, вам никогда не придется использовать эту технологию. Однако, памятуя об известных законах Мерфи, самый надежный способ избежать беды — подготовиться к ней. Самой распространенной порчей файловой системы является повреждение суперблока — блока, содержащего критически важные данные для файловой системы устройства. Это повреждение может возникнуть, когда система по какой-либо причине не может прочитать суперблок устройства, который находится с 16-го по 31-й секторы в начале устройства. Суперблок является настолько важной частью файловой системы, что FreeBSD держит в начале каждой группы цилиндров альтернативный суперблок. Следовательно, если ваш главный блок будет поврежден, вы сможете воспользоваться множеством резервных копий со всего устройства. Первая альтернатива всегда находится в блоке 32, а остальные расположены через регулярные интервалы по всему диску, хотя предсказать их расположение гораздо труднее. Предположим, что вы пытаетесь смонтировать файловую систему, с которой в других обстоятельствах никогда не возникало проблем. Это может быть, например,
Файловая система FreeBSD Глава 12 427 съемный жесткий диск, который был установлен и работал на вашем компьютере. Выполнив команду mount, вы получаете следующую ошибку: /dev/adlslh on /mnt: Incorrect super block /dev/adlslh on /mnt: Неправильный суперблок Так как это сообщение не сулит ничего хорошего, лучше воспользоваться командой fsck: # fsck /dev/adlslh ** /dev/adlslh BAD SUPER BLOCK: MAGIC NUMBER WRONG LOOK FOR ALTERNATE SUPERBLOCKS? [yn] у USING ALTERNATE SUPERBLOCK AT 32 ** Last Mounted on /home2 ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Cyl groups 148 files, 15660 used, 7038840 free (208 frags, 879829 blocks, 0.0% fragmentation) UPDATE STANDARD SUPERBLOCK? [yn] у ***** FILE SYSTEM WAS MODIFIED ***** # fsck /dev/adlslh ** /dev/adlslh Поврежден суперблок: неверное магическое число Произвести поиск альтернативных суперблоков? [уп] у Использование альтернативного суперблока в блоке 32 ** Последнее монтирование в /home2 ** Фаза 1 - проверка блоков и размеров ** Фаза 2 - проверка путей ** Фаза 3 - проверка связности ** Фаза 4 - проверка количества ссылок ** Фаза 5 - проверка групп цилиндров 148 файлов, 15660 используется, 7038840 свободно (208 фрагментов, 879829 блоков, 0.0% фрагментация) Обновить стандартный суперблок? [уп] у / ***** файловая система была изменена ***** / FreeBSD без проблем справляется с ошибкой типа "поврежденный суперблок*. На других платформах вам придется задавать опции командной строки, чтобы определить местонахождение требуемого альтернативного суперблока, однако вам доподлинно известно только о блоке в секторе 32. Используя подобным образом команду fsck, первый альтернативный суперблок будет скопирован поверх основного блока, поэтому вам удастся аккуратно смонтировать файловую систему. НА ЗАМЕТКУ Вы можете определить местонахождение всех суперблоков в устройстве (если вас это действительно интересует) с помощью утилиты newf s и параметра -N (этот параметр выводит статистические данные о системе, не производя никаких изменений на диске). Далее показан пример выполнения этой команды:
428 Системное администрирование Часть IV # newfs -N /dev/adlslh Warning: 2672 sector(s) in last cylinder unallocated (Предупреждение: 2672 сектора в последнем цилиндре не размещены) /dev/adlslh: 14558608 sectors in 3555 cylinders of 1 tracks, 4096 sectors 7108.7MB in 223 cyl groups (16 c/g, 32.00MB/g, 7936 i/g) super-block backups (for fsck -b #) at: 32, 65568, 131104, 196640, 262176, 327712, 393248, 458784, 524320, 589856, 655392, 720928, 786464, 852000, 917536, 983072, 1048608, 1114144, 1179680, 1245216, 1310752, 1376288, 1441824, 1507360, 1572896, 1638432, 1703968, 2031648, 2097184, 2555936, 2621472, 3080224, 3145760, 3604512, 3670048, 4128800, 4194336, 4653088, 4718624, 5177376, 5242912, 5701664, 5767200, 6225952, 6291488, 6750240, 6815776, 7274528, 7340064, 7798816, 7864352, 8323104, 8388640, 8847392, 8912928, 9371680, 9437216, 9895968, 9961504, 1769504, 2293792, 2818080, 3342368, 3866656, 4390944, 4915232, 5439520, 5963808, 6488096, 7012384, 7536672, 8060960, 8585248, 9109536, 9633824, 1835040, 2359328, 2883616, 3407904, 39323 92, 4456480, 4980768, 5505056, 6029344, 6553632, 7077920, 7602208, 8126496, 8650784, 9175072, 9699360, 30158112, 1C223648, i06l6o64, 10682400, 11075616, 11534368, 11993120, 12451872, 12910624, 13369376, 13828128, 14286880, 11141152, 11599904, 12058656, 12517408, 12976160, 13434912, 13893664, 14352416, 1900576, 2424864, 2949152, 3473440, 3997728, 4522016, 5046304, 5570592, 6094880, 6619168, 7143456, 7667744, 8192032, 8716320, 9240608, 9764896, 10289184, 10747936, 11206688, 11665440, 12124192, 12582944, 13041696, 13500448, 13959200, 14417952, 1966112, 2490400, 3014688, 3538976, 4063264, 4587552, 5111840, 5636128, 6160416, 6684704, 7208992, 7733280, 8257568, 8781856, 9306144, 9830432, 10354720, 10813472, 11272224, 11730976, 12189728, 12648480, 13107232, 13565984, 10420256, 10879008, 11337760, 11796512, 12255264, 12714016, 13172768, 13631520, 14090272, 2162720, 2687008, 3211296, 3735584, 4259872, 4784160, 5308448, 5832736, 6357024, 6881312, 7405600, 7929888, 8454176, 8978464, 9502752, 10027040, 10485792, 10944544, 11403296, 11862048, 12320800, 12779552, 13238304, 13697056, 14155808, 2228256, 2752544, 3276832, 3801120, 4325408, 4849696, 5373984, 5898272, 6422560, 6946848, 7471136, 7995424, 8519712, 9044000, 9568288, 10092576, 10551328, 11010080, 11468832, 11927584, 12386336, 12845088, 13303840, 13762592, 14221344, 14024736, 14483488, 14549024 Как можно видеть, существует множество резервных копий, однако все они, за исключением блока в секторе 32, расположены в нечетных местах. Всю грязную работу за вас сделает программа fsck. Тем не менее, она позволяет вам определить некоторый суперблок, если вы не хотите, чтобы он был выбран автоматически. Например, команда fsck -ь 2490400 /dev/adlslh позволяет использовать суперблок в секторе 2490400. Установка и ввод квот на использование диска Вы еще не забыли тех пользователей, которых мы упоминали ранее в этой главе: они постоянно загружали файлы и вынудили вас купить новый диск для их размещения? Предположим, вы решили, что не хотите, чтобы какой-то один пользователь мог занимать более 100 Мбайт дисковой памяти без специального вашего разрешения. Подобный лимит можно установить с помощью квот. Квоты не встраиваются в ядро GENERIC. Чтобы разрешить их использование, вы должны добавить следующую строку в конфигурационный файл специального ядра (/usr/src/sys/i386/conf /CUSTOM, скопированный из GENERIC, о чем будет рассказано в главе 18):
Файловая система FreeBSD 1 ~7ZZ I Глава 12 I 1 options QUOTA В главе 18, в разделе "Создание конфигурационного файла специального ядра", вы узнаете о том, как создается специальное ядро. Вы можете также использовать пару переключателей в файле /etc/rc.conf, чтобы разрешить поддержку квот при активизации системы. Для этого необходимо добавить следующие строки: enable_quotae="YES" check_quotas«"NO" Первая строка включает глобальную поддержку квот. Вторая строка сообщает системе о том, что нужно пропустить продолжительную, отнимающую время проверку на непротиворечивость (quotacheck -а) на этапе загрузки системы, что позволит должным образом синхронизировать базу данных квот. Если вы захотите включить эту проверку, измените вторую строку на "YES" или удалите строку вообще (значение "YES" принимается по умолчанию). Последним делом нужно включить (или отключить) квоты для отдельно взятой файловой системы. Это делается в файле /etc/f stab путем добавления опции userquota и/или опции groupquota в четвертое поле в каждую файловую систему, в которой вы хотите реализовать квоты. Ниже показан соответствующий пример: /dev/adOslf /var ufs rw, userquota 2 2 /dev/adOsle /usr ufs rw,gropquota 2 2 /dev/adlslg /home ufs rw,userquota,groupquota 2 2 После того как будут произведены эти изменения, перезагрузите систему. Теперь, когда вы полностью подготовились к сражению, можно приступить к назначению квот пользователям. Можно назначать квоты от пользователя к пользователю (что очень трудно сделать на сервере, обслуживающим большое количество пользователей), а можно установить квоту для одного пользователя, и использовать ее в качестве прототипа, применяя одни и те же настройки к диапазону идентификаторов пользователей. Установка квоты для первого пользователя осуществляется с помощью встроенной утилиты edquota, которая позволяет редактировать атрибуты в виде текстового файла (подобно утилите chf п, о которой будет рассказано в главе 13). Текстовый редактор, применяемый утилитой edquota, определяется в переменной окружения EDITOR. По умолчанию определяется редактор vi, но вы можете выбрать более дружественный текстовый редактор, например, pi со или ее, используя такую команду, как setenv EDITOR pico. Ниже показан пример установки квоты для пользователя (мягкие (soft) и жесткие (hard) лимиты будут рассмотрены чуть позже): # edquota -u bob Quotas for user bob: /usr: blocks in use: 65, limits (soft » 50/ hard * 75) inodes in use: 7, limits (soft e 50, hard * 60) /var: blocks in use: 0, limits (soft * 50, hard • 75) inodes in use: 0, limits (soft я 50, hard - 60) После того как будет установлена квота для одного пользователя, вы сможете клонировать эти параметры в масштабе всей системы: # edquota -p bob 1001-9999 В результате одни и те же параметры квот будут применены ко всему диапазону указанных идентификаторов пользователей, и даже к тем, которых вы еще не создали!
430 Системное администрирование Часть IV Обратите внимание на различие между блоками и индексными дескрипторами. Будут введены оба лимита. Термин блоки (block) относится к общему используемому пространству (в модулях размером 1 Кбайт), а индексные дескрипторы (inode) можно понимать как "файлы". Мягкие и жесткие лимиты Если выразиться в двух словах, то жесткие и мягкие лимиты, а также льготный период, можно объяснить так: • Жесткий лимит (hard limit) действует строго. Если пользователь достигнет жесткого лимита на использование диска, система больше не выделит пользователю дополнительного пространства. • Мягкий лимит (soft limit) не запрещает пользователю создавать больше файлов или использовать больше пространства; наоборот, он включает таймер льготного периода (grace period), который по умолчанию составляет семь дней (его можно изменить с помощью команды edquota -t). По истечении этого периода мягкий лимит будет действовать точно так же, как и жесткий лимит. Благодаря этому пользователи смогут в течение коротких промежутков времени использовать больше пространства, чем выделено для них (вплоть до жесткого лимита). Если пользователь будет занимать меньше пространства, чем определяет мягкий лимит, льготный период будет сброшен. После того как вы установите лимиты, просмотреть их можно будет следующим образом: # quota bob Disk quotas for user bob (uid 1015) : (Квоты на использование диска для пользователя bob (uid 1015)) Filesystem blocks quota limit grace files quota limit grace /home 1812 20000 40000 37 0 0 Команда quota показывает информацию о квотах для пользователя, определенного в последнем аргументе, или для текущего пользователя, если этот аргумент будет опущен. Если пользователь превысит один из этих лимитов, то после количества блоков или файлов, превышающих лимит, появится знак звездочки (*), а в столбце grace будет указано, сколько времени осталось до ввода жесткого лимита. Ниже показан пример: # quota bob Disk quotas for user bob (uid 1015) : Filesystem blocks quota limit grace files quota limit grace /home 28121* 20000 40000 6days 189 0 0 НА ЗАМЕТКУ Чтобы убедиться в том, что квоты работают должным образом, используйте команду mount без аргументов. Ниже показан вывод команды mount для системы, в которой квоты установлены в разделе /home: /dev/adOsla on / (ufs, local) /dev/adOsle on /usr (ufs, local) procfs on /proc (proofs, local) /dev/adlslg on /home (ufs, local, with quotas)
Файловая система FreeBSD I 7^~~ Глава 12 I Если вы не видите флага with quotas, это означает, что файловая система не была должным образом смонтирована с учетом квот. Проверьте файлы /etc/fstab, /etc/rc.conf, а также конфигурацию вашего ядра, после чего попытайтесь перезагрузить систему, если все будет выглядеть нормально. Квоты можно отключить достаточно просто с помощью одного из трех способов. • В глобальном режиме нужно вставить строку enable_quotas="NO" в файл /etc/rc.conf и выполнить перезагрузку. • Если рассматривается отдельно взятая файловая система, отредактируйте файл /etc/fstab и выполните перезагрузку. • Если рассматривается отдельно взятый пользователь, воспользуйтесь утилитой edquota и присвойте жестким и мягким лимитам нулевые значения. После этого можно выполнить команду edquota -p, чтобы распространить эти параметры на весь диапазон идентификаторов пользователей, если в этом возникнет необходимость. Управление файловой системой не является простой задачей, но как только вы разберетесь с основными концепциями, то все сложности с файловыми системами UNIX вскорости исчезнут. Многопользовательские операционные системы наподобие FreeBSD поднимают такие вопросы, которые не являются характерными для настольных системах, например, обработка множества типов файловых систем, мониторинг использования и ввод квот, однако благодаря именно этим особенностям UNIX отличается от ее менее способных сверстниц. Мы продолжим разговор на эту тему при рассмотрении вопросов форматирования и маркирования новых дисков в главе 20. Блоки, файлы и индексные дескрипторы Различные способы восприятия данных, хранящихся на диске, могут сбить с толку, но детали важны для того, чтобы понять, как нужно читать выходные данные таких инструментов, как df и f sck. Давайте-ка поговорим о том, как производится разбивка и использование памяти. Блок данных представляет собой единицу хранилища данных; по умолчанию размер блока данных составляет 8192 байта. Блок делится на восемь фрагментов по 1024 байта каждый. Файл, который не занимает весь блок данных, хранится в виде фрагментов и использует этот блок вместе с другими файлами. Именно об этом процессе и сообщает программа f sck. Однако если размеры файл, который на данный момент использует блок данных вместе с другим файлом, увеличиваются до такой степени, что его нельзя больше уместить в текущем блоке, FreeBSD перемещает весь файл в другой блок. При таких же обстоятельствах Windows просто переносит фрагмент файла в соседний блок. Подход, применяемый в FreeBSD, гарантирует, что для файлов, размер которых составляет менее 8192 байтов, все фрагменты одного файла всегда будут находиться в одном блоке данных. Он гарантирует также, что файл любого размера будет храниться в минимально возможном количестве разных блоков. У вас никогда не будет небольшого файла, фрагменты которого будут располагаться в нескольких блоках данных. Разумеется, это позволяет сократить время доступа к данным и не допустить такого уровня фрагментации, как в потребительских операционных системах.
I ТГГ I Системное администрирование I 43Z I Чаг-TulV "Файл" на самом деле является просто другим взглядом на индексный дескриптор (inode), представляющий собой структуру связанных между собой данных, которую мы рассматриваем как файл. Эта модель необходима для того, чтобы истинная многопользовательская операционная система могла рационально организовать совместное использование файлов. Ниже перечислена информация, которую содержит индексный дескриптор. • Тип файла и режимы доступа к нему. • Идентификатор пользователя и идентификатор группы владельца этого файла. • Размер файла. • Время последнего доступа и модификации файла, а также время последнего изменения индексного дескриптора. • Количество блоков данных, занятых файлом или выделенных для него. • Прямые и косвенные указатели на эти блоки данных. FreeBSD обращается к блокам данных с помощью указателей, находящихся в индексных дескрипторах. Существуют 12 прямых указателей, каждый из которых может обращаться к одному блоку. Это позволяет организовать прямой доступ к файлу размером вплоть до 96 Кбайт. Кроме того, существуют три уровня косвенных указателей: одиночные, двойные и тройные. С помощью этих указателей FreeBSD может поддерживать файлы очень большого размера, охватывающие огромное количество блоков. Одиночный косвенный указатель ссылается на блок файловой системы, содержащий указатели на блоки данных. Блок файловой системы содержит 2048 дополнительных адресов 8-килобайтных блоков данных, позволяя тем самым осуществлять доступ к файлу размером вплоть до 16 Мбайт. Двойной косвенный указатель ссылается на блок файловой системы, содержащий 2 048 адресов, каждый из которых указывает на блок файловой системы, содержащий одинарный косвенный указатель, и каждый из этих 2048 одинарных косвенных указателей ссылается на блок файловой системы, содержащий 2 048 адресов 8-килобайтных блоков данных. Это позволяет осуществлять доступ к файлу размером вплоть до 32 Гбайт. И, наконец, тройной косвенный указатель содержит 2048 адресов, каждый из которых указывает на блок файловой системы, содержащий двойной косвенный указатель. 2048 двойных косвенных указателей по 2048 последующих одинарных косвенных указателей по 2048 блоков данных позволяют тройному косвенному указателю обеспечивать доступ к файлу размером 70 Тбайт! С другой стороны, FFS ограничивает максимальный размер файла одним терабайтом, поэтому нужно следить за тем, чтобы этот размер не был превышен.
ГЛАВА 13 Пользователи, группы и полномочия В этой главе... • Знакомство с пользователями и группами • Для чего используются группы? • Владение файлом • Полномочия на доступ к файлам и каталогам • Списки контроля доступа • Добавление и удаление пользователей • Управление пользователями с помощью NIS
434 Системное администрирование Часть IV Полномочия пользователей и файлов — это концепции, формирующие основы системы UNIX. Работа в системе, предназначенной для выполнения многопользовательских операций, навязывает гораздо больше правил и ограничений, чем в стандартных однопользовательских настольных системах. Это связано как с безопасностью, так и с конфиденциальностью: помимо того, что каждый пользователь может скрывать свои файлы и секретные данные от пытливых глаз других пользователей, он вдобавок будет ограничен в доступе к тем частям системы, которые не принадлежат ему самому. Этот прием позволяет защитить компоненты и конфигурацию самой операционной системы от повреждения вследствие действий, вызванных пользователями, независимо от того, случайные они или преднамеренные. Истинная многопользовательская операционная система является такой средой, в которой каждый процесс принадлежит одному из пользователей, а каждый пользователь обладает определенным уровнем привилегий, позволяющих ему выполнять эти процессы. Работая на настольном компьютере, вы уже могли получить представление о многопользовательской среде; тем не менее, даже в современных версиях Windows серверного класса привилегии пользователей играют несколько иную роль, чем в FreeBSD. Давайте попробуем разобраться, почему существует такое отличие, сравнив использование полномочий в Windows и FreeBSD. Традиционнее настольные операционные системы, такие как Windows 95/98/Ме и классическая Mac OS, на первый взгляд казались многопользовательскими операционными системами; но, строго говоря, они таковыми не являлись. Наоборот, в них использовались просто профили, или способы представления данных в соответствии с предпочтениями каждого пользователя. Любое действие, которое желает предпринять пользователь, и которое потенциально может привести к изменению системы (например, чтение и запись файлов, инсталляция программ или выключение компьютера), запрещалось, поскольку существовал только один "пользователь", который мог полностью управлять машиной. Доступ к ресурсам сети осуществлялся по принципу "гостевого пользователя", в соответствии с которым пользователь или компьютер не принимал участие в какой-либо реальной аутентификации на контроллере домена или его эквиваленте. Windows NT, 2000 и ХР, будучи операционными системами серверного класса, и требующие более высокой защиты данных и стабильности, чем их предшественницы, предприняли успешные шаги, чтобы стать действительно многопользовательскими операционными системами, каковой является FreeBSD. Каждый пользователь в системе обладает отдельной учетной записью и набором полномочий, которые управляют доступом к файлам, принтерам и другим ресурсам. Как в Windows, так и в FreeBSD, используется понятие пользователя root, или администратора (суперпользователя), который обладает абсолютной властью над локальной машиной. В каждой системе есть группы (разрешающие совокупностям пользователей иметь один и тот же доступ к некоторым ресурсам) и различные уровни доступности. (И действительно, полномочия в стиле Windows обладают такой сложностью — восходящее наследование, нисходящее наследование, пользователи доменов против локальных пользователей, существование до трех учетных записей с правами администратора, - в которой могут запутаться даже самые опытные пользователи.) Тем не менее, даже с учетом всех недавних улучшений, позволивших многопользовательской функции Windows стать более похожей на аналогичную функцию UNDC, обе эти системы все равно имеют слишком разные традиции в организации удаленного доступа и администрирования. Эти традиции продолжают оказывать влияние на модель полномочий
Пользователи, группы и полномочия .„ ~ Глава 13 I 1 в каждой из этих систем, что приводит к множеству фундаментальных отличий, существующих и по сей день. НА ЗАМЕТКУ Mac OS X, истинная операционная система UNIX, обладает многопользовательской архитектурой, подобной FreeBSD, вот только разработана она не для того, чтобы вы могли запускать сеанс пользователя без привилегий администратора. Наоборот, административные действия выполняются по модели sudo, в соответствии с которой система предлагает вам ввести пароль, чтобы аутен- тифицировать вас как пользователя, которому полномочо получать привилегии администратора (а не просто как пользователя, которому посчастливилось сесть за компьютер с активным сеансом прошедшего регистрацию пользователя). После этого система сохраняет этот повышенный уровень привилегий на период выполнения любых действий, связанных с администрированием. Модель sudo является более безопасным способом администрирования системы, чем постоянная работа под учетной записью администратора. Установите программу sudo (в категории security портов или пакетов), и при любых обстоятельствах применяйте ее, вместо того чтобы работать под учетной записью root. Согласно указаниям на man-странице sudo, настройте файл sudoers таким образом, чтобы доступ к команде имели только авторизованные пользователи. Затем используйте sudo в качестве префикса команды, чтобы на экран выводилось приглашение на ввод пароля root, и чтобы команда выполнялась от имени пользователя root. Хотя в современных версиях Windows интегрированы графические программы терминального сервера, традиционный метод использования и администрирования системы Windows заключается в работе с консолью, когда пользователь сидит напротив компьютера. Действительно, поскольку в сети существуют перегрузки, и поскольку существует вероятность взлома графических программ терминального сервера, многие администраторы по-прежнему стараются работать с консолью, в которой сложный пользовательский интерфейс не страдает от задержек в сети. В случае с серверами, в которых важны привилегии пользователей, сетевые приложения, выполняющиеся в среде Windows, обычно состоят из двух частей: серверной, которая берет на себя всю основную обработку и выполняется постоянно, и клиентской, которая должна быть инсталлирована на удаленном компьютере, и которая обращается к серверным приложениям посредством любых функций, запрограммированных в клиенте. В качестве примера здесь хорошо подходит Web-браузер, обращающийся к серверу, и почтовый клиент, обращающийся к POP- или IMAP-почте или календарным данным. Серверное Web-приложение или приложение электронной почты работает только под своими собственными ограниченными полномочиями, и каждый пользователь, обращающийся к приложению с удаленного компьютера, подпадает под эти ограничения, и не сможет напрямую повлиять на какие-либо файлы на сервере. Если данные нужно разделить среди пользователей, сохраняя конфиденциальность и безопасность, то этим разделением обычно занимается само приложение, а не операционная система. FreeBSD и другие операционные системы семейства UNIX, наоборот, преуспевают в сфере специального удаленного доступа. Хотя приложения типа клиент-сервер являются обычными как для мира UNIX, так и для мира Windows, в UNIX удаленным пользователям гораздо важнее иметь возможность доступа ко всей операционной системе через терминальные соединения (такие как Telnet или SSH), которые обеспечивают пользователя интерфейсом оболочки командной строки по сети. Доступ к оболочке осуществляется очень легко и не требует ничего, кроме самых элементар-
Системное администрирование ных клиентских приложений, которые зачастую уже установлены как часть клиентской операционной системы. Как вы уже могли видеть, оболочка дает пользователю возможность выполнять любые команды FreeBSD, которые ей будут необходимы, а не только те команды, которые полномочы специализированным клиентским программные обеспечением (ПО) для определенного приложения. К тому же простой текстовый интерфейс не настолько чувствителен к медлительности сети, как графический клиент удаленного доступа, которому нужно передавать полную информацию о перемещениях в оконной системе. Как результат, помимо обычных приложений типа клиент-сервер, таких как Web-серверы и приложения для электронной почты, ваша FreeBSD-машина будет доступна одновременно для многих пользователей из многих удаленных мест, и каждый пользователь будет работать с терминальными программами для запуска оболочек на самом сервере, выполняя любые команды для изменения файлов на сервере. Таким образом, в системах FreeBSD полномочия пользователей и групп, защищающие важные системные файлы и обеспечивающие конфиденциальность пользовательских данных во время этого специального доступа, играют в жизни администратора гораздо большую роль, чем в системе Windows, в которой администратор всегда может предсказать, какие приложения будут выполняться и как они могут повлиять на систему. ВНИМАНИЕ! SSH (Secure Shell — защищенная командная оболочка) является зашифрованной, или "засекреченной", формой удаленного терминального соединения. Оно обеспечивает все функциональные особенности Telnet (традиционное терминальное приложение с открытым текстом) и обладает дополнительной защитой от средств перехвата сообщений, которые могут просматривать терминальный трафик (например, с их помощью можно выведать ваш пароль или секретные системные данные). На сегодняшний день SSH является предпочтительным вариантом защиты информации и поддерживается практически во всех случаях, a Telnet следует использовать только тогда, когда нет возможности применять SSH. Мы рассмотрим SSH более подробно в главе 30. Знакомство с пользователями и группами Модель пользователей и полномочий, используемая в FreeBSD и большинстве операционных систем семейства UNIX, достаточно простая и одноуровневая. Существует только два типа пользователей: обычные пользователи и суперпользователь, он же пользователь root. Обычные пользователи обладают такими полномочиями, которые ограничивают их действия; только суперпользователь лишен каких- либо ограничений. Другие модели полномочий (как в Windows 2000/XP) построены на более сложной многоуровневой структуре, способствующей выполнению некоторых системных функций вроде служб аутентификации и процессов системного уровня. Более простая модель FreeBSD потребует от вас выполнить некоторые дополнительные действия, когда она приступит к выполнению таких задач, как определение подходящих полномочий для Web-сервера, позволяющих защитить его от неавторизованного доступа пользователями оболочки (этот вопрос будет рассматриваться в главе 26). Однако альтернативный вариант — более сложная система полномочий- будет означать менее защищенную систему, поскольку в его случае высока вероятность того, что что-то сработает не так, как надо.
Пользователи, группы и полномочия Глава 13 НА ЗАМЕТКУ В FreeBSD можно использовать более сложную модель полномочий — списки контроля доступа (Access Control List — ACL); о них мы поговорим далее в этой главе. Списки контроля доступа позволяют разрешать доступ к некоторым ресурсам определенному кругу пользователей, и не использовать маски групп и полномочий. Каждый обычный пользователь в системе FreeBSD обладает ограниченными полномочиями и имеет закрепленное за собой место для хранения файлов (домашний каталог). Когда вы соединяетесь с FreeBSD-машиной удаленным способом, то вы являетесь, как правило, рядовым пользователем, а не суперпользователем. Вы попадаете в свой домашний каталог, хранящий файлы, которые вы можете модифицировать только потому, что являетесь их владельцем. Чтобы повысить статус, вам нужно перейти в ранг суперпользователя с помощью команды su (или, что более предпочтительно, с помощью команды su -, которая имитирует полную регистрацию пользователя root с переменными окружения), В этом случае вам будет предложено ввести пароль пользователя root, который является "ключом от королевства" и представляет собой самую важную информацию, которую вы должны помнить при поддержке системы. После того как вы получите возможность доступа на уровне суперпользователя, вы получите такие же возможности создания или удаления файлов на компьютере, как и на однопользовательской Windows-машине. ВНИМАНИЕ! Всякий раз при входе в систему в роли root вы должны соблюдать повышенные меры безопасности, быть осторожным, чтобы никто из злоумышленников не смог получить такую же степень доступа, как и у вас. Пароль пользователя root никогда не следует передавать по сети в открытом виде. Возьмите себе за правило изменять пароль каждые пять месяцев (более подробно об этом вы узнаете в главе 30). В отношении этой жизненно важной порции информации нужно быть всегда начеку. Чтобы выполнить команду su, нужно быть членом группы, называемой "wheel" (привилегированные пользователи). Несмотря на то что в FreeBSD имеются только обычные пользователи и суперпользователь, группа привилегированных пользователей формирует специальный класс обычных пользователей — тех, кому полномочо становиться пользователем root (с помощью команды su). Вы можете применять команду su и этот специальный класс, чтобы делегировать административную ответственность тем пользователям, которым вы доверяете. НА ЗАМЕТКУ FreeBSD немного отличается от большинства дистрибутивов Linux и многих операционных систем семейства UNIX тем, что она не разрешает пользователю root подключаться непосредственно к системе (через Telnet или SSH). Это своеобразная мера безопасности. Чтобы пользователь root мог получить доступ, нужно подключиться как обычный пользователь — в частности, как пользователь, который является членом группы привилегированных пользователей — и использовать команду su для получения статуса суперпользователя. Это означает, что один пароль пользователя root не позволит кому бы то ни было получить доступ к вашей системе; для этого понадобится еще и пароль пользователя, являющегося членом группы привилегированных пользовате-
438 Системное администрирование Часть IV лей. Искусный хакер сможет рассекретить оба пароля, однако дополнительная преграда в виде второго пароля будет иметь сдерживающий характер. Если вы действительно, действительно должны отключить эту функцию и сделать так, чтобы FreeBSD разрешала прямой доступ пользователю root, вы можете сделать это, отредактировав файл /etc/ttys и добавив ключевое слово secure в поле, находящееся справа от network, в первых нескольких записях раздела Pseudo terminals: ttypO none network secure ttypl none network secure ttyp2 none network secure Однако этот маневр считается слишком рискованным, и его не следует использовать, если вы можете просто войти в систему под своим собственным именем и с помощью su. Другая отличительная особенность среди обычных пользователей заключается между регистрирующимися пользователями (люди, которые подключаются к системе) и автоматическими пользователями (bin, operator, daemon, nobody и прочие). Эти учетные записи пользователей существуют для того, чтобы "владеть" некоторыми системными процессами и серверными приложениями. Важно понимать, что каждый процесс, как и файл, принадлежит некоторому пользователю, и все процессы ограничены полномочиями пользователей при взаимодействии с файлами и остальными процессами. Это позволяет гарантировать, что системные процессы, создающие файлы, будут делать это, обладая ограниченными полномочиями своих собственных пользователей, а не пользователя root (что может быть опасным и не защищенным). Пользователи никогда не обращаются к своим файлам напрямую. Все, что делает пользователь со своими файлами с помощью команд, на самом деле выполняется процессами, которые обладают теми же полномочиями, что и пользователь. Эти процессы могут оперировать с файлами и остальными процессами, как показано на рис. 13.1. Процессы, принадлежащие пользователю userl, могут работать только с теми файлами и процессами, которые принадлежат пользователю userl; в полномочии может быть отказано, если один из этих процессов попытается каким-либо образом изменить какой-нибудь файл или процесс пользователя user2. Рис. 13.1* Пользователь выполняет процессы, которые затем работают с файлами и другими процессами
Пользователи, группы и полномочия Глава 13 439 В самом простом случае каждый пользователь может изменять только те файлы и процессы, которые ему принадлежат. Давайте представим себе, что может произойти, если пользователь userl станет суперпользователем. Процессы этого пользователя будут обладать абсолютной властью над файлами и процессами любого другого пользователя. Если один из процессов пользователя userl является, скажем, программой, читающей конфигурационный файл и модифицирующей элементы системы, определенные в этом файле, предположим существование авторизованного пользователя, который сумел изменить конфигурационный файл злоумышленным способом. Программа пользователя userl может оказаться уязвимой перед любой подобной неверной конфигурацией, и в зависимости от ее возможностей может полностью разрушить систему. Вот почему большинство системных процессов, кроме тех, которые обладают абсолютным доверием, выполняются от имени одного из автоматических псевдопользователей, а не от имени пользователя root. Для чего используются группы? Каждый пользователь принадлежит некоторой первичной группе, обычно группе, которая имеет то же имя, что и пользователь, а пользователь является ее единственным членом. Это можно изменить, если вы сочтете это нужным; например, вы можете решить, что все пользователи должны принадлежать группе users как их первичной группе. Однако если у вас будет отличная группа для каждого пользователя, вы получите большую гибкость. Кроме того, такая модель является более безопасной. Более подробную информацию об уникальных "персональных" группах и о том, почему с ни являются полезными, вы можете получить, выполнив команду man adduser. Каждый пользователь может также принадлежать любой другой группе в системе, например, "персональным" группам других пользователей, группе привилегированных пользователей или любой другой группе, которую вы создадите (добавив пользователя в файл /etc/group, как будет показано далее), Однако управлять принадлежностью пользователей к группам может только суперпользователь. Мы обсудили назначение группы привилегированных пользователей — она нужна, чтобы показать особый круг пользователей, обладающих привилегиями на использование команды sue целью повышения уровня доступа до суперпользователя. Другим применением групп является получение особых привилегий некоторыми пользователями. В самом общем случае группа существует для того, чтобы предоставить одному пользователю те же полномочия на набор файлов или процессов, что и другому пользователю — например, чтобы разрешить нескольким инженерам, работающим над программным проектом, модифицировать файлы исходного кода в одном центральном месте, как показано на рис. 13.2» Нежелательно, чтобы два пользователя были вынуждены совместно использовать одну учетную запись, или чтобы каждый из них сообщал другому свой пароль; группы позволяют двум пользователям "владеть" одной и той же группой файлов, при этом оба пользователя будут иметь одни и те же полномочия для работы с этими файлами.
440 Системное администрирование Часть IV f user 1J f user 2 J f ueer3 1 процесс! v (процесс I процесс >|r у процесс| [ V 1 ПОЛНОМОЧИЯ Ў ^ 1 файл 1 ii i in hi ищи jl ' . T j файл 1 I файл I 1 файл Ь процесс 1 процесс т т у т файл 1 1 файл 1 Рис. 13.2. Два пользователя в группе, работающие с одним и тем же набором файлов. Другие пользователи не имеют доступа к этим файлам Владение файлом Вот мы и подошли к модели владения файлами. Всем операционным системам семейства UNIX присуща одна и та же структура принадлежности: каждый файл и каталог принадлежит как пользователю, так и группе. Как вы скоро сможете увидеть, это необязательно означает, что пользователь или члены группы обладают определенными правами на доступ к файлу или каталогу. Тем не менее, принадлежность вступает в игру вместе с настройками полномочий, которые показывают, что может делать с этим файлом пользователь-владелец и остальные пользователи. Давайте посмотрим на детали полномочий и владений для набора файлов (см. листинг 13.1). Здесь мы можем видеть, что опция -1 команды Is дает нам подробный листинг; опцию -а мы используем для того, чтобы показать все файлы, включая "скрытые" файлы (имена скрытых файлов начинаются с точки). Листинг 13.1. Набор файлов, показывающих принадлежность м полномочия # Is -la /home/frank total 3126 drwxr-xr-x drwxr-xr-x -rw-r—r— -rw-rw-r— -rw-r—r— -rw-r—r— drwxr-xr-x drwxr-xr-x 3 52 1 1 1 1 2 12 frank root bob bob frank bob root root frank frank frank bob frank frank frank wheel 512 • 9216 291090 2703 3657 92195 512 1024 May 12 Mar 7 Jan 23 Dec 22 Jan 9 Sep 11 Jan 2 Feb 18 2000 13:37 2000 1998 14:11 21:31 14:19 1999 . •. l.bmp contents.html file.txt l.uu files more-files Выглядит довольно загадочно, хотя на самом деле все просто. В этой главе вы еще узнаете о том, как расшифровываются строки, например, drwxr -х, которые определяют режим файла (параметры, которые определяют, кто и каким образом может получать доступ к этому файлу). Существуют три модели прав владения файлом (или каталогом): пользователь (user), группа (group) и другие (others). Существуют также три модели доступа: чтение (read), запись (write) и выполнение (execute). Эти шесть порций информации, назы-
Пользователи, группы и полномочия Глава 13 441 ваемые битами, определяют права на данный файл. Например, судя по конфигурации прав на файл, мы можем сказать, что пользователь, которому принадлежит этот файл, может читать его и записывать в него данные, а члены группы, которой принадлежит этот файл, могут только читать его, и кто-либо еще в системе может также только прочитать его. (Такой режим файла используется по умолчанию.) Точно так же, режим полномочий файла может сказать нам, что кто-либо — пользователь, группа или другие — может читать или выполнять этот файл (запускать как программу), но записывать в него данные может только тот пользователь и группа, которому файл принадлежит. Возможна практически любая комбинация. Далее в этой главе мы поговорим более подробно о режимах полномочий и узнаем, как они устанавливаются. Пока что необходимо понять, что пользователь может читать только свои собственные файлы, если для этих файлов установлены такие полномочия, которые позволяют читать их. Точно так же, необходимые полномочия должны быть установлены, если члены группы-владельца намерены читать файлы. Чаще всего именно это и необходимо; важно понимать, что владение и полномочия не очень сложно связаны между собой. НА ЗАМЕТКУ Пользователь может удалить файл, принадлежащий другому пользователю, если этот файл находится в каталоге, принадлежащем первому пользователю. Команда rm ("remove" — удалить) запросит, желает ли пользователь заменить владельца файла и его права, и затем выполнит удаление, как показано ниже: # Is -1 tempf ile -rw-r—г— 1 root wheel 0 Aug 7 21:44 tempf ile # rm tempfile override rw-r—г— root/wheel for tempfile? у переписать rw-r—r— root/wheel для tempf ile? у Использование команды chown для изменения владельца файла Будучи суперпользователем, вы имеете возможность управлять тем, какому пользователю будет принадлежать тот или иной файл в системе. Только суперпользователь может делать это; обычные пользователи не могут "отдавать" свои файлы другому пользователю или "брать" их у другого пользователя. Если бы они могли делать это, то тогда смысл в существовании пользователей и владении файлами был бы утрачен. Чтобы изменить владение файла, используется команда chown ("change own" — сменить владельца): # chown bob file.txt Эта команда изменяет пользователя-владельца — не группы-владельца — файла file.txt на пользователя bob. Сначала файл принадлежал пользователю frank, а теперь пользователь bob (Боб) может читать и записывать данные в файл, в то время как пользователь frank (Франк) больше не может записывать данные в этот файл. Вы можете также использовать команду chown в отношении каталога: # chown bob /home/frank
Т7Г I Системное администрирование Часть IV Если эту команду использовать в отношении каталога, то она будет оперировать с записью ".", которую вы могли видеть ранее в листинге 13Л. Это специальное имя файла представляет собой указатель, который ссылается на текущий каталог, в то время как запись *.." относится к родительскому каталогу (аналогичное поведение наблюдается и в MS-DOS). Если посмотреть на полномочия в каталоге /home/frank, вы увидите, что в него можно записывать файлы только в том случае, если это делает пользователь, которому этот каталог принадлежит (это можно определить по биту w в третьей позиции, и нигде больше, в строке полномочий); таким образом, bob сейчас является единственным пользователем, кто может создавать и удалять файлы в этом каталоге. Однако он может модифицировать любой файл, который ему принадлежит, в любом каталоге. Эта взаимосвязь между владением и полномочиями станет понятной, если взглянуть на табл. 13.1. СОВЕТ Команда chown имеет полезную опцию -R, о существовании которой вам, как администратору, следует знать. Благодаря этой опции, команда chown будет действовать рекурсивным образом. Другими словами, если вы выполните эту команду в отношении каталога, то функция будет работать с текущим каталогом, всеми файлами, находящимися в нем, и всеми файлами во всех вложенных в него каталогах. Используйте команду chown, если вам понадобится, например, повторно создать учетную запись и передать владение всеми файлами пользователя. Ниже показан пример использования этой команды: # chown -R bob /home/frank Использование команды chgrp для изменения группы-владельца файла Теперь, когда вы знаете о том, как используется команда chown, вам будет несложно разобраться с командой chgrp — очень простой, кстати, командой. Она предназначена для того, чтобы изменить группу-владельца, а не пользователя-владельца файла или каталога, и работает она точно так же: # chgrp users contents.html После того как эта команда будет выполнена, полномочия для файла contents .html будут выглядеть примерно так: -rw-rw-r— 1 bob users 2703 Dec 22 1998 contents.html Поскольку пользователи и группы, владеющие этим файлом, обладают полномочиями на запись (бит w в третьей и шестой позициях), вы только что создали ситуацию, при которой каждый член группы users может осуществлять запись в файл точно так же, как и bob. По умолчанию FreeBSD создает новую группу для каждого пользователя, поэтому для пользователя bob будет создана группа bob, а сам этот пользователь будет относиться к своей первичной группе. Создаваемые файлы всех пользователей по умолчанию принадлежат пользователю bob и группе bob. На данный момент, если другой пользователь (например, frank) принадлежит группе bob, то он может осуществлять запись в эти файлы. Вы сейчас имеете механизм совместного использования фай лов, в котором пользователи bob и frank обладают одинаковым уровнем управления файлами.
Пользователи, группы и полномочия Глава 13 443 СОВЕТ Использование команды chgrp является просто еще одним вариантом выполнения команды chown; при желании вы можете использовать следующий синтаксис: # chown bob:users contents.html Эта команда передает файл contents .html во владение пользователю bob и группе users, в то время как следующая команда изменяет только группу-владельца: # chown :users contents.html Команды chown и chgrp одинаково поддерживают опцию -R, описанную ранее. Полномочия на доступ к файлам и каталогам Давайте вернемся к файлам из листинга 13Л. Сейчас самое время более тщательно проверить строки полномочий для этих файлов и каталогов. Первое, на что вы должны обратить внимание — для каталогов первый бит в строке равен d. Это просто флаг, который на самом деле не обозначает полномочия, которыми можно управлять; однако, этот флаг является полезным средством различения файлов и каталогов. Остальные биты в строке не представляют особой сложности: три группы по три полномочия на чтение, запись и выполнение, показанные соответственно, для пользователя-владельца, группы-владельца и всех остальных пользователей. Например, файл contents.html (со строкой полномочий -rw-rw-r--) могут читать и записывать в него данные как пользователи-владельцы, так и группы-владельцы, а все остальные пользователи могут только читать этот файл. В табл. 13.1 дается описание всех 10 полей в строке полномочий и назначение всех их возможных значений. Обратите внимание на то, что каталог должен иметь установленным бит execute, чтобы содержимое каталога можно было просматривать; применительно к каталогу просмотр его содержимого или перемещение в него файлов считается "выполнением" (executing) этого каталога. Таблица 13.1. Структура строки полномочий "о—" ?зНначениея) Назначение 1 d, - Показывает, является ли данный элемент каталогом или (если -) простым файлом. 2 г, - Показывает (если г), что элемент может быть прочитан его владельцем. 3 w, - Показывает (если w), что в элемент может производиться запись (его можно модифицировать) его владельцем. 4 х, -, s Показывает (если х), что владелец элемента может выполнять/искать его, или (если s) что элемент можно выполнять в режиме setuid. 5 г, - Показывает (если г), что элемент может быть прочитан членами группы- владельца этого элемента. 6 w, - Показывает (если w), что члены группы-владельца элемента могут производить в него запись (модифицировать его). 7 х, -, s Показывает (если х), что члены группы-владельца элемента могут выполнять/искать его, или (если s) что он будет выполняться в режиме setgid. 8 г, - Показывает (если г), что элемент может быть прочитан любым пользователем, отличным от владельца элемента.
444 Системное администрирование Часть IV Окончание табл. 13.1 Позиция Значение (значения) Назначение 9 w, - Показывает (если w), что любой пользователь, отличный от владельца элемента, может производить в него запись (модифицировать). 10 х, -, t Показывает (если х), что любой пользователь, отличный от владельца элемента, может выполнять/просматривать его, или (если t) что этот элемент является "не поддающимся командам" ("sticky") каталогом, в котором пользователь не может удалять файлы, если он ими не владеет. Отношения между полномочиями на файлы и каталоги В таблице 13.2 показаны отношения между пользователем, группой, к которой принадлежит пользователь, и полномочиями, которые предлагает каталог пользователю и группе, в зависимости от его режима. Таблица 13.2. Возможности, предоставляемые различными типами полномочий на файлы Каталог, запись в который осуществляет пользователь Каталог, запись Каталог, запись в который в который осуществляет осуществляют группа другие Создание файла. Да Удаление файла, принадлежащего пользо- Да вателю; пользователь может записывать в него данные. Удаление файла, принадлежащего группе; Да пользователи группы могут записывать в него данные. Удаление файла, принадлежащего другим Да пользователям; другие пользователи могут записывать в него данные. Переименование файла, принадлежащего Да пользователю; пользователь может записывать в него данные. Переименование файла, принадлежащего Да группе; пользователи группы могут записывать в него данные. Переименование файла, принадлежащего Да другим пользователям; другие пользователи могут записывать в него данные. Модификация файла, принадлежащего Да пользователю; пользователь может записывать в него данные. Модификация файла, принадлежащего Да группе; пользователи группы могут записывать в него данные. Модификация файла, принадлежащего Нет другим пользователям; другие пользователи могут записывать в него данные. Да Да Да Да Да Да Да Да Да Нет Нет Нет Нет Нет Нет Нет Нет Да Да Нет
Пользователи, группы и полномочия I TTZ I Глава 13 I —I Каждый раз, когда вы попытаетесь удалить (rm) файл, для которого у вас нет полномочий на запись, вы увидите приглашение, подобное нижеследующему: # rm file.txt override rw-r—г— bob/users for l.uu? у переписать rw-r—r— bob/users для l.uu? у Обратите внимание на то, что у вас до сих пор нет полномочия на удаление файла! Запрос о переписывании будет появляться каждый раз, когда вы попытаетесь удалить файл, который вам не принадлежит, независимо от того, будет ли положительным результат после ввода ответа у. Скрыть приглашение override можно с помощью команды rm -f. Файл, который может быть удален, можно переименовать, поскольку в FreeBSD для переименования файла служит команда mv ("move" — переместить), и ее действие сводится к копированию файла с последующим его удалением. Файл, который можно прочитать, можно и скопировать. Помимо стандартных полномочий, применимых к пользователю, группе и другим пользователям, некоторые дополнительные режимы файлов имеют особое значение. Вы узнаете об этих режимах в следующих разделах, в которых будут обсуждаться механизмы изменения полномочий на файлы. Использование команды chmod для изменения полномочий на файлы и каталоги Теперь, когда вы знаете, как читаются полномочия на файл или каталог, пора узнать, как они устанавливаются. Для этой цели служит команда chmode ("change mode" — изменить режим). Набор полномочий на файл часто называется режимом (mode) файла. Команда chmode может работать двумя способами — числовым или символическим — в зависимости от ваших предпочтений. Изменение режимов числовым способом Самой простой способ изменения полномочий заключается в установке трехразрядного, восьмеричного числа, которое уникально определяет полномочия для каждого типа владения. Каждый разряд связан с определенным режимом владения, который управляет полномочиями соответственно для пользователя, группы и других пользователей (о четвертом разряде вы узнаете далее в этой главе). Вы можете предоставить один бит полномочия для файла или комбинацию доступных битов. Разряд режима находится путем сложения чисел, соответствующих битам полномочия, которые вы хотите предоставить. Доступные биты перечислены в табл. 13.3. Таблица 13.3. Биты режимов полномочий и их назначение Бит Назначение 0 Нет полномочий 1 Выполнение (для каталогов — поиск) 2 Запись- 4 Чтение
446 Системное администрирование Часть IV С помощью этой схемы вы можете определить режим "чтение и запись" с помощью значения 6, режим "чтение и выполнение" с помощью значения 5 или режим "чтение, запись и выполнение" с помощью значения 7. Скомбинируйте эти значения в трехзначное число, показывающее три разных полномочия, предоставленных пользователю, и вы получите числовой способ определения стандартных полномочий для файла. В табл. 13.4 показано несколько распространенных примеров. Таблица 13.4. Некоторые полные числовые режимы полномочий Режим Строка Назначение 755 644 600 -rwxr-xr-x -rw-r—г— Чтение/запись/выполнение пользователем; чтение/выполнение группой и остальными пользователями. Чтение/запись пользователем; только чтение группой и остальными пользователями. Чтение/запись пользователем; нет доступа для группы и остальных пользователей. НА ЗАМЕТКУ Текстовые строки полномочий можно получить из двоичного представления восьмеричных полномочий. Например, восьмеричное 755 соответствует двоичному linoiioi; если вы объедините это число с помощью операции И с полной строкой полномочий rwxrwxrwx, вы получите rwxr-xr-x. Здесь вы можете видеть, почему атрибуты полномочий называются "битами" — это объясняется тем, что буквально, с помощью 0 или 1, это значение показывает, применяется ли каждое поле. Вы можете затем применить полномочия к файлу или каталогу, как показано ниже: • chmod 755 testscript.sh Однако в системе полномочий, принятой в FreeBSD, доступными являются только три из четырех разрядов. Четвертый, "самый старший" (самый левый) разряд, управляет некоторыми дополнительными функциями, которые приводят к специфическому поведению файлов и каталогов в определенных обстоятельствах. Ниже перечислены биты, которые составляют этот четвертый разряд, и показано, за какие действия они отвечают, • 0. Показывает обычные полномочия. • 1 — sticky-бит. Он может быть установлен (с любым эффектом) только для каталогов, превращая их в каталоги "только для добавления*, в которые файлы можно только добавлять, но не удалять. Внутри каталога, для которого установлен этот бит, обычный пользователь может только удалять или переименовывать файлы, если он владеет ими и если он имеет полномочия на запись для данного каталога. Это не применимо к исполняемым файлам. • 2. Устанавливает идентификатор группы (setgid). Если этот бит устанавливается для исполняемого файла, то файл будет выполняться с групповыми полномочиями группы-владельца файла, но не с полномочиями пользователя, выполняющего этот файл. Файл может быть сделан setgid только от имени суперпользователя.
Пользователи, группы и полномочия Глава 13 447 • 4. Устанавливает идентификатор пользователя (setuid). Если этот бит устанавливается для исполняемого файла, то файл будет выполняться с полномочиями пользователя-владельца файла, но не с полномочиями пользователя, выполняющего этот файл. Файл может быть сделан setuid только от имени суперпользователя. Четвертый разряд является самым старшим разрядом (другими словами, крайним слева разрядом), поэтому в предыдущем примере, в котором мы показывали, что означают полномочия 755, мы могли бы использовать эквивалентное значение 0755. Чтобы создать значение для данного разряда, воспользуемся те же методом, что и для остальных разрядов, поэтому значение 3755 могло бы создать каталог с sticky-би- том и установленным битом setgid, в дополнение к обычным полномочиям 755. Символическое изменение режимов Восьмеричная числовая система полномочий предназначена для достижения наиболее возможной эффективности в доступе и хранении — она является прямым отражением того, как биты полномочий хранятся в файловой системе и, таким образом, оптимизирована для чтения компьютером, но не человеком. Раз эта система является умной и эффективной, то для нас, простых смертных, будет полезно иметь такой способ установки режимов, который мы могли бы с легкостью запомнить. К счастью, здесь нам на помощь придет символический метод. Вместо того чтобы команде chmod задавать число, вы можете задать в одной строке от одного до трех алфавитных флагов. Эту строку можно форматировать по-разному, однако здесь мы рассмотрим всего лишь наиболее распространенные способы ее использования. НА ЗАМЕТКУ Выполнив команду man chmod, вы получите описание гибкого синтаксиса команды chmod и ее символических режимов. В табл. 13.5 показано несколько примеров символических режимов. Каждый из них составлен на основе строки символов. Первый символ или подстрока определяет режим (режимы) владения, второй символ показывает, какую именно модификацию вы выполняете (+, - или =), а третий символ представляет применяемый вами бит (биты) полномочия. Чтобы группа могла осуществлять запись в файл f ile. txt, выдайте следующую команду: # chmod g+w file.txt К символическому методу приспособиться проще, чем к числовому методу, и он наверняка будет более удобным для выполнения большинства операций с помощью команды chmod. СОВЕТ Опция -R работает для команды chmod точно так же, как и для chown и chgrp.
448 Системное администрирование Часть IV Таблица 13.5. Символические режимы полномочий Строка режима Назначение go+w Добавляет полномочия на запись (write) группе-владельцу (group owner) и остальным пользователям (others). +х Добавляет полномочия на выполнение (execute) всем. о-г Отменяет полномочия на чтение (read) остальным пользователям (others). ugo=rw Устанавливает полномочия на чтение (read) и запись (write) всем. a«rw To же самое, что и ugo«rw. а обозначает все (all) поля. +t Добавляет sticky-бит (только суперпользователь). +s Добавляет биты setuid и setgid (только суперпользователь). Списки контроля доступа Список контроля доступа (Access Control List — ACL) представляет собой усовершенствованную схему полномочий, которая детально управляет предоставлением доступа к файлам и каталогам. Вместо того чтобы просто разрешать или запрещать доступ на основе владельца, группы и кого-либо еще, вы можете предоставлять доступ отдельным указанным пользователям и группам. Вы можете также задавать маску максимального полномочия для пользователей и групп, которым предоставляется доступ с помощью ACL, и эта маска заменит сами полномочия, предоставленные ACL. ACL обычно не нужны пользователям настольных рабочих станций, и они редко применяются в обычных приложениях Internet-сервера. Однако в тех случаях, когда требуется выстроить сложную схему владения для групп, например, в исследовательских средах, где различные лабораторные группы должны иметь возможность участвовать в наполнении общего пула данных, ACL могут предоставить необходимый уровень модульности в полномочиях таким образом, который просто невозможно применять в традиционных полномочиях в UNIX. Чтобы ACL мог функционировать, ядро необходимо тщательно сконфигурировать с учетом поддержки расширенных атрибутов UFS. Если вы используете установку FreeBSD, которая была только что создана с помощью FreeBSD 5.0 или более поздней версии, ваше ядро будет соответствовать современным требованиям, и вам не нужно будет ничего изменять в ядре или создавать какие-либо вспомогательные файлы для расширенных атрибутов UFS; перейдите к разделу "Включение ACL в смонтированных файловых системах"» Однако если вы имеете дело со старой версией FreeBSD или такой, чьи файловые системы были созданы до выхода FreeBSD 5.0, вы должны прочитать следующие два раздела, чтобы узнать, как добавляется необходимая поддержка ядра и файловой системы для списков контроля доступа. Конфигурирование ядра для поддержки списков контроля доступа Существуют две версии файловых систем UFS (FFS): UFS1 и UFS2. UFS2, которая стала форматом по умолчанию для недавно созданных файловых систем в FreeBSD 5.0, включает встроенную поддержку расширенных атрибутов UFS, необходимых для
Пользователи, группы и полномочия Глава 13 449 работы списков контроля доступа. А вот для UFS1 нужно модифицировать ядро таким образом, чтобы включить поддержку расширенных атрибутов. Если ваша установка FreeBSD была создана до выхода FreeBSD 5.0, вам нужно будет добавить соответствующие опции и заново собрать ядро. Чтобы узнать, есть ли в вашем ядре расширения UFS Extensions, посмотрите следующие строки в конфигурационном файле вашего ядра. Если вы не собирали специальное ядро, то вашим конфигурационным файлом будет файл /usr/src/sys/i386/ conf /GENERIC в системе Intel x86 (в противном случае нужно соответствующим образом изменить часть i386). Чтобы список контроля доступа мог работать, должны присутствовать следующие строки: options UFS_EXTATTR options UFS_EXTTR_AUTOSTART options UFS^ACL Если эти опции уже присутствуют в конфигурационном файле вашего ядра, вам больше ничего не нужно будет делать. Если их нет, вы должны будете добавить эти опции, а затем собрать новое ядро. В главе 18 будет подробно рассказано о том, как выполняется конфигурирование, сборка и инсталляция нового ядра. СОВЕТ Дополнительную документацию по модификациям ядра, необходимым для ACL, можно найти в дереве исходных кодов, в файлах readme. * из каталога /sys/uf s/ufs. —¦— ¦¦ ¦ ¦ -- ¦¦— ¦— - ¦ —- > После того как вы инсталлируете новое ядро и выполните перезагрузку, потребуется сконфигурировать файловые системы, которые вы планируете использовать. Конфигурирование файловых систем UFS1 для использования списков контроля доступа В файловых системах UFS1 (системы, которые были созданы с помощью версий FreeBSD, предшествующих 5.0) вам нужно использовать команду extrattrctl, чтобы установить вспомогательные файлы для расширенных атрибутов, необходимых для списков контроля доступа. Вы должны установить эти вспомогательные файлы в каждой файловой системе, в которой вы хотите применять ACL. Например, чтобы разрешить ACL в файловой системе, смонтированной как /usr, выполните следующие действия? ВНИМАНИЕ! Файлы, созданные командами в процессе активизации ACL, могут иметь очень большой размер, порой до нескольких гигабайт в крупных файловых системах. Прежде чем выполнять команды, убедитесь в том, что у вас имеется достаточно свободного места. 1. От имени суперпользователя создайте каталоги /usr/.attribute и /usr/ .attribute/system (используйте опцию -р, чтобы создать их одновременно): t mkdir -p /usr/. attribute/system
450 Системное администрирование Часть IV 2. Измените только что созданный каталог /usr/ .attribute/system (с помощью команды cd /usr/ .attribute/system), а затем выполните команду extrattrctl, чтобы инициализировать атрибуты ACL в файловой системе: # extrattrctl initattr -p /usr 388 posixle.acl_access В больших файловых системах для выполнения этой команды может потребоваться несколько минут, поэтому вам придется запастись терпением, пока команда выполнит резервирование файлов, необходимых для поддержки ACL. 3. После завершения выполнения первой команды выполните команду extrattrctl еще раз, но с другим именем файла в качестве аргумента: # extattrctl initattr -p /usr 388 posixle.acljdefault В крупной файловой системе на выполнение этой команды тоже может потребоваться несколько минут. 4. Перезагрузите файловую систему или заново смонтируйте файловые системы, чтобы изменения вступили в силу. После того как вы сделаете это, можно будет использовать списки контроля доступа для файловой системы. Включение ACL в смонтированных файловых системах Независимо от того, имеете ли вы современные файловые системы USF2, которые сами поддерживают ACL, или старые файловые системы USF1, которые необходимо конфигурировать вручную, как было показано в предыдущих разделах, последний этап в подготовке вашей системы к использованию списков контроля доступа заключается в том, чтобы заставить программу mount применять их при монтировании разделов диска во время загрузки. Чтобы сделать это, отредактируйте файл /etc/f stab и добавьте флаг acls в опции в каждую файловую систему, в которой вы хотите использовать списки контроля доступа: /dev/adOslf /usr ufs rw,ad« 2 2 Перезагрузите систему, чтобы эти изменения вступили в силу. Вы можете также использовать флаг acls при монтировании файловой системы вручную: # mount -о acl» /dav/adOalf /uar Получение информации о текущих параметрах настройки ACL Для получения информации о существующих параметрах настройки ACL для файлов или каталогов служит команда getfacl. Например, в недавно созданном файле с именем acltest. txt, без установленного ACL и с полномочиями 644 по умолчанию, выполнение команды getfacl acltest.txt вернет следующий результат: #file:acltest.txt #owner:0 #group:0 user::rw- group::r— other::
Пользователи, группы и полномочия Глава 13 451 Первая строка просто показывает имя файла» Слледутощие две строки отображают UID и GID, соответственно — владельца и группу, которым принадлежит файл (в данном случае файл принадлежит пользователю root и группе wheel). Последние три строки показывают текущие полномочия для файла. Обратите внимание, что остальные пользователи (other) не имеют никаких полномочий на этот файл. Установка маски максимальных полномочий Маска максимальных полномочий управляет максимальными полномочиями, которые будут предоставлены любому пользователю или группе, добавленному в список ACL. Имейте в виду, что маска применяется только в отношении пользователей и групп, которым предоставляется доступ к файлу или каталогу посредством записи в ACL; маска не влияет на полномочия владельца. Она также не влияет ни на полномочия, которые имеет группа по умолчанию, ни на полномочия остальных пользователей в системе. Для любого, кто не перечислен в записи ACL, применяются стандартные полномочия на доступ к файлу. Команда setfacl служит для добавления, модификации или удаления записей из списка ACL. Ее синтаксис выглядит следующим образом: # setfacl action permissions filename Здесь action является флагом, определяющим действие, которое необходимо выполнить (добавление записи, модификация записи, удаление записи и так далее), permissions — это строка, представляющая полномочия ACL, которые необходимо установить, a filename — имя файла или каталога, к которому необходимо применить ACL. В следующем примере добавляется маска максимальных полномочий ACL на чтение файла acltest. txt: # setfacl -mm: :r acltest.txt # getfacl acltest.txt #file:acltest.txt lowner:0 tgroup:0 user: :rw- group::r— mask::r— other:: В команде setfacl опция -m означает, что вы хотите добавить или модифицировать запись в ACL. m:: определяет, что вы хотите установить маску, а г просто означает "read" (чтение). Если вы хотите также установить маску, чтобы предоставить полномочия на запись, можно использовать m: :rw. Последний аргумент, естественно, является именем файла, в отношении которого должна выполняться данная операция. После того как вы зададите маску, getfacl отобразит ту же информацию, которая выводилась в первый раз, однако теперь она покажет, что маска установлена. Добавление пользователя или группы в ACL Сила ACL заключается в том, что он позволяет определить несколько правил для данного контекста полномочия. Например, несмотря даже на то, что стандартные полномочия для файла acltest. txt могут объявлять, что только один пользователь
452 Системное администрирование Часть IV (root) имеет доступ на чтение, а все остальные пользователи не имеют этого доступа, ACL может определить явные привилегии для пользователей или групп, отличных от владельца, как будет показано здесь. Чтобы добавить пользователя или группу в ACL, вы опять вызываете команду setfacl. Например, чтобы предоставить пользователю frank доступ на чтение файла acl test. txt, вы можете воспользоваться следующей командой: # setf acl -m u: frank: r acl teat. txt # getfacl acltest.txt #file:acltest.txt #owner:0 .# group: 0 user?:rw- user:frank:r— group::r— mask::r— other:: Как можно видеть, в ACL была добавлена запись для пользователя frank (пользователи, определяемые в списках ACL, перечислены в поле между первой парой столбцов). Этот пользователь теперь будет иметь доступ на чтение файла, даже если стандартные полномочия на использование файла обычно не могут предоставить ему такого доступа. Итак, что же произойдет, если вы попытаетесь предоставить пользователю полномочия на запись и на чтение? Следующая команда предоставляет пользователю frank полномочия на чтение и запись данных в файл: # eetfacl -m u:foobar:rw acltest.txt # getfacl acltest.txt #file:acltest.txt towner:0 #group:0 user::rw- user:frank:rw- group::r— mask::rw- other:: Результаты выполнения команды getfacl показывают, что пользователю frank действительно были предоставлены полномочия на использование этого файла Обратите внимание также на то, что маска была обновлена автоматически, чтобы предоставить максимальные полномочия на чтение и запись. Если это поведение вас не устраивает (другими словами, если вы не хотите, чтобы маска обновлялась), используйте опцию -п при установке ACL. Например, следующая команда устав ливает AGL, который предоставляет пользователю frank доступ на чтение файла и запись в него данных: # eetfacl -n -a u:foobar:rw acltest.txt Однако эта команда не будет обновлять маску, даже если текущая маска не предо ставляет доступ на запись. Выполнив команду man setf acl, вы сможете посмотреть что конкретно это означает в отношении применения полномочий при различных обстоятельствах.
Пользователи, группы и полномочия Глава 13 СОВЕТ Очень важен порядок опций. Опция -п должна стоять перед опцией действия (в данном случае -т). Если вы поменяете местами эти опции, вы получите следующую ошибку: setfacl: acl_from_text () failed: Invalid argument setfacl: acl_from_text () ошибка: неверный аргумент ВНИМАНИЕ! Имейте в виду, что если вы установите новый ACL без использования опции -п, то маска максимальных полномочий будет обновлена, чтобы полномочия вступили в силу. Например, если маска в данный момент установлена таким образом, чтобы предоставить максимальные полномочия только на чтение, и вы добавляете ACL для пользователя, которому разрешено чтение и запись, то маска обновляется автоматически, чтобы предоставить привилегии на чтение и запись. Если такое поведение вас не устраивает, используйте опцию -п. СОВЕТ ¦ Когда опция -п не указывается, а маска автоматически обновляется, она расширит полномочия, если добавляется новый ACL, который имеет больше полномочий, чем разрешает текущая маска. Кроме того, маска автоматически будет понижена до максимальных полномочий, необходимых для поддержки всех записей в ACL. Например, если вы удалите запись ACL, которая разрешает доступ на чтение и запись некоторому пользователю, то доступ на запись будет автоматически удален из маски. Подобно тому, как вы можете использовать опцию -п, чтобы не допустить автоматического повышения маски, вы можете использовать опцию, чтобы не допустить автоматического понижения маски. После того как пользователю frank будет предоставлен доступ на чтение файла и запись в него данных, ваш ACL будет выглядеть примерно так: #file:acltest.txt #owner:0 #group:0 user::rw- user:frank:rw- group: :r— mask::rw- other:: Если вы хотите изменить вашу маску, чтобы она предоставляла максимальные полномочия ACL только для чтения, воспользуйтесь следующей командой: # setfacl -шю::г aclteet.txt Если после этого вы снова выполните команду getfacl, вы получите следующие результаты: ¦file:acltest.txt ¦owner:0 ¦group:О user::rw- user:frank:rw- # effective (действующая): г— group::r— mask::r— other::
454 Системное администрирование Часть IV Обратите внимание на то, что пользователь frank все равно обладает полномо чиями на чтение и запись. Однако благодаря маске реальным полномочием этого пользователя является полномочие только для чтения. Вы можете также добавить несколько ACL в одной командной строке, разделяя их с помощью запятых. Например: # setfacl -n -m u:frank:rw,u:guest:r,g:visitors:r acltest.txt Эта команда предоставляет доступ на чтение и запись пользователю frank, доступ на чтение пользователю guest и доступ на чтение группе visitors. Кроме того, использование опции -п не разрешает обновление маски, даже если текущая маска не разрешает некоторые из полномочий, которые вы определили в этой команде. Отказ в доступе с помощью списков контроля доступа Подобно тому, как ACL можно применять для предоставления пользователям и группам доступа к файлу или каталогу, к которому в противном случае у них нет доступа, его можно использовать также для запрещения доступа пользователям и группам, которые в противном случае имеют доступ. Например, следующая команда создает запись ACL для пользователя frank, которая не содержит никаких полномочий: # setfacl -m u:frank: acltest.txt В данном случае пользователю frank запрещается доступ к файлу acltest.txt, даже если frank является членом группы, которой принадлежит файл, и эта группа имеет доступ к файлу. ACL отклоняет стандартные полномочия на использование файла и запрещает доступ пользователю, даже если стандартные полномочия для файла могут предоставлять ему доступ. Однако важно понимать, что отказ в доступе для каждого отдельно взятого пользователя является менее безопасным, чем просто отказ в доступе по умолчанию и полномочия доступа доверенным пользователям. В конце концов, всегда можно сделать так, чтобы пользователь, которому вы хотите заблокировать доступ, мог иметь доступ к системе через другую учетную запись, не заблокированную списком контроля доступа. Удаление записей списка контроля доступа Для удаления записи из ACL служит опция -х. Например, следующая команда удаляет всю запись для пользователя frank: # setfacl -x u:frank: acltest.txt Если необходимо удалить из ACL все записи, используйте опцию -Ь. Ниже показан пример: # setfacl -b acltest.txt Выполнив команду man getf acl и man setfacl, вы сможете узнать больше о возможностях списков контроля доступа, включая возможность установки списков по умолчанию для каталогов.
Пользователи, группы и полномочия Глава 13 455 Добавление и удаление пользователей Теперь, когда мы обсудили вопросы, связанные с полномочиями и владением, нам нужно перейти к рассмотрению вопроса о расширении пользовательской базы системы с целью включения дополнительных пользователей и групп. Для добавления в систему пользователей применяется сценарий adduser. Эта программа немного отличается последовательностью выполняемых действий от сценариев adduser и useradd, к которым вы могли привыкнуть при работе с системой Linux, однако конечный результат является одним и тем же. Запускать сценарий adduser необходимо от имени пользователя root (или же применять sudo). Настройка параметров по умолчанию для adduser Прежде чем использовать adduser для добавления каких-либо пользователей, вы должны сначала запустить ее с опцией -С, чтобы создать конфигурационный файл, который определит поведение этой программы по умолчанию, устанавливая стандартные политики для пользователей, которых вы будете добавлять. Вы можете задать опции пользователей (оболочка, членство в группах, поведение паролей) в момент их создания, однако если у вас будет заранее сконфигурированный файл с параметрами, используемыми по умолчанию, то задача будет сильно упрощена. В листинге 13.2 показано первоначальное выполнение команды adduser -С. Листинг 13.2. Конфигурирование сценария adduser if adduser -С Login group [ ] : (Группа регистрации) Enter additional groups [ ] : (Введите дополнительные группы) Login class [default]: (Класс регистрации [по умолчанию]) Shell {sh csh tcsh bash nologin) [sh]: csh (Оболочка (sh csh tcsh bash nologin)) Home directory [/home/]: (Домашний каталог:) Use password-based authentication? [yes]: (Использовать аутентификацию на основе паролей?:) Use an empty password? (yes/no) [no]: (Использовать пустой пароль? (да/нет)) Use a random passwdrd? (yes/no) [no]: yes (Использовать случайный пароль? (да/нет)) Lock out the account after creation? [no] : (Заблокировать учетную запись после создания?) Pass Type : random (Тип прохода: случайный) Class : (Класс) Groups : (Группы) Home : /home/ (Домашний каталог) Shell : /bin/csh (Оболочка) Locked : по (Заблокирован) OK? (yes/no) : yee Re-edit the default configuration? (yes/no) : no (Отредактировать конфигурацию по умолчанию? (да/нет)) Goodbye! (Всего хорошего)) Параметры, используемые по умолчанию для каждой опции, показаны в квадратных скобках; если нажать клавишу <Enter>, они будут приняты. В этом примере выполнения команды adduser -С было определено несколько параметров, не используемых по умолчанию, особенно для оболочки csh (которая представляет собой то же,
456 Системное администрирование Часть IV что и tcsh), а также предложено сценарию создавать случайный пароль для каждого нового пользователя. В конце сценария записывается файл /etc/adduser.conf,и впоследствии вы сможете отредактировать его с помощью любого текстового редактора, или просто еще раз выполнить команду adduser -С, чтобы изменить его параметры, используемые по умолчанию. Некоторые параметры, такие как группа регистрации, лучше всего оставить пустыми, так как они будут заполняться именем пользователя при его добавлении. То же самое относится и к параметру домашнего каталога (/home/); в данном случае он определяет базовый каталог, в котором будут находиться домашние каталоги пользователей, каждый из которых будет иметь имя, соответствующее имени пользователя. Добавление пользователя с помощью сценария adduser После того как вы установите параметры по умолчанию для adduser, вы можете использовать этот сценарий, чтобы добавлять пользователей в систему, вводя минимум данных. В листинге 13.3 показан образец выполнения этого сценария. ВНИМАНИЕ! Имена пользователей должны иметь 16 символов или меньше, и не могут содержать какие-либо специальные символы, отличные от тех, которые находятся в квадратных скобках: [-_.]. В соответствии с соглашением, имена пользователей должны содержать буквы в нижнем регистре и цифры, однако в FreeBSD используются и заглавные буквы. Тем не менее, вам следует помнить о том, что остальные системы могут не быть столь снисходительными, а имя пользователя, написанное заглавными буквами в вашей системе FreeBSD, может не работать в другой системе, к которой желает присоединиться пользователь. Точно так же, обычно применяемые протоколы вроде SMTP ожидают имен пользователей в нижнем регистре, а имена пользователей, представленные в смешанном регистре, могут вызвать проблемы при пересылке электронной почты. Вы можете стандартизировать имена ваших пользователей в традиционном формате только в нижнем регистре — просто для того, чтобы гарантировать отсутствие каких-либо неприятных сюрпризов. Аналогично, некоторые разновидности UNIX (включая старые версии FreeBSD) разрешают применять имена пользователей длиной только до 8 или 12 символов; вы можете заставить пользователей отказаться от выбора длинных имен в целях соблюдения совместимости, даже если FreeBSD принимает их. Листинг 13.3. Пример сеанса сценария adduser # adduser Username: joe (Иая пользователя) Full name: Joe User (Полное имя) Uid (Leave empty for default): (UID (Оставить пустым, чтобы использовать по умолчанию)) Login group [joe] : (Группа регистрации) Login group is joe. Invite joe into other groups? [] : (Группа регистрации - joe. Пригласить joe в другие группы?) Login class [default]: (Класс регистрации [по умолчанию]) Shell (sh csh tcsh bash nologin) [csh] : (Оболочка (sh csh tcsh bash nologin)) Home directory [/home/joe]: . (Домашний каталог) Use password-based authentication? [yes]: (Использовать аутентификацию на основе паролей?) Use an empty password? (yes/no) [no]: (Использовать пустой пароль? (да/нет)) Use a random password? (yes/no) [yes]: (Использовать случайный пароль? (да/нет))
Пользователи, группы и полномочия Глава 13 457 Lock out the account after creation? [no] : (Заблокировать учетную запись после создания?) Username : joe (Имя пользователя : joe) Password : <random> (Пароль : <случайный>) Full Name : (Полное имя) Uid : 1002 Class : (Класс) Groups : joe (Группы : joe) Home : /home/joe (Домашний каталог : /home/joe) Shell : /bin/csh (Оболочка : /bin/csh) Locked : no (Заблокирован: нет) OK? (yes/no) : yes adduser: INFO: Successfully'added (joe) to the user database. ((joe) успешно добавлен в базу данных пользователей.) adduser: INFO: Password for (joe) is: cwwqAuSpwdOrYG (Пароль для {joe]) Add another user? (yes/no) : no (Добавить еще одного пользователя? (да/нет)) Goodbye! (Всего хорошегоI) При нажатии клавиши <Enter> после каждого приглашения будет принято значение по умолчанию, которое было определено в файле /etc/adduser.conf после активизации вашей конфигурации. Вы можете определить любой параметр, не используемый по умолчанию, который вы хотите предоставить данному пользователю (при условии, что опция будет заключена в скобки), и ваш выбор не повлияет на параметр по умолчанию в конфигурационном файле для будущих пользователей. При желании вы можете создать текстовый файл /etc/adduser .msg, который будет отправлен по электронной почте новому пользователю на новую локальную учетную запись. Пользователь сможет прочитать его, когда впервые войдет в систему и запустит программу обработки электронной почты (подробно о чтении электронной почты рассказывается в главе 25). Это подходящий способ отправить приглашающее сообщение каждому новому пользователю, объясняя правила работы в системе и давая несколько полезных советов. Однако файл adduser.msg по умолчанию не будет отправляться по электронной почте пользователям, а команда adduser -С не позволит вам определить, что это необходимо сделать; чтобы сценарий adduser отправил файл-сообщение, потребуется вручную отредактировать файл /etc/ addu s e r. с on f, добавив в него следующую строку: msgflag=yes Если вы хотите, чтобы adduser генерировал случайные пароли для каждого пользователя (как в этом примере), обратите внимание на строку в самом конце, где он отображает сгенерированный пароль. Вам нужно будет скопировать этот пароль (в данном случае это cwwqAuSpwdOtYG) и проинформировать о нем пользователя наиболее безопасным способом (желательно по телефону или при личной встрече). После этого пользователь сможет с помощью команды passwd сменить старый пароль на новый, под которым он войдет в систему в следующий раз. НА ЗАМЕТКУ Если вы выберете вариант, при котором adduser не будет генерировать случайные пароли для каждого пользователя (или принимать пустые пароли, что не рекомендуется делать), вам будет предложено ввести пароль для пользователя. Выбор хорошего и безопасного пароля является ключевым умением в любом Internet-приложении, и в частности тогда, когда нужно приступить
458 Системное администрирование Часть IV к администрированию UNIX-сервера. Хорошие пароли состоят как минимум из 6 символов и содержат смесь букв, цифр и специальных символов. Не следует употреблять слова, которые можно отыскать в словаре, и ни в коем случае не следует использовать в качестве пароля реальное имя пользователя. Более подробное обсуждение способов увеличения безопасности самих паролей, включающих установку сроков действия паролей и реализацию сокрытия пароля, можно найти в главе 30. В конце сценария, после того как вы введете yes в ответ на запрос OK?, adduser создаст учетную запись пользователя и выделит для него домашний каталог. В него будут скопированы следующие "файлы с точкой" (они будут видны только в том случае, если вы будете использовать опцию -а в команде Is) из /usr/share/skel: .chhrc .login_conf .mailrc .rhosts .login .mail_aliases .profile .shrc Эти файлы, настраивающие поведение оболочки пользователя и других приложений, рассматривались в главе 9. Если вы хотите модифицировать их поведение таким образом, чтобы каждый новый пользователь получил настроенную версию "файла с точкой" (например, чтобы добавить полезный псевдоним в некоторую инсталлированную вами команду масштаба всей системы), модифицируйте первоначальный файл исходного кода. Например, /usr/share/skel/dot.cshrc становится файлом . cshrc в каталоге нового пользователя. НА ЗАМЕТКУ Каждый пользователь и группа имеет числовой эквивалент своего имени, идентификатор пользователя (UID) и идентификатор группы (GID). Этот идентификатор указывается в информации о владении файла или каталога и служит для управления процессами. Если вы удалите пользователя из системы, то принадлежность файлов этого пользователя будет определяться по номеру UID, оставшемуся от пользователя. Чтобы посмотреть, был ли пользователь добавлен успешно, применяйте команду finger: # finger joe Login: joe Name: Joe User Directory: /home/joe Shell: /bin/csh Never logged in. Mail last read Wed Oct 4 12:40 2006 (PST) No Plan. Регистрационное имя: joe Имя: Joe User Каталог: /home/joe Оболочка: /bin/csh Никогда не регистрировался. Почта последний раз просматривалась Ср Окт 4 12:40 2006 (PST) План отсутствует. Удаление пользователя с помощью команды rmuser Удалить пользователя не составляет большого труда. Для этой цели применяется команда rmuser, которая принимает имя пользователя в качестве аргумента (а ко манда adduser — нет), как показано в листинге 13.4.
Пользователи, группы и полномочия | AqQ Глава 13 I Листинг 13.4. Простой сеанс гшизег # rmuser joe Matching password entry: (Запись с совпадающим паролем) joe:*:1008:1008::0:0:Joe User:/home/joe:/bin/csh Is this the entry you wish to remove? у (Хотите ли вы удалить именно эту запись?) Remove user's home directory (/home/joe)? у (Удалить домашний каталог пользователя (/home/joe)?) Removing user (joe): mailspool home passwd. (Удаление пользователя (joe)) Строка, стоящая под сообщением "Matching password entry" ("Запись с совпадающим паролем"), описывает базу данных, в которой хранится вся информация о пользователе, что приводит нас к следующей теме. Файлы /etc/pas swd и /etc/master, passwd Информация о пользователе хранится в файле, называемом /etc/passwd. В операционных системах разновидности UNIX имеется файл /etc/passwd, однако специфическая роль этого файла отличается от платформы к платформе. Для некоторых систем /etc/passwd является единственным местом хранения информации о пользователе (включая пароли). В этих случаях, чтобы добавить пользователя, вы должны добавить строку в файл с помощью текстового редактора. Однако во многих современных операционных системах используется структура "теневых паролей" — способ хранения зашифрованных строк паролей не в файле /etc/passwd, а в другом файле, который может прочитать только пользователь root. Имя файла будет отличаться от платформы к платформе. В некоторых системах это файл /etc/shadow, в других— /etc/security/master.passwd. В FreeBSD это файл /etc/master,passwd. Вам, как администратору FreeBSD, будут важны оба файла: /etc/passwd и /etc/ master.passwd. Эти файлы представляют собой простые текстовые базы данных, предусматривающие одну строку для каждого пользователя, в которой поля разграничиваются двоеточием (:). Файлы содержат имя пользователя, идентификационный номер пользователя, идентификационный номер основной группы, домашний каталог, оболочка регистрации (входа в систему) и полное имя (которое тоже включает поля, разделяемые запятыми, например, Office Location (Местонахождение офиса), Office Phone (Рабочий телефон) и Home Phone (Домашний телефон)). Полномочия в файле /etc/passwd заданы комбинацией 0644; в файле /etc/ master, pas swd полномочия определены комбинацией 0600, (Оба файла принадлежат пользователю root.) Схема безопасности означает, что любой пользователь может получить доступ к информации в файле /etc/passwd, но только пользователь root может просматривать файл /etc/master, pas swd, который отличается от файла /etc/passwd только тем, что содержит зашифрованные пароли пользователей во втором поле. Шифрование паролей в FreeBSD производится с помощью хеширо- ванной схемы, основанной на алгоритме MD5. Ниже показаны примеры каждого из файлов: /etc/passwd: joe:*:1008:1008:Joe User:/home/joe:/bin/csh /etc/master. passwd: joe:$l$32iknJXS$TnJUJj9LzYGwWRZonOu/I0:1008:1008:Joe User:/home/joe:/bin/csh
Системное администрирование Однако информация о пользователе хранится не только в этих двух файлах. Текстовые базы данных хорошо подходят для относительно небольшого количества пользователей, но по мере роста количества пользователей необходимость в более быстрой, поисковой базе данных, построенной на основе хеш-таблиц, будет становиться все более очевидной. В системе, насчитывающей тысячи пользователей, в линейной текстовой базе данных поиск информации о пользователе может занять довольно много времени — и это притом, что пользователь ожидает входа в систему! Вот почему в FreeBSD имеются файлы /etc/pwd.db и /etc/spwd.db. Эти файлы представляют собой хеш-таблицы формата db, соответствующие "незащищенному" файлу /etc/passwd и "защищенному" файлу /etc/master.passwd, соответственно. Кроме того, они имеют те же полномочия, что и их соответствующие файлы простого текста. Эти файлы обеспечивают работу механизма быстрого поиска в больших пользовательских базах данных, и они генерируются программой pwd_mkdb автоматически каждый раз, когда вы изменяете информацию о пользователе с помощью команд chfn, passwd или adduser/rmuser. Все программы, входящие в состав FreeBSD, а также множество приложений сторонних разработчиков получают информацию о пользователе из файла /etc/pwd.db. НА ЗАМЕТКУ Хеш-таблица (hash table) представляет собой программную конструкцию, в которой порция данных может быть найдена за короткий промежуток времени за счет перехода непосредственно к ее позиции в файле; эта позиция рассчитывается по известному алгоритму, а не путем линейного поиска. Например, вы можете бесконечно долго искать слово в словаре, начиная с первой страницы и просматривая каждое слово для нахождения соответствия; но, поскольку вам известен алгоритм под названием "алфавитный порядок", вы можете перейти прямо к тому месту в словаре, о котором вам известно, что в нем содержится нужное вам слово. Файлы хеш-таблиц, такие как /etc/pwd.db и поисковые базы данных, работают точно по такому же принципу — они просто должны храниться в специальном формате, который описывает алгоритм, необходимый для их поиска. Команда chfn ("change full name" — изменить полное имя) представляет собой инструментальное средство, которое служит для изменения информации о пользователе. Подобно команде edquota, которую мы рассматривали в прошлой главе, chfn работает посредством вызова редактора, определенного в вашей переменной окружения EDITOR (по умолчанию применяется редактор vi). После этого вы сможете изменить любое текстовое поле. После сохранения и выхода из редактора файл /etc/master .passwd будет переписан, а команда pwdjnkdb -p автоматически заново соберет остальные три файла. Важно понять, что файл /etc/master .passwd является "главным" файлом пользовательской базы данных. Любое изменение, произведенное в этом файле, распространяется и на файл /etc/passwd, и на хешированные базы данных при выполнении команды pwd__mkdb -p. Одним из примеров того, как это можно использовать с выгодой для себя, является ситуация, при которой вам нужно заново собрать список пользователей или перенести его с другой машины FreeBSD. Чтобы сделать это, вы можете просто поместить новый файл master .passwd в каталог /etc (или в любое другое место в разделе /), а затем выполнить следующую команду: # pwdjnkdb -р /etc/master.passwd.new
Пользователи, группы и полномочия Глава 13 461 В этом примере предполагается, что ваш новый файл пользовательской базы данных расположен в каталоге /etc под именем master .passwd. new. (Вы можете просто перезаписать файл master .passwd новым файлом с тем же именем, но в целях безопасности лучше хранить его отдельно до выполнения pwd_mkdb.) Файл /etc/master.passwd заменяется вашим новым файлом, а файлы /etc/pwd.db, /etc/ spwd.db и /etc/passwd собираются заново из него. Если в команде pwd_mkdb указать опцию -р, то будет сгенерирован новый файл /etc/passwd; если ее опустить, файл /etc/passwd останется неизмененным. Чтобы оба файла были синхронизированными, лучше использовать опцию -р. Файл /etc/group Группы обрабатываются точно так же, как и пользователи — с помощью текстовой базы данных в каталоге /etc. Однако поскольку группы обычно не имеют паролей, то специальная защита в файле /etc/group (эквивалент группы файла /etc/passwd) не нужна; достаточно сделать его доступным для записи только пользователем root. Ниже показан пример строки из файла /etc/group. Обратите внимание на то, что в ней содержится только четыре поля: имя группы, "фиктивное* поле (если пароли существуют, то они будут находиться здесь), идентификационный номер группы, а затем список пользователей в группе, разделяемых запятой: wheel:*:10:root, bob,frank Для /etc/group нет хешированной базы данных, поскольку к информации о файле обращения производятся гораздо чаще, чем к информации в /etc/passwd, и поскольку большинство систем имеют гораздо меньшее количество групп, нежели пользователей. Политика создания персональной группы для каждого отдельно взятого пользователя, практикуемая в FreeBSD, делает последнее утверждение спорным. В процессе будущих разработок могут появиться хеш-файлы для групп, если в этом возникнет необходимость. Управление группами Не заботясь о паролях, доступе пользователей и хеш-файле, добавить группу в систему гораздо проще, чем пользователя. Вы можете просто открыть файл /etc/ group в любом текстовом редакторе и создать новую строку в формате, перечисленном ранее (не забудьте, что нужно указать новую группу и идентификационный номер группы, которые еще не использовались). Обычно сначала дублируют строку существующей группы, а затем модифицируют поля имени и GID, добиваясь их уникальности. Новые группы добавляются автоматически с помощью сценария adduser, когда он создает уникальные группы для каждого отдельно взятого пользователя. Идентификационные номера групп обычно совпадают с соответствующими идентификационными номерами пользователей, но это не обязательно. Вас, скорее всего, будет интересовать только добавление групп масштаба всей системы — например, для таких задач, как запуск Web-сервера или сервера баз данных. Этим группам обычно должны присваиваться идентификационные номера в диапазоне от 100 до 1000. Номера выше 1000 обычно используются для уникальных групп, создаваемых для отдельно взятого пользователя, чтобы добиться совпадения с соответствующими идентификационными номерами пользователей, которые по умолчанию начи-
462 Системное администрирование Часть IV наются с 100L Номера до 100 отводятся для системных групп, которые являюта частью основной операционной системы, и вам не следует применять какие-то старые неиспользуемые номера, поскольку любому программному пакету, который вы инсталлируете позже, может понадобиться номер для своей собственной группы приложения. Чтобы добавить пользователя в группу, введите имя пользователя в четвертом поле. Если в этом поле уже есть какие-нибудь имена пользователей, разделяйте их запятыми, как было показано выше. Вы можете удалить пользователя очень просто- для этого нужно просто удалить его имя. Управление пользователями с помощью NIS Если ваша FreeBSD-машина подключена к сети предприятия или университета с централизованным управлением пользователей, то вполне вероятно, что будет доступен сервер NIS (Network Information Service — информационная служба сети). Эта служба (также известная, как YP, или Yellow Pages — "Желтые страницы") предлагает информацию о пользователях и группах любой подписавшейся машине, позволяя регистрировать пользователей UNIX по сети и управлять ими на одном центральном сервере. НА ЗАМЕТКУ Во многих современных сетях LDAP и Active Directory заменяют NIS в качестве стандартного метода для централизованного управления пользователями. Можно, пусть даже это и нелегко, присоединить FreeBSD-машину к сети Active Directory с помощью пакета Samba; эта процедура описана по адресу http://web.irtnog.org/howtos-orig/freebsd-winbind/view. Вы можете добавлять пользователей в вашу систему FreeBSD таким способом, чтобы они могли входить в систему, применяя установленные имена пользователей и паролей NISy а не заставлять их использовать локальные учетные записи в вашей системе с отдельно управляемыми паролями и пользовательской информацией. Чтобы сделать это, вы сначала должны зарегистрировать вашу машину в качестве клиента сервера NIS, добавив следующие две команды в файл /etc/rc.conf и указывая доменное имя вашей сети в переменной nisdomainname: nisdomainname="example. com" nis_client_enable="*ES" Затем потребуется или перезапустить компьютер, или запустить клиент домена NIS вручную с помощью следующей команды: # /etc/rc.d/nisdomain start Setting NIS domain: example.com. Чтобы узнать, нашла ли ваша система сервер NIS, выдайте команду ypwhich: # ypwhich olympus.example.com Если ypwhich вернет правильное имя сервера NIS вашей сети, вы сможете спокойно добавлять пользователей NIS.
Пользователи, группы и полномочия Глава 13 463 Отредактируйте файл /etc/master.passwdB текстовом редакторе и добавьте строку для каждого пользователя NIS, ставя знак + перед именем пользователя и оставляя пустыми всем поля, кроме последних двух; +fred::::::::/home/fred:/bin/csh Сохраните этот файл и выполните команду pwd_mkdb -p /etc/master .passwd, чтобы заново собрать хешированные базы данных. Теперь с помощью команды finger проверьте, правильно ли был добавлен пользователь: # finger fred Login: fred Name: Fred Hudson Directory: /home/fred Shell: /bin/csh Never logged in. No Mail. No Plan. Регистрационное имя: fred Имя: Fred Hudson Домашний каталог: /home/fred Оболочка: /bin/csh Никогда не регистрировался. Почта отсутствует. План отсутствует. Если команда finger вернет корректную информацию о пользователе, то только что добавленный пользователь должен будет иметь возможность входить в вашу систему FreeBSD с помощью своего имени пользователя и пароля NIS. UID и GID пользователя наследуются от сервера NIS, а все файлы, создаваемые пользователем, будут принадлежать этой комбинации UID/GID, а не какому-тоо идентификационному номеру из схемы нумерации локальной системы. СОВЕТ Если пользователь NIS попытается изменить свой пароль с помощью команды passwd на FreeBSD-машине, то измененный пароль будет передан обратно в систему NIS, чтобы его можно было обновить на центральном сервере. Удаление пользователя NIS выполняется с помощью той же процедуры, что и удаление обычного пользователя: вы применяете команду rmuser и указываете обычное имя пользователя, не ставя знак +, показывающий, что это учетная запись NIS: # rmuser fred Matching password entry: (Запись с совпадающим паролем) fred:*:20441:101: :0:0:Fred Hudson:/home/fred:/bin/csh Is this the entry you wish to remove? у (Хотите ли вы удалить эту запись?) Remove user's home directory (/home/fred)? у (Удалить домашний каталог пользователя (/home/fred)?) Removing user (fred) : mail spool home passwd. (Удаление пользователя (fred)) Обратите внимание, что запись с совпадающим паролем унаследована от сервера NIS, а не от фиктивной записи из вашего собственного файла master.passwd. Теперь пользователь больше не является частью вашей системы, однако он по-прежнему остается зарегистрированным в центральной базе данных NIS.
ГЛАВА 14 Конфигурация системы и сценарии запуска В этой главе... • Процесс запуска FreeBSD • Сценарии конфигурации ресурсов • Демон inetd и конфигурационный файл inetd. conf • Системный регистратор (syslogd) и файл syslog.conf • Замечания касательно файла /etc/rc. local
466 Системное администрирование Часть IV Процесс запуска системы FreeBSD вкратце рассматривался в главе 4. В настоящей главе мы разберемся с тем, что происходит за кулисами каждой загадочной фазы запуска; эти вопросы будут рассмотрены достаточно подробно, чтобы после их рассмотрения вы могли загружать систему в стандартных условиях. Эта глава продолжает уже затронутую тему, и после ее прочтения вы сможете полностью понять, что происходит во время каждой фазы запуска системы, и как производится ее управление. Вы могли перейти к FreeBSD, имея опыт работы в Linux; если это так, то вам будут знакомы механизмы процедуры запуска системы, работающие в семействе UNIX. Однако в процессе запуска FreeBSD существуют такие стороны, которые могут оказаться незнакомыми даже для ветеранов. Например, здесь вы не встретите удобного индикатора хода выполнения программы f sck или аккуратно сформатированных флажков для каждого запущенного компонента, которые доступны в некоторых дистрибутивах Linux, а диспетчер загрузки FreeBSD работает несколько иначе, чем GRUB и LILO (загрузчики операционной системы, широко используемые в Linux). В FreeBSD нет также множества выбираемых уровней запуска (run level), как в Linux и Solaris (эти системы могут работать в одном из нескольких различных режимов, характеризуемых большим или меньшим количеством выполняемых служб; это бывает необходимо для выполнения административных задач или задач, связанных с поиском и устранением неполадок). Поскольку модель запуска FreeBSD проще и непосредственнее, чем модели других систем, ее легче понять и обслуживать, хотя и у нее есть свои "подводные камни" и сложности, отсутствующие на остальных плат- формах. Однако даже после краткого изучения вы сможете полностью проанализировать весь процесс запуска FreeBSD и взять его под свой контроль. Процесс запуска FreeBSD В процессе загрузки (запуска) системы FreeBSD сначала определяется местоположение ядра системы внутри его раздела BSD и секции на вашем жестком диске, после чего ядро запускается таким образом, чтобы активизировать все оборудование и сделать систему доступной для пользователей. Сделать все это гораздо труднее, чем может показаться — эта процедура отнюдь не проста. Вследствие особенностей работы оборудования на ПК, а также поскольку разделы загрузочного жесткого диска управляются BIOS (Basic Input/Output System — базовая система ввода-вывода), хранящейся в микросхеме на материнской плате, FreeBSD должна запускать саму себя в несколько этапов — каждый этап имеет очень ограниченную функцию и область действия, и выполняет один ключевой шаг, прежде чем управление будет передано следующей стадии. Как будет сказано в главе 20, жесткий диск разбивается на разделы (на которые в контексте FreeBSD ссылаются как на "секции"); BIOS может искать главную загрузочную запись (Master Boot Record — MBR) только в одном из этих разделов, а не во вторичной схеме разбиения, известной как "разделы BSD" (в них расположено ядро FreeBSD). BIOS не может обращаться к ядру напрямую и не знает о том, как его запустить, даже если бы она и могла обратиться — между ними существует несколько уровней чрезвычайно сложных схем адресации. Это означает, что на каждом уровне архитектуры, в соответствии с устаревшими стандартами оборудования для ПК, должен существовать загрузочный блок FreeBSD — небольшая порция исполняемого кода, которая умеет "заглядывать" на один уровень вглубь процесса загрузки, может понять архитектуру следующего этапа и узнать, как запускается следующий загрузочный
Конфигурация системы и сценарии запуска Глава 14 467 блок. Этот процесс продолжается поэтапно до тех пор, пока, наконец, ядро не будет найдено и запущено. Скорее всего, вам никогда не придется копаться в деталях работы этих этапов загрузки, однако знать эти этапы будет не лишним, особенно если вы попытаетесь найти причину возникшей проблемы! Когда вы включаете питание компьютера, FreeBSD первым делом начинает проверять оборудование и смотрит, определено ли оно в конфигурации BIOS и CMOS. Эта часть процесса запуска полностью зависит от конфигурации вашего оборудования. В этот момент проверяется оперативная память, активизируются и тестируются любые существующие контроллеры SCSI, а вам предоставляется возможность переконфигурировать вашу BIOS. На этом этапе не делается ничего, что связано с FreeBSD — все выглядит одинаково, какая бы операционная система (ОС) не была установлена на жестком диске — FreeBSD, Windows или вообще никакой. Прохождение процесса загрузки После того как BIOS отобразит таблицу, содержащую собранные сведения об оборудовании, она приступает к чтению главной загрузочной записи (MBR) первичного диска, а в ней — первого и наиболее рудиментарного блока загрузки. Поиск и запуск загрузчика (loader) производится в этом и двух последующих блоках загрузки; загрузчик конфигурирует и загружает ядро. Каждый загрузочный блок постепенно становится сложнее предыдущего блока. Первые два блока ограничены 512 байтами (стандартные размеры MBR и загрузочного сектора данной секции), поэтому они являются очень простыми. Ниже перечислены все блоки загрузки и описаны их функции. • Загрузочный блок 0 (bootO). Это предварительный загрузочный блок, кото рый, подобно LILO, расположен в MBR. Если инсталлирован диспетчер загрузки FreeBSD, то в этом блоке перечисляются доступные секции (секция указывается после соответствующей ей функциональной клавиши), из которых вы можете выбрать требуемый вариант загрузки: Fl FreeBSD F2 Linux F3 ?? Default: Fl Вы можете нажать соответствующую функциональную клавишу, чтобы выбрать требуемую секцию, или просто подождать несколько секунд, по истечении которых загрузочный блок выберет вариант по умолчанию (Default) и работа будет продолжена. • Загрузочный блок 1 (bootl). Это очень простая программа, которая запускается из загрузочного сектора секции, выбранной вами в блоке boot 0. Его работа заключается в том, чтобы использовать сокращенную версию disklabel — про граммы, которая разбивает секцию на разделы типа BSD (об этом мы поговорим подробно в главе 20), чтобы найти и запустить блок boot2 в соответствующем разделе BSD. Блок bootl не имеет пользовательского интерфейса. • Загрузочный блок 2 (boot2). Наконец, мы достигли загрузочного блока, который имеет достаточно места, чтобы он мог читать файлы в загружаемо ф ° ловой системе. В ранних версиях FreeBSD этот загрузочный блок ри еня для того, чтобы предоставить вам приглашение, а вы могли сказать ем , от ку а можно загрузить ядро, если его местонахождение отличается от мест хож дения по умолчанию в корневом разделе. Теперь он автоматически запускает
I 777 I Системное администрирование I 468 I Чаг.тк1У программу, называемую загрузчиком, благодаря которой вы получаете возможность управлять опциями ядра в полноэкранном текстовом меню. • Загрузчик. Вы можете найти эту программу в каталоге /boot — для поиска загрузчика к этому каталогу обращается и блок boot2. Загрузчик читает конфигурационные файлы /boot/defaults/loader, conf и /boot/loader, conf и загружает указанное здесь ядро и модули. (Файл /boot/loader.conf содержит замены для файла /boot/defaults/loader.conf, подобно тому, как работает файл /etc/rc. conf, который мы рассмотрим далее в этой главе.) На рис. 4.1 в главе 4 можно посмотреть доступные опции меню в загрузчике. В течение 10 секунд загрузчик ожидает, что вы нажмете клавишу и выберете опцию загрузки; если вы ничего не сделаете, он загрузит ядро в режиме, выбранном по умолчанию, при котором все драйверы и функции останутся нетронутыми. Однако вы можете воспользоваться некоторыми другими доступными опциями меню, которые позволяют более детально управлять поведением загрузчика вашего ядра. С помощью опций меню вы можете выполнить загрузку в режиме Safe Mode (Безопасный режим) (с ограниченным ядром, в котором нет многих потенциально конфликтующих драйверов) или в однопользовательском режиме. Если выбрать опцию 6, Escape to Loader Prompt (Перейти к приглашению загрузчика), вы сможете взаимодействовать с загрузчиком в среде командной строки, которая обеспечивает еще большую гибкость. В приглашении загрузчика вы можете загрузить другую версию ядра, загрузиться с CD- или DVD-диска, загрузить и выгрузить модули ядра вручную, посмотреть содержимое файлов или выполнить некоторые другие задачи (выполните команду man loader, чтобы узнать об этом более подробно). Чаще всего вы будете загружать компьютер в конфигурации, определенной по умолчанию, поэтому на этапе загрузки вам не нужно будет даже прикасаться к клавиатуре; компьютер загрузится автоматически без какого-либо взаимодействия с пользователем. Однако давайте предположим, что вместо того чтобы ждать, пока система полностью загрузится, вы хотите загрузить некоторый модуль ядра (/boot/kernel/ portal. ко) на этапе загрузки. Кроме того, вы хотите посмотреть, какие модули ядра загружены на данный момент. Вы можете выполнить эти действия в строке приглашения загрузчика на ввод команды, как показано ниже: ok load portal.ko /modules/portal.ко text=0xldl8 data=0xlf4+0x4 syms=[0x4+0x8d0+0x4+0x6bf] ok lsmod 0x100000: kernel (elf kernel, 0x355be4) 0x455be4: /boot/kernel.conf (userconfig script, 0x4c) 0x456000: portal.ко (elf module, ОхЗеЬО) Введя знак вопроса ? в строке приглашения, вы получите список доступных команд. Только что вы видели команду load, которая загружает модули в ядро, и команду lsmod, которая выводит список загруженных на данный момент модулей. Эта команда может оказаться чрезвычайно полезной при поиске и устранении неполадок, или если вы используете модули ядра, которые необходимо загружать в определенном порядке. Выполнив команду man loader, вы сможете узнать, какие опции доступны в командной строке загрузчика. На этом завершается фаза загрузочного блока процесса начальной загрузки. FreeBSD успешно выполнила каждую порцию кода, подойдя к загружаемому ядру, и
Конфигурация системы и сценарии запуска Глава 14 469 в заключительной фазе процесса загрузки вступает в игру уже вся система FreeBSD. В этот момент ядро загружает себя в память, зондирует свои доступные устройства и запускает сценарии конфигурации ресурсов, которые формируют рабочую среду и запускают различные системные службы. Остальные этапы включают в себя следующее: 1. После того как загрузчик передаст управление ядру, оно начнет зондировать эсе обнаруженные устройства, и результаты каждого зондирования будут отображаться прямо на экране. Именно в это время на экран выводится множество загадочных сообщений, заполняющих его ярким белым цветом. Эти строки заносятся в буфер сообщений ядра, который вы можете прочитать с помощью команды dmesg, если вам будет необходимо посмотреть, что сообщило ядро об определенном устройстве. 2. После того как ядро будет загружено, управление передается процессу in it — завершающему этапу процедуры запуска. Это действие подтверждается сообщением Automatic reboot in progress (Производится автоматическая перезагрузка), и процесс init запускает глобальный сценарий конфигурации ресурсов (/etc/rc). Этот сценарий сначала использует программу f sck для проверки на непротиворечивость всех устройств файловой системы в файле /etc/f stab, о чем говорилось в главе 12. 3. Если программа f sck не обнаруживает никаких проблем, которые она не может исправить самостоятельно, она смонтирует все файловые системы (с помощью команды mount -a -t nonf s) и продолжит выполнение остальных процессов запуска. Если f sck обнаруживает неразрешимую проблему с дисками, она выйдет в однопользовательский режим, чтобы вы вручную запустили программу f sck и устранили неисправность. (Вам нужно будет выполнить команду /sbin/ mount -а, чтобы смонтировать ваши файловые системы в режиме чтения и записи, если вам нужно произвести изменения в каких-либо файлах.) Выйдите из однопользовательской оболочки, чтобы продолжить перезагрузку в многопользовательском режиме. Наконец, если все пройдет нормально, вы получите приглашение на вход, и система будет готова к работе. Весь этот процесс обычно занимает не больше минуты времени. Безопасность процесса загрузки Администратора, осознающего важность вопросов безопасности, беспокоит тот факт, что, по умолчанию, если вы выберете вариант загрузки в однопользовательском режиме (опция 4 в меню загрузчика, или команда boot -s в приглашении загрузчика на ввод команды), вам не будет предложено вводить пароль, и система автоматически предоставит вам доступ с полномочиями суперпользователя (пользователя root). Если на вашем компьютере работает кто-то еще, то этот человек может сесть за компьютер и, если захочет, физически перезагрузить его — вот вам и брешь в подсистеме безопасности! К счастью, эту брешь можно очень легко заделать. В каталоге /etc/ttys, который содержит терминальные параметры настройки для различных способов доступа (консоль, виртуальные терминалы, последовательные терминалы и сетевые (псевдо-) терминалы), вы можете изменить строку console с secure на insecure: console none unknown off insecure
470 Системное администрирование Часть IV Теперь система будет воспринимать консоль как незащищенную точку доступа и усложнит жизнь (за счет приглашения на вход) каждому, кто попытается загрузить систему в однопользовательском режиме. Чтобы обойти этот защитный редут, потребуется ввести пароль пользователя root. НА ЗАМЕТКУ Терминальный метод console применяется только в однопользовательском режиме. Когда вы загружаетесь в полном многопользовательском режиме, то множество виртуальных терминалов оказываются доступными на физическом терминале (вы можете переключаться между ними с помощью сочетаний клавиш <Alt+F1>, <Alt+F2> и так далее). Эти терминалы всегда присутствуют в приглашении на вход. Параметры настройки secure и insecure в данном случае определяют, можете ли вы войти в систему как пользователь root, или нужно ли вам входить в систему как обычному пользователю, а затем применять команду su для получения доступа на уровне суперпользователя. Если другие пользователи имеют доступ к физическому терминалу (даже если вы защитили однопользовательскую консоль), вы получаете еще одну брешь в подсистеме безопасности. Она возникает из-за того, что нажатие комбинации <Ctrl+Alt+Delete> приводит к перезагрузке системы, независимо от того, входили ли вы в нее как пользователь root, и входили ли вообще, Трехклавишная комбинация работает даже когда отображается приглашение на вход. Разрешать подобный доступ уместно в некоторых ситуациях (например, если смонтированный на стойке сервер находится в надежно охраняемой машинной комнате) и не уместно в других. Чтобы отключить эту возможность, вам нужно добавить опцию в конфигурацию ядра и заново собрать ядро: options SC_DISABLE_REBOOT Кроме того, чтобы обезопасить среду операционной системы вашего компьютера, работающего под управлением FreeBSD, нужно сделать так, чтобы его нельзя было загружать с любого устройства, отличного от первичного жесткого диска (например, необходимо запретить загрузку с компакт-диска или с внешнего жесткого диска), a BIOS защитить паролем. Естественно, если неавторизованные лица имеют физический доступ к машине, вы не сможете полностью защитить ее; лучшей политикой является гарантия защиты операционной среды от любого несанкционированного доступа. Детальное обсуждение опций ядра и конфигурирования ядра можно найти в главе 18. Что может замедлить процесс загрузки? После того как вы покинете меню загрузчика, должно пройти не более минуты времени, прежде чем вы увидите приглашение на вход, сигнализирующее о завершении процесса загрузки. Обычно не бывает причин, по которым на это потребовалось бы больше времени, однако всегда есть вероятность того, что что-то пойдет не так, и это нужно будет исправить. Поскольку процесс загрузки зависит от последовательного выполнения сценариев, а на экран во время запуска выводится множество подробных консольных сообщений, можно без труда узнать, где прячется неприятность. Двумя известными "нарушителями" являются Sendmail и httpd (Apache); в их случае замедление процесса загрузки может быть вызвано проблемами связности в сети или ошибочной конфигурацией.
Конфигурация системы и сценарии запуска I „. I Глава 14 I I Sendmail и Apache должны знать имя хоста вашей машины. Для этой цели им нужно выполнить обратный поиск в сервере доменных имен (domain name server— DNS), сконфигурированном в файле /etc/resolv.conf. (Вопросы настройки TCP/IP будут подробно рассматриваться в главе 23.) Прежде чем поиск будет завершен и можно будет продолжить процесс запуска системы, нужно приостановить каждый сконфигурированный сервер имен. Простои (тайм-ауты) в сети часто длятся очень долго, поэтому работа в сети наиболее часто является причиной зависаний при загрузке. Решение этой проблемы заключается в том, чтобы убедиться, что к серверу имен, указанному первым в файле /etc/resolv.conf, есть доступ с вашего FreeBSD-ком- пьютера. Благодаря этому Sendmail и Apache смогут определить имя хоста компьютера и начать работу без задержки. Если такая конфигурация невозможна, зарегистрируйте 127.0.0.1 (localhost)B качестве первого сервера имен и отключите остальные. Между прочим, в связи с этой потенциальной задержкой в работе процесс init использует тип монтирования nonf s (команда mount -a -t nonf s) при выполнении своих первоначальных операций по "наведению порядка", чтобы посмотреть, можно ли безопасно перейти в многопользовательский режим. Операционная система NFS (Network Filesystem — сетевая операционная система) имеет чересчур продолжительный период простоя, и процесс, ожидающий окончания этого простоя, практически нельзя уничтожить. Опция nonf s команды mount, которую мы рассматривали в главе 12, не разрешает монтировать ресурсы NFS до тех пор, пока не наступит последняя фаза — фаза конфигурирования ресурсов, для того чтобы она могла нормально перейти в многопользовательский режим без вмешательства пользователя. Однако после этого процесс init монтирует все файловые системы в каталог /etc/re, включач файловые системы NFS. Любые ресурсы NFS, которые вы сконфигурировали для автоматического монтирования в файле /etc/fstab (например, без опции noa\:to)> могут на долгое время "заморозить" систему, когда сценарий /etc/rс достигнет этой точки. Таким образом, во время загрузки не следует автоматически монтировать ресурсы NFS, если только вы не уверены, что они всегда будут доступными для вашего компьютера по сети! Сценарии конфигурации ресурсов После того как процесс init начнет свою работу, остальные задачи запуска в системе — те, которые начинают выполнение всех служб и процессов операционной системы — перекладываются на плечи сценариев конфигурации ресурсов (resource configuration). Эти сценарии делятся по выполняемым ими функциям, и все они храня ся в каталоге /etc/rс. d. Каталог/etc/rc.d Все сценарии конфигурации ресурсов в современных версиях FreeBSD хранятся в каталоге /etc/red. Каждая программа оболочки в этом каталоге является сценарием конфигурации ресурсов — программой, которая запускает определенный комп - нент FreeBSD в соответствии с конфигурацией системы. Некоторые из этих сценари ев вызываются в рекурсивном порядке из других программ; некоторые из них ничего не делают в изначальной конфигурации; а некоторые, написанные специально для необычных конфигураций и развертываний, могут вообще никогда не выполняться в
I -„ I Системное администрирование 1 Z I Часть IV —— вашей системе. Все исполняемые файлы в этом каталоге запускаются автоматически процессом init и управляются через главный сценарий /etc/rc. Скорее всего, вам никогда не придется редактировать какие-либо сценарии в каталоге /etc/rc.d — все они предназначены для выполнения черновой работы по запуску некоторых инфраструктурных служб или демонов; необходимую для них информацию о конфигурации они получают из других источников, например из файла /etc/rc.conf. Все, что вам когда-нибудь придется модифицировать — это конфигурационные файлы, а не сами сценарии. СОВЕТ Вы можете написать свои собственные сценарии конфигурации ресурсов для обработки служб или компонентов, которые не являются частью стандартной системы FreeBSD; если их поместить в каталог /etc/red, они будут работать, но лучше всего поместить их в каталог /usr/local/ etc. re. d — "локальный" эквивалент каталога /etc/rc. d (другими словами, каталог, который предназначен для сценариев конфигурации ресурсов, установленных вами лично). Сценарии из каталога /usr/iocal/etc/rc. d, такие как сценарии запуска, инсталлированные вместе со многими программными пакетами сторонних разработчиков, выполняются автоматически после запуска всех сценариев в каталоге /etc/red. Если хранить их отдельно от сценариев из каталога /etc/red, это позволит упростить процесс восстановления системы и поможет аккуратно перенести конфигурацию вашей системы на новый компьютер, если в этом возникнет необходимость. Утилита под названием reorder используется сценарием /etc/rc для того, чтобы определить особый порядок выполнения сценариев конфигурации ресурсов. Чтобы посмотреть порядок, в соответствии с которым они будут выполняться, введите команду rcorder/etc/rc.d/* (эта команда выводит файлы в порядке выполнения, определяемом ключевыми словами, и сценарии с предварительными условиями, перечисленные в заголовках каждого файла). Сценарии без предварительных условий обрабатываются первыми; за ними следуют сценарии, которые зависят от первичных сценариев, уже запущенных. Посмотрите на строки PROVIDE, REQUIRE и KEYWORD в каждом сценарии; выполните команду man reorder, чтобы посмотреть более подробное описание их работы, и команду man re, чтобы узнать, как утилита reorder используется для сортировки файлов конфигурации ресурсов FreeBSD, В табл. 14.1 перечислены многие из наиболее важных файлов конфигурации ресурсов в системах серии FreeBSD 6.x. НА ЗАМЕТКУ До выхода версии 5.0, FreeBSD хранила свои файлы конфигурации ресурсов в каталоге /etc, каждый из которых имел приставку гс. Если вы работаете с одной из первых версий FreeBSD серии 5.x, в которой файлы не могут быть полностью перенесены в новую структуру из младшей версии серии 4.x, вы можете использовать структуру старого стиля. В файле /etc/rc. conf уберите опцию rc_ng (RC Next-Generation), в результате чего FreeBSD будет использовать файлы /etc/rc. * вместо файлов /etc/red/*, чтобы контролировать процедуру своего запуска. Это делается следующим образом: гс_пд="ЫОи # Set to YES to enable new-style re. Experimental. # Установите в YES, чтобы разрешить гс нового стиля. Экспериментальная. Этот способ может облегчить переход к FreeBSD 5.x или 6.x, если вы хотите избежать дестабилизации вследствие новой структуры сценария запуска. А вот в новой установке отключать опцию rejig нет смысла, поэтому в версии FreeBSD 5.2 и последующих версиях этой опции не существует.
Конфигурация системы и сценарии запуска Глава 14 473 Таблица 14.1. Сценарии конфигурации ресурсов Имя сценария Описание /etc/rc /etc/rc.subr /etc/defaults/rc,conf /etc/rc.conf /etc/red /usr/local/etc/rc. d Главный сценарий конфигурации ресурсов, который читает параметры конфигурации из файла /etc/rc.conf, а затем выполняет сценарии в /etc/red. Включенный сценарий, который описывает подпрограммы, используемые во многих сценариях, расположенных в /etc/red. Процесс init считывает этот файл во время своего выполнения, чтобы заполнить свой список требующих выполнения задач. Этот файл вы редактируете, чтобы заменить параметры по умолчанию, установленные в файле /etc/defaults/rc.conf. Вы можете редактировать только этот файл конфигурации ресурсов в /etc! Resource Configuration for Daemons (Конфигурация ресурсов для демонов). Несколько десятков сценариев запуска в этом каталоге выполняются в том порядке, который определен в утилите reorder. Большинство функций этих сценариев можно легко определить исходя из их имен; f sck запускает проверку диска, named запускает сервер имен, usbd активирует подсистему USB и так далее. Деревья каталогов /usr/local/xilR6/etc.d/, в которых содержатся любые написанные вами новые сценарии запуска (или инсталлируемые автоматически, когда вы будете добавлять программы сторонних разработчиков). Файл /etc/defaults/rc.conf Сценарии конфигурации ресурсов управляются глобальными системными параметрами настройки, определенными в одном из двух мест: или в файле /etc/defaults/ re.conf, или в файле /etc/rс.conf. Первый из них является частью системы и не должен изменяться; второй является файлом глобальной конфигурации, который вы можете редактировать. Параметры настройки последнего файла управляют всеми изменениями в поведении системы, начиная с того, как она работает в конфигурации по умолчанию. Давайте посмотрим на некоторые сценарии конфигурации ресурсов (например, /etc/ red/named) в текстовом редакторе. Вы увидите, что каждый из них является полностью автоматическим; в процессе своей работы он проверяет, определены ли некоторые переменные, управляющие конфигурацией системы, или существуют ли некоторые файлы. Если эти переменные или файлы существуют, он выполняет предварительно определенный, абстрагированный цикл запуска, который принимает свои параметры от этих переменных и файлов. Ни в самом сценарии /etc/rc, ни в каких-либо стандартных сценариях ничего не нужно редактировать. В других операционных системах процесс запуска системы изменяется и расширяется путем внесения изменений в сами сценарии конфигурации ресурсов, а вот в FreeBSD модель заключается в том, чтобы автоматизировать и абстрагировать как можно большую часть процесса и централизовать файлы управления, определяющие параметры. В первых версиях FreeBSD единственным конфигурационным файлом был /etc/ re.conf. В нем содержались все переменные, которые могли понадобиться сценарию /etc/rc и связанным с ним сценариям для их состояний по умолчанию, а лю-
474 Системное администрирование Часть IV бые модификации в системе могли быть произведены в глобальном конфигурационном файле. Однако такая расстановка быстро становилась неуправляемой по мере роста списка доступных переменных и расширения роли файла. Администратору, обновляющему систему, нужно было кропотливо объединить старый файл г с. con f с новым файлом — все-таки, сделать это гораздо труднее, чем просто отредактировать etc/rc. Таким образом, решение заключалось в том, чтобы создать каталог /etc/defaults и поместить в него копию файла rc.conf, содержащего все параметры настройки, используемые по умолчанию. Файл /etc/rc.conf до сих пор существует, но в качестве замены, чье содержимое (если оно существует) будет превосходить по важности параметры настройки в файле /etc/defaults/rc.conf. Например, если в файле /etc/defaults/rc.conf появился параметр named_enable="NO", вы можете включить сервер named, не изменяя этого файла, добавив параметр named_enable="YES" в файл /etc/rc.conf. Последний параметр настройки заменяет параметр настройки по умолчанию из предыдущего файла. FreeBSD запустится даже с пустым файлом /etc/rc. conf, однако используемые вами типичные замены будут направлены на сетевую конфигурацию (IP-адрес, имя хоста, адрес шлюза и так далее) и запуск демонов вроде Sendmail и sshd. В листинге 14.1 показан типичный блок из файла /etc/defaults/rc.conf. Листинг 14.1. Фрагмент файла /etc/defaults/rc.conf # named можно запустить в "песочнице"; выполните команду man security, # чтобы получить подробную информацию # named_enable="NO" # Запуск named, сервера DNS (или N0) . named_program="/usr/sbin/named" # путь к named, если вам нужно указать другой. named_flags-"-u bind" # Флаги для named named_pidfile="/var/run/named/pid" # Это нужно установить и в файле named.conf named_chrootdir="/var/named" # Каталог chroot (или "", чтобы не выполнять chroot) named_chroot_autoupdate="YES" # Автоматическая инсталляция/обновление # chroot-компонентов named. См. /etc/rc.d/named. named_symlink_enable="YES" # Символическая ссылка chroot-файла pid С помощью файла /etc/defaults/rc.conf вы можете узнать, что будет делать сценарий /etc/rc по умолчанию, когда он приступит к каждой службе со сценарием запуска в файле /etc/red. В случае named он вообще не запускается по умолчанию. Как правило, переменные в файле /etc/defaults/rc.conf группируются по блокам, как в этом примере, где подобные префиксы связывают их, а единственная переменная "YES"/"NO" служит в качестве "главного переключателя** в самом начале блока. Если переменной присваивается значение "NO", то, как правило, ни одна из оставшихся переменных не будет играть никакой роли; если переменная будет иметь значение "YES", то будут применены все переменные, кроме закомментированных, Закомментированные строки обычно используются в качестве примеров, показывающих возможный альтернативный вариант использования. Взгляните на следующие строки из блока syslog: syslogd_flags-"-s" # Флаги для syslogd (если он включен). #syslogd_flags="-ss" # Флаги syslogd не для привязки к сокету inet
Конфигурация системы и сценарии запуска 475 Глава 14 Файл /etc/rc.conf Предположим, что вы хотите запустить named. В самом простом случае вам нужно будет всего лишь отредактировать файл /etc/rc.conf (файл "переопределений") и где-нибудь в файле добавить следующую строку: named_enable="YES" Оставшиеся переменные named * в файле /etc/defaults/rc.conf не нужно копировать в файл замен. Помните, что каждая переменная в файле "параметров по умолчанию" загружается в память процессом init, и они вступают в игру только в том случае, если "главному переключателю" данного блока присвоено значение "YESU. В данном случае переменные, определенные по умолчанию, будут использоваться в цикле выполнения в соответствующем сценарии в каталоге /etc/red, чтобы запустить любой процесс, управляемый блоком, над которым вы работаете (в данном случае это named). ВНИМАНИЕ! Раз уж вы взялись за /etc/rc.conf, сохраните резервную копию на жестком диске, чтобы вы могли без труда вернуться к нормально работающей конфигурации системы. Создайте резервный файл, просто скопировав существующий файл, прежде чем начать изменять его (в данном примере имя файла содержит текущую дату, поэтому вы сможете аккуратно проследить свои шаги): # ср /etc/rc.conf /etc/rc.conf.backup.20060127 Чтобы восстановить резервную версию, скопируйте или переместите (переименуйте) файл обратно с его исходным именем: # mv /etc/rc.conf.backup.20060127 /etc/rc.conf Как вариант, всякий раз, когда вы будете изменять строку в файле /etc/rc.conf, скопируйте строку и закомментируйте старый, неизмененный вариант строки. Так вы сможете всегда вер* нуться к исходным параметрам, если новые не будут работать. Вы можете использовать и другие переменные для тонкой настройки, и с легкостью заменять их. Допустим, что программой вашего сервера имен является специализированная версия с именем mynamed. Кроме того, предположим, что вы создали пользователя и группу bind с той целью, чтобы сервер имен работал для этого пользователя и группы, и чтобы защитить его от множества уязвимостей, связанных с полномочиями. Чтобы сделать это, вам нужно всего лишь (предполагая, что mynamed имеет то же поведение и те же опции командной строки, что и named) добавить в файл /etc/rc.conf следующие две строки: named_program="mynamed" named_fiags=s"-u bind -g bind" Просто ради любопытства вы можете попробовать выполнить соответствующий сценарий запуска, чтобы посмотреть, что делает с этими переменными процесс init. Сценарий не будет выполнен до тех пор, пока соответствующая переменная enable не получит значение "YES"; если предположить, что вы разрешили службу, включив эту переменную, вы можете просмотреть сценарий запуска (в данном случае это /etc/red/named), чтобы узнать, что включено в процесс запуска для данной службы.
476 Системное администрирование Часть IV В конце этого сценария имеются следующие строки: load_rc_config $name # Следующая переменная требует, чтобы сначала был загружен rc.conf # required_dirs="$named_chrootdir" # если установлено, то должно существовать pidfile="${named_pidfile:-/var/run/${name}/pid}" run_rc_command "$1" Команды в этих строках представляют определенные в /etc/rc.subr подпрограммы, устанавливающие архитектуру, посредством которой имя службы отображается как имя соответствующего сценария запуска. Например, сценарий re. subr уже подтвердил, что значение named было присвоено переменной $name, поэтому первая строка этого кода означает, что будет выполняться команда load_rc_conf ig named Эта подпрограмма просто загружает параметры из файла /etc/rc.conf. Затем переменной required_dirs присваивается такое значение, которое определено в переменной named_chrootdir, независимо от того, установили ли вы ее непосредственно в файле /etc/rc. conf или позволили использовать параметр по умолчанию в /etc/ defaults/rc.conf. После этого другая переменная, pidf ile (файл отслеживает идентификатор процесса для службы во время его выполнения), получает либо значение namedpidf ile, если вы определили его, либо значение /var/run/named/pid, В самом конце вызывается подпрограмма run__rc_coiranand со стандартизированным аргументом start, заменяя переменную $1. Если вы проверите файл /etc/rc.subr и посмотрите на определение подпрограммы run_rс command, то увидите, что она использует стандартизированные переменные required_dirs и pidf ile в своем цикле, который, в конечном счете, вызывает демон named. В этой запутанной абстракции вам будет сложно разобраться, если вы не знакомы с трассировкой вложенных программ оболочки; тем не менее, как только вы поймете принцип передачи стандартизированных переменных и их применение для запуска каждого сконфигурированного демона, вы сразу же увидите, в чем состоят преимущества для FreeBSD — система может добавлять новые службы и конфигурировать их в одном приготовленном месте. НА ЗАМЕТКУ В главе 10 содержится руководство по написанию сценариев для оболочки, которое поможет вам в чтении сценариев конфигурации ресурсов. Наиболее типичными переменными, которые могут появиться в файле /etc/ re. conf, являются параметры конфигурации TCP/IP. Поскольку они отличаются от системы к системе, FreeBSD не может определить их по умолчанию. В листинге 14.2 показан типичный файл /etc/rc.conf сразу после установки новой FreeBSD (ваша установка будет отличаться, возможно, даже очень сильно). Листинг 14.2. Файл /etc/rc.conf сразу после установки # — sysinstall generated deltas — # Sat Oct 7 02:17:22 2006 # Created: Sat Oct 7 02:17:22 2006 # Создан: Сб Окт 23 02:17:22 2006 # Enable network daemons for user convenience. # Включите сетевые демоны для удобства пользователей.
Конфигурация системы и сценарии запуска | "7 " Глава 14 I I Please make all changes to this file, not to /etc/defaults/rc.conf. # Пожалуйста, изменяйте этот файл, а не файл /etc/defaults/rcconf, # This file now contains just the overrides from /etc/defaults/rc.conf. # Этот файл теперъ содержит только переопределения из /etc/defaults/r?o.conf\ linux_enable="YES" sendmail_enable-"YES" sshd_enable="YES" рогЬпар_епаЫе-"Ж)и nfs_server_enable:s=',NOM inetd_enable=wNO" ifconfig_fxpO*,finet 64.41.131.10 netmask 255.255.255.0" defaultrouter="64.41.131.1" hostname="simba. somewhere, com" usbd enable="YES" Все эти переменные были записаны программой Sysinstall во время вашей первой инсталляции системы, а настройки "YES" и "NO" отражают ответы, введенные вами после инсталляции на серию вопросов в разделе конфигурации (см. главу 2). Некоторые из этих переменных повторяют настройки в файле настроек по умолчанию; однако их полезно будет иметь и в файле переопределений, поскольку многие из этих функций (например, сервер NFS) можно переключать буквально одним касанием, если впоследствии вы измените ваше мнение о них. НА ЗАМЕТКУ Многие приложения сторонних разработчиков, особенно сетевые серверы и базы данных, устанавливаются с помощью собственных сценариев запуска (которые находятся в /usr/local/etc/rc.d). Выполнение этих сценариев зависит от переменных в файле /etc/rc. conf. Например, если вы инсталлируете сервер базы данных MySQL, вам нужно будет добавить переменную mysql_enable= "YES" в файл /etc/rc.conf, прежде чем MySQL начнет работу во время загрузки. В большинстве случаев это изменение производится автоматически во время инсталляции порта или пакета (см. главу 16); если же нет, то это будет являться возможной причиной сбоя в работе приложения. Проверьте установленный сценарий запуска приложения, чтобы узнать, не нужна ли ему переменная ^enable, которую, возможно, придется добавить самостоятельно. При инсталляции программ многим из них требуется установить способ запуска во время загрузки системы; для таких программ файл /etc/rc. conf не подходит. Он предназначен для того, чтобы с ним работали только вы, администратор, и программа Sysinstall, производящая изменения в основной системе. Другая структура, иерархия /usr/^ocal/etc, подходит для сценариев запуска и конфигурационных файлов программ, устанавливаемых пользователями (порты и пакеты), а также для любых сценариев, о которых /etc/rc и его "друзья" ничего не знают. Каталоги /usr/local/etc и /usr/local/XHR6/etc Как говорилось в главе 12, все, что устанавливает администратор, помещается в каталог /usr/local. Это справедливо для сценариев запуска, программ и совместно используемых библиотек. Каталог /usr/local/etc является "локальным" эквивалентом /etc (под локальным здесь подразумевается "данный конкретный компьютер", в противоположность общим компонентам и параметрам настройки, которые можно
478 Системное администрирование Часть IV найти на всех FreeBSD-компьютерах), и в него помещаются все конфигурационные файлы, добавляемые программами, которые вы выбираете для инсталляции, а не те, которые находятся под управлением дистрибутива базовой системы FreeBSD. НА ЗАМЕТКУ Важно отметить, что различие между файлами /etc и файлами /usr/local/etc состоит не только в том, что первые являются "нередактируемыми", а вторые — "редактируемыми". Как и большинство файлов из каталога /etc, в работу которых не нужно вмешиваться, многие файлы из каталога /usr/local/etc также не содержат частей, обслуживаемых пользователями, или разработаны таким образом, что для их функционирования не требуются изменения с вашей стороны (хотя в каталоге содержатся настраиваемые конфигурационные файлы для установленных программ). Различие состоит в том, что /etc управляет базовой системой — например, только теми программами, которые являются частью установки FreeBSD. Файлы, находящиеся в каталоге /usr/local/etc, управляют программами, которые вы будете устанавливать позже из коллекции портов или пакетов (об этом речь пойдет в главе 16). Каталог /usr/local/etc служит еще и для хранения любых сценариев запуска, которые вы напишете и добавите в систему (в подкаталог red). Главный локальный конфигурационный каталог, /usr/local/etc, содержит конфигурационные файлы, которые администраторы редактируют для настройки поведения их программ. О конфигурировании портов и пакетов мы поговорим в главе 16. А здесь нас пока что интересует подкаталог red (Resource Configuration for Daemons — конфигурация ресурсов для демонов), который работает точно так же, как и /etc/red. Процесс init обращается к каталогу /usr/local/etc/red после того, как будут пройдены все сценарии /etc/red. Любые исполняемые файлы в каталоге, заканчивающиеся на . sh, выполняются в лексикографическом порядке. Примерами файлов, устанавливаемых в этот каталог, являются apache ¦sh, mysql-server.sh и samba, sh. Эти сценарии специально встраиваются как часть их соответствующих портов и пакетов, и каждый из них настраивается для того, чтобы принимать аргумент start или stop, подобно их двойникам в жестко контролируемой системе /etc/red. Когда init запускает каждый сценарий во время процесса загрузки, он использует аргумент start. Обратите внимание, что вы можете легко запустить эти сценарии самостоятельно в течение рабочего цикла — например, чтобы запустить только что установленную службу, не перезагружая систему: # /usr/local/etc/rc.d/apache.sh start Некоторые порты и пакеты осуществляют инсталляцию с вторичным суффиксом . sample (например, samba, sh. sample). Этот суффикс появляется (маскируя суффикс . sh) вследствие того, что программу нужно тщательно сконфигурировать, прежде чем она сможет нормально работать. Например, Web-сервер Apache запустится сразу же после инсталляции без какого-либо последующего изменения в его конфигурационных файлах (хотя вы в любом случае будете их модифицировать). Таким образом, Apache устанавливает файл apache • sh, который запустит программу, если вы ее выполните. А вот сервер совместной работы в сети Samba необходимо настраивать до запуска на вашем компьютере; если вы запустите сценарий запуска сервера сразу после его инсталляции, он может не активизировать демон. Вам придется внести необходимые изменения в конфигурацию и переименовать сценарий, чтобы удалить расширение . sample, прежде чем процесс init запустит его во время запуска системы.
Конфигурация системы и сценарии запуска I 7ZT I Глава 14 I I Каталог /usr/local/XHR6/etc (он создается в том случае, если вы инсталлируете какие-либо сторонние порты или пакеты для XII) аналогичен каталогу /usг/ local/etc за исключением того, что он предназначен специгшьно для программ на основе XI1, включая панели GNOME, графические инструментальные средства, игры, администраторы окон и так далее. Этот каталог содержит также подкаталог red, и его сценарии выполняются непосредственно после сценариев в каталоге /usr/local/etc/rc.d. НА ЗАМЕТКУ Локальные каталоги сценариев запуска можно конфигурировать. Вы можете заменить следующую строку файла rc.conf, чтобы при необходимости добавить дополнительные каталоги: locales tar tup="/us r/local/etc/red /usr/XllR6/etc/rc.d" # каталоги сценариев запуска Создание сценариев для запуска программ во время загрузки системы Наверное, будет несколько оптимистично предположить, что вам никогда не понадобится, чтобы система во время своего запуска выполняла какие-нибудь задачи, не привязанные ни к одному из тщательно созданных портов/пакетов, ни к основной системе. Например, вы можете захотеть, чтобы во время каждой загрузки системы запускался специальный демон, написанный лично вами, или очищался обычный каталог для совместно используемых файлов. Чтобы сделать это, вы можете разработать свой собственный сценарий оболочки и поместить его в каталог /usr/local/etc/rc.d Напомню, что процесс in it ожидает, чтобы любой сценарий в каталоге red мог обрабатывать аргумент start. Кроме того, имя каждого сценария должно заканчиваться суффиксом . sh, чтобы он мог запускаться автоматически. Ниже показан пример сценария из страницы man re: 41/bin/ah # f PROVIDE: foo # REQUIRE: bar_service_required_to_precede_foo # BEFORE: baz_service_reguiring_foo_to_precede it # KEYWORD: FreeBSD . /etc/rc.subr name*"foo" rcvar=ч set_rcvarч command="/usr/local/bin/foo" extra_commandse"nop hello" hello_cmd-"echo Добро пожаловать." nop_cmd= " do_nop " do nop() { " echo "Ничего не происходит. " } loaderc_config $name nm_rc_command "$1" Этот пример сценария (вы можете настроить его так, как это будет нужно, запол- шв соответствующие имена и специальные подпрограммы, подходящие для вашей
I аол | Системное администрирование I ° 1 Часть IV программы) использует сценарий /etc/rc.subr для обработки аргументов start и stop на тот случай, если сценарий будет вызываться процессом init. Вы можете присвоить этому файлу имя f oo. sh. Проследите за тем, чтобы он был помечен исполняемым (chmod +x foo.sh)! С технической точки зрения программа на самом деле не должна быть сценарием оболочки; вы можете написать ее на языке Perl, если хотите, или даже на С либо каком-то другом языке, который будет запускаться, лишь бы он имел расширение . sh* И все же писать программу на чем-то, отличном от сценария оболочки, крайне нежелательно. Не следует обманывать систему! Подробно о написании сценариев оболочки мы говорили в главе 10. Демон inetd и конфигурационный файл inetd.conf Несмотря на то что базовая система насчитывает приличное количество демонов, имеющих файлы .conf в каталоге /etc, наиболее важным (и чувствительным) демоном, с которым вам доведется иметь дело, является inetd — так называемый "суперсервер", inetd предназначен для прослушивания соединений на определенном наборе сетевых портов и запуска соответствующего процесса сервера при поступлении запроса. К примеру, inetd управляет соединениями Telnet; если ваша система разрешает работу Telnet, вы можете организовать соединение с ним и получить приглашение на вход без какого-либо процесса telnetd, запускаемого заблаговременно на сервере. Каждый раз, когда система получает запрос на соединение на порт 23, она создает новый процесс telnetd для обработки соединения. Исполняемые программы, не входящие в сферу действия inetd (и других похожих демонов), размещаются в каталоге /usr/libexec. Эти программы не являются общей частью пути вашей команды и не могут быть запущены из командной строки; наоборот, они порождаются другим процессом и пере дают некоторые ресурсы (вроде переменных окружения и сетевых соединений). НА ЗАМЕТКУ Использование inetd исключает необходимость в "главном" процессе telnetd, запускаемом пользователем root, который может стать причиной возникновения крайне опасной ситуации, если в telnetd обнаружится уязвимость в защите. Многие демоны, включая sshd, httpd (Apache) и Sendmail работают в этом автономном режиме, а не вызываются демоном inetd. Главный процесс (его может запустить суперпользователь) прослушивает новые соединения и порождает новые процессы, принадлежащие непривилегированному пользователю, чтобы обработать каждую транзакцию. Это увеличивает гибкость и ускоряет работу программы, но за счет риска. Демон inetd тоже работает от имени пользователя root, поэтому в случае компрометации inetd может возникнуть опасность. Чем больше демонов будет выполняться от имени пользователя root, тем больше вероятность возникновения брешей в защите. Во время установки (см. главу 2) вам будет предложено разрешить работу демона inetd, и если вы выберете этот вариант, то будет предложено отредактировать файл /etc/inetd. conf по своему усмотрению. Если вы сделали это, то должны помнить, что все службы, перечисленные в конфигурационном файле, были закомментированы и отключены по умолчанию. Вы должны "поименно" включить каждую службу, которую хотите вывести из inetd. Действительно, в современных версиях FreeBSD
Конфигурация системы и сценарии запуска I TjTJ I Глава 14 I 1 рекомендуется по возможности не использовать inetd; в конце концов, некоторые из наиболее известных незащищенных сетевых служб (вроде Telnet и FTP) традиционно запускаются от inetd, и если вы можете обойтись без них, это будет здорово. Однако если вы запускаете общедоступный сервер, то, скорее всего, вам придется (или как минимум вы захотите сделать это) разрешить такие службы, как FTP, POP и IMAP, чтобы удовлетворить нужды ваших пользователей. НА ЗАМЕТКУ Существуют лучшие, более защищенные альтернативные варианты служб, традиционно запускаемых через inetd; большинство из них функционируют как автономные демоны, включая сторонние серверы FTP и почтовые серверы, зачастую с возможностью шифрования. Более подробно о вопросах настройки системы для достижения оптимальной безопасности можно прочитать в главе 30. Если вы хотите использовать демон inetd, ваш файл /etc/rc.conf должен содержать следующую строку: inetd_enable="YES" В табл. 14.2 перечислены некоторые из наиболее популярных служб, которые традиционно запускаются через inetd. Ни одна из этих служб не включена по умолчанию, однако вы можете посчитать полезным активизировать некоторые из них, в зависимости от требований, предъявляемых к вашей системе. Таблица 14.2. Системные службы, традиционно запускаемые через inetd Служба ftp telnet comsat ntalk ftp (IPv6) telnet (IPv6) рорЗ imap4 smtp netbios-ssn ntbios-ns finger Описание Протокол передачи файлов Удаленный терминал "Ударный" сервер (уведомляет пользователей о поступающих электронных сообщениях) Чат-сервер командной строки Протокол передачи файлов Удаленный терминал Почтовый протокол Протокол интерактивного доступа к электронной почте (почта на стороне сервера) Qmail (альтернатива сервера Sendmail SMTP) Совместное использование файлов Samba и Windows Служба Samba Поиск пользовательской информации Используемые порты/ресурсы Порт 21/ТСР Порт 23/ТСР Порт 512/UDP Порт518ДСР,и IPv6 IPv6 ПортПОДСР Порт 143ДСР Порт 25/ТСР Порт 139ДСР Порт 137ДСР Порт 79ДСР Чтобы разрешить работу какой-либо из этих служб, просто удалите значок комментария (#), стоящий в начале строки, а затем перезапустите сервер inetd, как показано далее: # ps -waux | grep inetd root 110 0.0 0.6 1032 752 ?? Ss 11:57PM 0:00.01 inetd t kill -HUP 110
I ТГГ I Системное администрирование inetd является одной из областей FreeBSD, которая не имеет множества встроенных средств автоматизации или подстраховочных вариантов на случай неверной конфигурации. Если вам необходимо разрешит* службы в файле /etc/inetd.conf, то имейте в виду, что вы отваживаетесь на нестандартный тип настройки, и вам следует знать, с чем вы имеете дело. Например, если для служб cvs будет неверно сконфигурирован параметр, то возникнет брешь в защите. Службы Samba (netbios-ssn и netbios-ns) ожидают, что в каталоге /usr/local/sbin будут находиться двоичные файлы smbd и nmbd, однако этих файлов не будет в этом каталоге, если вы не установите Samba из портов или пакетов. (Запуск Samba из inetd вместо автономного режима является нестандартной, альтернативной конфигурацией.) Точно так же, другие службы (например, рорЗ) пытаются запускать службы, инсталлированные в каталог /usr/local/libexec. Однако следует помнить, что этот каталог находится в каталоге /usr/local; следовательно, если вы не установили сюда программу явным образом, то этих служб здесь не будет. При инсталляции порта/пакета popper в этот каталог помещается необходимая исполняемая программа, поэтому вы сможете разрешить эту службу в inetd. Однако если вы вместо этого выберете инсталляцию порта/пакета qpopper (другой сервер РОРЗ), то исполняемым файлом будет qpopper, а не popper, и вам придется соответствующим образом изменить следующую строку: рорЗ stream tcp nowait root /usr/local/libexec/qpopper qpopper Неосторожных администраторов подстерегают и другие многочисленные "подводные камни". Не следует модифицировать службы inetd больше, чем это необходимо. Выполнив команду man inetd, вы сможете узнать о синтаксисе и вариантах работы с inetd. Системный регистратор (syslogd) и файл syslog.conf Системные сообщения регистрируются в файле /var/log. Механизмом, который отвечает за это, является syslogd ¦*- демон системного регистратора. Поведение этого демона определяется в файле /etc/syslog.conf, который задает несколько различных журнальных файлов для различных служб. Каждая служба или "средство", о котором известно демону syslogd (включая auth, authpriv, console, cron, daemon, ftp, kern, lpr, mail, mark, news, ntp, security, syslog, user, uucp и localO- 1оса17) имеет несколько разных уровней "серьезности", с которыми вы можете управлять регистрацией. Эти уровни включают, в порядке убывания серьезности, emerg, alert, crit, err, warning, notice, info и debug. Каждый демон или служба, которую вы запускаете в FreeBSD, может осуществлять регистрацию с помощью предварительно определенных средств syslogd; например, Sendmail и другие программы по работе с электронной почтой могут использовать системные подпрограммы syslog () для отправки сообщений с различными уровнями серьезности с помощью средства mail; сообщения будут обрабатываться демоном syslogd так, как это определено в файле syslog.conf. По умолчанию файл syslog. conf определяет несколько правил регистрации, как показано ниже: * * "
Конфигурация системы и сценарии запуска Глава 14 483 * .err; kern. debug; auth. notice;mail. crit /dev/console *.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /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 * Это можно интерпретировать следующим образом: все сообщения err от любой службы, сообщения debug от ядра, сообщения notice об авторизации и сообщения crit от почтовых программ будут выводиться на системную консоль, и вы будете видеть их, если ваш монитор будет подключен к FreeBSD-машине. Точно так же, все сообщения, относящиеся к вопросам безопасности, помещаются в файл /var/log/ security, а все сообщения от почтовых программ на уровне info — в файл /var/ log/maillog. Практически все остальное помещается в главный файл журнала системы: /var/log/messages. Некоторые типы сообщений не просто записываются в журнальные файлы, а отправляются разнообразным механизмам обработки. Например, в файле syslog.conf, журнальном файле по умолчанию, сообщения от любой службы на уровне emerg выводятся всем пользователям на всех терминалах. В табл. 14.3 показаны возможные действия для сообщений syslogd, а также синтаксис каждого из них. Таблица 14.3. Синтаксис действий syslogd Синтаксис Предпринятое действие /путь/к/файлу Сообщения записываются в определенный файл. @some.hostname. com Сообщения направляются демону syslogd по адресу @some.hostname.com с помощью сетевой службы syslog. userl Сообщения выводятся на любой терминал, на котором зарегистрирован пользователь userl. root, userl, user2 Все указанные пользователи получают сообщения на все свои терминалы. * Сообщения записываются для всех зарегистрированных в системе пользователей. I "mall root" Сообщения посылаются по электронной почте пользователю root. С остальными подробностями конфигурирования syslogd можно ознакомиться, выполнив команду man syslog. conf. НА ЗАМЕТКУ Каждый журнальный файл в каталоге /var/log руководствуется своим наборам правил. Например, файл /var/log/maillog архивируется и перезапускается каждый день программой periodic. Остальные журнальные файлы, такие как /var/log/cron и /var/log/messages, обновляются с помощью других средств (зачастую это происходит внутри программ, которые выполняют запись в эти файлы). Архивные журнальные файлы обычно сжимаются с помощью программы bzip. Чтобы выполнить поиск старых журнальных файлов, используйте bzcat вместе со стандартной утилитой grep: I bzcat /var/log/messages.2.bz | grep "rejected"
484 Системное администрирование Часть IV Замечания касательно файла /etc/rc. local Сценарий конфигурации ресурсов /etc/rc. local был рассмотрен ранее в этой главе просто как устаревший сценарий. Администраторы, которым доводилось работать с первыми версиями FreeBSD или некоторыми дистрибутивами Linux, смогут узнать этот файл. Его назначение такое же, как и у каталогов /us r /local /etc/ red - чтобы предоставить вам механизм расширения поведения запуска системы за счет добавления ваших демонов или специальных изменений в конфигурации. Метод red, описанный ранее в этой главе, является самым лучшим способом запуска демона или выполнения некоторой автоматизированной задачи во время запуска системы. Однако в некоторых случаях (например, при монтировании удаленного сервера или запуске резервного клиента) более целесообразно иметь место, в котором вы можете просто выполнить командную строку, не беспокоясь о точной структуре подходящей системы конфигурации ресурсов. Именно для этого и предназначен /etc/rc. local (хотя он отсутствует в установке по умолчанию). Вы можете создать файл (с подходящей строкой интерпретатора, смоделированной после остальных файлов г с • *) и поместить в него любой набор команд оболочки, и он будет выполняться как раз перед сценариями г с. d. Поддержка г с. local объясняется только обратной совместимостью, и когда-нибудь будет удалена из FreeBSD. Чтобы убедиться в том, что ваша система поддерживает ее, проверьте, существует ли в файле /etc/red сценарий запуска local, как показано в листинге 14.3. Листинг 14.3. Фрагмент файла /etc/rc.d/local, показывающий поддержку /etc/rc.local name="local" start_cmd="local_start" s t op_cmd= " 1 о с a l__s t op " local_start() { echo -n 'Запуск локальных демонов:1 if [ -f /etc/rc.local ]; then . /etc/rc.local fi echo '.' } local_stop() { echo -n 'Закрытие локальных демонов: ' if [ -f /etc/rc.shutdown.local ]; then . /etc/rc.shutdown.local fi echo ' . ' } load_rc_config $name run_rc_command "$1" Если этот файл существует, вы можете использовать г с. local для запуска ваших специальных команд во время старта системы. Однако если у вас будет возможность, старайтесь пользоваться методом сценария re. d.
ГЛАВА 15 Мониторинг производительности, управление процессами и автоматизация задач В этой главе... • Мониторинг производительности с помощью утилиты top • Мониторинг процессов с помощью программы ps • Завершение неправильно функционирующих процессов • Как сделать процесс "хорошим"? • Автоматизация процессов с помощью демона планировщика сгоп • Использование команды at для формирования заданий, выполняемых в запланированное время • Управление доступом к командам сгоп и at • Использование планировщика периодических задач
486 Системное администрирование Часть IV Одним из фундаментальных отличий между настольной операционной системой, такой как Windows, и серверной операционной системой, подобной FreeBSD, является управление процессами. FreeBSD позволяет управлять каждым отдельным процессом в системе, каким бы он ни был — обычным или критически важным. В отличие от FreeBSD, операционная система Windows позволяет вам управлять только некоторыми процессами приложений, и то довольно ограниченно. Таблицу процессов в Windows открывают только в случае крайней необходимости, и даже при этом вы все равно не можете многого сделать. В системе FreeBSD осведомленность о выполняющихся процессах является неотъемлемой частью администрирования системы. Например, в операционной системе Windows вы можете нажать комбинацию клавиш <Ctlr+Alt+Delete> и получить список процессов, работу которых вы можете завершить по своему усмотрению. Вот и все, что вы можете сделать, и вам будет сложно сказать, чем занимается каждый из перечисленных процессов и сколько ресурсов системы он расходует. С другой стороны, FreeBSD показывает вам всю эту информацию и предоставляет возможность перезапускать процессы, изменять их приоритеты, присваивать им несколько различных типов сигналов завершения и многое другое — и все это с четким видением того, какие процессы могут стать причиной возникновения проблем. Если воспользоваться обыденной аналогией, то настольная операционная система подобна автомобилю, у которого наглухо закрыт капот. А в "машине" FreeBSD вы можете открыть этот "капот" в любой момент времени. Это вовсе не означает, что-FreeBSD является более запутанной или менее стабильной, чем настольные платформы на основе графическим интерфейсов пользователя (GUI). У опытного администратора, разбирающегося в процессах, система FreeBSD никогда не дестабилизируется, и ему не придется рыскать в трудной для понимания таблице чисел только для того, чтобы выполнить базовые системные функции. Как можно будет увидеть в этой главе, таблица процессов в FreeBSD и инструменты, взаимодействующие с ней, являются олицетворением системы UNDC: полностью доступный автомобиль, в котором видны все его подвижные части и основные механизмы. С такой доступностью вы можете настраивать все, что может делать система, независимо от масштаба выполняемых действий. В этом и заключается сущность UNIX. В этой главе мы поговорим о некоторых инструментах мониторинга процессов, а именно — о ps, top и ki 11,, Одни из них являются более дружественными по отношению к пользователям, а другие являются более универсальными. В этой главе мы рассмотрим также программу сгон, которая представляет собой планировщик задач, которые должны выполняться периодически — это еще одна особенность, которая отделяет серверные системы от настольных систем. Мониторинг производительности с помощью утилиты top Самой простой Ь применении утилитой мониторинга процессов является top; свое название она получила благодаря тому, что первоначально она была разработана для вывода первых (top) десяти процессов, выполняющихся на данный момент в системе, в порядке убывания по использованию ресурсов центрального процессора (ЦП). Утилита top текущей версии FreeBSD показывает каждый процесс, выполняющийся на данный момент, в. любом состоянии — где-то примерно 40 процессов в недавно инсталлированной системе FreeBSD.
Мониторинг производительности».. Глава 15 487 Преимущество утилиты top состоит в том, что она является интерактивной и работает в режиме реального времени. Когда вы ее запустите, она возьмет ваш терминал под свой контроль, и будет обновляться каждую секунду, предоставляя вам актуальную информацию о состоянии вашей системы в данный момент времени. Вы можете также передавать утилите top команды, такие как kill и renice (мы поговорим о них далее в этой главе), или предоставить ей различные опции для фильтрации и сортировки процессов, которые она вам показывает. Это делает утилиту top чрезвычайно полезным инструментом для того, чтобы "обуздать" вышедший из-под контроля сервер, тонко настроить производительность некоторых задач или просто для того, чтобы проследить за событиями в тот момент, когда вы будете работать в другом окне. Объяснение информации, выводимой утилитой top Когда вы запустите утилиту top, вы получите вывод, пример которого показан в листинге 15.1. Листинг 15.1. Пример вывода утилиты top last pid: 30283; load averages: 0.51, 0.89, 0.87 up 52+15:48:43 11:19:03 126 processes: 1 running, 124 sleeping, 1 zombie CPU states: 0.7% user, 0.0% nice, 2.8% system, 0. 7% interrupt, 95.8% idle Mem: 142M Active, 35M Inact, 59M Wired, 7496K Cache, 35M But, 4256K Free Swap: 500M Total, 48M Used, 452M Free PID USERNAME 30283 bob 30282 root 19460 mysql 245 root 18427 root 86694 frank 86 root 80717 root 61945 root 80 root 56054 root 73772 root 40567 www 40581 www THR 1 1 11 1 1 1 1 1 1 1 1 1 1 1 PRI NICE 2 29 2 2 2 10 2 10 2 2 2 2 2 2 0 0 0 0 0 0 -12 0 0 0 0 0 0 о : SIZE 1360K 2076K 25908K 868K 7592K 1700K 1296K 2132K 1868K 916K 2168K 8956K 9880K L0008K RES STATE 976K sbwait 123 6K CPU1 2692K poll 232K select 5092K select 56K nanslp 412K select 472K nanslp 360K select 320K select 584K select 2540K select 2872K sbwait 3796K sbwait С TIME WCPU COMMAND : 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0:00 6.02% qpopper 0:00 3.14% top 112:20 2.20% mysqld 177:39 0.00% healthd 80:24 0.00% named 76:46 0.00% elm 6:28 0.00% ntpd 5:53 0.00% telnetd 3:29 0.00% inetd 3:26 0.00% syslogd 3:12 0.00% sshd 3:12 0.00% httpd 0:57 0.00% httpd 0:55 0.00% httpd По умолчанию утилита top отображает все процессы системы (вне зависимости от того, кому они принадлежат), независимо от того, активные они или нет, простаивают или находятся в режиме "зомби", и показывает, сколько потребовалось для них времени ЦП. Первую полезную порцию информации можно получить во второй строке — количество процессов. Это число варьируется от системы к системе, но вполне вероятно, что в данный момент времени будет выполняться гораздо больше процессов, чем может уместить экран вашего монитора. Вы можете нажать клавишу <1> ("глаз"), чтобы переключить утилиту top в режим отображения только активных процессов. Поскольку программа top является интерактивной, существуют другие команды, которые вы можете выполнить во время ее работы; например, вы
Системное администрирование можете нажать клавишу <К> и ввести идентификационный номер процесса, чтобы уничтожить его. Эти команды будут рассматриваться чуть позже. Следующим, на что нужно обратить внимание в выводе утилиты top, являются средние значения загрузки (load averages), представляющие собой довольно сложные метрики, которыми вы можете воспользоваться, чтобы с первого взгляда сказать, до какой степени загружена система. В расчет берется количество заданий, выполнявшихся за последние 1, 5 и 15 минут, соответственно; однако это очень сложно привязать к профилю системы, выполняющей реальные приложения, которые от задания к заданию потребляют очень много ресурсов. Загрузка со значением 1 обычно означает, что система обрабатывает каждую задачу в момент ее поступления, как будто бы каждая задача представляет единственного человека в очереди на почте; если загрузка больше единицы, это означает, что процессы (как и клиенты на почте) выстраиваются в очередь, и система становится более загруженной. Средние значения загрузки В конце концов, у вас возникнет ощущение того, что приводит к высокой загрузке вашей системы. Обычно загрузка не должна превышать значения 1 на постоянной основе для сервера, хотя в настольных системах с большим количеством графических средств это значение может лежать в диапазоне от 2 до 3 (значение 5 расценивается как неустойчивая высокая загрузка). Некоторые демоны прекращают прием новых запросов при определенном уровне загрузки (например, 12 для Sendmail). Если загрузка достигает 20 или 30, то, скорее всего, система оказалась в ситуации, называемой контуром обратной связи (это можно представить себе как состязание), при которой новые процессы создаются быстрее, чем система может выполнить их. Это приводит к замедлению работы системы и к невозможности справиться с загрузкой; данная ситуация имеет даже свое не особенно ласковое название: спираль смерти (death spiral). Это один из тех редких случаев, когда вам может понадобиться перезагрузить систему UNIX, поскольку сервер под такой загрузкой может оказаться до того перегруженным, что его никогда нельзя будет восстановить, или ему понадобится настолько много времени, чтобы выполнить все его процессы и вернуться к нормальному режиму, что проще всего будет перезагрузиться. В любом случае ваш удаленный сеанс Telnet или SSH в таких условиях может перестать реагировать на запросы, или вы не будете выполнять сеанс в момент возникновения спирали смерти (как результат, система не сможет открыть новое соединение, чтобы вы могли выровнять ситуацию). И только регистрация на физической консоли — или даже выключение и включение машины, физическое выключение и перезагрузка, как самое последнее средство — может оказаться единственным спасением. В блоке заголовка содержится больше информации об оперативной памяти системы, чем это для вас, наверное, может быть полезным. Здесь вы не найдете простого графика "использовано/свободно" по всей доступной оперативной памяти; наоборот, вы увидите состояние всех портдий памяти в четвертой и пятой строках листинга 15.1. НА ЗАМЕТКУ Вот здесь устойчивая система управления памятью FreeBSD демонстрирует свою опасную уязвимость. В UNIX не производится простое разделение между памятью используемой и памятью незанятой. Количество оперативной памяти, установленной в вашей системе, является хорошим показателем для запоминания, но он никогда не будет иметь какого-либо смысла при повседнев-
Мониторинг производительности... Глава 15 ном использовании — нельзя просто сложить количество памяти, требуемой для работы каждого приложения, и рассчитать, сколько таких программ может уместиться в установленной вами оперативной памяти. Поскольку модель памяти в UNIX сильно зависит от виртуальной памяти (свободного пространства на жестком диске, используемого для кэширования неактивных данных из оперативной памяти; известное также как область подкачки), вы можете запустить на самом деле гораздо больше приложений, чем обычно может уместить оперативная память. Единственным недостатком является снижение скорости по мере переноса в область подкачки все большего объема данных (к которым все чаще должен осуществляться доступ). В главе 2 обсуждаются способы оптимизации раздела подкачки с целью достижения максимальной эффективности (например, сдвиг этой области как можно ближе к краю диска). Не подумайте, что блок Free отображает всю доступную память в системе. Этот блок находится только в памяти, которая вообще еще не использовалась с момента включения системы. А вот на что следует обратить внимание, так это на блок Active, поскольку он описывает память, занятую активными процессами — программами, которые выполняются в данный момент и не простаивают. Оставшиеся поля описывают другие состояния, которые могут или не могут быть взаимоисключающими, поэтому суммирование значений во всех этих полях не обязательно даст в результате тот объем оперативной памяти, которым вы располагаете. На самом деле это сложение даст гораздо больший объем. Поля Swap являются более простыми. Данные распределяются по страницам и по мере необходимости переносятся и извлекаются из пространства виртуальной памяти (копируются на диск и выводятся из оперативной памяти), a top обычно отображает только поля Used и Free. Числа в них складываются предсказуемо. Возможно, полезнее будет изучить поля Swap, чем сами поля оперативной памяти, чтобы посмотреть, насколько хорошо работает ваша система. Если поле Swap содержит высокие значения (используется 50 процентов или выше), это означает, что данные были перенесены в страницы относительно недавно вследствие переполнения физической оперативной памяти, поэтому вы можете принять решение добавить дополнительную память. В системе FreeBSD редко возникают проблемы с пространством подкачки. Но если все же они случаются, как это бывает во многих реализациях UNIX, то они будут несущественными (вы увидите сообщения об ошибке, но на стабильности системы это никак не отразится). Тем не менее, иногда может наблюдаться непредсказуемое поведение или нестабильность. Вам нужно следить за тем, чтобы процент использования файла подкачки был по возможности невысоким — по этой причине, а также вследствие того, что обычно все работает гораздо быстрее в оперативной памяти, чем в файле подкачки. После этого обратите внимание на то, что процессы перечислены в порядке убывания в столбце WCPU. Этот столбец показывает, сколько циклов ЦП используется в данный момент каждым процессом (с помощью "взвешенной" шкалы, учитывающей циклы ЦП, в которых процесс находился в "резидентном" состоянии). Не стоит предполагать, что в столбце появится значение 100% — большую часть времени ЦП будет загружен минимально, и большинство циклов ЦП будет оставаться неиспользованными. Посмотрите еще раз на заголовки; строка CPU states (состояния ЦП) говорит о том, сколько ресурсов процессора используется в каждом из четырех возможных состояний, и вы сможете очень тесно связать эти значения с процентами в столбце CPU (ЦП). | 489 |
490 Системное администрирование Часть IV НА ЗАМЕТКУ Некоторым программам требуются все 100% ресурсов ЦП, хотя такую активность может выдержать не всякая конфигурация. Например, Qmail (демон SMTP, о котором мы поговорим в главе 25) или сервер СУБД, такой как MySQL, могут занимать 100% возможностей системы при очень высокой нагрузке. Это нормальное поведение, и его следует воспринимать спокойно, если основным предназначением системы является выполнение подобных программ. ЦП оперирует дискретными циклами, счет которых идет на множество миллионов в секунду (в зависимости от скорости обработки операций). Каждый из этих циклов обслуживает некоторую часть некоторого процесса, и с течением времени процесс будет использовать достаточное количество этих циклов, чтобы оно сводилось к числу, измеряемому в секундах. Именно об этом вам сообщает столбец TIME. Обратите внимание на разделительное двоеточие — оно не разграничивает часы и не минуты! Значения в столбце TIME на самом деле представляют количество секунд ЦП, которые были отведены процессу на состояниях системы и состояниях пользователя, соответственно. Процессу могут понадобиться минуты или часы, чтобы количество занятых им циклов могло быть выражено измеряемым числом. Если процесс имеет большое значение (как, например, mysqld в примере вывода, показанном в листинге 15.1), то это обычно является следствием того, что процесс выполняется неделями или же он вышел из-под контроля, и занимает большой процент ресурсов ЦП в течение своего рабочего цикла. В последнем случае это можно легко проверить, посмотрев на столбец WCPU. Следующими частями вывода top, с которыми вам следует разобраться, являются столбцы SIZE и RES. SIZE показывает выделенный размер процесса, включая компоненты текста, данных и стека. Поскольку части этих компонентов совместно используются в рамках всей системы, то этот столбец не может дать точных данных, чтобы можно было узнать, сколько памяти использует процесс. Вместо этого, RES показывает данные по резидентной памяти (значения в этом столбце должны соответствовать текущему обьему используемой памяти). Оба значения размера по-своему являются "правильными", но, чтобы узнать "традиционное" количество памяти, занятой процессом, эквивалентное тому значению, о котором сообщают Windows или классическая Mac OS, необходимо смотреть на значения в столбце RES. Остальные поля утилиты top не являются особенно важными или говорят сами за себя. Столбец С показывает, какой процессор используется процессом, если в системе установлено несколько процессоров. PID отображает идентификатор процесса-номер, который присваивается каждому процессу во время его выполнения, a USERNAME показывает пользователя, которому принадлежит процесс. STATE показывает, в каком из возможных состояний находится процесс, что не является очень информативным, если только это не zomb или zombie (так называется дочерний процесс, который был остановлен, но который еще не освободил полностью свое пространство в таблице процессов). Использование интерактивных команд top Утилита top можрт работать и в интерактивном режиме, благодаря которому вы сможете сортировать выводимую информацию. Ранее в этом разделе говорилось о том, что вы можете нажать клавишу <1>, чтобы показать только активные процессы.
Мониторинг производительности.». I ТГТ I " Глава 15 I 1 Вы можете также нажать клавишу <U>, чтобы вам было предложено ввести имя пользователя; после этого top отобразит только те процессы, которые принадлежат данному имени пользователя (используйте + в качестве имени пользователя, чтобы показать их еще раз). Вы можете выполнить команду kill с помощью клавиши <К>, в результате чего вам будет предложено ввести PID процесса, который необходимо уничтожить. Клавиша <Т> включает и выключает отображение самого процесса top. Эти и другие опции перечислены на странице man top. Будучи установленной, top покажет подробную картину того, что происходит в системе, и позволит вам управлять большинством задач, связанных с управлением нроцессами. Однако top не является абсолютным решением; рна не дает детализированной информации о самих процессах, а интерактивная природа этой утилиты не позволяет писать для нее сценарии, и она не может применяться вместе с каналами и другими программами. Для этих целей используется программа ps. Мониторинг процессов с помощью программы ps В отличие от top, которая выполняет мониторинг в режиме реального времени, работа программы ps во многом похожа на работу программы Is (что и следует из названия). Она мгновенно показывает список всех процессов, которые выполнялись на момент выдачи этой команды. Она показывает не только ту информацию, что и top, но и дополнительные сведения о многих значениях. По умолчанию, если запустить программу ps без аргументов, то она выведет список только тех процессов, которые принадлежат вам, и которые присоединены к терминалу (то есть тех процессов, которые выполняются с момента входа в систему). Большое количество опций командной строки могут позволить получить более разносторонние результаты; информацию о каждой опции можно прочитать, выполнив команду man ps. Эти опции определяются следующим образом; • ps -wwaux Комбинации этих опций приводит к следующему. * • Вывод данных в широком формате (ww), благодаря чему список уместится в несколько строк, а не будет усечен по ширине вашего терминала (одна литера w соответствует отображению только первых 132 символов). • Для каждого процесса будет указано имя пользователя, владеющего этим процессом (и). • Выводятся процессы всех пользователей, а не только ваши процессы (а). • Выводятся все процессы, независимо от того, связаны ли они с терминалом (х). Если выразиться кратко, то эта комбинация опций покажет список всех процессов в системе в наиболее возможном детальном виде. Благодаря встроенным опциям, вы можете отфильтровывать вывод несколькими способами. Например, если будет исключена опция х, то будут показаны только те процессы, которые присоединены к терминальным сеансам пользователей, а если будет исключена опция а, то вы увидите только ваши процессы (как вариант, можно использовать -U, чтобы указать другого пользователя, например, -U frank). Выполнив команду man ps, вы сможете узнать о многих других опциях. Однако помимо встроенных фильтров, вам нужно будет применять команду ps вместе с утилитой
492 Системное администрирование Часть IV grep (мы рассматривали ее в главе 12), чтобы фильтрация выполнялась по имени процесса. Пример этого показан в листинге 15.2. Листинг 15.2. Пример вывода ps с фильтрацией с помощью grep # ps -ax | grep httpd 40563 ?? S 0:54.73 /usr/local/sbin/httpd 40564 ?? S 0:55.30 /usr/local/sbin/httpd 40565 ?? S 0:56.03 /usr/local/sbin/httpd 40566 ?? S 1:00.16 /usr/local/sbin/httpd 40567 ?? S 1:05.13 /usr/local/sbin/httpd Объяснение информации, выводимой программой ps В листинге 15.3 показан пример информации, полученной при выполнении команды ps -wwaux. Листинг 15.3. Пример вывода команды ps -wwaux USER root root root root root root root PID 1 2 3 4 5 11 27 %CPD 0.0 0.0 0.0 0.0 0.0 98.8 0.0 %MEM 0.1 0.0 0.0 0.0 0.0 0.0 0.0 VSZ 724 0 0 0 0 0 0 RSS 244 8 8 8 8 8 8 TT ?? ?? ?? ?? ?? ?? ?? STAT STARTED ILs DL DL DL DL RL WL 5:05PM 5:05PM 5:05PM 5:05PM 5:05PM 5:05PM 5:-05PM TIME 0:00.09 0:00.61 0:08.17 0:04.96 0:00.00 20:27.49 0:12.44 COMMAND /sbin/init — [g event] [g up] [g down] [thread taskq] [idle] [swi4: clock sio] Процессы в выводе команды ps сортируются по PID, а не по какой-либо из показанных метрик (если только вы не используете одну из специальных опций сортировки, описанную на странице man). Вы получаете практически ту же информацию, что и с помощью top, хотя и в более сложном формате и с несколькими незначительными изменениями. В каких случаях ps используется вместо top Утилиту top полезно использовать для сбора общих метрик по вашим процессам; a ps в большей степени ориентирована на просмотр PID специфических процессов и всей командной строки для каждого процесса. Она работает быстрее top, и для нее можно написать сценарий. Например, вы можете написать сценарии, которые будут извлекать PID процесса из вывода команды ps и посылать сигналы для этого PID, и все это будет выполняться с помощью команд оболочки и каналов. Это, в част ности, будет полезно тогда, когда вам нужно "укротить** вышедший из-под контроля процесс или изменить приоритет задания. Рассмотрением этих функций мы сейчас и займемся.
Мониторинг производительности. Глава 15 493 Завершение неправильно функционирующих процессов Предположим» вы заметили, что система работает гораздо медленнее, нежели ожидалось; вы используете команду su, чтобы получить доступ на уровне пользователя root, выполняете команду top и смотрите на процессы. Скорее всего, вы увидите картину, пример которой показан в листинге 15.4. Листинг 15.4. Вывод команды top, показывающий возможные процессы, вышедшие из-под контроля last pid: 67469; load averages: 8.32, 5.49, 2.47 up 53+01:04:22 20:34:42 90 processes: 1 running, 88 sleeping, 1 zombie CPU states: 93.2% user, 0.0% nice, 0.2% system, 0.8% interrupt, 5.8% idle Mem: 153M Active, 23M Inact, 60M Wired, 7252K Cache, 35M Buf, 5112K Free Swap: 500M Total, 44M Used, 456M Free, 8% Inuse PID 19460 67468 245 18427 USERNAME frank root root root THR 1 1 1 1 PRI 2 28 2 2 NICE 0 0 0 0 SIZE 25908K 2036K 868K 7592K RES 2816K 1024K 232K 5124K STATE poll CPU0 select select С TIME 0 131:15 0 0:00 1 178:48 0 81:01 WCPU 92.43% 0.20% 0.00% 0.00% COMMAND testprog top healthd named Ага, вот и нарушитель — testprog. Кажется, пользователь frank выполняет какую-то экспериментальную программу, которая, по всей видимости, написана не очень-то хорошо, и занимает практически все доступные циклы ЦП. Иногда такой "вышедший из-под контроля" процесс возникает либо в образовавшемся бесконечном цикле (часть кода, которая никогда не достигает точки, где она может быть завершена), либо из-за недостатка памяти (программа пытается занять больше памяти, независимо от того, нужно это ей или нет). Скорее всего, такой процесс сам по себе никогда не завершится; тем временем, выполнение и завершение работы других процессов становится все сложнее. Процесс testprog нужно убрать. Уничтожение процессов внутри вывода top Чтобы избавиться от процесса testprog или других вышедших из-под контроля процессов, нажмите клавишу <К>. Внутри команды top появится приглашение команды kill; это приглашение является интерфейсом команды kill (или, во всяком случае, упрощенной версией этого интерфейса). В этом приглашении необходимо ввести PID процесса-нарушителя (в нашем случае это 19460). Поскольку вы обладаете полномочиями суперпользователя (root), то, скорее всего, работа процесса будет немедленно прекращена и система сразу же испытает облегчение. Теперь вы можете без опаски проследить за тем, что произошло; можно послать сообщение пользователю frank, чтобы рассказать ему о том, что натворила его программа, если, конечно, ему не известно об этом поведении. (Если же он все знает, то, наверное, вам придется сформулировать правило, которое позволит вам оградить себя от подобного рода проблем в будущем.) Команда kill не всегда может работать внутри команды top, а вы можете захотеть более четко контролировать сигналы, посылаемые процессам. Функцию kill
494 Системное администрирование Часть IV в команде top удобно применять для стандартного прекращения работы нормально функционирующих процессов, однако это всего лишь часть тех функциональных возможностей программы kill командной строки, которые вам могут понадобиться. Программа kill командной строки и ее опции Ее название несколько обманчиво: kill делает гораздо больше, чем просто завершает работу процессов. Ее главное предназначение — быть сигнальным механизмом, посредством которого процессы могут давать один другому самые разнообразные команды. Любой пользователь может использовать kill в отношении любого из его процессов, однако только пользователь root может уничтожать процессы других пользователей. \ Самым простым и распространенным применением kill является прекращение работы процесса: # kill 12553 Однако эта команда посылает процессу только некоторую разновидность сигнала: сигнал TERM. Это сообщение является универсальным сообщением "выхода", которое понимают все программы UNIX, однако оно не всегда работает. Существуют и другие сигналы. В табл. 15.1 перечислены наиболее важные из них. Таблица 15.1. Наиболее часто используемые сигналы kill Сигнал Символическое имя Назначение 1 hup Отбой (завершение и перезапуск). 2 int Прерывание. 3 QUIT Выход. б abrt Аварийное завершение. 9 kill Неигнорируемое уничтожение. 14 alrm Сигнал тревоги. 15 term Нормальное прекращение работы. Вы можете использовать любой из этих сигналов, определив номер сигнала или его символ: # kill -HUP 8112 # kill -9 966 Первая команда говорит процессу о том, что он должен закрыть сам себя и перезапуститься с теми же самыми аргументами — повторно перечитывая все входные файлы и принимая новый PID. Это полезно делать в тех случаях, когда вы что-либо изменили в конфигурационном файле программы, и вам понадобилось перезапустить процесс для активизации изменений. Вторая команда, которую следует использовать только в случае крайней необходимости и когда все другие варианты не работают, посылает низкоуровневый сигнал "суперуничтожения", который завершает работу процесса любой ценой, независимо от того, насколько "упрямым" является этот процесс. (Эта функция эквивалентна команде "Завершить процесс" в Windows.) Эта команда заставляет процесс прекратить
Мониторинг производительности., Глава 15 495 СВОЮ работу "нечистым* образом и может оставить файлы открытыми или соединения в "зависшем" состоянии. Эта команда может оказаться спасительной, но ее не следует использовать, если у вас нет в этом крайней необходимости (например, если команды kill и kill -TERM не возымели никакого эффекта). На странице http:// sial.org/code/shell/tips/kill-9/ вы можете узнать, в каких случаях следует использовать команду kill -9, а в каких — нет. НА ЗАМЕТКУ Программа kill не является безошибочной; в некоторых ситуациях команда kill -9 не завершает процесс, который полностью перестал отвечать на сигналы. Некоторые процессы в определенных состояниях могут превратиться в "зомби" (zombre), что означает, что они никогда не "умрут" и не могут быть уничтоженными. Большинство процессов-зомби просто существуют и не занимают много ресурсов системы* Однако если в некотором редком случае вы столкнетесь с процессом-зомби, вмешивающимся в общую работу системы, то единственным спасением может быть перезагрузка. 1111 ¦" > ¦" ;¦ Эти сигналы являются единственными сигналами, которые вы, скорее всего, будете использовать при повседневном управлении процессами. Остальные сигналы обычно игнорируются программами, которые не умеют реагировать на них. Как сделать процесс "хорошим"? Команда kill является одним из инструментов управления процессами, который вы можете использовать как из командной строки, так и в рамках программы top. Однако ранее вы читали о другом инструменте, с помощью которого можно изменять приоритет планирования процесса. Этим инструментом является команда renice, которая изменяет приоритет (или "улучшает1' уровень) любого выполняющегося в данный момент процесса. Приоритет планирования представлен числом от --20 до 20> где -20 соответствует самому высокому приоритету (несколько необычное соответствие). Взгляните на результаты выполнения top; значения в столбце NICE соответствуют' приоритету процессов. Обратите внимание на то, что большинство процессов имеют приоритет 0. Нулевой приоритет является приоритетом по умолчанию, поскольку в большинстве случаев нет необходимости устанавливать какой-то определенней дриоритет. Кроме того, некоторые службы выполняются с заранее установленным приоритетом, гарантирующим, что они будут выполняться в определенное время или освободят дорогу более важным процессам. Если вы не являетесь суперпользователем, то можете присвоить процессу меньший уровень приоритета (более высокое значение NICE), но не более высокий (меньшее значение NICE). Из командной строки вы можете изменить приоритет процесса до 10 с помощью команды renice: # renice 10 1442 Внутри программы top вы можете нажать клавишу <R>, чтобы получить приглашение на ввод renice. Введите уровень приоритета от -20 до 20, за ним введите PID процесса, который вы хотите изменить, и результаты появятся в столбце NICE. Это простое, интерактивное и альтернативное решение проблемы, вызванной процессом
Системное администрирование Часть IV testprog, с которым вы недавно познакомились. Вместо того чтобы незамедлительно уничтожить вышедший из-под контроля процесс, вы можете просто присвоить ему приоритет 20, что теоретически отодвинет его назад и позволит выполняться остальным процессам. Команда nice (которая является как программой в каталоге /usr/bin, так и встроенной командой оболочки в оболочке csh/tcsh) позволяет установить приоритет процесса в момент его выполнения. Перед командой необходимо ввести nice и уровень приоритета, как показано ниже: # nice -10 Is В качестве результата процесс Is начнет выполнение с уровнем приоритета 10. НА ЗАМЕТКУ Перед уровнем приоритета в команде nice ставится тире, которое обозначает, что положительные (меньшие) приоритеты определяются так, как показано в предыдущем примере renice. А чтобы определить отрицательный (больший) приоритет, нужно использовать следующий вариант записи: # nice —10 top Однако, к сожалению, синтаксис двойного минуса работает только в команде /usr/bin/nice, но не в команде nice, встроенной в csh/tcsh (которая замещает системную nice). Если вы используете bash, то предыдущий синтаксис будет работать; для случая csh вам понадобится команда /usr/bin/nice —10 top, чтобы добиться описанного здесь эффекта. Автоматизация процессов с помощью демона планировщика сгоп Теперь, когда вы увидели, как можно манипулировать процессами напрямую, вы можете проверить, как процессы могут выполняться автоматически без вмешательства с вашей стороны. Автоматизация задач с помощью планировщика позволяет FreeBSD ежедневно проверять защиту и обновлять состояние системы, регулярно обновлять свои базы данных времени выполнения, очищать журнальные файлы и выполнять множество других задач, которые могут понадобиться администратору. Некоторые операционные системы прикрепляют планировщики к отдельным приложениям (например, инструмент Software Update в Mac OS X), однако преимущество FreeBSD и других систем, подобных UNIX, заключается в том, что планировщик представляет собой независимый демон, который может выполнять любую программу командной строки или пакет программ в любой периодической очередности, которая может оказаться необходимой. В FreeBSD, как и в большинстве систем типа UNIX, планировщик имеет имя сгоп. Программа сгоп в FreeBSD была написана Полом Викси (Paul Vixie), а ее стандартная версия используется в большинстве дистрибутивов Linux и других похожих системах. Подобно автономному демону, она работает постоянно и ежеминутно проверяет свои входные файлы (называемые файлами с г on tab), чтобы узнать, были ли они изменены или содержат ли задачу, которую необходимо выполнить в данную минуту Сам процесс сгоп никогда не нужно перезапускать; он автоматически прочитает любые изменения во время своего ежеминутного пробуждения. 496 I
Мониторинг производительности. Глава 15 497 1л овальный файл с г on tab (/to/crontab) содержит запланированные задания, выполненные системой, а специальный каталог (/var/cron/tabs) позволяет отдельным пользователям создавать свои собственные файлы очереди с г on tab. У вас может возникнуть соблазн добавить собственные запланированные задания в файл /etc/crontab, но, как и в случае с /usr/local/etc/rc. d против /etc/rc . local (см. главу 14), вы всегда должны оставлять /etc/crontab нетронутым (чтобы его можно было безопасно перезаписывать при последующих обновлениях) и создавать новые задания в персональном файле crontab суперпользователя в каталоге /var/ cron/tabs. Как это делается, вы узнаете в следующих разделах. Анатомия файла crontab Давайте заглянем внутрь отдельного файла crontab пользователя. Ниже показан файл /var/cron/tabs/frank: # DO NOT EDIT THIS FILE - edit the master and reinstall. # HE РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ - отредактируйте основной файл и заново инсталлируйте # (/tmp/crontab.qx7aeeMvoH installed on Mon Feb 7 11:47:00 2005) # (Cron version — $FreeBSD: src/usr.sbin/cron/crontab/crontab.c, bv 1.19 2002/10/01 22:59:11 dd Exp $) 0 3 1,15 * * cat ^frank/faq.txt | mail -s "FAQ Auto-Post" mylist@testsystem.com Этот файл содержит один элемент: задачу по отправке текстового файла в mail, который нужно послать в список рассылок. Задача будет выполняться в 03:00 1-го и 15-го числа каждого месяца. Как определяется эта очередь? Благодаря первым пяти полям строки данных, разделенных пробелами. (Первые три строки автоматически генерируются комментариями и программой cron не обрабатываются.) Эти поля в своем порядке перечислены в табл. 15.2. Таблица 15.2. Поля даты и времени в файле crontab Лоле Допустимые значения Минуты 0-59 Часы 0-23 Число месяца 1-31 Месяц 1-12 День недели 0-7 (воскресенье = 0) Например, чтобы создать задачу (для этих примеров выберем простую команду Is), которая будет выполняться каждую ночь в J;00, используйте следующий синтаксис для пяти полей: О 1 * * * Is Чтобы выполнять эту же задачу, но только по понедельникам, используйте такой синтаксис: О 1 * * 1 Is Задачу, которая будет выполняться в начале каждого часа в течение марта месяца, можно определить, как показано ниже: О * * 3 * Is
I ТГГ I Системное администрирование Любое поле может содержать несколько чисел, разделенных запятыми, или диапазон чисел (например, 1-10). Чтобы определить каждый случай данного интервала, укажите символ звездочки (*). В полях месяца и дня недели (четвертое и пятое поле) могут использоваться также и символические имена — трехбуквенные сокращения названий месяцев и дней недели. Кроме того, имена могут быть перечислены в строках с разделением запятыми, но не могут применяться в диапазонах. В пятом поле (день недели) числа 0 и 7 соответствуют воскресенью. НА ЗАМЕТКУ *— ¦ ¦ Если вы хотите выполнять команду каждые л минут или каждые я часов, вы можете сделать это, определив "шаговое" значение (например, */п). В поле минут запись */5 можно расшифровать как "каждые пять минут", что эквивалентно записи 0, 5, 10, 15, 20, 25, $0, 35, 40t 45, 50, 55. Выполнив команду man 5 с г on tab, вы сможете получить дополнительную информацию о форматах планирования. Вы можете также использовать строки-сокращения на месте первых пяти полей, чтобы определить некоторые часто используемые расписания ^см. табл, 16.3). Таблица 15.3. Примеры символических интервалов расписания. Строка Greboot Gyearly @annually ^monthly @weekly @daily ^midnight @hourly Эквивалент Выполнять один раз во время запуска системы 0 0 1 1 * То же самое, что и ©yearly 0 0 1 * * 0 0**0 0 0 * * * То же самое, что и Gdaily Q • * * * Например, с помощью строк-сокращений можно опреДелить^задачу, которая будет выполняться каждую ночь в 24:00. Следующие две Эквивалентны строки делают это: ©midnight Is ~ 0 0 * * * Is . ~ , • После полей расписания форматы файла /etc/crontab и индивидуальных файлов с г on tab будут немного отличаться. Глобальный файл /etc/crontab имеет дополнительное поле перед полем commands поле who, которое определяет пользователя, который должен выполнить процесс, и которому Этот процесс принадлежит. 1 3 * * * root periodic* daily Поле command можно усложнить до любой степени; заполните его так, будто бы вы вводите команду в командной строке. Вы можете даже использовать точку с запятой (;), чтобы разделять команды, которые хотите последовательно выполнять в виде части одного и того же автоматизированного задания. Важно отметить, что для команд, выполняемых из /etc/crontab, с г on не будет учитывать путь пользователя, определенный в поле who — в самом начале файла присутствует оператор PATH, в котором
Мониторинг производительности... | ТТГ I Глава 15 I I перечислено только несколько оазовых системных каталогов. Это означает, что вам нужно указать полный путь к любой выполняемой вами команде, которой нет в этом пути; в противном случае с г on не сможет найти программу для выполнения. Если с какой-либо программой, выполненной сгоп, связаны выходные данные, то они будут собраны в электронном сообщении и отправлены владельцу файла с г on tab (или владельцу запланированной задачи для элементов /etc/crontab). Создание и редактирование файлов crontab Если вы являетесь суперпользователем, то редактировать файл /etc/crontab вам не составит труда, и вы сможете добавлять любые элементы расписания, которые только захотите. Однако поскольку файл /etc/crontab по возможности лучше не редактировать, вам необходимо разобраться с индивидуальными файлами crontab и понять, как они создаются, и как производится управление этими файлами. Поскольку каждый файл crontab помещается в определенный каталог (/var/ cron/tabs) и принадлежит своему создателю с полномочиями 0600, механизм безопасности разрешит пользователям создавать и редактировать свои собственные файлы, не компрометируя файлы других пользователей. Упомянутым механизмом является программа crontab: # crontab -e Ниже показано, как можно отредактировать файл crontab, если вы являетесь суперпользователем: # crontab -e -u frank Подобно инструментам chf n и edquota, с которыми вы могли познакомиться в главе 13, crontab работает посредством вызова редактора, указанного в переменной окружения VISUAL (или в переменной EDITOR, если VISUAL не задана). В редакторе появится содержимое файла (за исключением первых трех строк комментариев). После того как вы произведете необходимые изменения, сохраните этот файл и закройте редактор. Временный файл, который во время внесения изменений находится в каталоге /tmp, скопируется в каталог /var/cron/tabs, и в него добавятся строки заголовка. Файл crontab будет активизирован в следующий раз, когда к нему обратится сгоп, максимум, через минуту. Использование команды at для формирования заданий, выполняемых в запланированное время Итак, мы выяснили, что сгоп чрезвычайно полезна для регулярно планируемых задач. А если задачу нужно выполнить только один раз — иногда выполнение нужно отложить до тех пор, когда вы сможете выполнить ее самостоятельно? Это можно сделать с помощью сгоп, настроив файл crontab таким образом, чтобы в нем была запись, выполняющая команду crontab -u в конце задачи, чтобы удалить саму себя. Однако существует более подходящий вариант — программа at.
Системное администрирование Часть IV НА ЗАМЕТКУ В качестве примера того, насколько полезной может быть команда at, я использовал ее прошлым летом во время поездки на Аляску. Каждое утро команда at, которую я установил заблаговременно, отправляла запись в мой блог, описывающий мой маршрут на сегодняшний день по скоростной автомагистрали Аляски (Alaska Highway). Однако выяснилось, что это было не так уж и необходимо, как мне казалось, поскольку в те дни на Юконе был доступ в Internet... На самом деле программа at состоит из нескольких команд: at (организатор задания), atq (отображает незавершенные задания) и atrm (позволяет отменять незавершенные задания, перечисленные в atq). Есть еще команда batch, которая является версией at, и которая выполняется только в том случае, если загрузка системы меньше некоторого значения (по умолчанию 1.5). Когда вы используете at, чтобы создать задание, она читает команды, строка за строкой, в стиле сценария /bin/sh. Эти команды могут быть определены либо в командной строке (стандартный ввод), либо в предварительно созданном файле. В любом случае вы просто вводите команду at, ставя за ней строку в формате времени, которая может принимать несколько интуитивно понятных форм, как показано в табл. 15.4 (полное описание опций форматирования времени можно получить по команде man at). Таблица 15.4. Примеры синтаксиса команды at Командная строка Назначение at 10pm Выполняет в 10:00 текущего дня или на следующий день, если сейчас больше 10:00. at 8:00am May 15 Выполняет в 8:00 15 мая. at midnight Jan l 2006 Выполняет в первую секунду 2006 года. at teatime tomorrow Выполняет в 16:00 следующего дня. После того как вы введете эту строку и нажмете клавишу <Enter>, вы войдете в стандартный режим ввода. Введите команды строку за строкой, нажимая каждый раз клавишу <Enter>. По завершении ввода нажмите комбинацию клавиш <Ctrl+D>, чтобы выйти и поместить задание в очередь. В качестве альтернативного варианта можете заблаговременно создать входной файл, и затем передать его программе at: # at -f mycommand noon + 5 days Эта команда прочитает файл простого текста под именем mycommands, в котором содержатся ваши команды, подобно командному файлу, после чего будет выполнять их с помощью /bin/sh в полдень в течение пяти дней с момента ввода команды. Просмотреть существующие задания можно с помощью команды atq: # atq Date Owner Queue Job# 23:00:00 03/28/01 root с 2
Мониторинг производительности... | ГТТ I Глава 15 I I Отменить выполнение заданий можно с помощью команды atrm, указывая идентификационный номер задания: # atrm 2 НА ЗАМЕТКУ При выполнении заданий программой at используется команда atrun. Инструмент atrun запускается каждые пять минут (в стандартной установке FreeBSD), читает все отложенные задания для всех пользователей и выполняет все задания, чье время выполнения уже наступило. Вы можете изменить частоту выполнения atrun, изменив ее запись в /etc/crontab; делать это не обязательно, если только вам не нужно выполнять ее чаще, чем каждые пять минут. Управление доступом к командам сгоп и at Механизм планирования является настолько действенным, что большинство администраторов не всегда хотят, чтобы их пользователи могли иметь полный доступ к командам at и сгоп. Будучи администратором, вы можете управлять доступом к этим командам в своей системе FreeBSD. Предположим, например, что у вас есть назойливый пользователь, которому постоянно нужен бот IRG, и каждый раз, когда вы уничтожаете процесс, он возобновляется, поскольку пользователь настроил файл с г on tab так, чтобы перезапускать процесс, если он не выполняется (например, проверяя каждый час). Пользователь не отвечает на электронное письмо. Вы можете или запретить учетную запись пользователя (это всегда можно сделать, если только этим пользователем не является ваша теща или кто-то в этом роде) или ограничить доступ пользователя к командам сгоп и at. Вы можете ограничить доступ пользователя в файлах deny и allow для обеих программ. Файлов /var/cron/allow и /var/cron/deny по умолчанию в установке FreeBSD нет. Поэтому любому пользователю разрешается создавать файлы с г on tab. Если вы создаете файл /var/cron/allow, то в нем будут перечислены (в виде списка с простым текстом, по одному пользователю в каждой строке) только те пользователи (помимо суперпользователя), которые могут создавать файлы с г on tab. Как вариант, вы можете поместить пользователей в файл /var/cron/deny. Этот подход позволит каждому создавать файлы с г on tab, кроме тех, которые перечислены в этом файле. Если существуют оба файла, то предпочтение отдается файлу /var/cron/allow. Файлы /var/at/arr,allow и /var/at/at.deny работают аналогично, но имена файлов отличаются, поэтому данный момент следует учитывать! ВНИМАНИЕ! 1 Имейте в виду, что эти конфигурационные файлы, если вы создадите их, может записывать только пользователь root; если вы не являетесь суперпользователем, выполните команды /var/ cron/allow и chxnod 600 /var/cron/allow.
Системное администрирование Использование планировщика периодических задач Команда periodic похожа на форсированную версию сгоп* Она предназначена для того, чтобы обеспечить возможность выполнения целых каталогов, имеющих множество сценариев оболочки, в регулярные интервалы времени, заданные в файле с г on tab. В установке FreeBSD по умолчанию команда periodic применяется для выполнения многих функций по обслуживанию, управляемых структурой каталога, напичканного сценариями оболочки, хранящихся в /etc. *" Если вы просмотрите файл /etc/crontab, то увидите три ссылки на команду periodic: # do daily/weekly/monthly maintenance 1 3 * * * root periodic daily 15 4 * * 6 root periodic weekly 30 5 1 * * root periodic monthly Команда periodic вызывается три раза, с тремя разными аргументами: daily, weekly и monthly. Эти аргументы соответствуют трем разным подкаталогам каталога /etc/periodic. Каждый подкаталог, именуемый в соответствии с тремя аргументами, содержит несколько программ оболочки, каждая из которых выполняет определенную задачу — в данном случае это задача обслуживания, которую система выполняет каждый день, еженедельно или ежемесячно, в определенное время, заданное в файле /etc/crontab. Например, в файле /etc/per iodic/daily вы найдете такие сценарии, как 100 .clean-disks, 200.backup-passwd и" 999. local. Наличие этих сценариев в подкаталогах /etc/petiodic дает им возможность выполняться тогда, когда periodic будет выполняться с именем и? каталога в качестве аргумента. Имена сценариев в каталогах periodic традиционно имеют числовые префиксы; поскольку periodic выполняет сценарии в лексикографическом порядке, использование чисел позволяет облегчить определение порядка, в соответствии с которым должны выполняться сценарии. Например, 9 9 9. local всегда является последним сценарием, который должен быть выполнен в /etc/periodic/daily. Выходные данные, полученные в результате выполнений periodic, накапливаются в электронном сообщении и посылаются суперпользователю (по умолчанию). Они служат источником для ежедневных сводок по системе, которые ваша FxeeBSD-ма- шина посылает вам каждую ночь сразу после 3:00. Просматривая исходные каталоги periodic, вы сможете увидеть, что делает система, чтобы сгенерировать информацию о состоянии диска, учете входов пользователей, новостей, UUCP, почты и другую информацию, которая посылается вам каждый день, неделю и месяц. Каждый сценарий в каталогах periodic имеет свое поведение, определяемое в файле /etc/def aults/periodic. conf. Вы можете проверить этот файл, чтобы узнать, как обрабатывается каждый сценарий, и вы можете Изменить эти настройки, создав файл /etc/periodic.conf, который работает точно так же, как и /etc/ re. conf, маскируя параметры настройки по умолчанию в соответствующем файле в каталоге def aulbs. Например, вы можете применять этот способ для отправки выходных данных сценариев другому пользователю или в журнальный файл, а не пользователю root. Вы можете также включить или отключить отчет о выходных данных для отдельных сценариев, а также настроить многие другие переменные, специфические для сценариев, которые управляют работой с&мих сценариев.
Мониторинг производительности... Глава 15 НА ЗАМЕТКУ i % Каталог /etc/periodic/security является специальным; в нем содержатся сценарии, предназначенные для выполнения задач, связанных с безопасностью, таких как поиск новых программ setuid, учетных записей без паролей и сообщений брандмауэра ядра. Сценарии, хранящиеся в этом каталоге, выполняются в отдельном процессе и обрабатываются отлично от обычных ежедневных сценариев обслуживания, чтобы свести к минимуму риск утечки секретной информации через механизм перехвата сообщений. Такое поведение можно изменить, переопределив настройки в файлах /etc/defaults/periodic.confи /etc/periodic.conf. При желании вы можете добавлять свои собственные сценарии в каталоги periodic. Однако, как вы могли видеть ранее, лучше всего не редактировать глобальные файлы в /etc, если доступна альтернативная "локальная* версия. В этом случае каталог /usr/local/etc/periodic выступает как место для хранения ежедневных, еженедельных или ежемесячных сценариев, которые вы можете добавлять в него. Эти сценарии выполняются в то же время, что и глобальные сценарии periodic, выполняемые /etc/crontab. Например, сразу после завершения сценариев из каталога /etc/periodic/daily periodic выполнит все, что будет находиться в каталоге /usr/local/etc/periodic/daily, в лексикографическом порядке и с учетом глобального местоположения. Добавление сценариев в каталоги periodic является хорошим способом планирования определенных задач, которые нужно выполнять на постоянной основе — например, сценарий, который очищает временный каталог, процесс резервирования базы данных или процесс CVSup, синхронизирующий ваши исходные файлы FreeBSD (о синхронизации исходных файлов FreeBSD речь пойдет в главе 19). Обработка этих задач более аккуратным и более формальным способом предусматривает использование структуры periodic, а не помещение их в огромный файл crontab. /
ГЛАВА 16 Установка дополнительного программного обеспечения В этой главе... • Введение в пакеты • Инсталляция пакетов • Удаление и обновление пакетов • Введение в порты • Инсталляция и удаление портов • Обновление и обслуживание портов • Модернизация порта • Web-сайт Fresh Ports
506 Системное администрирование Часть IV Вплоть до настоящего момента мы рассматривали вопросы, которые в значительной степени могут быть применены ко многим различным типам систем семейства UNIX. Практически любая такая система, будь то коммерческая или с открытым кодом, работает одинаково, в зависимости от структуры файловой системы, автоматизации процессов и общего администрирования. Что обособляет систему FreeBSD от ее общины (Linux и коммерческие программы UNIX), так это модель, в соответствии с которой администратор добавляет новые программы. Возьмем, к примеру, SolarisfEoui вы хотите добавить в систему новую программу, вам нужно поискать предварительно скомпилированный бинарный код для конкретной платформы и самостоятельно установить его (обычно без помощи инсталляторов, помогающих поместить программу в нужное место), поскольку Solaris обычно не содержит компилятор дсс (стандартный компилятор C/C++ проекта GNU). Другие системы, такие как IRIX и HP-UX, имеют компилятор дсс, но вам все равно нужно будет найти исходный код программы, которую вы хотите инсталлировать, запустить его сценарий конфигурации, скомпилировать его (шаг, о котором проще сказать, чем сделать) и установить. Этот процесс конфигурирования и установки достаточно стандартизирован, однако он является полностью добровольным и контролируется каждым отдельным разработчиком программного обеспечения, поэтому нет гарантии того, что процесс инсталляции одной программы будет проходить точно так же, как и в других программах. Разновидности Linux продвигают этот шаг дальше благодаря концепции пакет (package), которые по своей сути являются едиными комплектами, состоящими из подходящего для вашей системы бинарного кода и любых необходимых библиотек. Кроме того, пакеты содержат необходимую информацию о том, куда нужно направлять инсталляцию в соответствии с компоновкой системы. Система Rad Hat Package Manager (RPM) представляет собой лицензированный GNU упаковщик, который работает во многих системах, включая FreeBSD. Популярность этого упаковщика во многом способствовала продвижению Rad Hat на вершину дистрибьюторов Linux вынудив свернуть деятельность предыдущего фаворита — Slackware, ныне уже практически всеми забытого. Это хорошо дает понять, насколько важной может быть хорошая система упаковки. RPM позволяла администраторам хранить таблицы в своих установленных программах и модернизировать, удалять и добавлять новые пакеты с беспрецедентной легкостью. А система FreeBSD еще более повысила степень удобства. Она обладает собственной системой упаковки, инструментами ркд_*, которые в этой главе будут рассмотри ны во всех деталях. FreeBSD обладает также вспомогательной системой, называемой портами (port). Порты позволяют компилировать программы из их оригинальных исходных кодов с простотой одиночной команды, гарантируя при этом такое же ка чество, какое вы можете получить в мире открытого исходного кода. Введение в пакеты Джордан Хаббард (Jordan Hubbard), ранее один из главных разработчиков FreeBSD (сейчас он трудится в Apple как архитектор Mac OS X), ответственен за основной объем первоначальной работы по системе упаковки. Система упаковки FreeBSD была принята для NetBSD и других платформ, и в течение нескольких лет совершенствовалась, при этом наилучшие независимые наработки воплощались снова в FreeBSD.
Установка дополнительного программного обеспечения Глава 16 507 Согласно самому простому определению, система упаковки представляет собой способ упаковки программного обеспечения (включая конфигурационные файлы, совместно используемые библиотеки и документацию) и его извлечения на другой машине, конфигурация которой позволит данным программам работать на новой машине. Первые диспетчеры упаковки занимались лишь процессами упаковки и извлечения. Упаковщики .RPM и FreeBSD обладают многочисленными дополнительными особенностями: • Они поддерживают на вашем компьютере базу данных, которая показывает инсталлированные программы и номера версий каждого пакета. • Они могут извлекать удаленный файл инсталляции с FTP-сайта (обычно, с сайта первичного распределения). • Они отслеживают зависимости или любые другие дополнительные пакеты, которые обязательно должны быть инсталлированы для устанавливаемых вами пакетов. • Они могут выполнять модернизацию, деинсталляцию и установку. Основное отличие между двумя упаковщиками очень тесно связано с^разными философиями разработки FreeBSD и Linux. Linux имеет несколько различных дистрибутивов с разными версиями glibc (набор основных совместно используемых библиотек, не относящихся к FreeBSD) и практически бесконечным многообразием оборудования, на котором может работать операционная система. Файлы пакетов RPM обычно извлекаются из какого-нибудь одного из тысяч сайтов разработчиков по всей территории Web, а не только из одного центрального хранилища. Утилита RPM обязательно должна быть достаточно сложной, чтобы уметь обрабатывать все это многообразие — и она на самом деле является таковой. Ее интерфейс командной строки является несколько загадочным, и чтобы нормально работать с ним, вам потребуется изучить массу документации. Однако FreeBSD выигрывает от централизованной модели разработки и одной поддерживаемой аппаратной платформы, поэтому модель упаковки может быть гораздо проще как в архитектуре, так и в использовании» Как было сказано в главе 12, иерархия /usr/local резервируется для тех элементов, которые вы устанавливаете самостоятельно, что особенно касается программ, которые вы инсталлируете из портов и пакетов. Структура каталогов показана в табл. 16Л (хотя Ваша установка может несколько отличаться, особенно если вы уже установили другие программы). Другими словами, каталог /usr/local имеет ту же базовую иерархию, что и каталог в /usr (за исключением man-страниц, которые расположены в /usr/local/ man, а не в /usr/local/share/man, о чем вы могли предположить). Система упаковки в FreeBSD хранит все, что вы инсталлируете, в дереве /usr/local и вне дерева /usr, поддерживая, таким образом,,плавное, но строгое разделение между базовым программным обеспечением (ПО) и программами, которые устанавливают пользователи.
508 Системное администрирование Часть IV Таблица 16.1. Структура каталогов в пределах /usr/local Подкаталог Назначение Ып Бинарные файлы (скомпилированные программы). etc Конфигурационные файлы. include Файлы include на языке С, используемые для разработки новых программ. info Различные вспомогательные типы данных для документации по сборке. lib Совместно используемые библиотеки. libexec Вспомогательные бинарные файлы, используемые другими программами. man Страницы руководств для инсталлированных программ. sbin Системные бинарные файлы (программы, которые изменяют поведение системы). share Материалы, не зависящие от платформы (файлы данных, документация и так далее). Общие библиотеки и зависимости Общая библиотека представляет собой централизованный файл, обеспечивающий предварительно скомпилированные вызовы функций. С помощью общей библиотеки программа может получать доступ к некоторым функциям, не встраивая эти функции в саму себя. Эта технология, называемая динамическим связыванием, сокращает размер файла и обилие исполняемых бинарных файлов по сравнению со статическим связыванием, при которой в каждую программу компилируются все необходимые функции. Общие библиотеки существуют практически на каждой платформе, хотя и имеют разные названия — например, в Windows они называются динамически подключаемыми библиотеками (Dynamic Link Library— DLL), или DLL-библиотеками. FreeBSD уже имеет большое количество общих библиотек, инсталлированных в базовой системе — этих библиотек будет достаточно для того, чтобы обеспечить поддержку всех программ, являющихся частью самой FreeBSD — и предлагает привязки для программ, которые вы можете установить позже. Тем не менее, вам практически наверняка попадется программа, для которой понадобится общая библиотека, отсут- ствующая в базовой установке FreeBSD. В FreeBSD базовые общие библиотеки хранятся в каталоге /usr/lib, а любые инсталлируемые вами общие библиотеки помещаются в каталог /usr/local/lib. Все программы автоматически ищут необходимые им библиотеки сначала в каталоге /usr/lib, и только после этого переходят к просмотру каталога /usr/local/lib (а также пары других каталогов). Вы можете управлять этим поиском в файле /etc/ re. conf, о чем говорилось в главе 14. Каждый пакет имеет список зависимостей (пакетов, которые уже должны быть инсталлированы для устанавливаемого вами пакета), включающий как общие библиотеки, так и исполняемые файлы (программы). Если зависимость еще не установлена, система упаковки автоматически отследит ее и установит, прежде чем продолжить основную инсталляцию. Если вы впоследствии удалите какую-то программу или библиотеку (посредством инструментов пакетов), которая является зависимостью для некоторого установленного пакета, то инструменты сообщат вам об этом и предотвратят удаление.
Установка дополнительного программного обеспечения Глава 16 509 Получение информации об инсталлированных пакетах Чтобы узнать о пакетах, первым делом необходимо изучить информацию о тех пакетах, которые вы уже инсталлировали. Нгшерное, по ходу прочтения вами первых глав этой книги вы уже установили некоторые пакеты; кроме того, вы могли также косвенно инсталлировать некоторые из них в качестве части специальной установки (например, если вы выбрали инсталляцию XII в ходе процесса установки FreeBSD). В противном случае вам не следует беспокоиться — информация, изложенная здесь, пригодится вам в будущем. ( Для управления пакетами используются такие утилиты, как pkg_add, pkgdelete, pkg_inf о, pkg_update, pkg_version и pkg_create. Каждая из них делает именно то, о чем можно судить исходя из названия утилиты; признаком стиля FreeBSD является использование программ с разными именами, а не малопонятные переключатели и параметры в одной и той же программе. Каждая из этих утилит взаимодействует с базой данных файловой системы в каталоге /var/db/pkg, просмотреть которую можно с помощью команды Is — она позволит вам быстро оценить состояние пакетов вашей системы. В этом хранилище имеется каталог для каждого установленного пакета, который включает список упаковки (манифест файлов в данном пакете) и зависимости, pkginf о применяет эту базу данных для вывода краткого описания каждого пакета, который вы инсталлировали на данный момент, о чем можно судить из листинга 16.1. Листинг 16.1. Пример вывода pkgjlnfo # pkg_inf о IraageMagick-6.2.2.1 An XI1 package for display and interactive manipulation of analog-6.0 An extremely fast program for analyzing WWW logfiles apache-1.3.34 The extremely popular Apache http server. Very fast, very arc-5.21j Create & extract files from DOS .ARC files aub-2.1,3 Assemble Usenet binaries autoconf-2.59 Automatically configure source code on many Un*x platforms dict-1.10.1 Dictionary Server Protocol (RFC2229) client elm-2.5.8 A once-popular mail user agent, version 2.5.x eraacs-21.3 GNU editing macros ImageMagick-6.2.2.1 Пакет XI1 для отображения и интерактивной манипуляции analog-6. 0 Чрезвычайно быстрая программа для анализа файлов-журналов WWW apache-1.3.34 Чрезвычайно популярный http-сервер Apache. Очень быстрый, очень arc-5.21j Создает и извлекает файлы из DOS-файлов .ARC aub-2.1.3 Сборка бинарных файлов Usenet autoconf-2.59 Автоматически конфигурирует исходный код на многих платформах Un*x dict-1.10.1 Клиент Dictionary Server Protocol (RFC2229) elm-2.5.8 Когда-то популярный агент пользовательской почты, версия 2.5.x emacs-21.3 Макросы редактирования GNU Более подробную информацию о каждом пакете можно получить, указывая его имя в качестве аргумента, а еще более подробную информацию — за счет добавления переключателя -v ("verbose" — многословный). Как и в случае с RPM, имена пакетов в FreeBSD состоят из нескольких частей, разделенных дефисами — имя пакета, а за ним указывается его версия. Однако RPM-файлы предназначены для работы на множестве платформ и часто в имени пакета содержат имя искомой платформы.
Системное администрирование Часть IV Наоборот, поскольку FreeBSD практически повсеместно применяется на платформах х86, пакетный файл FreeBSD просто принимает форму имя-версия, tbz. Например: elm-2.5.8.tbz Пакеты в основном являются . tbz-файлами, которые являются сокращенным вариантом .tar.bz2. Использование .tbz-файлов является традиционным способом архивирования структуры каталогов под UNIX — вы сначала упаковываете каталог в один файл с помощью tar, а затем сжимаете его с помощью bzip. Чтобы использовать такие утилиты, как pkg_inf о -v, вам нужно указать полное имя пакета и его версию, как показано в листинге 16.2. ( НА ЗАМЕТКУ Ранее для пакетов существовал формат . tgz (. tar. gz), и только недавно в FreeBSD вместо него стал применяться формат .tbz. Это связано с тем, что схема сжатия bzip2 позволяет достичь лучших результатов, чем традиционная схема сжатия gzip. Листинг 16.2. Подробный вывод pkg_infо # pkg_info -v sudo-1.6.8.6 Information for sudo-1.6.8.6: Информация для sudo-1.6.8.6: Comment: Allow others to run commands as root Комментарий: Позволяет другим пользователям выполнять команды от имени суперпользователя Description: This is the CU version of sudo. Описание: Это CU-версия sudo. Sudo is a program designed to allow a sysadmin to give limited root privileges to users and log root activity. The basic philosophy is to give as few privileges as possible but still allow people to get their work done. sudo — это программа, предназначенная для того, чтобы системные администраторы предоставляли пользователям ограниченные привилегии суперпользователя и регистрировали активность суперпользователя. Основная философия заключается в том, чтобы предоставить как можно меньше привилегий, но с таким расчетом, чтобы пользователи могли выполнять свою работу. MAILING LISTS: Please send bugs, problems, comments, etc to sudo-bugs@courtesan.com There is a mailing list that receives announcements whenever a new version of sudo is released. You can subscribe to it by sending a message to "majordomo@courtesan.com" that includes the line "subscribe sudo-announce". There is also a list for people working on sudo. The command to add yourself is "subscribe sudo-workers". WWW: http://www.courtesan.com/sudo/
Установка дополнительного программного обеспечения Глава 16 511 Списки ра с силок: Пожалуйста, посылайте сообщения об обнаруженных ошибках, проблемах, комментарии и тому подобное по адресу sudo-bugs@courtesan.com. Существует список рассылок, который получает уведомления о выходе каждой новой версии sudo. Вы можете подписаться на него, послав сообщение по адресу "majordomo@coutresan.com" с пометкой "subscribe sudo-announce". Имеется также список для людей, работающих в sudo. Вы можете добавить себя в него, указав* к пометку "subscribe sudp^workers". WWW: http://www. сол>гtesan. com/sudo/ Packing list: (Список упаковки) Comment: PKGJF0RMAT_REVISI0N:1.1 (Комментарий) Package name: sudo^l.6.8.6 (Имя пакета) Package origin: security/sudo (Источник пакета) CWD to /usr/local File: man/man5/sudoers,5.gz (Файл) Comment: MD5:b8c9dbl9cbacl66acac39357b92eae94 (Комментарий) File: man/man8/sudo.8.gz Comment: MD5:027194bcl9812c6da4ca4ed666c7c5f6 File: man/man8-/visudo,8,gz Comment: MD5:2feMOdc710522e936a92802be2df45d File: man/man8/sud0edj-t.8.gz Comment: ^D5:115a43ciefe748f5,7d99650bealac5ad UNEXEC lrm -f %D/man/cat$/sudoers.5 %D/man/cat5/sudoers.5.gz' UNEXEC 'rm -f %D/man/cat8/sudo.8 %D/man/cat8/sudo.8.gz1 UNEXEC 'rm -f %D/man/cat8/visudQ.8 %D/man/cat8/visudo.8.gz' UNEXEC 'rm -f %D/man/cat8/sudoedit.8 %D/man/cat8/sudoedit.8.gz' UNEXEC 'if cmp -s %D/etc/sudoers %D/etc/sudoers.sample; then rm -f V%D/etc/sudoers; fi'. . \~ File: bin/sudd Comment: MD5*87f0l6a5e538921843b48656498cff7a File: bin/sudoedit *~~ Comment: MD5;8>f016a5e538921843b48656498cff7a File: etc/sudo6rs.sample Comment: MD5:f16c8ba08bf992bf3d068745395e89fd File: libexec/sudd^noexec. so Comment: MD5lb618el52b0Q290cbcf7023dc6e58ee9e File: sbin/visudo ^ Comment: MD5:55d«41123fbll07u0f5bd286af583a2 UNEXEC 'if I -f Winfo/dir ]; then if sed -e ¦1,/Menu:/d¦ 4>%D/info/dir | grap -q ' A[*] '; then true; else rm %D/info/dir; fi; fi* Install script: • (Сценарий установки) #!/bin/sh •".*-. if [ $2 != "POST-INSTALL" ]; then- exit 0 ^ v , fi "-/'*'•' if [ -e ${PKG_EREFlX}/etc/sudoers ] ,* therf echo "Will tiot ovexwrite^ existing ${PKG_PREFlX}/etc/sudoers file." else ' • cp-p ${PKG^PR?EIX}/ietc/s-udoers. sample ${PKG_PREFIX}/etc/sudoers chmod 440 $7pkG PREFIX}/<3tс/sudpers - ~ fi ~
512 Системное администрирование Часть IV В этом листинге есть все, что вам нужно знать о пакете — его .Длинное описание, его зависимости, его список рассылок (с контрольной суммой MD5 checksum для каждого файла в его поле Comment), и даже сценарий установки, который использовался во время его инсталляции, чтобы помочь вам проследить за тем, где находятся его файлы компонентов. Чего нет в этом листинге, так это полного файла mtree - карты всех каталогов, содержащих компоненты для выбранного пакета. Информация в списке упаковки представляет собой больше, чем просто список файлов-компонентов: в ней содержатся также команды UNEXEC, которые используются во время процесса деинсталляции любого пакета, так что если вы будете применять утилиту pkgdelete для удаления пакета, то она просто выполнит эти команды, чтобы аккуратно удалить все соответствующие файлы и каталоги. В этом примере файл sudoers . sample, используемый по умолчанию и находящийся в подкаталоге /etc рабочего каталога сценария (/usr/local, представленный меткой %D), удаляется как часть списка упаковки по умолчанию. Кроме того, в команде UNEXEC файл /usr/local/etc/sudoers сравнивается с файлом по умолчанию sudoers. sample в том же каталоге; если они совпадают, значит, вы никогда не вносили никаких изменений в файл sudoers со времени его создания, и он тоже удаляется. В противном случае утилита pkg_delete будет знать, что вы производили свои собственные из менения в файле, и оставляет его. Как можно видеть, хорошо написанный и хорошо ведущий себя пакет (а практически все пакеты ведут себя хорошо) "очистит" вашу систему при его удалении, не оставив за собой никакого следа, но оставляя нетронутыми ваши файлы, измененные локально. Как можно узнать, что эта версия пакета является текущей? Вы можете опреде лить это без труда с помощью утилиты pkgjversion. Она работает только в том случае, если была установлена коллекция портов — и она должна быть инсталлирована, если только вы серьезно не экономите дисковое пространство. О коллекции портов мы поговорим далее в этой главе, а пока единственное, что вам следует знать, дабы понять pkg_version — это то, что коллекция портов (если она поддерживалась актуальной) содержит листинги текущих версий всех пакетов. Утилита pkgversion сравнивает версии каждого установленного пакета с версией, найденной в коллек ции портов, и сообщает вам о том, являются ли ваши пакеты актуальными (см. листинг 16.3). Листинг 16.3. Пример вывода pkg_version # pkg_version -v ImageMagick-6.1.6.8 < needs updating (port has 6.2.2.1) apache-1.3.34 < needs updating (port has 1.3.34_2) arc-5.21e.8 = up-to-date with port aub-2.0.5 * up-to-date with port autoconf-2.13 = up-to-date with port bash-2.04 * multiple versions (port has 1.14.7,2.05b.007_4) bnc-2.9.4 = up-to-date with port bulk_mailer-1.12 < needs updating (port has 1.13) cclient-2004d, 1 < needs updating (port has 2004g,l) cvsup-16.1h_2 » up-to-date with port demoroniser-1.0 = up-to-date with port ImageMagick-6.1. 6.8 < требуется обновление (порт имеет версию 6.2.2.1) apache-1.3.34 < требуется обновление (порт имеет версию 1.3.34^2) агс-5.21е.8 = соответствует версии порта
Установка дополнительного программного обеспечения Глава 16 513 aub-2.0.5 я соответствует версии порта autoconf-2.13 - соответствует версии порта bash-2. 04 * множество версий (порт имеет версию 1.14.7,2.05b, 007^4) bnc-2.9.4 e соответствует версии порта bulk_mailer-l. 12 < требуется обновление (порт имеет версию 1.13) cclient-2004d,l < требуется обновление (порт имеет версию 2004д,1) cvsup-16.1h_2 * соответствует версии порта demoroniser-1.0 » соответствует версии порта Без опции -v утилита pkg_version не будет печатать третий столбец; вы получите только значок во втором столбце. Строка версии тоже может не добавляться к именам пакетов в первом столбце. В любом случае, этот инструмент позволит вам быстро понять, где могут понадобиться ваши усилия, направленные на поддержку. Установка пакетов Теперь нужно заняться поиском каких-нибудь программ для инсталляции. Первый шаг предполагает поиск доступных продуктов. Практически все программное обеспечение, доступное для Linux, доступно также и для FreeBSD — почти каждый элемент программного обеспечения с открытым кодом превращался в родной для FreeBSD порт, и даже программное обеспечение с закрытым кодом, распространяемое в бинарном виде для Linux, тоже можно инсталлировать (поскольку бинарная совместимость позволяет вам делать все, вплоть до воспроизведения аудио/видео с помощью программ для Linux). Установка из Sysinstall Если у вас установлена коллекция портов, вы можете посмотреть вид по категориям всех доступных программ в каталоге /usr/ports и просто осмотреть файловую систему. Каждый подкаталог представляет категорию пакета с тем же именем, а каталог каждого порта внутри него представляет пакет программ, который может быть доступным для установки с помощью инструментов командной строки. Однако ваш старый знакомый Sysinstall предлагает еще более простой интерфейс. НА ЗАМЕТКУ Не каждый порт имеет соответствующий доступный пакет. Если вы попытаетесь инсталлировать пакет, имя которого нашли в каталоге ports, а он не доступен в меню Sysinstall, вам нужно будет собрать его из портов. Более подробно об этом вы сможете прочитать в разделе "Дерево портов FreeBSD". В главном меню программы Sysinstall выберите команду Configure (Конфигурировать), а затем выберите пункт Packages (Пакеты). Меню Packages (Пакеты) показано на рис. 16.1. В этом меню выберите CD/DVD в качестве источника инсталляции, если у вас под рукой имеется установочный DVD-диск FreeBSD; если, нет, и вы подключены к сети, выберите FTP. После того как вы получите список пакетов из выбранного вами источника, вам будет предложено меню, пример которого показан на рис. 16.2.
514 Системное администрирование Часть IV Рис. 16.1. Меню Packages (Пакеты) в программе SysinstaU Рис. 16.2. Обзор категории в меню Packages (Пакеты) Прокрутите его вниз и вверх» чтобы посмотреть различные категории, и нажмите клавишу <Enter> для входа в каждую из них. Замечание по ветвям версий Мы не будем рассматривать систему ветвления версий FreeBSD вплоть до главы 19. Однако пока что вы должны немного ознакомиться с хотя бы несколькими важными терминами, которые необходимы для нормальной работы пакетов и портов. В разделе Options (Опции) программы SysinstaU присутствует поле для ввода имени версии, с которой вы будете работать. Скорее всего, вы будете запускать "выпускную" версию FreeBSD (это версии, поставляемые на компакт-дисках). Если это так, то в поле Release Name (Имя выпуска) будет указана точная версия системы, с которой вы работаете (например, 6.1-release для версии, прилагаемой к этой книге). Однако если вы модернизировали свою систему до промежуточной точки в ветви -stable или -current, этому полю может быть присвоено #.#-stable((B8 знак решетки (#) отвечает за номера старшей и младшей версии. Это значение не будет работать, если вы попытаетесь открыть меню Packages (Пакеты), поскольку оно пытается обратиться к каталогу на сервере, имя которого основано на номере версии, взятом прямо из вывода команды uname, которая дает информацию о версии ядра. Соответствующий каталог для пакетов которые совпадают с версией вашей системы, не обязательно будет иметь то же имя, что и имя указанное в поле Release Name (Имя выпуска).
Установка дополнительного программного обеспечения Глава 16 515 Доступные каталоги ВЫПУСКОВ МОЖНО найти ПО адресу ftp://ftp.FreeBSD.org/pub/FreeBSD/ releases/ (перейдите в подкаталог вашей платформы). Если у вас установлена версия 6.1-release, вам потребуется каталог i386/6.i-RELEASE. Если ваша система была пересобрана из исходных кодов -stable, выберите самый свежий каталог -release. В нижней части экрана, показанной на рис. 16.2, вы увидите однострочное "краткое описание** каждого пакета. Когда вы найдете необходимый пакет, нажмите клавишу пробела, чтобы отметить его крестиком (х). Выберите Cancel (Отменить) (нажмите клавишу со стрелкой вправо), чтобы выйти из категории. Таким способом вы можете просмотреть все доступные категории, если только вы не выберете длинный список необходимых вам пакетов; по завершении перейдите с помощью клавиши <ТаЬ> к кнопке Install (Установить) в нижней части экрана, чтобы инсталлировать их всех одним махом. НА ЗАМЕТКУ Обратите внимание на то, что выбор кнопки Install (Установить) является единственным способом выхода из меню Packages (Пакеты). Если вы не выберете ни одного пакета для инсталляции, вам все равно придется выбрать кнопку Install (Установить) (и согласиться с тем, что вы ничего не выбрали для инсталляции), чтобы выйти в главное меню Sysinstall. Теперь программа пройдется по списку и загрузит по одному каждый пакет, распаковывая его в каталог /usr/tmp и устанавливая с помощью программы pkg_add, элемента командной строки для данной фазы диспетчера упаковки FreeBSD (его можно применять независимо от Sysinstall). Если пакет имеет какие-нибудь зависимости, Sysinstall сначала найдет и инсталлирует их, а затем вернется к установке выбранных вами пакетов. Выйдите из Sysinstall с помощью опции Exit Sysinstall (Завершить Sysinstall), которая расположена в нижней части экрана. Теперь ваши новые пакеты установлены — сделано все, что нужно. Вся документация (man-страницы) готова к использованию, конфигурационные файлы находятся в каталоге /usr/local/etc, а бинарные файлы- в каталоге /usr/local/bin. Введите команду rehash, чтобы обновить доступные программы, о которых знает ваша текущая оболочка (или выйдите из системы и снова войдите в нее), и вы сможете работать с программами. Как было сказано в главе 14, некоторые программы перед их применением необходимо конфигурировать. Перейдите в каталог /usr/local/etc и проверьте конфигурационный файл (обычно его имя имеет формат имя^программы.conf или тя_программы. с fg, или просто иьля^программы). Файл, имеющий в конце расширение .sample (образец), представляет собой образец файла, и вам нужно будет скопировать его в реальный рабочий конфигурационный файл (не имеющий расширения .sample), а затем внести некоторые дополнительные изменения, прежде чем программа сможет использовать его. Откройте файл в текстовом редакторе и сделайте все, что нужно сделать, опираясь на комментарии в самом файле или на man-странице этой программы. После того как первый файл будет сконфигурирован, проверьте содержимое подкаталога re. d и посмотрите, нет ли в нем файлов запуска с таким же именем; если такие файлы есть, сделайте с ними то же самое, если это необходимо.
I JTTZ 1 Системное администрирование I 51B I ЧмтЫУ Использование утилиты pkg_add Сам процесс установки в FreeBSD может проходить несколькими способами. Поскольку исполняемые файлы, конфигурационные файлы и библиотеки хранятся в стандартном и централизованном месте, то в мире операционных систем для настольных систем вам не будут задаваться вопросы в форме диалога относительно того, куда вы хотите инсталлировать программу, и вам не будут предлагаться особые варианты установки. Эти ограничения инсталляции являются прямым свидетельством того, что по сравнению с Linux инсталляция в FreeBSD выполняется в более "закрытом" режиме, и для платформы всегда имеется модель централизованного распространения любых программ с открытым кодом. Однако бывают случаи, когда вам могут понадобиться более широкие возможности по управлению пакетом, нежели те, которые предлагает программа Sysinstall. В качестве примеров можно привести пакеты, имеющие интерактивные предустано- вочные сценарии (в них вы можете установить опции, специфические для данного пакета), и ситуации, в которых автоматизированная установка Sysinstall не может справиться с задачей. Для подобных случаев вам понадобится утилита pkg_add; она применяется во время каждой инсталляции пакета, независимо от того, вызывается она напрямую или через Sysinstall. Утилита pkg_add предназначена для работы с . tbz- или . tgz-файлом, который вы уже должны были загрузить (из каталога распространения для данного выпуска, как было сказано ранее), или для работы с удаленным файлом, определяемым через его URL-адрес. Например, следующие две процедуры приблизительно эквивалентны друг другу: # fetch ftp://ftp.FreeBSD.Org/pub/FreeBSD/releases/i386/6.0-RELEASE/ ^packages/www/webstone-2.5.tbz # pkg_add webs tone-2.5. tbs и # pkg_add ftp://ftp.FreeBSD.Org/pub/FreeBSD/releases/i386/6.0-RELEASE/ ^pacXages/www/webetone-2.5.tbz Естественно, последний метод является более удобным, поскольку он не только исключает отдельные шаги в загрузке и инсталляции пакета, но и делает всю свою работу в каталоге /usr/tmp (или в похожем каталоге для временных файлов), по окончании которой удаляет все вспомогательные файлы. Однако первый метод позволит вам хранить исходные . tbz-файлы в локальном каталоге (например, в ~/tarballs), так что вы сможете повторно инсталлировать их из него позже, не выполняя их загрузку. Утилита pkg__add отслеживает также зависимости, как если бы вы использовали ее посредством Sysinstall. Если вы применяете pkg_add для добавления пакета, имеющего зависимости, то утилита автоматически загрузит и установит зависимости, правде чем продолжить инсталляцию самого пакета. Это позволяет гарантировать, что по окончании работы этой утилиты вы получите полностью рабочую программу СОВЕТ Используйте команду pkgadd -nv, чтобы сделать "пробную" инсталляцию. Не выполняя самой инсталляции, вы сможете узнать о действиях, предпринимаемых утилитой pkgadd во время инсталляции.
Установка дополнительного программного обеспечения I TTZ—I Гп»»а1в [ 517 | НА ЗАМЕТКУ Утилита pkgadd выдаст предупреждение, если скомпилированный пакет зависит от другого па* кета, который вы установили, но номер его версии окажется младше, чем это необходимо: pkg_add: warning: package 'xorg-libraries-6.8.2f requires 'pkgconfig-O.17.2', but 'pkgconfig-Q.lS.G' is installed pkg_add: warning: package 'xorg-libraries-6.8.2* requires 'freetype2-2.1.10_1', but 'freetype2-2.1.5_l' is installed Если вы получите подобные предупреждения, модернизируйте указанные пакеты как можно скорее, чтобы не допустить возникновения проблем с совместимостью. Еще более удобный способ инсталляции пакетов, при котором вам вообще не нужно посещать FTP-сайт, заключается в использовании опции -г утилиты pkg_add. Она позволяет задействовать автоматизированную "удаленную выборку", используя которую вам не нужно знать номер нынешней версии требуемого пакета, или даже версии вашей собственной операционной системы. За вас все сделает диспетчер пакетов. Просто укажите имя требуемого пакета без строки с номером версии, добавьте флаг -г, и утилита pkgadd определит тип вашей платформы и номер версии, и с одного захода установит пакет. Ниже показан пример: # pkg_add -r webs tone Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-release/ Latest/webstone.tbz... Done. Выборка ftp://ftp. freebsd. org/pub/FreeBSD/ports/i386/packages-6-release/ Latest/webstone.tbz... Готово. В некоторых случаях после завершения инсталляции пакетов на экран выводятся инструкции по конфигурированию. В этом-то и состоит преимущество установки пакетов из командной строки, а не с помощью Sysinstall. Еще одно преимущество заключается в том, что Sysinstall не сообщает о размере файла любого пакета, поэтому вам придется просто позволить программе выполнить загрузку, не сообщая о состоянии этого процесса ничего, кроме скорости передачи данных. Если для поиска пакета в его FTP-каталоге вы используете браузер, то в нем вы найдете размер пакета и, как минимум, будете знать, насколько долго будет длиться загрузка. Замечания по источникам пакетов Структура каталогов на FTP-сайте FreeBSD такова, что каждый пакет на самом деле является символической ссылкой, поэтому в действительности размеры файлов нельзя будет узнать, если вы будете добираться до них из предыдущего URL-адреса. Если немного постараться, то вы получите информацию, хотя она не будет стоить затраченных усилий. Обратите внимание на то, что утилита pkg_add работает с .tbz-файлами, взятыми из любого места, а не только из сайта FreeBSD. Однако следует остерегаться файлов из "подозрительных" мест; добавление пакета представляет собой акт доверия, позволяющий кому угодно написать пакет, определяющий файлы, которые будут помещены в каталоги, где хранятся исполняемые файлы пользователей, возможно, даже с перезаписью других файлов. (Вот почему обычным пользователям, как правило, запрещено устанавливать пакеты и порты.) Вирусы и "троянские кони" являются очень редкими гостями в мире UNIX, тем не менее, добросовестному администратору нужно всегда помнить о потенциальных угрозах, особенно при установке пакетов!
518 Системное администрирование Часть IV Если вы остаетесь приверженцем Sysinstall или хотя бы .tbz-файлов, обнаруженных на FTP-сай- i те FreeBSD, вы можете быть уверенным в том, что все пакеты проверены на пригодность в использовании и включают контрольную сумму MD5 для проверки их аутентичности, которую можно выполнить с помощью утилиты md5: # md5 webstone-2.5. tbz Вы можете сравнить строку вывода из этой команды с содержимым файла контрольной суммы, который часто предлагается вместе с пакетом, чтобы перед установкой пакета убедиться в том, что они совпадают. Вы можете также определить множество пакетов, запустить утилиту в подробном режиме и запретить ей выполнение предустановочных или постустановочных сценариев. Вы можете даже запретить ей регистрацию инсталлированного пакета. Эти и многие другие опции описаны на man-странице инструмента pkg_add. Удаление и обновление пакетов Sysinstall не имеет интерфейса для удаления пакетов. На самом деле, он вам не нужен, так как после установки пакета вы сможете указывать его имя напрямую при использовании инструментов управления пакетами командной строки. Чтобы посмотреть, какие пакеты установлены, можно воспользоваться утилитой pkg_inf о, о чем уже упоминалось ранее. Вы можете также просто просмотреть каталог /var/db/pkg; имена каталогов в нем совпадают с именами пакетов. После того как вы определитесь с именем пакета, который хотите удалить, просто воспользуйтесь утилитой pkg_delete, как показано ниже: # pkg_delete pine-4.60 Если пакет имеет какие-либо зависимости, утилита pkg_delete обнаружит их и отменит удаление, если только вы не запустите ее с опцией -f, которая обозначает обязательную деинсталляцию. Кроме того, она попытается запустить любые сценарии деинсталляции и оценит любые операторы require; если их выполнить не удастся, pkg_delete не сможет продолжить работу (если только не указана опция -f). Как и в случае с pkg_add, вы можете использовать несколько опций, включая подробный режим (-v) и "пробный" режим (-п), Модернизация инсталлированных пакетов Если вы попытаетесь установить более новую версию уже инсталлированного пакета, утилита pkg_add завершит свою работу и выдаст следующее сообщение об ошибке: * Pkg_add pine-4.63. tbz pkg_add: package 'pine-4.63' or its older version already installed pkg__add: пакет 'pine-4.63' или его более старая версия уже установлен Это сообщение означает, что сначала вам нужно удалить сам пакет, а затем приступать к инсталляции его новой версии. Сначала удалите пакет с помощью утилиты pkg_delete (эта процедура была рассмотрена выше), а затем с помощью pkg_add установите самую последнюю версию пакета, либо из загруженного . tbz-файла, либо с использованием опции -г для автоматического выбора наиболее свежей версии пакета.
Установка дополнительного программного обеспечения | Г7Т I Глава 16 I 1 Введение в порты На данный момент вы знаете о существовании пакетов и инструментов, которые FreeBSD предлагает для работы с ними. Порты (port) предлагают другой способ инсталляции программного обеспечения в FreeBSD. Порты используются ДЛЯ КОМПИЛЯЦИИ программ прямо из исходного кода в рамках автоматизированной процедуры, которая управляет и защищает процесс установки, поскольку в данном случае вы захватываете исходные коды прямо с сайта распределения каждой программы. В то время как применение пакетов весьма удобно, традиционный для UNIX способ инсталляции новых программ всегда сводился к тому, что вы должны были компилировать их самостоятельно. Администратор находит сайт распределения (с помощью HTTP или FTP, а раньше для этого использовались такие инструменты, как Gopher или Archie), загружает исходный код, упакованный в .tar.gz- или .tgz- файле (или .tbz), и распаковывает его в какой-нибудь временный каталог. После того как администратор прочитает в файлах README всевозможные инструкции, он, как правило, запускает сценарий configure, который проверяет систему на разнообразные вызовы функций (в мире UNIX эти вызовы отличаются от платформы к платформе) и генерирует соответствующий сценарий компиляции, основываясь на том, какие функции доступны для использования в программе. Следующий шаг состоит в компиляции программ с помощью make — инкапсулированного инструмента управления компиляцией, который читает цели сборки и необходимые шаги из файла Makefile, расположенного в главном каталоге исходных файлов. После успешной (надо надеяться) компиляции администратор должен найти новый, недавно созданный исполняемый файл и вручную скопировать его в публично доступное место доя бинарных файлов (например, /usr/ local /bin). Однако в самом лучшем случае в файле Makefile должна быть цель "инсталляции", поэтому если ввести команду make install, требуемые файлы будут скопированы в подходящее место (если администратору повезет). Эта операция установки является (вернее, била) очень неаккуратной; иногда она работала, иногда нет. В подавляющем большинстве случаев она отчасти работала. Программы, распространяемые в исходной форме, обычно нормально работали в системах, подобных той, которую использовал автор; а вот попытка скомпилировать их на другой платформе в идеальных случаях обычно приводила к возникновению нескольких незначительных противоречий относительно мест инсталляции, а в других случаях — к полному провалу компиляции. Сопровождать такие программы было невозможно, их производительность была непредсказуемой, а репутация UNIX как загадочной и сложной системы становилась от этого только сильнее. Теперь обратимся к портам FreeBSD. Порты предлагают компилировать программы непосредственно из исходного кода с помощью жестко регламентированной, структурированной, автоматизированной процедуры, которая гарантирует безопасность и целостность устанавливаемых вами программ, и позволяет захватывать исходный код прямо с сайта распространения каждой программы (или из резервного места, например, с центрального сервера FreeBSD, если с первого источника загрузить код не удастся). Это означает, что вы можете оставаться в курсе самых последних разработок программного обеспечения, не ожидая появления предварительно скомпилированного двоичного пакета, который может не заработать в тщательно настроенной системе.
520 Системное администрирование Часть IV Инсталляция порта позволяет также тысячам различных элементов программного обеспечения устанавливать все свои компоненты в подходящие места в файловой системе FreeBSD, при этом разработчикам не нужно даже беспокоиться об открытой поддержке структуры системы FreeBSD. Это возможно благодаря широкому кругу лиц, сопровождающих свои программы, добровольцев среди пользователей FreeBSD, которые следят за изменениями в закрепленных за ними портах и поддерживают сценарии, корректирующие процедуры сборки и установки программ, после чего они могут гладко работать в FreeBSD. Когда разработчик обновляет свои программы, то человек, сопровождающий порты, пытается скомпилировать их в FreeBSD, после чего производит необходимые изменения в правках кода и сценариях установки, сглаживающих работу программ в FreeBSD. После этого порт просто представляет собой совокупность этих сценариев и правок в одном пакете, находящемся в определенном месте вашей FreeBSD-машины, и содержит специальный файл Makefile, который позволяет инсталлировать программы путем ввода команды make install. Никакой загрузки, никакого конфигурирования, никакого применения правок, никакого копирования. Вся эта работа делается за вас. Система портов в FreeBSD была столь успешной, что ее переняли и в других системах, в частности, в OpenBSD и NetBSD, и она поспособствовала появлению похожих систем в Gentoo Linux и Mac OS X/Darwin. Ее успех можно объяснить двумя вещами: ее способностью осчастливливать администраторов UNIX, предпочитающих компилировать свои собственные программы (или благодаря полному осознанию безопасности, или вследствие их стремления к лидерству), и способностью упростить отслеживание версии и сопровождение, чем может похвастаться система упаковки. Она действительно является наилучшим вариантом для обоих миров. Дерево портов FreeBSD Коллекция портов находится в каталоге /us r/ports. Перейдите прямо сейчас в этот каталог и просмотрите его содержимое. То, что вы увидите в нем, должно быть похожим на содержимое, показанное в листинге 16.4. Вы заметите, что каждая категория, которую вы видели в программе Sysinstall, здесь представлена в виде каталога. (Данный список не может быть точным на все сто процентов, поскольку категории очень часто реорганизуются.) Листинг 16.4. Каталоги в каталоге /usr/ports # Is - total 2 34 2 6768 4 32 106 б 2 2 4 2 2 86 8F /u8r/port8/ 7422 .cvsignore CHANGES COPYRIGHT INDEX-6 KNOBS LEGAL MOVED Makefile Mk/ README README.html Templates/ Tools/ UPDATING 4 38 2 2 6 4 2 2 2 16 2 14 2 2 deskutils/ devel/ distfiles/ dns/ editors/ emulators/ finance/ french/ ftp/ games/ german/ graphics/ hebrew/ hungarian/ 4 2 2 2 2 2 8 2 2 12 2 14 20 2 net-mgmt/ news/ palm/ picobsd/ polish/ Portuguese/ print/ russian/ science/ security/ shells/ sysutils/ textproc/ Ukrainian/
Установка 2 accessibility/ 2 arabic/ 4 archivers/ 2 astro/ 14 audio/ 2 benchmarks/ 2 biology/ 2 cad/ 4 Chinese/ 4 comms/ 2 converters/ 10 databases/ [ НА ЗАМЕТКУ дополнительного 4 ire/ 10 Japanese/ 4 Java/ 2 korean/ 6 lang/ 14 mail/ 6 math/ 2 mbone/ 12 misc/ 6 multimedia/ 22 net/ 2 net-im/ программного обеспечения Глава 16 2 Vietnamese/ 521 24 www/ 6 xll/ 2 xll-clocks/ 2 xll-fm/ 2 xll-fonts/ 2 xll-servers/ 6 xll-themes/ 6 xll-toolkits/ 4 xll-wm/ Содержимое каталога /usr/ports по своей природе не зависит от структуры ветвей разработки FreeBSD. Новая выпущенная копия системы будет иметь копию портов, созданных на момент выпуска системы, однако она тут же устаревает, как только в ней видоизменяются порты по мере выхода новых версий переносимых программ. Если вы синхронизируете свое дерево портов с центральным хранилищем (об этом мы поговорим позже), то оно всегда будет таким, каким являлось на момент синхронизации. Фиксированного состояния дерева портов, приписываемого к каждому выпуску, как в случае с пакетами, не существует. Таким образом, эти образцы листингов каталогов практически всегда будут несколько отличаться от той картины, которую можно наблюдать в вашей системе. Это также означает, что если вы попытаетесь поддерживать множество систем FreeBSD с идентичными программами, то вместо системы портов вам следует использовать пакеты. Первые несколько каталогов (каталоги, имена которых начинаются с заглавных букв, используют преимущество соглашения UNIX о раздельном упорядочении пер- вых букв алфавита в нижнем регистре и первых букв в верхнем регистре, в соответствии с набором символов ASCII) являются структурными элементами системы портов, помощниками, благодаря которым система может работать. Здесь вы найдете также информативные текстовые файлы вроде MOVED, содержащие самый последний список недавно перемещенных или удаленных портов (включая пояснения по каждому изменению). Остальные каталоги являются категориями портов. Загляните внутрь какого-нибудь из них, и вы увидите сотни различных каталогов портов, как показано в весьма сокращенном листинге 16.5. Листинг 16.5. Некоторые из портов в категории (каталоге) 2 mp32ogg/ 2 mp3_check/ 2 mp3asm/ 2 mp3blaster/ 2 трЗЬигп/ 2 mp3butler/ ' 2 трЗс/ 2 mp3check/ 2 трЗск/ 2 mp3encode/ ¦ 18 - total 2 2 16 2 2 2 2 2 2 2 sF /usr/ports/audio/ 1206 HVSC-Update/ Maaate/ Makefile abede/ abemidi/ abcselect/ ac3dec/ adpcm/ adplay/ afsp/
522 Системное администрирование Часть IV НА ЗАМЕТКУ Несмотря даже на то, что порты хранятся в категориях по их функциональной принадлежности, их имена не должны конфликтовать — порт в audio не может иметь то же имя, что и порт в sysutils, даже если они находятся в разных каталогах. Это объясняется тем, что после инсталляции все порты будут храниться в одной простой базе данных (/var/db/pkg), в которой нет разделения по категориям. Категории есть только в /usr/ports, и то они предназначены для того, чтобы вам удобнее было искать порты по их типам. Просмотр портов подобным способом не является оченьто эффективным, особенно в больших категориях (на момент написания этой книги в каталоге /usr/ports/ audio насчитывалось 596 портов). А как быть, если вы знаете имя порта, который хотите инсталлировать, но не знаете, в какой категории он находится? В этом случае можно воспользоваться командой locate, которая поможет отыскать порт по имени: # locate undeview /usr/ports/converters/uudeview Однако до тех пор, пока не будет изначально собрана база данных locate (после установки FreeBSD на это может уйти целый год), команда не будет работать. Выдайте команду /usr/libexec/locate.updatedb, чтобы собрать базу данных вручную, и чтобы можно было использовать locate. Анатомия порта FreeBSD Внутри каждого каталога порта имеется ряд файлов, общий размер которых не превышает нескольких килобайт. Эти файлы полиостью определяют все настройки и модификации, которые необходимо сделать для только что загруженной порции исходного кода, чтобы его можно было без проблем скомпилировать и инсталлировать в FreeBSD. Эти файлы перечислены в табл. 16.2 (это неполный список — некоторые порты имеют дополнительные файлы). Таблица 16.2. Файлы в каталоге портов Файл Назначение Makefile Содержит некоторые переменные, используемые в процессе сборки, а также контактную информацию человека, поддерживающего порт. README.html Содержит "краткое описание" (или комментарий) порта в формате HTML distinf о Контрольная сумма MD5, используемая для проверки аутентификации загруженного .tbz-файла. files/ Заплаты, применяемые к исходному коду после его распаковки, и вспомога- runme. sh тельные файлы, специфические для FreeBSD; в каждом отдельном порту они patch-aa будут разными. patchfab pkg-comment "Краткое описание" порта. pkg-descr "Длинное описание" порта, которое обычно включает URL-адрес сайта распространения, принадлежащего разработчику. pkg-piist "Список упаковки", в котором перечислены все файлы, которые необходимо установить, а также ключевые слова, сообщающие системе портов о том, что нужно делать в случае деинсталляции порта (например, удалять каталоги и неизмененные файлы).
Установка дополнительного программного обеспечения 523 Глава 16 Makefile представляет собой файл, имеющий критически важные элементы дл; сборки, конфигурирования, установки и обслуживания порта. В листинге 16.6 пока зано, что обычно находится в файле Makefile. Листинг 16.6. Обычный файл Makefile порта # New ports collection makefile for: amp # Date created: Jun 23 1997 # Whom: Vanilla I. Shu <vanilla@MinJe.com.TW> # # $FreeBSD: ports/audio/amp/Makefile,v 1.16 2005/04/17 15:19:40 novel Exp $ # PORTNAME* P0RTVERSION» P0RTEPOCH* CATEGORIES* MASTER_SITES= MAINTAINED COMMENT* GNU_CONFIGURE= USE GMAKE* amp 0.7.6 1 audio http://www-users.cs.umn.edu/~wburdick/ftp/ delphus@gmaii.com Another mp3 player yes yes MAN1= amp.l PLIST_FILES= bin/amp do-install: 0 ${INSTALL_PROGRAMj ${WRKSRC}/amp ${PREFIX}/bin @ $ {"INSTALL_MAN} ${WRKSRC}/amp.1 ${PREFIX}/man/man1 .include <bsd.port.mk> Список переменных стиля оболочки говорит о том, откуда взяты исходные коды для порта, сообщает текущую версию для файла Makefile, и показывает, как обратиться к человеку, поддерживающему порт. MAINTAINER — это доброволец, обычно не являющийся членом какой-либо группы, разрабатывающей ПО, но являющийся активным членом сообщества FreeBSD. В круг его обязанностей входит обеспечение нормальной компиляции и установки порта и внесение соответствующих изменений в порт с выходом самой последней версии ПО. Большинство файлов Makefile содержат цели, такие как clean, install и all. Не все файлы Makefile в портах содержат эти цели, однако они имеют включенный центральный файл Makefile (bsd.port .mk, который хранится в каталоге /us г/ ports/Mk вместе с другими включенными файлами). В этом файле содержатся стандартизированные цели сборки. Индивидуальные файлы Makefile в каждом порту служат в качестве замен или приращений (точно так же, как файл /etc/rc. conf относится к /etc/defaults/rс.conf), задавая необходимые переменные для сборки и определяя дополнительные цели, которые будут использоваться в автоматизированном процессе компиляции.
524 Системное администрирование Часть IV Установка и удаление портов Предположим, что вам приглянулся какой-то порт, и вы решили установить его. Вот как это делается. Вам нужно всего лишь перейти в каталог порта (с помощью команды cd) и ввести команду make. В результате выполнения этой команды будут скомпилированы программы. После этого нужно ввести команду make install, чтобы инсталлировать программы. На первый взгляд это очень простой процесс, однако он очень многое скрывает от нас. Команда make на самом деле выполняет серию последовательных целей make (они описаны в табл. 16.3). Каждая из них зависит от того, были ли успешно завершены все предыдущие цели. Вы можете определить любую из этих целей напрямую, что позволит вам собрать все необходимые цели и включить ту цель, которую вы определяете. Таблица 16.3. Цели make в файле Makefile порта Цель Действие fetch Загружает исходный .tbz-файл из главного файла в каталог /usr/ports/distfiles. checksum Определяет подлинность .tbz-файла с помощью контрольной суммы MD5. extract Распаковывает .tbz-файл в подкаталог work. patch Применяет "заплаты" из каталога files к исходному коду. configure Запускает сценарий configure, который подготавливает исходный код к сборке. build Компилирует исходный код. Например, если ввести команду make extract, то будет загружен файл исходного кода, сопоставлена его контрольная сумма MD5, после чего он будет распакован. Несмотря на наличие других целей (они перечислены в /usr/ports/Mk/bsd.port.mk), в большинстве случаев вам не нужно будет применять какую-либо из них. После того как будет выполнен каждый шаг из этого процесса (за исключением fetch и checksum), файл будет создан в подкаталоге work в виде .extract_done. Вот почему система отслеживает выполняемые шаги. (Чтобы посмотреть, выполнен ли шаг fetch, она просто проверяет существование .tbz-файла в каталоге /usr/ports/ distfiles.) Шаг extract неявным образом загружает шаг checksum. После этого шаги выполняются последовательно и независимо, и они проверяют, какие еще шаги нужно выполнить, путем поиска соответствующих файлов . *_done. Если вам нужно внести какие-либо изменения в исходный код до компиляции, можете выполнить команду make patch, которая подготовит исходный код к компи ляции, а затем произвести запланированные изменения в исходном коде в каталоге work. После этого можно будет завершить этот процесс с помощью команды make. Зависимости обрабатываются автоматически портами, точно так же как и в случае с пакетами. Любые зависимости считываются из файла Makefile во время фазы fetch или install, а затем загружаются, собираются и инсталлируются. Вы будете получать сообщение в выводе сборки каждый раз, когда будет обнаружена зависимость, невзирая на то, была ли она уже инсталлирована. После того как порт будет инсталлирован, в базу данных заносится запись /var db/pkg; сейчас это пакет, пригодный для любого применения. Вы можете использо-
Установка дополнительного программного обеспечения Глава 16 вать в нем инструменты pkg_* для сбора информации и сравнения его версии, как и в случае с пакетами, установленными из Sysinstall. СОВЕТ В портах имеется цель deinstall (make deinstall). Эта цель используется в том случае, если версия инсталлированного порта такая же, как и у файла Makefile — по сути, вы удаляете именно тот программный пакет, который вы инсталлировали. Если вы обновляете порты таким обра* зом, чтобы версия порта (в файле Makefile) была выше, чем установленная версия, вы не сможете использовать команду make deinstall, чтобы удалить его. Вместо этого нужно применять инструмент pkg_delete, точно так же, как и в случае с пакетом. Обновление и обслуживание портов Изменения в программном обеспечении, а также в среде открытого исходного кода, происходят постоянно. В коллекции насчитывается примерно 14 000 портов, и каждый из них постоянно дорабатывается (над одними портами работа ведется быстрее, чем над другими). Системные администраторы подтвердят, что невозможно установить или модернизировать программы, не отставая от темпов разработки. Лучшее, на что вы можете надеяться — это поддержание актуальности вашей коллекции портов и использование встроенных инструментов, таких как pkg_version, позволяющих следить за тем, что необходимо модернизировать. СОВЕТ Если вы регулярно собираете программы из портов, заимейте себе привычку читать регулярно обновляемый файл /usr/ports/UPDATiNG и отмечать те изменения в портах, которые могут вас заинтересовать. Особое внимание в каждом обновлении следует обращать на строку affects :, поскольку в ней перечисляются определенные пользователи различных портов, которым нужно будет знать специальные инструкции по модернизации или важные замечания по вопросам защиты. Поддержка актуальности портов с помощью инструмента CVSup Для поддержания портов в синхронизированном состоянии наилучшим инструментом является CVSup. Мы подробно рассмотрим CVSup в главе 19. Поскольку CVSup является важным инструментом для эффективной работы с портами, нужно будет разобрать простейшие случаи его использования, хотя область его применения очень широка. Во-первых, установите пакет csvup либо с помощью системы пакетов, либо соберите его из портов. В действительности, лучше всего использовать вариант с пакетами, поскольку инструмент CVSup написан на языке Modula-З, а, значит, его сборка из исходного кода будет включать сборку нескольких крупных зависимостей Modula-3, на что может уйти целая вечность и потребуется уйма библиотек, которые вам, возможно, ни для чего другого никогда не понадобятся. Воспользуйтесь инсталляцией пакетов, чтобы пропустить пока что этот вариант. 525
526 Системное администрирование Часть IV НА ЗАМЕТКУ Большое количество портов имеет ту же проблему, что и CVSup: для них необходимо собрать и установить огромное количество программ-зависимостей, которые вам могут не понадобиться, или вы не хотите, чтобы они присутствовали в системе. Например, сборка простой графической библиотеки может привести к тому, что вся система Х11 будет загружена, скомпилирована и инсталлирована без вашего ведома. Поэтому по мере возможности следует использовать пакеты, а не порты. После этого необходимо создать конфигурационный файл CVSup, известный как sup-файл. Целью этой задачи является обновление портов, поэтому назовем этот файл как ports-supf ile. Как и с другими конфигурационными файлами, создаваемыми вами для этой задачи, которые не являются частью базовой системы, лучше всего поместить этот файл в каталог /usr/local/etc. В листинге 16.7 показано содержимое соответствующего sup-файла, необходимое для обновления ваших портов. Листинг 16.7. Конфигурационный файл CVSup для обновления ваших портов (/usr/local/etc/ports-supfile) *default host*cvsupl2.FreeBSD.org ¦default base=/usr ¦default prefix»/usr ¦default release=cvs ¦default tag-. ¦default delete use-rel-suffix ports-all sup-файл имеет настраиваемые опции, большинство из которых будут рассматриваться в главе 19. А пока что вам следует обратить внимание на строку ¦default host=, которая должна указывать на один из центральных CVSup-серверов FreeBSD. Таких серверов насчитывается 18, и их имена индексируются от cvsupl до cvsupl8. Каждое имя представляет собой псевдоним хранилища исходного кода, находящегося где-то в мире. Чтобы узнать, где находится каждый хост, нужно произвести его поиск (host cvsupl2. freebsd.org) и посмотреть, можно ли по имени хоста узнать о его местонахождении, однако вполне возможно, что с помощью этой технологии вам потребуется проверить каждый из хостов CVSup, чтобы найти тот, который расположен ближе всего к вам. Теперь запустите процесс обновления CVSup: # /usr/local/bin/cvsup -L 2 /usr/local/etc/ports-supfile CVSup подключится к выбранному серверу CVSup и приступит к синхронизации вашей коллекции портов. Благодаря опции -L 2 (она определяет самую высокую степень подробности), вы сможете увидеть все изменения, которые существуют между установленной версией и просматриваемой вами текущей версией. CVSup обновляет только те файлы, которые были изменены, а затем обновляет только измененные части (с помощью заплат dif f). Так вы сможете обновить всю коллекцию портов, передавая минимум данных и занимая минимальный объем полосы пропускания. Обновление с помощью CVSup может быть выполнено эффективно и быстро даже при низкоскоростном сетевом подключении.
Установка дополнительного программного обеспечения Глава 16 СОВЕТ Если вы запускаете CVSup в рамках сеанса Х11, то он с помощью GUI-интерфейса клиента покажет вам в отдельном окне статистические данные о процессе обновления. Вы можете отключить это поведение и переключить CVSup в режим CLI, добавив опцию -д в командную строку. После того как синхронизация будет завершена, ваша коллекция портов станет актуальной, и будет являться таковой "на последнюю минуту". Теперь можно выполнить команду pkg_version -v, чтобы посмотреть, какие порты необходимо обновить. Возможно, вам понадобится сделать так, чтобы этот процесс синхронизации стал частью повседневной работы вашей системы, чтобы ваши порты не устаревали более чем на 24 часа. Для этого добавьте предыдущую команду CVSup в ежедневные файлы periodic (см. раздел "Использование планировщика периодических задач" в главе 15). Если этих файлов у вас нет, создайте каталог под именем periodic в каталоге /usr/local/etc, а в нем создайте еще один каталог daily. Внутри каталога daily создайте файл по имени, например, 100 .cvsup-ports, и поместите в него следующие строки: #!/bin/eh /uer/local/bin/cveup -g -L 2 /uer/local/•tc/cvsupfil* Теперь каждую ночь при выполнении сценария periodic будет синхронизироваться ваша коллекция портов. Выходные данные CVSup будут посылаться вам по электронной почте при ежедневном обновлении состояния системы. Если вы не хотите получать электронные письма после регулярного еженощного выполнения CVSup, можно отменить вывод CVSup с помощью опции -L 0 вместо -L 2; как результат, вы будете получать электронные письма только в случае возникновения ошибки. Замечания по запрещенным портам Иногда порт бывает представлен в виде коллекции портов, однако система не разрешит вам собрать его. За это поведение отвечает переменная FORBIDDEN в файле Makefile. Если эта переменная присутствует, то любой текст, присвоенный ей, будет отображаться на экране, когда вы попытаетесь собрать порт, и процесс сборки будет отменен: # cd /usr/ports/databases/gnats # make **=> gnats-3.113.l_12 is forbidden: Security issues. =~> gnats-3.113.1_12 запрещен: Проблемы безопасности. Порт может быть отмечен как "forbidden" (запрещенный) по нескольким причинам. В данном примере это объясняется тем, что сама программа имеет некоторые трудноразрешимые проблемы с безопасностью, которые делают ее опасной для установки. В других случаях порт может быть запрещен по той причине, что он является частью базовой системы, и сборка его из портов может быть излишней и, возможно, может нанести вред работе системы. В любом случае, это прекрасно подтверждает, что по мере возможности вы должны регулярно синхронизировать ваши порты с сервером CVSup.
528 Системное администрирование Часть IV Инсталляция запрещенного порта редко оказывается разумной идеей, хотя это можно сделать, просто удалив строку FORBIDDEN из файла Makefile. Некоторые запрещенные порты обеспечивают встроенный способ замены блока посредством задания переменной окружения, как в следующем примере порта security/ssh (который больше не обладает таким поведением, но другие порты все же могут работать подобным образом): # cd /usr/^orts/seourity/ssh # make —> ssh-1.2.27_3 is forbidden: OpenSSH is a superior version of SSH which has been included in the FreeBSD base system since 4.0-RELEASE. This port is now deprecated and will be removed at some point in the future. To override this warning set the REALLY_WANT_SSH environment variable and rebuild. mm»> ssh-1.2.27_3 запрещен: OpenSSH является более ранней версией SSH, которая была включена в базовую систему FreeBSD, начиная с версии 4.0-RELEASE, На данный момент этот порт исключен и будет в будущем удален. Чтобы заменить это предупреждение, задайте переменную окружения REALLY_WANT^SSH и выполните пере сборку. Согласно инструкции, зададим указанную переменную окружения и попробуем все сначала. Если вы используете csh или tcsh, то это делается так: # eetenv REALLYJOUITjSSH yes Вариант с использованием bash будет таким: # R?ALLY_WANT_SSH=yee После установки переменной выполните еще раз команду make. Порт должен быть собран без проблем. Восстановление пространства на жестком диске посредством процесса сборки порта После того как вы закончите сборку и установку порта, каталог work все равно будет присутствовать и будет содержать нераспакованное дерево исходного кода и скомпилированные бинарные библиотеки. Все это может занимать очень много места на диске. Рекомендуется всегда очищать этот каталог после .инсталляции — возвращая порт к его первоначальному состоянию — путем выполнения еще одной команды make, на этот раз с целью clean: # make clean Эта команда удалит каталог work и все, что находится внутри него. Она также очистит каталог порта для каждой перечисленной зависимости. Однако она не удалит . tbz-файлы из/usr/ports/distfiles; вам придется удалить их самостоятельно. СОВЕТ Если только вам действительно не нужно пространство на диске, вы можете оставить . tbz-фай- лы нетронутыми в каталоге /usr/ports/distf iles. Так вы можете сэкономить уйму времени - если вам когда-нибудь понадобится заново собрать или заново установить порт, система сможет использовать уже имеющийся файл, не загружая его снова.
Установка дополнительного программного обеспечения Глава 16 Прелесть портов заключается в том, что если в инсталлированном вами порту будет заделана брешь в безопасности или устранена критическая ошибка, то коллекция портов сможет справиться с этой проблемой, поместив файл заплаты в каталог files порта, а не анализируя номер версии всего дистрибутивного файла (и вынуждая вас загружать новый . tbz-файл), Простая лересборка позволит включить новую заплату в существующие старые исходные файлы. Периодически у вас может возникать необходимость в выполнении низкоуровневой рекурсивной очистки с помощью команды make clean в отношении всей коллекции портов. На уровне /usr/ports, а также в каждом каталоге на более низком уровне категории имеется файл Makefile, который позволяет выполнять такие необычные задачи, как сборка одновременно всех портов в категории (например, сборка каждого порта www с помощью команды make из /usr/ports/www). Более того, вы сможете одновременно очистить каждый порт в рамках одного очень продолжительного рекурсивного процесса. Для этой цели нужно перейти в каталог /usr/ports и ввести команду make clean. Теперь, если хотите, можно отправиться перекусить; подобно чистке печи, этот процесс стоит потраченных усилий, но для его выполнения потребуется очень много времени. Если порт не будет собран: поиск решений Несмотря на удобство в использовании коллекции портов, этот способ не является идеальным. Изменения, которые будут происходить в дереве, особенно если большое количество портов (таких, которые связаны с GNOME и KDE) являются взаимосвязанными и постоянно развивающимися, станут причиной появления камней преткновения, которые вам будут серьезно мешать. Самым распространенным сбоем является внезапное прекращение процесса компиляции и вывод сообщения следующего рода: *** Error code 1 (Код ошибки 1). Е<уш это произойдет, вы можете попробовать сделать следующее. Во-первых, убедитесь в том, что вы начинаете с чистого порта. Если у вас уже есть каталог work, то возможно, что вы смешали новые исходные коды со старыми, в результате чего собрать порт оказалось невозможно. Выполните команду make clean, чтобы начать все "с нуля". Важно также убедиться, что у вас есть доступ к самому последнему дереву портов. Если порт еще не собран, то возможно, что это состояние является временным, и виноваты в нем не только вы, но и многие другие пользователи FreeBSD. Например, ваши порты ссылаются на одну версию ПО, а на данный момент времени появилась более свежая версия переносимого ПО. Или же ваши порты ссылаются на версию, которая на момент инсталляции вашего дерева портов только-только вышла, и некоторые заплаты (написанные для предыдущей версии) могут непреднамеренно оказаться несовместимыми. Даже если дереву ваших портов всего несколько дней от роду, все равно не исключено, что порт за это время был исправлен. Синхронизируйте дерево ваших портов, о чем было сказано ранее в этой главе, и попытайтесь заново собрать порт (но сначала выполните команду make clean). Если этот вариант не сработает, обратитесь за советом к более опытным специалистам. Зайдите на Web-сайт FreeBSD (http://www.freebsd.org) и перейдите по ссылке Mailing Lists (Списки рассылок), где в архивах рассылки вы сможете поискать информацию о порте, который вы пытаетесь собрать. В качестве одного из критериев поиска отметьте флажок Ports (Порты). Затем выполните поиск по имени вашего порта и какому-нибудь подходящему тексту в нескольких последних строках вывода 529
530 Системное администрирование Часть IV компилятора. Если другие люди замечали какой-нибудь характерный сбой, вы сможете найти для себя что-нибудь полезное. Все равно не везет? Существует еще одно хорошее спасительное средство: человек, поддерживающий порт. Посмотрите на переменную MAINTAINER в файле Makefile, которая содержит электронный адрес человека, поддерживающего порт. Отправьте по этому адресу любезное, нетребовательное письмо, включите в текст письма последнюю (имеющую отношение к проблеме) часть вывода компилятора, а также опишите свою систему (это можно сделать, например, с помощью команды uname -а). Такой человек обычно бывает очень занят, его труд обычно ценится недо статочно справедливо, поэтому выразите свою благодарность в ответ на любую помощью с его стороны! Модернизация порта Если вы обновили свои порты (как было описано в предыдущем разделе), а версия порта изменилась, вы можете просто воспользоваться командой make install, чтобы установить новую версию поверх старой. Однако это может оказаться плохой затеей, поскольку большинство инсталлированных файлов будут оставаться неизменными от одной версии к другой, поэтому если вы попытаетесь удалить (с помощью инструмента pkg_cielete) старую версию одного и того же порта или пакета, инсталлируя поверх него новую версию, то в итоге вы удалите большую часть и новой версии. Если на выходе pkg_yersion вы получите примерно такой результат, как показан ниже, значит, в вашей базе данных пакета остались ранние версии, если только вы не приготовились деинсталлировать все версии пакета, а затем повторно установить текущую версию: needs updating (port has 1.3.34) needs updating (port has 1.3.34) needs updating (port has 1.3.34) = up-to-date with port требуется обновление (порт имеет версию 1.3.34) требуется обновление (порт имеет версию 1.3.34) требуется обновление (порт имеет версию 1.3.34) соответствует версии порта Чтобы избежать этой ситуации, перед инсталляцией новой версии порта всегда следует проверять предыдущую версию. Воспользуйтесь инструментом pkg_info, pkg_version, или структурой /var/db/pkg для просмотра, что у вас уже имеется Если это более ранняя версия, удалите ее, как показано ниже: # pkg_delete apache-1.3.12 Вам не следует беспокоиться о настроенных конфигурационных файлах пор* та. Например, файл pkg-plist порта apache содержит команду @unexec, которая сравнивает конфигурационные файлы с файлами по умолчанию, установленными портом, и удаляет их только в том случае, если они совпадают (они соответствуют командам UNEXEC, которые вы уже встречали, когда рассматривалось получение информации о пакетах с помощью инструмента pkg__info). Даже при этих условиях целесообразно создать резервную копию конфигурационных файлов, прежде чем удалять пакет или порт, просто на всякий случай. apache-1.3.12 apache-1.3.14 apache-1.3.17 apache-1.3.19 apache-1.3.12 apache-1.3.14 apache-1.3.17 apache-1.3.19 < < < = < < < e
Установка дополнительного программного обеспечения Однако ничего страшного не случится, если вы оставите установленными старые версии. В этом случае вы получите запись в журнале аудита, где сможете посмотреть историю обновления вашей системы, и ничего плохого не будет в том, если вы будете иметь старые версии (за исключением того, что если будут реорганизованы вспомогательные файлы порта, то в результате устаревшие файлы в вашей системе будут зря занимать пространство на диске, и это потенциально может сбить с толку любого другого неудачливого администратора, совместно с которым вы будете выполнять ваши обязанности). Модернизация портов с помощью Portupgrade Чтобы ваши порты было еще проще сопровождать и модернизировать, вы можете инсталлировать утилиту Portupgrade, написанную членами команды FreeBSD специально для дальнейшей поддержки системы портов. С помощью Portupgrade (ее можно установить из категории sysutils) вы можете обновлять инсталлированный порт до более новой версии с помощью одной команды — без анализа текущей версии, деинсталляции старой версии или подобных тривиальных задач. Тем не менее, эту утилиту следует применять с одним предостережением — простота ее использования достигается за счет некоторых мер безопасности и проверок целостности, которые делают сборку из портов самым безопасным способом установки программ. Например, Portupgrade не обновляет автоматически все пакеты-зависимости или пакеты, зависящие от обновляемого вами пакета; чтобы сделать это, вам нужно будет воспользоваться специальными переключателями командной строки (подробные сведения об этом можно прочитать на man-странице утилиты portupgrade). Утилита Portupgrade разрабатывалась как инструмент для экспертов, позволяющий обновлять большие группы связанных между собой портов (или всех портов одновременно с помощью опции -а) с помощью одной команды, но только если вы полностью осведомлены о том, какие опасности подстерегают столь важное действие. Сначала обновите порты с помощью CVSup. Это позволит гарантировать, что все файлы Makefile в дереве портов имеют самые последние версии всех портов, и вы сможете определить, какие порты необходимо обновить, и до какой версии. Для этой цели воспользуйтесь инструментом pkg_version: # pkgjversion -v pine-4.58 < needs updating (port has 4.64) pine-4.58 < требуется обновление (порт имеет версию 4.64) Здесь мы видим, что порт Pine требует модернизации. Вместо того чтобы переходить в каталог /usr/рогts/mail/pine4 и вводить команды make, make install ишаке clean (и деинсталлировать старую версию, чтобы заменить ее новой), вы можете выполнить следующую команду, объединив все эти действия: # portupgrade pine [Updating the pkgdb <format:bdbl_btree> in /var/db/pkg ... - 194 packages ifound (-0 +0) donej [Обновление pkgdb <format:bdbl_btree> в каталоге /var/db/pkg ... -194 пакета % найдено (-0 +0) выполнено] —> Upgrading 'pine-4.58' to 'pine-4.64' (mail/pine4) Модернизация 'pine-4.581 до §pine-4.649 (mail/pine4) —> Building Vusr/ports/mail/pine4' Сборка '/usr/ports/mail/pine4'
7ZZ I Системное администрирование —> Cleaning for pico-4.64 Очистка pico-4.64 ...> cleaning for ispell-3.2.06_13 Очистка ispell-3.2.06m_13 -¦-> Cleaning for pine-4.64 Очистка pine-4. €4 -«> Vulnerability check disabled, database not found Проверка на уязвимости отключена, база данных не найдена /bin/sh pkg-install ¦--> Compressing manual pages for pine-4.64 Сжатие страниц руководства для pine-4.64 ¦--> Registering installation for pine-4.64 Регистрация инсталляции для pine-4.64 «*> Cleaning for pico-4.64 Очистка для pine-4. 64 —> Cleaning for ispell-3.2.06_13 Очистка для ispell-3.2.06_13 —*> Cleaning for pine-4.64 Очистка для pine-4. 64 > Cleaning out obsolete shared libraries Очистка устаревших совместно используемых библиотек [Updating the pkgdb <format:bdbl_btree> in /var/db/pkg ... - 195 packages 4>found (-0 +2) .. done] "* [Обновление pkgdb <format:bdbl__btree> в каталоге /var/db/pkg ... - 195 пакетов % найдено (-0+2) .. выполнено] СОВЕТ Обратите внимание, что в начале и конце процесса утилита Portupgrade поддерживает свою собственную базу данных инсталлированных пакетов, которую она использует для сравнения с доступными портами. Эта база данных позволяет осуществлять поиск любого данного файла и узнавать, из какого пакета он был взят: # pkgdb /usr/local/bin/pdfopt [Updating the pkgdb <format:bdbl_btree> in /var/db/pkg - 195 packages 'bfound (-0 +0) done] ghostscript-gnu-7.07_11 После того как процесс будет завершен, воспользуйтесь инструментом pkg_version еще раз, чтобы убедиться в том, что порт был успешно модернизирован: # pkg__version -v pine-4.64 * up-to-date with port pine-4.64 - соответствует версии порта СОВЕТ Чтобы установить новый порт, не собирая его вручную с помощью команды make, применяйте команду рог tins tall. Эта команда на самом деле является псевдонимом инсталляционного режима portupgrade.
Мггановка дополнительного программного обеспечения Глава 16 533 Web-сайт Fresh Ports Выходные данные процесса синхронизации, полученные из CVSup, являются полезными, но вряд ли они идеально подойдут для того, чтобы отследить, какие порты были изменены. Существует удобный Web-сайт (рис. 16.3), который каждому администратору FreeBSD следует занести в список избранного — Fresh Ports. &fe ?drt yiew Qo Book/narks loots Help ': V * •*^} ]Д http://wv«*.freehporte.org/ ¦Getting Started tautest Headlines I'm looking for work. Гю я software developer. Please reed my resume and you. FresbPorts hai everything you «vent to know about FreeBSD software, ports, packages, applications, whatever term you want to use. A port to marked as new for 10 day*. If you want to see more try Ьм§. ^•«^ШМ 117демми|1С|Д omniORB 4.0.7 dffifil %Э А гоЬийЫдЬ performance С01ША ORB for C++and I^thon py-omnloriy 2.7 dart Python bindings for omniORB4, a CQRBA 2.6 ORB Tw ' гьь aoee 10 it am rsr a if you have air/ leads. Thank - forced eessat to not» oaniOR8 updated to 2,0.7 and py- eanyo rb updated, to 2.7. Qops With ths last с о wit I've cessatted unfinished updates for both osmGFB and py-oaniorb py-osniorb has a pkg-pUst problea yst But let it ba. I'U fi» it soon. 1мавцв)яЕЭ I http7A»ww.freshports org/other-copynghts.php Рис. 16.3. Web-сайт Fresh Ports (www. freshports.org) Будучи поддерживаемым отдельно от проекта FreeBSD, Web-сайт Fresh Ports представляет собой базу данных, связанную с главным хранилищем CVS для коллекции портов. Она постоянно следит за регистрациями и перечисляет их в обратном хронологическом порядке. Вы можете зарегистрироваться на Web-сайте и выбрать список для наблюдения за вашими любимыми портами. При любом изменении в вашем списке вам будет посылаться электронное письмо, из которого вы сможете точно узнать, какие изменения были произведены для каждого порта, и вы бы смогли решить, стоит ли обновлять порт ради данного изменения. Например, если был повышен номер версии порта или если была обнаружена и устранена критическая ошибка, связанная с безопасностью, вы можете согласиться на модернизацию. Однако если самое последнее изменение было посвящено только исправлению опечатки в электронном сообщении программы установки, то вряд ли ради этого имеет смысл обновлять порт.
ГЛАВА Печать 17 В этой главе... • Принцип работы демона lpd, спулера печати и очереди печати в FreeBSD Конфигурация режима ядра, устройства и связей Создание каталога спула и установка его полномочий Настройка фильтров текста и фильтров преобразования Конфшурирование /etc/printcap для управления функциями системы печати Печать из командной строки с помощью lpd Базовая печать в режиме командной строки Печать из приложений XI1 Использование команды lpq для проверки состояния заданий печати Удаление заданий из очереди с помощью команды lprm Управление принтерами Базовая печать через сеть Печать следующего поколения с помощью CUPS Поиск и устранение неполадок
I ГГГ I Системное администрирование I 536 I Часть IV Настройка принтера в FreeBSD является одной из наиболее сложных задач, с которыми вам, как администратору, придется иметь дело. В мире UNIX, и в частности в FreeBSD, печать заключается не просто в установке драйвера, выбора принтера в панели управления и собственно печати, к чему вы уже, возможно, привыкли. Печать в системе FreeBSD включает настройку одного или нескольких конфигурационных файлов и, возможно, инсталляцию фильтров (фильтрами являются небольшие программы, часто это просто сценарии оболочки, которые преобразуют файлы данных в код, пригодный для печати), если вам нужно напечатать что-нибудь более серьезное, нежели простой текст. После рассмотрения основных процессов печатав FreeBSD в этой главе будут рассмотрены вопросы конфигурирования режимов ядра, устройства и связей, создания каталога спула, установки фильтров печати и разрешения пользователям печати из XII и командной строки. Кроме того, в этой главе мы поговорим об администрировании функций печати через сеть и расскажем о порядке поиска и устранения неполадок, чтобы вы могли самостоятельно устранять наиболее часто встречающиеся проблемы печати. Несмотря на то что многие принтеры, поступающие сегодня в продажу, подключаются к компьютеру с помощью интерфейса USB, системы UNIX, подобные FreeBSD, начинают буквально "терять в весе", когда речь заходит о поддержке вездесущего в наше время стандарта. Печать в стиле UNIX в основном выполняется на принтерах, подключаемых к последовательным (RS-232) и параллельным портам, поэтому в этой главе мы сосредоточимся на технологиях, используемых для подключения принтера с помощью одного из этих методов (многие принтеры до сих пор продаются и с параллельным интерфейсом, и с интерфейсом USB). Если у вас имеется USB-прин- тер, и вы хотите, чтобы он работал под управлением FreeBSD» вам могут подойти стандартные технологии спулера печати; если они не подойдут, можно попробовать воспользоваться CUPS — системой печати следующего поколения для UNDC - кот* рая будет рассмотрена в конце этой главы. (Печать с интерфейсом IrDA и Bluetooth является еще более рискованным предложением; поддержка Bluetooth в FreeBSD только-только появилась, да и то пока что на уровне эксперимента, a IrDA вовсе не поддерживается.) НА ЗАМЕТКУ Принтеры GDI (Graphics Device Interface — интерфейс графических устройств), иногда называемые Windows-принтерами (WinPrinters), вообще не работают с FreeBSD. Эти принтеры обычно дешевле принтеров не GDI, поскольку они перекладывают некоторую часть управлений принтером из аппаратной части на программный драйвер (точно так же, как это делают так называемые программные модемы (soft-modem)). Эти принтеры обладают своими недостатками: они используют больше системных ресурсов, поскольку большую часть обработки должен выполнять процессор компьютера, а не принтер, и для них требуются специальные драйверы, обычно доступные только для Windows. FreeBSD является всего лишь одной из множества операционных систем, в среде которых эти принтеры функционировать не могут.
г^^-ГйтП Глава 17 I I Принцип работы демона lpd, спулера печати и очереди печати в FreeBSD lpd является демоном построчного принтера. Эта программа работает в фоновом режиме и ожидает поступления запросов на печать. При получении запросов она сортирует их с помощью любых подходящих фильтров, при необходимости преобразует данные в другой формат и посылает запросы в очередь печати. Очередь печати — средство, характерное для всех современных операционных систем — представляет собой область на жестком диске, в которой хранятся данные печати, ожидающие своей отправки на принтер. Каждый принтер, подключенный к системе, имеет свою собственную отдельную очередь и область спула. Область спула хранит дгшные для вас (в порядке их поступления, как на катушке с нитками) до тех пор, пока их нельзя будет отправить на принтер. Эта область может хранить множество заданий как от одного, так и от разных пользователей. Как только пользователь составит задание печати, оно помещается в очередь. Спулер подает задание на принтер, когда последний оказывается доступным. Задания могут иметь различные приоритеты, которые определяют, в каком порядке они должны быть напечатаны. Таким образом, спулер и очередь печати действуют как средства асинхронной печати, при которой вы можете создавать задания печати всякий раз, когда вам это будет необходимо, независимо от доступности принтера, а система напечатает их по своему усмотрению, когда она будет готова сделать это. Спулер обрадает несколькими преимуществами перед обычной подачей данных непосредственно на принтер, как это делается в DOS. • Он позволяет множеству пользователей совместно использовать принтер, так как данные, требующие печати, могут быть помещены в очередь, и программа, отправившая данные, может затем забыть о них. • Он позволяет выполнять печать в фоне. Поскольку отправленное на принтер задание печати больше не представляет интереса для отправившей его программы, вам не придется ждать, пока программа завершит печать, чтобы продолжить с ней работу. Это означает также, что вы можете остановить работу программы после того, как задание будет помещено в очередь, не теряя задания печати. • Спулер до некоторой степени является отказоустойчивым. Если нужно восстановить исходное состояние принтера, вы не потеряете заданий, находящихся в очереди, и вам не нужно будет вновь помещать их в нее. После того как принтер вернется в активный режим, оставшиеся в очереди задания будут напечатаны нормальным образом, как будто бы ничего не происходило. В общем случае, каталоги спула находятся в /var/spool. Выходные данные принтера направляются в каталог внутри /var/spool, соответствующий вашему принтеру, будь то параллельное, последовательное или USB-устройство; первый принтер в системе обычно будет помещать данные в /var/spool/lpd или /var/spool/output. Однако это можно изменить путем редактирования конфигурационного файла, и в этой главе вы увидите, как это делается.
538 Системное администрирование Часть IV Конфигурация режима ядра, устройства и связей Стандартное ядро обеспечивает поддержку параллельного и последовательного портов, встроенных в него, а также обеспечивает базовую поддержку USB; таким образом, если вы не создали специальное ядро и не удалили поддержку этих портов, у вас не возникнет никаких проблем. Чтобы узнать, поддерживает ли ядро работу с параллельных или последовательных портов, нужно всего лишь проверить, обнаруживает ли ядро эти порты во время загрузки, и почитать сообщения ядра, относящиеся к этим портам. Сообщения, генерируемые во время загрузки ядра, доступны во время работы системы в файле /var/run/dmesg.boot. Воспользуйтесь командой grep, чтобы найти в этом файле любое упоминание об устройстве, соответствующему вашему принтеру: ppcN для параллельных принтеров, sioN для последовательных принтеров или ulptN для USB-принтеров. НА ЗАМЕТКУ Символ N в конце каждого имени устройства обозначает, к какому устройству в цепи вы обращаетесь. Например, во многих персональных компьютерах существуют четыре последовательных порта ввода-вывода, и все они пронумерованы (как и многое в UNIX) от 0 до 3. Точно так же, вашим (вероятно, единственным) контроллером параллельного порта является ррсО. USB-прин- теры, которые можно подключать к компьютеру во время работы системы, помещают в момент своего подключения свои имена устройств в журнал сообщений ядра. Вы же можете с помощью команды dmesg просмотреть текущие сообщения ядра, если вам понадобится идентифицировать имя устройства для USB-принтера, который вы только что подключили. Обратите внимание на то, что поскольку USB-устройства сообщают ядру информацию о самих себе, то FreeBSD обычно может рассказать вам о производителе и модели принтера, а параллельные и последовательные принтеры обычно являются для системы "черными дырами" — она просто посылает им данные, толком не зная, что находится на другом конце. Все, о чем система может сказать вам, так это о том, может ли она связываться с самим портом. Следующие команды показывают успешные команды grep, зондирующие параллельные, последовательные и подключенные USB-принтеры. # grep ppc /var/run/dmesg.boot ррсО: <Standard parallel printer port> port 0x378-0x37f irq 7 on acpiO Стандартный параллельный порт принтера> 0x378-0x37f irq 7 на acpiO ррсО: Generic chipset (EPP/NIBBLE) in COMPATIBLE mode Общий набор микросхем (EPP/NIBBLE) в режиме совместимости ppbusO: <Parallel port bus> on ppcO <Шина параллельного порта> на ррсО # grep sio /var/run/dmesg.boot siol: <16550A-compatible COM port> port 0x2f8-0x2ff irq 3 on acpiO <СОМ-порт, совместимый с 16550A> 0x2f8-0x2ff irq 3 на acpiO •siol: type 16550A # grep ulpt /var/run/dmesg.boot ulptO at uhubO port 1 configuration 1 interface 0 ulptO: hp deskjet 3600, rev 2,00/1.00, addr 2, iclass 7/1 ulptO: using bi-directional mode используется двунаправленный режим
Печать Пзэ" Глава 17 I — СОВЕТ Чтобы скомбинировать все эти команды в одну (и чтобы включить символ Л, который показывает начало строки в регулярном выражении, дабы избежать ошибочных совпадений), применяйте следующую команду: # dmesg | grep 'Аррс|Asio|Aulptf Если ответ FreeBSD ничего не содержит, это значит, что ядро не поддерживает порт. Вам нужно будет загрузить модуль ядра с помощью команды kldload (sio. ko для последовательного, ppbus. ко и lpt. ко для параллельного и usb, ко и ulpt. ко для USB-порта), или же, чтобы получить более постоянное решение, добавить соответствующую строку device в конфигурационный файл ядра и заново собрать ядро (см. главу 18, чтобы узнать больше о конфигурировании и сборке ядра). Конфигурирование режима параллельного порта Если вы используете принтер на параллельном порту (устройство lpt 0 в контроллере ррсО), вам нужно будет решить, в каком режиме он должен работать — в режгше опроса (polled mode) или в режиме, управляемом прерываниями (interrupt-driven mode). Требуемый вам режим будет зависеть от вашего принтера, поскольку некоторые принтеры в одном режиме работают лучше, чем другие. Работа в режиме, управляемом прерываниями, выполняется быстрее, но при этом используется запрос на прерывание (IRQ), который может оказаться дефицитным в вашей системе; кроме того, некоторые принтеры работают нестабильно в режиме, управляемом прерываниями. Чтобы сконфигурировать режим параллельного порта, можно воспользоваться программой lpt control. Имейте в виду, что для этого вы должны войти в систему как суперпользователь (root). Кроме того, чтобы программа lpt control могла работать, нужно подключить принтер к параллельному порту. Синтаксис lptcontrol имеет вид lpt control -x -d /dev/lptO, где -х представляет одну из опций, перечисленных в табл. 17.1, в зависимости от того, какой режим вы хотите выбрать. Таблица 17.1. Опции режима lptcontrol Опция Описание -— ¦- - . . .. . . ....-, _ . - . i . _ _ — — —. , ,— — .. -i Устанавливает режим, управляемый прерываниями. -р Устанавливает режим опроса. -е Устанавливает расширенный режим (любой расширенный режим, поддерживаемый принтером). -5 Устанавливает стандартный режим (выключает расширенный режим). Если ваши принтер и BIOS поддерживают ЕСР, ЕРР или любые другие формы улучшенных коммуникаций на параллельном порту, то в таком случае вам нужно будет использовать опцию ~е. Кроме того, обратите внимание, что опция -d (определяет устройство порта) является необязательной. Если вы не укажете устройство, lptcontrol будет использовать устройство по умолчанию, которым является /dev/lptO.
I ZT7 | Системное администрирование __ 1 54° I Ma^TKlV Например, следующая команда установит на первом параллельном порту расширенный режим: # lptcontol -e -d /dev/lptO Поддержка конфигурации параллельного порта после перезагрузок Если вы хотите, чтобы эти настройки сохранялись после перезагрузок, вы должны добавить управляющую команду lptcontrol в один из сценариев запуска системы, чтобы lptcontrol запускалась при каждой загрузке системы. Самый лучший способ сделать это — создать новый файл в каталоге /usr/local/etc/red, который содержит соответствующую команду. Если вы создадите файл запуска в каталоге /usr/local/etc/rc.d, вам нужно будет установить полномочия для этого файла, чтобы он был исполняемым (например, chmod 655 имяфайла). Более подробно об этом можно прочитать в главе 14. Проверка связности порта принтера После того как вы выясните, что ваше ядро распознает порт принтера, вы должны проверить его связность, чтобы убедиться в возможности отправлять данные на принтер. Вы можете с помощью программы lpt est отправить на принтер тестовую страницу с простым текстом, или создать входной файл PostScript, чтобы проверить способность принтера (если она существует) печатать данные PostScript. Для этого необходимо включить принтер и войти в систему как суперпользователь. Чтобы проверить параллельный принтер, отправьте предварительно упакованный вывод программы lptest на устройство принтера, как показано ниже: # lptest > /dev/lptO Для USB-принтера используйте следующую команду: # lptest > /dev/ulptO На принтере должна появиться тестовая страница, заполненная стандартными символами ASCII. Если ваш принтер поддерживает инструкции PostScript, вы можете послать простой файл PostScript его устройству, чтобы проверить его способность. Во-первых, создайте файл, как показано на рис. 17.1. Листинг 17.1, Тестовый файл принтера PostScript __ %!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Hello world!) show showpage Сохраните этот файл, и отправьте его на принтер с помощью команды cat, указав соответствующее имя устройства для вашего принтера: # cat petest.ре > /dev/ulptO
Печать Глава 17 Создание каталога спула и установка его полномочий После того как вы убедитесь, что FreeBSD может взаимодействовать с вашим принтером на самом элементарном уровне, вы можете настроить демон lpd и сконфигурировать спулер. Начните с создания каталога спула для принтера. Каталоги спула печати обычно помещаются в /var/ spool /lpd, хотя вы смело можете поместить их в другое место. Выберите для конфигурируемого принтера имя. Вы можете назвать принтер как угодно, но лучше всего выбрать короткое, но описательное имя вроде laserjet4100. Вы можете также создать псевдонимы, чтобы обращаться к принтеру под другими именами. После того как вы определитесь с именем принтера, создайте для него каталог спула. Ниже показан пример создания каталога: # mkdir /var/epool/lpt/laserjet4100 После этого вам, возможно, захочется сменить владельца каталога спула и изменить полномочия, дабы пользователи не могли ничего выведать и не могли подсматривать за чужими заданиями печати. Все каталоги спула печати должны принадлежать пользователю daemon и группе daemon; только этот пользователь и эта группа должны иметь полномочия на чтение, запись и выполнение, остальные не должны их иметь. Следующие команды корректно определят принадлежность и полномочия каталога спула: # chown daemon. daemon /var/spool/lpd/laser jet4100 # chmod 770 /var/spool/lpd/laser jet4100 Итак, каталог спула установлен; на следующем этапе вам нужно установить текстовый фильтр для демона lpd. Настройка фильтров текста и фильтров преобразования Именно в фильтрах выполняется основной объем работы во время печати. Когда lpd посылает данные фильтру, он задает STDIN (стандартный ввод) фильтра файлу, который нужно напечатать, a STD0UT — устройству принтера. Фильтры преобразования похожи на текстовые фильтры за исключением того, что они предназначены для преобразования нетекстовых форматов файлов в формат, который может понять принтер. Текстовые фильтры Как можно понять исходя из названия, текстовый фильтр является фильтром, который демон lpd использует при получении простого текста для печати. Поскольку большинство принтеров будут принимать данные в виде простого текста, для которого не требуется никакой специальной управляющей информации, текстовый фильтр может быть представлен ни чем иным, как сценарием оболочки, использующим программу cat просто для передачи необработанных данных принтеру, или же он может быть настолько сложным, насколько является программа, изменяющая
I ГТГ I Системное администрирование I 54Z I ЧалтиМ данные в совершенно другой формат. Примером сложного фильтра является фильтр, использующий GhostScript, который принимает необработанные данные PostScript и переводит их в формат, который может понять принтер, отличный от PostScript (GhostScript рассматривается в следующем разделе). Что такое PostScript? PostScript представляет собой сложный язык программирования, предназначенный для печати и форматирования графики и текста. Он не зависит от устройства, поэтому любой принтер, который может понять PostScript, может визуализировать документ PostScript без специальных драйверов. Язык PostScript придумали в компании Adobe в 1985 году; он поддерживается широким диапазоном современных принтеров. Широкую популярность как языка для описания текстовых файлов и файлов изображений он приобрел в силу своей переносимости и независимости от устройств (он даже применялся в качестве графической подсистемы для операционной системы NeXTSTEP, визуализируя на экране то, что многие люди могли только предполагать отправлять на принтеры). К сожалению, принтеры, не понимающие PostScript, не могут печатать документы PostScript. (Они будут печатать их содержимое в виде простого текста, поэтому вывод, как правило, будет совершенно нечитабельным.) Однако бесплатно распространяемая программа, называемая GhostScript, может преобразовывать PostScript в формат, который могут понимать принтеры не- PostScript. Это позволяет принтерам не-PostScript эмулировать PostScript с помощью программного обеспечения. К программе GhostScript мы еще вернемся в этой главе. Очень простой текстовый фильтр для демона lpd может выглядеть примерно следующим образом: #!/bin/sh /bin/cat && exit 0 exit 2 Общепринятым местом для хранения текстового фильтра является каталог /usr/ local/libexec. (Вы можете назвать его, например, /usr/local/libexec/if-text) После того как вы сохраните файл, его тоже нужно будет сделать исполняемым, чтобы демон lpd мог запускать его. Для этой цели подойдет команда chmod 555 /usr/local/libexec/if-text Первая строка в этом фильтре показывает, что это программа оболочки, которую нужно запускать с помощью /bin/sh (стандартная оболочка). СОВЕТ Если что-нибудь из изложенного для вас осталось непонятным, прочитайте главу 10, прежде чем продолжить изучение этой главы. Для настройки фильтров печати обычно приходится довольно много программировать в оболочке. Вторая строка просто вызывает программу cat, которая по умолчанию считывает данные из STDIN и посылает их в STDOUT. Два знака амперсанда (&&) говорято том, что нужно выполнить или оба оператора в этой строке, или ни одного из них. Другими словами, если команда cat будет выполнена успешно, то сценарий завершит работу с состоянием 0, свидетельствующим об успешном завершении. Если же возникнет ошибка, то часть строки после && не будет выполнена, а вместо нее будет выполнена третья строка, которая говорит программе, что нужно выйти с состоянием 2. (Если lpd получает состояние выхода 2, это означает сбой в работе фильтра, и lpd не будет пытаться напечатать файл снова.)
Печать I ГТ7 I - Глава 17 I I I Установка текстовых фильтров для печати файлов с простым текстом на принтерах PostScript Предыдущий простой фильтр будет нормально работать для печати простого текста на большинстве принтеров не-PostScript. Однако принтеры PostScript не могут обрабатывать данные простого текста. (Принтер PostScript ожидает получить входящие данные в виде текстовой программы на языке PostScript, которая будет определять команды управления для вывода текста и графики.) Если у вас принтер PostScript, вам понадобится более сложный фильтр, который сможет преобразовывать данные простого текста в данные PostScript. Первое, что нужно будет сделать — это инсталлировать программу, которая может преобразовывать простой текст в PostScript. С этой задачей может справиться программа a2ps. Ее можно найти в разделе print дерева портов FreeBSD. (Об инсталляции портов можно прочитать в главе 16.) Имейте в виду, что упомянутая программа имеет три версии. Имена этих версий соответствуют размеру бумаги, для работы с которой они были предназначены. Например, если вы будете применять в основном бумагу для писем (letter), принятую в США (стандарт 8.5x11"), используйте a2ps-letter. Фильтр для принтера PostScript сначала должен иметь возможность проверить, получает ли он действительные данные PostScript. Если данные действительные, то ничего не происходит и данные передаются прямо через него, как в случае с упомянутым выше простым текстовым фильтром. Если принтер PostScript не получает данные PostScript, фильтр должен преобразовывать данные в PostScript, прежде чем они могут быть отправлены на принтер. Все потоки данных PostScript начинаются с загадочной последовательности символов %!. Можно написать сценарий оболочки, который будет проверять, начинается ли первая строка входного файла с этой последовательности. Если это так, значит, вы имеете дело с файлом PostScript, и данные могут быть переданы непосредственно на принтер. В противном случае вы имеете дело с файлом простого текста, поэтому данные необходимо передать через a2ps, чтобы преобразовать их в PostScript, и только после этого их можно будет отправить на принтер. Все это выполняет сценарий оболочки, показанный в листинге 17.2. Листинг 17.2. Простой фильтр PostScript #!/bin/sh ¦ Простой фильтр для принтеров PostScript read header ps test^'expr "$header" ; • \ (. Л J ' ' if I n$header" * "%.'" J then # Это файл PostScript. Он будет передан на печать. Echo n$header" && cat && printf "\004" && exit 0 exit 2 else # Это файл с простым текстом. Его нужно сначала преобразовать. (echo "$header,f; cat) / /usx/local/Ып/а2р && printf n\004" && exit 0 exit 2 fi
544 Системное администрирование Часть IV Сохраните где-нибудь этот файл (хорошим вариантом является /usr/local/ libexec/if-ps). Сделайте файл исполняемым, чтобы демон lpd мог запустить его (chmod 555 /usr/local/libexec/if-ps). Показанный код фильтра считывает первую строку ввода, посылаемую демоном lpd, и сохраняет ее в переменной header. Затем программа использует команду ехрг, чтобы получить первые два символа из файла, и сохраняет их в переменной ps_test. Оператор if, следующий далее, проверяет, какие два символа хранятся в ps_test. Если этими символами является последовательность %!, значит, это файл PostScript, после чего выполняется оператор then, который передает необработанные данные прямо на принтер. Он посылает первую строку, перечисляет оставшиеся выходные данные с помощью команды cat, посылает управляющую последовательность \004 с помощью printf, и после всего этого завершает работу с состоянием 0. Двойной амперсанд (&&) соединяет разные операторы и говорит: "Или выполняй все эти команды, или не выполняй ни одной из них". Если по какой-то причине любая часть этой командной строки не может быть выполнена, то ни одна из них не будет выполнена, и программа завершит работу с состоянием 2, которое говорит демону lpd, что данные не могут быть напечатаны и что не нужно пытаться печатать их снова. Если первыми двумя символами не являются %!, то этот файл не является файлом PostScript, вследствие чего будут выполнены операторы else. Операторы else в данном случае сначала показывают первую строку программы, а затем перечисляют (с помощью cat) остальные входные данные и подают их в программу /usr/local bin/a2ps. Программа a2ps преобразует файл в PostScript и печатает преобразованный вывод в поток данных фильтра. Наконец, когда все данные будут переданы, с помощью print f посылается управляющая последовательность \ 0 0 4, и программа завершает работу с состоянием 0. Как и в случае с оператором then, если в какой-либо части происходит сбой, программа завершает работу с состоянием 2. Программа a2ps имеет много опций, поэтому если вы будете постоянно печатать файлы с простым текстом с помощью принтера PostScript, рекомендуется прочитать man-страницу программы a2ps. Вы сможете изменить способ вызова программы а2р$ этим сценарием, чтобы удовлетворить существующим нуждам и предпочтениям. Печать файлов PostScript на принтерах He-PostScript Если у вас принтер не-PostScript, проблема будет прямо противоположна той, № торую мы только что рассмотрели. Вам нужно позволить простому тексту попасть на принтер, но необходимо преобразовать данные PostScript в формат, который будет понятен вашему принтеру. Если вы никогда не планировали печатать ничего кроме простого текста, то об этом вам беспокоиться не следует. Однако PostScript становится своеобразным общим знаменателем в UNIX и FreeBSD, когда речь заходит о печати чего угодно, кроме простого текста. Практически все программы обработки текста, программы черче ния и графические программы могут осуществлять запись в PostScript (или посылать данные прямо на принтер). Хотя некоторые приложения (например, входящие комплект OpenOffice.org) могут иметь встроенные драйверы для вашего конкретно го принтера, большинство приложений UNIX таких драйверов не имеют. Наоборот они просто выводят данные PostScript. Вследствие этого ваши возможности печа-п будут существенно ограничены, если вы не сможете обрабатывать PostScript.
Печать I ZTZ I ——— . — -J 545 Глава 17 I I I К счастью, компания Aladdin выпускает бесплатную программу GhostScript, которая может эмулировать принтер PostScript. Она принимает входящие данные PostScript и преобразует их в форму, которую может понимать ваш принтер. НА ЗАМЕТКУ GhostScript поддерживает самые разные принтеры. Список (далеко не исчерпывающий) можно посмотреть по адресу http: //www.es,wise.edu/~ghost/doc/printer.htm. GhostScript доступна в коллекции портов FreeBSD в категории print. Об инсталляции портов речь шла в главе 16. Чтобы эта процедура могла работать, вам понадобится сценарий, похожий на тот, который рассматривался в предыдущем разделе — за исключением того, что операции будут выполняться в обратном порядке. В данном случае, если сценарий обнаруживает, что отправленные данные не били данными PostScript, то данные будут пропущены. Если же данные являются данными PostScript, они будут переданы через программу GhostScript, чтобы преобразовать их во что-то такое, что может понимать принтер не-PostScript. Сценарий, представленный в листинге 17.3 (он взят из интерактивного справочника FreeBSD Handbook), обеспечит функциональность PostScript на принтере HP Deskjet 500 (принтер не-PostScript). Листинг 17,3. Образец фильтра GhostScript для принтера HP Deskjet 500 #!/bin/sh # # ifhp — печать данных PostScript/ эмулированных с помощью GhostScript, # на принтере DeskJet 500 # Установлен в /usr/local/libexec/hpif # # Обработка LF как CR+LF # printf M\033&k2G" || exit 2 # # Чтение первых двух символов файла # read first_line first_two_chars-4expr "$first_line" : '\(..\)f% if [ "$first_two_chars" = "%!" J; then # # Это PostScript; использовать GhostScript для сканирования, # преобразования и печати. # # Обратите внимание, что файлы PostScript на самом деле являются # интерпретируемыми программами; этим программам разрешено выводить # данные в stdout, что приведет к порче напечатанных выходных данных. # Поэтому, мы перенаправляем stdout в stderr, затем переводим дескриптор # 3 в stdout и делаем так, чтобы GhostScript записывала в него свои # выходные данные. Упражнение для сообразительных читателей: захватите # вывод stderr из GhostScript и пошлите его по электронной почте обратно
546 Системное администрирование Часть IV # пользователю, инициировавшему задание печати. # exec 3>&1 1>&2 /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \ -s0utputFile«/dev/fd/3 - && exit 0 # /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile— - \ && exit 0 else # # Простой текст или HP/PCL, поэтому просто печатаем его как есть/ в конце # печатаем форму, чтобы убрать последнюю страницу. # echo $first_line && cat && printf "\033&10H" && exit О fi exit 2 На первый взгляд этот сценарий может показаться сложным, но на самом деле все не так уж и плохо. Первое, что делает сценарий — читает первую строку ввода, извлекает первые два символа и смотрит, не является ли это последовательностью %!. Если это так, значит, входные данные представлены в формате PostScript, поэтому выполняется оператор then, который посылает выходные данные через GhostScript. В противном случае файл обрабатывается как простой текст и пропускается. НА ЗАМЕТКУ GhostScript является очень мощной программой, имеющей гораздо больше опций, чем рассмотрено здесь. Чтобы узнать больше об этой программе, изучите документацию, доступную по адресу http: //www. cs ¦ wise. edu/~ghost. НА ЗАМЕТКУ В FreeBSD имеется программа, называемая /usr/libexec/lpr/lpf, которая может выступать в качестве фильтра печати. Она обладает возможностями форматирования текста и позволяет осуществлять функции учета (подсчет количества напечатанных страниц, идентификация пользователя, отправившего данные на печать, и тому подобное). На man-странице программы рас вы сможете прочитать о применении рас и lpf для отслеживания расхода бумаги и времени использования принтера пользователем. Фильтры преобразования Как было отмечено ранее, фильтры преобразования подобны текстовым фильтрам, за исключением того, что они предназначены для преобразования входных данных любого формата, применяемого в пользовательских приложениях, в формат, понят ный принтеру. Фильтры преобразования позволяют печатать различные типы фай-
Печать I _ „ 1 Глава 17 I 547 I лов прямо из командной строки с помощью 1рг, избавляясь от необходимости загружать их в программу или преобразовывать вручную перед печатью. Используемый фильтр определяется в командной строке с помощью опции lpr. (lpr представляет собой команду, служащую для печати файлов из командной строки. Далее в этой главе мы рассмотрим ее подробно.) В современном мире единственными опциями фильтра преобразования, которые наверняка будут представлять для вас интерес, являются -d, которая определяет файл в формате DVI (он используется наборной системой ТеХ), и -д, определяющая файл, который содержит вычерчиваемые данные, сгенерированные подпрограммами plot системы UNIX. Остальные опции фильтра преобразования определяют типы файлов и приложения, не входящие в состав FreeBSD, такие как -f (исходные файлы FORTRAN), -с (файлы cifplot), -n (файлы ditrof f), -t (наборные команды С/А/Т для старых версий trof f) и -v (растровые изображения). По умолчанию ни один из этих фильтров не инсталлируется. Также, буква опции и фильтр, который она вызывает, в системе жестко не закреплены. Поэтому, если вы не используете, например, фильтр cifplot, то опцию -с можно без труда переопределить, чтобы она вызывала какой-то другой фильтр, который вы могли установить или разработать самостоятельно. Как и текстовые фильтры, эти фильтры, определяемые пользователями, могут представлять собой сценарии оболочки, вызывающие стандартные программы UNIX или автономные исполняемые программы, которые могут быть предоставлены сторонними производителями ПО. Ниже показан пример очень простого фильтра преобразования, который преобразует данные из системы набора grof f GNU (принтер не может понять эти данные) в PostScript (которые может понять принтер, или напрямую, или посредством отправки данных через программу GhostScript): #!/bin/eh exec grope Если вы откроете man-страницу grops, вы увидите, что это программа для преобразования grof f в PostScript. В данном случае, этот файл будет отправлен на принтер через grops. Если вы хотите инсталлировать этот фильтр, его необходимо сохранить в каталоге /usr/local/libexec. (Вы можете присвоить этому фильтру имя g2ps или подобное, поскольку он преобразует данные grof f в PostScript.) Если вы планируете переназначить опцию -1 lpr в пользу этого нового фильтра, вы сможете напечатать исходный файл grof f непосредственно из командной строки, получив корректное отображение данных на принтере. Это можно сделать следующим образом: # lpr -t my file Здесь ту file, естественно, является именем исходного файла grof f, который вы хотите напечатать. О конфигурировании системы с целью использования этого специального фильтра вы узнаете в следующем разделе главы, где рассматриваются вопросы настройки файла /etc/printcap (файл, который управляет поведением системы печати).
548 Системное администрирование Часть IV Конфигурирование /etc/printcap для управления функциями системы печати Файл /etc/printcap ("printer capabilities" — возможности принтера) является связующим элементом, который удерживает вместе все, о чем мы до сих пор с вами говорили. Он определяет имя и псевдоним принтера, показывает, какой филнгр он использует, какие фильтры преобразования он может применять, какая опция отвечает за доступ к фильтру, куда принтер помещает свои задания, и многое другое. Файл /etc/printcap уже существует в вашей системе, но все опции в нем закомментированы. Поэтому, чтобы извлечь из него пользу, нужно убрать комментарии и изменить или добавить несколько опций. Создание файла /etc/printcap Формат файла /etc/printcap очень прост; он содержит одну или несколько многострочных записей, по одной на каждый принтер, который вы хотите сделать доступным для вашей системы. Ниже показан пример записи для принтера PostScript: laserjet4100|lp|local line printer:\ # :eh:\ : lp»/dev/lptO: ed*/ var /spool /lpd/laser j«t4100: lf»/var/log/lpd-arr§: : ifVuer/local/libexec/if-ps: Первая строка в этой записи разделена на поля с помощью символа канала (|); первое поле содержит имя принтера, а во втором поле вы указываете любые псевдонимы. В данном случае принтер имеет имя laserjet4100. Он имеет также псевдоним 1р, который означает, что этот принтер будет применяться по умолчанию. Наконец, в последнем поле дается длинное описание данного принтера. Во второй строке стоит знак комментария. Если бы она не была закомментирована, то в заголовочных (титульных) страницах печаталось бы имя пользователя, имя файла и тому подобное. Это удобно, если вашим принтером пользуется множество пользователей — при необходимости они смогут легко находить свои распечатки. В третьей строке содержится информация о том, где расположен принтер. Здесь : 1р соответствует локальному принтеру (в противоположность удаленному принтеру). Принтер подключен к первому параллельному порту (/dev/lptO). Далее, :sd представляет каталог спула (/var/spool/lpd/laserjet4100;cM. раздел "Создание каталога спула и установка его полномочий" в этой главе), используемый данным принтером, a :if соответствует журнальному файлу, в котором принтер будет регистрировать любые возникающие ошибки. Четвертая строка определяет входной фильтр, или текстовый фильтр, который должен применяться для данного принтера. В этом случае используется фильтр if-ps (фильтр преобразования текста в PostScript, созданный нами ранее). Инсталляция фильтров преобразования Если вы хотите инсталлировать любые фильтры преобразования, то они будут об- рабатываться файлом /etc/printcap. Установите их, просто добавив новую строку в запись принтера, содержащую соответствующую опцию (см. табл. 17.2), и укажите путь к принтеру. Этот формат такой же, как и строка : if для входного фильтра.
Таблица 17.2. Опции фильтра для /etc/printcap Фильтр DVI FORTRAN cifplot plot dittroff troff raster Опция :df :rf :cf :gf :nf :tf :vf Помните, что эти фильтры не являются жестко закодированными. Поэтому, если вы не используете, например, фильтр FORTRAN, вы можете заменить его другим фильтром, просто указав путь к фильтру в файле /etc/printcap и опцию, которую хотите ему назначить. НА ЗАМЕТКУ Если вы переназначаете флаг lpr, используя файл /etc/printcap, то на man-странице для 1рг вы должны отразить произведенные вами изменения, чтобы о них могли узнать другие пользователи, которые могут обратиться к этой man-странице за справкой о печати своих файлов. Чтобы отредактировать man-страницу, воспользуйтесь следующими командами: # gunzip /usr/share/man/manl/lpr.l.gz # vi /usr/share/man/manl/lpr.1 # gzip /usr/share/man/manl/lpr.l Ниже показана строка, которую вы можете добавить ниже строки :if, чтобы вместо фильтра преобразования FORTRAN установить созданный нами ранее фильтр, преобразующий данные grof f в данные PostScript: :rf=/usr/local/libexec/g2ps: Имейте в виду, что когда вы будете добавлять эту строку, вам нужно будет произвести небольшое изменение перед строкой :if и добавить символ обратной косой черты в самом ее конце. Это необходимо по той причине, что lpd ожидает, что вся строка информации будет находиться в одной строке, а символ обратной косой черты отключает символ новой строки, поэтому при чтении системой множество строк будет обработано как одна. Печать из командной строки с помощью lpd После того как вы сконфигурируете файл /etc/printcap, вы можете запустить демон lpd. Будучи суперпользователем, вы можете просто ввести команду lpd в командной строке. Если хотите, чтобы lpd запускался автоматически во время каждой загрузки системы, добавьте следующую строку в файл /etc/гс. conf: lpd_enable=MYES" Печать Глава 17 549
550 Системное администрирование Часть IV Теперь вы должны будете иметь возможность печатать из командной строки, придерживаясь инструкций из следующего раздела. Если печать не работает должным образом, ознакомьтесь с разделом поиска и устранения неполадок, который можно найти в конце этой главы. Базовая печать в режиме командной строки Команда 1рг служит для отправки файла спулеру печати. В самом простом случае lpr принимает следующую форму: • lpr filename Здесь filename представляет имя файла, который необходимо распечатать. Чтобы напечатать множество файлов, вы можете определить их имена в командной строке. Вы можете определить принтер, на который нужно отправить данные; для этого предназначена опция -Р. Если эту опцию опустить, lpr будет считать, что нужно использовать принтер по умолчанию. Принтер по умолчанию определяется путем проверки перечисленных ниже условий в порядке их следования; первое выполненное условие служит для определения принтера по умолчанию. • Если задана переменная окружения PRINTER, lpr будет использовать имя, указанное в ней, в качестве принтера по умолчанию. • Если задана переменная окружения LPDEST, lpr будет использовать имя, указанное в ней, в качестве принтера по умолчанию. • Используется имя принтера 1р, которое должно являться псевдоним одного из принтеров в файле /etc/printcap. • Если не будет задана ни переменная PRINTER, ни переменная LPDEST, и если ни один принтер не имеет псевдонима 1р в файле /etc/print с ар, запрос на принтер будет отклонен. Команда lpr имеет несколько опций. В табл. 17.3 перечислены некоторые опции, которые вы наверняка сочтете полезными. Таблица 17.3. Опции команды lpr Опция Описание -1 Использует фильтр, который будет печатать управляющие коды и убирать разрывы страниц. "Р Вывод форматируется с помощью утилиты рг, которая форматирует страницы по 66 строк с заголовком вверху каждой страницы; заголовок содержит дату и время создания файла, а также номер страницы и пять пустых строк внизу. -Р Посылает задание на принтер, отличный от принтера по умолчанию. "h Отменяет печать "отрывной" страницы, известной также как заголовочная или баннерная страница. Опция не работает, если заголовочные страницы по умолчанию отключены. ~гс Посылает вам электронное письмо, уведомляющее о том, что задание завершило печать.
Печать I ГГ7" - 551 Глава 17 I Окончание табл. 17.3 Опция Описание -г Удаляет файл после завершения спулинга. Пожалуй, эту опцию не следует использовать, поскольку она удалит файл, прежде чем он будет успешно напечатан. Если она применяется с опцией -s (см. ниже), она не удалит файл, пока он не будет полностью распечатан. "S Использует символические ссылки. Вместо того чтобы копировать файл в каталог спула, эта опция просто создает символическую ссылку на каталог спула из существующего файла. Это позволяет печатать файлы, размер которых не позволяет поместить их в область спула. Использовать эту опцию следует осторожно, дабы не изменить или не удалить файл до окончания печати. ~#л Здесь п представляет количество копий файла, которые требуется напечатать. (Эту функцию можно отключить.) -J job Здесь job представляет имя задания, которое нужно напечатать на баннерной странице. По умолчанию именем является имя первого указанного файла. "т Определяет строку заголовка, которую утилита рг должна использовать в заголовке вверху страницы. По умолчанию это должно быть имя файла. Эта опция применяется только в случае применения опции -р. "i n Здесь л представляет количество столбцов, определяющих отступ при выводе. ~w n Здесь п представляет ширину страницы в столбцах. Эта опция применяется только в том случае, если используется опция -р. Печать из приложений Х11 Разные приложения XI1 будут иметь разные средства печати, однако поведение большинства из них будет более или менее отличаться от того, которое вы могли ожидать от любого настольного приложения, а также от соответствующей работы подсистемы Ipr. В большинстве случаев приложение просто предложит опцию "Generic Printer" (Обобщенный принтер) для выходных данных принтера, указывая на командную строку Ipr, подобную той, которую вы использовали при отправке файла на принтер из командной строки. Диалоговые окна печати, применяемые в приложениях, будут отличаться, но поскольку печать Web-страниц является довольно обычной задачей, ниже показан пример печати из Firefox. Чтобы напечатать страницу, которую вы просматриваете в Firefox, выберите в меню File (Файл) пункт Print (Печать). На экране появится диалоговое окно, показанное на рис. 17.1. В разделе Print To (Печать в) в верхней части окна вы можете выбрать объект, в который будут посылаться выходные данные: на принтер или в файл. При выборе Printer (Принтер) появится окно Printer (Принтер), в котором вы сможете или принять поведение спулинга печати по умолчанию, которое будет использоваться в Firefox, или щелкнуть на кнопке Properties (Свойства), чтобы изменить базовую команду Ipr для реализации альтернативного поведения — например, чтобы вам посылалось электронное письмо по окончании работы или печаталась еще одна копия. (За дополнительной информацией обращайтесь в раздел о Ipr ранее в этой главе, а также на man-страницу Ipr.)
552 Системное администрирование Часть IV Printer Print To: ^{printer! Г FHe Printer: J PostScript/default * Ў] Properties... r <¦ Print Range ' <? Ail Pages Г Pages , С Print Frames ; с , с с Copies • "- - * ~~ "~~ Number of copiei: jl j Cancel I Print Рис. 17Л, Диалоговое окно Print (Печать) в Firefox. Обратите внимание на то, что если вы выберете переключатель File (Файл), то именем файла будет тоzilia .ps, которое показывает, что на выходе будет получен файл PostScript Многие программы XII тоже могут выводить данные в файл. При этом они обычно будут создавать файл PostScript, который затем может быть отправлен прямо на принтер PostScript, или запущен через GhostScript и отправлен на принтер не PostScript. Это отличный способ создать снимок того, что вы хотите напечатать, даже если ваш компьютер не имеет доступного в данный момент принтера; позднее вы сможете выполнить печать из файла, когда принтер будет готов к использованию. НА ЗАМЕТКУ Подобно многим другим программам UNIX, Firefox не имеет встроенных драйверов принтеров. Она просто выводит поток данных в формате PostScript, подавая их либо в lpr, либо в файл. Следовательно, вам понадобится программа GhostScript, если вы не используете принтер, который понимает PostScript. Печать в OpenOffice.org Если вы установили у себя на компьютере комплект OpenOffice.org, вы можете сконфигурировать для него принтер по умолчанию, дважды щелкнув на значке Printer Setup (Настройка принтера) на рабочем столе, если упомянутый значок существует; в противном случае можно запустить утилиту из /usr/local/openoffice. org2.0.0/ program/spadmin. Вы увидите диалоговое окно, показывающее ваш принтер по умолчанию ("Generic"), а также кнопки, которые вы можете использовать для добавления новых принтеров (рис. 17.2). Поскольку OpenOffice.org предлагает широкий выбор встроенных драйверов для различных принтеров, в нем не нужно использовать программу GhostScript для преобразования выходных данных PostScript. Вы можете просто выбрать соответствующую модель принтера из сциска и, следуя указаниям мастера, инсталлировать его в подсистему принтеров OpenOffice.org. Затем, используя кнопку Properties (Свойства) и другие кнопки в диалоговом окне, продолжите конфигурирование принтера, добавьте шрифты, распечатайте тестовые страницы и так далее.
Печать Глава 17 553 Installed printers ЛФШ№,Р1№ЫМ# Properties... штт^штттмтжштт. Command Driver; Location: Comment; Ipr Genf Mew Printer... ч# Choose a driver Please select a suitable driver IGeneriс Printer ^rwrlcPrlrtter (T42 enabled) HP Color Laserjet PS HP DesignJet 2S00CP HP Deskjet 1200C/PS HP Laserjet 4 HP LaserJet 4 HP Laserjet 4 Plus HP LaserJet 4 Plus 300dpi HP Laserjet 4ML "*1 J Zl 3 Им**» 1 ?glete | J «flack [ | &~ext >>]""! Рис. 17.2. Диалоговое окно конфигурирования принтера в OpenOffice. org. Обратите внимание, что OpenOffice.org имеет встроенные драйверы (в нижнем окне) для множества различных моделей принтеров Если вы не установили принтер, OpenOffice.org будет использовать принтер по умолчанию Generic Printer (Default Printer), который посылает вывод PostScript в lpr. СОВЕТ Даже если у вас инсталлирована программа GhostScript, вам, возможно, захочется воспользоваться одним из "родных" драйверов в OpenOffice.org — так вы сможете обеспечить более широкую поддержку разнообразных характеристик вашего принтера, чем с помощью GhostScript. Управление принтером в КОЕ Интерфейс KDE имеет встроенное средство просмотра очереди принтера с GUI-интерфейсом, и утилиту управления; вы можете добраться до них, выбрав пункты Settings (Сервис), Printing Manager (Диспетчер печати) в меню К, или войдя в Control Center (Центр управления) и выбрав Peripherals (Периферийные устройства), Printers (Принтеры)- В результате на экране появится панель управления, пример которой показан на рис. 17.3. Установить или переконфигурировать принтеры из этой утилиты напрямую нельзя - конфигурация принтера в FreeBSD по-прежнему зависит от содержимого файла /etc/printcap, из которого панель управления принтера KDE получает сведения о принтере, подобно любому приложению на основе CLL Однако она дает вам возможность просматривать очередь печати любого из существующих принтеров (для этого нужно выбрать в верхней панели принтер и перейти на вкладку Jobs (Задания)) в графическом и интерактивном виде, вроде того, как это делается в подобных утилитах в Windows и Mac OS X. Вы можете также воспользоваться меню Print System Currently Used (Используемая в данный момент система печати), чтобы заставить KDE применять альтернативные механизмы печати для данного принтера, такие как CUPS (об этой системе речь пойдет чуть позже в этой главе). Большинство приложений KDE используют обычный диалоговый компонент принтера, называемый KPrinter, который позволяет выбрать один из принтеров,
554 Системное администрирование Часть IV определенных в утилите Printing Manager (Диспетчер печати), и выполнить дополнительные поточные конфигурации во время печати. Подробное описание возможностей KPrinter можно найти на странице http://printing.kde.org/overview/ kprinter.php. щттштттттштт \ Ad<J ^PrfrTte^QWnt Server, "^Prtnt Manage^, !!]view 0 Documentation Г*ЕШВВС] ** Mail PDF File Ш Print to File (PostScript) Ш Advanced Faxing Tool (ksendfax) & Print to File (PDF) 1 Send to Fax ® Information j j^iobs j %Eroperties j ,rt Instances Ia»erjet4100 Type: Local printer State; idle (accepting jobs) Location: Description: Local printer URI: Device: Model: Print system currently used: [Generic UNIX LPD Print System (default) No phjgin Information available 3C ГЖЛГ Cancel Рис, 113. Панель управления утилиты Printing Manager (Диспетчер печати) в KDE Использование команды lpq для проверки состояния заданий печати Команда lpq служит для проверки состояния заданий, ожидающих в очереди печати. Если ее вызывать без каких-либо параметров, lpq сообщит о состоянии всех заданий, находящихся в данный момент в очереди принтера, используемого по умолчанию. Если будет задана переменная окружения PRINTER, то этот принтер будет рассматриваться как принтер по умолчанию. Если эта переменная не будет задана, то в качестве принтера по умолчанию будет использоваться принтер, являющийся псевдонимом для 1р в файле /etc/printcap. lpq можно вызывать также с номером задания, чтобы показать состояние только определенного задания, или с именем пользователя, чтобы отобразить состояние только тех заданий, которые принадлежат определенному пользователю. Вывод lpq будет выглядеть примерно следующим образом: # lpq -Р samsunginkjet samsunginkjet is ready and printing samsunginkjet готов к работе и печатает Rank Owner Job Files Total Size active frank 5 /home/btman/sample.txt 2000 bytes 2nd frank 6 /home/btman/sample1.txt 2500 bytes 3rd jack 7 /home/jack/myfile.txt 3200 bytes 4th jack 8 ... 5500 bytes
Печать Опция -Р говорит Ipq о том, что нужно сообщить о принтере, отличном от принтера, используемого по умолчанию, — в данном случае, о принтере под именем samsunginkjet. Все опции lpq будут рассмотрены позже. Первая строка в выводе lpq сообщает о том, что делает принтер в данный момент. В данном случае принтер готов к работе и выполняет печать. Если принтер остановлен, в нем нет бумаги, в нем застрял лист бумаги и тому подобное, lpq сообщит об этом. Приведенный здесь пример показывает четыре задания, находящиеся в очереди; одно из них является активным, а остальные расставлены в том порядке, в котором они будут подаваться на печать. Стоит обратить внимание на некоторые другие вещи. Третий столбец, обозначенный как Job, показывает идентификационный номер, присвоенный определенному заданию. Если вам нужно отменить задание печати (об этом мы поговорим позже), то вам понадобится идентификационный номер этого задания. Кроме того, в четвертом столбце указывается файл или файлы, которые в данный момент печатаются. Заметьте, что в четвертом столбце из этого примера присутствует троеточие. Оно означает, что полное имя файла слишком длинное, чтобы его можно было уместить в списке, поэтому 1рг просто не показывает его всего. х Команда lpq принимает и другие опции, которые перечислены в табл. 17.4. Таблица 17.4. Опции lpq Опция Описание -р пате Здесь пате — имя принтера. Благодаря этой опции, команда lpq покажет информацию об указанном принтере, а не о принтере, используемом по умолчанию. -1 Благодаря этой опции будет выведена информация о каждом файле в очереди, даже если информация не может уместиться в строке. (В предыдущем примере, благодаря этой команде было бы показано имя файла; а пока что вместо имени файла стоит троеточие, так как имя слишком длинное.) -a ipq отобразит состояние всех локальных очередей во всех принтерах. Удаление заданий из очереди с помощью команды lprm Команду lprm можно применять для удаления заданий печати, которые в данный момент находятся в очереди, а также (иногда) для удаления заданий печати, которые на данный момент выполняются. Если lprm выдается без каких-либо аргументов командной строки, она удалит любое задание, которое в данный момент печатается на принтере по умолчанию, при условии, что это задание принадлежит пользователю, выдавшему lprm. Если задание, выполняющееся в данный момент, не принадлежит такому пользователю, то эта команда не будет иметь никакого эффекта. Если суперпользователь выполнит команду lprm без опций, то эта команда удалит печатаемое в данный момент задание из принтера по умолчанию, независимо от того, кому онр принадлежит. Если lprm передать номер задания в качестве аргумента, она удалит задание с данным идентификационным номером из очереди принтера по умолчанию, предполагая, что вы являетесь владельцем задания, но не являетесь суперпользователем.
I ccft I Системное администрирование 1 556 I Часть IV Обычные пользователи могут удалять только те задания, которые им принадлежат. Суперпользователь может удалить любое задание. Чтобы узнать идентификационный номер задания, которое вы хотите указать в команде программе Iprm, воспользуйтесь командой lpq (о ней говорилось в предыдущем разделе): # Iprm 5 dfA001simba.example.com dequeued cfA001simba.example.com dequeued Эта команда удаляет из очереди два файла, связанные с идентификационным номером 5 задания: копию файла, находящуюся в спуле (начинается с dfAOOl), и файл управления. Когда оба эти файла будут удалены, задание печати будет остановлено, и любые данные, которые еще не были помещены в пул для принтера, будут отменены. НА ЗАМЕТКУ Для отклика на команду iprm системе может потребоваться некоторое время (вплоть до нескольких секунд). Вам может даже показаться, что команда iprm "зависла". Не беспокойтесь, все в порядке. Подождите несколько секунд, и вы получите ожидаемое приглашение. Если вы попытаетесь удалить задание, которое вам не принадлежит, и вы не являетесь суперпользователем, Iprm ответит сообщением Permission denied (В доступе отказано). Команда Iprm имеет несколько опций, позволяющих изменить поведение по умолчанию. Эти опции показаны в табл. 17.5. Таблица 17.5. Опции Iprm Опция Описание -р пате Здесь пате представляет имя принтера, из которого команда Iprm должна удалить задание. Если имя принтера не задано, будет использоваться принтер по умолчанию, определенный в переменной окружения printer. Если эта переменная не установлена, будет использоваться принтер по умолчанию, являющийся псевдонимом для 1р. Тире само по себе приведет к тому, что все задания, принадлежащие вам, будут удалены из очереди. Если вы являетесь суперпользователем, то из очереди будут удалены все задания. user Здесь user представляет имя какого-либо пользователя в системе. Эта опция удалит все задания, принадлежащие этому пользователю. Она работает только для суперпользователя, поскольку обычные пользователи могут удалять только задания, которые им принадлежат. ВНИМАНИЕ! Удаление задания, которое на данный момент находится в печати, не приведет к немедленном) останову принтера В зависимости от объема оперативной памяти, установленной на принтере в буфере принтера может находиться несколько страниц данных. Это означает, что часть доку мента может быть напечатана в любом случае (или, если документ небольшой, может быть ра печатан весь документ), даже если он будет удален из очереди.
Печать НА ЗАМЕТКУ Задания печати могут быть удалены только из той системы, из которой они были отправлены, даже если принтер доступен для нескольких компьютеров, подключенных к сети. Управление принтерами Принтерами и связанными с ними очередями можно управлять посредством команды 1рс. Эту команду использует системный администратор для выполнения задач по администрированию принтера. Обычным пользователям доступны некоторые ограниченные функциональные возможности вроде отображения состояния очередей и перезапуска демона принтера, если в его работе произошел сбой. Среди прочего, 1рс можно использовать для активизации и блокирования принтеров, включения и отключения очередей принтеров, изменения порядка заданий в очереди, чтобы файлы, находящиеся внизу очереди, можно было напечатать первыми. Кроме того, эту команду можно применять для проверки состояния очередей. Если в команде 1рс не будет задано никаких аргументов, она запустится в интерактивном режиме с приглашением. Выполняя команду 1рс, вы можете также задать аргументы командной строки. Если вы сделаете это, 1рс запустится, обработает аргументы, указанные в командной строке, и завершит работу. Для начала рассмотрим интерактивный режим 1рс. Использование 1рс в интерактивном режиме Если 1рс будет запущена без аргументов, она будет работать в интерактивном режиме. В интерактивном режиме будет отображаться следующее приглашение: 1рс> Вы можете ввести ? или help и нажать клавишу <Enter>, чтобы получить список доступных команд. Если ввести help и указать имя одной из команд, вы получите короткое, однострочное описание того, что делает эта команда. При вводе команд можно использовать их сокращенные формы, которые не являются неоднозначными. Например, команду status можно сократить до stat. Хотя до sta эту команду сократить нельзя, поскольку существует еще команда start, и 1рс не сможет понять, какая именно команда подразумевается в сокращении. Если вы введете недостаточное количество символов в сокращенном написании команды, 1рс ответит сообщением ?Ambiguous command (Неоднозначная команда). Если команда, которую вы ввели, не существует, ответом будет сообщение ?Invalid command (Недопустимая команда). Проверка состояния очереди Чтобы проверить состояние очереди, используйте команду status (как было сказано выше, можно применять сокращение stat этой команды). Потребуется также определить аргумент, которым должен быть либо all, чтобы отобразить состояние всех демонов и очередей, либо имя принтера, чтобы показать состояние только для данного принтера.
558 Системное администрирование Часть IV Вот пример: lpc> status lp ' 1р: queuing is enabled (очередь разрешена) printing is enabled (печать разрешена) 2 entries in spool area (в области спула имеется 2 элемента) waiting for lp to become ready (offline?) (ожидание готовности lp (отключен?) В результате вы узнали о состоянии для линейного принтера, используемого в системе по умолчанию. В данном случае очередь разрешена, печать разрешена, в очереди находится два элемента, ожидающие печати. Однако пока что ничего не печатается, так как принтер недоступен, и 1рс предполагает, что он может быть отключен. Команду stat могут выдавать как обычные пользователи, так и системные администраторы. Запрет, печать и останов демона Команды abort и stop могут использоваться системным администратором для запрета печати, а также для останова демона, обрабатывающего спулинг для принтера. Каждой из команд требуется аргумент либо all, который запретит печать во всех очередях и остановит работу демонов, или же имя принтера, в результате чего команда будет применена только к указанному принтеру. Команда abort приводит к немедленному останову печати и останову демона, обрабатывающего спулинг для данного принтера. Ниже показан пример выполнения этой команды: lpc> abort lp lp: printing disabled (печать запрещена) daemon (pid 597) killed (демон (pid 597) уничтожен) А теперь посмотрите на результаты выполнения команды status после выполне ния предыдущей команды: lpc> status all lp: queuing is enabled (очередь активизирована) printing is disabled (печать запрещена) 2 entries in spool area (в области спула имеется 2 элемента) printer idle (принтер простаивает) В отношении полученных данных следует отметить две важных особенности. • Область спула по-прежнему имеет два элемента. Команда abort просто ум чтожает демон и отключает принтер. Она не удаляет задания из области сп)л Когда демон будет запущен вновь и принтер снова будет разрешен, задания, н ходящиеся в области спула, возобновят печать. • Помещение заданий в очередь включено. Это означает, что вы (и другие пол зователи) по-прежнему можете посылать задания на принтер. Они будут пом щены в очередь, чтобы подождать, пока демон запустится снова и будет разре шен принтер. С этого момента будут печататься любые задания, составленны в тот момент, когда принтер был отключен, а также другие задания, которы уже находятся в очереди.
Печать I ZZZ I 559 Глава 17 I __J Команда stop работает подобно команде abort, за исключением того, что она будет ожидать окончания печати текущего задания, после чего отключит принтер и остановит работу демона спула. Как и в случае с командой abort, команда stop не выталкивает существующие задания из очереди, и очередь по-прежнему будет принимать составленные пользователями задания, и будет удерживать их для печати на тот случай, когда принтер окажется доступным. СОВЕТ Если вы отключите принтер на продолжительный период времени (например, для обслуживания), проанализируйте псевдонимы этого принтера и его псевдонимы для другого принтера в файле /etc/printcap. Если это точка входа в принтер, используемый в системе по умолчанию, то в таком случае нужно указывать также псевдоним 1р для другого принтера. В результате любые задания печати, посылаемые этому принтеру, будут перенаправляться на другой принтер, не требуя от пользователей производить какие-либо изменения в их конфигурации. Конечно, лучше применять псевдоним ^функционирующего принтера для принтера, имеющего такой же тип и физически расположенного ближе к нефункционирующему принтеру. Кроме того, вы, вероятно, захотите посылать электронные сообщения по всей системе пользователям, затронутым этим изменением, подсказывая им, где они смогут найти свои задания печати до того времени, пока принтер, к которому они привыкли, снова станет доступным. Отключение постановки заданий в очередь печати Ни команда abort, ни команда stop не запрещают очередь. Если, например, вы отдаете принтер на обслуживание, и просто выдаете команду abort, чтобы уничтожить демон и отключить принтер, очередь все равно будет доступной. Пользователи смогут продолжать посылать задания на принтер, как если бы ничего не случилось, и очередь будет без проблем принимать задания и хранить их для печати до того момента, когда принтер станет доступным. Чтобы ожидания ваших пользователей были реалистичными, вам, возможно, придется запретить очередь, если принтер будет отключен на продолжительный период времени. Это можно сделать двумя способами. Первый метод состоит в использовании команды disable. Для нее требуется аргумент, которым может быть или all, чтобы запретить все очереди в системе, или имя конкретного принтера, чтобы запретить очередь только для этого принтера. Ниже показан пример: lpo disable lp 1р: queuing disabled (постановка в очередь запрещена) lpo status all lp: queuing is disabled (постановка в очередь запрещена) printing is enabled (печать разрешена) 3 entries in spool area (в области спула имеется 3 элемента) waiting for lp to become ready (offline?) (ожидание готовности lp (отключен?)) В данном случае очередь запрещена, но печать по-прежнему разрешена. Это означает, что принтер продолжит печатать все задания, находящиеся на данный момент в очереди (если он может делать это), однако очередь больше не будет принимать новые задания.
560 Системное администрирование Часть IV Если вы попытаетесь послать задание на принтер с отключенной очередью, которая не принимает задания, вы получите сообщение, пример которого показан ниже: # lpr myfile.txt lpr: Printer queue is disabled (lpr; Очередь принтера отключена) Другой способ отключения очереди состоит в применении команды down. Подобно команде disable, ей необходим хотя бы один аргумент, которым может быть либо all, чтобы она была выполнена в отношении всех очередей в системе, либо имя принтера, чтобы она была выполнена только для одного принтера. Команда down на самом деле посылает команду stop, которая отключает принтер и демон спула после того, как текущее задание завершит печать, а затем посылает команду disable, чтобы отключить очередь. Команда down может принимать также необязательное сообщение в качестве аргумента. Это сообщение будет записано в файл состояния в каталоге спула принтера. Затем оно будет отображено в выходных данных lpq, чтобы пользователи могли знать, почему очередь не принимает их запросы. Ниже показан пример: lpc> down lp Printer ±e down for maintenance. printer and queuing disabled принтер и постановка заданий в очередь отключены Если после этого запустить lpq, вы увидите следующие результаты: #ipq Warning: lp is down: Printer is down for maintenance. Предупреждение: работа lp прекращена: принтер отключен в связи с обслуживанием, Warning: lp queue is turned off Предупреждение: очередь lp выключена Printer is down for maintenance. Принтер отключен в связи с обслуживанием. Rank Owner Job Files Total Size Для включения неработающей очереди просто введите enable all, чтобы разрешить работу всех очередей. Как вариант, вы можете ввести имя принтера, чтобы разрешить очередь только для данного принтера. Ниже показан пример: lpc> enable lp lp: queuing enabled (постановка в очередь разрешена) lpc> status lp lp: queuing is enabled (постановка в очередь разрешена) printing is disabled (печать запрещена) 3 entries in spool area (в области спула имеется 3 входа) Printer is down for maintenance. (Принтер отключен в связи с обслуживанием. Обратите внимание на то, что хотя в этом случае очередь была восстановлена принтер не был включен. Сейчас очередь будет принимать задания, но они не будут печататься. Если вы использовали команду down для отключения очереди, выдайте команду up, чтобы восстановить ее вновь. В результате выполнения команды up очередь, будет снова разрешена, демон спулинга будет перезапущен, и будет разрешена работа принтера. Однако эта команда не очистит сообщение о состоянии. Чтобы
Печать I _л-1 I ¦ — 561 Глава 17 1 „ J очистить сообщение о состоянии, вам придется запустить команду restart, о которой мы поговорим в следующем разделе. Перезапуск демона спулинга Если вам нужно перезапустить демон спулинга, можете воспользоваться командой restart. Если в данный момент не работает ни один демон, эта команда запустит демон. Если в данный момент работает демон, эта команда уничтожит его и перезапустит его заново (обязательно прочтите следующую врезку "Внимание!**). Эту команду можно применять, например, для сброса "зависшего** демона. Команда restart требует аргумента, которым может быть или all, чтобы сбросить все демоны печати в системе, или имя принтера, чтобы перезапустить демон только для данного принтера. Ниже показан пример использования этой команды: lpc> restart Xp 1р: daemon (pid 2102) killed (демон (pid 2102) уничтожен) IP: daemon started (демон запущен) ВНИМАНИЕ! Порой с помощью команды restart можно уничтожить работающий демон, не перезапуская его снова, даже если команда сообщает, что она сделала это. Поэтому лучше всего проверить выходные данные lpq по данному принтеру. Если lpq отображает в строке состояния предупреждение Warning: no daemon present (Предупреждение: нет ни одного демона), то это будет* означать, что lpc остановила работу демона когда была выполнена команда restart, но затем не смогла перезапустить его. Если это произойдет, просто выполните команду restart еще раз из lpc, и проблема будет устранена. Очистка каталога очереди Команда clean в lpc очищает каталог очереди. Она удалит любые управляющие файлы и связанные фрагменты заданий печати, которые нельзя распечатать. Как и большинство команд в lpc, команде clean требуется аргумент, либо в виде all, либо в виде имени каталога спула принтера, который требуется очистить. Изменение приоритета заданий печати С помощью команды topq можно изменить порядок заданий печати в очереди (то есть, переместить задания, находящиеся в конце или в середине очереди, в начало очереди, дабы они были напечатаны быстрее). Порядок заданий печати может изменить только системный администратор. Базовый синтаксис команды topq выглядит следующим образом: topq printername jobnum(s) . .. Здесь, printername — это, естественно, имя принтера, a jobnum(s) — список номеров заданий, которые вы хотите переместить в начало очереди. В этой команде вы можете определить несколько номеров заданий, и она напечатает их в соответствии с заданным порядком. Первое указанное задание будет перемещено в начало
562 Системное администрирование Часть IV Rank 1st 2nd 3rd 4th Owner btman btman btman btman Job 8 9 10 12 Files myfile.txt cardlist.txt lions.txt schedule.txt Rank 1st 2nd 3rd 4 th Owner btman btman btman btman Jo 12 10 9 8 очереди, второе задание окажется вторым в очереди и так далее. Например, преддо ложим, что в данный момент очередь выглядит так: Total Size 151625 bytes 38311 bytes 1113 bytes 6599 bytes Чтобы изменить порядок этих заданий на противоположный, эведите topq lp 12 10 9 8. Ниже показан результат выполнения этой команды: lpc> topq lp 12 10 9 8 lp: moved cfA008simba.example.com (перемещено cfA008simba.example.com) moved cfA009simba.example.com (перемещено cfA009simba.example.com) moved cfA010simba.example.com (перемещено cfA010simba.example.com) moved cfA012simba.example.com (перемещено cfA012simba.example.com) Если вы теперь посмотрите на очередь, то она будет выглядеть следующим об* разом: Files Total Size schedule.txt 6599 bytes lions.txt 1113 bytes cardlist.txt 38311 bytes myfile.txt 151625 bytes Команда topq может также принимать имя пользователя вместо списка задании Если команду topq использовать подобным образом, она переместит все задани принадлежащие указанному пользователю, в начало очереди. - Следует иметь в виду, что topq не откладывает выполняемое в данный мошт задание. Она перемещает перечисленные задания в начало очереди, чтобы от at чатались следующими, однако любое задание, которое печаталось перед выполнен» ем команды topq, завершит печать, прежде Чем задание будет совершено перемещ ние. Если вы хотите, чтобы определенное задание было напечатано правильно, s должны сначала выдать команду lprm, чтобы удалить печатаемое в данный моме задание. Выход из 1рс Чтобы выйти из программы 1рс, в приглашении 1рс> просто введите или qui или exit. Вы снова окажетесь в командной строке. Использование программы 1рс в неинтерактивном режиме Программа 1рс может выполняться и в неинтерактивном режиме, принимая мандную строку и не показывая приглашение. Этот режим полезен для приложен сценариев, таких как сценарии оболочки, которые вы можете написать для реали ции функций обслуживания принтера. В этом случае после 1рс в командной стр нужно просто задать команду, которую вы хотите выполнить, вместе с любыми обходимыми параметрами.
Глава 17 I 1 J Когда программа lpc работает в неинтерактивном режиме, она ожидает, что в качестве первого аргумента будет команда, а все, что за ней последует — аргументы к этой команде. Ниже показан пример: # lpc restart lp lp: daemon (pid 2280) killed (демон (pid 2280) уничтожен) lp: daemon started (демон запущен) Все команды, доступные в интерактивном режиме, доступны также и в неинтерактивном режиме. Как управлять разрешениями на использование lpc Иногда вам может понадобиться предоставить другому человеку возможность управлять принтерами с помощью lpc, не предоставляя ему полные системные привилегии суперпользователя. Сделать это позволит группа "операторов**. Любой пользователь, являющийся членом группы "операторов", может использовать lpc в полном объеме, не обладая полномочиями суперпользователя в системе. Благодаря этому пользователь сможет изменять приоритет заданий печати, запускать и останавливать демоны печати, а также включать и выключать очереди. В главе 13 вы можете прочитать о труппах и о способах добавления пользователей в них. Базовая печать через сеть Во многих вычислительных средах компьютер сам по себе не имеет принтера, подключенного к нему через параллельный или USB-порт. Наоборот, задания посылаются на принтер по сети, используя те же соединения TCP/IP, что и для связи с любым Web-хостом или другим приложением типа клиент-сервер. Чтобы сконфигурировать FreeBSD для отправки по сети заданий печати на удаленный принтер, вы должны просто добавить соответствующую запись в файл /etc/printcap, определяя параметры принтера так, чтобы FreeBSD смогла найти его. Iaserjet8150Ilp|local line printer (but not really):\ :lp«::rm-nova:rp«lj8150:soWvar/spool/lpd/laserjet8150=/var/log/lpd~errs: Эта запись подключит удаленный принтер 1J8150, определенный на хосте nova. Обратите внимание, что локальное имя (в строке 1) не должно быть таким же, как и удаленное имя принтера. Вы можете вызвать локальное имя всякий раз, когда вам это будет необходимо. Управление тем, какому принтеру будет отправлено задание, осуществляется записями rm и гр в строке 2, которая определяет удаленный хост и очередь, а не имя локального устройства. Локальный каталог спула будет хранить файл только до тех пор, пока удаленный каталог спула будет иметь для него место. Затем ч?айл будет перемещен в каталог спула удаленного хоста. НА ЗАМЕТКУ Обратите внимание на то, что здесь вам не нужно было указывать фильтр входных данных. Это объясняется тем, что вся фильтрация будет обрабатываться удаленным хостом.
I KftA I ^истемное администрирование I 5B4 Г Часть IV Принтер на удаленном хосте должен быть сконфигурирован согласно инструвд ям по конфигурированию принтера, приведенным ранее в главе, если речь идет системе UNIX, использующей 1рг. Хотя, если этот компьютер работает под упрж нием Windows, и с этого компьютера выполняется управление центральным принт ром, то вам может понадобиться перейти вообще в другую систему печати, чтобы с лучить доступ к протоколам печати Windows, которые на данный момент становм все более и более распространенными. Самым распространенным последователе lpr в этом отношении является CUPS. Печать следующего поколения с помощью CUPS CUPS (Common UNIX Printing System — Общая система печати UNIX) являет альтернативой почтенной подсистемы lpr, представленной ранее в этой главе, предназначена для межплатформенных решений печати для всех сред UNIX. ГО не является стандартной частью FreeBSD, и не включена в стандартную установи FreeBSD. Тем не менее, она доступна в коллекции портов FreeBSD, а ее домашня страница (там можно найти массу полезной информации) расположена по адре http://www.cups•org. Преимущество CUPS состоит в том, что печать осуществляется примерно та же, как и в Windows, в которой принтеры описываются для операционной сиск мы с помощью файлов PPD (PostScript Printer Description — Описание принтеров PostScript), которые можно распространять по сети незаметно для пользователя,ш которой задания печати передаются посредством промышленного стандарта Intent Printing Protocol (IPP — Протокол печати в Internet). Многие операционные систем. семейства UNIX, включая Mac OS X и множество дистрибутивов Linux, уже приш CUPS в качестве стандартного механизма печати. Установите CUPS из портов или пакетов в категории print (этим вопросам поев» щена глава 16). После того как CUPS будет инсталлирована, вам нужно будет перейти в /usr/local/etc/rc.d и переименовать cups.sh.sample на cups.sh, послечег запустить демон с помощью команды . /cups.sh start. Для добавления принтеров и управления очередями CUPS предлагает полны набор инструментов командной строки; кроме того, можно воспользоваться WeW терфейсом, с помощью которого печатью можно управлять графически, как пош но на рис. 17.4. В своей конфигурации по умолчанию к Web-интерфейсу CUPS можно получить д ступ из локальной системы с помощью браузера в XII; перейдите по адресу http: localhost: 631, чтобы войти в систему. Когда вам будет предложено ввести данные об аутентификации пользователя укажите имя и пароль суперпользователя системы. Затем вы сможете использовав кнопки на странице, чтобы настроить принтеры с помощью серии последовать ных окон "мастера", выбирая драйверы и определяя поведение принтеров. Зате вы сможете отправить существующие задания печати командной строки и KDE гораздо более универсальную подсистему CUPS, а не в lpr, и наблюдать за ними помощью одного и того же Web-интерфейса. Если вам нужно загрузить новые дра веры для конкретной модели принтера, то гораздо проще сделать это в CUPS, че в lpr — зайдите на сайт http: //www. cups .org, чтобы просмотреть список серийн поддерживаемых драйверов и почитать инструкции, поясняющие порядок добаы ния драйверов в систему. Поскольку CUPS является базовой технологией печати
Печать Глава 17 565 Mac OS X и многих дистрибутивах Linux, многие современные драйверы принтера пишутся для CUPS, а не для 1рг, поэтому если ваш принтер не поддерживается ста\ дгртной системой печати в FreeBSD, попытайтесь настроить CUPS. *ioca«on Edit y)ew fio fiookmarks loots Settings Window дар & » Lflcatlom J v http://localhost:631/printers/lj4100 ESP Administration Classes Hel* Jebs Printers Seftw are IJ4100 Default Destination: од*!»** Шт Л** яь* Description! Laserjet 4100 Location! Next to the Break Room Printer State; Idle, accepting jobs. Device URL http;//nova;631/lp$/ «bhen tflBIP No Active jobs Copyright 1993-2005 by Easy Software Products, Afl Rights Reserved, The Common Ш/Х Prkttng System CUPS, and the CUPS tog© are the trademark property of ?asv Software Products. All other trademarks are the property of their respectft/е owners, Puc 17.4. Web-интерфейс CUPS ВНИМАНИЕ) Конфигурацию Web-интерфейса CUPS можно изменить, чтобы осуществлять удаленное администрирование. Однако имейте в виду, что этим вы разрешите удаленным пользователям получать доступ к Web-серверу на вашей FreeBSD-машине, работающей с привилегиями суперпользователя. Разумеется, это может привести к непредсказуемым последствиям. Если все работает нормально, и если ваш пароль суперпользователя является безопасным, то теоретически никаких проблем возникнуть не должно. Однако как только на Web-сервере обнаружится переполнение буфера, удаленный пользователь сможет совершить атаку на систему. Помимо всего прочего, еще и отсутствует шифрование, поэтому вам придется передавать свой пароль суперпользователя открытым текстом каждый раз при доступе к системе CUPS. Вам не следует разрешать удаленное Web-администрирование CUPS, если только в этом нет особой необходимости. Полное описание CUPS и всех ее возможностей выходит за рамки этой книги; исчерпывающая документация по CUPS доступна на странице http: //www.cups. org/ doc-l.l/sarruhtml.
I ___ I Системное администрирование I I Часть IV Поиск и устранение неполадок В процессе использования принтеров могут возникать разные неприятности. В этом разделе будет рассказано о некоторых наиболее распространенных проблемах и способах их решения. Принтер не получает данные; задания находятся в очереди Проверьте lpq и убедитесь в том, что демон спулинга работает. Если будет выдано предупреждение Warning: no damon present (Предупреждение: нет ни одного демона), вам нужно будет воспользоваться 1рс и перезапустить демон спулинга. Также проверьте 1рс и убедитесь в том, что принтер не отключен. Для устранения других неполадок может понадобиться выключение и включение питания принтера. Чтобы свести к минимуму причину, по которой данные не выводятся на печать, можно перенаправить вывод CUPS в локальный файл, напечатать задание и проверить файл, дабы убедиться, что он получает данные. Если он не получает данные, это означает, что сама подсистема печати не отправляет их. Если он получает данные, значит, в ошибке виноват принтер. Данные попадают на принтер, но он их не печатает Часто это оказывается симптомом отправки данных не-PostScript на принтер PostScript. Проверьте фильтр и убедитесь в том, что он корректно отфильтровывает текст и преобразует его в PostScript. Печать файла изображений в GIMP или Web-страницы приводит к печати множества страниц с мусором Это часто может быть симптомом того, что данные PostScript подаются на принтер, который не понимает PostScript. Принтер не-PostScript попытается напечатать файл как простой текст. Проверьте работу программы GhostScript и прочитайте раздел "Печать файлов PostScript на принтерах не-PostScript" выше в этой главе. Принтеры, имеющие большой объем встроенной памяти, способны демонстрировать раздражающую тенденцию продолжать печатать ненужные данные PostScript даже после отмены задания печати. Вам придется отменить задание и выключить и включить питание принтера, чтобы удалить из памяти принтера страницы, помещенные в пул, и чтобы принтер перестал впустую расходовать бумагу. Принтер работает медленно Попробуйте установить для принтера режим опроса (предполагая, что принтер подключен к параллельному порту компьютера). Для этой цели используйте следу» щую команду: # lptcontrol -р
Печать I ZTZ I . .^^__j ggy Глава 17 I I Помните о том, что вам нужно будет добавить эту команду в файл запуска, если вы хотите, чтобы она выполнялась во время каждой загрузки системы. Обратитесь к разделу в начале главы, в котором рассказывалось о команде lptcontrol. Печать строк производится в виде "лесенки" Симптом "лесенки" выглядит примерно так: Первая строка. Вторая строка. Третья строка. Четвертая строка. Так будет продолжаться до тех пор, пока текст не достигнет конца строки. Эта проблема возникает сравнительно часто и связана с различиями в интерпретации символа перевода строки (LF) в UNIX и DOS/Windows. Когда в DOS/Windows производится переход на новую строку, система посылает символ возврата каретки (CR) и перевода строки. С другой стороны, в системе UNIX посылается только символ перевода строки, и ожидается, что при этом подразумевается символ возврата каретки. Если ваш принтер ожидает комбинацию символов возврата каретки и перевода строки, как это принято в DOS, он будет подавать бумагу, но не будет переводить печатающую головку на начало.строки. Эту проблему можно решить несколькими способами. Один из них заключается в том, чтобы в конфигурации вашего принтера найти такую опцию, которая бы изменила способ интерпретации символа перевода строки. Об этой возможности вы можете узнать в документации к принтеру» Другой способ состоит в том, чтобы создать фильтр, который мог бы преобразовывать символ перевода строки в комбинацию символов возврата каретки и перевода строки. Если ваш принтер понимает язык PCL, разработанный в компании Hewlett-Packard, то для выполнения этой задачи можно использовать фильтр, показанный в листинге 17.4, который рекомендуется в онлайновом справочнике FreeBSD Handbook. Листинг 17.4. Фильтр, написанный на языке PCL, который преобразует символы перевода строки в стиле UNIX в комбинацию символов возврата каретки и перевода строки в стиле DOS f!/bin/sh # # hpif - простой входной текстовый фильтр для демона lpd для принтеров HP-PCL # Установлен в /usr/local/libexec/hpif * t Просто копирует stdin в stdout. Игнорирует все аргументы фильтра. I Сообщает принтеру о том, что LF нужно обрабатывать как CR+LF. f По окончании выбрасывает страницу. printf "\033&k2G" && cat && printf "\033&10H" && exit 0 exit 2 Более подробную информацию об установке и работе с этим фильтром можно прочитать в разделе, посвященном текстовым фильтрам, ранее в этой главе.
Системное администрирование Если ваш принтер не понимает PCL, вы можете воспользоваться командой tr для преобразования LF в CR+LF. Эту операцию можно проделать с помощью фильтра, приведенного в листинге 17.5. Листинг 17.5. Фильтр, написанный не на основе PCL, который преобразует символы перевода строки в стиле UNIX в комбинацию символов возврата каретки и перевода строки в стиле DOS #!/bin/sh # Фильтр, который устраняет эффект "лесенки" на принтерах, не понимающих PCL, /bin/cat | tr 'Ш' '\13\10' && exit 0 exit 2 Опять-таки, обратитесь к разделу, посвященному текстовым фильтрам, выше в этой главе, чтобы получить дополнительную информацию об установке и работе с этим фильтром. Весь текст печатается в одной строке, порождая беспорядок и выводя строки поверх существующего текста По сути, эта проблема прямо противоположна проблеме "лесенки". Хоть она и редкая, но временами таки возникает. При этом происходит вот что: символ LF ин терпретируется принтером как символ CR. В конце каждой строки печатающая го- ловка возвращается в начало строки и продолжает печатать, хотя бумага вперед не подается. Для устранения этой проблемы нужно будет внести изменения в конфигурацион ные настройки принтера, чтобы он правильно интерпретировал символы CR и LF Подробности того, как это делается, можно найти в документации к принтер}. Если обнаружится, что вы не можете изменять аппаратные настройки принтера для устранения этой проблемы, можно будет воспользоваться фильтром вроде того который устраняет проблему "лесенки"; вам просто нужно будет изменить его таким образом, чтобы символы CR (\10) преобразовывались в последовательности CR+LF (\13\10).
18 ГЛАВА Конфигурация ядра В этой главе... • Роль ядра • Модули ядра • Для чего нужно конфигурировать специальное ядро? • Конфигурационные файлы ядра • Создание конфигурационного файла специального ядра • Компиляция и установка специального ядра • Добавление узлов устройств в каталог /dev • Как произвести восстановление, если что-то работает неправильно?
I IZ7 | Системное администрирование I 1 Часть IV В этой главе будет рассматриваться вопрос, который наверняка окажется одним из наиболее "устрашающих" для новичков в UNIX: конфигурирование и повторная сборка ядра» самого сердца операционной системы, которое взаимодействуете устройствами на наиболее базовом уровне и координирует работу процессов. Такую задачу вы не встретите в мире настольных ПК, в котором компании, производящие программное обеспечение, тщательно скрывают ядро от пользователей. Тем не менее, тонкая настройка ядра весьма необходима при работе с постоянно развивав щейся открытой системой, когда новым устройствам постоянно требуется все боль ше функциональных возможностей со стороны ядра. Конфигурирование ядра не является простой задачей, хотя смелый пользователь сможет освоить основы, не прилагая для этого чрезмерных усилий и особо не рискуя. Конфигурирование ядра является основой настройки FreeBSD и подобных ей операционных систем. Хорошо настроенное ядро будет обслуживать абсолютно все запросы, направляемые в него системой и пользователями, избавляясь при этом от всего ненужного багажа, который может иметь ненастроенное ядро, и, тем самым ускоряя работу операционной системы. В этой главе вы найдете достаточное количе ство материала о процессе конфигурирования ядра, который поможет разгадать вс его тайны и позволит настроить ядро таким образом, чтобы выжать из него столько производительности и функциональности, сколько это возможно. Роль ядра Ядро представляет собой главный исполняемый файл системы. Этот файл выпо няется первым из блоков загрузки при включении системы, и постоянно функциони рует в течение всего рабочего цикла машины. В его обязанности входит наблюдем за всеми процессами, работающими в системе, обработка TCP/IP и прочих сетевы\ аспектов, управление доступом ко всем устройствам в системе и управление йот зованием памяти — и это далеко не полный список того, за что отвечает ядро. Каждая операционная система, начиная с самой первой, появившейся в над стрии вычислений, имела ядро. Независимо от того, является ли платформа "дре ней" и базовой, как Apple ] [ или 286-й ПК, работающий под управлением MS-DOS либо же это настольная операционная система вроде Mac OS X и Windows XP, и, высокопроизводительный многопроцессорный компьютер, ядро будет присутств вать всегда, обрабатывая все, что скрывается за кулисами ваших пользовательею приложений. В некоторых операционных системах ядро скрыто от пользователя гораздо надеж нее, чем в других. В ОС Windows ядром служит файл в каталоге С: \WINDOWS\SYSTE в Mac OS X ядро спрятано в иерархии скрытых папок, известных только эксперт а в классической Mac OS ядро и вовсе спрятано от файловой системы. Во мног системах UNIX ядро помещается, как правило, в корневой каталог в начале фай, вой системы. В ОС FreeBSD до выхода версии 5.0 ядро находилось в каталоге после него — в каталоге \boot. В каждой из этих операционных систем стандартн (или "обобщенное") ядро является частью каждой выпускаемой версии системы; к» да настает черед выхода следующей версии системы, то все изменения представля собой главным образом дополнения, направленные на подгонку драйверов к нов устройствам, поддерживаемым системой. Ядро знает о каждом типе устройства, торое может быть подключено к системе.
Когда вы инсталлируете драйверы для нового и ранее не поддерживаемого устройства в Windows, то обычно требуется перезагружать компьютер. Это объясняется тем, что драйверы, библиотеки и остальные объекты, используемые вашим ядром, оказались измененными и поэтому не могут быть включены в работу системы "на лету". В большинстве случаев нужно перезапустить систему, чтобы задействовать новые ресурсы. FreeBSD, в отличие от Linux, классической Windows и Mac OS, а также ряда других операционных систем, использует архитектуру микроядра, что означает, что ядро имеет довольно небольшой размер и является модульным. Системы Windows NT/ 2000/ХР и Mach (ядро, на основе которого построена Mac OS X) являются другими примерами микроядер, в которых новые устройства чаще всего добавляются посредством модулей ядра (которые можно загружать и выгружать в процессе работы), нежели путем перекомпиляции ядра. В отличие от них, системы Windows 95/98/Ме (и, в прошлых версиях, Linux), наоборот, имеют монолитные ядра, в которых код ядра оптимизирован для максимальной производительности и минимизации переключения контекста. Архитектура монолитного ядра способствует быстрому выполнению кода ядра, но она является неудобной и сложной в смысле поддержки для разработчиков, а администратору нужно перекомпилировать ядро при добавлении поддержки нового устройства. Среди ландшафта современных операционных систем довольно сложно выделить микроядро или монолитное ядро. Нынешняя Linux довольно интенсивно работает с модулями ядра, а ядро FreeBSD нужно перекомпилировать по целому ряду различных причин. Отличие между архитектурой микроядра и монолитного ядра в основном лежит в плоскости философии и не заканчивается простой поддержкой устройств. К тому же, естественно, ни одно ядро не функционирует в соответствии с его философскими идеалами. Наиболее серьезное и фундаментальное отличие между двумя архитектурами ядра заключается в том, что микроядро имеет механизм передачи некоторых внеядерных системных вызовов на пользовательский уровень обработки, или кольцо, вместо того чтобы обрабатывать все вызовы самостоятельно и возлагать на ядро только те функции, которым требуется самый высокий статус выполнения в привилегированном режиме. Хранение 'в ядре только самых необходимых функций увеличивает надежность среды времени выполнения и делает процессы ядра более понятными и управляемыми. Кроме того, такая систематизация обеспечивает некоторый уровень защиты за счет уменьшенной сложности и упрощает поддержку модульного кода драйвера устройства. Обратной стороной медали является то, что микроядро подобно объектно-ориентированному программированию: оно не может работать так же быстро, как чисто процедурная или монолитная программа, но, несомненно, ее легче собрать из базовых компонентов. Хотя идеал общей модульности всем хорош, ядро, в котором каждый возможный тип устройства и опция являются модульными и загружаемыми во время работы, теоретически представляет собой "вечный двигатель". Скорее всего, по мере того как вы будете набираться опыта в FreeBSD, вы достигнете той точки, когда уже невозможно избежать перекомпиляции ядра; это произойдет как раз в тот момент, когда вы пройдете ритуал посвящения в касту хакеров ядра. Эта глава начинается с рассмотрения вводных вопросов о модулях ядра и способах расширения микроядра FreeBSD "на лету"; после этого будут рассмотрены более сложные задачи, необходимые для перекомпиляции вашего ядра из исходных кодов, и позволяющие удовлетворять нуждам вашей системы.
572 Системное администрирование Часть IV Модули ядра В своей стандартной конфигурации FreeBSD имеет несколько десятков модулей ядра, каждый из которых находится в каталоге /boot /kernel вместе с самим файлом kernel. Каждый из них предоставляет некоторые новые функциональные возможности или поддержку устройств, которые не обязательно присутствуют в стандартном ядре (GENERIC). Суперпользователь может загружать и выгружать эти модули ядра — файлы с расширениями . ко (то есть "kernel object" — объект ядра) — в любой момент времени, добавляя возможности, такие, например, как способность читать нестандартный тип файловой системы или работать с необычной Ethernet-картой. В качестве примера давайте рассмотрим модуль smbf s . ко. Этот модуль, судя по его названию, обеспечивает поддержку файловой системы SMB (тип файловой системы, лежащий в основе совместного использования файлов по сети в Windows), которой нет в ядре GENERIC. Предположим, что в вашей сети имеется Windows-машина, совместно использующая дисковый ресурс, который вы хотите смонтировать и читать как обычную файловую систему. Чтобы сделать это, вы должны добавить поддержку SMBFS в ядро. Для этого используется команда kldload: # kldload smbf s Как правило, команда kldload не имеет выходных данных. Однако вы можете использовать команду kids tat, чтобы узнать, правильно ли был добавлен модуль: # kldstat Id Refs 1 10 2 16 3 1 4 1 5 2 6 2 Address 0xc0400000 ОхсОаЗЮОО 0xcl6ed000 0xc2693000 0xclbc6000 OxcMbdcOO-e Size 63070c 568dc 15000 lbOOO 3000 3000 Name kernel acpi.ko linux.ko smbfs.ko libiconv.ko libmchain.ko На основании этих выходных данных можно сделать несколько выводов. Во-первых, мы видим модули, которые присутствовали до загрузки модуля smbf s: само ядро, драйвер ACPI (поддерживающий функции управления электропитанием) и модуль linux. ко, обеспечивающий бинарную совместимость с Linux. Еще есть только что загруженный модуль smbf s. ко и еще два модуля, необходимые для нормальной работы модуля SMBFS. Последние два модуля загружаются неявным образом в каче- стве зависимостей: libiconv и libmchain. СОВЕТ Назначения большинства модулей ядра описаны на man-страницах, которые можно открыть, указывая имя каждого модуля без разрешения .ко (например, man smbfs). Остальные, такие как библиотека libiconv.ko, указываются без приставки lib (например, man iconv). Размер каждого модуля дается в шестнадцатеричном формате; вы можете декодо ровать число, стоящее рядом с каждым модулем, чтобы посмотреть, сколько памяти занимает каждый из них. Некоторые модули ядра занимают очень много памяти; ддо гие могут привести к замедлению работы ядра. Это всего лишь пара из целого ряда
Конфигурация ядра I .» | Гяоро1Я I | причин, по которым вы можете удалить модуль из ядра после того» как вы воспользуетесь его возможностями; это делается с помощью команды kldunload: # kldunload embf• Загрузить модуль ядра обычно можно быстро и легко. Многие модули загружаются автоматически, когда их функции вызываются посредством команды, нуждающейся в них — например, командами mount_*, которые монтируют различные типы файловых систем, не компилируемые в ядро GENERIC; используя эти команды, вы можете даже не предполагать, что модуль ядра был загружен. Однако при работе на старом оборудовании или с сильно измененным ядром, либо если модуль является нестабильным (модуль smbf s. ко сам по себе является очень неустойчивым), процеа добавления модуля не является прозрачным. Иногда на загрузку модуля требуется много времени, при этом блокируются входные данные вашего пользователя; в некоторых случаях модуль может конфликтовать с существующими функциями ядра и может даже привести к выходу из строя вашего компьютера. Если модуль ядра, который вы часто используете, отнимает много времени на загрузку "на лету", или если вы просто не хотите постоянно беспокоиться о его загрузке, можно сделать так, чтобы FreeBSD загружала его автоматически во время запуска. Чтобы сделать это, в файле /boot/loader. conf добавьте оператор для каждого такого имени модуля загрузки: rabfe_load*"YSS" msdosf s_load»" YES " Первая часть каждого оператора представляет имя модуля ядра (за вычетом расширения .ко), за которым стоит символ подчеркивания и выражение load-"YES". Благодаря этой записи указанные модули будут загружаться во время запуска системы, и команды, зависящие от них, всегда будут работать. Тем не менее, даже это может не удовлетворять вашим нуждам. Некоторые модули могут быть слишком ненадежными, чтобы их можно было постоянно загружать; некоторые могут даже вызвать сбой в работе системы или привести к неожиданным перезагрузкам, или могут помешать работать в сети вашему компьютеру. Чтобы добавить их функциональные возможности в ваше ядро, не беспокоясь о ненадежности модулей ядра, вам понадобится создать специальное ядро, чему мы посвятим оставшуюся часть этой главы. Для чего нужно конфигурировать специальное ядро? По умолчанию в FreeBSD установлено ядро GENERIC. Это ядро настраивается таким образом, чтобы поддерживать по возможности самую широкую базу пользователей, и чтобы FreeBSD идеально работала с таким количеством различных компьютеров, сколько насчитывается пользователей во всем мире. Учитывая природу аппаратных средств на базе х86> это будет означать, что ядро FreeBSD должно вмещать в себе действительно невообразимое количество встроенных драйверов. Операционные системы, собранные для работы на строго контролируемом наборе оборудования (например, IRIX от SGI или Mac OS X от Apple), могут обойтись гораздо меньшей поддержкой, a FreeBSD придерживается обобщенной поддержки. Ядро GENERIC имеет также различные опции для выделения памяти и оптимизации, уста-
574 Системное администрирование Часть IV навливаемые в соответствие с "минимальным общим делителем", а другие необяза тельные элементы пропускаются, чтобы в различных обстоятельствах работа ядра была как можно более рациональной. Все это аспекты ядра, которые практически наверняка можно эффективно сконфигурировать для вашей конкретной системы. НА ЗАМЕТКУ Единственной выгодой в компиляции в ядро generic как можно большего количества устройств является простота установки; вам ведь не хотелось бы загружаться с ядром, имеющим усеченные возможности, а затем производить инсталляцию по сети, только для того чтобы обнаружить, что ваша карта Ethernet не поддерживается ядром! Упрощение ядра Во время загрузки ядро зондирует каждый известный ему тип устройства. Имени на этом этапе вы можете видеть, как экран монитора заполняется большим количе- ством текстовой информации; ядро ищет десятки различных типов устройств, раз- решенных в ядре GENERIC. Несмотря на то что ядро не находит большинство из них потребуется время, чтобы прозондировать каждый тип. Для существенного ускорения времени загрузки следует удалить ненужные устройства из ядра. Это позволи также сократить размер ядра. Для современных систем, обладающих гигабайтам оперативной памяти, такое упрощение не будет жизненно необходимым, а вот до компьютера, едва ли удовлетворяющего требованиям FreeBSD, подобное упрощени окажется спасительным. По мере добавления в вашу систему устройств, таких как периферийные Ш устройства, звуковые карты, контроллеры SCSI и тому подобного, вы не сможет использовать многие из них, не добавив в ядро поддержку этих устройств. То же» мое относится и к новым типам файловых систем (например, EXT2FS для Linux, которой говорилось в главе 12). Многие устройства и файловые системы доступн сегодня в виде модулей ядра, но все же подавляющее большинство из них по-преж му нужно компилировать в ядро, поэтому вам не остается ничего другого, как заноь собрать ядро. С другой стороны, повторная сборка ядра позволит вам настроить f гие аспекты системы (например, количество буферов памяти, специальные функц управления памятью и имя ядра), поэтому после пересборки вы можете существен повысить производительность системы. НА ЗАМЕТКУ В ядре generic нет также поддержки симметричной многопроцессорной обработки (Symmet Multi-Processing — SMP). Если у вас имеется система с более чем одним процессором или пр цессорным ядром, то вам придется перестраивать специальное ядро, чтобы воспользовать преимуществом каждого процессора.
Конфигурация ядра I ___ ] Использование утилиты dmesg для получения информации о запуске ядра Если вы будете удалять ненужные устройства из ядра, то вы обязательно определитесь с тем, какие устройства у вас должны быть, чтобы вы случайно не исключили поддержку существующего оборудования. Как уже упоминалось ранее, во время загрузки системы ядро зондирует все известные ему устройства и выводит информацию о состоянии каждого такого зондирования, сообщая о том, какие устройства вы должны хранить в новом ядре. Эта информация не печатается на экране во время загрузки; она выводится во внутренний буфер сообщений времени выполнения, чтобы к ним можно было обратиться в любой момент времени. Для просмотра этой информации служит утилита dmesg. Вывод утилиты dmesg может оказаться очень длинным, поэтому можно воспользоваться опцией less, как показано в листинге 18.1. Листинг 18.1. Частичный вывод утилиты dmesg, полученный благодаря опции less для улучшения возможности чтения # dmesg | less Copyright (с) 1992-2005 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1594 The Regents of the University of California. All rights reserved. FreeBSD 6.0-RELEASE #0: Thu Nov 3 09:36:13 UTC 2005 root@x64.samsco.home:/usr/obj/usr/src/sys/GENERIC ACPI APIC Table: <DELL PE1750 > Timecounter "i8254M frequency 1193182 Hz quality 0 CPU: Intel(R) Xeon(TM) CPU 2.40GHz (2386.76-MHz 686-class CPU) Origin * "Genuinelntel" Id = 0xf29 Stepping * 9 Features^Oxbfebfbf f <FPU, VME, DE, PSE, TSC, MSR, РАЕ, MCE, CX8, APIC, SEP, MTRR, PGE, MCA, С MOV, PAT, PSE36, CLFLUSH, DTS, ACPI,MMX, FXSR, SSE, SSE2, SS,HTT, TM, PBE> Features2«0x4400<CNTX-ID,<bl4» Hyperthreading: 2 logical CPUs real memory =* 2147315712 (2047 MB) avail memory « 2096508928 (1999 MB) config> di snO config> di IncO config> di ieO config> di feO config> di edO config> di csO config> di btO config> di aicO config> di ahaO config> di advO config> q npxO: [FAST] npxO: <math processor> on motherboard npxO: INT 16 interface cpuO on motherboard pcibO: <Intel 82443BX (440 BX) host to PCI bridge> pcibus 0 on motherboard pirO: <PCI Interrupt Routing Table: 7 Entries> on motherboard pciO: <PCI bus> on pcibO
576 Системное администрирование Часть IV agpO: <lntel 82443BX (440 ВХ) host to PCI bridge> mem 0xe0000000-0xe3ffffff 4>at device 0.0 on pciO pcibl: <PCI-PCI bridge> at device 1.0 on pciO pcil: <PCI bus> on pcibl $PIR: ROUTE_INTERRUPT failed. pcil: <display, VGA> at device 0.0 (no driver attached) isabO: <PCI-ISA bridge> at device 7.0 on pciO isaO: <ISA bus> on isabO atapciO: <Intel PIIX4 UDMA33 controller> port 0xlf0-0xlf7,0x3f6,0x170-0x177, *>0x376,0xf000-0xf00f at device 7.1 on pciO ataO: <ATA channel 0> on atapciO atal: <ATA channel 1> on atapciO uhciO: <Intel 82371AB/EB (PIIX4) USB controlled port OxeOOO-OxeOlf irq 10 at •^device 7.2 on pciO UhciO: [GIANT-LOCKED] usbO: <lntel 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 pciO: <bridge> at device 7.3 (no driver attached) fxpO: <Intel 82557 Pro/100 Ethernet> port 0xe400-0xe41f mem 0xe9200000- 0xe9200fff, %>0xe9100000-0xe91fffff irq 9 at device 11.0 on pciO miibusO: <MII bus> on fxpO inphyO: <i82555 10/100 media interface> on miibusO inphyO: lObaseT, lObaseT-FDX, lOObaseTX, lQObaseTX-FDX, auto fxpO: Ethernet address: 00:a0:c9:66:7b:32 fxpl: <Intel 82557 Pro/100 Ethernet> port 0xe800-0xe81f mem 0xe9201000-0xe9201fff, <*>0xe9000000-0xe90fffff irq 5 at device 13.0 on pciO miibusl: <MII bus> on fxpl inphyl: <i82555 10/100 media interface> on miibusl inphyl: lObaseT, ЮЬазеТ-FDX, lOObaseTX, lOObaseTX-FDX, auto fxpl: Ethernet address: 00:a0:c9:8e:8e:ba pmtimerO on isaO ormO: <ISA Option ROM> at iomem 0xc0000-0xc7f f f on isaO atkbdcO: <Keyboard controller (i8042)> at port 0x60,0x64 on isaO atkbdO: <AT Keyboard> irq 1 on atkbdcO ¦kbdO at atkbdO atkbdO: [GIANT-LOCKED] СОВЕТ Если ваша система функционировала в течение длительного времени, то сообщения этапа загрузки могут переполнить буфер dmesg; тем не менее, сообщения последней загрузки вы всегда можете просмотреть в файле /var/ run /dmesg. boot. Вывод содержит информацию о проверке всех устройств, оценке файловой си стемы и блоков запуска демонов, а также содержит сведения об ошибках, сгенери рованных различными устройствами с начала загрузки. Все, что находится после отметок о дате, а также регулярные сообщения, можно проигнорировать. Вас будут интересовать сообщения этапа загрузки вроде показанных в предыдущем листинге.
___ Конфигурация ядра I ZZZ I Глава 18 I 1 Первая часть сообщений этапа загрузки, которая следует после строк с информацией об авторских правах и сведениях о процессоре, содержит информацию о конфигурации ядра, заданной вами в конфигураторе загрузки. Каждая строка, начинающаяся пометкой conf ig>, если таковая имеется, представляет команду, которую вы запускали в визуальном режиме, скорее всего для того (как в строках di), чтобы удалить нежелательные устройства из процесса зондирования. Эти устройства впоследствии не будут появляться в выводе dmesg. Если вы не удалите эти устройства в конфигураторе, ядро будет зондировать их. Вы можете удалить из ядра любой драйвер, обозначенный в листинге сообщением "not found" (не найден). Вы можете держать открытыми два терминальных окна SSH для своей FreeBSD-машины: одно для чтения вывода dmesg, а другое для конфигурирования ядра. Это поможет вам гарантировать, что вы не удалите ничего, что будет обозначено системой как "found" (найден). Конфигурационные файлы ядра На момент написания этой книги FreeBSD не имела утилиты визуальной конфигурации ядра, подобной диалоговому процессу make xconf ig в различных дистрибутивах Linux. Конфигурирование ядра FreeBSD осуществляется с помощью текстовых файлов — этот метод может показаться довольно запутанным, но он дает такую гибкость, которой лишены визуальные методы. Инструмент визуальной конфигурации обеспечивает интерактивную обратную связь, позволяющую вам от случая к случаю разрешать и запрещать работу устройств и опций. С другой стороны, он не позволит вам поддерживать параллельно множество конфигураций, сравнивая их с помощью таких утилит, как dif f и grep, и использовать базовую конфигурацию ядра GENERIC, известные ранее действительные конфигурации, и ссылаться на файлы NOTES в качестве руководств. Конфигурирование с помощью текстового фарла позволит вам также видеть все опции ваших устройств одновременно. Интерактивный визуальный инструмент может стать излишне сложным и запутанным, и когда он будет каждый раз спрашивать вас о том, нужно ли включать каждую отдельную опцию, вся польза от обратной связи будет сведена к минимуму. Если только вы не помните наизусть важность и последовательности каждой отдельной опции, доступной в конфигурационном файле, вам будет сложно отследить, какие опции следует выбирать. Способ, предлагаемый FreeBSD, позволяет настраивать конфигурационный файл с учетом изменений, внедренных с момента выхода предыдущей версии. Вы можете даже скопировать "стандартную" конфигурацию из другой файловой системы FreeBSD и на ее основе собрать ядро. Если предположить, что в вашей системе установлены исходные коды FreeBSD, перейдите в каталог /usr/src/sys/i386, в котором находятся конфигурационные файлы ядра. Среди прочих вы увидите в нем файл GENERIC. НА ЗАМЕТКУ Если вы работаете на оборудовании Alpha, а не на платформе х86, то в предыдущем путевом имени используйте alpha вместо i386. Это же касается и IA64, SPARC или PowerPC — перейдите в соответствующим образом названный каталог в /usr/src/sys. Некоторые другие детали в этой главе тоже будут немного отличаться, хотя весь процесс в целом будет одинаковым.
578 Системное администрирование Часть IV Конфигурационный файл generic Откройте файл GENERIC в текстовом редакторе. Просмотрите различные опции, но пока что не делайте никаких изменений (сам файл GENERIC изменять не нужно). Вы увидите, что этот файл содержит избыточное количество сведений. Сделано это для того, чтобы ваша система была совместима со всеми типами компьютеров. Блок строк вверху файла будет выглядеть примерно следующим образом, хотя все будет зависеть от вашей конкретной версии FreeBSD: machine cpu cpu cpu ident i386 I486 CPU 1586 CPU 1686 CPU GENERIC Чтобы ядро могло работать, в файле обязательно должны присутствовать строка machine, строка ident и одна из строк cpu — та, которая наиболее точно соот4 ветствует вашему компьютеру. Например, если вы работаете на высококлассном Pentium-компьютере, то вы можете удалить морально устаревшие строки I486CPU и I586_CPU, и в дальнейшем вы сможете добиться некоторого улучшения производительности. НА ЗАМЕТКУ Строка cpu является специфической для архитектуры вашего компьютера, и она говорит FreeBSD о том, какой тип ядра необходимо создавать. В файле generic для платформы IA64 значением cpu будет itanium, для PowerPC — оеа, для платформы SPARC — SUN4U и так далее. Вслед за этим блоком находятся строки options — необязательные возможности, встраиваемые в ядро GENERIC по умолчанию, как показано в листинге 18.2 (листинг соответствует ядру FreeBSD 6.0). Несмотря на то что эти строки не обязательно должны присутствовать для обеспечения нормальной работы ядра, они все же приносят некоторую пользу. Удаление ряда опций может повысить производительность вашей системы, но это также может привести к сбою в работе ключевых функций, таких как Access Control Lists (Списки управления доступом), CD-ROM support (Поддержка дисковода компакт-дисков), TCP/IP networking (Работа в сети по протоколу TCP/IP) и множества встроенных и сторонних программ, зависящих от управления памятью и оповещения по типу SysV, как это принято в Oracle для Linux и PostgreSQL. В эти опции можно вмешиваться только в том случае, если вы точно знаете, за что они отвечают! Листинг 18.2. Встроенные опции ядра generic #opt ions SCHEDJLJLE # Планировщик ULE # Планировщик 4BSD # Разрешает приоритетное прерывание потоков ядра # Работа в Internet # Протоколы связи IPv6 ¦Berkeley Fast Filesystem (Быстрая файловая система Berkeley # Разрешает поддержку обновлений программ # (технология Soft Updates) # Поддержка списков управления доступом options options options options options options options SCHED 4BSD PREEMPTION INET INET6 FFS SOFTUPDATES UFS ACL
Конфигурация ядра Глава 18 579 options options options options options options options options options options options options options options options options options options options options options options options options options UFS_DIRHASH # Повышает производительность при работе с большими # каталогами # MD является потенциальным корневым устройством # Клиент сетевой файловой системы # Сервер сетевой файловой системы # Клиент сетевой файловой системы # Сервер сетевой файловой системы # Для NFS, используемой как /, требуется NFSCLIENT # Файловая система MSDOS # Файловая система ISO 9660 # Обрабатывает файловую систему (требуется PSEUDOFS) # Каркас псевдо-файловой системы # Таблицы разделов GUID # Совместимость с BSD 4,3 [НЕ ОТКЛЮЧАЙТЕ ЭТУ ОПЦИЮ!] # Совместимость с FreeBSD4 # Совместимость с FreeBSD5 # Задержка (в миллисекундах) перед зондированием SCSI # Поддержка ktrace(l) # Совместно используемая память типа SYSV # Очереди сообщений типа SYSV # Семафоры типа SYSV JU>OSIX_PRIORITY__SCHEDULING # Расширения реального времени POSIX P1003JLB KBD_INSTALL_CDEV # Инсталляция элемента CDEV в /dev AHC_REG_PRETTY_PRINT # Печатает регистры в выводе во время отладки. # Добавляет примерно 128k в драйвер* AHD_REG_PRETTY_PRINT # Печатает регистры в выводе во время отладки. # Добавляет примерно 215k в драйвер. ADAPTIVE_GIANT # Включает механизм защиты Giant в число адаптивных # мьютексов. MD_R00T NFSCLIENT NFSSERVER NFSCLIENT NFSSERVER NFS_ROOT MSDOSFS CD9660 PROCFS PSEUDOFS GEOM_GPT COMPAT_43 C0MPAT_FREEBSD4 C0MPAT__FREEBSD5 SCSI_DELAY«5000 KTRACE SYSVSHM SYSVMSG SYSVSEM Оставшаяся часть файла занята строками с пометкой device. Эти строки определяют все драйверы устройств, встроенные в ядро GENERIC, причем этих устройств насчитывается очень много. По большом счету, при оптимизации вашего специального ядра вы будете удалять из него именно эти строки (и именно их можно смело удалять). Например, если вы знаете, что ваша Ethernet-карта изготовлена в серии Intel EtherExpress (под управлением драйвера f хр), вы можете отключить любой другой драйвер PCI Ethernet в этом блоке. В листинге 18.3 показан простой блок строк device, часть из которых находится в файле. Листинг 18.3. Некоторые драйверы устройств, встроенные в ядро generic ¦ Сетевые адаптеры PCI Ethernet, использующие обычный код контроллера шины МП f Примечание: чтобы использовать эти сетевые адаптеры, не удаляйте 'device miibus'! # Поддержка шины МП # Broadcom ВСМ440х 10/100 Ethernet # Broadcom BCM570xx .Gigabit Ethernet # DEC/Intel 21143 и различные рабочие аналоги # Intel EtherExpress PRO/100B (82557, 82558) # Level 1 LXT1001 gigabit Ethernet. # NatSemi DP83820 gigabit Ethernet # nVidia nForce MCP on-board Ethernet Networking # AMD Am79C97x PCI 10/100(приоритет перед "lnc") i device device device device device device device device device строку miibus bfe bge dc fxp lge nge nve pen
580 Системное администрирование Часть IV device device device device device device device device device device device device device re rl sf sis sk ste ti tl tx vge vr wb xl # RealTek 8139C+/8169/8169S/8110S # RealTek 8129/8139 # Adaptec AIC-6915 ("Starfire") # Silicon Integrated Systems SiS 900/SiS 7016 # SysKonnect SK-984x & SK-982x gigabit Ethernet # Sundance ST201 (D-Link DFE-550TX) # Alteon Networks Tigon I/II gigabit Ethernet # Texas Instruments ThunderLAN # SMC EtherPower II (83cl70 "EPIC") # VIA VT612x gigabit Ethernet # VIA Rhine, Rhine II # Winbond W89C840F # 3Com 3c90x ("Boomerang", "Cyclone") Подсказки устройств В своей работе FreeBSD использует файловую систему Device Fylesystem (DEVFS) и подсказки устройств (device hint), которые позволяют абстрагировать атрибуты различных устройств таким образом, чтобы система могла находить их, не компилируя атрибуты в ядро статическим образом. Эти атрибуты обычно определяются в самом конфигурационном файле ядра, как показано ниже: device ataO at isa? port I0_WD1 irq 14 device atal at isa? port IO_WD2 irq 15 Однако теперь конфигурационный файл ядра должен содержать только такую строку: device ata Эта замена произошла по той причине, что устройство ata имеет атрибуты, хранящиеся в файле /boot/device .hints, к которому обращается ядро во время загрузки. Далее показаны подходящие строки этого файла для данного примера: hint.ata.0.at-"isa" hint.ata.O.port-"OxlFO" hint.ata.0.irq="14" hint.ata.l.at«"isa" hint.ata.1.рогЪ-и0х170и hint.ata.l.irq-"15" Если эти атрибуты будут храниться в одном месте, то ядро будет знать о шине адресе памяти и IRQ (interrupt request — запрос на прерывание), чтобы найти устрой ство ata. Также вы можете изменить эти атрибуты, не компилируя ядро. Однако при желании вы все равно можете статически скомпилировать атрибуты в ядро, включив следующую строку: # Чтобы статически скомпилировать параметры в ядро, не создавая # файл /boot/device.hints #hints "GENERIC.hints" # Места, в которых по умолчанию # производится поиск устройств. Сценарий /etc/rc.d/devfs запускается во время загрузки и управляет настрои ками реактивных (то есть производимых после совершения) символических ссыло и разрешений, которые обычно нужно выполнять только один раз в статической си-
Конфигурация ядра ] Z7T Глава 18 стеме, отличной от DEVFS (работа конфигурационных сценариев рассматривалась в главе 14). DEVFS упрощает работу многих служебных задач UNIX, которые по обыкновению являются очень трудными. Однако иногда это может приводить к тому, что вам нужно будет выполнять больше работы, чем это могло бы быть в противном случае. Например, обычная задача в настройке инсталляции UNIX сводится к организации символической ссылки /dev/mouse на /dev/psmO или /dev/dvd на /dev/acdOc, так как некоторые программы могут использовать обобщенные имена устройств; поэтому в таких программах вам не нужно конфигурировать устройства, определяемые системой. Приложение для работы DVD-проигрывателя будет искать /dev/dvd, а не метку устройства, которая может отличаться от системы к системе. Также, поскольку некоторые устройства (например, устройства для записи дисков типа DVD-R) должны обладать подходящими полномочиями, чтобы определенные пользователи — обычно, являющиеся членами групп, которым принадлежат эти устройства — могли осуществлять запись, полномочия в устройствах должны изменяться с помощью команды chmocL Как правило, во время установки можно было выполнить следующие команды для настройки /dev/dvd, чтобы больше к этому вопросу не возвращаться: # chmod 664 /dev/acdOc # In -sf /dev/acdOc /dev/dvd # In -sf /dev/acdOc /dev/rdvd Однако сейчас, при наличии DEVFS, устройство /dev/acdOc задается динамически во время каждой загрузки системы, поэтому ваши ранее сконфигурированные символические ссылки могут оказаться неверными. Чтобы получить тот же результат, что и в прежних системах, эти три строки нужно просто добавить в /etc/rc.d/devfs в конец файла, и они будут применены после создания динамических устройств. ФаЙЛЫ NOTES И LINT К счастью, когда дело доходит до идентификации каждой из этих невзрачных на вид опций и устройств, или когда нужно узнать о том, какие из них являются доступными, от вас ничего не потребуется. Файл с именем NOTES, который тоже находится в каталоге /usr/src/sys/i386/conf, описывает все возможные опции и устройства, доступные в данной системе. Это еще один файл, который вам не нужно редактировать. Просто откройте его в режиме less и просмотрите его содержимое. Вы найдете объяснения всех строк в ядре GENERIC, а также большое число доступных опций и устройств, которые вы можете добавить в конфигурацию ядра. Другой файл NOTES, расположенный в каталоге /usr/src/sys/conf, представляет собой независимую от аппаратной платформы версию и содержит все опции ядра, которые не применяются к архитектуре вашей системы. Например, несмотря на то, что в файле NOTES во вложенном каталоге i386 вы сможете найти документацию к многочисленным опциям для управления специальными характеристиками Intel CPU, шин ISA, PCI, AGP и других аппаратных компонентов типа х86, для общих особенностей FreeBSD, таких как файловые системы и управление памятью, вам потребуется использовать независящий от устройств файл NOTES. Также все, что находится в GENERIC, имеет запись в одном из файлов NOTES. Теоретически вы можете скопировать конфигурационную строку (которая начинается с любой пометки, отличной от hint) в конфигурационный файл вашего специ-
I ГГГ I Системное администрирование I 58Z I ЧялтьМ ального ядра, и затем запустить его с этой строкой. Обычно это нужно делать только в том случае, если вы добавляете какое-нибудь обычно неиспользуемое устройство или опцию ядра, однако в подобных случаях, прежде всего, необходимо просмотреть файл NOTES. В файле NOTES содержатся также строки подсказки устройств; эти строки имеют пометку hint (как было сказано выше). Вы можете скопировать эти строки или в файл /boot/device.hint, или в файл подсказок для вашего ядра (например, GENERIC.hints), если вы хотите скомпилировать их статически. Многие элементы в обоих файлах NOTES ссылаются на загадочный объект, называемый LINT. Это старый, уже неиспользуемый (он применялся в версиях до FreeBSD 5.0) файл, аналогом которого сейчас является файл NOTES. LINT получил свое имя в честь команды lint — утилиты отладки, написанной на языке С, имя для которой было выбрано из тех соображений, что она проверяла достоверность выполняемого вами кода путем удаления лишнего стилистического форматирования. Одним из давно существующих идеалов (или мифов) FreeBSD является то, что эта система позволяет собирать ядро на основе файла LINT, включая каждую возможную поддерживаемую опцию и драйвер. Этот бесполезный трюк приверженцев UNIX в наши дни является практически невозможным, поскольку многие опции ядра являются взаимоисключающими или нестабильными; кроме того, никто в действительности не может гарантировать, что он будет выполнен. Тем не менее, FreeBSD позволяет сгенерировать файл LINT в старом стиле с помощью команды make LINT из каталога. В результате выполнения этой команды будут удалены все комментарии и строки hint., а также будет создан конфигурационный файл ядра, который вы теоретически сможете использовать для создания огромного, всеобъемлющего ядра, у которого, наверное, не будет шанса на загрузку или даже на компиляцию. Создание конфигурационного файла специального ядра Сейчас речь пойдет о том, с чего вам следует начать, чтобы создать новое ядро. Помните, что вам не нужно будет модифицировать сам файл GENERIC; он будет обновляться системными ресурсами всякий раз, когда вы будете выполнять синхронизацию или модернизацию. Поэтому, чтобы гарантировать, что ваши изменения не будут перезаписаны, создайте копию файла GENERIC, дабы его можно было использовать в качестве конфигурационного файла вашего специального ядра. По традиции, имя нового файла должно содержать одно слово, написанное в верхнем регистре. Специальным ядром для данного примера является ядро CUSTOM: # cd /usr/src/sys/i386/conf # ср GENERIC CUSTOM Теперь вы можете изменять файл CUSTOM так, как вам заблагорассудится. Первое, что потребуется сделать, это войти в него и изменить идентификацию ядра (строка ident) с GENERIC на CUSTOM (или любое другое имя, которое вы выберете). Вы должны также удалить излишние записи для ери и при необходимости модифицировать значение maxusers, используемое по умолчанию, добавив к нему строку (см. следующую врезку аНа заметку"). Ниже показан фрагмент конфигурационного файла
Конфигурация ядра I ГГГ I Глава 18 I I специального ядра для компьютера класса Pentium IV, работающего в качестве высокоуровневого сервера: machine i386 cpu I686_CPU ident CUSTOM maxusers 64 НА ЗАМЕТКУ Пусть вас не вводит в заблуждение параметр maxusers: в действительности он не ограничивает количество текущих пользователей или входов, которые будет поддерживать система. (Это ограничение указывается в строке device pty num.) maxusers определяет размеры таблиц системы, например, максимальное количество разрешенных процессов (16 умножить на значение maxusers плюс 20) и кое-что другое. Присвойте этому параметру число, которое приблизительно будет соответствовать ожидаемому количеству пользователей, но не присваивайте ему значение меньше 4 (если вы сделаете это, то процессы закончатся быстрее, чем можно было бы ожидать). Теперь можно приступить к настройке опций и устройств. Просмотрите файлы NOTES, как специфические для данного оборудования, так и независящие от него, чтобы узнать о том, что вы модифицируете, и откройте другое окно с результатами, полученными из dmesg. He удаляйте из конфигурационного файла то, что, согласно утилите dmesg, найдет ядро. В общем случае, лучше всего вообще не удалять никаких строк из файла. Наоборот, просто закомментируйте их, ставя знак # перед каждой строкой. Если есть какие-либо сомнения относительно того, нужно ли запрещать строку в файле GENERIC, то лучше не запрещать ее. GENERIC действительно содержит множество элементов, которые не нужны в каждой системе, однако лучше пусть ошибка будет ограничена предупреждением, особенно если вы выполняете изменения на производственном сервере. Компиляция и установка специального ядра После того как ваш конфигурационный файл будет готов, собрать ядро не составит особого труда. Теоретически, для этого потребуется не более трех команд: # cd /usr/src # make buildkernel KERNCONF=CUSTOM # make installkernel KERNCONF=CUSTOM Аргумент KERNCONF определяет используемый конфигурационный файл ядра; если этот аргумент опустить, то будет выбран конфигурационный файл GENERIC. Первая команда make проверяет синтаксис конфигурационного файла, задает каталог сборки, создает зависимости, после чего приступает к сборке самого ядра. Вторая команда инсталлирует его в /boot, перемещая текущий каталог в /boot/kernel.old. (До выхода FreeBSD 5.0 эти ядра устанавливались в корневой каталог /.) После этого вам нужно будет перезагрузить систему (введя shutdown ~r now), чтобы использовать новое ядро. I
Системное администрирование Часть IV НА ЗАМЕТКУ В ядре установлен флаг schg (обязательный в системе), который означает, что даже суперпользователь не может удалить или перезаписать его, не удалив сначала этот флаг. Команда make installkernel пытается удалить флаг перед тем, как инсталлировать новое ядро. Однако если вы работаете при значении securelevel, равном 1 или выше (сейчас это неиспользуемая настройка безопасности всей системы, которую вы выбираете во время установки или задаете в файле /etc/rc.conf; более подробно об этом можно узнать на man-странице securelevel), то команда не сможет удалить флаг Вам придется перезагрузиться в однопользовательском режиме, чтобы завершить инсталляцию ядра; переход в однопользовательский режим посредством команды shutdown работать не будет. СОВЕТ Если вы по-настоящему уверены в себе, можете скомбинировать обе строки make в одну, как показано ниже: # make kernel KERNCONF=CUSTOM Однако это рекомендуется делать только опытным пользователям; лучше всего заиметь привычку собирать и инсталлировать ядро отдельно, чтобы свести к минимуму вероятность случайной установки некорректного ядра. Добавление узлов устройств в каталог /dev В этом разделе описывается шаг из процесса сборки ядра, который может бьт применен только к версиям FreeBSD до 5.0. Если ваша версия имеет номер 5.0 или выше, можете смело пропустить этот раздел, поскольку в современных версиях да устройств системы используется интерфейс файловой системы DEVFS, а виртуаль ная файловая система /dev создается динамически во время загрузки. Многие устройства не будут иметь записи в /dev, когда вы будете добавлять их8 конфигурацию ядра; /dev будет включать только те устройства, которые являлись или частью базовой системы, или которые будут добавлены позже явным образоч Вам нужно создать узлы устройств для новых устройств, которые вы добавляете & ядро — они не генерируются автоматически. К счастью, создание узлов устройств не является сложным делом. Все что т нужно сделать после перезагрузки с новым ядром — перейти в каталог /dev изат стить сценарий MAKEDEV: # ./MAKEDEV Все устройства, поддерживаемые выполняющимся ядром, будут созданы в вид узлов устройств или "специальных файлов" в каталоге /dev. Позже у вас будет цел которую вы сможете использовать с вашими инструментами командной строки да взаимодействия с каждым новым устройством. Более эффективное и простое решение состоит в том, чтобы создавать узел устройства только для нового устройста (или устройств), которое вы будете инсталлировать (например, если вы разрешит? звуковой драйвер sndO). Вы можете разрешить работу устройства, выполнив комадо MAKEDEV для него одного: # ./MAKEDEV sndO
Конфигурация ядра I _„ I Глава 18 I I Как произвести восстановление, если что-то работает неправильно? Ошибки компилятора не являются таким уж редким делом. Если вы запускаете то же дерево исходных файлов, которое было у вас с момента установки системы, то ошибка в процессе компиляции (когда компилятор не сможет завершить процесс, обычно выдавая сообщение *** Error code 1) будет, скорее всего, вызвана некоторой нестабильной опции ядра или устройством, разрешенного вами. Каждая командная строка компилятора выводится на экран, поэтому вы сможете увидеть, какой компонент он пытается скомпилировать во время возникновения ошибки. Если компонент нельзя идентифицировать, вы можете обратиться за помощью на Web- сайт FreeBSD (http://www. freebsd.org) и поискать в архивах списков рассылки уникальные слова, сгенерированные ошибками компилятора. Если после инсталляции системы вы обновляли исходные коды, то вполне вероятно (особенно если вы отслеживаете ветви -CURRENT или -STABLE), что код будет работать нестабильно, и всякие ошибки, с которыми вы будете сталкиваться, будут устранены за несколько дней (об обновлении исходных кодов мы поговорим в главе 19). Подпишитесь на списки рассылок f reebsd-current или f reebsd-stable, если у вас имеется хороший опыт работы в FreeBSD, и вы будете получать справочные сведения (с условиями подписки можно ознакомиться на сайте FreeBSD). Тем не менее, всегда существует вероятность того, что ваше ядро будет собрано безупречно, инсталлировано безупречно, перезагружено безупречно, а затем вдруг "взорвется" при попытке загрузиться. Оно может ошибиться при монтировании файловых систем, может "зависнуть* из-за ошибки во внутреннем прерывании ядра или может ошибиться там, где вы себе и представить не могли. Если такое произойдет, вам не следует паниковать, поскольку избавиться от подобных неприятностей можно довольно просто. Перезагрузите компьютер и нажмите соответствующую функциональную клавишу, чтобы попасть в меню загрузчика. Выберите опцию б (Escape to Loader Prompt — Перейти к приглашению загрузчика), а затем введите boot /boot/kernel. old (или boot/kernel. old до выхода версии FreeBSD 5.0) в строке приглашения, и вы сможете использовать ранее рабочее ядро. Имейте в виду, что если вы в следующий раз попытаетесь пересобрать и инсталлировать ядро, то файл /boot/kernel, old будет перезаписан предыдущим собранным вами ядром, в котором возникла неустранимая ошибка. Чтобы не допустить этого, скопируйте файл kernel,, old под каким-нибудь другим именем, которое вы не сможете перезаписать в автоматическом процессе (например, /boot/kernel. frank). Если это произойдет в следующий раз, то вы сможете использовать это ядро для загрузки из строки приглашения loader. Другая возможная проблема может заключаться в том, что ваша система загружается нормально и полностью начинает функционировать, однако системные утилиты вроде ps, top и w не работают (они будут выдавать сообщения об ошибке сегментации или сообщения о несоответствии размеров памяти). Если такое произойдет, то, скорее всего, причина будет в том, что вы собрали ядро из более нового дерева исходного кода, чем то, из которого была собрана ваша система, поэтому библиотека libkvm оказалась устаревшей для вашего более нового ядра.
586 Системное администрирование Часть IV Чтобы избавиться от этих неприятностей, можно пересобрать библиотек libkvm, хотя это решение годится лишь для опытных пользователей. Если вы яш етесь таковым, сделайте следующее: перейдите к коду libkvm в каталоге /usr/sr и попытайтесь инсталлировать его вручную. (Об этом процессе речь пойдет в тм ве 19.) Однако существует еще лучшее решение: собирайте ядро из тех же исходны кодов, из которых была собрана вся ваша система, и собирайте ядро только на осно ве обновленных исходных кодов, если вы выполняете полный процесс make world о котором будет рассказываться в следующей главе.
ГЛАВА 19 Поддержание актуальности FreeBSD В этой главе... • Отслеживание исходных кодов FreeBSD • Модернизация с помощью процесса make world < • Что нужно учесть, прежде чем приступать к модернизации с помощью процесса make world • Задачи, которые нужно выполнить перед процессом make world • Пересборка системы из исходных кодов • Использование утилиты mergemaster для проверки измененных конфигурационных файлов • Перезагрузка после модернизации
Системное администрирование Каждая операционная система нуждалась в способе, благодаря которому ее можно было поддерживать актуальной с течением времени. Администраторы должны получать заплаты безопасности, исправления ошибок и поддержку новых технологий для своих инсталлированных систем, не ожидая появления новых полных выпусков — в мире операционных систем на это может уходить от шести месяцев до трех и более лет. А в современном мире, живущем в эпоху Internet, хакер может скомпрометировать систему как раз в момент объявления о бреши в безопасности, поэтому поддержание операционной системы актуальной на данную минуту времени является необходимой задачей. Ни один из создателей операционных систем не пренебрегает этой необходимостью. Компания Microsoft предлагает пользователям клиентов и серверов Windows периодически выпускаемые крупные пакеты обновлений (service pack) (более того, следует учесть, что полные версии пакетов обновлений со временем становятся все больше и больше). А в промежутках между появлениями этих пакетов обновлений или полных выпусков предлагаются быстро подготовленные исправления проблем безопасности, обнаруженных в операционной системе — специальный механизм Windows Update позволяет пользователям загружать и инсталлировать заплаты для устранения критических на данный момент времени проблем. В Mac OS X тоже имеется похожий механизм, называемый Software Update; аналогичные механизмы установки заплат существуют и в Linux, предоставляя пользователям самые широкие возможности для защиты своих систем, причем для этого потребуется минимум усилий и навыков. Сопровождение установки FreeBSD представляет собой несколько иной процесс. Заплаты для обнаруженных проблем безопасности создаются с той же периодичностью, что и для любой другой операционной системы; однако в связи с тем, что философия функционирования FreeBSD построена главным образом на доступе ее пользователей к исходным текстам (даже в большей степени, чем у ее соратников с открытым кодом), установка заплат в вашей системе чаще всего сводится к перекомпиляции самого программного обеспечения, независимо от того, было ли изменено ядро, системная библиотека или стороннее приложение. К счастью, FreeBSD предлагает несколько хорошо зарекомендовавших себя способов упрощения этих периодических повторных сборок, помогая вам поддержать вашу систему "в тонусе" даже в самых современных условиях. НА ЗАМЕТКУ FreeBSD позволяет модернизировать систему за счет загрузки предварительно скомпилированных бинарных пакетов и их установки поверх старых компонентов — этот процесс называется бинарной модернизацией. Для этого нужно перейти в Sysinstalt, задать имя нового выпускав окне Options (Опции), а затем выбрать команду Upgrade (Модернизировать), чтобы выполнить процесс модернизации. Его конфигурирование и выполнение производится подобно процессу первоначальной инсталляции системы, рассмотренному в главе 2. Бинарную модернизацию можно выполнить как с CD- или DVD-диска, так и из FTP-источника. Этот способ модернизации может происходить безболезненно и быстро. Однако, в отличие от остальных операционных систем, применение бинарной модернизации не обязательно будет самым аккуратным способом обновления FreeBSD. Это объясняется тем, что система непрерывно разрабатывается, и ее компоненты перемещаются в другие места и постоянно добавляются или удаляются, многие пользователи тщательно настраивали файлы, своих систем, и, кроме того сценарий бинарной модернизации практически наверняка оставит некоторые важные задачи незавершенными. Например, вам придется вручную объединять часть файлов из каталога /etc вашей старой системы с файлами в новом каталоге. Чаще всего это происходит при модернизации
Поддержание актуальности FreeBSD Глава 19 589 Между двумя сильно отличающимися системами, например при переходе из системы серии 4.x в систему серии 5.x или 6.x, имеющую совершенно другую структуру файлов, которая может быть не учтена в сценарии бинарной модернизации. В связи со всеми этими сложностями, овладение процессом отслеживания исходных кодов и компиляции вашей собственной операционной системы будет не только необходимо для администратора FreeBSD, но и рекомендовано в качестве способа модернизации вашей системы. Ведущие версии FreeBSD (такие как 5.0 и 6.0) выходят каждый год или раз в два года, а промежуточные версии (наподобие 4.2 и 5.4) обычно появляются каждые три-шесть месяцев. (Выпуски заплат, например, 5.2.1, обычно не планируются, поэтому появляются они по мере необходимости.) Независимо от того, насколько часто становится доступным новый выпуск, удовлетворяющий вашим нуждам, решить срочные насущные проблемы администратору, осознающему значение безопасности, удается не очень часто; в любое время между появлениями новых выпусков вам будет нужен способ частичного или полного обновления системы, по вашему усмотрению. В этой главе мы поговорим о CVSup, make world и других способах реального времени, позволяющих поддерживать вашу систему FreeBSD актуальной. Отслеживание исходных кодов FreeBSD Самый простой и распространенный способ обновления системы — просто подождать появления нового официального выпуска FreeBSD. Вы получаете копию компакт-диска или файла с образом диска и инсталлируете с него новую версию операционной системы с помощью способов, рассмотренных в главе 2, или способов, описанных на Web-сайте FreeBSD. Однако новые возможности, появляющиеся с новыми ведущими версиями, не являются главными причинами, по которым вы можете решиться на модернизацию. Предположим, например, что в ядре или в ключевом компоненте системы, например, в BIND или Sendmail, был обнаружен серьезный дефект в плане безопасности. Ситуация требует немедленного действия, своевременного решения насущной проблемы. Достичь этого можно единственным способом: путем отслеживания исходных кодов. Дерево исходных кодов FreeBSD хранится в центральном хранилище системы управления версиями (Concurrent Versions System — CVS), зеркальные копии которого можно найти на нескольких связанных между собой серверах. Это дерево поддерживается относительно небольшой группой дистрибьюторов и активных пользователей. Структура FreeBSD организована таким образом, что вся система является постоянно доступной в исходном виде, и ею может воспользоваться любой желающий. Эта структура отличается от модели Linux, в которой исходные коды ядра являются доступными, но каждый отдельный дистрибутив всей операционной системы имеет свой собственный набор исполняемых файлов и библиотек, свою собственную структуру файловых систем и собственные политики организации доступа к исходным текстам этих ресурсов. Независимо от того, являетесь вы разработчиком, стремящимся изменить и написать исходные коды и вернуть их обратно в главное дерево, или пользователем, который просто желает обслуживать сервер, используя текущий дистрибутив исходного кода, вы будете применять CVS (и утилиту, называемую CVSup) для взаимодействия с хранилищем исходных кодов и получения необходимых вам самых свежих исходных кодов. Эта модель предоставляет разработчикам и пользователям FreeBSD одинаковый уровень доступа к коду.
590 Системное администрирование Часть IV Таким образом, после применения заплаты к бреши в безопасности, или после того как в хранилище исходного кода будет исправлена критическая ошибка, вы, как пользователь FreeBSD, будете иметь возможность синхронизировать исходные коды с наиболее свежей версией, и затем сможете создать и установить новый компонент, дабы устранить уязвимость вашей системы — или собрать "с нуля" совершенно новую операционную систему. Что собой представляют ветви STABLE и CURRENT исходных кодов Между полными выпусками операционных систем код FreeBSD постоянно изменяется. Ошибки исправляются, утилиты корректируются заплатами и расширяются, добавляются новые возможности и реорганизуется структура системы. Чтобы понять этот процесс, следует представить себе хранилище кода в виде дерева, которое по мере своего роста пускает новые ветви вверху своей кроны. Каждый раз, когда инициируется новая версия кода FreeBSD (5.*, 5.2.я, 6.x и так далее), она ответвляется от главной базы разработки кода (или дает начало новому стволу дерева). Как показано на рис. 19.1, самая верхняя ветвь называется CURRENT (текущая), а следующая за ней самая высокая ветвь — STABLE (устойчивая). Как правило, множество ветвей дерева кода сопровождаются параллельно, при этом две самые новые ветви находятся в состоянии активной разработки, а более ранние ветви сопровождаются от случая к случаю. Главная ветвь (текущая 7-я) 5-STABLE 4-STABLE Рис. 19.1. Ветви кода FreeBSD, показывающие взаимодействие ветвей CURRENT и STABLE
Поддержание актуальности FreeBSD I »f|i I Глава 19 I I Такая модель разработки кода является достаточно распространенной в мире программного обеспечения; она позволяет разработчикам "замораживать" некоторый набор возможностей в рамках одной версии и не допускать возникновения нестабильности при продолжающихся второстепенных настройках и добавлениях. Согласно этой модели, разработчики добавляют новые функции в блоки, вводя каждый новый набор или реструктуризируя каждую новую ветвь. Здесь следует помнить о том, что CURRENT не является той ветвью, которую вам нужно использовать для сервера предприятия! CURRENT связана с самой современной ветвью кода — ветвью, в которой тестируются совершенно новые возможности. Следовательно, эта ветвь является наименее стабильной ветвью дерева исходного кода. Ветвь CURRENT предназначена только для разработчиков и пользователей, которым крайне необходимо, в отсутствие какой-либо альтернативы, получить новые функции, введенные в код FreeBSD, не ожидая, пока они появятся в ветви STABLE. На некоторой стадии разработки ветви CURRENT — как правило, после первого выпуска, например 6.0-RELEASE — набор возможностей версии в ветви CURRENT приобретает статус STABLE, и каждое обозначение CURRENT и STABLE поднимает одну ветвь в дереве. Ветвь CURRENT дает начало только что созданной самой верхней ветви, а набор возможностей новой обозначенной версии STABLE (прежде это была ветвь CURRENT) теперь рекомендуется для использования в серверах предприятий. Новые выпуски объявляются в новых ветвях каждые несколько месяцев, пока набор функций в ветви CURRENT не окажется устаревшим, а ветвь STABLE больше не будет удовлетворять требованиям сообщества пользователей. После этого дерево разрастается снова, заново начиная весь цикл. НА ЗАМЕТКУ Естественно, эта модель идеализирует существующую реальность. FreeBSD 6.0 была выпущена после более длительного промежутка времени между полными выпусками, чем это было с предыдущими версиями, и она характеризовалась гораздо меньшим числом существенных обновлений по сравнению с ветвью 5.x, чем FreeBSD 5.0 по сравнению с ветвью 4.x. На момент написания этой книги FreeBSD 6.x являлась ветвью STABLE, однако активно сопровождаемые ветви STABLE доступны также и для серий 5.x и 4.x (многие пользователи-ветераны до сих пор не модернизировали базу кодов 4.x по той причине, что серия 5.x не содержит каких-либо существенных изменений). Выбор цели модернизации Вы можете модернизировать систему в любой момент времени, независимо от того, насколько долго продолжается разработка в дереве исходных кодов. Чтобы произвести модернизацию, вы можете пойти тремя путями. • Вы можете выбрать любой выпуск, в котором код был "заморожен" и хранится в статическом хранилище. • Вы можете синхронизировать дерево исходных кодов с помощью утилиты CVSup (подобно синхронизации портов, рассмотренной в главе 16) с "ветвью исправления ошибок" (errata fix branch) для конкретного выпуска, получая варианты устранения уязвимостей в безопасности и серьезных ошибок без полной модернизации. Для большинства пользователей этот способ будет наилучшим.
592 Системное администрирование Часть IV • Вы можете просто синхронизировать дерево исходных кодов с линией активной разработки и в любой момент времени создать новую систему "с нуля". В оставшихся разделах этой главы мы поговорим о том, как производится синхронизация вашего дерева исходных кодов с выбранным выпуском или ветвью разработ- ки с целью обновления вашей системы FreeBSD. Между описанными здесь способами на практике существует единственное отличие — метка целевой ветви (target branch tag), используемая вами в конфигурации CVSup, или идентификатор, который описывает требуемую вам версию FreeBSD. Все метки начинаются с RELENG, префикса, который расшифровывается как release engineer (инженер выпуска). Метка RELENG показывает, что ветвь была официально начата инженером выпуска из основной команды FreeBSD. НА ЗАМЕТКУ По адресу http: //www. f rebsd. org/legend можно получить текущий список выпусков FreeBSD и информацию об их состоянии поддержки. Модернизация до рабочей версии Чтобы модернизировать систему FreeBSD до рабочей версии, вы должны вставить метку рабочей версии в существующую конфигурацию CVSup, которую мы будет рассматривать чуть позже. Все метки рабочих версий имеют три цифры, разделенные между собой символами подчеркивания, а не точками, и имеют приставку RELEASE, В табл. 19.1 показано, как метки выпусков соответствуют номерам версий. Этот пример не является полным; существует еще большое количество доступных номеров рабочих версий, каждая из которых имеет свои соответствующие метки. Таблица 19.1. Соответствия между метками выпусков и номерами версий Метка выпуска Номер версии releng_6_0_0_release FreeBSD 6.0 releng_5_4_0_release FreeBSD 5.4 releng_5_2_1_release FreeBSD 5.2.1 releng_4_1 1_0_release FreeBSD 4.11 Модернизация до промежуточной сборки в ветви исправления ошибок Промежуточные версии конкретных выпусков поддерживаются таким образом, что вы можете применять заплаты безопасности и важные исправления кода к неизменяемой во всех остальных случаях базе кодов RELEASE. Если ваша система собрана из исходных кодов 5.4-RELEASE и вы хотите отслеживать ветвь кода, включающей все самые свежие исправления безопасности, не обращая внимания на все остальные новые возможности и код (как правило, порождающие нестабильность), которые попадают в ветвь разработки STABLE, вы можете синхронизировать свою систему с вег вью R?LENG_5_4. Такая модернизация позволит вам получить RELENG_5_4_0_RELEASE, плюс любые важные заплаты, которые были введены с того времени, но ничего более, что попадает исключительно в дерево разработки 5.5.
Поддержание актуальности FreeBSD Промежуточные выпуски в так называемой "ветви исправления ошибок" (или, как ее называли раньше, "ветви исправлений безопасности"), такие как RELENG__5_4, нумеруются с помощью суффикса р, как, например, 5.4-RELEASE-p3, который обозначает сборку системы из третьей редакции, которая была зарегистрирована в ветви RELENG_5_4. Исходя из этого, можно понять, что регистрации кода в ветвях исправления ошибок тщательно контролируются и происходят только в ответ на возникшие отдельные проблемы, например, для устранения брешей в безопасности или исправления ошибок, вызывающих сбой в работе ядра. НА ЗАМЕТКУ Объявления об уязвимостях безопасности (например, объявления, распространяемые в списке рассылки freebsd-security-notifications) обычно содержат два предполагаемых пути исправления ошибки: точка в каждой ветви исправления ошибок, до которой вам необходимо модернизировать ваши исходные коды, а затем заново собрать компонент или всю систему, или ссылка на файл заплаты, которую вы можете применить к вашим существующим исходным текстам, не синхронизируя при этом всю систему. Инструкции касаемо загрузки и применения заплаты приводятся в бюллетенях по безопасности; кроме них приводятся также инструкции по пересборке и повторной инсталляции затронутого компонента. Однако во многих случаях исправление ошибки производится в ядре или в одном из базовых компонентов системы, требуя заново собирать ядро или всю систему, о чем мы будет говорить в оставшейся части этой главы. Если это представляется возможным, использование заплат исходных кодов будет быстрым и удобным способом, хотя вы не всегда будете им удовлетворены. Исправление ошибок обычно происходит примерно раз в месяц. Каждое такое изменение кода обозначается последовательным номером р и публикуется в объявлениях о безопасности в соответствующих списках рассылки (далее в этой главе вы узнаете о ключевых списках рассылки для отслеживания исходных кодов FreeBSD). Эти промежуточные выпуски продолжаются до тех пор, пока официально поддерживается выпуск; по адресу http://www.freebsd.org/releng вы можете узнать, какие ветви поддерживаются, и когда будет завершена поддержка конкретной ветви. СОВЕТ Чтобы посмотреть, с какой версией вы работаете в данный момент, используйте команду uname -a: # uname -a FreeBSD simba 5.4-RELEASE-p3 FreeBSD 5.4-RELEASE-p3 #1: Wed Jun 29 18: 06:56PDT 2005 root@simba:/usr/obj/usr/src/sys/GENERIC i386 Чтобы модернизировать до промежуточной сборки FreeBSD, вы определяете в своей конфигурации CVSup ветвь исправления ошибок, которая не находится в разработке. Чтобы переключиться из версии RELEASE (такой, как ваша исходная установка) в соответствующую ей ветвь исправления ошибок, создайте свою собственную цель выпуска, убрав суффикс RELEASE и третью цифру из метки исходного выпуска, как показано в табл. 19.2.
Системное администрирование Часть IV СОВЕТ Обратите внимание, что информация в табл. 19.2 соответствует положению вещей на начало 2006 года. Вследствие динамичности развития веток разработки эта информация с течением времени станет устаревшей. На странице http: //www. f reebsd. org/handbook/cvs-tags .html вы сможете найти наиболее свежую таблицу соответствующих меток веток. Таблица 19.2. Метки веток и обозначения промежуточных версий Метка ветви Обозначение версии releng_6_0 FreeBSD 6.0-RELEASE-p# errata fix branch (ветвь исправления ошибок FreeBSD 6.0-RELEASE-p#) releng_5_4 FreeBSD 5.4-RELEASE-p# errata fix branch (ветвь исправления ошибок FreeBSD 5.4-RELEASE-p#) releng_4_11 FreeBSD 4.t1-RELEASE-p# errata fix branch (ветвь исправления ошибок FreeBSD 4.11-RELEASE-p#) Модернизация до активной линии разработки (CURRENT или STABLE) Ветераны FreeBSD (и только истинные ветераны FreeBSD) могут использовать самые свежие исходные коды системы, синхронизируя свои исходные коды с ветвью кода, не являющейся рабочей версией или промежуточной сборкой. Обычно это бывает необходимо только разработчикам и активным пользователям FreeBSD, которым нужен подтвержденный доступ к самым последним изменениям кода или экспериментальным функциям, и которые не заботятся о том, чтобы позволить другим пользователям протестировать и одобрить код в жестко регламентированных промежуточных выпусках. Подобное отслеживание веток STABLE и CURRENT означает, что вы определяете метку ветви только с помощью первой цифры ветви выпуска. Например, если определить RELENG_6, вы получите текущее состояние дерева исходных кодов FreeBSD 6.x, включая изменения кодов, проверенные независимыми разработчика ми несколько часов или минут тому назад; оно не привязано к официальным "замороженным" состояниям FreeBSD 6.0, 6.1 или любого другого обозначенного выпуска. И это только для веток STABLE. Вы можете даже отважиться определить дерево кода HEAD, что даст вам ветвь CURRENT — как вы помните, в ветви CURRENT активно разрабатываются наиболее свежие экспериментальные особенности, и они могут быть неустойчивыми или даже неполными. Здесь нет гарантии того, что код будет безопасно выполняться в любой момент времени, как в промежуточных выпусках р в ветвях исправления ошибок. Если вы выберете отслеживание ветви кода CURRENT или STABLE, приготовьтесь посостязаться с системой, которая может оказаться нестабильной или даже непригодной к использованию, если вы попытаетесь синхрона зировать с ней свои исходные коды в неподходящее время! В табл. 19.3 перечислены метки веток, которые вы будете применять для синхро- низации с ветвью CURRENT или STABLE.
Поддержание актуальности FreeBSD Таблица 19,3. Метки веток для веток активной разработки Метка ветви Обозначение версии head FreeBSD-CURRENT (самый свежий код, еще не имеющий официального номера версии). В CVSup в качестве метки ветви вместо head нужно использовать точку (.) RELENG_6 FreeBSD 6-STABLE (ведущая линия разработки 6.x) releng_5 FreeBSD 5-STABLE (ведущая линия разработки 5.x) RELENG_4 FreeBSD 4-STABLE (ведущая линия разработки 4.x) Модернизация с помощью процесса make world В языке разработки FreeBSD слово "world" (мир) относится ко всему, что находится внутри системы FreeBSD, кроме самого ядра. Поэтому make world соответствует процессу пересборки системы FreeBSD с "чистого листа". Пересборка всей системы является больше практическим способом модернизации, нежели просто вставкой компакт-диска в привод. Однако с учетом того, как в FreeBSD выполняются всевозможные операции, сборка бинарных файлов из чистогЬ исходного файла является единственным способом, позволяющим гарантировать, что система действительно будет совместимой с существующим оборудованием и настройками. Процесс make world включает в себя множество действий и характеризуется значительной долей риска, хотя строго упорядоченная структура FreeBSD помогает уменьшить риск и позволит вам насладиться преимуществами этого способа. Процесс make world предлагает такие меры безопасности, которые обычно являются недоступными при инсталляции предварительно скомпилированных бинарных файлов с компакт-диска. Если, например, какая-то часть исходного кода окажется поврежденной, то процесс компиляции тут же прекратится, вместо того чтобы инсталлировать в систему двоичные файлы пересборки, дабы впоследствии выяснить, что их невозможно использовать. Однако чисто философские отличия между make world и другими способами модернизации заключаются в том, что он размывает границу между выпущенным программным обеспечением и промежуточными сборками. Выпуск (звучит несколько велеречиво) часто представляет собой просто снимок исходного кода, в котором код кажется особенно стабильным и совпадает с заданным поэтапным графиком. Процесс синхронизации ваших исходных кодов с этим снимком в функциональном плане является тем же, что и синхронизация с любой другой точкой в ветви — это подход, дружественный для разработчика. Вряд ли найдутся отличия в технологии между обновлением вашей системы до 6.0-RELEASE и до 6-STABLE. Это едва различимое отличие между состояниями разработки стимулирует администраторов на то, чтобы они хранили свои деревья кодов синхронизированными, гарантируя, что самые свежие заплаты безопасности и исправления ошибок всегда будут находиться под рукой. Чтобы обновить отдельную часть вашей системы после получения подходящих исходных файлов требуемого вам этапа разработки, вам нужно всего лишь перейти к заданной части исходного кода, собрать его и инсталлировать (порядок обновления индивидуальных компонентов с помощью этого способа рассматривается в главе 30).
Системное администрирование Вам также понадобится запланировать периодическую пересборку всей системы (так сказать, всего "мира"). Чтобы создать "мир", необходимо выполнить четыре основных этапа. 1. Сборка "мира* (или всего, что входит в основу систему, кроме ядра). 2. Сборка ядра. 3. Инсталляция "мира", 4. Инсталляция ядра* Однако прежде чем вы выполните один из этих этапов, мы должны сделать некоторые необходимые приготовления и высказать предварительные замечания. Что нужно учесть, прежде чем приступать к модернизации с помощью процесса make world Риски, связанные со сборкой вашей системы "с нуля", не являются такими уж несерьезными. Для высокоуровневого сервера предприятия вам может показаться, что эти риски слишком велики, чтобы процесс make world можно было использовать для модернизации. Совсем несложно подождать появления каждого полного выпуска на компакт-диске, и взамен вы можете выбрать именно этот путь — или выполнять модернизацию двоичных файлов с помощью Sysinstall, или (как сегодня поступают многие администраторы) резервировать данные, выполняя новую инсталляцию с переформатированием жестких дисков и повторной инсталляцией данных. Однако чтобы принять обоснованное решение, вы должны четко понимать, с какими рисками связана сборка системы на основе промежуточных исходных кодов. Во-первых, и что является наиболее очевидным, make world включает как минимум одну перезагрузку, длится довольно-таки долго и может помешать работе многих утилит вашей системы. Если доступное машинное время для вас является важным критерием, или если ваша система обязательно должна постоянно работать в оперативном режиме (как в случае с высокоуровневым сервером предприятия), то приемлемым вариантом для вас будет модернизация до каждой последующей версии RELEASE и установка необходимых заплат между выпусками. Во-вторых, make world не является гарантированно безопасным процессом Члены группы FreeBSD Group не утверждают, что make world не разрушит полностью вашу систему (хотя на самом деле это справедливо для любого способа модернизации). Настоящая проблема заключается в том, что частая пересборка операционной системы повышает шансы того, что система выйдет из строя. Использование make world является наилучшим способом установки самых последних исправлении ошибок, но при этом может оказаться, что вы запускаете систему, не протестировав новые фукции или изменения в коде, либо, что еще хуже, может оказаться, что ваши исходные коды не будут собраны, поскольку, по чистому невезению, вы синхронизировали исходные коды как раз тогда, когда был обнаружен нестабильный код. Помните, что ветви кодов STABLE и CURRENT представляют собой живые, ды шащие создания — они не содержат качественный код, да и не предназначены дм этого. Любой промежуточный код, который не попадает в определенную ветвь вы пуска, следует рассматривать в лучшем случае как бета-версию. Пересборку всей системы между выпусками нужно выполнять только в том случае, если вы используете
Поддержание актуальности FreeBSD | Z7Z I Глава 19 I 1 вашу FreeBSD-машину как рабочую станцию или небольшой, не имеющий серьезного влияния сервер, или если просто нет другого способа получить исправление критической ошибки или новую возможность. НА ЗАМЕТКУ В производственных средах обычно можно встретить конфигурацию с использованием двух идентичных компьютеров: "реального" сервера и его клона, используемого для целей резервирования и тестирования. Если у вас имеется подобная установка, вы можете протестировать результаты выполнения процесса make world в резервной системе, а затем уже переносить его на производственный сервер. Использование зеркального тестового сервера в производственной среде объясняется следующим: вы получаете две идентичные платформы, и если на тестовом компьютере что-то работает нормально, то оно обязательно будет функционировать и на рабочем компьютере. Поэтому вам нужно убедиться в том, что исходные коды, на основе которых вы будете создавать свою систему, являются идентичными в обеих системах. Крайне необходимо, чтобы вы синхронизировали обе системы с одним и тем же деревом исходных кодов и точкой исправления ошибок, и не выполняли больше никаких процессов синхронизации между make world тестовой и рабочей систем. Если вы отслеживаете либо ветвь STABLE, либо ветвь CURRENT, вам совершенно необходимо подписаться на соответствующий список рассылки f reebsd-stable@ freebsd.org или freeJDsd-current@freebsd.org. Эти списки служат в качестве форумов для любого, кто отслеживает ветвь, чтобы он имел возможность обсудить проблемы, новые исправления ошибок или функции, и, возможно, они являются ловушкой для тех, кто решил синхронизировать исходные коды в определенный момент времени. Активный пользователь может, например, дать в списке f reebsd-stable@ freebsd.org объявление, предупреждающее всех не применять make world хотя бы следующую пару дней, пока у него не появится шанс протестировать зарегистрированную новую рискованную возможность. Если вы не подписывались на список рассылки, а новая возможность оказалась несовершенной, то ваша система может заработать нестабильно или в ее безопасности может образоваться брешь, что в точности соответствует тому, что вы пытаетесь избежать, отслеживая исходные коды. НА ЗАМЕТКУ Оба списка рассылки являются стандартными списками Majordomo. Вы можете подписаться на один из них, отправив электронное письмо по адресу majordomo@freebsd.org, указав в теле сообщения следующую информацию: subscribe freebsd-stable Не отправляйте запрос на подписку по адресу freebsd-stable или freebsd-current! Это одна из самых распространенных ошибок в Internet! Эти адреса предназначены для самого трафика писем, а не для управляющих команд. Вот и все. Когда вы получите уведомительное письмо, ответьте на него, чтобы ваш адрес был включен в список рассылки. Чтобы отказаться от подлиски, сделайте то же самое, только в теле письма замените слово subscribe словом unsubscribe. Важно отметить, что даже если вы решите не запускать процесс make world регулярно, то отслеживание исходных кодов практически во всех случаях все равно
Системное администрирование будет хорошим делом. Само по себе отслеживание исходных кодов уже позволяет синхронизировать дерево исходного кода в вашей системе (все, что находится в каталоге /usr/Src) с текущим состоянием ветви кода STABLE или CURRENT; при этом бинарные файлы не будут обновляться, и вообще не будет затронута работа вашей системы. Вы сможете затем запускать процесс make world, компилируя все эти исходные коды в совершенно новую систему, по вашему усмотрению. Как вариант, поскольку процесс сборки выполняется в соответствии с иерархией файловой системы, в которой она находится, вы можете просто перейти к любой точке внутри /usr/src и создать данный компонент индивидуально — например, чтобы собрать только библиотеку libkvm, нужно перейти в каталог /usr/src/lib/libkvm. Так обычно применяются заплаты в ответ на предупреждение об опасности (об этом мы поговорим в главе 30). Прежде всего, следует помнить, что обновление системы FreeBSD не является обратимым процессом. Вы не сможете деинсталлировать более новую версию, чтобы вернуться к прежней версии. Самая лучшая мера предосторожности — предпринимать по возможности все меры предосторожности. Отслеживание ошибок и отчеты о проблемах База данных для отслеживаемых ошибок в FreeBSD доступна для всех и работает в оперативном режиме. Вы можете посмотреть состояние всех обнаруженных ошибок и запросах функций по адресу http://www.FreeBSD.org/cgi/query-pr-summary.cgi, или можете перейти по адресу http://www.freebsd.org/support/bugreports.html, чтобы поработать с Web-интерфейсом базы данных ошибок GNATS. Вы можете также самостоятельно составлять отчеты об ошибках; на самом деле, подобным образом регистрируется большинство ошибок. Вы можете воспользоваться Web-формой, доступной через предыдущий URL GNATS (щелкните на ссылке Submit a Problem Report (Передать отчет о проблеме)); вы можете также использовать инструмент командной строки, называемый send-pr. После выдачи этой команды откроется текстовый редактор с шаблонным файлом. В нем нужно будет заполнить поля соответствующими данными об ошибке. Когда вы сохраните файл и закроете редактор, отчет о проблеме будет отправлен прямо в базу данных GNATS и просмотрен активными пользователями. Естественно, вы захотите убедиться в том, что в отношении ошибки, о которой вы намерены сообщить, еще не было составлено никакого отчета. Поищите по упомянутым URL-адресам любой связанный с вашей темой текст в любом из открытых отчетов. Также не забудьте подписаться на соответствующий список рассылки: freebsd-stable или f reebsd-current. Неплохо также расспросить в соответствующем списке, сталкивался ли кто-нибудь еще с данной проблемой, прежде чем составлять отчет о ней и отправлять через send-pr. Скорее всего, что кто-то уже упоминал об ошибке, и вы можете даже узнать о том, как временно справится с возникшей проблемой. Задачи, которые нужно выполнить перед процессом make world Итак, вы решили заново собрать систему. Независимо от того, собираетесь ли вы выполнять синхронизацию с промежуточными исходными текстами в одной из веток разработки, или вы затеяли пересборку, чтобы осуществить модернизацию до следующего ведущего выпуска, вам нужно будет выполнить некоторые действия,
Поддержание актуальности FreeBSD прежде чем приступать к довольно сложному процессу пересборки. Многие вещи могут пойти не так, как надо, поэтому вам стоит придерживаться следующего плана. 1. Создайте резервную копию существующей системы. Нет большего несчастья, чем выполнить простую, рутинную модернизацию для того, чтобы обнаружить, что ваша система оказалась разрушенной и все данные ваших пользователей безвозвратно утеряны. В решениях резервирования могут использоваться накопители на магнитной ленте, оптические диски (CD-R, DVD-RAM, DVD-R и тому подобные), второй жесткий диск, который вы монтируете только тогда, когда вам нужно создать на нем зеркальную копию содержимого первого диска, или другой компьютер, который вы синхронизируете посредством NFS или CSVup (способы резервирования будут рассмотрены в главе 21.) ВНИМАНИЕ! ¦ Принятие подходящего решения для резервирования является не только одной из наиболее ответственных, но и самой трудной задачей в администрировании системы. Несомненно, многие читатели проигнорируют это предупреждение, и кое-как продолжат свою работу — такое происходит постоянно — но если у вас имеется возможность распределять средства, и вы можете отстаивать свое мнение при выработке решения по резервированию, то полученные преимущества полностью окупят первоначальные вложения. 2. Проверьте сроки модернизации. Обратите внимание на списки рассылок по выбранной вами ветви, если вы отслеживаете базу кодов активной разработки. Убедитесь в том, что ваша модернизация не будет происходить во время объявления об исправлении ошибки или во время фазы тестирования. Если время не подходит для модернизации, а вам срочно понадобилась какая-то заплата или коррекция ошибки, узнайте, нет ли способа собрать заново только этот один компонент. 3. Синхронизируйте свои исходные коды. Прежде чем вы действительно сможете сделать что-нибудь еще, чтобы подготовиться к пересборке, вам нужно будет синхронизировать свои исходные коды, о чем будет рассказано в следующем разделе. Вам потребуется произвести настройку для этого только один раз; впоследствии этот процесс может (и должен) выполняться автоматически и запускаться регулярно. Синхронизация существующего дерева исходных кодов с деревом STABLE или CURRENT, ветвью исправления ошибок или выпуском Синхронизировать имеющиеся исходные коды можно несколькими доступными способами. Среди методов, предложенных разработчиками FreeBSD, можно назвать СТМ, Anonymous CVS и CVSup — и каждый из них обладает своими собственными преимуществами. Вы можете прочитать о каждом из этих методов на Web-сайте FreeBSD в статье под заголовком "Synchronizing Your Source" (Синхронизация ваших исходных кодов) в интерактивном справочнике. В этой главе рассматривается применение CVSup, поскольку этот метод является наиболее совершенным и эффективным (к тому же, еще и самым толковым).
600 Системное администрирование Часть IV Конфигурирование и запуск CVSup О настройке CVSup говорилось в главе 16, в разделе "Поддержка актуальности портов с помощью инструмента CVSup". Если вы не настроили sup-файл (конфигурационный файл CVSup), вернитесь к главе 16 — там вы узнаете о том, как устанавливается CVSup и создается соответствующий sup-файл. Если же вы настроили sup-файл (например, /etc/ports-supfile, представленный в листинге 16.7), вы можете изменить его, чтобы синхронизировать все дерево исходных кодов, а не только порты, добавив пару строк, как показано в листинге 19.1, и присвоив ему более общее имя (например, /etc/6stable-supfile). Листинг 19.1. Общий конфигурационный файл CVSup для синхронизации ветви STABLE *default host=cvsupl2.FreeBSD.org *default base=/usr *default prefix-/usr ¦default release=cvs ¦default tag=RELENG_6 ¦default delete use-rel-suffix src-all ¦default tag=. ports-all doc-all Файл интерпретируется последовательно, а последние строки * default заменяют предыдущие строки, применяясь только к командам, которые будут стоять под ними. Обратите внимание на то, что первый набор строк *def ault, в которых перечислены настройки, определяющие, где CVSup будет хранить загружаемые файлы, и какое будет использоваться хранилище исходных кодов, задает метку ветви RELENG6. Как вы уже могли видеть, эта метка подходит для ветви 6-STABLE. Однако эти настройки применяются только к коллекции исходных кодов src-all — исходных кодов системы FreeBSD. После этой строки, другая строка * default сбрасывает метку ветви до точки (,.), которая является синонимом дерева исходных кодов HEAD. Эта метка подходит для коллекции портов (ports-all) и дерева документации (doc-all), при этом коллекция и дерево имеют только одну ветвь разработки — они не разбиваются на ветви подобно исходным текстам системы, а самое свежее состояние каждого дерева всегда считается наилучшей версией в любой момент времени. После того как вы настроите sup-файл, запустите обновление CVSup с помощью следующей команды: # cvsup -L 2 /etc/ 6stable-supfile Parsing supfile "/etc/Gstable-supfile" Разбор sup-файла n/etc/6stablesupfile" Connecting to cvsupl2.FreeBSD.org Соединение с cvsupl2.FreeBSD.org Connected to cvsupl2.FreeBSD.org Соединение с cvsupl2.FreeBSD.org Server software version: SNAP_16_lh Версия ПО сервера: SNAP_16_lh Negotiating file attribute support Согласование о поддержке атрибутов файла Exchanging collection information Обмен информацией о коллекции
Поддержание актуальности FreeBSD | ТТ~ I ГпЯИа1й I 601 I Establishing multiplexed-mode data connection Установка информационного соединения в мультиплексном режиме Running Выполнение Updating collection src-all/cvs Обновление коллекции src-all/cvs Edit src/UPDATING Редактирование src/UPDATING Add delta 1.416.2.3.2.6 2005.12.19.10.58.56 delphij Добавление delta 1.416.2.3.2.6 2005.12.19.10.58.56 delphij Edit src/sys/conf/newvers.sh Редактирование src/sys/conf/newvers.sh Add delta 1.69.2.8.2.2 2005.12.19.10.58.57 delphij Добавление delta 1.69.2.8.2.2 2005.12.19.10.58.57 delphij Edit src/sys/nfsclient/nfs_vnops.с Редактирование src/sys/nfsclient/nfs^ynops.с Add delta 1.258.4.1 2005.12.19.10.58.57 delphij Добавление delta 1.258.4.1 2005.12.19.10.58.51 delphij Внимательно посмотрите на выходные данные. Вы должны увидеть серию имен файлов, имена которых относятся к базе (/usr); каждое имя имеет пронумерованные и обозначенные пересмотры — то есть CVSup синхронизирует дерево ваших исходных кодов с одним из серверов, загружает и применяет только те части, в которых имеются отличия. СОВЕТ Эту команду CVSup очень удобно использовать для псевдонимов оболочки (см. главу 9): alias sync6 cvsup -L 2 /etc/6stable-supfile Каждая строка должна начинаться или со слова Edit, или со слова Checkout, или же со специального слова Delete, показывающего, что файл был удален по причине избыточности или перемещен в другое место. Однако еслк вы увидите только строки Delete, вы должны нажать комбинацию клавиш <Ctrl+C>, чтобы остановить процесс — это означает, что вы выполняете синхронизацию с деревом исходных кодов, которого не существует. Проверьте еще раз свой sup-файл, чтобы убедиться, что метка вашей ветви правильная, и что она указывает на действительную ветвь исходных кодов, как показано на странице http://www.freebsd.org/doc/en_US.ISO8859-1/ books/handbook/cvs-tags .html. Если вас удовлетворит работа по синхронизации, проделанная CVSup, то вам, наверное, нужно будет добавить задачу для запуска обновления CVSup в вашем ежедневно выполняющемся файле periodic, о чем говорилось в разделе "Поддержка актуальности портов с помощью инструмента CVSup" главы 16. Каждый день после этого в вашем распоряжении будут исходные коды, устаревшие не более чем на один день. СОВЕТ В конце каждого процесса CVSup, выполненного из подсистемы periodic, генерируется и посылается сообщение суперпользователю о состоянии, содержащее весь вывод консоли процесса. Содержимое этого сообщения всегда нужно внимательно просматривать! Когда вы отслеживаете ветвь STABLE или CURRENT (или ветвь исправления ошибок), то в этих сообщениях каждый день будет указываться об изменениях. Таким образом, вы будете точно знать, когда исправление кри-
I ГГГ 1 Системное администрирование I Часть IV тической ошибки было применено к компоненту, за которым вы наблюдаете. Выходные данные процесса CVSup могут быть очень объемными, однако спустя несколько дней вы поймете, какие части являются важными, а какие можно проигнорировать. Особенно это касается ветви исправления ошибок: при создании новой промежуточной точки вывода вы будете видеть только измененные файлы. Иногда вам придется проверять файл updating (о нем мы уже вкратце говорили), чтобы узнать точно, что было изменено, и нужно ли вам в таком случае что-то предпринимать. Использование CVSup для синхронизации с ветвью исправления ошибок или с выпуском Использование CVSup является превосходным способом получения исходных кодов для ведущей версии выпуска или промежуточного выпуска исправления ошибок, а также для синхронизации с активно разрабатываемыми исходными текстами. Чтобы сделать это, вам нужно просто использовать метку ветви, которая определяет требуемый выпуск (об этом уже говорилось в этой главе). Иногда возникает желание, особенно если вы выполняете обновление из серий одной ведущей версии до другой, выполнить синхронизацию с ведущей версией выпуска (например, б. О-RELEASE) и собрать из нее систему; однако вам следует иметь в виду, что оригинальная база кодов RELEASE для конкретной ветви выпуска обычно является небезопасной — в ней нет исправлений критических ошибок, которые были внедрены в нее с момента появления выпуска. Обычно базы кодов RELEASE являются уместными только на протяжении нескольких недель с момента появления исходного выпуска в этой ветви, или до тех пор, пока код не станет изменяться в ответ на бюллетени по безопасности. Наилучшим вариантом для большинства администраторов FreeBSD является использование ветви исправления ошибок, при котором вы получите ключевые обновления, необходимые для устранения серьезных проблем с безопасностью, избавитесь от трудоемкой и надоедливой модернизации, а в вашем коде не произойдет нестабильных или неуместных изменений. Чтобы определить конкретную ветвь исправления ошибок, отредактируйте sup-файл (вернитесь обратно к листингу 19.1) и измените метку ветви, относящейся к коллекции src-all. Например, исходные коды ветви исправления ошибок для FreeBSD 6.1 можно заполучить с помощью следующей строки: ¦default tag=RELENG_6_l Если вы действительно хотите выполнить синхронизацию с базой кодов RELEASE (например, с исходным выпуском FreeBSD 6.1), зная, что она является менее безопасной, чем текущее состояние ее соответствующей ветви исправления ошибок, используйте строку, подобную следующей: ¦default tag=RELENG_6_l_0_RELEASE Теперь, когда вы запустите обновление CVSup из этого файла, вы получите "замороженные" исходные коды для выбранного вами выпуска. Также, в отличие от постоянно изменяющихся веток STABLE и CURRENT, если вы выполните обновление снова через неделю, то ничего не изменится. Сейчас вы можете использовать процесс make world из этих исходных кодов, чтобы собрать чистую систему из исходных файлов первоначального выпуска. Однако после этого вы должны будете изменить метку выпуска в своем sup-файле, чтобы указать соответствующую ветвь исправления ошибок и снова синхронизировать ио
Поддержание актуальности FreeBSD Глава 19 603 ходные коды, чтобы получить наиболее свежие заплаты безопасности для выбранного вами выпуска. 3ateM вы сможете возобновить ежедневные процессы синхронизации, чтобы у вас были самые свежие заплаты исходных кодов и обновления, на ваше усмотрение. Этот способ модернизации подойдет лучше всего, если вам придется обслуживать важный сервер, который всегда нужно будет поддерживать актуальным. Вопросы, связанные с поиском и устранением неполадок При использовании CVSup могут возникнуть некоторые проблемы, и поскольку этот тип задачи не имеет аналогов в большинстве других операционных систем, будет тяжело сказать, когда процесс проходил по плану, а когда в нем неожиданно возникла ошибка. Ниже перечислены предполагаемые решения некоторых из наиболее часто упоминаемых проблем. • CVSup не подключается к выбранному мною серверу (соединение отклонено). Попытайтесь выбрать другой сервер CVSup. Серверы имеют имена от cvsupl до cvsupl8; чем выше номер (например, cvsupl5.freebsd.org), тем больше вероятность, что он будет менее загруженным. Также попытайтесь запустить CVSup в то время суток, когда трафик будет минимальным (например, ближе к полуночи). • CVSup подключается к серверу, но ничего не происходит. Это может произойти в том случае, если вы находитесь за брандмауэром или маршрутизатором NAT, который маскирует ваш IP-адрес. Известно, что CVSup работает с сетевыми конфигурациями с разрешенным NAT, однако неправильно сконфигурированный NAT может стать причиной возникновения проблем. Также убедитесь в том, что ваш брандмауэр разрешает трафик CVSup. В качестве порта сервера необходимо выбрать 5999. Попытайтесь использовать команду telnet для подключения к серверу на этом порту, чтобы убедиться в возможности подключения (telnet cvsupl2.freebsd.org 5999)-; если вы не получите ответа или получите сообщение "Connection refused" (соединение отклонено), то вполне возможно, что вам придется создать исключение брандмауэра для порта 5999. • CVSup удалила весь мой каталог /etc/src/ Это происходит в том случае, если вы задали неверную метку ветви. Если вы укажете для CVSup метку, которую не может распознать сервер, то в ответ она даст вам содержимое дерева CVS в указанной вами ветви, то есть ничто. Убедитесь в том, вы получили правильную метку ветви, и все будет в порядке; просто запустите CVSup еще раз и свежий набор исходных кодов будет загружен и объединен со всем, что осталось после предыдущего запуска CVSup. Текстовый файл updating Теперь, когда ваши ресурсы были обновлены, в каталоге /usr/src находится текущий файл UPDATING. Этот файл представляет собой бюллетень "самых последних горячих новостей", в котором содержится важная информация о модернизации системы, которая гарантированно будет самой свежей, чем все, что вы читали в печати или в интерактивном режиме. Файл UPDATING содержит листинг заметных изменений в процессе сборки, отсортированных в обратном хронологическом порядке
Системное администрирование Часть IV (каждое изменение отмечено датой), о которых вы должны будете знать. Прочитайте все эти сообщения, начиная с первых строк файла и заканчивая датой, когда вы последний раз запускали процесс make world. В ветви исправления ошибок записи в файле UPDATING показывают природу каждой зарегистрированной заплаты безопасности или исправления критической ошибки, и каждая из них помечается соответствующим номером р: 20051219: pi FreeBSD-EN-05:04.nfs Correct a locking issue in nfs_lookup() where a call to vreleO might be made while holding the vnode mutex, which resulted in kernel panics under certain load patterns. Устранение проблемы, приводящей к блокировке nfs_lookup (), в которой вызов vrele () может быть произведен с флагом vnode, что может привести к сбоям в работе ядра при некоторых шаблонах загрузки. 20051101: FreeBSD 6.0-RELEASE Файл UPDATING содержит специальные инструкции, которые помогут вам справиться с основными изменениями в системе (перемещенными файлами, добавленными или исключенными функциями и так далее). Вы должны помнить, что файлы в каталоге /etc не изменяются автоматически процессом make world. Любые конфигурационные файлы, которые вы храните в нем, не будут перезаписаны. Этим гарантируется, что настройка вашей специальной системы не будет утрачена; это означает также, что всякий раз, когда стандартная конфигурация системы будет тре бовать добавления чего-то нового или удаления из каталога /etc, то объединение вам придется выполнять вручную. Файл UPDATING обычно детализирует подобные случаи. К счастью, объединять новые файлы в каталоге /etc вам поможет удобный инструмент mergemaster. Об этом инструменте вы сможете прочитать в разделе "Использование утилиты mergemaster для проверки измененных конфигурацией ных файлов" далее в этой главе. Объединение /etc/group и etc/passwd Большинство файлов, находящихся в каталоге /etc, не участвуют в сборке систе мы. Однако периодически добавляются новые службы, которые нужно устанавливать таким образом, чтобы их владелец совпадал с некоторым пользователем или груп пой. Вспомним, что процесс make world не является приложением инсталлятора с встроенными задачами обновления; этот процесс просто перекомпилирует и уст* навливает новую версию операционной системы поверх старой. Это означает, что процесс make world не будет создавать нужных ему пользователей и групп, если они на данный момент не будут существовать. Вы можете помочь выбраться из любо коллизии, объединяя любые новые записи с записями в вашем файле /etc/group, Новой версией /etc/group является /usr/sre/etc/group. Как правило, онб дет содержать не более 20 строк. Откройте /etc/group в другом окне терминал Теперь посмотрите, есть ли в файле /usr/sre/etc/group записи, которых нет /etc/group. Если вы найдете такие записи, просто скопируйте их туда. Скорее все го, новые записи будут иметь номера GID до 100. Сравнить два файла можно довольно просто — используя dif f, как показан ниже. 604
Поддержание актуальности FreeBSD Глава 19 605 Листинг 19.2. Сравнение /etc/group и /usr/src/etc/group с помощью dif f # diff -с /etc/group /usr/src/etc/group | less *** /etc/group Wed May 2 09:57:10 2001 —- /usr/src/etc/group Fri Aug 27 16:23:41 1999 *************** *** 8/24 **** bin:*:7: news:*:8: man:*:9: - wheel:*:10:root,frank,joe games:*:13: staff:*:20:root sshd:*:22: smmsp:*:25: mailnull:*:26:. guest:*:31:root bind:*:53: uucp:*:66: xten:*:67:xten dialer:*:68: + network:*:69: - mysql:*:88: - users:*:100: nogroup:*:65533: nobody:*:65534: Группы в вашем существующем файле /etc/group показаны со знаком минус (-), а новые группы в /usr/src/etc/group помечены знаком плюс (+). В этом примере вам нужно скопировать группу network в ваш файл /etc/group. Важно сохранять номера GID, предложенные в новом файле group. В маловероятном случае, когда какой-нибудь из номеров GID не совпадет, вам нужно будет исправить ваш существующий файл /etc/group таким образом, чтобы добиться совпадения в новом файле. Это исправление может привести к тому, что некоторые существующие файлы в вашей системе (которые принадлежали этой группе) утратят свои полномочия. Вы можете поискать в системе эти файлы с помощью команды find: # find / -group GID -print После этого можно будет откорректировать полномочия этих файлов с помощью команды chmod, о которой рассказывалось в главе 13. Еще менее вероятно, что любые несовпадения обнаружатся в пользовательской базе данных. Исходные коды не включают файл passwd, а только файл /usr/sre/ etc/master «passwd, который еще короче, чем новый файл group. Быстро проверьте его и ваш файл /etc/master .passwd на предмет несоответствий, а затем с помощью команды adduser вставьте любых новых пользователей, которых вы обнаружите. Объединение файла /etc/make. conf Файлы make. conf представляют собой глобальные конфигурационные файлы, которые управляют всеми операциями make, включая make world. В новой установке FreeBSD этого файла нет. Однако подобно тому, как работают /etc/rc. conf и /etc/ defaults/rc.conf, существует файл /etc/defaults/make.conf, который определя-
606 Системное администрирование Часть IV ет все возможные настройки по умолчанию. Можно оставить все как есть, а можно ускорить работу, правильно настроив несколько опций. В онлайновом справочнике FreeBSD Handbook предлагается разрешить следующие строки, копируя их из /usr/share/examples/etc/make.conf в /etc/make.conf, напоследок закомментировав их: CFLAGS= -О -pipe N0_PR0FILE= true # Не допускать компиляцию профилированных библиотек Эти модификации позволяют гарантировать, что процесс make world будет происходить гладко, без каких-либо потенциально дестабилизирующих оптимизаций или ненужной компиляции. Если у вас есть желание поэкспериментировать, можете настроить некоторые другие опции, однако это уже выходит за рамки настоящей главы, да и всей книги в целом. Пересборка системы из исходных кодов Сейчас все готово к пересборке. Процесс пересборки состоит из довольно-таки большого числа действий, поэтому приготовьтесь потратить на него ваше время, особенно если вы это делаете первый раз. Сам процесс make world состоит из четырех главных шагов компиляции, перечисленных в табл. 19.4. Если вы чувствуете в себе исключительную уверенность, можете сократить процесс до двух действий, однако для первого раза лучше всего выполнить отдельно каждый шаг make world. Таблица 19.4. Действия, которые необходимо выполнить в процессе make world Команда из четырех действий Команда из двух действий Назначение make buildworld make world Сборка и инсталляция всего, instaiiworid кроме ядра. make buildkernel make kernel Сборка и инсталляция ядра. installkernel Команды make world и make kernel следует использовать только опытным пользователям, которые действительно понимают, что они делают; всем остальным нужно использовать четыре отдельные команды make, что является более безопасными столь же удобным способом. Тем не менее, вы не будете использовать эти команды в том порядке, в котором они приведены в таблице! На самом деле, сначала вы соберете "мир", затем соберете и инсталлируете ядро, перезагрузитесь в однопользовательском режиме, после чего инсталлируете оставшийся "мир" и объедините конфигурационные файлы. В нижеследующих разделах подробно описаны действия этого процесса. Очистка /usr/obj Это действие не нужно выполнять, если вы впервые выполняете процесс make world. В противном случае вам, возможно, придется очистить все, что находится в /usr/obj, чтобы ускорить работу процессов и не допустить возникновения коллизий, когда система столкнется с файлами, которые она не сможет перезаписать.
Поддержание актуальности FreeBSD Глава 19 607 В каталоге /usr/obj хранятся объектные файлы (скомпилированные компоненты) после их компиляции и до их установки. Однако их удаление не обязательно будет таким простым, как выполнение команды rm -rf в данном каталоге. В процессе сборки "мира" создаются некоторые файлы с флагом schg (флаг "постоянства системы"), который означает, что эти файлы нельзя удалить, даже если вы являетесь суперпользователем. Эта мера безопасности предназначена только для того, чтобы предоставить вам дополнительные средства защиты от всевозможных случайностей (например, rm -rf \ . *). Чтобы обойти это препятствие и очистить каталог сборки, используйте следующие команды: # cd /usr/obj # chflags -R noschg * # rm -rf * Вы не сможете сделать это с легкостью, если вы работаете в старой инсталляции FreeBSD, a securelevel имеет значение 1 или больше (это общесистемная настройка безопасности, которую вы задаете во время установки или в файле /etc/rc.conf, ок описано на man-странице securelevel). Эта настройка не позволяет сбрасывать флаги schg. Чтобы завершить это действие должным образом, вам нужно будет перезагрузиться в однопользовательском режиме. Запуск журнала выходных данных Храните журнал выходных данных процесса make world. Если что-то пойдет не так, вы сможете просмотреть журнал, чтобы найти ключ к разгадке произошедшего и в случае необходимости послать относящиеся к данному случаю части журнала в подходящий список рассылки. Поскольку ошибка немедленно вызовет сбой в компиляции, то у вас окажутся соответствующие строки в буфере терминальной программы. Однако если вы выполняете пересборку из локальной консоли компьютера, то у вас не будет буфера, из которого вы смогли бы выполнить копирование, и поэтому наилучший вариант — это иметь транскрипцию всего процесса, чтобы ею можно было воспользоваться в случае необходимости. Для создания журнала служит команда script. Эта команда запускает оболочку внутри оболочки, захватывая весь вывод в выбранный вами файл. Вы будете находиться в оболочке script до тех пор, пока не введете команду exit, чтобы вернуться в обычную оболочку. Ниже представлен пример, показывающий команду make buildworld, выполненную после запуска журнала script: # script ~/buildworld.out Script started, output file is ^/buildworld.out Сценарий начат, выходной файл —/bulldworld.out # make buildworld #exit Script done, output file is ^/buildworld.txt Сценарий завершен, выходной файл - ^/buildworld. txt Аргумент команды script определяет искомый файл, который будет содержать весь вывод сборки. Разумно будет присвоить этому файлу имя, соответствующее этапу сборки, который вы хотите захватить. Каждый раз, когда вы будете запускать script
I ело [ Системное администрирование I I Часть IV с одним и тем же целевым именем файла, он будет перезаписывать этот файл, а не добавлять данные в него. Таким образом, необходимо запускать script отдельно - и иметь отдельный искомый файл — для каждого этапа в процессе make world. ВНИМАНИЕ! Не определяйте целевой файл в каталоге /tmp! Файлы, хранящиеся в этом каталоге, удаляются во время запуска системы, поэтому, когда система заработает, у вас не будет ваших выходных файлов. Запуск, поиск и устранение неполадок make buildworld А теперь начинается самое веселое. Перейдите в каталог /usr/src, убедитесь еще раз, все ли в порядке, и введите первое действие make: # make buildworld Откиньтесь на спинку стула и понаблюдайте за происходящим. Процесс buildworld займет час или два времени, в зависимости от того, на каком оборудовании вы работаете. Вы можете ускорить выполнение операций с помощью опции -j, позволяющей запустить множество одновременных процессов, как в нижеследующем примере, который начинает четыре параллельные задачи: # make -j4 buildworld Это полезно даже в однопроцессорной системе, однако если вы работаете с не сколькими процессорами, вы можете существенно повысить их производительность (попробуйте запустить 10 задач). Процесс сборки выполняется в неопределенном алфавитном порядке, рекурсивно, в каталоге /usr/src. Вы можете следить за ходом его выполнения, просматривая каталоги в /usr/obj. Когда вы увидите, что компиляция выполняется из /usr/src/usr.sbin, знайте, что работа близится к завершению. Как и в случае с CVSup, процесс сборки всей операционной системы будет являться, скорее всего, незнакомым процессом, поэтому можно ожидать возникновения каких-либо проблем. Ниже описаны две наиболее часто встречающиеся проблемы и способы их решения. • Происходит сбой в работе компилятора, и выдаются ошибки "signal lln. Signal 11 (сигнал 11) сообщает об ошибке сегментации в компиляторе, которая очень часто возникает из-за проблем с оборудованием. Проверьте, не перегружен ли ваш процессор; если вы выполняете тяжелые для процессора задачи, такие как компиляция программ, то это может привести к возникновению проблем в работе FreeBSD. Если с процессором все в порядке, проверьте работу оперативной памяти и остального оборудования. Для тестирования работы оперативной памяти рекомендуется применять бесплатную программу memtest86 (http://www.memtest86.com/). • Происходит сбой компилятора, видается множество строк *** Error code l ***, Это обобщенная ошибка, которая возникает при сбое сборки в произвольной точке. Процесс buildworld не будет продолжать работу, если в какой-либо его части произойдет сбой, поэтому последние несколько строк вывода, предваряющие сбой, будут самыми полезными.
_ Поддержание актуальности FreeBSD I ГГГ I ПинмМ I 60Э 1 # Возникает ошибка, которая по всем признакам должна быть связана с неверными флагами компилятора или с некоторым несовпадающим конфигурационным файлом в /etc. Некоторые файлы, такие как /etc/make. conf, влияют на процесс buildworld и могут привести как к успешному выполнению компиляции, так и к сбою. Здесь может пригодиться инструмент, который вы будете применять впоследствии: mergemaster. Запустите mergemaster -p ("режим подготовки к сборке мира"), чтобы сравнить критически важные файлы с файлами в новом дереве исходных кодов, и инсталлируйте или объедините новые файлы, если это будет необходимо. В разделе "Запуск утилиты mergemaster", который вы найдете чуть ниже в этой главе, будет полностью рассмотрен принцип работы mergemaster. Чтобы не допустить сбоев в работе компилятора, приводящих к возникновению несовместимостей между старыми объектными файлами и новыми исходными текстами, удалите полностью содержимое /usr/obj до компиляции. Если оставить нетронутыми объекты из предыдущих сборок, то это поможет сэкономить время; с другой стороны, это может стать причиной возникновения фиктивных сбоев, если компилятор не знает, что ему требуется заново собрать некоторый компонент. Очистите /usr/obj, как было показано ранее, и попытайтесь начать сначала. Если это не поможет, поищите в архивах списков рассылки соответствующие ключевые слова из вашего вывода (архивы можно найти по адресу http: // www.freebsd.org; выберите список рассылки, который относится к вашей ветви кода— stable/freebsd-stable или current/freebsd-current). Если вы не найдете ничего полезного, задайте вопрос в соответствующем списке рассылки, приведя выходные данные команды uname -а, время вашего последнего обращения к CVSup и несколько последних, имеющих к этому отношение, строк из рывода компилятора. Другим возможным ресурсом могут быть каналы #f reebsd или #f reebsdhelp в различных серверах IRC. Подробно о каналах IRC можно прочитать в приложении Г. Модернизация ядра Итак, теперь ваш "пользовательский островок" (файлы, доступные для пользователя, или все, кроме ядра) собран и готов к инсталляции. Однако перед этим вам необходимо собрать и инсталлировать новое ядро. Модернизация ядра GENERIC Если вы работаете с ядром GENERIC (см. главу 18), то процесс не будет сложным: # make buildkernel # make installkernel Или, даже еще проще (хотя и опаснее): - # make kernel Теперь ядро инсталлировано как каталог (/boot/kernel; до выхода FreeBSD 5.0 это был один бинарный файл /kernel), заполненный модулями, а старое ядро находится в файле /boot/kernel.old. Как говорилось в главе 14, в случае сбоя нового ядра вы можете загрузить старое.
610 Системное администрирование Часть IV Модернизация специального ядра Процесс модернизации будет происходить сложнее, если вы запускаете специальное ядро. Любители поэкспериментировать могут попробовать собрать новую версию специального ядра прямо сейчас и запустить его, однако вы можете перестраховаться, собрав для начала ядро GENERIC, чтобы в случае необходимости им можно было воспользоваться. Старое ядро (именно оно сейчас и работает) вам пригодится на случай, если сбой произойдет где-нибудь еще. Не выходя из каталога /usr/src, введите следующее: # make buildkernel KERNCONF=GENERIC Это ваше первое резервное ядро — ядро GENERIC, собранное из новых исходных кодов. Теперь, если вы еще не сделали этого, скопируйте /boot/kernel в /boot/ kernel.prev (или под каким-нибудь другим имем, чтобы показать, что это ядро, которое вы уже запустили, и вы знаете, что оно работает). Затем инсталлируйте только что собранное ядро: # make installkernel KERNCONF=GENERIC Создайте копию этого ядра и присвойте ему имя kernel .GENERIC: # ср -R /boot/kernel /boot/kernel. GENERIC Теперь посмотрите, как можно собрать ваше первоначальное ядро (специальное ядро, собранное из новых исходных файлов): # make buildkernel KERNCONF=CUSTOM Естественно, вместо CUSTOM необходимо указать имя вашего специального ядра. Pfntv инсталлируйте новое специальное ядро как /boot/kernel: # make installkernel KERNCONF=CUSTOM Чтобы восстановить последовательность, ваша серия ядер представлена в табл. 19.5, Таблица 19.5. Новые доступные ядра Ядро Описание /boot/kernel Новое специальное ядро. /boot/kernel. generic Новое ядро generic. /boot/kernel .prev Старое, испытанное ядро. Если после перезагрузки в первом ядре произойдет сбой, попытайтесь загрузиться с новым ядром GENERIC. Как сказано в разделе "Процесс запуска FreeBSD" главы 14, это можно сделать, выбрав опцию 6 (Escape to Loader Prompt — Перейти к приглашению загрузчика) в меню загрузчика, а затем введя команду boot kernel. GENERIC. Если при этом произойдет сбой, загрузитесь с ранее работающим ядром, и вы верне тесь к тому состоянию, с которого начинали. Поиск и устранение неполадок при модернизации и инсталляции ядра Сборка и инсталляция ядра является наиболее рискованным этапом процесса make world, и меры предосторожности в системе, которые защищают ядро во время выполнения этого процесса, усиливают сложность процедуры, будучи не очень
Поддержание актуальности FreeBSD | ГТТ I Глава 19 I I дружественными к пользователю. Ниже рассмотрены два распространенных режима сбоя и способы их решения. • Сбой в работе компилятора. Сборка исходных кодов может оказаться невозможной по тем же причинам, что и сборка оставшейся системы. Если вы не можете устранить причины сбоя самостоятельно с помощью тех же методов, что и при процессе buildworld, попытайтесь обратиться к спискам рассылки. • Система не позволяет инсталлировать новое ядро! Если вы работаете в старой системе (до того как были отменены уровни безопасности) и присвоили параметру secure level значение 1 или больше, то make ins tall kernel не сможет удалить флаг schg в ядре. Вам будет необходимо перезагрузиться в однопользовательском режиме, чтобы выполнить каждый этап процесса. Помните о том, что когда вы загружаетесь в однопользовательском процессе (с помощью опции 4 в меню загрузчика), ни одна из файловых систем не будет монтироваться автоматически; вам придется выполнить команду mount -а до того, как вы сможете перейти в каталог /usr/src и запустить процесс make installkernel. Запуск, поиск и устранение неполадок процесса make installworld После окончания работы с ядрами можно перезагрузиться в однопользовательском режиме, который не разрешает многопользовательским процессам (каждый из них запускается другими пользователями или демонами, работающими автоматически) изменять файлы, которые вы будете модернизировать. Конфликты подобного рода могут привести к серьезной нестабильности. Кроме того, однопользовательский режим хорош еще и тем, что он способствует некоторому увеличению производительности и позволяет вернуть систему в рабочий режим полностью модернизированной и готовой к работе. Перезагрузитесь в однопользовательском режиме с помощью команды reboot. Когда вы достигнете меню загрузчика, выберите опцию 4 (Boot FreeBSD in Single User Mode — Загрузить FreeBSD в однопользовательском режиме), чтобы система заработала, а вы смогли бы убедиться в работоспособности нового ядра и завершить инсталляцию. НА ЗАМЕТКУ Если система не работает (в ней возникла аварийная ситуация, она может выдавать сообщения об ошибках или могут возникать отказы разного рода), сначала попытайтесь перезагрузиться обычным образом, чтобы посмотреть, изменится ли при этом поведение системы, и попытайтесь выяснить, что стало причиной возникновения проблем в новом ядре. Если вам по-прежнему не везет, то тогда нужно вернуться к старым ядрам. Перезагрузитесь еще раз и попытайтесь загрузиться в однопользовательском режиме с резервным ядром, как это уже делалось раньше. Выбирайте ядра до rex пор, пока не достигнете того ядра, с которым вы работали перед самой модернизацией (оно должно загрузиться без проблем — до этого момента вы изменяли в системе лишь ядро). После того как проблема с новым ядром будет устранена, отложите выполнение процесса make world и попытайтесь снова все сделать с самого начала. Не исключено, что сбой ядра в этот момент свидетельствует о более широкой и временной проблеме, которая будет устранена в исходных текстах в ближайшее время.
612 Системное администрирование Часть IV В однопользовательском режиме вы являетесь суперпользователем по умолчанию. Прежде всего, вы должны смонтировать файловые системы, чтобы вы могли иметь доступ к дереву исходных кодов; сделайте это с помощью команды mount -а, а затем проверьте, работают ли они, выполнив команду df (в выводе команды должны быть перечислены все ваши файловые системы). Вернитесь в каталог /usr/src и введите последнюю, самую важную часть процесса make world. Инсталляция системных бинарных файлов не займет столько же времени, сколько их сборка, однако во время этого процесса с той же долей вероятности может возникнуть ошибка — на этот раз сбой приведет к частичному изменению системы. Прежде чем вы приступите к выполнению этого шага, начните работу журнала выходных данных script. Для этого вам понадобится следующая команда: • make installworld После того как этот шаг будет завершен, ваши бинарные файлы и ядро должны быть совместимыми друг с другом; попробуйте запустить утилиты вроде ps и top, чтобы убедиться в их правильной работе. Ошибки возникнут, если ядро и бинарные файлы собраны не из одной и той же базы исходных кодов, поэтому если утилиты работают, вы можете быть уверены в том, что до данного момента вы все удачно инсталлировали. Все, что работает неправильно во время процесса make world, является потенциально опасным — в итоге вы можете получить частично инсталлированную систему, причем одна ее часть будет совместима с новым ядром, а другая — нет. К счастью, существует лишь несколько вещей, которые потенциально могут работать не так, как на других этапах. Ниже перечислены наиболее часто встречающиеся проблемы. • Происходит сбой в работе инсталлятора, сообщается о проблеме с полномочиями или владением. Проблема заключается в синхронизации ваших файлов /etc/group и /etc/ master.passwd до инсталляции "мира". Проверьте, не пропущен ли какой-нибудь пользователь или группа, и попытайтесь повторить сначала. • Возникла ошибка, которая, по-видимому, связана с некорректными флагами компилятора, или с каким-нибудь несоответствующим конфигурационным файлом в /etc. Некоторые файлы, такие как /etc/make .conf, влияют на процесс installworld и могут привести как к успешному выполнению, так и к сбою. Здесь может помочь инструмент mergemaster, которым вы будете пользоваться позднее: выполните команду mergemaster -p ("режим подготовки к сборке мира"), чтобы сравнить критически важные файлы с файлами в новом дереве исходных кодов, и инсталлируйте или объедините новые файлы, если это будет необходимо. В разделе "Запуск утилиты mergemaster", который вы найдете чуть ниже, дано полное описание принципа работы mergemaster. Использование утилиты mergemaster для проверки измененных конфигурационных файлов В процессе make world остался всего один шаг: объединение вашей старой иерархии /etc (и прочих смешанных областей вроде /var/log и /usr/share) с новой. Как мы уже говорили, шаги процесса make world не касаются каталога /etc; это сделано
Поддержание актуальности FreeBSD Глава 19 613 для того, чтобы не утратить тонко настроенные конфигурации. Раньше объединения изменений в каталоге /etc производились только вручную, что сопровождалось настоящими мучениями и порождало множество ошибок. Утилита mergemaster, являющаяся стандартной частью FreeBSD, существенно упрощает этот процесс и делает его безопасным. Утилита mergemaster буквально напичкана мерами предосторожности; этот инструмент является крайне безопасным в использовании. Тем не менее, риск повреждения вашей конфигурации присутствует всегда, поэтому в качестве меры предосторожности следует создать резервную копию каталога /etc. К счастью, это делается довольно просто: # ср -Rp /etc /etc.old или так: # tar cvfz /etc-backup. tgz /etc Запуск утилиты mergemaster Обычно утилита mergemaster не требует никаких опций; ее стандартные настройки подобраны таким образом, чтобы ее поведение было нормальным. Однако при первом использовании утилиты вы можете добавить опцию -v ("verbose" — многословный), чтобы почитать объяснение того, что делает утилита на каждом этапе. Можно также указать опцию -с, чтобы использовать контекстные dif f s вместо унифицированных. Ниже показан пример команды: # mergemaster -cv Сначала mergemaster создает временный корневой каталог и инсталлирует в него все имеющие отношение к делу исходные коды, включая разнообразные деревья файлов, которые нужно именно "инсталлировать" (то есть они должны пройти обработку сценариями инсталлятора), а не просто копировать. По умолчанию этой "стартовой областью" является каталог /var/tmp/temproot. Она показывает список файлов, которые существуют только в каталоге /etc, а не во временном корневом каталоге (обычно эти файлы вы добавляете самостоятельно, поэтому она их не затронет). Затем mergemaster приступает к сравнению всех файлов в каталоге /etc и некоторых других местах с новыми файлами в каталоге /var/tmp/temproot. Всякий раз при обнаружении несовпадающих файлов она будет отображать вывод dif f в любой программе постраничного вывода, которую вы укажете в переменной окружения PAGER (или, по умолчанию, more). Когда вы прокрутите весь список вывода dif f (или нажмете клавишу <», чтобы перейти прямо в конец), вам будет предложен список вариантов того, что вы можете сделать с новым файлом. Пример этого списка показан в листинге 19.3. Листинг 19.3. Опции для объединения файла в утилите mergemaster *************** *** 321,326 **** — 327,333 kern_securelevel="-l" # диапазон: -1..3; '-1' является самым незащищенным update_motd="YES" # обновление информации о версии в /etc/motd (или N0) start_vinum-"" # присвойте YES, чтобы запустить vinum + unaligned_print="YES" # печатать бессистемные предупреждений о доступе # в алфавитном порядке (или N0)
614 Системное администрирование Часть IV ##################################################################### ### Определение source_rc__conf, механизма, используемого /etc/rc* ## Используйте 'd', чтобы удалить временный файл ./etc/defaults/rc.conf Используйте 'i', чтобы инсталлировать временный файл ./etc/defaults/rc.conf Используйте 'т1, чтобы объединить старую и новую версии Используйте 'v', чтобы посмотреть отличия снова между старой и новой версиями По умолчанию нужно оставить временный файл, чтобы обработать его вручную Как я буду работать с ним? [Оставьте напоследок] Как можно видеть, по умолчанию ничего не нужно делать, оставив новый файл в каталоге /var/tmp/temproot для рассмотрения после завершения работы утилиты, Этим вы обезопасите выполнение mergemaster. Если вы выберете т, чтобы объединить два файла, вы окажетесь в среде sdiff. Ниже показаны старая и новая версии измененного файла, строка за строкой, позволяя вам выбрать левую (старую) и правую (новую) версии: *** Введите h в приглашении sdiff (%), чтобы получить справку по использованию pccard_beep~"l" # pccard beep j pccard_beep="2" # сигнал pccard % Опции команды sdiff доступны после ввода h в строке приглашения. Совет Каждая измененная строка объединяется индивидуально, поэтому метод sdiff может оказаться утомительным, если использовать его для объединения очень длинных файлов с множеством разрозненных изменений. Наверное, наилучшим вариантом будет создание резервной копии существующего файла, заменяя его полностью в утилите mergemaster, а затем объединяя с изменениями с помощью текстового редактора и двух параллельных терминальных окон. Поскольку каждая измененная строка отображается в разных половинах одного и того же экрана, иногда две стороны будут выглядеть одинаково, поскольку отличия могут быть только в правой половине строки. Обычно это не вызывает никаких проблем (разве что проблема может возникнуть в стандартизированных строках заголовка FreeBSD, в которых дата модификации появляется в самом конце строки), Однако избавиться от этого можно, определив большую ширину экрана с помощью опции -w утилиты mergemaster: # mergemaster -cv -w 120 Как только вы закончите разбираться со строками, вы снова окажетесь в интерфейсе утилиты mergemaster, где вам будет предложено еще раз просмотреть (или даже объединить) ваши изменения, прежде чем переходить к новому файлу. По окончании mergemaster спросит вас, хотите ли вы удалить все, что находив ся в левой части /var/tmp/temproot. Если вы оставите файлы необъединенными, с расчетом вернуться к ним позднее, выберите No (Нет). После этого работа утилиты будет завершена, и вы сможете перейти в каталог /var/temproot, чтобы объединить оставшиеся файлы вручную.
Поддержание актуальности FreeBSD Глава 19 Поиск и устранение неполадок в работе утилиты mergemaster К счастью, все, что может работать неправильно в утилите mergemaster, не является деструктивным по отношению к системе — особенно если вы сделали резервную копию вашего каталога /etc. И все же, при работе утилиты mergemaster могут возникать следующие ошибки. • Я случайно перезаписал важный файл в каталоге /etc обобщенной новой версией! Не стоит беспокоиться. Если у вас имеется резервная копия (например, /etc.old), вы можете просто завершить работу утилиты mergemaster, нажав комбинацию клавиш <Ctrl+C>, скопировать файл из резервного каталога и вернуться в /etc. • Утилита mergemaster случайно удалила оставшиеся файлы в каталоге /var/tmp/ temproot!А я собирался использовать их! Просто запустите mergemaster еще раз и проигнорируйте любые файлы, которые вы уже заменили или с которыми вы выполнили объединение. Не выбирайте вариант No (Нет) в последнем приглашении, в котором выдается запрос, хотите ли вы удалить оставшиеся файлы в каталоге /var/tmp/temproot. Перезагрузка после модернизации Прежде чем выполнить перезагрузку, подумайте, все ли вы сделали. • Выполнили ли вы синхронизацию с самыми свежими исходными текстами? • Выполнили ли вы процесс buildworld? • Скомпилировали ли вы новое ядро? • Загрузилось ли новое ядро? • Выполнили ли вы процесс ins tall world? • Работают ли утилиты, такие как ps и top? • Выполнено ли объединение в каталоге /etc? Если вы можете ответить на все эти вопросы утвердительно, можно выполнить перезагрузку: • reboot Когда система вернется обратно в однопользовательский режим, проверьте еще раз работу утилит ps и top, просто для того, чтобы убедиться, что все было синхронизировано. Наконец, выполните команду uname -а, чтобы посмотреть, имеет ли ядро нужную вам версию: • uname -a FreeBSD stripes.example.com 6.О-RELEASE-pi FreeBSD 6.О-RELEASE-pi #1: ^>Wed Jan 4 21:39:53 PDT 2006 frank@example.com:/usr/src/sys/compile/CUSTOM i386 Если все подтверждается, примите поздравления! Только что вы завершили процесс make world. Теперь можно расслабиться — по крайней мере, до тех пор, пока в следующий раз вы не решите повторить эту операцию. 615
ГЛАВА 20 Добавление жестких дисков В этой главе... • Режимы доступа IDE/ATA • Диски SCSI • 1еометрия жесткого диска • Разбиение жесткого диска • Создание меток диска • Как сделать файловую систему доступной для использования • Повышение производительности диска с помощью RAID и Vinum
I ГТГ I Системное администрирование В этой главе будет раскрыт смысл того, что, несомненно, является одним из самых неприятных моментов при работе с системой UNIX: жесткие диски. Если провести сравнение с системой Windows (там система BIOS автоматически назначает диску номер) или с Macintosh (там новый диск просто появляется на рабочем столе), то выяснится, что система UNIX требует более глубокого понимания геометрии, разделов, режимов доступа и остальной эзотерики подобного рода. К сожалению, FreeBSD не является исключением. Как уже говорилось в главе 12, иерархическая структура файловой системы UNIX обеспечивает более гибкий способ работы с файлами, чем это возможно в традиционных настольных операционных системах. С другой стороны, эта гибкость достается дорогой ценой. Чтобы добавить новый диск в систему FreeBSD, его нужно сначала правильно установить физически, затем разбить на секции, разделы, разметить и смонтировать в выбранной точке монтирования. Для всего этого требуется больше усилий, чем для двух-трех шагов, необходимых для добавления нового диска в большинстве настольных систем. Времена меняются, и стандарты оборудования теперь позволяют не выполнять черновую работу с карандашом и бумагой, некогда сопутствующую установке нового диска. Обладая достоверными знаниями (и взяв в помощники надежного друга - Sysinstall), вы сможете подчинить себе весь остальной процесс. Режимы доступа IDE/ATA Самым распространенным типом жесткого диска для оборудования ПК является интерфейс IDE (Integrated Drive Electronics — встроенный интерфейс накопителей). Интерфейс IDE получил свое название благодаря микросхемам контроллера, управляющими диском и встроенными в сам диск, а не находящимся на отдельной плате хост-адаптера (подобно SCSI). Официальным названием этого типа интерфейса является Advance4 Technology Attachment (ATA — подключение к шине усовершенствованного интерфейса), а АТА и IDE часто используются как заменяющие друг друга. НА ЗАМЕТКУ Накопители на жестких дисках SATA (Serial ATA — последовательное подключение к шине усовершенствованного интерфейса) быстро берут верх над накопителями IDE/ATA и накопителями SCSI в высокопроизводительных серверных решениях. Накопители SATA обычно обрабатываются с помощью стандартного интерфейса ядра АТА в FreeBSD, и вы должны иметь возможность конфигурировать и обращаться к ним с помощью тех же способов, что и описанные в этой главе для накопителей АТА. Однако следует иметь в виду, что SATA по-прежнему является новой и развивающейся технологией, и ее поддержка в FreeBSD остается неполной и документированной только частично. Если у вас есть возможность выбора, используйте накопители АТА или SCSI, пока FreeBSD не усовершенствует поддержку интерфейса SATA. В этой главе обсуждаются две дисковые системы: IDE/ATA и SCSI. Впрочем, если вы не работаете на высокопроизводительном сервере, то вы, скорее всего, используете диски IDE. Это недорогие и широко используемые диски, которые, однако, характеризуются своими неприятностями и причудами. Диски SCSI сделаны лучше и работают быстрее, но, с другой стороны, они стоят дороже и требуют более дорогого оборудования. Тем не менее, независимо от того, используете ли вы IDE, эти
Добавление жестких дисков I ГТГ I Глава 20 I I вопросы стоит рассмотреть, чтобы вы могли их решить, когда в этом возникнет необходимость. IDE обеспечивает достаточно адекватную скорость работы и является внутренним стандартом всех материнских плат серии л86, присутствующих сегодня на рынке. Если вы собираете новый компьютер на новом оборудовании, то всякие мелочи, рассматриваемые в следующих нескольких разделах, вы можете пропустить. Однако если вы инсталлируете FreeBSD на старом оборудовании, то вам придется решиться на новые приобретения, учитывая более быстрые режимы доступа, поддерживаемые диском, материнской платой и FreeBSD. Грамотное решение по этому вопросу требует рассмотрения истории развития режимов доступа. Режимы РЮ Режимы программируемого ввода-вывода (Programmed I/O — РЮ) были первым стандартом передачи данных на оборудовании ПК с использованием интерфейса АТА. На сегодняшний день эти режимы существуют в качестве запасного варианта, поскольку РЮ является внутренней частью BIOS и не требует дополнительной поддержки со стороны операционной системы. Буквально каждая современная операционная система совершила переход к DMA и Ultra DMA. Если только вы не работаете с очень старым оборудованием, то изучать режимы РЮ вам не понадобится. РЮ работает в любом из пяти режимов, в которых скорость варьируется от 3.3 Мбайт/с до 16.7 Мбайт/с — теперь этого совершенно недостаточно для стандартов современного программного обеспечения. НА ЗАМЕТКУ Большинство современных материнских плат используют шину PCI для "общения" с их цепочками жестких дисков. Однако если вам приходится работать с действительно старой системой с шиной ISA, то лучшее, на что она будет способна, это поддержка РЮ Mode 2 — быстрее нельзя из-за ограничений на пропускную способность ISA. Режимы DMA Основная проблема РЮ состоит в том, что для передачи потока данных ему требуется очень много ресурсов процессора. Эта проблема была одной из самых главных причин, по которой предпочтение отдавалось дискам SCSI, поскольку диски SCSI используют независимый контроллер, который снимает нагрузку с процессора. Режимы DMA (Direct Memory Access — прямой доступ к памяти), разработанные в начале 90-х годов прошлого века, предлагают те же преимущества, что и диски IDE, разрешая диску миновать процессор и обращаться прямо к системной оперативной памяти. Чтобы организовать передачу данных с помощью DMA, необходимо специальное электронное оборудование в самом накопителе (особенно для дисков с DMA со стороны владельца шины, или DMA с "захватом шины"), а также поддержка операционной системы; тем не менее, в наши дни этот метод стал практически универсальным. В лучшие времена DMA вы могли мало о нем слышать; дело в том, что его скорости передачи данных были сравнимы со скоростями, получаемыми при использовании режимов РЮ. Хотя преимуществом дисков DMA было снятие нагрузки с процессо-
I ГГГ I Системное администрирование pa, оно было ослаблено из-за плохой поддержки режимов операционными системами эпохи Windows 95. PIO был встроенным режимом, поэтому со стороны производителей оказывалось небольшое давление с требованием отказаться от него. Режимы Ultra DMA (UDMA) С момента появления Ultra DMA режим PIO утратил свои позиции. Эти усовершенствованные режимы DMA теперь являются повсеместным промышленным стандартом, даже оставляя SCSI все удовольствия за его стоимость и производительность, являясь тем временем более дешевым и лучше поддерживаемым, даже на оборудовании низкого уровня. Ultra DMA сразу и существенно повысил скорость передачи данных по сравнению со стандартным DMA, увеличив передачу данных в два раза за счет использования обоих фронтов сигнала запрос/подтверждение (REQ/ACK). Эта технология, известная под названием двойной синхронизации при передаче данных, позволяет контроллеру задействовать удвоенную пропускную способность канала, до 33 Мбайт/с, не сокращая при этом свое время цикла. Последующие постепенные улучшения Ultra DMA, каждое из которых увеличивало скорость передачи до тех пор, пока не была достигнута кульминационная точка в Mode 6, составляющая 133.3 Мбайт/с, подняли планку еще выше благодаря новому стандарту кабелей IDE, в котором вместо 40 контактных штырьков, как в предыдущем стандарте, используется 80. Любое оборудование, изготовленное после 1998 года, предназначено для работы в режиме UDMA, поэтому вам не нужно ни о чем беспокоиться, если у вас имеются следующие четыре компонента. • Жесткий диск, поддерживающий режим Ultra DMA • Кабель IDE, насчитывающий 80 контактных штырьков. • Материнская плата (или контроллер IDE), поддерживающая режим Ultra DMA • Поддержка режима Ultra DMA операционной системой (или BIOS). Если у вас не окажется одного из этих элементов, ваша система сможет работать, но в режиме пониженной скорости, обычно в одном из режимов PIO, которые поддерживаются самой BIOS. Материнские платы или контроллеры, не поддерживающие UDMA, могут порождать проблемы. Сложности, связанные с нестабильностью работы и блокировками, вызванные проблемами контроллера, обычно можно решить или за счет модернизации BIOS (чтобы разрешить поддержку UDMA контроллером), или посредством запрета UDMA на самом диске с помощью программных утилит, поставляемых производителем диска. Эти утилиты обычно работают только в среде DOS или Windows и поставляются либо вместе с диском, либо загружаются с Web-сайта производителя. I НА ЗАМЕТКУ ¦ Поскбльку MS-DOS не будет доступна после инсталляции FreeBSD, вы можете использовать FreeDOS (http: //www. f reedos .org), бесплатный клон MS-DOS, чтобы запускать утилиты DOS. FreeBSD полностью поддерживает Ultra DMA, что делает ее, пожалуй, самым сильным звеном в этой цепочке; вы можете узнать, присутствуют ли все необходимые
Добавление жестких дисков компоненты, изучив сообщения, появляющиеся при зондировании оборудования во время загрузки системы (или с помощью dmesg после загрузки): adO: 238475MB <WDC WD2500JB-00KFA0 08.05J08> at ataO-master UDMA66 Если присутствие UDMA не обнаруживается, жесткий диск является новым, а все остальные компоненты компьютера — устаревшими, вам следует отыскать утилиту управления накопителем, поставляемую производителем диска, загрузить систему с дискеты с MS-DOS (или загрузочного диска FreeDOS) и воспользоваться утилитой, чтобы отключить UDMA на диске. Диск станет работать с меньшей скоростью, чем та, на которую он способен, но это будет к лучшему. В противном случае могут возникать блокировки и поломка диска. Ваша система отблагодарит вас за то, что вы не будете заставлять ее делать то, что ей не под силу. Диски SCSI Если у вас есть возможность не связываться со всей этой ерундой интерфейса IDE, или если вы будете подключать внешние диски к вашей системе, то наилучшей альтернативой будет SCSI (Small Computer System Interface — интерфейс малых вычислительных систем). Диски SCSI работают с рядом интерфейсов, которые по скорости варьируют* ся от самых первых и медленных (5 Мбайт/с) До современных версий, таких как Ultra320 SCSI, который способен без проблем передавать данные со скоростью 320 Мбайт/с. Несмотря на то что возвеличивающие соглашения об именовании для этих интерфейсов (Fast SCSI, Wide SCSI, Fast Wide SCSI, Wide Ultra SCSI и так далее) походят на пародию на самого себя, сам по себе интерфейс SCSI ведет себя относительно хорошо и является предсказуемым, когда речь заходит о его возможностях. Каждый последующий стандарт как минимум в два раза быстрее предыдущего, и хотя для устройств SCSI разработано поистине огромное количество различных стилей кабелей, стандарт соединителя остается неизменным вот уже несколько лет. Это означает, что, по большому счету, любой современный контроллер SCSI должен распознать — и соответствующим образом обработать — любое устройство SCSI, из- готовленное в соответствии с раннее принятым стандартом. Цепочка устройств SCSI может справляться с таким количеством устройств, которое определено стандартом, обычно 8 или 16. Это очень много по сравнению с жестко регламентированными четырьмя (первичный и вторичный, ведущий и ведомый) устройствами в структуре IDE/ATA. Более того, порядок подключения этих устройств не имеет значения; в SCSI Нет понятий "ведущий" и "ведомый", определяющих порядок подключения к кабелю. Есть только контроллер, или хост-адаптер (который берет один из идентификаторов устройств), а все остальное — устройства. При использовании внешних дисков тоже можно воспользоваться преимуществами SCSI. В интерфейсе IDE/ATA нет хорошего способа подключения внешнего диска к внутренней шине; в некоторых случаях выход из положения можно найти в использовании параллельного порта (порт принтера), как это сделано в накопителях Iomega Zip, однако этот интерфейс является чрезвычайно медленным и непригодным для каких-либо обычных целей. SCSI будет оставаться оптимальным вариантом для внешних дисков, пока в FreeBSD не будут полностью приняты интерфейсы USB 2.0 и FireWire (IEEE 1394). Ч
Системное администрирование НА ЗАМЕТКУ Внешние жесткие диски, подключаемые с помощью FireWire (IEEE 1394) или USB 2.0, обычно являются накопителями АТА, работающими через шину FireWire или USB. Разделы и режимы доступа для этих приводов остаются такими же, как и в приводах АТА. Тем не менее, чтобы иметь возможность обращаться к таким приводам, вам нужно применять устройства /dev/usb или /dev/f irewire. Просмотрите выходные данные утилиты dmesg, чтобы узнать правильное имя устройства для внешнего накопителя, подключенного посредством USB или FireWire. Самой большой проблемой дисков SCSI является их цена. Диски SCSI обычно стоят гораздо дороже, чем соразмерные им диски IDE, и разница в цене колеблем ся в пределах 50-100 процентов. Помимо этого, нужно добавить стоимость платы хост-адаптера, которую вам придется приобретать отдельно от материнской платы. (На сегодняшний день лишь малое количество материнских плат изготовляется со встроенными в них платами SCSI, хотя, надо признать, число таких плат постепенно растет.) Сами же эти контроллеры также не дешевые. Бели вас интересует вариант SCSI, вы должны иметь в виду, что вы столкнетесь с еще многими трудностями, рассмотрение которых выходит за рамки этой книги. Упомянем лишь терминаторы, SCSI BIOS, настройку идентификаторов устройств (с помощью перемычек), а также проблемы, возникающие при сочетании "узких" и "широких" устройств в одной цепочке. Подробное обсуждение этих вопросов можно найти во многих книгах, посвященных этой тематике, или на страницах Web-сайта PC Guide (http://www.pcguide.com). Геометрия жесткого диска В онлайновых справочных руководствах, объясняющих процесс подготовки дисков к работе, вы неоднократно будете встречать ссылку на "геометрию жесткого диска", а еще вы будете встречать этот термин каждый раз, когда будете запускать утилиту f disk (или более дружественные интерфейсы f disk, используемые в этой главе). К счастью, владельцы нового оборудования (то есть оборудования, изготовленного после того, как диски емкостью более 8 Гбайт стали привычными) или владельцы дисков SCSI могут пропустить или проигнорировать эту тему Данные о геометрии диска здесь приводятся исключительно с познавательной точки зрения. Функциональная важность этой информации больше не входит в сферу ответственности администраторов, а лежит на плечах оборудования. Однако одной из сильных сторон FreeBSD является то, что она будет работать с той же степенью эффективности даже на старом оборудовании, которое считается устаревшим для настольного использования или для запуска Windows. Ваша "старинная" материнская плата для процессора Pentium с частотой 166 МГц будет так же легко поддерживать FreeBSD. Однако в этом есть и свой подвох: если вы попытаетесь подключить новый жесткий диск IDE объемом 70 Гбайт, то система может не распознать его гигабайты, приняв его за 8-Гбайтный диск. Вот здесь и вступает в игру непривлекательная геометрия диска. Чтобы использовать диск, вам придется применять такие технологии, которые в противном случае станут устаревшими перед новой технологией BIOS, а еще вам нужно будет знать немного об истории развития жестких дисков.
Добавление жестких дисков Глава 20 623 Если вернуться в туманное прошлое, когда регистры запоминающих устройств были таким большими, насколько это могла позволить цена, независимо от последствий при расширении в будущем, то диски IDE указывали свой размер в виде функции их физической геометрии. Четыре размерности — головки, цилиндры, секторы и байты — характеризовали компоновку диска и, таким образом, его размер, или количество данных, которые он способен хранить (рис. 20Л). Жесткие диски до сих пор имеют ту же внутреннюю геометрию, что и всегда; просто сейчас уже не так важно понимать ее досконально, как это требовалось раньше. Цилиндр **. Дорожка ^ (поверхность цилиндра) Сектор- Рис. 20Л. Геометрия жесткого диска Диск изготовлен из нескольких пластин, нанизанных на центральный шпиндель; данные хранятся на обеих сторонах каждой пластины, а чтение данных производится с помощью одной или более магнитных головок. Так, например, диск с четырьмя пластинами и двумя головками с каждой стороны пластины имеет 16 головок. Каждая пластина разбивается на концентрические окружности, или цилиндры (в оптических дисках, таких как компакт-диски» вместо окружностей тянется спираль), а комбинация цилиндра и головки, считывающей его, называется дорожкой (поверхностью цилиндра). В свою очередь, дорожки разбиваются на секторы (обычно на 64, из которых используется 63 сектора), а в каждом секторе хранится некоторое количество байтов (как правило, 512). На внешней части корпуса каждого диска можно найти метку, в которой указывается информация о том, сколько каждой из этих конструкций имеется на диске. Вы можете вычислить общий размер диска, умножив все их вместе. Диск, использованный в качестве демонстрации работы утилиты fdisk в главе 12, имел следующую информацию: # fdisk /dev/adl ******* Working on device /dev/adl ******* ******* Работает в устройстве /dev/adl ******* parameters extracted from in-core disklabel are: параметры, взятые из внутренней метки диска: cylinders=1247 heads=255 sectors/track=63 (16065 blks/cyl) цилиндров=124 7 головок=255 секторов /дорожку=63 (16065 блоков/цилиндр) Media sector size is 512 Размер сектора носителя составляет 512 Если перемножить все эти цифры (игнорируя цифру, соответствующую количеству блоков в одном цилиндре), и учесть, что поверхность цилиндра эквивалентна дорожке (чтобы сохранить чистоту ваших единиц измерения), получится следующий результат:
I ГГТ I Системное администрирование 1 6 I Часть IV 1247 цилиндров * 255 головок х 63 сектора в одной дорожке * х 512 байтов в одном секторе =10.2 Гбайт Постойте, постойте... как 255 головок? Как такое количество головок может уместиться в жестком диске? Нужно ли понимать буквально это количество? Нет. Во- первых, мы предполагали, что количество головок должно быть, по крайней мере, четным числом. Даже если бы мы согласились с этим, то мы бы говорили тогда о 64 пластинах, что просто невозможно для жесткого диска, высота которого составляет менее 2 сантиметров. Здесь мы имеем дело с виртуальной геометрией диска, ставшей возможной благодаря двум новшествам, последовательно введенным производителями жестких дисков, которые позволили избавиться от ограничений на размер регистра, продиктованных первоначальным дизайном интерфейса диска в BIOS. Этими новшествами являются режимы LBA и режимы Extended INT13. LBA и ограничение в 528 Мбайт Во времена дискет никто не мог представить себе, что кому-то когда-то удастся использовать диск колоссального объема в 528 Мбайт; именно по этой причине это число было принято в качестве ограничения на размер, полученное при подсчете битов первой PC BIOS (в паре со стандартом ATA/IDE), выделяемых для каждой размерности геометрии диска, как показано в табл. 20.1. Таблица 20.1. Размерные ограничения для геометрии жесткого диска Измерение Цилиндры Головки Секторы/дорожки Битовый размер 10 бит 8 бит 6 бит Максимальное значение 2А10»1024 2А8 = 256 2А6-1 * 63 Таким образом, диск мог иметь до 256 головок, но не больше 1024 цилиндров. Поскольку количество байтов в одном секторе и количество секторов в одной дорожке являются относительно фиксированными значениями (в зависимости от физических ограничений, таких как скорость вращения и надежность чтения), и так как вы можете добавить всего несколько пластин и головок в накопитель, то это означает, что количество цилиндров тут же оказывается ограничивающим фактором в предельном размере диска. Производители дисков со временем сошлись на стандарте АТА, определяющем 16 физических головок в диске, что означало ограничение размера в 528 Мбайт. Производители могли выпускать диски большего размера, добавляя цилиндры — что было легко, поскольку можно очень точно управлять шаговым двигателем, перемещающим рычаги блока головок между цилиндрами — однако BIOS не может справиться с любым из цилиндров сверх 1023. Примерно в 1993 году стало понятно, что так дальше дело не пойдет, поскольку потребность пользователей в увеличении дискового пространства становилась все более и более ощутимой. Все это пространство могла занять одна игра! Поэтому про изводители BIOS придумали схему, называемую LBA (Logical Block Addressing - ло- гическая адресация блоков), которая должна была расширить адресацию диска си стемой BIOS путем преобразования цилиндров сверх 1024 в "виртуальные головки" Это позволяло получить преимущество от всех доступных номеров головок вплоть до 255, которые оставались неиспользованными. Например, диск, имеющий 1825 ци
Добавление жестких дисков линдров и всего 16 головок на самом деле можно считать диском с 463 цилиндрами и 64 головками. Расчетный размер диска остался неизменным» а значения цилиндров и головок определялись ограничениями, накладываемыми BIOS. И снова все стало на свои места, но только на время. Режимы Extended INT13 и ограничение в 8,4 Гбайт Внимательный читатель заметит, что эту схему можно рассматривать только как временное решение, поскольку со временем LBA исчерпает свои возможности, если будут задействованы все цилиндры и головки — размер диска составит около 8,4 Гбайт. Действительно, прошло немного времени — еще четыре года или около того — как диски преодолели барьер в 8,4 Гбайт. (Следует также отметить, что этот барьер был чисто теоретическим; многие реализации BIOS и поддерживающие программные инструменты использовали псевдо-ЬВА-процедуры, которые вводили барьеры с меньшими значениями.) В качестве решения выступил новый переработанный интерфейс BIOS, обычно называемый Extended INT13, который сейчас широко используется при изготовлении современного оборудования и написании операционных систем, таких как Windows (там программы до сих пор обращаются к диску через BIOS, чего не нужно делать системе FreeBSD). Этот новый интерфейс абстрагировал адресацию геометрии диска благодаря 16-байтовому пакету адресации диска, который устранил любое ограничение на размер, предъявляемое новым оборудованием. Если ваше оборудование является современным и может понимать режимы Extended INT13, то никаких проблем у вас не возникнет — геометрия диЖа будет интересовать вас разве что с точки зрения любознательности. Если вы используете инструмент для извлечения информации о геометрии диска, размер которого больше 8,4 Гбайт, то он сообщит вам о 16383 цилиндрах, 16 головках и 63 секторах на одну дорожку — это "кодовая" конфигурация, сообщающая операционной системе, что ей даже не нужно пытаться вычислять размер диска на основе геометрии. Если вы увидите где-нибудь эту конфигурацию, то будьте уверены, что FreeBSD сама позаботится об этой "геометрической" бессмыслице. То есть, если только размер вашего диска не превышает 137 Гбайт, при которых даже режимы Extended INT13 не могут преодолеть ограничение, предъявляемое стандартом АТА в 65536 цилиндров. 48-битная LBA Микросхемы BIOS на современных материнских платах поддерживают новую схему, которая называется 48-битная LBA — это последний шаг в продолжающейся борьбе с ограничениями на размеры жестких дисков. До появления 48-битной LBA интерфейс АТА имел только 28 бит, с помощью которых осуществлялась адресация ячеек памяти в накопителе, который обладал практически максимальным размером диска — 137 Гбайт. Однако при 48 битах количество адресуемых цилиндров больше не ограничивалось числом 65536, и системы BIOS теперь могут адресовать вплоть до 144 петабайт (150 994 994 Гбайт). Будем"надеяться, что пока что нам этого хватит.
626 Системное администрирование Часть IV Практические последствия установки FreeBSD в старых системах Если вы инсталлируете FreeBSD на старом оборудовании, например, на материнской плате времен LBA, то вы можете подпасть под одно из этих ограничений. Вы не потеряете никаких данных, однако можете встретить необычные проблемы, например, когда ваш диск размером 70 Гбайт будет распознаваться как диск размером 8,4 Гбайт. Если это произойдет, то вам будет понятна причина. Многие производители материнских плат и микросхем предлагают модернизированные версии BIOS, которые могут помочь вам избавиться от этих проблем. Узнайте у изгбтовителя материнской платы или микросхемы (зайдите на их Web-сайт), было ли выпущено обновление встроенных программ. Если нет, то у вас может не быть другого выхода, как приобрести новую материнскую плату и процессор, или использовать множество дисков малой емкости вместо одного большого. Если вам понадобится модернизировать существующую BIOS с помощью утилиты DOS, на помощь вам придет FreeDOS (http: / /www. f reedos. org). Естественно, если вы выберете накопители SCSI или FireWire (IEEE 1394) (и если ваше оборудование не является устаревшим и может поддерживать их), то ни одна из этих необходимостей не затронет вас. Эти интерфейсы были разработаны с расчетом на гораздо большее расширение, чем IDE/ATA, поэтому более высокая стоимость этих интерфейсов оправдывается предсказуемостью их поведения. Разбиение жесткого диска Итак, ознакомительный курс мы прошли, теперь настал черед переходить к действиям. Добавление нового диска в систему включает четыре этапа: установка, разбиение, разметка и монтирование. В зависимости от типа диска — SCSI или IDE — будет изменяться процедура установки; следуйте ийструкциям по установке, прилагаемым к диску. В следующих примерах предполагается, что вы установили новый диск 80 Гбайт в качестве первичного ведомого. Именем устройства является /dev/adl. (В главе 12 рассказывается о структуре файловой системы FreeBSD, именах устройств и точках монтирования. Диском SCSI в подобной конфигурации будет /dev/dal; остальные инструкции здесь применяются точно так же.) Как вы уже знаете, диск идентифицируется не только обычным именем дискового устройства; расширения, следующие за первоначальным adl, определяют дополнительную информацию о разбиении и подразбиении. Благодаря им вы можете обращаться к различным частям диска, которые вы отвели для различных нужд — либо для того, чтобы вы могли загружать несколько операционных систем из одного и того же диска, либо для того, чтобы вы могли хранить отдельно различные части вашей системы, чтобы они не занимали пространство памяти друг у друга. Разделы BIOS (секции) Каждая операционная система позволяет разбить ваш диск. Однако в отношении FreeBSD следует помнить, что эта система позволяет выполнять не один, а два уровня разбиения. Первыми идут разделы BIOS, адресуемые непосредственно сие-
Добавление жестких дисков Глава 20 627 темой BIOS в оборудовании ПК; у вас может быть четыре таких порции, с которыми операционная система работает как с "разделами*. Если вы разбиваете ваш диск Windows, MS-DOS или Linux, то каждый раздел будет представлен одним из этих разделов BIOS. Для этих разделов BIOS операционная система FreeBSD использует термин секции (slice) — запомните его, это очень важно. Когда FreeBSD ссылается на раздели (partition), это имеет отношение ко второму уровню разбиения, которое выполняется внутри секций. Второй уровень содержит то, что называется разделами BSD (BSD partition^. Разделы BSD Эти разделы BSD являются подразделами, которые разделяют разные части системы FreeBSD друг от друга — /var, /usr, /home и тому подобные. В качестве имени каждого раздела выделяется одна буква; всего же доступно восемь разделов BSD, перечисленных в табл. 20.2. Когда вы разбиваете секцию на разделы BSD, то первые несколько букв резервируются для специального использования, а оставшиеся буквы (обозначенные для общего использования) вы можете свободно использовать в системе. Таблица 20.2. Разделы BSD и их назначение Раздел Назначение а Корневой раздел (/). Ь Подкачка. с Адресует всю секцию или весь диск в режиме "dangerously dedicated" (опасное выделение). 4 Общее использование. е Общее использование. f Общее использование. Я Общее использование. h Общее использование. На рис. 20.2 показано полностью определенное имя устройства. Первая часть (adl) определяет базовое имя устройства. Диски IDE/ATA могут быть индексированы от ad0 до ad3 (первичный ведущий, первичный ведомый, вторичный ведущий, вторичный ведомый). За ней следует имя секции, чьи номера начинаются с единицы (si). И, наконец, ставится имя раздела BSD (e). АТА-устройство 1 Секция 1 Раздел BSD e inn /dev/adlsle Рис. 20.2. Структура имени дискового устройства
Системное администрирование Внешние расширенные разделы Некоторые другие операционные системы формируют разделы, аналогичные FreeBSD; например, расширенные раздел** DOS (Extended DOS Partitions) обеспечивают способ получения подразделов (логических разделов) на компьютере, работающем под управлением DOS/Windows. В Linux используется функционально идентичный способ. Расширенные разделы DOS работают путем создания дополнительных разделов вне первых четырех, а не иерархически внутри четырех первичных разделов. Этот прием во многих отношениях является гораздо более неудобным, чем решение в FreeBSD. Взаимодействие между различными операционными системами может быть довольно сложным, поскольку разделы в схеме расширенных разделов DOS обрабатываются системой FreeBSD как дополнительные секции на том же уровне, что и обычные разделы DOS, хотя начинаются они с секции 5 (после четырех обычных разделов DOS). Чтобы смонтировать второй логический раздел внутри расширенного раздела DOS на диске ad3, вы можете адресоваться на /dev/ad3s6, вместо того чтобы использовать имена разделов в стиле DOS внутри секции. Обходной маневр будет еще более сложным. Вполне вероятно, что вы не сможете смонтировать диск FreeBSD в системе DOS/Windows, однако вам может понадобиться сделать нечто подобное, что и на Linux-компьютере. Linux работает со своими разделами (в FreeBSD они называются секциями) точно так же, как и FreeBSD. Это означает, что они маркируются цифрами последовательно, а не иерархически. Чтобы смонтировать секцию FreeBSD в Linux, используйте табл. 20.3 (в ней описывается первичный ведомый диск с операционной системой FreeBSD в его третьем разделе/секции BIOS) в качестве справочного руководства. Таблица 20.3. Эквивалентность меток дисков в Linux и FreeBSD Метка в Linux /dev/hdb4 /dev/hdb5 /dev/hdb6 /dev/hdb7 Метка в FreeBSD /dev/adls3a /dev/adle3b /dev/adls3e /dev/adls3f Схема отображения будет работать надежно, если у вас нет больше никаких разделов Linux после секции FreBSD! Всегда помните о том, что превращение иерархической структуры в последовательную является очень опасным. Редактор секций (f disk) в программе Sysinstall Первым шагом в установке нового диска является использование редактора секций, f disk, который позволяет определить секции на диске. Чтобы использовать программу f disk, будучи суперпользователем, войдите в программу Sysinstall и выберите Configure (Конфигурировать). Найдите вариант Fdisk, обозначенный как The Disk Slice (PC-Style Partition) Editor (Редактор секций (разделов в стиле ПК) диска). Выбрав эту опцию, вы получите список всех дисков, которые обнаружит система. Убедитесь в том, что в этом списке присутствует adl (первичный ведомый, ваш новый диск). Если его там нет, то это будет означать, что диск был установлен неправильно.
Добавление жестких дисков Глава 20 СОВЕТ Если fdisk не обнаруживает установленный диск, откройте файл /var/run/dmesg.boot, чтобы посмотреть, был ли вообще обнаружен диск во время загрузки системы; если диск не был обнаружен, проверьте состояние кабелей и перемычек на диске. Помните о том, что если до установки нового диска у вас был только один диск в ведущей цепи IDE, то, возможно, его перемычки были установлены в положение Single (одиночный); убедитесь в том, что на ведущем диске перемычки установлены в положение Master (Ведущий), а на новом диске — Slave (Ведомый). Если ваш диск присутствует в списке, выделите его, нажав клавишу пробела, и откройте визуальный редактор fdisk ("fixed disk" — несъемный диск). Эта утилита существует в том или ином виде в каждой операционной системе, поскольку каждая операционная система, построенная на оборудовании ПК, должна иметь способ управления разделами BIOS (секциями). Вы можете запускать утилиту fdisk непосредственно из командной строки, однако, учитывая множество ее опций и потенциальных ловушек, приходится сделать вывод, что лучше всего использовать простой интерфейс fdisk в программе SysinstalL Согласитесь с тем, что разумнее работать с инструментами для переформатирования и повторной разбивки диска! В меню fdisk будут присутствовать любые уже существующие разделы. Для нового, неформатированного диска будет показан пустой список секций. С этими секциями вы можете поступить как угодно. При необходимости, в этом меню вы можете сделать все, что связано с работой с секциями, настраивая разделы BIOS для других операционных систем или даже для FreeBSD в стиле Linux или DOS. Однако в большинстве случаев этого делать не нужно. В общем случае, вам нужно нажать клавишу <А> для выбора варианта Use Entire Disk (Использовать весь диск), чтобы получить результаты, показанные на рис. 20.3. Не стоит беспокоиться о каких-то других опциях — они предназначены для гибкости и совместимости. На этом этапе процесса у вас есть три пункта: небольшое "зарезервированное" пространство для установки диспетчера загрузки, одна большая секция FreeBSD (adlsl) и третий "неиспользованный" незначительный кусок пространства, которое не может быть частью основной секции. Рис. 20.3. Редактор секций после выбора опции Use Entire Disk (Использовать весь диск) (
Системное администрирование С самим диском мы пока еще ничего не сделали. Нажмите клавишу <Q>, чтобы выйти из редактора секций. Теперь вам будет предложено выбрать диспетчер загрузки, который необходимо установить. Если это вторичный диск, который вы добавляете к уже работающей системе, выберите None (Нет). Инсталлируйте диспетчер загрузки FreeBSD Boot Manager (BootMgr), если вы будете загружаться с этого диска (например, если вы готовите этот диск для использования на новой машине) или чтобы заменить существующий диск в текущей системе. В противном случае выберите Standard (Стандартный), чтобы получить эквивалентную команду DOS fdisk /MBR, которая удаляет диспетчеры загрузки, специфические для операционной системы (например, LILO для Linux и BootMgr для FreeBSD) из главной загрузочной записи (Master Boot Record) и делает его доступным для других операционных систем (например, если вы повторно используете диск для того, чтобы подготовить к работе новую Windows-машину). ВНИМАНИЕ! Редактор секций имеет опцию Write Changes (Записать изменения) — команду w. Она используется перед закрытием Slice Editor, если, и только если, вы модифицируете существующие настройки диска. Если вы устанавливаете FreeBSD впервые, или если вы подготавливаете новый диск для установки, просто закройте Slice Editor и откройте Disk Label Editor (Редактор меток дисков). Если вы будете использовать его, опция w повторно выдаст это предупреждение. Создание меток диска Диск разбит на секции и стал дружественным для FreeBSD, но он еще не отформатирован — пока что его нельзя использовать в системе. Сейчас этим мы и займемся с помощью редактора Disk Label Editor (Редактор меток дисков). В программе Sysinstall выберите Label ("The Disk Label Editor"). Вам снова будет предложено выбрать диск из списка установленных дисков; выделите adl с помощью клавиши пробела. На экране появится окно Disk Label Editor — визуальный интерфейс команды disklabel командной строки. В нем вы сможете назначить разделы BSD и отформатировать диск. ВНИМАНИЕ! Редактор Disk Label Editor системы FreeBSD не позволяет изменять размеры разделов BSD. Раздел нельзя модифицировать без переформатирования и потери его данных, a FIPS (см. главу 3) не может работать с разделами BSD, поэтому перед тем как приступать к изменениям, следует внимательно разобраться с тем, какие разделы вы будете использовать. Создание полной компоновки разделов FreeBSD Если вы просто добавляете новый диск в систему, перейдите к разделу "Добавление нового диска". А в этом разделе главы будет рассказано о том, как редактор Disk Label Editor используется для назначения разделов BSD и точек монтирования во всей системе FreeBSD, включая корневой раздел, разделы /usr и /var и раздел подкачки. Это полезно делать в том случае, если вы собираетесь устанавливать FreeBSD
Добавление жестких дисков Глава 20 631 на новый диск (например, если вы заменяете ваш имеющийся диск диском большей емкости). Нажмите клавишу <А>, чтобы применить настройки Auto Defaults (Автоматические настройки по умолчанию). Этим вы автоматически распределите набор разделов, подходящих для большинства систем, выбирая размеры для различных разделов, соответствующие размеру диска и объему оперативной памяти, установленной в вашей системе (рис. 20.4). Вы можете даже использовать настройки по умолчанию, если планируете применять FreeBSD-систему в качестве рабочей станции или небольшого сервера, который будет обслуживать всего несколько пользователей. ¦Ш1—«И Part Mount Stze Newfs Part Itount amrdesla / 512MB UFS2 V anrdeslb swap 4078MB SWAP amrd0sld /var 3063MB UFS2+S V anrdesle Пщ> 512MB UFS2+S Y <Mrd0slf /usr 61710MB UFS2+S V The following cownands are valid here (upper or lower С ¦ Create D ¦ Delete П ¦ fount pt. N * Newfs Opts Q . Finish S • Toggle SoftUpdates T - Toggle Newfs U . Undo A - Auto Defaults Use Fl or 7 to get «ore help, arrow keys to select. 1 Size Newfs case): W - Write Z - Custom Newfs R - Delete+Merge Puc. 20А. Редактор Disk Label Editor, после использования опции Auto Defaults (Автоматические настройки по умолчанию) Однако эти настройки по умолчанию зачастую будут непригодными для высокопроизводительного сервера. Почтовые и журнальные файлы хранятся в разделе /var; если вы обслуживаете 100 пользователей, и каждый из них хранит свою почту на сервере, или если ваш Web-сервер каждую неделю генерирует сотни мегабайтов журнальных файлов, то размер раздела /var, выбранный по умолчанию, может оказаться неподходящим (хотя современные версии FreeBSD создают разделы /var, размер которых превышает 1 Гбайт и более, если позволяет пространство на диске). Не исключено, что вам придется добавить в раздел /var некоторый дополнительный объем npocTpanfcTBa; это даст вам превосходный повод поэкспериментировать с работой редактора Disk Label Editor. Для начала удалите разделы /var и /usг. (Помните, что с самим диском ничего не будет выполняться, пока вы не нажмете <W> для записи изменений; сейчас вы просто настраиваете конфигурацию для этой записи.) Удалите эти два раздела, выбирая каждый из них и нажимая клавишу <D>. Теперь перейдите в самый верх экрана, где поле Free: показывает все открытое вами пространство после удаления этих двух разделов. Сейчас вы можете перераспределить это пространство так, как вам это будет необходимо. Оставив полосу выбора в строке Partition name: adlsl, нажмите клавишу <С>, чтобы создать новый раздел. Вам будет предложено в форме диалога указать, сколько пространства вы хотите выделить для нового раздела. Давайте остановимся на 2 Гбайт — этого будет достаточно для сервера среднего размера. (Чтобы полностью
632 Системное администрирование Часть IV перестраховаться, можно выделить еще больше памяти.) Для этого нужно удалить отображаемое число и ввести 5д или 5120т. В следующем диалоге выберите FS, чтобы создать файловую систему, а не раздел подкачки. Затем вам будет предложено указать точку монтирования для нового раздела — введите /var. Раздел будет создан и добавлен в список, а пространство Free:, указанное вверху, будет соответствующим образом обновлено. Теперь можно повторить этот процесс, но на этот раз принимая размер по умолчанию для оставшегося раздела (чтобы использовать оставшееся пространство на диске) и введя /usr для точки монтирования. (Возможно, вам придется немного уменьшить предложенное число, прежде чем принимать его.) Результирующий список будет таким, как показано на рис. 20.5. omrdesla / amrd6slb swap cmrdBsle /tnp amrdesld /var 512MB UFS2 Y 4078M6 SWAP 512MB UFS2+S Y 5120MB UFS2+3 Y 5Б7471© UFS2*S Y The following commnds are valid here (upper or lower case): С » Create D - Delete П - Mount pt. V . Write N • Newfs Opts Q * Finish S - Toggle SoftUpdates 1 = Custo* Newfs T - Toggle Newfs U - Undo A « Auto Defaults R - DetetetMeige Use Fl or "> to get tore help, arrow keys to select. I Puc. 203. Специальная компоновка раздела Обратите внимание на то, что при стандартной компоновке в разделах /var, /tmp и /usr включена система защиты целостности данных Soft Updates (система Soft Updates рассматривается в главе 12, в разделе "Ведение журналов файловых систем и Soft Updates"). Файловая система с включенной системой Soft Updates обозначается комбинацией UFS+S; с помощью ключа S вы можете включать и отключать эту настройку. Soft Updates рекомендуется для тех файловых систем, в которых данные изменяются часто; таким образом, /var и /usr являются подходящими кандидатами для этого. Добавление нового диска Вы можете создать до восьми разделов BSD на новом диске. Не используйте опцию, соответствующую клавише <А>, если вы просто создаете дополнительное пространство для вашей нынешней системы; наоборот, чтобы создать новый раздел, выделите строку Partition name: adlsl и нажмите клавишу <С>. Если вы хотите создать на диске один большой раздел (например, добавить все 80 Гбайт в каталог /home), примите значение по умолчанию для размера раздела — всю доступную ем кость секции, в которой вы находитесь. Как вариант, вы можете определить размер (например, 20 Гбайт) для одного раздела, а остальное пространство отвести под другой раздел. Вы можете распоряжаться пространством так, как вам будет необходимо.
Добавление жестких дисков Когда вам будет предложено, выберите FS, чтобы создать файловую систему вместо пространства подкачки, а затем определите точку монтирования. В системах FreeBSD 5.0 и последующих версиях автоматически монтируется новая файловая система в указанной вами точке монтирования. Это означает, что нужно тщательно выбирать точку для монтирования, чтобы можно было создать правильную запись в /etc/fstab и аккуратно смонтировать диск после завершения процесса разметки диска. НА ЗАМЕТКУ До выхода версии FreeBSD 5.0, все, что вы вводили в качестве точки монтирования, не играло практически никакой роли при добавлении новых дисков в систему; вы можете указать вообще что-то отвлеченное, например, /blah. Точка монтирования определяет только то, что будет записано в /etc/f stab для новой файловой системы, которая будет связана с этим разделом; в ранних версиях FreeBSD такого не было, за исключением тех случаев, когда вы впервые инсталлировали систему. Вы можете продолжать создавать разделы до тех пор, пока не будет израсходовано все свободное пространство. Удалите раздел, выбрав его и нажав клавишу <D>. Помните, что сам диск не будет затронут ни одной из этих операций; никакие изменения не будут записаны до тех пор, пока вы не нажмете клавишу <W>. НА ЗАМЕТКУ В связи с существующим ограничением, вы можете создать только четыре рабочих раздела BSD в редакторе Disk Label Editor. Если вы создадите больше четырех разделов, то будут использоваться "зарезервированные" имена разделов, начинающиеся с а и Ь; литера с будет пропущена, поскольку она имеет зарезервированное назначение. Однако вслед за d будет применяться "фиктивная" метка х, и вы не сможете использовать раздел должным образом. Запись изменений и форматирование диска Форматирование диска в FreeBSD выполняется с помощью команды newf s — еще одна утилита командной строки, которая обрабатывается автоматически внешним интерфейсом в программе Sysinstall. Каждая файловая система в списке, напротив которой в столбце Newf s стоит значение Y, будет отформатирована после того, как вы зафиксируете изменения. Этот параметр можно включать и отключать с помощью клавиши <Тх Посмотрите внимательно на метки разделов, которые присваивает редактор. Они перечислены в столбце Part слева; вы заметите, что независимо от настройки разделов, разделы от а до d будут зарезервированы для специального использования. Первым разделом, который вы можете создать сами, является раздел е. Это означает, что ваши новые монтируемые разделы, если вы добавляете пространство в существующую систему, будут называться adlsle, adlslf и так далее. При монтировании файловых систем нужно помнить об этих метках. Когда вы успешно закончите работу по компоновке разделов, нажмите <W>, чтобы записать изменения. Диск будет разбит на разделы, а процессы newf s займутся форматированием каждого указанного вами раздела. После того как разбиение на разделы будет завершено, нажмите клавишу <Q>, чтобы выйти, а затем закройте про- фамму Sysinstall.
I ГГТ I Системное администрирование I I Часть IV '¦ Как сделать файловую систему доступной для использования Вы сделали практически все. Осталось лишь смонтировать созданные вами новые файловые системы. СОВЕТ Если Sysinstall не вносит автоматически запись в файл /etc/f stab для новых добавленных файловых систем, вы можете настроить файл /etc/f stab самостоятельно, чтобы файловые системы монтировались автоматически во время загрузки (полное обсуждение команды mount и применение файла /etc/f stab можно найти в главе 12, в разделе "Файл /etc/f stab"). Однако в этой главе мы имеем дело с самым простым из возможных случаев - новые, чистые разделы, отформатированные для FreeBSD. Команду mount можно использовать самым простым способом. Создайте каталог, который будет выступать в качестве точки монтирования (например, /mnt/newdisk). Вы можете сделать это в любом месте файловой системы. Затем выполните команду mount: # mount /dev/adlsle /mnt/newdisk С помощью команды df вы можете удостовериться в том, что диск монтируется. То же самое вы можете проделать с каждым созданным вами разделом, помещая разделы в различные точки в файловой системе. Для размонтирования файловой системы служит команда unmount: # umount /mnt/newdisk Поздравляем! Вы освоили управление диском в FreeBSD! Повышение производительности диска с помощью RAID и Vinum Vinum представляет собой программный инструмент RAID, встроенный в FreeBSD и поддерживаемый модулем ядра (geom_vinum.ko). Он позволяет повышать эффективность работы ваших дисков АТА или SCSI (если у вас несколько дисков), преобразовывая их интерфейсы блочных устройств в виртуальный набор "синтетических" накопителей (или томов — volume), которые могут состоять из сплетений (plex), заключающих в себе каждое адресное пространство тома. Сплетение позволяет инструменту Vinum автоматически преобразовывать ваши данные в такие образования, как RAID-1 (зеркальное копирование, увеличивающее надежность), RAID-0 (чередование процессов записи и чтения, повышающее производительность) и RAID-5 (гибрид зеркального копирования и чередования) из томов, созданных из ваших исходных жестких дисков. Настройка Vinum представляет собой процедуру, включающую множество ручных вычислений, проводимых на нескольких сложных этапах, и требует глубокого понимания архитектуры логических дисков и ознакомления с теми областями FreeBSD, которые являются малопонятными и потенциально опасными. Опытным пользова-
Добавление жестких дисков Глава 20 635 телям, заинтересованным в получении максимальной производительности их дисков (особенно в серверных приложениях с высокой готовностью), будет достаточно хотя бы рассмотреть использование Vinum; новичкам этот вопрос придется отложить на неопределенное время. ВНИМАНИЕ! Разрешение работы Vinum означает также полную "чистку" ваших дисков и их переформатирование. Нельзя разрешить работу Vinum, не стерев все ваши данные и впоследствии не восстановив их из резервной копии. Если в вашей системе нет возможности стереть диск и собрать заново дисковую систему "с нуля", то Vinum вряд ли вам чем-нибудь поможет. Чтобы начать работу Vinum, необходимо перезагрузить компьютер в однопользовательском режиме (выбрав соответствующую опцию в меню загрузчика). Смонтируйте корневой раздел для чтения и записи с помощью команды mount -u /, и вы сможете продолжить работу далее. Первым шагом в настройке Vinum является определение точных размеров ваших дисков. Для этой цели нужно воспользоваться командой fdisk (замените daO на adO, если имеете дело с дисками SCSI): # fdisk adO ******* Working on device /dev/adO ******* parameters extracted from in-core disklabel are: cylinders=8908 heads=255 sectors/track=63 (16065 blks/cyl) Figures below won't work with BIOS for partitions not in cyl 1 parameters to be used for BIOS calculations are: cylinders=8908 heads=255 sectors/track=63 (16065 blks/cyl) Media sector size is 512 Warning: BIOS sector numbering starts with sector 1 Information from DOS bootblock is: The data for partition 1 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 63, size 143106957 (69876 Meg), flag 80 (active) beg: cyl 0/ head 1/ sector 1; end: cyl 1023/ head 254/ sector 63 The data for partition 2 is J <UNUSED> The data for partition 3 is: <UNUSED> The data for partition 4 is: <UNUSED> ******* работа с устройством /dev/adO ******* параметры, извлеченные из внутриядерной метки диска: цилиндров * 8908 головок - 255 секторов в дорожке = 63 (16065 блоков в цилиндре) Цифры внизу не будут работать с BIOS для разделов, не находящихся в цилиндре 1 параметры, используемые для вычислений BIOS: цилиндров = 8908 головок = 255 секторов в дорожке - 63 (16065 блоков в цилиндре)
636 Системное администрирование Часть IV Размер сектора носителя составляет 512 Предупреждение: нумерация секторов в BIOS начинается с сектора 1 Информация из блоков загрузки DOS: Данные для раздела 1: sysid 165 (0ха5) , (FreeBSD/NetBSD/386BSD) начало 63, размер 143106957 (69876 Мбайт) , флаг 80 (активный) начало: цилиндр 0/ головка 1/ сектор 1; конец: цилиндр 1023/ головка 254/ сектор 63 Данные для раздела 2: <Не используется> Данные для раздела 3: <Не используется> Данные для раздела 4: <Не используется> Как можно видеть в средней части вывода f disk, диск adO имеет емкость 69876 Мбайт. Это важно запомнить. Повторите эту команду для всех дисков (adl, ad3 и так далее) и запишите где-нибудь их емкость. Теперь нужно преобразовать диски в тип файловой системы Vinum. Сюда входит изменение форматов их разделов и создание новых файловых систем, что приведет к удалению всех существующих данных. Не забудьте создать на этом этапе резервную копию ваших важных данных, и убедитесь в том, что вы можете восстановить их без потерь! Технологии создания резервных копий будут рассмотрены в следующей главе. Используйте команду -е, чтобы войти в сеанс редактирования (с помощью редактора vi или любого другого редактора, заданного в переменной EDITOR оболочки), в котором вы сможете модифицировать компоновку разделов первичной секции вашего диска: # bsdlabel -e adOsl # /dev/adOsl: 8 partitions: # size a: 1048576 b: 8336656 c: 143106957 d: 6264832 e: 2097152 f: 125359741 offset 0 1048576 0 9385232 15650064 17747216 fstype 4.2BSD swap unused 4.2BSD 4.2BSD 4.2BSD [fsize 2048 0 2048 2048 2048 bsize 16384 0 16384 16384 16384 bps/cpg] 8 # "неформатированная" # часть, не редактируйте 28552 28552 28552 Обратите внимание на размер раздела с. Это псевдораздел, размер которого равен сумме всех остальных разделов на диске. (Помните, что все размеры, с которыми вы будете работать здесь, определяются 512-байтными блоками.) Вам нужно добавить другой раздел (h), который займет практически все оставшееся место на диске, и который будет иметь тип vinum, а не 4 . 2BSD. Это позволит сосуществовать двум разделам, перекрывая друг друга. Размер раздела h должен иметь размер раздела с минус 16 блоков, который в данном случае может составить 143106941. Добавьте эту строку в конец конфигурации: h: 143106941 16 vinum
Добавление жестких дисков Глава 20 637 Кроме того, измените раздел Ь, как показано ниже, сократив размер раздела подкачки на 218 секторов, и изменив смещение, с которого он будет начинаться, чтобы раздел не перекрывал своих соседей на момент начала работы Vinum: Ь: 8336375 1048857 swap Наконец, настройте размер корневого раздела с учетом 16 блоков: а: 1048560 16 4.2BSD 2048 16384 8 Сохраните файл и закройте Vinum. Теперь вы должны повторить этот шаг для каждого дополнительного накопителя. СОВЕТ Чтобы обеспечить зеркальное копирование, необходимо отформатировать дополнительные накопители с той же структурой, что и у первого накопителя, поэтому вам может понадобиться настроить структуру раздела с помощью редактора меток диска Sysinstall, чтобы добиться соответствия с вашим первичным диском. Таким образом, для добавления раздела vinum на диск вы сможете воспользоваться той же технологией, что и для раздела ado. Затем вам нужно настроить конфигурационный файл Vinum, который будет направлен команде "создания" (create) инструмента Vinum во время настройки томов Vinum. В листинге 20.1 показан образец конфигурационного файла. Присвойте этому файлу имя /etc/vinum. conf. Листинг 20.1. Конфигурационный входной файл Vinum (/etc/vinum.conf) drive Имя_Накопителя device /dev/adOslh volume root plex org concat sd 1 en 1048560s сдвиг_привода 0s drive Имя_Накопителя volume swap plex org concat sd len 8336675s сдвиг_привода 265s drive Имя__Накопктеля volume var plex org concat sd len 6264832s сдвиг_привода 9385216s drive Имя_Накопжтеля volume tmp plex org concat sd len 2097152s сдвиг_привода 15650048s drive Имя_Накопятеля volume usr plex org concat sd len 125359741s сдвиг_привода 17747200s drive Имя Накопителя 1 Полужирным в листинге показаны области, которые вы должны подогнать под собственную конфигурацию. Именем накопителя (ИмяНакопителя) может быть любое выбранное вами имя, хотя оно не должно содержать никаких пробелов или специальных символов, и не должно ссылаться на какое-либо определенное имя устройства — имя накопителя не должно зависеть от устройства. Также, значение сдвиг_привода для каждого раздела нужно сократить на 16 от соответствующего числа в конфигурации bsdlabel. (Эти 16 секторов используются для кода самозагрузки инструментом Vinum.)
638 Системное администрирование Часть IV СОВЕТ Эти примеры показывают, как настраивается массив накопителей RAID-1 (зеркальное копирование). Чтобы создать массив RAID-0 (чередование), замените в конфигурационном файле concat на striped. Добавьте похожую директиву drive и настройте директивы volume для каждого из остальных дисков, после чего сохраните файл» Присвойте томам дополнительных накопителей те же имена, как и у томов вашего первого диска, поскольку вы будете складывать их вместе, объединяя в комбинированные виртуальные файловые системы, состоящие из множества дисков. Теперь потребуется запустить Vinum с помощью команды gvinum и создать конфигурацию Vinum: # gvinum gvinum -> create -f /etc/vinum.conf gvinum: drive DriveName is up root.pO.sO is up root.pO is up root is up swap.pO.sO is up swap.pO is up swap is up var.pO.sO is up var.pO is up var is up tmp.pO.sO is up tmp.pO is up tmp is up usr.pO.sO is up usr.pO is up usr is up gviunm gviunm gvinum gvinum gvinum gvinum gvinum gvinum gvinum gvinum gvinum gvinum gvinum gvinum gvinum 1 drives: D DriveName 5 vpXumes: V root V swap V var V tmp V usr 5 plexes: P root.pO P swap.pO P var.pO P tmp.pO P usr.pO P root.pl P swap.pl P var.pl P tmp.pl P usr.pl State: State: State: State: State: State: С State: С State: С State: С State: С State: С State: С State: С State: С State: С State: up up up up up up up up up up up faulty faulty faulty faulty faulty /dev/adOslh Plexes: Plexes: Plexes: Plexes: Plexes: Subdisks: Subdisks: Subdisks: Subdisks: Subdisks: Subdisks: Subdisks: Subdisks: Subdisks: Subdisks: A: 0/69876 MB (0%) 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 1 Size: 511 MB 4070 MB 3059 MB 1024 MB 61210 MB 511 MB 4070 MB 3059 MB 1024 MB 61210 MB 511 MB 4070 MB 3059 MB 1024 MB 61210 MB
Добавление жестких дисков subdisks: root.pO.sO swap.pO.sO var.pO.sO tmp.pO.sO usr .pO.sO root.pi.s0 swap.pl.s0 var.pl.sO tmp.pl.sO usr .pl.sO State: State: State: State: State: State: State: State: State: State: up up up up up stale stale stale stale stale D: D: D: D: D: D: D: D: D: D: DriveName DriveName DriveName DriveName DriveName Drive2 Drive2 Drive2 Drive2 Drive2 Size: Size: Size: Size: Size: Size: Size: Size: Size: Size: В другом терминале проверьте внутри /dev наличие каталога vinum, а также устройств под именами usr, var, tmp и так далее. Это ваши новые дисковые устройства. Вы можете проверить работу виртуальных накопителей с помощью команды fsck -n -t urs /dev/vinum/root (и подобных команд для остальных устройств накопителей, пропуская раздел подкачки). Вы должны увидеть перечень имен всех накопителей в разделе subdisks, который показывает долю каждого диска в каждом томе. (Помните, что это дублированная установка, поэтому две доли в каждом томе не увеличивают его размер — это делается просто для надежности.) СОВЕТ 1 Теперь необходимо сконфигурировать файл /etc/f stab таким образом, чтобы вы могли использовать новые дисковые устройства (например, /dev/vinum/usr вместо /dev/adOslf). Скопируйте данные каждого исходного раздела в новый поддиск каждого тома. В утилите gvinum выполните команды start для каждого поддиска, обозначенного как State: stale. gvinum -> start root.pi.sO GEOM_VINUM: sd root.pi.sO is initializing 6E0M_VINUM: инициализация sd root.pi.sO GEOM_VINUM: plex root.pl is degraded GE0M_VINUM: удаление plex root.pl Дождитесь завершения выполнения процесса start, прежде чем переходить к следующему. После завершения нажмите комбинацию клавиш <Ctrl+D>, чтобы закрыть оболочку gvinum, и перезагрузите систему в многопользовательском режиме. На этом процесс настройки дисковой системы с зеркальным копированием (RAID-1) завершен. Более подробно об использовании Vinum для организации массивов RAID-0 или RAID-5 можно прочитать на man-странице vinum, или же можно проконсультироваться у администраторов FreeBSD в списке рассылок f reebsd-questions. Глава 20 511 4070 3059 1024 61210 511 407Ю 3059 1024 61210 MB MB MB MB MB MB MB MB MB MB
21 ГЛАВА Курс выживания в FreeBSD В этой главе... • Переход на FreeBSD • Что нужно, и чего нельзя делать (обычные трудности) • Настройка производительности • Готовимся к худшему: резервные копии и зеркала
I лло I Системное администрирование I 642 I ЧалткП/ Если бы вы собирались прочесть всего одну главу из этой книги, то это должна быть именно данная глава. В этой главе содержится примерный вариант руководства для новых пользователей FreeBSD: это своего рода дорожная карта, которая показывает, как добиться стабильной работы системы настолько быстро, насколько это возможно. В особенности она предназначена для администраторов, перешедших из других операционных систем, которых могут одолевать некоторые предрассудки в отношении функционирования системы FreeBSD. Эта глава поможет таким пользователям избавиться от их предрассудков и избежать многих распространенных ошибок, возникающих вследствие неопытности или незнания FreeBSD. Первые несколько недель работы с любой новой операционной системой являются наиболее рискованными — случайные ошибки в конфигурации могут привести к возникновению брешей в безопасности, потере данных или к длительной всеобщей дезорганизации. Чтобы выжить в эти первые критические недели, нужно миновать все ловушки, специфичные для платформы, и принять необходимые инфраструктурные меры безопасности, чтобы вы могли посвятить больше времени на изучение вопросов администрирования. Новички и ветераны в одинаковой мере должны найти в этой главе полезную для себя информацию. Она подводит итог философским отличиям между FreeBSD и Windows, а также между FreeBSD и родственной с ней и похожей на нее Linux. Она предлагает советы, помогающие избежать некоторых главных "ловушек" FreeBSD, и подскажет, как добиться непротиворечивой работы операционной системы. В конце главы мы поговорим о неизбежном предзнаменовании катастрофического сбоя в системе, различных средствах защиты, которые помогут подготовиться к нему, и - в отсутствие возможности вернуть все назад — о способах восстановления после краха системы. Переход на FreeBSD На момент написания этой книги операционной системе FreeBSD принадлежало примерно 10% (эта цифра настолько точная, насколько вообще можно определять такие вещи, хотя, по правде сказать, она не совсем точная) рынка Internet-серверов UNIX с открытым кодом. Остальная доля рынка практически полностью принадлежит системе Linux, и только очень малая часть занята NetBSD, OpenBSD и несколькими менее известными разновидностями. На более широком рынке серверов около 30% занято Windows 2000/XP/Server 2003 (и это положение остается устойчивым), а доля UNIX/Linux — как коммерческих вариантов, так и систем с открытым кодом — оценивается примерно в 60%. При любом раскладе это означает, что FreeBSD не является мощным игроком. Впрочем, по одной доле на рынке нельзя судить о качестве программного обеспечения, и это может подтвердить любой, прочитавший эту книгу. Использование операционной системы FreeBSD, темпы которого растут пускай не так быстро, как в прошлом, позволяет, как минимум, держать марку. Бизнес, построенный на Linux и коммерческих вариантах UNIX, переходит к поддержке FreeBSD, что объясняется стабильностью и производительностью системы, желанием иметь решение с открытым кодом, свободное от политик распространения Linux (это действительно так, и объясняется ее природой — FreBSD это полная операционная система, тогда как Linux — просто ядро). В компьютерных кругах утверждают также,
Курс выживания в FreeBSD I 7ТГ 1 Глава 21 I I что высокоуровневые Web-службы основаны на среде FreeBSD просто потому, что она единственная может справиться с нагрузкой (несмотря на наличие операционных систем, которые принадлежат материнским компаниям, предоставляющим эти Web-службы). Как результат — здоровое и долговечное уважение к FreeBSD в кругах, связанных с обслуживанием серверов, и всеобщий восторг по поводу ее заманчивой смеси из стабильности, соблюдения стандартов, открытости и функциональных возможностей. Переход из Windows или Linux означает компромисс между двумя характеристиками: доступностью программного обеспечения и устоявшейся практикой. Эти два фактора являются самой серьезной преградой, с которой обычно сталкиваются опытные пользователи, видящие систему FreeBSD впервые — первый фактор больше относится к Windows (так как все больше и больше программ Linux переносятся в FreeBSD); последний относится к обоим. В следующих разделах мы рассмотрим пути миграции и узнаем, как можно справиться со всеми трудностями. Миграция из Windows Если вы перешли в FreeBSD, имея за плечами опыт работы с Windows-сервером, то проблемы, с которыми вы наверняка столкнетесь, будут связаны не только с доступностью программного обеспечения, но и с рядом фундаментальных отличий в том, как используется компьютер. Топологическая роль, которую играет Windows- сервер в сети, отличается от роли FreeBSD-сервера. Операционная система Windows практически полностью построена на графическом интерфейсе пользователя (GUI) и не имеет развитых или широко используемых методов удаленного администрирования, которые можно было бы сравнить с испытанной и надежной оболочкой командной строки в UNIX. Даже встроенные терминальные службы (Terminal Services) в последних версиях Windows имеют свои практические ограничения и технические возможности, которых нет в простой командной строке. Это значит, что для эффективного использования Windows-сервера обычно нужно физически находиться возле компьютера. Переход к интерфейсу командной строки для выполнения обыденных функций может показаться устрашающим, а вот в системах UNIX работа с этим интерфейсом является ключевым аспектом, и дает огромное преимущество в удаленной доступности. В этом разделе данной главы вы узнаете о том, как произвести настройку FreeBSD- сервера, чтобы обеспечить поддержку некоторых распространенных служб, включающих гораздо меньше коммерческих программ, для которых не нужны лицензии и установка типа "клиент-сервер*, требуемые при настройке других серверов. Вы узнаете о миграции приложений "клиент-сервер" в систему FreeBSD и о некоторых важных отличиях между поддержанием безопасности в FreeBSD и в Windows. Важной частью обеспечения безопасности сервера является поддержание вашей операционной системы в актуальном состоянии; в этой главе вы узнаете о том, как можно удерживать вашу систему FreeBSD актуальной благодаря самым последним разработкам. Естественно, во время перехода из Windows в FreeBSD вы заметите одно большое отличие — изменение в доступности программного обеспечения, лицензировании и регистрации. Когда вы перейдете в FreeBSD, то вы будете иметь дело с бесплатными программными пакетами с открытым кодом, которые будете компилировать самостоятельно; эти программы поддерживаются простыми людьми в Internet или сторонними службами поддержки, а не крупными поставщиками программного обеспечения.
Системное администрирование НА ЗАМЕТКУ Встроенные и сторонние компоненты Windows постепенно повышают удаленную доступность к платформе. В наши дни вы можете управлять службами в удаленном режиме с помощью панели управления Services (Службы), а различные методы позволяют запрашивать командную строку DOS на компьютере-сервере. Однако они являются лишь подмножеством полной функциональности системы — они явным образом ограничены функциональными возможностями используемого вами механизма управления. Ответственность за полное конфигурирование установленного программного обеспечения сервера часто лежит на административных клиентских программах, о чем речь пойдет прямо сейчас* Приложения типа "клиент-сервер" Большая часть программного обеспечения предприятия для Windows-серверов разрабатывается на основе модели, в которой вы инсталлируете серверную часть физически (обычно с компакт-дисков). Согласно этой модели, затем вы инсталлируете административную часть — клиент (client) — на своем настольном компьютере, а также на любом другом компьютере, который будет осуществлять администрирование сервера. В современных версиях Windows имеются терминальные службы, которые позволяют вам напрямую управлять компьютером-сервером из удаленного места; однако вследствие насыщенности GUI-интерфейса Windows графикой и разнообразия технических особенностей в доступном программном обеспечении, использовать эти инструменты сложно и неудобно. При переходе к UNIX вы должны принять главное философское отличие. Для операционной системы FreeBSD практически нет специализированных приложений типа "клиент-сервер", которые можно было бы сопоставить с программами для коллективной работы, ведения календаря или работы в сети, которыми насыщены Windows-компьютеры. Однако их количество растет — главным образом вследствие повышения популярности интерфейсов администрирования на основе Web, таких как конфигурационные утилиты для сторонних приложений, подобных системе печати CUPS и сервера рассылки Mailman. Эти утилиты обычно предназначаются только для выполнения на локальной консоли по причине соблюдения мер безопасности (конфигурационные утилиты обычно необходимо выполнять от имени суперпользователя, а вам ведь не нужно, чтобы любая Web-утилита, выполняемая от имени суперпользователя, была доступна из любого места в сети). В любом случае, эти системы администрирования на основе Web обычно являются просто удобными дополнениями; для каждой утилиты администрирования имеется версия командной строки, поскольку самым излюбленным механизмом для администрирования любой части UNIX является командная строка, доступ к которой осуществляется из удаленного терминала. SSH (или нешифрованный Telnet, как спасительное средство) является доминирующим многоцелевым инструментом, позволяющим делать в мире UNIX все, что угодно. С технологической точки зрения использование Telnet является одним из наиболее эффективных и простых методов, которые можно вообразить для работы с сервером, ведь все, что вы посылаете и принимаете — это текст. Кроме того, это самый гибкий метод,, дающий вам гораздо более широкие возможности доступа к операциям на сервере, чем любой графический инструмент, поскольку вы можете вводить любую необходимую вам команду в командной строке, не ограничи-
Курс выживания в FreeBSD Глава 21 645 вая себя специфическими элементами управления, предлагаемыми инструментом с графическим интерфейсом. Конечно, это означает также, что вы получаете больше возможностей для нанесения вреда. Здесь мы сталкиваемся с еще одним компромиссом — между простотой в использовании, безопасностью, и направленной функциональностью программного обеспечения Windows и разносторонностью, риском и эзотерическим администрированием на основе терминала. Безопасность Модели безопасности в Windows 2000/XP/Server 2003 посвящены целые книги, поэтому в полной мере этот вопрос мы не сможем рассмотреть в единственной главе. Тем не менее, если вы привыкли к стилю Windows с ее пользователями, доменами и полномочиями, и вы переходите к FreeBSD, то вам будет необходимо знать несколько вещей, которые помогут сохранить нетронутой модель безопасности. Учетная запись "root" (суперпользователь) эквивалентна учетной записи "Administrator" (администратор). Вряд ли это для кого-то является секретом. Однако кроме этого существует несколько вещей, которые вы можете сделать, чтобы ваши службы выполнялись с их привычными привилегиями, и чтобы ваши доверенные администраторы обладали столькими полномочиями, сколько им необходимо, и не более того. Первым делом нужно знать о том, какие фундаментальные отличия существуют между моделями безопасности Windows и FreeBSD. • Для определения принадлежности и полномочий в системе FreeBSD используются такие режимы, как "пользователь", "группа" и "прочие", причем списки управления доступом (Access Control List — ACL) служат дополнением; в системе Windows списки управления доступом используются как основная система принадлежности/полномочий. Эта схема рассмотрена в главе 13. • В Windows применяется концепция выверенных каналов (trusted path), позволяющая осуществлять скрытую аутентификацию пользователей, которые обращаются из определенных хостов. Например, вы можете заставить Windows "доверять" любому пользователю, подключающемуся из определенного компьютера при некоторых или любых условиях, не прибегая к аутентификации пользователя там, где она не нужна. В FreeBSD такой возможности нет, если только вы не используете Kerberos, о чем будет рассказано в главе 30. • Регистрационные имена в FreeBSD должны состоять из 16 символов или меньше, и содержать только символы в нижнем регистре или цифры. Пробелы или специальные символы не допускаются. Имена пользователей в Windows могут состоять из 20 символов, хотя к ним применяются те же ограничения на специальные символы. • В Windows имеется 27 разных назначаемых прав пользователей на модификацию файла и его выполнение с различными привилегиями. FreeBSD проводит различие только между процессами, выполняемыми от имени суперпользователя, процессами, выполняемыми от имени индивидуальных пользователей, и процессами, выполняемыми в режиме setuid, или "set user ID" (установка идентификатора пользователя), в котором процесс берет привилегии того, кому принадлежит исполняемый файл. (Эта наипростейшая парадигма безопасности означает, что FreeBSD является менее гибкой операционной системой, чем Windows, хотя, с другой стороны, она менее подвержена уязвимостям, которые могут возникнуть в результате неправильной конфигурации.)
646 Системное администрирование Часть IV • FreeBSD и UNIX не имеют иерархических групп. Windows позволяет помещать одну группу пользователей в другую группу, причем на произвольную глубину. В FreeBSD такое невозможно — все группы существуют на одном и том же "уровне". • В мире UNIX нет "доменов" Windows. Наоборот, службы удаленной аутентификации (такие как Domain Controller (Контроллер доменов) в Windows) и домены безопасности обрабатываются информационной службой сети (NIS) или так называемыми "желтыми страницами". Подробности о NIS можно прочитать, выполнив команду man nis. • Равноправное совместное использование файлов, реализованное в системе Windows посредством NetBIOS и SMB, в системах семейства UNIX обычно реализуется через NFS. С помощью пакета Samba в FreeBSD можно подготовить файл NetBIOS и организовать совместное использование принтера в стиле Windows. Об NFS мы поговорим в главе 33, a Samba обсуждается в главе 34. • Windows использует схему Authenticode (Код аутентификации) для проверки подлинности кода в загружаемых программных пакетах. Она представляет собой схему подписки, с*помощью которой загружаемое программное обеспечение должно предъявлять цифровой "сертификат* пользователю, который вправе принять или отклонить его. Это позволяет усилить защиту от потенциально опасных программ. В системе UNIX нет подобного стандартизированного механизма подписки. С другой стороны, система портов/пакетов в FreeBSD обеспечивает централизованную проверку и предоставляет необходимые гарантии подлинности, подходящие практически для всех приложений, включая проверки контроля четности, гарантирующие, что в цепочке распределения между вами и человеком, сопровождающим приложение, не будут иметь место попытки нанесения вреда. (Однако в будущем эта ситуация может измениться, поскольку систему портов постепенно реализуют и на других платформах.) За дополнительными сведениями о портах и пакетах обращайтесь в главу 16. Windows заявляет о себе как о более простой в использовании и более защищенной системе, чем UNIX* С другой стороны, большое количество обязательных сертификационных курсов по безопасности для администраторов и инженеров Windows позволяет предположить, что это не является абсолютной правдой. Систему Windows потенциально проще обезоружить из-за неверной конфигурации, чем с помощью самых изощренных вторжений. Хотя это возможно и в FreeBSD, история показывает, что подобное бывает редко. FreeBSD реже страдает от брешей в безопасности, вызванных неправильной конфигурацией, поскольку структура UNIX такова, что она по умолчанию обеспечивает более надежную защиту, готовую к действиям, которые может предпринять новый пользователь. Также определенную роль в безопасности систем UNIX играет и большое количество краткой и полезной информации, доступной в онлайновом режиме. Превосходным источником такой информации является SANS Institute (System Administration, Networking, and Security Institute — Институт системного администрирования, работы в сети и безопасности), который можно найти по адресу http: //www. sans.org. Эквивалентность программного обеспечения В табл. 21.1 перечислены некоторые наиболее часто используемые программы в Windows-серверах и их эквиваленты для FreeBSD.
Курс выживания в FreeBSD Глава 21 Таблица 21.1. Программное обеспечение Windows-серверов Служба Почта (SMTP) Почта (POP) Почта (IMAP) Новости (NNTP) Вход в систему Web/HTTP FTP Динамическое содержимое Web DNS Удаленный доступ Службы каталогов Windows Microsoft Exchange Microsoft Exchange Microsoft Exchange Microsoft Exchange Microsoft SMS Microsoft IIS Microsoft IIS Cold Fusion, ASP Microsoft Active Directory Microsoft Terminal Server Microsoft Active Directory FreeBSD Sendmail qpopper IMAP-UW inn syslog Apache ftpd PHP, modjperl, modjpython BIND SSH, Telnet VNC OpenLDAP Доступность Основная система Порты Порты Порты Основная система Порты Основная система Порты Основная система Порты Порты Следует отметить, что в мире Windows, из-за нежелательных взаимодействий между различными частями серверного программного обеспечения, на предприятиях запускают на одной машине обычно только одну важную службу, В таких сетях имеется выделенный почтовый сервер, выделенный Web-сервер, выделенный сервер имен — и все они работают на разных машинах. В среде UNIX с открытым исходным кодом этой философии, как правило, не придерживаются по двум причинам. • Системы UNIX с открытым кодом часто выбираются из-за их низкой стоимости, поэтому покупка множества серверов часто не вписывается в бюджет физического лица или организации. • Программное обеспечение обычно лучше работает в'среде UNIX, чем в среде Windows, а вредные взаимодействия между службами и демонами происходят гораздо реже и имеют менее пагубные последствия. Это ваше право — выбирать работу в среде UNIX, или нет; вы можете не рисковать и не запускать все критически важные службы вашей сети на одном компьютере. Однако если вы все-таки выберете этот вариант, то вы сможете чувствовать себя более свободно, и будете работать с большей эффективностью, запуская множество критически важных служб на одном и том же сервере, чем этого можно добиться с использованием Windows-машины. НА ЗАМЕТКУ > Все большую популярность приобретает виртуализация, или параллельная работа нескольких экземпляров операционной системы на одном и том же оборудовании, огражденных друг от друга. VMWare является популярным коммерческим пакетом виртуализации, a Xen (http: // www. xen. com) представляет собой пакет мониторинга виртуализации, встроенный в FreeBSD 6.1.
648 Системное администрирование Часть IV Поддержание актуальности Microsoft предлагает обновлять систему с помощью пакетов обновлений (service pack). Они представляют собой большие наборы ревизий программного обеспечения и бинарных заплат, выходящие каждые шесть месяцев, или что-то около того. Более быстрые отклики (например» в ответ на бюллетени безопасности) выходят в виде горячих исправлений (hotfix) — обновлений и заплат, которые можно загружать с Web-сайта Microsoft с помощью механизма Windows Update. Способ поддержания актуальности FreeBSD может оказаться гораздо сложнее, чем способ Microsoft, но как только вы разберетесь с ним, он тут же станет более простым и более эффективным. FreeBSD делает большую ставку на доступность исходных кодов, которые вы можете отслеживать и с которыми вы можете синхронизировать локальную копию всего дерева исходных кодов с той периодичностью, которую вы выберете. Инструмент CVSup автоматизирует этот процесс и делает его простым для загрузки. В FreeBSD рекомендуется иметь локальную копию исходного текста инсталлированной у вас версии выпуска FreeBSD в качестве заготовки для заплат исходных кодов, и регулярно синхронизировать ее с ветвью исправления ошибок для данного выпуска, в результате чего эта версия будет получать каждое зарегистрированное изменение, связанное с устранением уязвимости в безопасности или исправлением ошибки. Применение CVSup и структура ветвей исправления ошибок рассматривались в главе 19. Любой бюллетень безопасности, издаваемый FreeBSD Security Officer, содержит заплату исходного кода или нечто ей подобное для устранения той или иной проблемы. Предлагаются построчные инструкции; все, что вам нужно сделать — это скопировать их дословно в командную строку, причем после этого, как правило, не нужно будет перезагружаться. При желании вы можете поддерживать свою систему полностью актуальной, заново собирая все с самого начала из синхронизированных исходных кодов, притом делать это можно с любой регулярностью. Этот процесс известен как make world, он рассматривался в главе 19. Возможно, для новичка в FreeBSD этот способ не подойдет. Однако пересборка системы может оказаться полезной позже, когда вы наберетесь опыта, и захотите иметь самую свежую версию системы. А пока что, используйте главу 19 в качестве справочника по синхронизации исходных кодов с ветвью исправления ошибок для вашего выпуска FreeBSD, чтобы вы могли применять заплаты безопасности и поддерживать систему в актуальном состоянии. ВНИМАНИЕ! Очень удобно иметь "резервную" машину в качестве зеркальной копии вашей "рабочей" машины. Если вам нужно выполнить синхронизацию и использовать самый свежий код, сделайте это сначала на резервной машине, и только после этого применяйте эти же изменения на рабочей машине. Миграция из Linux FreeBSD больше похожа на Linux, чем на Windows, и во многом их функциональные возможности идентичны, несмотря даже на то, что у Linux и FreeBSD разный код. Обе эти системы наследуют одинаковую традицию UNDC, обе имеют открытый исходный код, и модели безопасности каждой из них построены по одним и тем же
Курс выживания в FreeBSD Глава 21 649 правилам. Дл# обеих платформ доступно одинаковое программное обеспечение сторонних разработчиков (в основном одинаковое, особенно если принять во внимание совместимость бинарных файлов Linux с FreeBSD). Для каждой из этих платформ характерны аналогичные проблемы системного администрирования, и для каждой возникшей проблемы существуют одинаковые способы их решения. Трудности, связанные с переходом из Linux в FreeBSD, являются по большей части технологическими, нежели философскими, поэтому данный раздел будет посвящен больше административным деталям, чем раздел, в котором описывался переход из Windows. Функциональные отличия между Linux и FreeBSD могут быть сведены в несколько базовых областей. • Где в системе все хранится. • Разделы и типы файловых систем. • Порты и пакеты. • Обеспечение синхронизации. • Работа с файлами главных паролей. • Техническая эзотерика. Где в системе все хранится Самое главное, что следует помнить о FreeBSD, должно пока что стать своего рода заклинанием: все, что вы инсталлируете, попадает в поддерево /usr/local. FreeBSD тщательно придерживается этой модели, чтобы не допустить засорения основных системных областей (/usr/bin, /var/lib и так далее). В табл. 21.2 перечислены некоторые места ресурсов, которые вам понадобятся, но нужно помнить о том, что в Linux эти места могут отличаться от дистрибутива к дистрибутиву. ВНИМАНИЕ! Некоторые порты ведут себя хуже других. Остерегайтесь портов, устанавливающих компоненты вне каталога /usr/local, поскольку таких портов существует несколько. Таблица 21.2 Сравнительная таблица местонахождения ресурсов в Linux и FreeBSD Ресурс Linux FreeBSD Корень сервера Apache Конфигурация Apache Бинарные файлы Apache Исполняемый файл Sendmail Каталог базы данных MySQL Сценарии запуска системы Сценарии запуска, инсталлированные пользователем /var/lib/apache или /srv/www /var/lib/apache/conf, /etc/apache, /etc/httpd /var/lib/apache/sbin или /usr/sbin /usr/lib/sendmail /var/lib/mysql /etc/red /etc/red /usr/local/www /usr/local/etc/apacne /usr/local/sbin/ /usr/sbin/sendmai1 /var/db/mysql /etc/red (/etc/rc* до выхода FreeBSD 5.0) /usr/local/etc/rc.d
j 650 Ресурс Системное администрирование Часть IV Linux Окончание табл. 21.2 FreeBSD Исполняемые файлы, инсталлированные пользователем Системные исполняемые файлы, инсталлированные пользователем Библиотеки, инсталлированные пользователем Общие файлы, инсталлированные пользователем Системная документация Документация по программному обеспечению, инсталлированному пользователем /usr/bin /usr/sbin /usr/lib /usr/share /usr/doc или /usr/share/doc /usr/doc или /usr/share/doc /usr/local/bin /usr/local/sbin /usr/local/lib /usr/loca,l/share /usr/share/doc /usr/local/share/doc Отличия в местонахождении одних ресурсов вызваны разными способами инсталляции программного обеспечения с помощью RPM (широко используемый администратор пакетов в Linux) и портов/пакетов в FreeBSD. Другие отличия связаны с компоновкой основной системы. Система Linux обычно имеет структуру больше напоминающую "System V\ в то время как FreeBSD подобна BSD. Работа портов и пакетов в FreeBSD рассматривалась в главе 16. Разделы и типы файловых систем Архитектура загрузчика операционной системы в Linux разбивает диск на разделы подобно DOS: существует четыре основных раздела BIOS, один из которых может быть преобразован в "расширенный раздел", содержащий множество "логических" разделов. Все эти разделы пользователь воспринимает как разделы одного уровня, даже если структура в действительности является иерархической. Систему можно загрузить только из раздела, отличного от расширенного, что приводит к потенциальной путанице. Иерархическая структура разбиения на разделы в FreeBSD более понятна. Разделы BIOS называются секциями (slice), подразделы называются разделами (partition) или разделами BSD (BSD partition), а процесс загрузки обрабатывает различные уровни явным образом (каждый со своим собственным кодом блока загрузки), чтобы избежать путаницы, связанной с расширенными и первичными разделами. При подготовке к работе диск сначала разбивается на секции, после чего каждая секция разбивается на разделы. Этот процесс описан во всех подробностях в предыдущей главе. Родной файловой системой для FreeBSD является UFS/FFS. Вы можете использовать существующие диски Linux в среде FreeBSD без модификаций, а для FreeBSD необходимо загрузить модуль ядра, чтобы обеспечить поддержку Ext2FS; если вам нужно регулярно использовать диски Linux, то вам придется перекомпилировать ядро FreeBSD, чтобы добавить поддержку Ext2FS и не загружать каждый раз этот модуль ядра динамически. В главе 18 вы найдете инструкции о том, как использовать этот вариант и самостоятельно собрать новое ядро.
Курс выживания в FreeBSD Глава 21 651 Порты и пакеты Если вам доводилось работать в среде Linux, то вы могли привыкнуть к инсталляции программ с помощью утилиты RPM. В FreeBSD это делается редко, да и не рекомендуется. В действительности вы можете причинить серьезный вред вашей системе, устанавливая несовместимые библиотеки в такие места, как /usr/lib, хотя это можно делать, если вам оно действительно нужно. Предпочтительным методом инсталляции и обслуживания программного обеспечения в FreeBSD является использование инструментов для работы с пакетами (pkg_*) или портами. В главе 16 подробно описываются порты и пакеты, но некоторые аспекты их работы в FreeBSD являются особенно важными для пользователей, перешедших из Linux. Пакеты и порты предлагают централизованный механизм фильтрации для тонкой настройки опций сборки и установки программ, написанных для Linux, с тем, чтобы их можно было без ошибок скомпилировать под FreeBSD и инсталлировать в места, предназначенные для материалов, устанавливаемых пользователями. Порты и пакеты можно получить у разных активных пользователей и на центральных сайтах загрузки, а не непосредственно у самих разработчиков программ. Это помогает сохранять систему FreeBSD чистой и аккуратной. Поддержка синхронизации Система FreeBSD более "нацелена на исходный код", нежели Linux; поскольку на самом деле существует только один "дистрибутив" операционной системы, то вся установка доступна в виде исходных кодов. В мире Linux нет такого эффективного подхода. Каждый дистрибутив имеет свою собственную структуру и свою собственную подборку программ. Само ядро Linux представляет собой лишь поддерево исходных кодов, которое, в чем вы можете быть уверенными, является в точности таким же, как и у другого пользователя Linux; кроме того, в разных ситуациях применение заплаты к ядру может выполняться по-разному, в зависимости от дистрибутива. У разных дистрибутивов по-разному осуществляется автоматическая загрузка деревьев исходного кода, их синхронизация и сборка. Система FreeBSD предлагает инструменты и необходимую инфраструктуру для выполнения каждой из этих задач. Это означает, что для того чтобы обеспечить синхронизацию с самым последним кодом разработки, в FreeBSD вы должны всего лишь отслеживать исходные коды с помощью CVSup, о чем говорилось в главе 19. Заплаты безопасности и горячие исправления (доступные в Linux в разных ипостасях — в виде RPM, заплат исходных кодов или бинарных заплат) распространяются в FreeBSD как в виде исходных кодов, так и путем регистрации исправлений ошибок в центральном дереве исходных кодов. Вы можете обновить свою систему в ответ на бюллетень безопасности или за счет выполнения построчных инструкций заплаты в бюллетене, или путем синхронизации вашего дерева исходных кодов с соответствующей веткой исправления ошибок с последующей сборкой этой части системы. ВНИМАНИЕ! Установка заплат для компонентов системы (особенно для небольших, не имеющих большого значения элементов системы) без пересборки всей операционной системы работает от случая к случаю. Чем более фундаментальным является компонент для работы системы, тем выше вероятность того, что вам придется выполнить весь процесс make world, чтобы добиться правильной модернизации. К таким фундаментальным областям системы обычно относятся некоторые библиотеки (элементы в /usr/lib) или заголовочные файлы (usr/include). Менее рискованными являются поддерживаемые бинарные файлы, в каталогах /usr/bin и /usr/sbin.
I ем [ Системное администрирование I 1 Часть IV Работа с файлами главных паролей И Linux, и FreeBSD используют теневые пароли (shadow password) — метод хранения зашифрованных строк пароля в файле, который может прочитать только супер пользователь (см. раздел "Файлы /etc/passwd и /etc/master.passwd" главы 13). Однако в то время как FreeBSD поддерживает файл /etc/master .passwd, который содержит все пользовательские данные, а файл /etc/passwd является просто подборкой (без самих строк паролей), в Linux это организовано немного иначе. Файл /etc/shadow системы Linux не содержит никакой полезной информации, кроме имени пользователя и хешированного пароля. Файлы /etc/passwd и /etc/shadow необходимы для разработки полной пользовательской базы данных в системе Linux, в то время как в FreeBSD вам нужен лишь файл /etc/master .passwd. Если скомбинировать файлы /etc/passwd и /etc/shadow из системы Linux, то можно составить файл master .passwd, который вы сможете инсталлировать на свей FreeBSD-машине и, таким образом, сохранить регистрационные данные всех ваших пользователей. Это можно сделать с помощью сценария на языке Perl, показанном в листинге 21.1. Листинг 21.1. Образец Perl-сценария, преобразующего пользовательскую базу данных Linux для использования в FreeBSD #!/usr/local/bin/perl # Присвойте следующей переменной путь к bash на FreeBSD-машине # (если она инсталлирована), или к /bin/csh, чтобы переключить # пользователей /bin/bash на csh $newshell « "/bin/csh"; open (PASSWD,H/etc/passwd"); @passwd - <PASSWD>; close (PASSWD); open (SHADOW,"/etc/shadow"); @shadow » <SHADOW>; close (SHADOW); foreach $user (@shadow) { @sdata - split(/:/f$user); $passhash{$sdata[03} = $sdata[l]; # Производим поиск в таблице на основе # имен пользователей } foreach $user (@passwd) { @pdata * split(/:/,$user); $pdata[6] - $newshell."\n" if ($pdata[6] eq Vbin/bash\n"); $pdatafl] - $passhash{$pdata[0]}; # Заменяем "х" хешированным паролем splice (@pdata,4,0,undef, "0", "0"); # Соединяем дополнительные пустые поля foreach (@pdata) { # Печатаем комбинированную строку вывода print "$_"; print ":" unless ($_ — /W) ; } } # Читаем файл /etc/passwd # Читаем файл /etc/passwd
>с выживания в FreeBSD Убедитесь в том, что этот сценарий помечен как исполняемый, затем войдите в систему Linux, воспользуйтесь командой su для расширения возможностей доступа суперпользователя и запустите сценарий, посылая выходные данные в файл: % . /mkpas swd. pi > new. mas ter. pas swd Переместите этот файл new. mas ter, pas swd на FreeBSD-машину и поместите его в каталог /etc (pwd_mkdb, скорее всего, не будет работать с входными файлами и пунктами назначениями, находящимися в отличных файловых системах). Откройте файл в текстовом редакторе, а затем откройте файл FreeBSD /etc/master.passwd в другом окне. Вам нужно будет модифицировать первый блок из примерно 15 имен пользователей (например, daemon, bin, news и другие псевдопользователи системы, чьи идентификаторы UID отличаются в Linux и FreeBSD). Просто скопируйте этот блок пользователей из файла /etc/master.passwd системы FreeBSD в файл new.master.passwd, заменив соответствующий блок в новом файле. Создайте резервную копию файла /etc/master .passwd. Наконец, запустите pwd_mkdb, чтобы сгенерировать новые файлы паролей и хешированные базы данных: # pwd_rokdb -p /atc/naw.maetar.paeswd Если эта команда будет выполнена без ошибок, не выходите пока что из системы — пока у вас есть привилегии суперпользователя, вам нужно выполнить тестирование, дабы устранить любые возникшие проблемы. Для этого откройте еще одно окно терминала и попытайтесь войти как обычный пользователь и получить доступ на уровне суперпользователя с помощью команды su. Если у вас не получится сделать это, запустите pwdjnkdb еще раз в отношении созданного вами зарезервированного файла, и базы данных вернутся к своему первоначальному состоянию, чтобы вы смогли в спокойной обстановке определить, в чем кроется причина. Техническая эзотерика Linux и FreeBSD имеют много самых разных отличий. Наиболее заметные из них перечислены ниже. • Имена устройств в FreeBSD менее обобщенные, чем в Linux, но более описательные. Другими словами, карты Ethernet в Linux именуются как ethO, ethl и так далее, поэтому вы можете легко сказать, что это карты Ethernet, но вы не можете сразу же назвать их производителя или модель (хотя в последних ядрах Linux интерфейсы Ethernet помечаются с помощью МАС-адресов). FreeBSD имеет специфические драйверы для каждого производителя и модели карты, поэтому там имена отдаленно напоминают название производителя (rl для RealTek, sf Adaptec Starfire и так далее). Точно так же, жесткие диски в Linux именуются как hda, hdb и так далее; накопители в FreeBSD, в зависимости от интерфейса (IDE/ATA), именуются adO и adl или da0 и dal. Эти имена более конкретно говорят вам о специфике существующих устройств; однако они могут быть более запутанными, чем в Linux, если вы попытаетесь узнать, какое устройство соответствует вашей; карте Ethernet или вашему жесткому диску. Вы можете открыть конфигурационный файл FreeBSD (/usr/src/sys/i386/conf / GENERIC), чтобы узнать из комментариев, как имена устройств определяют модели компонентов.
I л-- I Системное администрирование LDM I Часть IV • В системе FreeBSD нет файла System.map. Linux использует эту таблицу для поиска адресов перехода к наиболее часто используемым символам ядра. FreeBSD встраивает эти символы в ядро, поэтому вам не нужно беспокоиться о них. • Оболочкой по умолчанию в FreeBSD является tcsh, а не bash, tcsh и csh жест- ко связаны друг с другом, поэтому csh — это то же самое, что и tcsh. Если вам нужна оболочка bash, вы должны инсталлировать ее из портов или пакетов. • Пакет бинарной совместимости Linux (который нужно инсталлировать при подходящем случае) создает дерево /compat/linux, содержащее основной исполняемый файл Linux и структуру библиотек для программ из пакета Linux, зависящих от них. Он также создает и загружает модуль ядра linux. ко (вы можете проверить его состояние с помощью утилиты kldstat). Как правило, эти структуры обрабатывают исполняемые файлы Linux прозрачно; некоторые аномалии могут встречаться, но в большинстве случаев все проходит нормально. Однако вы, конечно, захотите установить самые разнообразные родные для FreeBSD версии из пакетов или портов, при условии, что они будут доступ* ными. • FreeBSD не дает возможности входить в систему как суперпользователь в удаленном режиме, если только вы не взломаете файл /etc/ttys (подробно об этом см. примечание в разделе "Знакомство с пользователями и группами" главы 13). Если для вас вопрос безопасности является крайне важным, оставьте в покое файл /etc/ttys и используйте утилиту su, чтобы выполнять обязанности суперпользователя. • В версии 5.0 система FreeBSD использует файловую систему устройств DEVFS, а не стандартный каталог /dev, заполненный "специальными" файлами, служащими в качестве интерфейсов устройств. Содержимое каталога /dev DEVFS генерируется динамически, исключая какую-либо необходимость в создании устройств вручную при установке нового оборудования. Особенности работы с DEVFS и подсказками устройств рассматривались в главе 18. • Нумерация устройств, подключенных к шине PCI, в FreeBSD начинается с нуля для вмонтированных в материнскую плату устройств, а затем увеличивается по мере удаления от материнской платы по цепочке PCI. В системе Linux вмонтированное в материнскую плату устройство обычно является устройством с самым высоким номером, и номера эти уменьшаются по мере увеличения расстояния до материнской платы. Это означает, что на машине, имеющей две карты Ethernet, устройства, которые в Linux именовались бы как ethO и ethl, в FreeBSD могут стать устройствами f xpl и f xpO, соответственно. • Рекламируя на футболках "Тих" ("Смокинг"), а на пуфиках — "Daemon" ("Демон"), вы можете слегка обескуражить окружающих, поскольку на момент написания этой книги продукты FreeBSD еще не присутствовали в полной мере на рынке. Если бы не утряска всех этих второстепенных отличий, то переход из Linux в FreeBSD мог бы стать более плавным.
>с выживания в FreeBSD Что нужно, и чего нельзя делать (обычные трудности) Каждая операционная система имеет множество ловушек, подстерегающих неосторожного пользователя. Эти ловушки могут оказаться опасными, если система только что была установлена или если администратор является новичком в FreeBSD. В этом разделе перечислены наиболее распространенные ошибки и даны наиболее ценные подсказки для эффективного администрирования FreeBSD. Что нужно делать • Для инсталляции программного обеспечения используйте порты и пакеты. Исходный текст определенной программы можно взять прямо у разработчика и скомпилировать его с помощью встроенных сценариев, но так вы рискуете засорить вашу "пользовательскую среду обитания" в основной системе, если инсталлятору программ неизвестна структура файловой системы FreeBSD. Если программа не доступна в виде порта, попробуйте поискать порт в списке рассылки freebsd-ports@freebsd.org, а еще лучше научитесь самостоятельно переносить программы и сами станьте активным пользователем. • Следите за еженощными, еженедельными и ежемесячными исходящими сообщениями periodic. Любые отличия в исполняемом файле setuid будут отмечены в отчете о безопасности. В этих сообщениях говорится также об использовании файловой системы, об отклоненных почтовых хостах и многих других формах видимости, которые представляют собой эффективную "систему кабельного телевидения" против злоумышленников. • Познакомьтесь с CVSup. CVSup — это ваш друг. Эта программа не только может постоянно сохранять ваши исходные коды и порты синхронизированными, но и может служить в качестве эффективного решения для зеркального копирования, о чем будет рассказано ниже в разделе "Зеркала". • Установите sudo (/usr/ports/security/sudo) и используйте именно ее, а не работайте как суперпользователь, особенно если вы разделяете административные обязанности с кем-то еще. Программа sudo (ее можно вызвать, помещая перед обыкновенной командой префикс sudo) позволяет вам или другим пользователям выполнять команды с привилегиями суперпользователя, не зная пароля суперпользователя; ее работа заключается в том, чтобы попросить пользователя ввести его собственный пароль, затем проверить, указан ли этот пользователь в файле /usr/local/etc/sudoers как действительный администратор, и только после этого ему будет разрешено выполнить команду от имени суперпользователя. Вы можете также применять файл sudoers для того чтобы установить, какие программы или команды будут выполняться через sudo. Это позволит надежно хранить в секрете пароль суперпользователя и ограничивать разрушительный потенциал этой учетной записи, обладающей всей полнотой власти в системе; кроме того, вы сможете эффективным образом разделять административные обязанности. • Используйте ntpd и ntpdate для синхронизации часов вашей системы, чтобы все процессы входа в систему и планирования в FreeBSD, зависящие от времени, могли бы протекать должным образом. Вы можете сделать это, добавив нижеследующие строки в файл /etc/rc.conf:
656 Системное администрирование Часть IV ntpdate_enable="YES" ntpdate_f lags*" tick. usno. navy. mil" ntpd_enable»"YES" СОВЕТ Другие серверы времени, пригодные для использования, перечислены на сайте http:// ntp.isc.org. Вы можете использовать любой понравившийся вам сервер NTP для утилиты ntpdate, которая запускается во время загрузки и корректирует любые несоответствия по времени до того, как остальные службы получат шанс на выполнение. Вы должны также создать файл /etc/ntp. conf, чтобы управлять демоном ntpd, поддерживающим синхронизацию ваших часов с указанным сервером NTP (или серверами) на постоянной основе. Особенности создания этого файла описаны на man-странице (man ntp.conf). Как минимум, этот файл должен содержать следующие строки: server tick.ueno.navy.mil driftfile /var/run/ntp.drift • С уважением относитесь к активным пользователям FreeBSD. Всего их насчитывается только 15, или около того, и ответственность за всю операционную систему лежит в основном на их плечах (в отличие от коллективных плеч тысяч независимых разработчиков и дистрибуторов Linux или "корпоративных плеч" Microsoft). Это огромная ответственность. Будьте дружелюбными и оказывайте им, да и не только им, всяческую поддержку. • Решите для себя, какую модель безопасности вы хотите иметь. Доверяете ли вы всем своим пользователям? Если да, то вы можете выйти из положения, оставив множество ресурсов системного уровня доступными для просмотра. Таким образом, вам не придется сильно переживать, когда у вас возникнут проблемы с полномочиями (например, должны ли Web-приложения сохранять пароли в форме открытого текста, или же нужно производить запись в каталог, доступный для записи каждому). А если вы не доверяете всем своим пользователям, то вам следует быть гораздо более осторожными. Однако при любых обстоятельствах наилучшим вариантом будет работа сервера с ограниченными возможностями, чтобы вы могли организовать как можно более надежную его защиту. Даже если вы доверяете локальным пользователям, в периоды подключения вашей машины к Internet ею могут заинтересоваться те, кто мог бы взломать ее и добраться до ее ресурсов. Подробное обсуждение безопасности в сетевой среде вы найдете в главе 30. • Подпишитесь на соответствующие списки рассылки для вашей версии FreeBSD. Без сомнений, вы должны быть в f reebsd-security@f reebsd. org, если вы обслуживаете сервер; freebsd-ports@freebsd.org и freebsd-questions@freebsd.org тоже будут полезными. Если вы отслеживаете исходные коды STABLE или CURRENT, подпишитесь на freebsd-stable@freebsd.org или freebsd- current@freebsd.org, соответственно. • Отслеживайте размер ваших журнальных файлов. Файлы httpd-access.log и httpd-error. log Apache общеизвестны как "пожиратели" дискового простран-
Курс выживания в FreeBSD I 7TZ I Глава 21 I I ства, если ваш Web-сервер обслуживает сколько-нибудь существенный трафик. Используйте встроенную утилиту Apache rotatelogs или запустите задание сгоп, чтобы время от времени очищать журналы. Если ваш раздел /var оказался переполненным, то ваша почта, базы данных и файлы времени выполнения не смогут работать. Также обязательно читайте ведущиеся журналы! Система не просто записывает все эти данные о своем состоянии. Конечно, так оно и есть на самом деле, однако она работает только в том случае, если вы обращаете внимание на то, что система "желает сказать*. • С гордостью носите баннер "Daemon* ("Демон*) I Чего нельзя делать • Не используйте экспериментальные возможности на производственном сервере. Это не место для опробования новых идей, таких как GVinum и неподдерживаемые модули ядра файловой системы. Изучайте эти особенности на дешевой машине "для хобби* или на зеркальном "резервном* сервере; вводите их в действие только после того, как вы убедитесь в удобстве их использования. Однако имейте в виду, что если ваша тестовая среда не полностью идентична рабочей машине, то вы рискуете тем, что программы не смогут работать в производственной среде, даже если они работали на тестовом стенде. • Не забывайте добавлять себя в группу "wheel* (привилегированная группа) во время инсталляции! Нет ничего хуже, чем собрать новый сервер, проехать 50 миль, чтобы добраться до места размещения физических выделенных серверов, запереть сервер на ключ в комнате, поехать к себе домой, попытаться зарегистрироваться на нем и обнаружить, что доступа-то нету. • Не оставляйте систему в "подвешенном* состоянии во время ее работоспособности. Если система проработала 350 дней, то это достойно всяческих похвал, но это также означает, что система оставалась невостребованной в течение почти одного года, или она не модернизировалась по мере выхода бюллетеней безопасности. Время работы без остановки не дает повода для хвастовства, как это может кому-то показаться. • Проверяя сервер на наличие слабых мест, старайтесь не переключать механизмы безопасности, такие как PortSentry, которые блокируют удаленный доступ из атакующего IP-адреса — может оказаться, что вы сами заблокировали свой сервер. Если вы обращаетесь к серверу из статического IP-адреса, то вам может понадобиться подобрать альтернативное место, из которого будет производиться доступ к вашему серверу, и сбросить все "черные дыры*, прежде чем вы снова сможете получить доступ к серверу из исходного места. Старайтесь знать о любом действии или ситуации, которое может привести к блокированию удаленного доступа к вашей машине. Если это произойдет, вам понадобится физически присутствовать возле компьютера, чтобы восстановить удаленный доступ. • Не применяйте команду shutdown для перехода в однопользовательский режим (для высокоприоритетных действий вроде замены ядра), если вы используете старую версию FreeBSD, в которой параметр securelevel равен 1 или больше. Использование shutdown не понизит уровень безопасности ядра. Вместо этого
658 Системное администрирование Часть IV перезагрузите машину и введите boot -ев приглашении загрузчика, чтобы загрузиться в однопользовательском режиме. Чтобы вернуться к прежней работе, просто выйдите из однопользовательской оболочки. Вы должны загрузиться и выйти из однопользовательского режима на физической консоли — ничего из перечисленного нельзя делать в удаленном режиме! Не заводите себе в привычку использовать в именах файлов пробелы. Вместо этого можно применять косую черту перед пробелом или любой другой специальный символ (например, Му\ Document.txt). Тем не менее, нет гарантии того, что программы смогут обработать такие имена должным образом. Чаще всего они смогут их обрабатывать, но все, что они примут — это сценарий оболочки, который не сможет правильно взять в кавычки вложенную командную строку, и вы рискуете тем, что ваши файлы будут удалены или перезаписаны файлами с именами вроде My и Document. txt. Не пишите Perl-сценарии или сценарии оболочки на локальной Windows-машине, загружая их затем в бинарном режиме по FTP, а не в режиме ASCII. Бинарный режим не позволяет корректно транслировать символы в конце строки, которые правильно отображаются в режиме ASCII. Хотя тело загружаемого сценария может казаться нормальным, символ возврата каретки в конце каждой первой строки (#! /usr/local/bin/perl) оболочка распознать не сможет, что приведет к сбою в работе сценария. Предпочтительным методом передачи файлов является защищенный scp, который обходит ловушки, связанные с FTP; он рассматривается в главе 30. Не используйте Telnet; вместо него применяйте SSH и полностью запретите Telnet (если это возможно), чтобы пользователи не смогли скомпрометировать себя или вас из-за слабости незашифрованного трафика, поступающего через терминал. Вопросы настройки SSH и отключения Telnet обсуждаются в главе 30. Не разрешайте использовать программу sudo без должным образом подготовленного файла sudoers, который предоставляет только те возможности административного доступа, которые действительно необходимы. СОВЕТ Если у вас возникли проблемы с программированием CGI и сценариев, которые непонятным образом отказываются работать после загрузки, проверьте сначала строку сценария #! /usr/ local/bin/perl; затем убедитесь в том, что вы выполняете загрузку в режиме ASCII. Будет еще лучше, если вы будете программировать прямо на сервере. Как раз для этой цели предназначены превосходные инструменты для редактирования текста (например, vim, pico и emacs). Настройка производительности В своей первоначальной конфигурации, принятой по умолчанию, FreeBSD оптимизирована для работы с низкоуровневым оборудованием, и должна быть чрезвычайно безопасной и надежной. Это означает, что при интенсивной нагрузке система в своем стандартном состоянии будет работать хуже, чем подобным образом экипированные серверы Linux или Windows. FreeBSD не является худшей платформой;
Курс выживания в FreeBSD I TZ7 I Глава 21 I 1 скорее, наоборот. Просто ее нужно настроить на высокую производительность. Остальные платформы, с которыми ее можно сравнить, стараются оптимизировать доя получения высокой производительности по умолчанию, за исключением низкоуровневого оборудования. Только несколько сайтов, работающих на FreeBSD-серве- рах, не настраивают систему на достижение наивысшей производительности. Настройка производительности затрагивает несколько областей системы, часть которых требует реконфигурации ядра (о чем речь шла в главе 18). В нижеследующих разделах вы увидите, как настраивается ядро и компоненты вроде дисков. Настройки ядра Если ваша машина должна будет обрабатывать чрезвычайно большие нагрузки, то вам придется настроить ядро таким образом, чтобы оно поддерживало высокие уровни трафика. Ядро GENERIC настраивается для использования рабочей станции или сервера с низкой нагрузкой, поэтому его требования к оборудованию могут быть сведены к минимуму. Высокие запросы на ресурсы ядра могут перегрузить систему, не оптимизированную для их поддержки. Чтобы оптимизировать ядро для обработки интенсивного трафика, измените настройку опции MAXUSERS, которая по умолчанию имеет значение 0 (оно свидетельствует о том, что ядру необходимо автоматически подбирать это значение). Несмотря на свое имя (MAXUSERS — максимальное количество пользователей), эта настройка на самом деле не устанавливает предельное количество пользователей, которые могут одновременно обращаться к системе. Наоборот, она задает цифру, из которой получаются остальные значения настройки; эти значения включают количество параллельных процессов, приходящихся на отдельного пользователя, и сетевые буферы памяти (или NMBCLUSTERS). Максимальное количество процессов, которые каждый пользователь может выполнить одновременно, вычисляется по следующей формуле: (MAXUSERS * 16) + 20 Если вы выяснили, что при запуске некоторых программ или выполнении некоторых задач вы получаете сообщения об ошибках типа "ргос table full* (переполнение таблицы процессов), вам следует подобрать с помощью этой формулы другое число. Точно так же, вам нужно будет присвоить параметру MAXUSERS значение от 128 до 256 (или выше) для чрезвычайно загруженных систем или серверов, которые должны обслуживать большое количество процессов или NMBCLUSTERS. СОВЕТ • Настройка nmbclusters, получаемая из формулы (maxusers * 16) + 512, контролирует количество доступных буферов памяти ("mbufs"), которые вы можете просмотреть с помощью команды netstat -m. Проверьте, используются ли буферы памяти. Если да, и повышение значения maxusers не помогает, вы можете настроить nmbclusters без привязки к maxusers. Присвойте этому параметру в ядре значение от 32768 до 65536 (или выше) для сильно загруженных систем. Добавьте строку kern.ipc.nmbclusterse"65536n в файл /boot/loader.conf, чтобы присваивать значение во время загрузки.
660 Системное администрирование Часть IV Soft Updates и асинхронные записи Одной из характеристик, позволяющих системе FreeBSD безопасно работать в системах с низкой нагрузкой, является синхронная запись, которая означает, что система должна находиться в режиме ожидания, пока не выполнится какая-либо операция записи метаданных файловой системы. Эта задержка минимизирует потенциальный ущерб для файловой системы, который может быть причинен вследствие аварийного отказа или сбоя электропитания. Однако эта мера безопасности приводит также к тому, что система работает заметно медленнее, чем сравнимые с ней платформы, и она вводит искусственные предельные параметры производительности. При желании вы можете убрать эти ограничения производительности. В разделе "Ведение журналов файловых систем и Soft Updates" главы 12 рассматривается функция Soft Updates (Плавные обновления). Это технология, посредством которой операции записи на диск могут выполняться в организованном порядке под надзором программ, увеличивая скорость выполнения дисковых операций ввода-вывода и гарантируя, что файловая система останется безопасной в случае сбоя q системе. Она позволяет также дискам выполнять "профилактические работы", не меняя основной режим работы, в фоновом процессе во время работы системы (вместо того чтобы выполняться как часть f sck). Это позволит вам быстро загрузить систему, даже если она не была выключена должным образом. Механизм Soft Updates встроен в ядро GENERIC и доступен для использования в любой момент времени. В современных версиях FreeBSD эта схема применяется по умолчанию для новых создаваемых файловых систем. Утилита Sysinstall интегрирует возможность включения и отключения Soft Updates для каждой файловой системы в редакторе Disk Label Editor (см. главу 20). Другой, более гибкий способ включения Soft Updates в файловой системе, в которой эта функция еще не работает, предлагает утилита tunef s. Система FreeBSD использует эту программу поддержки в част ном порядке для Fast Filesystem (FFS). Запустите программу tunef s в однопользовательском режиме, чтобы ее изменения вступили в силу, так как файловые системы, в отношении которых она работает (например, /usг и /var), нельзя монтировать в момент ее работы. Поскольку программа tunef s хранится в каталоге /sbin, она доступна для однопользовательского режима без монтирования каких-либо дополнительных файловых систем. Перезагрузите систему в однопользовательском режиме (введите boot -s в строке приглашения загрузчика). В строке приглашения оболочки введите следующие команды: # tunef 8 -n enable / # tunef 8 -n enable /usr # tunef s -n enable /var # tunefe -n enable /tmp Повторите команду для любых других обычных файловых систем на вашем диске. Обратите внимание на то, что в этих командных строках вам может понадобиться заменить /sbin/tunef s на tunef s. Если Soft Updates недоступна, то альтернативным вариантом решения проблемы синхронных записей будет монтирование файловых систем асинхронно, или так, чтобы операции записи не останавливали работу системных функций. Этот вариант позволит вам получить преимущество в виде заметного повышения скорости, но он
Курс выживания в FreeBSD Глава 21 не характеризуется той безопасностью, которая присуща синхронной записи. Если систему понадобится вдруг отключить в тот момент, когда выполняется операция записи, то файловая система может быть повреждена или даже разрушена без возможности восстановления. Чтобы закрыть глаза на наличие риска и смонтировать файловую систему в асинхронном режиме, используйте опцию a sync в соответствующей команде mount или в файле /etc/f stab. Команда для асинхронного монтирования, выполняемого вручную, может выглядеть примерно так: # mount -о async /usr /dev/adOslf Чтобы выполнять асинхронное монтирование автоматически, добавьте опцию async в четвертый столбец в файле /etc/f stab: /dev/adOslf /usr ufs rw, async 2 2 Соображения по поводу геометрии диска Если вас действительно интересует оптимизация производительности доступа к дискам системы, вы можете выжать из FreeBSD дополнительно несколько "лошадиных сил", распределяя ваши разделы в соответствии с их физическим месторасположением на диске. Так как данные, хранящиеся ближе к краю вращающегося диска, могут быть переданы с большей скоростью, чем данные, находящиеся ближе к центру, вы можете повысить скорость, помещая более активные файловые системы ближе к краю. Имеет значение порядок, в соответствии с которым вы определяете разделы в таблице разделов (в редакторе Disklabel Editor в программе Sysinstall). Первая запись в таблице начинается на краю диска, а последующие записи помещаются дальше и внутрь (в отличие от организации данных на компакт-диске, который, кстати, вращается с переменной скоростью в зависимости от местонахождения читающей головки—с постоянной линейной скоростью, или CVL (constant linear velocity), против постоянной угловой скорости, или CAV (constant angle velocity) жесткого диска). Доступ к корневому разделу и к разделам подкачки производится чаще всего, поэтому их следует поместить как можно ближе к краю. Небольшие файловые системы тоже будут работать лучше, если будут находиться ближе к краю, а не к центру диска. Памятуя об этом, лучше всего начинать с относительно небольшого корневого раздела, а за ним размещать раздел подкачки, имеющий вдвое больший размер, чем ваша физическая оперативная память. За ними должны следовать разделы /var, /usr и /home, которые обычно увеличиваются в размере. СОВЕТ Алгоритмы в системе UNIX, управляющие виртуальной памятью, лучше всего работают, когда раздел подкачки вдвое превышает размер доступной памяти. Например, если у вас установлено 512 Мбайт оперативной памяти, используйте 1 Гбайт для раздела подкачки. Меньший том подкачки может привести к потерям в скорости, поскольку операции по работе со страницами памяти начинают перекрывать друг друга. 661
662 Системное администрирование Часть IV Несколько настроек программы sysctl Программа sysctl управляет многочисленными переменными состояния ядра, такими как переменная kern, ipc.nrabclusters, с которой вы уже встречались раньше. Стандартные настройки для этих переменных выбираются так, чтобы система низкого класса могла работать плавно и безопасно, не показывая высокую производительность. Настройка значений, определяющих высокую производительность, выполняется путем добавления их в файл /etc/sysctl.conf, который анализируется процессом in it во время загрузки, в ходе запланированного выполнения всех сценариев из /etc/red. Отредактируйте файл /etc/sysctl.conf и добавьте какие-либо или все переменные, перечисленные в табл. 21.3, в зависимости от того, что вам необходимо. Таблица 21.3. Полезные переменные настройки ядра Переменная Описание vfs.vmiodirenable=l kern.ipc.somaxconn=8192 kern.ipc.maxsockets=16424 kern.maxfiles=65536 kern.maxfilesperproc=32768 net.inet.tcp.rfcl323=l net.inet.tcp.delayed_ack=0 kern.ipc.maxsockbuf=2 097152 net.inet.tcp.sendspace=65535 net.inet.tcp.recvspace=65535 net.inet.udp.recvspace=65535 net.inet.udp.maxdgram=57 344 net.local.stream.recvspace=65535 net.local.stream.sendspace=65535 kern.ipc.nmbclusters="65536" hw.ata.wc="l" Разрешает системе помещать в кэш большое количество каталогов. Разрешает максимальное количество ожидающих соединений. Разрешает максимальное количество сетевых сокетов. Максимальное количество файловых дескрипторов (открытые файлы, сокеты, FIFO-файлы). Максимальное количество файловых дескрипторов для одного процесса. Разрешает временные метки и масштабирование окон для RFC 1323. Запрещает поведение отложенных уведомлений TCP. Эти семь строк увеличивают размеры окон отправки/приема TCP и UDP. С их помощью можно повысить скорость и пропускную способность сети. Увеличивает максимальное количество сетевых кластеров буфера памяти. Если у вас есть диски IDE, эта переменная включает кэширование записи IDE (положительно влияет на целостность данных, хотя может негативно сказаться на производительности).
Курс выживания в FreeBSD | „- I Глава 21 I I Прежде чем вы перезагрузитесь с новым файлом /etc/sysctl.conf, вы можете воспользоваться sysctl, чтобы просмотреть значения по умолчанию тех переменных, которые уже установлены в базовой системе (некоторые из переменных могут быть не установлены): # sysctl net.local.stream.sendspace net.local.stream.sendspace: 8192 После этого вы можете вручную задать любое значение с помощью флага -w: # sysctl -w net.local.stream.sendspace=65536 net.local.stream.sendspace: 8192 -> 65536 Точно так же, вам может понадобиться задать две или три переменные в файле /boot/loader.conf, который ядро читает еще до того, как процесс init читает файл /etc/sysctl.conf. Если необходимо, чтобы переменные настройки вашего ядра были заданы как можно раньше в процессе загрузки, поместите их в файл /boot/loader.conf вместо файла /etc/sysctl.conf. Полезные страницы руководства man-страница tuning содержит богатую информацию. Этот документ представляет собой эссе, описывающее некоторые идеи, обсуждаемые нами в данной книге: вопросы геометрии диска и оптимизации файловой системы в зависимости от поступающих запросов на чтение и запись. На этой странице вы найдете также описание каждой рассмотренной нами ранее переменной настройки ядра и сможете узнать, как каждая из них влияет на работу системы. Точно так же, на man-странице tunef s можно найти подробное описание того, как с помощью команды tunef s можно воспользоваться преимуществами не только Soft Updates, но и многих других улучшений производительности, являющихся частью FFS. Наконец, man-страница sysctl содержит хорошее описание механизма работы переменной состояния ядра, и рассказывает о том, как можно воспользоваться всеми возможностями этой переменной, настраивая системные переменные во время выполнения. Готовимся к худшему: резервные копии и зеркала Независимо от того, сколько мер предосторожности вы предпримите, или сколько опыта у вас имеется за плечами, вашу систему будут пытаться взломать, ваше оборудование будет выходить из строя, или будет происходить что-то такое, что сделает ваши данные неиспользуемыми и непригодными для восстановления. Все это практически неизбежно. Единственной защитой против этого являются инструментальные средства, позволяющие полностью собирать систему "с нуля". Приготовьтесь к худшему, вспомните следствие какого-нибудь закона Мерфи, и худшее никогда не случится. Если меры предосторожности стоят того, чтобы обеспечить защиту, соблюдайте их.
I Г7Т I Системное администрирование 1 1 Часть IV Создание файлов прототипов Одним из способов, позволяющих гарантировать, что ваша специальная конфигурация устоит перед катастрофическим сбоем, является сбор коллекции файлов прототипов ("seed" file), которые вы можете использовать для настройки новой системы, собираемой вами "с нуля". Эти файлы можно хранить на внешних носителях, записывая их на компакт-диск, или, в отсутствие оптического носителя, на гибкий диск (однако следует помнить, что гибкие диски можно повредить, и они ухудшаются со временем, поэтому для обеспечения сохранности данных нужно приготовить несколько копий гибкий дисков). • /etc/rc.conf. Главный конфигурационный файл системы. • /etc/master .passwd. Главная пользовательская база данных. Все пользовательские базы данных можно генерировать из этой базы данных. • /etc/mail/freebsd.mc. "Главный конфигурационный" файл Sendmail, если у вас есть специальная конфигурация Sendmail. (Если вы присваивали ему имя, то оно может быть другим.) • /etc/f stab. Необходим для воссоздания структуры вашего диска. • /usr/local/etc/*. Индивидуальные конфигурационные файлы для всех установленных вами программ (во всяком случае, нормально работающих программ). • /etc/vinum. conf. Ваш сценарий настройки конфигурации Vinum, если вы используете Vinum (см. главу 20). СОВЕТ Если вас что-то торопит, можете просто заархивировать свои каталоги /etc и /изг/local/eic в . tbz-файлы и восстанавливать их, вместо того чтобы выбирать важную информацию из каждого файла. Впрочем, архивирование только основных элементов может облегчить миграцию на новую машину, если вам нужно восстановить систему на новой инсталлированной системе, в которой архитектура /etc отличается от архитектуры /etc в имеющейся у вас системе. Это самые важные файлы, поскольку они описывают вашу систему и придают ей индивидуальные особенности. Известно, что размер этих файлов не превышает несколько сотен килобайт; эти килобайты могут избавить вас от многодневных мучительных попыток настройки, проб и ошибок при пересборке вашей системы. Вы можете даже упаковать эти файлы в . tbz-файл и каждый день посылать их самому себе (на учетную запись, расположенную не на вашей FreeBSD-машине). Для этого вам пригодится следующая простая команда: # tar cvfz - /etc/rc.conf /etc/master, pas swd /etc/f stab /usr/local/etc | 4>uuencode seedfiles.tar.gz | mail -s "Seed Files11 me@myaccount.com Вы можете поместить ее в сценарий оболочки в /etc/periodic/ daily или в файл с г on tab суперпользователя, в зависимости от ваших предпочтений. Резервные копии Важность резервных копий переоценить трудно. Это подтвердит любой администратор. Однако не секрет, что регулярное создание резервных копий — дело уто-
Курс выживания в FreeBSD мительное, надоедливое и дорогое. Многие администраторы могут с упоением рассказывать о том, насколько важно иметь схему резервирования, хотя на самом деле ее у них нет. Как минимум, вы должны ознакомиться с различными вариантами создания резервных копий. И если вы не используете решение резервирования, то его у вас никогда и не будет, поскольку вы не знаете, как его можно выработать. На многих предприятиях существует стандартизированная процедура резервирования, предназначенная для защиты своих данных, независимо от того, на каком сервере они хранятся — Windows, UNDC или Linux. Эта процедура может включать центральное лентопротяжное устройство и программы контроллера, работающие как на центральном сервере, так и на клиентских конечных точках, функционирующих на всех остальных машинах, данные которых подлежат резервированию. Контроллер лентопротяжного устройства собирает данные по сети со всех подписанных серверов и производит запись на магнитную ленту. Эти ленты можно хранить где-нибудь в другом месте, чтобы защитить их от пожара или другого катастрофического события, в случае которого множество резервных копий и зеркал, хранящихся в пределах предприятия, могут исчезнуть бесследно. Программное обеспечение для этих решений часто нацелено на высококлассные коммерческие платформы, а доступную родную для FreeBSD конечную точку клиента можно найти довольно редко. Однако, к счастью, многие разработчики подобных программ пишут версии их конечных точек для Linux, а поскольку FreeBSD имеет бинарную совместимость с Linux, то вы можете с легкостью использовать программы, предназначенные для Linux. Например, клиент Legato для Linux в большинстве случаев работает на FreeBSD (хотя и может вести себя непредсказуемым образом). СОВЕТ Программы для Linux часто распространяются в формате "RPM", который используется диспетчером пакетов Red Hat Package Manager. Как мы уже говорили, утилита rpm доступна для FreeBSD (в каталоге /usr/ports/archivers/rpm), однако при ее использовании возникают некоторые ошибки. Например, вам нужно применять нестандартные флаги в командной строке. Флаг —nodeps позволяет утилите rmp проигнорировать отсутствующие зависимости, которые ожидаются в собственной базе данных пакетов. Флаг —pref ix«/usr/local позволяет утилите rpm помещать бинарные файлы в стандартное место в FreeBSD, а не в /usr. Флаг —ignoreos позволяет утилите rpm игнорировать факт того, что вы инсталлируете не Linux. В случае Legato родные версии программного обеспечения конечной точки предлагаются независимой компанией по производству ПО в рамках соглашения о предоставлении неподдерживаемых версий программного обеспечения для тех платформ, которые Legato явным образом не поддерживает, включая FreeBSD. Эти пакеты доступны в портах в /usr/ports/sysutils/nwclient и /usr/ports/sysutils/ nwclient602. Если версия Linux не работает, то этот вариант может вас выручить. Многие из этих специализированных решений резервирования доступны каждый день, и все чаще можно найти коммерческий пакет, который будет нормально работать в среде FreeBSD. Однако в том случае, если вам не удастся воспользоваться ни одним из этих вариантов, вы можете применить стандартные проверенные инструментальные средства резервирования/восстановления для выполнения базовых задач резервирования.
666 Системное администрирование Часть IV Использование утилиты dump Встроенная утилита UNIX dump представляет собой хороший запасной метод резервирования. Она работает на основе уровней дампа, определенных в файле /etc/ f stab (см. раздел "Файл /etc/f stab" главы 12). Уровни дампа помогают организовать хорошо проработанную систему "дельта-дампа" (delta dump), в которой вы можете подготовить один полный дамп в начале периода резервирования (например, в начале недели), а затем каждый день делать дампы только новых или измененных файлов, экономя место на ленте и время резервирования. НА ЗАМЕТКУ Имейте в виду, что поддержка системой FreeBSD утилит dump и restore зависит от файловой системы и гарантированно работает только в родных файловых системах UFS; если вы используете не родные файловые системы, например, Ext3FS или MSDOSFS, то dump и restore вряд ли будут работать должным образом. В качестве устройства для резервирования вам понадобится накопитель. Вы можете использовать накопитель на магнитной ленте (НМЛ) (по умолчанию /dev/ rsaO), внешний жесткий диск или любое устройство, которое можно смонтировать и записывать на него данные во время выполнения обычных операций. Для таких устройств резервирования, как НМЛ, всегда выбирался интерфейс SCSI — за его скорость, устойчивость и общее качество исполнения компонентов. Вам понадобится контроллер SCSI, который увеличит общую стоимость покупки. Как вариант, вы можете подождать, пока ныне популярные устройства Fire Wire (IEEE 1394) будут полностью поддерживаться системой FreeBSD, и затем воспользоваться одним из них (если вам повезет, то они уже должны поддерживаться). Однако перед покупкой проверьте, поддерживает ли FreeBSD данный НМЛ! Чтобы операции получения дампа могли выполняться, это устройство не нужно монтировать — запись будет производиться прямо на указанное устройство. Следующая команда выполняет базовое резервирование, полный дамп файловой системы /home: # dump -Ou -f /dev/nrsaO /home Опция 0 (цифра 0, а не буква О) означает выполнение дампа уровня 0 (резервирование всего, независимо от того, подлежит это резервированию или нет), а опция и означает необходимость обновления файла /etc/dumpdates — файла данных, доступного для чтения пользователю, который утилита dump читает, чтобы выяснить, нужно ли при инкрементных дампах резервировать определенные файлы. НА ЗАМЕТКУ Устройство nrsaO — это то же самое, что и rsaO, за исключением того, что оно определяет устройство без перемотки; конечно, этот синтаксис может сбить с толку, но он имеет неоспоримо полезный эффект: он указывает НМЛ-устройству не перематывать ленту до тех пор, пока не завершится задание. НМЛ, особенно с интерфейсом SCSI, используют это соглашение, чтобы передать утилите dump сведения о способе обработке ленты, как показано в табл. 21.4. Это полезно в тех случаях, когда вы выполняете групповое резервирование; если определить НМЛ без перемотки ленты, то после выполнения первой операции перемотка производиться не будет, и данные не будут перезаписаны сразу же после окончания резервирования.
Курс выживания в FreeBSD I ftfi_ I Глава 21 I I Таблица 21.4. Мета-имена устройств как управляющие опции Мета-имя устройства Эффект /dev/saO Реальное имя устройства. /dev/rsaO Указывает утилите dump перематывать ленту после завершения выполнения операций. /dev/nrsaO Указывает утилите dump не перематывать ленту после завершения выполнения операций. /dev/ersaO Указывает утилите dump извлекать ленту после завершения выполнения операций. После того как ваш дамп уровня 0 будет завершен, вы можете выполнять инкре- ментные дампы с тем же синтаксисом, но с большим номером уровня дампа: # dump -lu -f /dev/nrsaO /home Уровни дампирования обеспечивают подготовку дампа только тех файлов, которые были изменены с момента выполнения последнего дампа любого нижнего уровня. Таким образом, если вы выполняете дампирование уровня 3, а позже выполните дампирование уровня 4, то при дампировании уровня 4 будут затронуты только те файлы, которые претерпели изменения с момента выполнения дампирования уровня 3. Если вы затем выполните дампирование уровня 2, то все, что было зарезервировано при дампах уровня 3 и 4, будет зарезервировано снова. Чем ниже уровень дампа, тем больше данных будет резервироваться. Уровень 0 является "окончательным" резервированием, при котором выполняется дамп всего, независимо от предыдущих состояний дампирования. Обычно дампирование уровня 0 производится в самом начале, а затем в начале каждой недели осуществляется дампирование уровня 1, при этом на разных лентах (или наборах лент). В каждый последующий день будет производиться дампирование более высокого уровня, часто с расстановкой по типу "Ханойской башни", упоминаемой на man-странице dump. Восстановление Когда наступит время восстанавливать зарезервированные данные, вы будете использовать утилиту restore. Ее можно запускать в двух режимах: интерактивном и неинтерактивном. Интерактивный режим полезно применять для того, чтобы определить четкий набор файлов, требующих восстановления — например, если вы случайно удалили файл и хотите вернуть его обратно. Для начала измените каталог (с помощью команды cd), в который вы хотите извлечь файл, а затем войдите в интерактивную программу restore: # restore -if /dev/nrsaO В этой программе вы можете воспользоваться несколькими командами: cd, Is, pwd, add, delete и так далее. Эти команды позволяют перемещаться по файлам в зарезервированной структуре каталога ленты, просматривать их и добавлять в список (с помощью команды add). Удалить файлы из списка (но не из ленты или диска) можно с помощью команды delete. Команда extract восстанавливает с ленты любые файлы в списке сразу же после ее ввода. Полный синтаксис каждой интерактивной команды restore можно найти на man-странице restore.
668 Системное администрирование Часть IV Следующие две команды добавляют каталог frank в список извлечения, а затем извлекают его с ленты обратно на диск: restore> add frank restore> extract Как вариант, вы можете просто восстановить все данные из сеанса резервирования на ленту с помощью неинтерактивной командной строки, указав следующие опции: # re8tore -rf /dev/nrsaO Лента часто будет содержать множество сеансов резервирования данных — происходивших, например, за неделю. Одна лента может хранить резервирования за неделю — сначала полная резервная копия, а за ней — шесть инкрементных резервных копий. Если вам нужен файл из резервной копии за определенный день, потребуется подвести соответствующим образом ленту, чтобы извлечь файл из этого сеанса. Это делается с помощью утилиты mt — инструмента, манипулирующего "магнитной лентой". Когда вы в первый раз поместите ленту в накопитель, он автоматически перемотает ее в самое начало. Чтобы произвести перемотку к третьему сеансу, используйте опцию f sf ("fast forward" — ускоренная перемотка вперед) в команде mt: # mt -f /dev/nrsaO f sf 2 Здесь f sf 2 говорит утилите ускоренно перемотать два сеанса, переместившись на начало третьего сеанса. Чтобы вернуться ко второму сеансу, перемотайте ленту в начало (тоже с помощью mt), а затем ускоренно перемотайте ее еще раз: # mt -? /dev/nrsaO rewind # mt -f /dev/nrsaO fat 1 С процедурами dump и restore связано огромное множество нюансов, но рассматривать каждый из них здесь нет необходимости. Использование опции -s в команде restore в неинтерактивном режиме для определения некоторого сеанса резервирования на ленте является одной из этих процедур. К остальным относится расширенное применение утилиты mt, управление несколькими лентами, удаленными устройствами резервирования и так далее. Хороший справочник по утилитам dump и restore, описывающий эти процедуры, можно найти по адресу http:// www.nethamilton.net/dump.html. Также почитайте man-страницы dump, и restore и mt — в них вы найдете описание всех возможностей этих инструментов. Зеркала Как правило, резервные копии приводят в уныние, не правда ли? Неудивительно, что лишь немногие люди действительно проявляют к ним терпение. По крайней мере, в малом бизнесе они оказывают влияние на бюджет и время; в персональной системе, предназначенной "для хобби*, они могут показаться трудными и неоправданными. К счастью, существует и альтернативный вариант. Если у вас есть возможность совсем немного увеличить бюджет, уже позволяющий установить полноценную систему резервирования данных на магнитную ленту, вы можете создать вместо нее зеркальный сервер — еще одну FreeBSD-машину, которая будет предназначена только для ежедневной синхронизации своих файлов с файлами на главном сервере. Вы можете переписать эти файлы в то место на главном сервере, в котором что-то произошло, или переписать весь зеркальный сервер
Курс выживания в FreeBSD Глава 21 в поврежденное место на главном сервере. А какой же инструмент используется для зеркального копирования? Правильно: CVSup. В идеале ваш второй сервер должен находиться физически в другом месте, подальше от главного сервера, чтобы ваши данные были защищены даже в случае пожара, наводнения или ночной кражи со взломом. Инкрементная система резервирования CVSup делает это возможным даже при очень ограниченной полосе пропускания между этими двумя системами. Настройка решения зеркального копирования с помощью CVSup Предположим, что вы хотите создать зеркальную копию четырех структур кг- талогов: /home, /usr/ local /www, /var/mail и /etc. (В вашей ситуации вы может! сделать больше, однако для примера ограничимся этими каталогами.) Первым делом необходимо задать базовый каталог — начальную область на главном сервере, где хранятся конфигурации деревьев исходных данных. Базовый каталог позволяет cvsupd (он инсталлируется в каталог /usr/local/sbin как часть порта cvsup или пакета, который у вас уже должен быть установлен) знать, какие коллекции нужно подать клиентам, таким как ваша зеркальная машина. Введите следующие команды от имени суперпользователя: # cd /usr/local/etc # mkdir -p cvsup/вир # cd cvsup/вир # mkdir home www mail etc Теперь в каждом из этих четырех новых подкаталогов потребуется создать два файла: файл . cvs и файл releases. Эти файлы описывают "коллекциюп для сервера cvsupd и разрешают работу с ней. В подкаталоге home создайте файл home.cvs с таким содержимым: upgrade home reymlink * Затем создайте файл releases со следующим содержимым: home liet=home. eve prefix=/ Сделайте это для каждого из четырех подкаталогов, изменяя имя файла . cvs таким образом, чтобы оно совпадало с именем каталога или коллекции, и должным образом измените содержимое (www. cvs, mail. cvs и так далее). Запуск сервера cvsupd После того как закончите работу с базовым каталогом, вы можете запустить сервер cvsupd. Опция -С ограничивает количество одновременных клиентов до 1, а опция -1 (буква L в нижнем регистре) определяет, куда будет послана регистрируемая информация: # cvsupd -b /usr/local/etc/cvsup -С 1 -1 /dev/stdout 6 Работа с главным сервером завершена, поэтому вы можете перейти к вторичному серверу, который действует в роли клиента для только что заданного вами сервера CVSup. Создайте файл в каталоге /etc под именем mirror-supf ile (или под другим именем, по своему усмотрению). Содержимое этого файла должно быть таким, как пока- 669
Системное администрирование Часть IV зано в листинге 21.2, где serverl.example.com потребуется заменить именем хоста вашего главного сервера, из которого вы будете зеркально копировать содержимое. Для параметра host можно использовать простые имена хостов, полные имена доменов или IP-адреса. Листинг 21.2. Пример конфигурационного файла CVSup (mirror-supfile) ¦default ho st=*serve rl.example.com ¦default delete use-rel-suffix ¦default compress ¦default preserve ¦default base=/usr ¦default release=home home ¦default base^/usr/local ¦default release=www www ¦default base=/var ¦default release^mail mail ¦default base=/usr ¦default release=etc etc Обратите внимание на последнюю запись: это не /etc, в который вы зеркально копируете каталог /etc главного сервера, a /usr/etc. Дело в том, что /etc является уникальным для каждой машины, в которой он настраивается для нее специфическим образом; вам необходимо зеркально копировать /etc в безопасное и неактивное место, а не перезаписывать каталог /etc вашего вторичного сервера таким же каталогом главного сервера. В любом случае, это подходящий случай продемонстрировать гибкость CVSup, показывая, как можно "отметить" коллекцию файлов в любом месте на втором сервере. Запуск процесса CVSup для зеркального копирования После того как mirror-supf ile будет создан, вы можете приступить к выполнению первой операции зеркального копирования. Запустите процесс CVSup: # cvsup -L2 /etc/mirror-supfile Вам будет выведено огромное количество данных, говорящих о том, что передается и каким образом. Вы можете нажать комбинацию клавиш <Ctrl+C>, чтобы прервать операцию в любой момент времени — CVSup завершит работу без ошибок, и в следующий раз перейдет к этому месту. Этот первый процесс передачи займет очень много времени — пока будут передаваться все указанные данные из одного сервера в другой посредством каких-либо способов. А вот последующие процессы будут протекать быстро и эффективно. После передачи /usr/etc вы можете скопировать из него файл master .passwd и использовать pwd_mkdb, как уже было показано в разделе "Миграция из Linux", для 670
Курс выживания в FreeBSD I „. I Глава 21 I I синхронизации ваших пользователей (это остается в силе, даже если вы не используете Linux). Вы можете делать это автоматически, если вы обслуживаете большое количество пользователей или регулярно добавляете их; CVSup пропустит любой файл, определяемый ею как такой, который имеет ту же контрольную сумму и ту же информацию о владельце. НА ЗАМЕТКУ Информация о владельце не будет одинаковой, если пользователи в одной системе не совпадают с пользователями в другой системе! Если файл принадлежит пользователю, которого нет во вторичной системе, CVSup будет "ресинхронизировать" его всякий раз при выполнении процесса зеркального копирования, на что потребуется не больше времени, чем на передачу всего файла, но больше, чем на простой пропуск файла. Если поддерживать пользовательскую базу данных в синхронизированном состоянии и разрешить CVSup пропускать файлы, информация в которых полностью совпадает, то процесс зеркального копирования может сократиться с 4-5 часов до 15 минут. После того как процесс зеркального копирования будет работать гладко каждый раз, когда вы будете запускать его, вы можете добавить его в /etc/periodic/daily или в файл с г on tab суперпользователя, по своему усмотрению. Вы будете получать подробные выходные данные, которые будут посылаться вам каждую ночь по вашей команде. Понизьте уровень -L, если вам нужно получать гораздо меньше выходных данных. При необходимости вы можете создать больше коллекций файлов на стороне сервера; просто создайте каталоги /usr/local/etc/cvsup/sup и добавьте их в файл mirror-supfile. Перезапускать процесс cvsupd не нужно — он будет автоматически принимать новые коллекции каждый раз при подключении процесса клиента. НА ЗАМЕТКУ - Зеркальное копирование не является полной альтернативой инкрементным резервным копированиям. Это решение подойдет администратору, которому не нужен хронологический аудит, контроль изменений или внешние резервные архивы. Короче говоря, это не идеальное решение для бизнеса, использующего FreeBSD в качестве платформы для своего сервера. Зеркальное копирование предлагает быстрое и простое решение на случай внезапного катастрофического сбоя. Использовать резервные копии на магнитных лентах в бизнесе действительно нельзя, поскольку работать с ними очень утомительно.
ЧАСТЬ V Работа в сети FreeBSD В этой части: Глава 22. Принципы организации сетей на основе TCP/IP Глава 23. Конфигурирование базовых сетевых служб Глава 24. Работа в сети с помощью РРР и 802.11 Глава 25. Конфигурирование почтовых служб Глава 26. Конфигурирование Web-сервера Глава 27. Конфигурирование FTP-сервера Глава 28. Конфигурирование Internet-шлюза Глава 29. Конфигурирование сервера баз данных Глава 30. Безопасность сети Глава 31. Виртуальные частные сети (VPN) Глава 32. Сервер доменных имен Глава 33. Сетевая файловая система Глава 34. Совместное использование файлов и печати с Microsoft Windows Глава 35. Протокол динамической конфигурации хоста (DHCP)
ГЛАВА 22 Принципы организации сетей на основе TCP/IP В этой главе... • Введение в сети • Топологии сетей • Компоненты сети • Беспроводные маршрутизаторы • Сетевые протоколы • IP-адреса • Маршрутизация • Имена хостов и доменные имена • Протокол динамического конфигурирования хоста (DHCP) и автоматическая IP-адресация
Работа в сети FreeBSD Операционные системы, спроектированные для работы в сетях и для однопользовательских настольных настроек — это два стиля вычислений, которые представляли собой различные миры. Однако такое положение дел меняется. В наши дни платформа ПК, изначально ориентированная на потребителя — отдельного пользователя, развивается в сторону операционных систем, чья устойчивость и способность организовывать сети посрамит многие системы мэйнфреймов прошлого. Max OS X (с архитектурой FreeBSD и ядром MACh) и Windows 2000/XP являются примерами платформ, ориентированных на сети как на фундаментальный принцип работы, и предназначенных для замены старых систем, чьи сетевые функции были лишь дополнительным атрибутом. TCP/IP (де-факто стандартный транспортный протокол Internet) тесно интегрирован в ядра этих современных систем, как это было в системах мейнфреймов и как это есть в FreeBSD. FreeBSD — система, спроектированная изначально как сетевая. Используете ли вы ее как рабочую станцию или же в качестве сервера, скорее всего, хотя бы отчасти, ваш выбор продиктован ее сильными сетевыми возможностями. Машины FreeBSD, не имеющие доступа к сети, используются крайне редко — это можно воспринимать, скорее, как курьез. В настоящей главе вы изучите базовые принципы работы сетей в применении к FreeBSD и их роль в Internet, принципы, которые предварят все остальные темы, обсуждаемые в настоящей книге. Введение в сети Работа в сети — это способность двух или более компьютеров обнаруживать присутствие друг друга и обмениваться данными. В эпоху Internet эта базовая способность может означать многое — от простых периферийных коммуникаций до путешествия сообщений электронной почты с сервера на сервер, загрузки HTML-страниц и огромных мультимедийных файлов Web-браузерами с HTTP-серверов, а также коллективное использование МРЗ-файлов через одно ранговые (или, как их называют сейчас, "пиринговые") сети. Компьютер, включенный в сеть, обладает способностью увеличивать свою полезность помимо обычной схемы, связанной с приобретением и инсталляцией программ с CD, — постоянно и без какого-либо участия физических посредников. Наступление сетей и то, что они приносят с собой в область бизнеса и развлечений — это как раз то, что составляет суть компьютерной революции и весьма вероятно, лежит в основе вашего решения отдать предпочтение FreeBSD. В современном Internet, когда люди говорят о сетях, они в основном имеют в виду TCP/IP — Transmission Control Protocol/Internet Protocol — повсеместно распространенную архитектуру, лежащую в основе всех приложений, которые делают Internet тем, чем он есть. Происходя от созданной министерством обороны США сети ARPAnet, TCP/IP сформировал ядро систем UNIX от Bell Labs, от которых произрастает FreeBSD; это значит, что код приложений TCP/IP и комплект библиотек, присутствующих в FreeBSD, основан непосредственно на оригинальном программном обеспечении, известном как рекомендованная реализация — модели, которой следуют прочие поставщики при проектировании собственных систем на базе TCP/IP. Когда вы имеете дело с FreeBSD, вы используете одну из наиболее зрелых и устойчивых сетевых платформ, доступных на рынке сегодня. Стандартизованная модель сетевого "стека", известная под названием Opefl System Interconnection (Взаимодействие открытых систем), или OjSI, установила об-
Принципы организации сетей на основе TCP/IP Глава 22 677 Щую структуру TCP/IP. OSI диктует семь "уровней" реализации сети компьютеров, каждый из которых имеет собственную специфику и реализует собственную функциональность для пользователя, программного обеспечения, операционной системы и сетевого оборудования. В последующих главах, как и во всей сетевой отрасли в целом, вы встретите^ссылки на различные уровни стека TCP/IP, так что весьма желательно иметь общее представление о модели OSL Концептуальные соглашения модели OSI, проиллюстрированные типичным применением в Internet, показаны на рис. 22.1. Пользовательский ввод \ 5-7: Прикладной 4: Транспортный 3: Сетевой (Приложение) (Презентация) (Сеанс) TCP, UDP и так далее IP 2: Канала передачи данных 1: Физический 802.1 и так далее Enternet/IOBaseT и так далее Рис. 22.1. Диаграмма уровней стека OSI, как он используется в TCP/IP В стеке OSI данные передаются от высшего уровня (уровня пользовательского интерфейса, где они представлены в наиболее специализированной форме, позволяющей пользователю взаимодействовать с ними, применяя широкое разнообразие метафор интерфейса, таких как командные строки и оконные системы) прогрессивно вниз, до самого низкого уровня, где они имеют наиболее обобщенную и абстрактную форму — форму, которая может быть обработана очень простым сетевым оборудованием и программными протоколами. Это достигается за счет того, что на каждом уровне стека данные помещаются в "заголовки", или абстрактные уровни, позволяющие позднее декодировать их в другом стеке TCP/IP, когда данные достигают этого уровня на пути вниз. На вершине стека пользовательские приложения обрабатывают данные очень сложными способами, при этом ничего не зная о деталях механизмов передачи данных; но к моменту, когда они достигают дна стека, данные уже не являются "Web-страницами" или "электронной почтой". Вместо этого они превращаются просто в наборы единиц и нулей, которые одна карта Ethernet знает, как передать другой карте Ethernet (сама такая карта ничего не знает о маршрутизации, состоя-
Работа в сети FreeBSD ниях соединения или Web-браузерах). Средства упаковки сообщают удаленной карте Ethernet, что следует делать с данными — предназначены ли они машине, на которой эта карта установлена (в этом случае она должна передать данные вверх по стеку для декодирования и доставки), или же какому-то другому компьютеру, находящемуся где-то в данной сети или даже в другой сети, — в этом случае данные пересылаются дальше. Разные уровни стека определяют разные уровни адресации и специфики маршрутизации. Уровень IP, компонент, соответствующий "сетевому" уровню в стеке, знает, как посылать пакеты данных на другие компьютеры в Internet, определенные их IP- адресами. TCP и UDP, которые вы изучите позже — это протоколы, существующие выше в стеке, на "транспортном* уровне. Они полагаются на способности сетевых уровней доставлять пакеты, но добавляют свои собственные специфические методы управления потоками и доставкой. Ниже IP уровень "канала передачи данных" ничего не знает об IP-адресах. Все, что он знает — это аппаратные адреса других карт . Ethernet в сети. Однако поскольку информация IP встроена в каждый пакет, который получает уровень канала данных для передачи, принимающая сторона будет знать, куда далее в Internet его следует отправлять. На разных уровнях стека OSI существует много других протоколов, и каждый из них играет свою партию в направлении трафика по месту его назначения пользова* телю-получателю и обеспечении его целостности. В этой главе обсуждаются вопросы, как эти протоколы вписываются в структуру TCP/IP и как FreeBSD работает с ними. Топологии сетей Ваша машина под управлением FreeBSD может быть установлена в университетской сети, в профессиональной локальной сети, внутри корпоративной сети предприятия или в домашней сети, функционирующей по телефонной линии. И это только наиболее распространенные типы установок. Разные сетевые топологии, или логические раскладки устройств и механизмов каналов данных, столь же разнообразны, как и индивидуальные сети в мире — не бывает двух совершенно одинаковых. Однако почти все сети разделяют общую базовую топологию с несколькими фундаментальными компонентами. На рис. 22.2 вы можете видеть разновидность топологии, которую можно ветре тить в типичной домашней сети. Показанная здесь топология также может служить упрощенной диаграммой университетской сети или сети предприятия. Тип каналов глобальной сети (WAN) предназначен для работы на очень больших расстояниях. Благодаря их последовательной природе, они могут передавать трафик по той же оптоволоконной инфраструктуре, которая обслуживает стандартный телефонный сетевой трафик. Фактически трафик данных по этим линиям неотличим от цифрового голосового трафика; он трактуется точно так же телефонным коммутирующим оборудованием и может передаваться из одного географического региона в другой точно таким же способом, как это происходит с телефонным звонком. Другой тип сетевой топологии реализован у поставщиков Internet-услуг (Internet Service Provider — ISP), и он связан с первичными сетями, подобными показанной на рис* 22.2. Эта архитектура также включает вторичные WAN, которые соединяют сеть с огромным числом домашних пользователей через модемы и телефонные линии. Это иллюстрируется на рис. 22.3.
Принципы организации сетей на основе TCP/IP Глава 22 Локальная сеть Маршрутизатор Win2000 Win98 FreeBSD Linux MacOS Рис. 22.2. Базовая сетевая топология, демонстрирующая глобальную (WAN) и локальную (LAN) сети, разделенные маршрутизатором9 и объединяющая множество разнотипных компьютеров Web-сервер Почтовый Сервер сервер имен Маршрутизатор FreeBSD Коммутатор Сервер дозвона — Модемы .. . для дозвона Рис. 22.3. Сетевая архитектура ISP; домашние пользователи дозваниваются по модемам через телефонную глобальную сеть в локальную сеть ISP, которая затем подключается к Internet
680 Работа в сети FreeBSD Часть V После того, как трафик WAN достигает DSU (Digital Service Unit — цифровой модуль обслуживания) или CSU (Channel Service Unit — модуль обслуживания канала), которые соединяют линии передач телефонной компании с вашей сетевой инфраструктурой, и маршрутизатора, однако, он переходит к транспортным механизмам LAN — таким как Ethernet. Это механизмы физических каналов, которые в отличие от последовательного трафика WAN могут взаимодействовать непосредственно с любым компьютером, оснащенным картой Ethernet. На рис. 22.4 показана диаграмма пропускной способности всего пути от одной LAN до другой. Это тот путь, который обычно преодолевает Internet-трафик от сервера (такого как Web-сайт) к клиенту (пользовательскому Web-браузеру). Канал WAN, как правило, становится наиболее узким непосредственно перед тем, как поступает в маршрутизатор LAN. Глобальная сеть Г -Л. Л Локальная сеть 100 Мбит/с Маршрутизатор 1 ¦ тмШ DSL 384 Кбит/с 1.5Мбит/с 155 Мбит/с 43 Мбит/ Т1 ос-з 13 Маршрутизатор 1 Ihmih Модем 56 Кбит/с Локальная сеть 100 Мбит/с Рис. 22А. Схематическая диаграмма пропускной способности пути от одной локальной сети (на стороне сервера) к другой LAN (на стороне клиента) через глобальную сеть различной емкости Обратите внимание, что хотя трафик в середине WAN проходит по линиям с гораздо большей пропускной способностью, нежели самые быстрые LAN, эта пропускная способность делится между намного большим числом пользователей, чем типичная LAN. Тысячи, даже миллионы пользователей совместно используют самые "толстые" части канала WAN в моменты пиковых нагрузок. В локальной же сети редко когда бывает больше нескольких сотен параллельно работающих пользователей. Компоненты сети Любая сеть состоит из одних и тех же типовых компонентов. Их сложность варьируется от простых кабелей до сложнейших компьютерных устройств наподобие
Принципы организации сетей на основе TCP/IP | „. I Глава 22 I I маршрутизаторов. Каждый тип компонента существует на разных уровнях модели OSI; краткий взгляд на стек TCP/IP и его уровни поможет объяснить концептуальные отличия между концентраторами (hub), коммутаторами (switch) и маршрутизаторами (router). Как и большая часть компьютерного оборудования, выбираемые компоненты будут варьироваться по качеству й цене. Лучше всего покупать у поставщиков, чьи имена заслужили доверие — Linksys, Cisco, Intel, 3Com и Netgear — все они выпускают великолепное инфраструктурное оборудование, но без сомнений они — не единственные поставщики, которых стоит принимать во внимание. Подумайте о средствах, которые понадобятся в вашей сети. Будет ли это простая сеть 10base-T или 100base-TX? А, может, вам понадобится оборудование, работающее с обеими сетями? Нужна ли поддержка Gigabit Ethernet? Потребуются ли беспроводные соединения? Кроме того, имеет смысл уделить внимание выбору моделей, которые обеспечивают наибольшую производительность и качество при заданном уровне цены. Некоторые компоненты, однако, позволяют сэкономить — например, вы можете изготовить собственные кабели Ethernet. В этом разделе мы рассмотрим разные компоненты, которые необходимы в типичной сетевой топологии, а затем обсудим, как FreeBSD взаимодействует с ними. Кабели Преимущество Ethernet и других типов каналов LAN в том, что за весьма невысокую цену между машинами сети можно передавать данные со скоростями, которые по плечу только очень дорогим каналам WAN. Эти скорости лежат в диапазоне от 10 Мбит/с для "стандартного" Ethernet, 100 Мбит/с для Fast Ethernet, 1 Гбит/с для Gigabit Ethernet и до 10 Гбит/с для самого быстрого из современных стандартов — 10 Gigabit Ethernet. Таких скоростей можно достигать на дешевых кабелях и компонентах, что превращает сетевое взаимодействие между компьютерами через Ethernet в одной удовольствие по сравнению с низкоскоростными WAN. Недостаток же заключается в том, что Ethernet не может работать на большие расстояния. Поскольку сигналы не сериализуются и не передаются посредством оборудования, спроектированного для поддержки дальней передачи, они деградируют по мере увеличения длины кабеля. Кабель типа витой пары Наиболее часто используемым кабелем на сегодняшний день является неэкрани- рованная витая пара (unshielded twisted pair — UTP), что объясняется относительной простотой и низкой стоимостью таких кабелей и сетевых компонентов. Кабели UTP соединяют компьютерные интерфейсные сетевые карты (network interface card — NIC) непосредственно с концентраторами и коммутаторами без потребности в повторителях и терминаторах, и могут быть плотно скручены или натянуты между труднодоступными областями. Такие сети создаются из недорогих компонентов с применением широкодоступных инструментов, а для физического подключения используются похожие на телефонные разъемы RJ-45. Обжимные щипцы RJ-45 можно приобрести в любом магазине электроники, равно как и соединители RJ-45 и кабели UTP. В следующем разделе будет дана информация о распайке соединителей.
Работа в сети FreeBSD НА ЗАМЕТКУ Кабели типа витой пары отличаются по качеству, и некоторые типы предназначены для более высоких скоростей, чем другие (имея при этом, соответственно, более высокую цену). Рейтинг качества может быть выражен в поддерживаемой скорости, уровне шума (вспомним еще такие важные факторы, как затухание, уровни искажения и потери возврата), или категории соответствия. Если для нужд вашей сети понадобится высокопроизводительное оборудование (напри- мер, если вы собираетесь передавать данные на скоростях, превышающих 100 Мбит/с), стоит потратить дополнительные деньги на качественные кабели, такие как САТ5е или САТб. Прямые и перекрестные кабели Существуют два типа кабелей витой пары — прямые (straight-through) и перекрестные (crossover). Разница состоит в положении двух пар проводов в кабеле. Тип соединяемых устройств определяет, какой из этих двух типов кабелей вы должны использовать. Устройства с разъемами RJ-45 можно считать устройствами типа "компьютера" или "концентратора**. Компьютеры, маршрутизаторы, контроллеры полосы пропускания и другие устройства "конечной точки" рассматриваются как устройства компьютерного типа и все они разделяют один и тот же тип соединения. Концентраторы и коммутаторы — это устройства типа концентратора, которые тоже разделяют общий тип соединения. Прямые кабели Ethernet используются для подключения устройств компьютерного типа к устройствам типа концентратора, а перекрестные — для подключения компьютеров к компьютерам или концентраторов к концентраторам. Здесь действует следующее правило: применять прямые кабели между разнородными устройствами, а перекрестные •— между подобными устройствами. Прямые кабели вы используете для подключения разнородных устройств, как в следующих случаях. • Для подключения компьютера к концентратору. • Для подключения компьютера к коммутатору. • Для подключения маршрутизатора к концентратору. Перекрестные кабели используются для подключения похожих устройств, как в следующих примерах. • Для соединения концентратора с концентратором. • Для соединения концентратора с коммутатором. • Для соединения компьютера с компьютером (например, чтобы эмулировать режим "смертельной битвы" для двух игроков). Порты каскадирования Исключением из правила подключения кабелей Ethernet является порт "каскадирования" (uplink port) на концентраторах. Этот специальный порт подключается так, как если бы устройство было компьютерного типа, так что вы можете подключить порт каскадирования концентратора к стандартному порту другого концентратора через прямой кабель. Такая необходимость возникает в больших сетях, когда очень длинный прямой кабель должен подключаться к крупному концентратору или коммутатору предприятия (находящемуся/например, в серверной комнате) и проходит сквозь стены и трубопроводы, чтобы выйти в другую комнату. Этот кабель не может быть под-
Принципы организации сетей на основе TCP/IP Глава 22 683 ключей непосредственно к стандартному порту меньшего концентратора; он должен быть включен через адаптер и короткий перекрестный кабель, чтобы передавать данные этому меньшему концентратору. Замена кабеля Ethernet длинным перекрестным кабелем была бы непрактичной. Поэтому появился порт каскадирования — порт, позволяющий подключить концентратор непосредственно к другому концентратору, для которого замена кабеля на перекрестный была бы нежелательной. Помните, однако, что соединение двух портов каскадирования концентраторов между собой требует перекрестного кабеля — и такая конфигурация в любом случае предпочтительна. Как определить — является ли кабель Ethernet прямым или перекрестным? Это исключительно легко: Возьмите в руки два конца одного кабеля. Если последовательность цветов проводов одинакова, — это прямой кабель. Если же какие-то проводки находятся в разном порядке, — это перекрестный кабель. Расположение проводов в прямом кабеле показано на рис. 22.5. Чтобы сделать перекрестный кабель, поменяйте местами позиции пары 3 (провода 1/2) и пары 2 (провода 3/6), как показано на рис. 22.6, обжимая второй конец. Концентраторы Один конец кабеля подключается к Ethernet-карте вашего компьютера, это понятно. Однако другой конец также должен к чему-то подключаться. Хотя их роль в последнее время несколько потускнела с появлением недорогих коммутаторов, выполняющих те же функции, все же простейшим подключаемым устройством для этой цели является концентратор (hub). .* V пара 2 1 I 2 I 31 4 5 6 I71 8 параЗ RJ-45 Соединители 1 и 2 Прямой Рис. 22.5. Диаграмма расположения проводов прямого кабеля
684 Работа в сети FreeBSD Часть V f / • / </ </ </ • 3 л па 6 ? раЗ 1 I л 4J 5 V пара 2 2 ? 7 [в RJ-45 Соединитель 2 Перекрестный Рис. 22.6. Диаграмма расположения проводов перекрестного кабеля Концентраторы — это устройства с множеством портов RJ-45 (обычно от 4 до 24), к которым вы можете подключить столько же кабелей Ethernet. Эти кабели могут соединять компьютеры, другие концентраторы, коммутаторы или при необходимости другие сетевые компоненты. Стоимость концентраторов колеблется в пределах от 20 до нескольких сот долларов, в зависимости от качества, количества портов и способности оперировать параллельно устройствами lObase-T и 100base-TX. Многие концентраторы могут работать только на одной из этих скоростей; самонастраиваемый концентратор (часто называемый NWay) может работать на любой скорости, но ощутимо дороже. Концентраторы отличаются размерами — от маленьких, не больше ладони (или даже меньше) коробочек до полных 19-дюймовых, монтируемых в стойке узлов, и все они требуют источника питания. Некоторые концентраторы даже являются "управляемыми" — в том смысле, что вы можете подключиться к ним через Telnet и настроить возможности каждого порта через интерфейс командной строки. Такие концентраторы естественно, стоят намного дороже, чем неуправляемые. Концентратор — это, по сути, повторитель (repeater), у которого весь трафик проходит одновременно через все порты, поэтому компьютер, подключенный к одному порту концентратора, может видеть трафик других компьютеров, подключенных к тому же концентратору. Один порт концентратора обычно резервируется для порта каскадирования — для связи с другим концентратором, с коммутатором или маршрутизатором, находящимся выше в сетевой иерархии, как было показано на рис. 22.1. Этот порт "каскадирования" обычно подключен так, что перекрестный кабель не требуется между концентратором и его следующим вышестоящим устрой-
Принципы организации сетей на основе TCP/IP Глава 22 ством. Упомянутый порт и один из стандартных портов могут быть соединены так, что будут взаимоисключающими. Пятипортовый концентратор может предоставлять возможность подключения пяти компьютеров между собой (игнорируя порт каскадирования), или трех компьютеров к вышестоящему устройству (игнорируя пятый стандартный порт). Это поведение можно организовать аппаратно — физическим включением кабелей, или же оно может управляться кнопками или DIP-переключателями, полярность может определяться автоматически, или же все порты могут использоваться параллельно. Это лишь некоторые из возможных вариаций между различными концентраторами. Другое обстоятельство, которое усложняет способ коммуникации концентраторов с другими устройствами — это "дуплексный" режим, в котором они работают. В полудуплексном режиме хост может быть только "слушающим" или же только "говорящим" в одно и то же время. Полнодуплексный режим использует вдвое больше проводов, позволяя хосту одновременно "говорить" и "слушать". Таким образом, 100- мегабитный канал Fast Ethernet в полнодуплексном режиме может транспортировать до 100 Мбит/с в обоих направлениях одновременно, в то время как тот же канал в полудуплексном режиме может давать такую производительность только в сумме для двух направлений. Концентраторы можно считать дешевой заменой коммутаторов, о которых мы поговорим ниже. Поскольку стоимость коммутаторов падает почти до уровня стоимости концентраторов, возможно, вскоре мы станем свидетелями полного перехода отрасли на использование коммутаторов, а концентраторы уйдут в прошлое. НА ЗАМЕТКУ Если в вашей сети присутствуют устройства 100base-T, вы не можете использовать концентраторы — Gigabit Ethernet требует применения коммутаторов, а Gigabit-совместимые коммутаторы существенно дороже, чем концентраторы начального уровня. Это одна из причин, по которым Gigabit Ethernet пока используется только в бизнесе или университетских сетях, и не используется дома. Коммутаторы Коммутатор (switch) — еще одно устройство, соединяющее вместе устройства Ethernet. Коммутатор выглядит как концентратор, но стоит дороже и обычно имеет меньше портов. Он имеет множество портов RJ-45, размеры от ладони до стойки, и те же компании, что делают концентраторы, производят и коммутаторы, так что их довольно-таки легко спутать на магазинной витрине. Они даже работают в некотором смысле похоже — вы можете включить множество устройств в коммутатор, и коммутатор, используемый в сети вместо концентратора, обычно даст тот же результат. Разница между коммутаторами и концентраторами является тонкой, однако существенной, У концентратора все порты разделяют одно и то же внутреннее соединение. Все компьютеры, подключенные к концентратору — непосредственно или через другой концентратор — существуют в области, называемой областью коллизий. В области коллизий сигнал, посланный одному компьютеру, попадает ко всем компьютерам внутри этой области. Дело Ethernet-карты каждого компьютера — идентифицировать сигналы, адресованные данному компьютеру и отбрасывать все прочие. 685
Работа в сети FreeBSD Внутреннее соединение коммутатора намного сложнее, чем у концентратора. Каждый порт имеет свой собственный уникальный путь подключения к общей системной плате и образует собственную область коллизий, а хосты, подключенные к одному порту, не могут видеть никакого трафика, предназначенного хостам на любом из других портов. Коммутаторы оснащены программным обеспечением, необходимым для чтения каждого заголовка пакета Ethernet, выделенным адресом MAC (уникальным идентификатором каждой Ethernet-карты, о котором мы поговорим позже) и может определить, к какому порту подключен хост, которому адресован пакет. Для выполнения этой работы коммутатор хранит кэш ARP (Address Resolution Protocol - протокол преобразования адресов), представляющий собой таблицу для указания того, какие хосты на каких портах находятся. Управляемые коммутаторы, подобно управляемым концентраторам, обладают полными интерфейсами командной строки и возможностью конфигурирования, сопровождаемой более высокой ценой и сложностью. Существуют даже коммутаторы VLAN, которые соединяют множество LAN вместе, используя многообразные кабельные механизмы. СОВЕТ Коммутатор часто можно ввести в заблуждение, переключив компьютер с одного порта на другой, поэтому в таких случаях может понадобиться выключить и включить его, чтобы очистить кэши ARR Поскольку каждый порт коммутатора имеет собственную область коллизий, коммутируемый сетевой трафик может в более полной мере использовать преимущества доступной пропускной способности сети. Чтобы проиллюстрировать сказанное, возьмем концентратор. Восьмипортовый концентратор lOObase-TX со всеми используемыми портами делит доступные 100 Мбит/с между всеми восемью портами. Если все восемь портов одновременно пытаются выполнять задачи, интенсивно нагружающие сеть, и их общая потребность в полосе пропускания превышает 100 Мбит/с, "коллизии" начинают возникать намного чаще. При коллизии два порта пытаются передать или принять трафик одновременно, в результате чего происходит повторная передача на уровне физического канала и производительность падает ниже логически доступных 100 Мбит/с. Коммутаторы смягчают эту проблему. В то время как 100-мегабитный концентратор имеет 100 Мбит/с внутренней пропускной способности в сумме, восьмипортовый коммутатор имеет в сумме 800 Мбит/с — то есть полную удвоенную пропускную способность для каждого порта. Вот почему коммутаторы обычно имеют меньше портов, чем концентраторы, а коммутаторы со многими портами достаточно дороги, особенно для Gigabit Ethernet (чьи коммутаторы часто оснащены операционными системами, почти такими же сложными, как FreeBSD). Коммутируемые сети и безопасность Полностью коммутируемые сети предоставляют дополнительное преимущество, что машины в одной области коллизий не могут видеть никакого трафика в других областях коллизий. До тех пор, пока каждый хост подключен к своему собственному порту коммутатора, никто в сети не может перехватывать чужой трафик.
Принципы организации сетей на основе TCP/IP 1 „_ Глава 22 I Коммутаторы также защищают вашу сеть от разрушения в результате действий одного хоста, который засоряет ее агрессивным трафиком, будь то внутренним или внешним, который захватывает всю пропускную способность внутри области коллизий. Использование коммутаторов вместо концентраторов наряду с тщательным планированием сети может значительно повысить сетевую надежность, безопасность и производительность, оправдывая, таким образом, дополнительные затраты. Коммутаторы обычно не имеют портов каскадирования. Иногда один или два порта имеют кнопки для переключения типа кабеля — прямой или перекрестный. Это применяется в некоторых двухпортовых коммутаторах, которые служат простыми фильтрами, отсекающими ненужный трафик. В качестве общего правила следует трактовать порты коммутатора как устройства типа концентратора и использовать перекрестные кабели для подключения одного коммутатора к другому либо прямой кабель для подключения коммутатора к порту каскадирования концентратора. Большинство коммутаторов могут автоматически согласовывать скорость и дуплексный режим Ethernet-карт, так что вам обычно не стоит беспокоиться. Маршрутизаторы Маршрутизатор (router) — наиболее сложное (и дорогое) из всех сетевых устройств. Маршрутизаторы оснащены полноценными операционными системами и поддерживают таблицы для отслеживания местонахождения целых IP-сетей. Большинство небольших сетей имеют только один маршрутизатор — на "границе" сети (имеется в виду граница между LAN и WAN, которая соединяет ее с Internet), специфицируя, какие номера сети указывают LAN, а какие должны отправляться в WAN. Вы можете иметь в своей сети любое число маршрутизаторов, каждый из которых управляет подсетью и подчиняется маршрутизатору высшего уровня. Более того, маршрутизаторы по всей сети Internet используют разнообразные протоколы для подключения их друг к другу и выбора наилучшего маршрута доставки пакета из одного места в другое. Когда вы отправляете пакет, он путешествует от одного маршрутизатора к другому, пока не достигнет маршрутизатора, который знает, куда его направить, чтобы найти сеть назначения этого пакета. Маршрутизатор посылает ваш пакет по нисходящему маршруту, пока он не достигнет целевой LAN и, в конечном итоге, хоста назначения. Маршрутизация — основа Internet, и возможно, наиболее сложная часть работы сетей TCP/IP. Подробнее о маршрутизации вы узнаете из главы 28. СОВЕТ Маршрутизацию в действии можно увидеть, выполнив команду trace route; просто введите в командной строке traceroute хмя_хоста, чтобы получить список маршрутизаторов между вами и указанным хостом вместе с информацией о том, насколько быстро каждый маршрутизатор реагирует. Это также полезно для того, чтобы увидеть, насколько хорошо настроены маршрутизаторы между вами и целевым хостом. Ниже показан пример: # traceroute freebsd.org Трассировка маршрута к freebsd.org [216.136.204.21] с максимальным числом прыжков 30 и пакетами 40 байт: > 1 14 ms 11 ms 15 ms c2-l-l.sub-14.volia.net [85.202.192.1] 2 12 ms 11 ms 11 ms v55.po2.agate.volia.net [82.144.193.85]
688 Работа в сети FreeBSD Часть V 3 4 5 6 7 8 9 10 11 12 13 14 12 ms 51 ms 51 ms 61 ms 61 ms 143 ms 139 ms 137 ms 223 ms 217 ms 215 ms 217 ms 13 ms 54 ms 52 ms 50 ms 58 ms 140 ms 144 ms 144 ms 214 ms 220 ms 216 ms 216 ms 15 ms 54 ms 52 ms 48 ms 60 ms 152 ms 142 ms 167 ms 216 ms 220 ms 226 ms 220 ms pfts-gw.volia.net [82.144.192.182] so-2-0-0-zprl.dcx.cw.net [62.208.252.73] ge_0-i-o-zprl.dcx.cw.net [62.208.242.106] asO-dcrl.fra.cw.net [195.2.10.157] so-4-0-0-dcrl.par.cw.net [195.2.10.142] so-0-0-0-dcrl.was.cw.net [195.2.10.117] so-0-0-0-dcrl.ash.cw.net [195.2.0.218] exchange-custl.dc2.equinix.net [206.223.115.16] so-0-0-0.patl.pao.yahoo.com [216.115.101.128] ge-2-0-0-p212,msr2.sc5.yahoo.com [216.115.107.25] ge-l-3.basl.sc5.yahoo.com [66.163.161.66] freefall.freebsd.org [216.136.204.21] Большинство маршрутизаторов имеют один или два порта со стороны LAN — либо с разъемами RJ-45, либо порт AUI, требующий трансиверое (transceiver) — устройств, транслирующих сигнал из одного физического формата в другой — для преобразования интерфейса в витую пару. С другой стороны маршрутизатора находится последовательный кабель, который соединяет DSU/CSU или другой подобный высокоскоростной последовательный преобразователь (конвертер), за которым находится трафик WAN. Маршрутизаторы значительно отличаются по размеру, сложности, количеству и типу портов, управляемости и цене. Понимание работы маршрутизаторов — это одна из важнейших вещей, которые вам нужно изучить в мире сетей. Если вы не хотите тратить деньги на выделенный маршрутизатор, можете сделать его "дешево и сердито" из любого компьютера, на котором запущена FreeBSD, используя методы, описанные в главе 28. Беспроводные маршрутизаторы Беспроводные маршрутизаторы, также известные, как беспроводные точки доступа или базовые станции, — это в действительности несколько сетевых устройств одновременно. Они включают в себя все, что мы описали до сих пор — от механизмов подключения компьютеров к сети (беспроводной концентратор или коммутатор) до механизма маршрутизации для передачи трафика следующему маршрутизатору. Поскольку обычно они недороги (менее $200), беспроводные маршрутизаторы не обладают полным набором возможностей полноценных промышленных маршрутизаторов; так как большинство этих устройств предназначены для включения в домашнюю или корпоративную сеть, они выполняют минимум необходимых обязанностей для передачи ваших компьютерных коммуникаций вышестоящему маршрутизатору на пути в Internet (например, кабельный модем или корпоративная LAN). Протокол IEEE 802.11 — это стандарт беспроводных коммуникаций LAN. В настоящее время широко используются два варианта этого протокола: 802.11b (со скоростью передачи 11 Мбит/с) и 802.1 lg (со скоростью 54 Мбит/с). Устройства 802.1 lg более распространены сегодня, по причине более высокой скорости и способности поддерживать больше параллельно работающих пользователей, чем устаревший 802.11; однако все компьютеры вашей беспроводной сети должны поддерживать 802. llg, иначе сеть возвращается к 802.11b, как к наименьшему общему знаменателю.
Принципы организации сетей на основе TCP/IP Глава 22 НА ЗАМЕТКУ 802.11а — вариант протокола, поддерживавшего коммуникации 54 Мбит/с, был популярен наряду с 802.11Ь, но он делал это, используя выделенную радиочастоту 5 Ггц вместо 2.4 Ггц, разделенную такими устройствами, как микроволновые печи и беспроводные телефоны. Более высокая частота позволяла избежать пересечения частоты с упомянутыми устройствами, но в то же время прохождению сигнала на этой частоте препятствовали стены и он имел намного меньший диапазон. 802.11 g сочетает скорость 802.11а с диапазоном 802."Mb, взяв лучшее от обоих; однако это означает, что вашему сигналу может помешать применение беспроводного телефона с частотой 2.4 Ггц. Не завися от физических кабелей, беспроводная сеть обладает дополнительным фактором сложности по сравнению с проводной — безопасностью. Беспроводной маршрутизатор может быть настроен так, чтобы требовать пароля для разрешения подключения компьютера к сети. Он также может использовать шифрование, такое как WEP (Wired Equivalent Privacy — приватность, эквивалентная проводной сети) либо его более строгий наследник — WPA (Wi-Fi Protected Access — защищенный доступ Wi-Fi) или WPA2, чтобы гарантировать невозможность декодирования беспроводных коммуникаций злоумышленником, который может скрываться поблизости, вооруженный портативным компьютером с беспроводной картой. Многие компании с солидной репутацией выпускают отличные беспроводные маршрутизаторы: D-Link, Netgear, Linksys и Apple; все они предлагают хорошо зарекомендовавшую себя и легкую в эксплуатации продукцию. Некоторые устройства (вроде AirPort Express от Apple) даже обладают такими дополнительными средствами, как аудио-выход, позволяющий подключать их к стереосистеме, так что вы можете передавать ей музыку по воздуху. Типичная цена колеблется от 100 до 200 долларов или больше, в зависимости от набора возможностей; однако если вам позволяет бюджет, и вы обладаете определенной смелостью, можете настроить компьютер FreeBSD в качестве беспроводного маршрутизатора, используя методы, описанные в разделе "Конфигурирование точки беспроводного доступа в Internet" главы 28. Сетевые протоколы Ранее уже упоминалось, что большая часть трафика Internet — HTTP, электронная почта, FTP и тому подобное — использует TCP/IP в качестве транспортного протокола. Сам термин TCP/IP означает комбинацию наиболее распространенных "сетевых* и "транспортных* протоколов, используемых в Internet. IP (Internet Protocol — протокол Internet) — это основа подавляющего большинства Internet-трафика, то есть "сетевой" уровень стека TCP/IP. TCP (Transmission Control Protocol — протокол управления передачей), однако, не является единственным распространенным протоколом "транспортного" уровня. Существует еще UDP (User Datagram Protocol — протокол передачи дейтаграмм пользователя), отличающийся от TCP в нескольких ключевых моментах. IP — также не единственное средство управления трафиком на "сетевом" уровне; он имеет множество аналогов, но они более удобны для применения только в LAN. Среди них AppleTalk, IPX, NetBIOS и тому подобные. Имеется еще ICMP (Internet Control Message Protocol — протокол управляющих сообщений Internet), который существует частично на "сетевом" уровне, частич-
Работа в сети FreeBSD Часть V но — на "транспортном**; это механизм, с помощью которого работают утилиты ping и traceroute. Мы поговорим подробнее о каждом из этих протоколов ниже. Протокол управления передачей (TCP) TCP — двунаправленный протокол передачи, спроектированный специально как надежный — не в субъективном смысле, а как описание специфических характеристик его архитектуры. В отличие от UDP, TCP оснащен множеством встроенных средств для обеспечения правильной доставки трафика по назначению. Он также имеет средства разбиения крупных пакетов на фрагменты такого размера, чтобы передача шла более эффективно. TCP использует повторную передачу (retransmission) для обеспечения надежности. Вот как работает упрощенная версия повторной передачи: когда пакет TCP отправляется по сети, период таймаута (три секунды при инициализации соединения) устанавливается отправителем, который затем ожидает пакета подтверждения (АСК) от противоположной стороны. Когда он получает АСК, отправитель приступает к отправке следующего пакета. Если отправитель не получает АСК за время указанного таймаута, он знает, что либо его пакет не дошел, либо на обратном пути был потерян пакет подтверждения. Отправитель повторяет отправку пакета и снова ждет АСК. Это и есть повторная передача. Система продолжает попытки до тех пор, пока не исчерпает установленный лимит неудач (обычно пять), после чего разрывает соединение. Подключение TCP включает активную процедуру настройки, во время которой оба хоста в конечных точках соединения обмениваются стартовыми маркерами; отключение в конце сопровождается подобным обменом. Это значит, что в отличие от UDP, потоки TCP могут быть аккуратно отслежены системой, и их состояние можно просмотреть, используя такой инструмент, как nets tat. TCP обладает множеством других интересных средств вроде двунаправленной полезной загрузки (ответ на данные, полученные в пакетах АСК), контрольной суммы для подтверждения целостности данных в пакете, автоматической фрагментации пакета и последующей его реконструкции, а также восстановления порядка на уровне приемника. Существуют также вещи, которые UDP не может делать — по крайней мере, не должен. TCP используется в протоколах, в которых целостность данных важна и соединение может быть гарантирована, например, при Web-серфинге, передаче электронной почты, FTP и в подавляющем большинстве других сетевых приложений. Протокол передачи дейтаграмм пользователя (UDP) UDP — "транспортный" протокол, подобный TCP и существующий на том же уровне стека модели OSI; однако, он отличается от TCP по многим ключевым параметрам. Главное, что следует помнить об UDP — это то, что он ненадежен. В нем отсутствует механизм подтверждения, нет механизма повторной передачи, и даже нет концепции "соединения". Пакеты UDP могут передаваться любому участнику сети, если так выбрано, или же определенному множеству получателей, независимо от того, готовы ли они слушать что-либо. Перехват пакетов и их обработка лежат на совести получателей. Пакеты UDP могут теряться на пути от отправителя получателю, и не существует никакого способа узнать о потере. В UDP не существует последовательной нумерации пакетов, как в TCP. Отправитель просто продуцирует трафик, а указанные по- 690
Принципы организации сетей на основе TCP/IP I ftQ1 I Глава 22 I б91 I лучатели могут получить его или не получить — это зависит от них и от сети. Любая надежность потока UDP должна быть добавлена приложениями, использующими его; примером является протокол сетевой файловой системы (Network File System — NFS), который детально рассматривается в главе 33. НА ЗАМЕТКУ Почему такие протоколы управления файлами и передачи, как NFS, которые очевидно нуждаются в абсолютной целостности данных, используют UPD? Причина состоит в том, что с NFS многие хосты в сети могут применяться в качестве NFS-ресурсов, и любой их них может покинуть сеть без предупреждения. Вместо поддержки обработки всех накладных расходов, необходимых для удержания соединений TCP с этими эфемерными хостами, для NFS в качестве транспорта выбран UDP, а необходимое для передачи файлов обеспечение целостности данных выполняется на уровне приложений. Информация о завершении передачи содержится в данных пакетов, поэтому сам протокол NFS может знать, когда потеряны какие-то части или когда они повреждены. Главное применение TJDP в наши дни — потоковые медиа. Телеконференции, потоковое видео, трансляция музыки — для этих протоколов не страшно, если они потеряют какой-то кусочек. Они состоят из длинных потоков дейтаграмм (пакетов), обычно очень маленького размера, которые собираются в порядке их получения приложением и затем выталкиваются на экран или динамик. Один потерянный пакет, возможно, даже и не будет замечен. Если происходит перегрузка сети, пакеты просто теряются на уровне маршрутизатора (маршрутизаторы поддерживают собственные таймауты для своих буферов), и поток возобновляется в реальном времени, когда хост вновь становится доступным, и не возобновляется в противном случае. Нет причин накапливать все потерянные пакеты и выталкивать их потом все сразу — в этом нет смысла. В том-то и состоит полезность UDP: скорость и простота, когда надежность не слишком важна. Протокол управляющих сообщений Internet (ICMP) ICMP — это компактный "диагностический" протокол, в основном используемый в инструментах, измеряющих "здоровье" сети. Некоторые рассматривают ICMP как находящийся на сетевом уровне и являющийся эквивалентом IP и IPX; другие трактуют его как транспортный протокол вроде TGP или UDP. Правда в том, что он имеет элементы и того, и другого. Сообщения, принятые ICMP, обрабатываются на "сетевом" уровне, но эти сообщения строятся для взаимодействия с программами "транспортного" уровня, поэтому трудно сказать, куда его следует отнести в приведенной схеме. Наиболее распространенные способы использование ICMP — в инструментах ping и trace route; оба они возвращают информацию, фундаментальную для структуры дейтаграмм ICMP. Большей частью они встроены в способность ICMP опрашивать удаленные хосты для получения временных меток и эха, которые возвращаются обратно вместе со специализированными кодами. ICMP может также применяться для предоставления сообщений об ошибках протоколам "транспортного" уровня таким как ошибка типа "Port Unreachable" (Порт недоступен), возвращаемая Ю Р отправителю UDP, пытающемуся обращаться к недоступному порту маши* ы получ - теля. ICMP может сообщать о 16 ошибочных состояниях, и имеет примерно столь-
Работа в сети FreeBSD ко же дополнительных функций. Обычно вам не нужно знать о них, поскольку они представляют интерес только тем приложениям, которые могут их прочитать. Чтобы увидеть, как TCP, UDP, ICMP и другие протоколы вписываются в модель OSI, лучше всего обратиться к книге Сети TCP/IP, том 1. Принципы, протоколы и структура, написанной Дугласом Камером (ИД "Вильяме", 2003 год). Эта книга — незаменимое дополнение к библиотеке любого сетевого администратора. В ней раскрываются все важные детали зависимостей протоколов друг от друга и их взаимодействия, а также представляются ключевые концепции в понятной и доступной манере. IP-адреса Протокол IP позволяет компьютерам во многих разных LAN находить путь друг к другу; это достигается благодаря иерархической системе IP-адресов. Если вы когда- либо хоть что-то делали в Internet, то вероятно, знакомы с IP-адресами — по крайней мере, знаете, как они выглядят. IP-адрес обычно используется как способ обращения к специфическому компьютеру в Internet, хотя его смысл намного богаче, чем "один IP-адрес на машину". В более широком смысле, это логическое обозначение, чья цель — найти машину в Internet, так чтобы IP-маршрутизаторы смогли направить трафик между этой и любой другой машиной. IP-адрес — это строка из 32 бит в IP-заголовке, которая специфицирует либо машину, от которой поступил пакет, либо машину, которой он адресован (в заголовке присутствуют оба адреса). 32 бита можно воспринимать и как четыре 8-битных байта, каждый из которых выражает число от 0 до 255 — отсюда знакомая нотация из четырех десятичных чисел, разделенных точками в форме 111Л 12.113Л14. Это позволяет трактовать адрес иерархически, имея дело в подсетями классов А, В или С, как будет описано ниже. Существует несколько "специальных" IP-адресов, о которых следует помнить. Во- первых, это адрес сети. Это IP-адрес, в котором один или более байт установлено в ноль — как в 64.41.131.0. Если завершающий байт равен нулю, этот адрес — синоним сети 64.41.131, и обычно используется при конфигурировании маршрутизаторов. Более важно, если один или более хвостовых байт равны 255 (все биты установлены в 1). Это широковещательный адрес сети — адрес, соответствующий всем хостам сети, определенный в виде маски. Например, 64 .41.131.255 соответствует всем хостам сети 64 . 41.131 .ххх, а 64 . 41.255 .255 — всем хостам сети 64 .41 .ххх.ххх. Пакет, отправленный по широковещательному адресу, будет принят и обработан все ми хостами сети, что удобно для обнаружения хоста сети, имеющего определенный адрес Ethernet. Чуть позже мы обсудим, как работает это сопоставление адресов, ког- да будем говорить о маршрутизации и подсетях. Подсети и маски сети Маска сети (или сетевая маска), которая идет рука об руку с IP-адресами при конфи- гурировании TCP/IP на машине — одна из наиболее непонятых частей всей структуры, и потенциально одна из наиболее элегантных, если хорошенько разобраться с ней. Назначение сетевой маски — просто сообщить маршрутизатору или хосту, что пакет должен быть направлен в сеть, в котором он находится, или же направлен вверх — к следующему маршрутизатору. Когда маршрутизатор принимает IP-пакет и
Принципы организации сетей на основе TCP/IP | T7I I Глава 22 I I должен решить, что с ним делать, он проверяет IP-адрес назначения пакета по его собственной маске. Сетевая маска, 32-битная строка, подобная IP-адресу, обычно принимает форму 255.255.255.0 (то есть комбинация полей 255 и 0). Предположим, что у вас есть маршрутизатор, управляющий сетью 64.41.131. ххх. Маршрутизатор принимает пакет, адресованный 64.41.131.45. Этот адрес в двоичном формате сравнивается с сетевой маской с применением операции логического "И", при этом результирующий бит устанавливается в 1, только когда оба соответствующих бита слагаемых адресов равны 1: 0100 0000 0010 1001 1000 ООН 0010 1101 (64.41.131.45) + 1111 1111 1111 1111 1111 1111 0000 0000 (255.255.255.0) 0100 0000 0010 1001 1000 Q011 0000 0000 (64.41.131.0) В результате получается 64.41.131.0, то есть адрес сети, которой управляет ваш маршрутизатор. Таким образом, данный пакет подходит и передается этой сети по Ethernet целевой машине. Затем приходит другой пакет, предназначенный 64.41.189.45: 0100 0000 0010 1001 1011 1101 0010 1101 (64.41.189.45) + 1111 1111 1111 1111 1111 1111 0000 0000 (255.255.255.0) 0100 0000 0010 1001 1011 1101 0000 0000 (64.41.189.0) Результат не соответствует адресу сети маршрутизатора, поэтому он отправляет этот пакет дальше — следующему маршрутизатору. Этот механизм позволяет устанавливать подсети в пределах вашей сети. Предположим, что у вас есть диапазон адресов класса В, с которым нужно работать (64. 41 .ххх.ххх). Главный маршрутизатор вашей сети, R1, управляет всем этим диапазоном, но вы можете установить маршрутизатор (R2) внутри этой сети для управления двумя диапазонами адресов класса С: 64.41.131.ххх и 64.41.132.ххх. Хосты в сети 64.41.131 могут включаться в тот же концентратор, что и хосты сети 64.41.132, как показано на рис. 22.7, но они не смогут непосредственно "разговаривать" друг с другом, если их сетевые маски установлены в 255.255.255.0 — маску класса С. IP-адреса назначения в отправленных пакетах не будут соответствовать маске сети отправителя. Однако если хост-отправитель (HI) в подсети 64.41.131 установит свою сетевую маску в маску класса В (255.255.0.0), то адреса будут соответствовать, и отправитель сможет послать пакет непосредственно Н2 (хосту в подсети 64.41.132). Однако обратите внимание, что Н2 не сможет ответить непосредственно HI, поскольку его сетевая маска не позволит этого! Он должен будет посылать ответ обратно через R2, который имеет несколько сетевых адресов и подсетей, привязанных к его внутреннему интерфейсу. Вы должны будете установить сетевую маску Н2 в255.255.0.0, чтобы он мог говорить напрямую с HI, не обращаясь к маршрутизатору. Сетевые маски не обязательно должны быть выровнены по границам байта. По этой причине иногда они специфицируются в простом шестнадцатеричном формате (например, OxffffffOO вместо 255.255.255.0), как в выводе команды if con fig в системе FreeBSD. Например, вы можете специфицировать сетевую маску OxffffffcO, или 255.255.255.192. Эта маска соответствует сети из 64 хостов — от 1 до 64. Другая нотация, используемая для специфицирования сетей, включающих маску — CIDR (Classless Inter-Domain Routing — бесклассовая междоменная маршрутизация), принимающая форму сетевого адреса, за которым идет косая черта, и количество
694 Работа в сети FreeBSD Часть V бит, составляющих маску. Например, маска 255.255.255.0 вашей сети 64.41.131 должна быть записана как 64.41.131/24, поскольку маска состоит из трех 8-битных байт, в которых все биты установлены в 1 (или 24 бита). Пример 255.255.255.192, таким образом, соответствует нотации 64 .41.131/26. Эту нотацию можно встретить в таблицах маршрутизации и других местах, где желательна краткость. 64.41.131-ххх R2 *—J 64.41.132.ххх Н1 Концентратор Н2 Рис, 22,7. Сеть с подсетями, демонстрирующая путь прохождения пакетов между двумя хостами, чьи сетевые маски не позволяют им общаться непосредственно Работа с IP-адресами Как правило, один IP-адрес привязывается к одному физическому порту (или интерфейсу) на карте Ethernet; но это лишь потому, что так принято, и вы при желании можете привязать множество IP-адресов к одной карте. Единственное ограничение заключается в том, что два интерфейса Ethernet в одной сети не могут разделять один и тот же IP-адрес. Каждый интерфейс должен иметь как минимум один уникальный IP-адрес, чтобы правильно функционировать. Вы можете решить инсталлировать две Ethernet-карты в вашей системе, чтобы, к примеру, иметь доступ к двум разным сетям одновременно, или чтобы один адрес был привязан к Ethernet-карте, в то время как другой ссылался на вашу беспроводную карту 802.11. Многие Ethernet-карты имеют множество портов, и каждый может иметь один или более адресов, назначенных ему. Выбор вашей конфигурации зависит от того, как построена ваша сеть. IP-адрес любой из ваших Ethernet-карт и других сетевых интерфейсов вашей системы можно определить, используя утилиту ifconfig, как показано на листинге 22.1. Опция -а показывает все устройства; можно также специфицировать ко» кретный интерфейс (вроде х10). В строке inet отображается сконфигурированный IP-адрес; интерфейс х10 в этом примере показывает множество IP-адресов, привязанных к одной карте.
Принципы организации сетей на основе TCP/IP Г Глава 22 L Листинг 22.1. Типичный вывод ifconfig I ifconfig -a xlO: flags=8843<UP, BROADCAST, RUNNING, SIMPLEX, MULTICAST> mtu 1500 Inet 64.41.131.102 netmask OxffffffOO broadcast 64.41.131.255 inet6 fe80::201:2ff:fe55:1256%xl0 prefixlen 64 scopeid 0x1 inet 209.154.215.246 netmask TJxffffffff broadcast 209.154.215.246 ether 00:01:02:55:12:56 media: autoselect (lOObaseTX) status: active supported media: autoselect lOObaseTX <full-duplex> lOObaseTX ^10baseT/UTP <full-duplex> lObaseT/UTP lOObaseTX <hw-loopback> lpO: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 gifO: flags=8010<POINTOPOINT,MULTICAST mtu 1280 gifl: flags=8010<POINTOPOINT,MULTICAST^ mtu 1280 gif2: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 gif3: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 loO: flags=804 9<UP,LOOPBACK,RUNNING,MULTICAST^ mtu 16384 inet6 fe80::l%lo0 prefixlen 64 scopeid 0x7 inet6 ::1 prefixlen 128 inet 127.0.0.1 netmask Oxff000000 pppO: flags=8010<POINTOPOINT,MULTICAST mtu 1500 slO: flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 552 faithO: flags=8000<MULTICAST> mtu 1500 IP версии 6 (IPv6) Различные группы, такие как проект КАМЕ (http://www.kame.net), недавно трудились над включением поддержки следующего поколения IP (версии 6, или IPv6) в FreeBSD. IPv6 предусматривает 128-битное адресное пространство, с адресами в действительности в четыре раза большими по размеру, чем в IPv4 (современная версия). В результате получается адресное пространство, которое вместит 3.4x10А38 хостов — число, которое вряд ли будет скоро достигнуто. Кроме того, в IPv6 также включено множество других усовершенствований, таких как встроенное шифрование и аутентификация, дифференциация подключений (с метками потока), полная автоконфигурируемость хостов, а также исключение некоторых устаревших частей IPv4, которые уже не используются. IPv6 внедряется очень и очень медленно. Построение сетей обходится дорого и перевод их на IPv6 в общем означает замену существующего оборудования новым, более дорогостоящим и менее зрелым. Очень немногие компании пока способны решится на этот скачок. А между тем FreeBSD уже имеет полную поддержку IPv6, и может воспользоваться преимуществами различных сетевых ресурсов, уже доступных для IPv6. Работа с сетями на уровне Ethernet Каждый хост уникально идентифицируется в локальной сети не своим IP-адресом который не имеет никакого смысла на уровне Ethernet), а тем, что называют физическим адресом, аппаратным адресом, адресом Ethernet или адресом MAC (Media \ccess Controller — контроллер доступа к среде). Каждое устройство сетевого интереса имеет запрограммированный в нем на заводе МАС-адрес — уникальный, имею-
Работа в сети FreeBSD щий форму вроде 00:01:02:55:12:56. МАС-адрес, как теоретически предполагается, должен служить "отпечатком пальца", идентифицирующим Ethernet-карту (и соответственно — компьютер), поскольку в идеале больше ни одна Ethernet-карта в мире такого же адреса не имеет. (На практике это не совсем так, потому что МАС-адрес можно подделать.) Для МАС-адресов не существует такого механизма маршрутизации, какой есть для IP-адресов. Он действует исключительно на уровне физического канала в LAN и не может быть передан маршрутизатору. ARP, протокол преобразования адресов (Address Resolution Protocol), отображает IP-адреса на адреса MAC. Если ваше приложение жел&ет послать пакет на IP-адрес 10.5.6.100, оно отправляет пакет вниз по стеку к уровню физического канала передачи данных. Там стек заглядывает в кэш ARP — таблицу уровня операционной системы, хранящей отображения IP-адресов на МАС-адреса. Если стек никогда ранее не посылал пакет на 10.5.6.100, этого адреса не будет в таблице ARP, и стек TCP/IP тогда должен будет выполнить запрос ARP. Запрос ARP — это широковещательный пакет, адресованный всем Ethernet-картам в LAN (с установкой МАС-адреса назначения Bff:ff:ff:ff:ff:ff, или всех его байт в значение 255, как и в широковещательном IP-адресе). Полезной нагрузкой пакета является IP-адрес, который нужно найти: 10.5.6.100. Каждая машина в сети принимает этот пакет, но только машина с указанным IP-адресом отвечает, сообщая отправителю свой МАС-адрес. После того как стек принимает этот ответ, его IP-адрес и МАС-адрес записываются в ARP-кэш отправителя для будущего использования. Затем пакет посылается TCP/IP-стеком машины-отправителя в сеть только по МАС-адресу получателя. НА ЗАМЕТКУ Ранее в этой главе мы уже говорили немного о том, как коммутаторы хранят свои собственные внутренние ARP-кэши. Теперь, зная как работает ARP, вы можете видеть, каким образом коммутаторы могут помочь в отслеживании того, какие хосты на каких портах находятся, за счет использования ARR Коммутатор выполняет свои собственные запросы ARP, чтобы определить, где искать хост, которому он должен отправить полученный им пакет. После того как он добавляет информацию ARP в свой собственный кэш, он может направлять весь будущий трафик по этому адресу значительно быстрее. Маршрутизация между сетями с использованием ARP и МАС-адресов ARP очень эффективен в определении того, какие пакеты куда должны направляться в LAN; но что если машина, которой адресован пакет, не находится в одной сети с отправителем? Здесь вступают в действие маршрутизаторы. Маршрутизатор принимает и отвечает на пакеты АКР, как любой хост. Когда маршрутизатор просматривает свои привязки IP-адресов, чтобы решить, должен ли он ответить на пакет ARP, однако, он обнаруживает, что его внутренние маршруты установлены так, чтобы посылать все, за исключение трафика, предназначенного LAN, которой он управ ляет, в WAN — вышестоящему маршрутизатору. Стек TCP/IP маршрутизатора рассматривает это как требование, чтобы маршрутизатор имел нелокальный IP-адрес, привязанный к его Ethernet-карте в LAN. До тех пор пока рассматривается маршру-
Принципы организации сетей на основе TCP/IP | T7Z I Глава 22 I I тизатор, он и есть тем компьютером, который вы ищете, и отвечает на ARP, будучи таковым. Ниже перечислены шаги, которые выполняются в процессе перемещения пакета в Internet от одного хоста к другому. • Хост желает послать пакет хосту с IP-адресом, принадлежащим удаленной сети, поэтому отправляет запрос ARP о машине с этим IP-адресом. • Локальный маршрутизатор-шлюз, имеющий все нелокальные IP-адреса, привязанные к его МАС-адресу, отвечает, что он и является хостом назначения. • Ethernet-карта хоста-отправителя посылает пакет маршрутизатору. • Маршрутизатор заменяет МАС-адрес отправителя в заголовке пакета на свой собственный МАС-адрес, а затем отправляет пакет по WAN. • Следующий маршрутизатор в WAN принимает пакет и выполняет аналогичную операцию, устанавливая в нем свой МАС-адрес в качестве МАС-адреса отправителя и отсылая его дальше; так происходит до тех пор, пока пакет не достигнет маршрутизатора со специфическим правилом маршрутизации для IP-сети, содержащей хост назначения. • Конечный маршрутизатор принимает пакет, определяет по IP-адресу назначения и своей собственной сетевой маске, что пакет предназначен для машины в его собственной сети, и использует ARP для нахождения машины-получателя. • Маршрутизатор заменяет МАС-адрес получателя пакета, чтобы он соответствовал этому адресу хоста-получателя, а затем посылает пакет непосредственно по LAN. Проверка содержимого кэша ARP командой агр ARP обрабатывается прозрачно приложениями и стеком TCP/IP; вероятно, вы никогда не инициировали самостоятельно команды ARP. Однако существуют некоторые случаи, когда необходимо "пощупать" кэш ARP. Содержимое этого кэша можно проверить, используя команду агр -а: • агр -а w001.sjc-ca.dsl.cnc.net (64.41.131.1) at 0:0:c5:7c:7:f0 [ethernet] w013.sjc-ca.dsl.cnc.net (64.41.131.13) at 0:30:65:a4:9a:5e [ethernet] w063.sjc-ca.dsl.cnc.net (64.41.131.63) at ff:ff:ff:ff:ff:ff permanent "*> [ethernet] Позиции в кэше ARP удаляются после длительного таймаута, но бывают моменты, когда вам может понадобиться очистить кэш вручную. Некто в сети может инсталлировать на своей машине новую Ethernet-карту и привязать старый IP-адрес к новому МАС-адресу, что сделает его недостижимым, если старая комбинация все еще остается в вашем кэше. Вы можете удалить позиции в кэше по имени, по IP-адресу, или же все сразу (с опцией -а): • ахр ~dw001.ejc-ca.dsl.cnc.net • агр -d 64.41.131.13 • агр -d -a
698 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Команда агр может оказаться полезным инструментом для отслеживания серверов-злоумышленников DHCP, которые предоставляют некорректную IP-информацию хостам в динамически выделяемой памяти. Если ваш хост получает плохой IP-адрес, введите команду агр -а для нахождения МАС-адреса сервера DHCP. Хорошо управляемая сеть имеет каталог всех своих машин с их МАС-адресами, так что вы сможете найти машину злоумышленника по выводу команды агр. Даже если каталог MAC недоступен, МАС-адрес может помочь вам сузить поле поиска машины- нарушителя; используя первые три сегмента строки адреса, МАС-адреса указывают на определенного производителя Ethernet-карт, что может привести вас к конкретному компьютеру. Маршрутизация Вы уже немного узнали о том, как работает маршрутизация IP, а теперь мы раскроем эту тему более детально. Правильное конфигурирование маршрутов — один из важнейших навыков при проектировании и развертывании сети, и следует научиться выполнять его корректно, или хотя бы иметь представление о том, как выполняются административные задачи, требующие взаимодействия с таблицей маршрутизации, такой как port sent r у (которая обсуждается в главе 30). Маршрутизатором является любое устройство, настроенное на работу в качестве такового, включая специальные выделенные устройства, поставляемые Cisco и его конкурентами, или же обычные компьютеры, которые могут выполнять эту работу. Маршрутизаторы работают, поддерживая таблицу маршрутов — набор правил, сообщающих, куда должны быть отправлены пакеты, отвечающие определенным критериям IP-адресов. Поскольку FreeBSD может быть сконфигурирована как маршрутизатор, давайте рассмотрим для примера ее таблицы маршрутизации, используя для этого команду netstat - г п (- г требует OTnetstat отобразить таблицы маршрутизации, а -п — разрешать IP-адреса в имена хостов): # netstat -rn Routing tables Таблицы маршрутизации Internet: Destination Назначение default 64.41.53.101/32 net-64-40-lll.netn ip3.example.com ip4.example.com ip6.example.com ip6.example.com hsrp-gw.netnation. 64.77.63.139/32 Toronto-ppp218408. localhost goo.cs¦und.nodak.e Gateway Шлюз hsrp-gw.netnation localhost link#l 0:50:ba:b3:98: 0:50:ba:b3:95: 0:1:2:55:12:56 localhost 0:0:c:7:ac:le localhost localhost localhost localhost 13 bb Flags Флаги . UGSc UGScB UC UHLW UHLW UHLW UGScB UHLW UGScB UGScB UH UGScB Refs Ссылки 126 0 0 2 0 0 0 119 0 0 45 0 Use Исполь. 1379327 3 0 357107 2272 118941 0 8814 0 0 45210727 0 Neti f Интерфейс xlO loO xlO xlO xlO loO loO xlO loO loO loO loO => => Expire Истечете 735 500 405
Принципы организации сетей на основе TCP/IP Глава 22 Каждая строка этого вывода представляет собой правило. Правило маршрутизации специфицирует определенное место назначения и что должно быть сделано с трафиком, отправляемым в это место. Информация в таблице маршрутизации включает следующие поля для каждого правила. • Destination (Назначение). Это может быть IP-адрес, имя хоста, сетевой адрес (который FreeBSD отображает в формате CIDR, как можно видеть в предыдущем примере), или одно из нескольких специальных мест назначения вроде "маршрута по умолчанию" (default). Это поле соответствует адресу места назначения любого пакета, подлежащего маршрутизации. • Gateway address (Адрес шлюза). Это адрес следующего маршрутизатора, куда должен быть направлен трафик для специфицированного места назначения. Это может быть имя хоста или IP-адрес, либо для случая LAN это может быть МАС-адрес. FreeBSD также показывает вход для шлюза link#l, который является маршрутом, соответствующем сети первичного сетевого интерфейса, от которого во время использования могут клонироваться новые маршруты (отсюда и флаг С). • Flags (Флаги). Это поле специфицирует тип маршрута. Каждая буква представляет отдельный флаг, так что этот пример показывает маршруты, снабженные от двух до пяти одновременно используемыми флагами. Читайте в man nets tat описание значения каждого флага. • Network interface (Сетевой интерфейс). Когда пакет соответствует маршруту в таблице, он передается через этот указанный интерфейс. IP-маршрутизация произросла из распределенной адаптивной защиты сетевых коммуникаций, представленной ARPA; таким образом, ее назначение — динамически обновлять эти таблицы маршрутов в соответствии с условиями сети. Крупные телекоммуникационные концентраторы поддерживают громадные таблицы маршрутизации, со многими альтернативными связями между любыми местами назначения. Когда выясняется, что один маршрут недоступен, таблица маршрутизации перебирает варианты, пока не трафик не будет направлен по работающему маршруту. В результате получается система, в которой ни один маршрутизатор не должен знать ничего о маршруте назначения пакета кроме фрагмента, ведущего к следующему маршрутизатору. Любой адрес, не являющийся локальным (другими словами, любой адрес, не находящийся в сети, управляемой данным маршрутизатором), передается дальше, следующему маршрутизатору, и так далее, пока пакет не достигнет маршрутизатора, имеющего явный элемент в своей таблице маршрутизации — с соответствующей сетевой маской — для сети, соответствующей IP-адресу места назначения пакета. В этой точке пакет направляется на этот интерфейс в надежде попасть в место назначения (однако он может еще пройти несколько маршрутизаторов, каждый со своим более специфичным правилом, по нисходящему пути к сети хоста назначения). Неверная конфигурация маршрута IP-маршрутизация восприимчива к ошибкам в конфигурации. По пути вверх пакет движется до тех пор, пока не найдет явное совпадение своего адреса назначения. Маловероятно, чтобы он не мог достичь несущего уровня (уровня "хребта") без каких-либо инцидентов по причине того, что некто явно добавил поддельное правило в таблицу с целью перехвата пакета на его пути вверх по цепочке маршрутизаторов. Однако после того как пакет начинает движение вниз к месту назначения, 699
Работа в сети FreeBSD каждый маршрутизатор на его пути должен быть правильно сконфигурирован, чтобы направить его в сеть назначения, о которой вышестоящий маршрутизатор "думает", что данный маршрутизатор в состоянии это сделать! Пакет может начать свой путь вниз, только чтобы обнаружить, что маршрутизатор, который, как предполагалось, содержит дальнейший маршрут к месту назначения, на самом деле не имеет его. Естественно, без явной маршрутизации пакета он отправит пакет обратно вышестоящему маршрутизатору, который затем снова отправит его вниз, запустив таким образом то, что часто называют "петлей маршрутизатора": Трассировка маршрута к example.com (209.237.26.189) с максимальным числом прыжков 30 и пакетами 40 байт 1 r2-72-core-van.nx.com (10.10.4.253) 101.878 ms 135.377 ms 85.218 ms 2 dis2-atml.in.nx.net (206.108.110.189) 132.023 ms 80.653 ms 81.686 ms 3 core2-l.in.nx.net (206.108.101.45) 102.365 ms 61.537 ms 68.561 ms 4 core2.in.nx.net (206.108.102.209) 79.989 ms 109.389 ms 115.587 ms 5 bx3-pos5-0,in.nx.net (206.108.102.202) 86.434 ms 109.678 ms 129.128 ms 6 seal-nx.above.net (208.184.233.73) 91.201 ms 67.287 ms 79.369ms 7 core2.above.net (208.185.175.178) 74.219 ms 79.480 ms 93.121 ms 8 sjc2.sjc2.above.net (216.200.127.117) 188.692 ms 212.627 ms 181.123 ms 9 corel.above.net (208.184.102.25) 195.260 ms 194.973 ms 272.053 ms 10 mainl.sjcl.aboVe.net (208.185.175.246) 344.104 ms 318.313 ms 11 corel.above.net (208.184.102.25) 195.260 ms 194.973 ms 272.053 ms 12 mainl.sjcl.above.net (208,185.175.246) 344.104 ms 318.313 ms 13corel.above.net (208.184.102.25) 195.260 ms 194.973 ms 272.053 ms 14 mainl.sjcl.above.net (208.185.175.246) 344.104 ms 318.313 ms 15 corel.above.net (208.184.102.25) 195.260 ms 194.973 ms 272.053 ms 16 mainl.sjcl.above.net (208.185.175.246) 344.104 ms 318.313 ms 17 corel.above.net (208.184.102.25) 195.260 ms 194.973 ms 272.053 ms 18mainl.sjcl.above.net (208.185.175.246) 344.104 ms 318.313 ms Такая бурная деятельность будет продолжаться, предотвращая правильную доставку пакетов, до тех пор, пока нижестоящий маршрутизатор не исправит свои таблицы маршрутов, добавив соответствующее правило и позволив пакетам продолжить свой путь вниз вместо того, чтобы "пинать" их обратно вверх. К счастью, обычно когда подобное случается, причиной служит неправильно работающий маршрутизатор, и эта ситуация временная и разрешается сама собой, когда восстанавливаются таблицы обратных (то есть вверх) маршрутов. Шлюзы и преобразование сетевых адресов Шлюз — это маршрутизатор для специфической сети, часто используемый для преобразования адресов, используемых хостами в LAN, управляемой им, в адреса, видимые внешнему миру. Термин шлюз (gateway) часто используется в смысле маршрутизатора, и это не ошибка; мы должны точно прояснить его значение в совреме№ ном техническом языке. Когда вы конфигурируете настройки TCP/IP машины, вы должны указать шлюзд Это просто маршрутизатор следующего уровня для конфигурируемой машины. HI и Н2 — каждый имеет конфигурированный шлюз, так что они могут работать с хостами, чьи адреса не соответствуют их сетевым маскам. Обычно в топологии тако> го типа шлюзом должен быть R2. В зависимости от типа маршрутизатора, HI и Н2 могут быть не в состоянии достичь R1 напрямую. Важно рассмотреть сбойные ситуации. Если R2 должен быть выключен, то вряд ли он сможет передать непосред-
Принципы организации сетей на основе TCP/IP I ZTI I Глава 22 I I ственно трафик LAN через себя; некоторые сетевые устройства переходят в режим сквозной передачи, но маршрутизаторы нечасто попадают в эту категорию. В сетевой топологии другого типа подсети, определенные R2, могут полностью отличаться от подсети R1; например, R1 может специфицировать сеть 64.41, но R2 должен контролировать подсети в 192.168.10 и 192 • 168.11. В этом случае для HI и Н2 в качестве шлюза R1 вообще не устанавливается; трафик просто не достигает его. Наилучшей практикой обычно является установка для вашей машины ближайшего маршрутизатора в качестве шлюза и обеспечение его правильной конфигурации для пропуска трафика к вышестоящему маршрутизатору и управляемой им подсетям. НА ЗАМЕТКУ Определенные диапазоны сетевых адресов "зарезервированы" для специфических частных применений и не могут быть назначены хостам в открытых сетях — данные просто не достигнут их. Эти диапазоны включают 10. ххх. ххх. ххх и 192.168. ххх.ххх, которые обычно используются в подсетях и топологиях NAT и рекомендованы для внутренних сетей. Однако традиционное назначение шлюза — быть "пограничным устройством", то есть точкой, в которой трафик LAN передается в WAN. Это устройство, обычно маршрутизатор, также выполняет преобразование сетевых адресов (NAT). Демон NAT на маршрутизаторе специфицирует псевдонимы для внутренних маршрутов и их преобразованные адреса для внешнего мира и наборот. NAT может выполняться в манере "один к одному", "много к одному" и "один ко многим". Чтобы использовать FreeBSD в качестве маршрутизатора NAT, потребуется сконфигурировать и запустить демон natd. Мы обсудим его в деталях в главе 28. Имена хостов и доменные имена Теперь, когда вы имеете представление о способах работы адресов MAC и IP, можно добавить еще один уровень обмена в процесс нахождения хостов: имена хостов и систему доменных имен (Domain Name System — DNS). Имена хостов назначают читабельные для человека имена машинам, которые в противном случае идентифицируются только своими IP-адресами, a DNS — механизм, посредством которого это присваивание осуществляется. На ранних этапах истории TCP/IP разные сетевые машины идентифицировались только их IP-адресами. Это работало действительно хорошо, до тех пор, пока количество людей, находящихся в онлайне, выросло настолько, что отслеживание всех этих цифр, составляющих адреса, стало слишком утомительным и подверженным ошибкам — никто не хотел иметь дело с громадными списками IP-адресов с описанием машин, которым они принадлежат. Поэтому появилась система доменных имен (DNS) — средство назначения обычных имен IP-адресам, что привело к намного более удобной в использовании системы, с которой вы имеете дело на сегодняшний день. Записи DNS хранятся в централизованной базе данных на множестве корневых сер- Щт— 13 "главных" серверов имен, содержащих окончательную информацию DNS для всей сети Internet. Они поддерживаются в разных корпорациях и университетах, расположенных по всем Соединенным Штатам. Эти серверы берут свою информацию от DNS-хостов, которые официально выделены как центры авторизации любого данного доменного имени (например, example.com). Каждый официальный центр
I ZTT I Работа в сети FreeBSD 1 1 Часть V DNS домена хранит записи в собственной базе данных, которая варьируется от реализации к реализации. FreeBSD, как и большинство систем UNIX, использует BIND, которая хранит свои записи в /var/named/etc/namedb. Мы поговорим о том, как настроить DNS в FreeBSD в главе 32. Внутри домена каждая машина из перечисленных в записях DNS имеет имя хоста или простое имя машины — такое как tiger или pluto. В комбинации с доменом, оно порождает полное квалифицированное доменное имя (Fully Qualified Domain Name — FQDN) вроде tiger. example. com. НА ЗАМЕТКУ f- Доменное имя также может быть полностью квалифицированным без прикрепленного к нему субдомена или имени хоста. Имя хоста example.com — это полностью квалифицированное доменное имя, и ему может быть назначен IP-адрес машины. Что важно понимать в работе сетей — так это то, что иерархическая структура доменного имени, имени хоста и FQDN никак не связана с иерархическими соглашениями IP-адресации. Домен example.com может иметь хосты с IP-адресами из всего возможного диапазона — конфигурация DNS только должна их корректно указать. Например, www. example • com может иметь адрес 64 ¦41.131.45, a ftp. example.com- адрес 213.11.31.221; это не имеет значения, когда речь идет о TCP/IP. DNS находится полностью за пределами стека TCP/IP. DNS вступает в игру на уровне приложения, где имя хоста используется в качестве более удобного интерфейса для пользователя, чем простой IP-адрес. Web-браузер, например, берет имя DNS и передает его операционной системе, которая прозрачно преобразует его в IP-адрес даже перед тем, как она пытается соединиться с запрошенным хостом. Чтобы вернуться к терминам, используемым на протяжении этой главы, можно сказать, что абстракция, которую DNS предоставляет поверх IP- адресов, является аналогом абстракции, которую IP-адреса предоставляют поверх МАС-адресов. Точно так же, как ARP ассоциирует адреса IP и MAC для использования на уровне канала данных, поиск имен ассоциирует имена хостов с IP-адресами для использования на уровне сети. Протокол динамического конфигурирования хоста (DHCP) и автоматическая IP-адресация Протокол динамического конфигурирования хоста (Dynamic Host Configuration Protocol — DHCP) присваивает IP-адреса Ethernet-интерфейсам по мере надобности. Когда интерфейс должен быть конфигурирован DHCP, во время загрузки он посылает запрос выделенному серверу DHCP Этот запрос, который на самом деле является запросом RARP (аналог ARP, но работающий наборот), доставляет МАС-адрес интерфейса в запросе к серверу DHCP, который отвечает, сообщая IP-адрес (и другие сетевые настройки наподобие маски сети), который, как он знает, доступен в данный момент. Загружающийся хост затем присваивает этот адрес интерфейсу, а DHCP-сервер устанавливает для него период "аренды", так что хост может загружаться с одним и тем же IP-адресом на постоянной основе. Тема DHCP и конфигурирование FreeBSD для него раскрывается в главе 35.
ГЛАВА 23 Конфигурирование базовых сетевых служб В этой главе: • Конфигурирование сетевой карты • Конфигурирование сетевых настроек с помощью Sysinstall • Конфигурирование сетевых настроек без Sysinstall • Создание IP-псевдонимов • Отображение имен на IP-адреса в файле /etc/hosts • Тестирование сетевого соединения с помощью ping • Конфигурирование DNS в файле /etc/resolv. conf • Обзор других конфигурационных файлов сети
Работа в сети FreeBSD В предыдущей главе был представлен краткий курс по работе в сетях TCP/IP. Ничего из того, о чем было рассказано (или очень немногое), не является специфичным для FreeBSD, и также ничего не было сказано о настройке вашей системы для нормальной работы в сети. Однако в предыдущей главе был заложен фундамент для изучения информации, представленной в настоящей главе. Здесь вы узнаете о различных инструментах, которые можно применять для конфигурирования TCP/IP. В настоящей главе мы не будем говорить о специализированных сетевых службах (вроде Web/HTTP, mail/SMTP, FTP и так далее); эти темы раскрываются индивидуально в последующих главах книги. А пока мы сосредоточимся на основах: как заставить машину обращаться к другим машинам вашей сети. Конфигурирование сетевой карты Как вы узнали в предыдущей главе, компьютер может иметь несколько Ethernet- карт (интерфейсов), и каждая из этих карт может иметь несколько IP-адресов и связанных с ними настроек. Существует соглашение о наличии одной Ethernet-карты с одним IP-адресом в каждой машине, но у вас нет никаких причин ограничиваться этим. В настоящей главе будет показано, как настроить столько параллельно установленных карт, сколько вы сочтете нужным. Прежде всего, нужно убедиться, что у вас есть хотя бы одна карта Ethernet, с которой может работать FreeBSD. В табл. 23.1 перечислены все карты (точнее говоря, наборы микросхем ("чипсеты") — карты от разных производителей часто используют стандартизованные наборы микросхем, распознаваемые FreeBSD), которые поддерживаются ядром GENERIC. Эти карты составляют подавляющее большинство применяемых в наши дни, и ваша система должна распознавать любую из них без какого-либо дополнительного вмешательства. В частности, карты PCI хорошо распознаются FreeBSD. Еще довольно много карт поддерживаются FreeBSD, но не включены в ядро GENERIC; драйверы для этих карт обычно доступны в виде модулей ядра, которые при необходимости автоматически загружаются при запуске системы. Например, драйвер an (для набора микросхем Aironet Wi-Fi) доступен как /boot/ kernel/if_an.ko. Обратитесь к /sys/conf /NOTES (как описано в разделе "Файлы NOTES и LINT" главы 18) и перекомпилируйте ядро для включения поддержки вашей карты, если хотите сократить время запуска системы и ее стабильность за счет исключения загрузки модулей ядра. НА ЗАМЕТКУ Будьте готовы к тому, что список поддерживаемых Ethernet-карт достаточно часто меняется. Устройства перечислены в конфигурационном файле ядра generic вашей системы, /sys/i386/conf/ generic. Это наиболее авторитетный источник списка карт, поддерживаемых вашей системой. Большинство карт Ethernet для оборудования х86, имеющиеся сегодня на рынке, основаны на PCI. Это значит, что PCI-контроллер автоматически обрабатывает всю адресацию и вам не нужно ничего делать с циркуляцией адресов IRQ/DMA/памя- ти, характерной для карт ISA, последняя из которых появилась в конце 90-х годов прошлого века. Однако если вы столкнетесь с одной из этих старых карт, вам придется сделать несколько вещей вроде установки адреса памяти карты и IRQ с помощью DOS-утилиты, а также модификации подсказки устройства для этой карты. Подробнее о настройке подобного рода будет сказано далее в настоящей главе, во врезке "Как справиться с Ethernet-картами IS#\
Конфигурирование базовых сетевых служб Глава 23 705 Таблица 23.1. Карты Ethernet, поддерживаемые в стандартном (GENERIC) ядре FreeBSD Имя устройства Поддерживаемые карты Карты PCI de em ixgb txp vx DEC/Intel DC21x4x (Tulip) Intel PRO/1000 карта адаптера Gigabit Ethernet Intel PRO/1 OGbE Ethernet Card 3Com 3cR990 (Typhoon) 3Com 3c590, 3c595 (Vortex) Карты PCI/MII bfe bge dc fxp lge nge pen re rl sf sis sk. ste ti tl tx vge vr wb xl Broadcom BCM440x 10/100 Ethernet Broadcom BCM570xx Gigabit Ethernet DEC/Intel 21143 и различные аналоги Intel EtherExpress Pro/100B (82557, 82558) Level 1 UCT1001 gigabit ethernet NatSemi DP83820 gigabit ethernet AMD Am79C79x PC110/100 NICs RealTek 8139C+/8169/8169S/8110S RealTek 8129/8139 Adaptec AIC-6915 (Starfire) Silicon Integrated Systems SiS 900/SiS 7016 SysKonnect SK-984x & SK-982x gigabit Ethernet Sundance ST201 (D-Link DFE-550TX) Alteon Networks Tigon l/ll gigabit Ethernet Texas Instruments ThunderLAN SMC 9432TX (83С170 "EPIC") VIA VT612x gigabit ethernet VIA Rhine, Rhine II Winbond W89C840F 3Com 3c90x (Boomerang, Cyclone) Карты ISA cs ed ex ep fe ie Crystal Semiconductor CS89x0 NIC Novell NE1000/NE2000, 3Com 3c503, SMC Ultra, карты DS8390 Intel EtherExpress Pro/10 and Pro/10+ Карты на базе Etherlink III Карты на базе Fujitsu MB8696x EtherExpress 8/16, ЗС507, StarLAN 10 и так далее
Работа в сети FreeBSD Окончание табл. 23.1 Имя устройства lnc sn хе Беспроводные (802.11) an awi wi Поддерживаемые карты Карты NE2100, NE32-VL Lance Ethernet Серия SMC 9000 Xircom PC-card Ethernet карты PCMCIA Aironet 4500/4800 BayStack 660 и другие Lucent WaveLAN/lntersil/Symbol Конфигурирование сетевых настроек с помощью Sysinstall Простейший способ конфигурирования вашей Ethernet-карты состоит в применении утилиты Sysinstall. Метод Sysinstall, возможно, покажется знакомым любому, кто имеет опыт выполнения этого процесса на машинах Windows или Macintosh. Вначале вы запрашиваете Sysinstall сделать что-либо, требующее сетевого соединения (например, сетевой установки системы, просмотра пакетов или других подобных задач), она открывает окно конфигурации сети, где вы можете визуально устанавливать опции TCP/IP существующей Ethernet-карты. Если ваша система уже запущена в многопользовательском режиме, а не находится в процессе начальной инсталляции, вы можете легко попасть в конфигурационный экран TCP/IP Sysinstall, запустив /usr/sbin/sysinstall, выбрав Configure (Конфигурировать) в главном меню, а затем выбрав опцию Media (Медиа). В этом подменю выберите FTP и какой-нибудь FTP-сервер (не важно, какой; все, что вы делаете здесь — инициируете процедуру конфигурирования сети, а не устанавливаете программное обеспечение). Будет задан вопрос Running Multiuser, Assume that the Network Is Already Configured? (Система в многопользовательском режиме, предположить, что сеть уже сконфигурирована?). Выберите No (Нет), чтобы войти в экраны конфигурирования сети; откроется экран Network Interface Selection (Выбор сетевого интерфейса), как показано на рис. 23.1. Экран Network Interface Selection (Выбор сетевого интерфейса) предоставит список интерфейсов, которые FreeBSD обнаружила в вашей системе. Вероятно, вы увидите множество вариантов выбора, которые не имеют особого смысла. На этом рисунке показаны такие выборы, как 1р0 или plipO (параллельный порт) и различные опции РРР или SLIP, а также устройства IPv6, такие как gif 0 и f aithO. Можно смело игнорировать большинство опций на этом экране, поскольку та, которая вам нужна, вероятнее всего будет на вершине списка. В данном примере используется f xpl, что соответствует карте Intel EtherExpress Pro/100B PCI. При выборе Ethernet-карты вы получаете два диалога: выбор, позволяющий системе попытаться конфигурировать карту автоматически, используя IPv6, и другой выбор — попытку применения DHCP. В обоих случаях отвечайте No (Нет). После этого вам будет представлен визуальный экран Network Configuration (Конфигурация сети), как показано на рис. 23.2.
Конфигурирование базовых сетевых служб Глава 23 707 SftrvieeProvi *»г , \л$ х, щ the, ррр -\л ш. щ^*&{я>лфе^т$г\ trm< ;pu r цо ^ц- ., т утл 'г* w»i«5'SLI* 'w?rA^^.t*r'^Mfe^i^i^S&5&%&***№ mmmwmm Intel EtherExpress РгоДЭвВ PCI Fast Ethernet card! tiel;Ethe-rEipr.esj.Pre/ ш^вдшшё Л*с. 25./. Выбор Ethernet-псарты в программе Sysinstall 2ШШШ111111Я мШ1ш11 .MCEL 1^-Щ!^^^^^ Рис. 23.2. Визуальный жран Network Configuration (Конфигурация сети) в программе Sysinstall СОВЕТ Если ваша сеть настроена на использование динамически присваиваемых IP-адресов, предоставляемых DHCP, вы можете выбрать Yes (Да) в ответ на предложение автоматической конфигурации DHCP, тем самым избежав сложностей, связанных с ручным конфигурированием сети. Обратитесь к главе 35 за дополнительной информацией об использовании DHCP на клиенте и сервере. Каждое поле этого экрана имеет краткое описание в нижней части экрана, но мы представим здесь некоторую дополнительную информацию. • Host (Хост). Имя хоста, которое является первой частью полного квалифицированного имени машины. Например, если ваша машина имеет имя simba. example. com, то в поле Host: должно быть указано simba.
708 Работа в сети FreeBSD Часть V • Domain (Домен). Остальная часть доменного имени, или example.com. Это может быть составной домен для сетей с именованными субдоменами вроде cslab.ivyleague.edu. • IPv4 Gateway (Шлюз IPv4). IP-адрес вашего маршрутизатора-шлюза. Используйте ближайший к вашей машине вышестоящий маршрутизатор или тот, который ваш администратор сети или поставщик Internet-услуг идентифицирует как адрес вашего шлюза. Если вы подключены к Internet через DSL или кабельный модем либо аналогичное устройство, его IP-адрес (назначенный поставщиком Internet- услуг) должен быть вашим шлюзом. Этот маршрутизатор будет отвечать за передачу любого трафика между вашей машиной и любой другой машиной в мире. Как вы узнали в главе 22, маршрутизатор-шлюз должен находиться в той же сети, что и IP-адрес вашей машины FreeBSD, как это определено маской сети. • Name Server (Сервер имен). IP-адрес наиболее надежного сервера доменных имен (DNS) в вашей сети. Вы должны использовать DNS, предоставленный сетью вашего предприятия, поставщика Internet-услуг или университета, если это возможно; удаленные сервера имен удобны в качестве запасных, но они не обязательно настроены для надежного обслуживания нелокальных запросов. Позднее в этой главе вы научитесь назначению множества серверов имен, ког- да это необходимо. • IPv4 Address (Адрес IPv4). IP-адрес, который вы назначаете своей карте Ethernet. Он должен находиться в той же подсети, что и ваш шлюз IPv4, соответствуя вашей маске сети. Это обсуждалось в главе 22. • Netmask (Маска сети). Маска сети, используемая для определения того, что место назначения пакета расположено в локальной сети. Установите это поле в 255.255.255.0 для сети класса С — наиболее часто используемое значение маски сети для большинства домашних конфигураций. Проконсультируйтесь со своим администратором сети, чтобы узнать точно, каким должно быть это значение. • Extra options to ifconfig (Дополнительные опции для if con fig). Скорее всего, вам не придется указывать что-либо в этом поле, разве что вы — опытный пользователь, который желает "пощупать" производительность установленной интерфейсной карты. Все; что вы введете здесь, например, спецификацию определенных типов носителей или дуплексных режимов, будет добавлено к командной строке утилиты ifconfig, которую Sysinstall использует на заднем плане. Вы узнаете больше об этой команде в разделе "Использование ifconfig для применения сетевых настроек" далее в настоящей главе. После установки всех этих опций выберите ОК. Сетевые настройки будут применены к карте "на лету". Все, что вы сделаете в Sysinstall, сохраняется — в данном примере, Sysinstall подключается к выбранному FTP-серверу. Если конфигурация сети неудачна, то, скорее всего, проблема в указанных вами настройках, и вам придется вернуться назад и исправить введенные вами установки. Если вы работаете в сети предприятия, попросите своего сетевого администратора выдать правильные настройки. Этот процесс работает почти так же, как при первичной установке FreeBSD (см. главу 2). Вы уже видели ранее этот экран конфигурации в рамках процесса установки. Если вы осуществляете инсталляцию по сети, она использует эти установки для загрузки дистрибутива системы с центрального сервера.
Конфигурирование базовых сетевых служб Глава 23 709 Как справиться с Ethernet-картами ISA Большинство Ethernet-карт PCI, имеющихся на рынке сегодня, не доставляет проблем. Все, что вам нужно сделать, особенно если у вас одна из широко используемых карт, поддерживаемых ядром generic, — вставить ее, включить машину и наблюдать, как ядро идентифицирует карту в процессе загрузки системы: fxpO: <Intel PLC 10/100 Ethernet> port 0xde80-0xdebf mem 0xff8fe000-0xff8fefff irq 11 at device 8.0 on pcil fxpO: Ethernet address 00:d0:b7:c7:74:fl fxpl: <Intel Pro 10/100B/100+ Ethernet> port Oxdf00-0xdf3f mem 0xff700000-0xff7fffff,0xff8ff000-0xff8fffff irq 11 at device 9.0 on pcil fxpl: Ethernet address 00:d0:b7:bd:5d:13 Однако если вы имеете дело со старой картой ISA, процесс может оказаться несколько сложнее. Карты ISA настраиваются на определенный адрес памяти и номер IRQ (запрос прерывания), и вы должны указать оба значения такими, чтобы они не использовались уже какими-то другими устройствами. Большинство Ethernet-карт имеют адреса памяти 0x300 или 0x280 и номера IRQ 9 или 10. Инсталляция более чем одной такой карты означает, что вам придется сконфигурировать дополнительную карту на использование незанятого слота. И это довольно неудобная часть: такая конфигурация карты обычно должна осуществляться DOS-утилитой, поставляемой вместе с картой. Вначале проверьте, не использует ли уже ядро FreeBSD выбранный номер IRQ и адрес памяти; примените для этого команду grep "irq" /var/run/dmesg.boot, чтобы найти все устройства ядра, которые нуждаются в IRQ. Выберите номер между 1 и 15, который не используется, для назначения IRQ вашей карты. Предположительно местоположение памяти 0x300 будет работать, если только вы не увидите появления этой строки в выводе dmesg. Если у вас есть оригинальный диск с драйверами карты, загрузите MS-DOS (или Free DOS — http: / /www. f reedos. org) с аварийной дискеты DOS и затем запустите программу диагностики карты. Программное обеспечение Ethernet-карты обычно позволяет выбрать распространенные адреса памяти и IRQ, чтобы установить для использования картой; введите IRQ и адрес памяти, выбранные ранее, и загрузитесь обратно в FreeBSD. Возможно, вам понадобится также изменить подсказку устройства (описанные в главе 18) для вашей карты. Эти подсказки, хранящиеся в /boot/device.hints, управляют тем, где FreeBSD ожидает найти устройства. Вы можете поэкспериментировать с ними, чтобы подобрать соответствие для вашей карты, редактируя этот файл. Найдите в нем строки вроде следующих: hint.ed.0.at="isa" hint.ed.0.рогt="0x300" hint.ed.0.irq="10" Модифицируйте строки порта (адрес памяти) и IRQ, чтобы они соответствовали установкам вашей карты, и перегрузите систему для их активизации. Несмотря на все вышесказанное, следует отметить, что карты Ethernet очень дешевы в наши дни, и вместо того чтобы возиться с устаревшими устройствами, которые FreeBSD старательно (но не элегантно) поддерживает, возможно, намного проще купить дешевую современную PCI-карту Ethernet и установить ее вместо старой.
I _1ft | Работа в сети FreeBSD I I Часть У Конфигурирование сетевых настроек без Sysinstall Использование Sysinstall для конфигурирования ваших карт во многих отношениях облегчает задачу; это удобно и наглядно, и все необходимое осуществляется в одном месте. Однако конфигурирование с Sysinstall — наименее универсальный способ решения многих сетевых задач, которые вам может понадобиться выполнить. Вы можете получить доступ и модифицировать сетевые настройки более непосредственно — из командной строки. Естественно, вы должны делать это от имени пользователя root, чтобы иметь возможность запускать эти команды так, чтобы они изменяли конфигурацию системы; также вы должны выполнять эти шаги с физической консоли, поскольку любые неправильные настройки могут привести к потере соединения с машиной. ВНИМАНИЕ! Некоторые из функций, о которых будет сказано, вообще невозможно выполнить в Sysinstall, например, добавление IP-псевдонимов и модификацию таблиц маршрутизации. Фактически, если у вас есть специальные настройки IP (например, карта со многими псевдонимами, привязанными к ней) и затем вы выполняете дополнительную настройку с помощью Sysinstall, то вы можете потерять эти настройки. Помните, что Sysinstall удобна для большинства базовых и общих задач конфигурирования, но следует избегать более сложных ситуаций, для которых эта утилита не предназначена. Использование if config для применения сетевых настроек Конфигуратор интерфейсов if config — многоцелевой инструмент для применения сетевых настроек "на лету". Его основное назначение — присваивать IP-адреса Ethernet-карте (интерфейсу), хотя, как и большинство других инструментов UNIX, он может делать намного больше. Здесь мы раскроем некоторые наиболее часто используемые функции if config; за дополнительной информацией обращайтесь к man ifconfig. Во-первых, давайте воспользуемся if config для сбора информации о сетевых интерфейсах. В предыдущей главе вы видели пример if config -а, который показывает все интерфейсы и сообщает, какие из них доступны. Применение if config -a обеспечивает простой способ нахождения вашего драйвера Ethernet — будь то edO, fxpO, xO или какой-то другой. Узнав это, вы можете специфицировать имя устройства в качестве параметра if config, чтобы получить настройки этого интерфейса: # if config fxpl fxpl: flags=8843<UP,BROADCAST,RUmiNG,SIMPLEX,MULTICAST> mtu 1500 options=8<VLAN_MTU> inet6 fe80::2d0:b7ff:feaa:lla9%fxp0 prefixlen 64 scopeid 0x1 inet 64.41.131.102 netmask OxffffffOO broadcast 64.41.131.255 ether 00:d0:b7:aa:ll:a9 media: Ethernet autoselect (lOObaseTX <full-duplex>) status: active
Конфигурирование базовых сетевых служб Глава 23 ВНИМАНИЕ! Мы приведем ряд примеров конфигурации, которые почти наверняка вызовут потерю соединения вашего интерфейса Ethernet с любым сеансом подключения. Если вы хотите испытать функциональность if conf ig на собственной машине, делайте это с физической консоли, а не через Telnet или SSH! Если вы хотите только изменить свой IP-адрес, выдайте следующую команду: # ifconfig fxpl 64.41.131.103 Это и все, что нужно. Однако обратите внимание, что если вы не указываете сетевую маску, предполагается установка адреса класса А — и маска сети и широковещательный адрес устанавливаются соответственно, как можно увидеть из обновленного вывода if con fig fxpl: inet 64.41.131.103 netmask OxffOOOOOO broadcast 64.255.255.255 Давайте попробуем снова, но на этот раз установим адрес класса С; это означает, что придется также указать маску сети. Последнее делается с ключевым словом netmask в комбинации с IP-адресом. Обратите внимание, что if conf ig принимает сетевые маски в шестнадцатеричной форме, в десятичной с разделителями-точками или в виде символических имен, определенных в /etc/networks. Поэтому следующие команды эквивалентны: # if conf ig fxpl 64.41.131.103 netmask 255.255.255.0 # if conf ig fxpl 64.41.131.103 netmask OxffffffOO # if conf ig fxpl 64.41.131.103 netmask my-netmask Можно также специфицировать широковещательный адрес, хотя обычно это не удобно, за исключением особых случаев настроек сети. Заметьте, что netmask заставляет if conf ig предполагать маску сети класса А. Если вы должны установить широковещательный адрес, убедитесь, что указали его одновременно с netmask: # if conf ig fxpl 64.41.131.103 netmask 255.255.0.0 broadcast 64.41.255.255 Один финальный трюк состоит в том, что if conf ig может использовать ключевое слово media, позволяющее переключать карту между различными перечисленными типами носителей. Эта возможность очень удобна, если у вас есть карта с множеством интерфейсов и вы хотите перейти с соединителя BNC на RJ-45 (UTP), или с соединителя RJ-45 на AUI. Если у вас Ethernet-карта 10/100 и автоматически опознающий концентратор, который автоматически определяет скорость 100 Мбит/с с полным дуплексом для вашей карты, вы можете принудительно установить его в режим 10 Мбит/с, указывая ключевые слова media и mediaopt. Взглянем на то, что if conf ig fxpl сообщает о поддерживаемых типах носителя: media: Ethernet autoselect (lOObaseTX <full-duplex>) Этот пример сообщает, что вы находитесь в режиме автоматического определения (autoselect). В этом режиме карта согласовывает максимально возможную скорость с концентратором или коммутатором, к которому она подключена; в данном случае это будет 100 Мбит/с с полным дуплексом. Попробуем установить ее в режим 10 Мбит/с (предполагая, например, что вы подключили ее к концентратору 10base-T, которые не может автоматически согласовывать скорость, либо делает это некорректно при подключении к нему).
I ZTT I Работа в сети FreeBSD 1,1 Часть V Для каждого драйвера Ethernet существует man-страница руководства. Обратитесь к ней для того, чтобы узнать, какие типы носителей и ключевые слова поддерживаются вашей картой. В данном случае man f xp сообщит вам следующее: The fxp driver supports the following media types: autoselect Enable autoselection of the media type and options 10baseT/UTP Set 10Mbps operation lOObaseTX Set 100Mbps (Fast Ethernet) operation The fxp driver supports the following media options: full-duplex Set full duplex operation Драйвер fxp поддерживает следующие типы носителей: autoselect Включить автоматическое определение типа носителя и опций 10baseT/UTP Установить работу на скорости 10 Мбит/с lOObaseTX Установить работу на скорости 100 Мбит/с (Fast Ethernet) Драйвер fxp поддерживает следующие опции носителей: full-duplex Установить полнодуплексный режим Это говорит о том, что ключевым словом для операции 10 Мбит/с является 10baseT/UTP, и доступна опция full-duplex, которую вы можете установить по своему выбору (используя ключевое слово mediaopt). Вот как установить этот интерфейс в два возможных режима 10BaseT/UTP: # ifconfig fxpl media lObaseT/UTP # ifconfig fxpl media lObaseT/UTP mediaopt full-duplex Если вы сделаете это на машине, находящейся рядом с концентратором или коммутатором, куда вставлен кабель Ethernet, или, если вы можете заглянуть на заднюю стенку компьютера, проверьте, что светодиод на карте горит. Вы должны увидеть, что светодиод "100" погас — это указывает на то, что соединение было переключено в режим 10 Мбит/с. Вот как переключиться обратно в предыдущий режим: # ifconfig fxpl media autoselect Напомним, что полнодуплексный режим — это когда карта читает и пишет данные одновременно, поэтому режим 10base-T с полным дуплексом означает 10 Мбит/с в каждом направлении. Полудуплексный режим означает максимум 10 Мбит/с в сумме в обоих направлениях. Концентратор не может работать в полнодуплексном режиме. Для того чтобы воспользоваться преимуществами полнодуплексного режима, вам понадобится коммутатор. Использование route для установки маршрутизатора-шлюза Мы описали ifconfig в той степени, в которой, вероятно, вам будет достаточно. Однако мы пока не коснулись того, как установить маршрутизатор-шлюз или информацию DNS в командной строке — тех функций, которые экран конфигурации сети Sysinstall выполняет сразу. Сначала поговорим о маршрутизаторах-шлюзах. Вы не устанавливаете шлюзы в ifconfig, потому что адрес шлюза не привязывается к индивидуальному интерфейсу Ethernet. Вместо этого применяется таблица маршрутизации FreeBSD, позволяющая системе функционировать самой по себе в ка-
Конфигурирование базовых сетевых служб I ._ " I Глава 23 I I честве полноценного маршрутизатора (как это делается, вы узнаете в главе 28), имеющего единственный маршрут "по умолчанию", который принимает весь трафик, не предназначенный ни для одной из LAN, доступных вашим Ethernet-картам, независимо от того, сколько таких карт у вас имеется. Этот маршрут по умолчанию — то, что вы специфицируете для маршрутизатора-шлюза. НА ЗАМЕТКУ До тех пор, пока вы находитесь в той же сети, что и машина FreeBSD, вы можете модифицировать маршруты, включая маршрут по умолчанию, не теряя при этом сетевых соединений. Если же вы выполните эти примеры, будучи подключенными через Telnet или SSH, то можете непреднамеренно отключить себя, исполняя примеры применения ifconf ig. Этого не случится, если вы просто устанавливаете адрес маршрутизатора, до тех пор, пока между вами и вашей машиной FreeBSD нет никаких маршрутизаторов. Опытные пользователи могут пожелать защитить свои вложения, настроив второй IP-адрес со своим собственным выделенным маршрутом в качестве метода "восстановления" доступа к машине на случай потери соединения в результате экспериментов. Например, Web-серверу в демилитаризованной зоне (demilitarized zone — DMZ) также может быть назначен адрес 192.168.ххх.ххх, чтобы быть доступным из внутренней LAN. Первое, что следует сделать — это проверить вывод netstat -rn. Инструмент netstat отображает состояние таблиц маршрутизации и другую сетевую информацию; опция -г сообщает ему о необходимости показать текущие конфигурированные маршруты, а -п — показать адреса в числовом виде (не пытаясь их перевести в имена хостов, что может потребовать времени и исказить табличный вывод). Это позволит понять, какой в данный момент установлен режим по умолчанию, если он вообще установлен: # netstat -rn Routing tables Таблицы маршрутизации Internet: Destination Gateway Flags Refs Use Netif Expire default 64.41.131.1 UGSc 1 1 fxpO Похоже, у вас уже установлен маршрутизатор-шлюз. Это почти наверняка позволит понять, работает сеть правильно или нет; небольшая проверку ошибок можно выполнить в route, и достаточно легко установить маршрут по умолчанию, который будет недоступен из любой из ваших LAN. Система может создать фиктивный маршрут по умолчанию. В любом случае установка нового адреса маршрутизатора — двух- шаговый процесс. Сначала вы должны удалить существующий маршрут по умолчанию, а затем добавить новый: # route delete default delete net default # route add default 64.2.43.1 add net default: gateway 64.2.43.1
Работа в сети FreeBSD НА ЗАМЕТКУ Следует отметить, что команда route — это одна из частей UNIX, которая заставляет людей вздрагивать, поскольку реализована по-разному почти в каждом варианте UNIX на планете. Разница обычно очень тонкая и касается синтаксиса; хотя функциональность большей частью одна и та же, работаете ли вы в FreeBSD, Linux, Solaris или IRIX, но способ доступа к функциональности раздражающе разнообразен. Чтобы получить представление о недостатке стандартизации, инсталлируйте portsentry (из /usr/ports/security) и загляните в файл /usr/local/ etc/portsentry.conf. Там перечислены не менее девяти разных способов (или девяти разных платформ) использования route для установки маршрута "черной дыры". Это несколько забавно, однако это часть той цены, что мы платим за гибкость, которой требуем от UNIX. Использование hostname Установка имени хоста вашей машины выполняется просто. Все, что для этого нужно — команда hostname с желаемым именем хоста (в виде полностью квалифицированного доменного имени) в качестве аргумента: # hostname tiger.example .com Вы можете также получить текущее установленное имя хоста — в полностью квалифицированном или сокращенном формате: # hostname tiger.example.com # hostname -a tiger Сетевые настройки в /etc/rc. conf Теперь, имея в своем распоряжении инструменты командной строки для установки IP-адреса, сетевой маски, имени хоста и маршрутизатора-шлюза, и зная, как использовать их вручную, самое время убедиться, что система воспринимает все эти установки. Именно для этого служит файл /etc/re.conf, как вы, без сомнения, вспомните из главы 14. Напомним, что системные установки по умолчанию находятся в /etc/defaults/ г с. conf (который трогать нежелательно), а все переопределения этих установок по умолчанию попадают в /etc/rc. conf. Если вы заглянете в этот файл, то найдете там неясные, чересчур общие и отключенные установки для различных опций TCP/IP. Вы включаете ваши Ethernet-карты в постоянную работу, поместив все необходимое в /etc/rc.conf. Если вы конфигурируете карту, используя Sysinstall (как было описано выше в этой главе), там уже будут присутствовать некоторые установки, вроде показанных ниже (блоки "deltas" ("различия") добавляются при каждом изменении конфигурации с помощью Sysinstall): # — sysinstall generated deltas — # # — различия, сгенерированные sysinstall — # ifconfig_fxpl="inet 64.41.131.102 netmask 255.255.255.0" defaultrouter="64.41.131Л" hostname="tiger.example.com"
Конфигурирование базовых сетевых служб Глава 23 СОВЕТ Порядок спецификации этих опций не имеет значения; сценарии запуска читают их в переменные один раз. Однако более поздние повторения одной и той же переменной получают приоритет перед более ранними. Значения, записанные в файл утилитой Sysinstall, включают следующие. • networkinter faces — устанавливает явный список интерфейсов вашей системы (только старые версии FreeBSD). • Строка if conf ig_xxx# для каждого интерфейса представляет собой строку аргумента, передаваемую Ifconfig конфигурационными сценариями для каждой кар- ты, автоматически обнаруженной ядром или указанной в network_interf aces. • defaultrouter — устанавливает то, о чем вы могли подумать, то есть маршрутизатор по умолчанию. • hostname — полностью квалифицированное доменное имя. Все эти значения читаются в конфигурационные сценарии ресурсов во время загрузки системы и автоматически передаются соответствующим утилитам (ifconfig, route и hostname). Возможно, у вас возникнет вопрос: а как же насчет DNS? Мы вернемся к этому очень скоро. DNS на самом деле не является частью конфигурации стека TCP/IP. Это вспомогательная служба уровня приложения, к которой независимо обращаются сетевые приложения перед инициализацией подключения любого приложения, и вам не нужно об этом беспокоиться, чтобы запустить сетевые службы и заставить их работать. Использование /etc/netstart Замечательную любезность проявляет FreeBSD в сценарии /etc/netstart. Это необязательная часть процесса конфигурирования времени загрузки системы, и он может быть спокойно удален из вашей системы без особых последствий (хотя это было бы глупо, учитывая то, насколько полезен этот сценарий). За один раз большинство сетевых служб запускаются явно внутри /etc/netstart. В прежние времена, когда администраторам приходилось редактировать сценарии, чтобы добавить новые службы, это была критичная часть процесса конфигурирования ресурсов. Теперь же, в соответствии с современной идеологией FreeBSD, каждая индивидуальная функция системы управляется отдельным сценарием в /etc/red и запускается автоматически во время загрузки, и сценарий /etc/netstart — это просто командный файл, исполняющий все касающиеся сети сценарии запуска сразу. (Вы можете просмотреть содержимое этого файла с помощью cat или more, чтобы увидеть, что он вызывает.) Разнообразные инструменты командной строки, которые обсуждались выше — ifconfig, route, hostname и им подобные — запускаются из /etc/rc.d/netif, будучи субъектами различных условных проверок и проверок совместимости, с использованием синтаксиса, построенного на основе различных глобальных конфигурационных файлов для предотвращения ошибок ввода и потенциально недопустимых маневров. Для ежедневных изменений настроек сети /etc/netstart — наилучший
Работа в сети FreeBSD и наиболее безопасный способ активизации изменений конфигурации сети, вместо индивидуального запуска различных команд. Однако есть одно предостережение. Сценарий /etc/netstart вызывает /etc/ red/routing для установки шлюза по умолчанию с использованием команды route, как вы уже видели; однако вы не можете добавить новый маршрут по умолчанию, не удалив старого. Сценарий /etc/rc.d/routing не запускает команду route delete default, потому что он спроектирован для запуска во время загрузки системы, когда этого делать не нужно. Поэтому, чтобы использовать /etc/netstart, вы должны сначала удалить маршрут по умолчанию. Это делает применение /etc/netstart двухшаговым процессом, как показано в листинге 23.1. Листинг 23.1. Перезапуск сетевых служб с использованием /etc/netstart # route delete default delete net default # /etc/netstart Doing stage one network startup: Doing initial network setup:. loO: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST^ mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::l%lo0 prefixlen 64 scopeid 0x3 inet 127.0.0.1 netmask Oxff000000 fxpO: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=8<VLAN_MTU> inet6 fe80::2d0:b7ff:feaa:lla9%fxp0 prefixlen 64 scopeid 0x1 inet 64.41.131.101 netmask OxffffffOO broadcast 64.41.131.255 ether 00:d0:b7:aa:ll:a9 media: Ethernet autoselect (lOObaseTX <full-duplex>) status: active add net default: gateway 64.41.131.1 Additional routing options: tcp extensions*NO TCP keepalive*YES. Routing daemons:. Все это будет отлично работать, если вы находитесь в той же сети, что и машина FreeBSD, или же вошли на нее с консоли. Однако следует отметить, что здесь таится коварная ловушка, если вы попытаетесь управлять машиной откуда-то извне через Internet. Когда вы удаляете маршрут по умолчанию, то фактически делаете машину недоступной для дальнейших коммуникаций, так что не сможете запустить команду /etc/netstart (которая переназначает маршрут по умолчанию). Трюк, позволяющий обойти это, заключается в помещении обеих команд в одну строку, разделяя их точкой с запятой (;). Это довольно рискованно, потому что потенциально может привести к потере нескольких ответных пакетов. Если же, однако, все конфигурировано правильно в /etc/rc.conf, ваше терминальное соединение будет восстановлено после небольшого "заикания": # route delete default; /etc/netstart Создание IP-псевдонимов Ничто не мешает вам назначить своей Ethernet-карте столько IP-адресов, сколько вы хотите. Возвращаясь к дискуссии об ARP из предыдущей главы, новое соединение
Конфигурирование базовых сетевых служб Глава 23 717 TCP/IP ищет хост в LAN по его IP-адресу, запрашивая МАС-адрес Ethernet-интерфейса, имеющего этот IP-адрес. Обратное не происходит. Один МАС-адрес может соответствовать многим разным IP-адресам, но один IP-адрес не может быть назначен множеству Ethernet-карт, не вызвав при этом ошибок и коллизий. Способ назначения множества IP-адресов единственной карте состоит в создании IPnceedonvMoe (IP aliasing). Как обстоят дела и с командой route, каждая платформа выполняет назначение псевдонимов немного иначе, чем другие, и синтаксис варьируется от системы к системе. В FreeBSD alias используется как ключевое слово для if con fig, добавлением его после адреса и всех прочих параметров: # ifconfig fxpl 64.41.131.103 netmask 255.255.255.255 alias Обратите внимание, что маска сети установлена в 255.255.255.255. Это необходимо, если псевдоним IP-адреса расположен в той же подсети, что и первичный IP-адрес интерфейса. (Если это не так, просто примените обычную сетевую маску, используемую для этой подсети.) Что же это означает с точки зрения TCP/IP? Маска сети, в которой все биты установлены в 1, гарантирует, что стек TCP/IP будет рассматривать пакет, в котором адрес назначения соответствует по всем битам, хотя он и находится в локальной сети; такая маска создает "подсеть", состоящую из одного- единственного адреса, в чем вы можете убедиться, выполнив двоичное сопоставление с адресом сетевой маски: 0100 0000 0010 1001 1000 ООН ОНО 0111 (64.41.131.103) + 1111 1111 1111 1111 1111 1111 1111 1111 (255.255.255.255) 0100 0000 0010 1001 1000 ООН ОНО 0111 (64.41.131.103) Таким образом, принимаются только пакеты, явно адресованные этому адресу. Все пакеты, приходящие на этот адрес либо исходящие из него, отправляются маршрутизатору, а не LAN. Если множество псевдонимов имеют одну и ту же маску сети, их широковещательные адреса должны быть одинаковыми, что может ввести в заблуждение стек TCP/IP. Используя сетевую маску со всеми единицами позволяет ifconfig распознавать множественные IP-адреса для единственного интерфейса. Чтобы настроить IP-псевдонимы в /etc/rc.conf, вы должны использовать ключевое слово if conf ig_xxx#_alias#, которое синтаксически работает точно так же, как и if conf ig_xxx#. Вот как может выглядеть набор псевдонимов в /etc/rc. conf: ifconfig_fxpl="inet 64.41.131.131 netmask 255.255.255.0" ifconfig_fxpl_aliasO*"inet 64.41.131.132 netmask 255.255.255.255й ifconfig_fxpl_aliasl="inet 64.41.131.133 netmask 255.255.255.255" ifconfig_fxpl_a!ias2-"inet 64.41.131.134 netmask 255.255.255.255" ifconfig_fxpl_alias3="inet 64.41.132.161 netmask 255.255.255.0" ifconfig_fxpl_alias4="inet 64.41.132.165 netmask 255.255.255.255" ifconfig_fxpl_alias5="inet 64.41.132.166 netmask 255.255.255.255" Отображение имен на IP-адреса в файле /etc/hosts Вам необходим способ отображения имен хостов на IP-адреса. Обычно это делается с помощью DNS, но DNS у вас еще не настроен. А между тем, вы можете обеспечить отображения тех хостов, которые вам известны, таких как хосты локальной сети, используя для этого файл /etc/hosts.
718 Работа в сети FreeBSD Часть V Файл /etc/hosts позволяет построить таблицу, в которой каждое вхождение перечисляет IP-адреса, его наиболее общее ("официальное**) имя хоста и любые псевдонимы (дополнительные имена, отображаемые на тот же IP-адрес). Каждый такой элемент отделяется пробелами или знаками табуляции. Эта таблица просматривается перед любыми запросами к DNS, поэтому /etc/hosts работает одновременно и как запасной DNS (когда настоящий не доступен), и как его переопределение (если DNS предоставляет некорректную информацию). Эти псевдонимы могут применяться даже в качестве сокращений имен любимых хостов, полные имена которых вы не хотите запоминать, как это делается и в псевдонимах команд оболочки (см. раздел "Файлы инициализации командной оболочки" главы 9). Ниже показано несколько примеров строк из /etc/hosts: ns.example.com lion.example.com www2.example.com www3.example.com fred Имея такую таблицу, вы можете подключаться к перечисленным хостам по имени, — как по "официальному" имени из второго столбца, так и по любому из псевдонимов, перечисленных в третьей колонке, причем делать это даже тогда, когда серверы DNS недоступны. 64.41.131.132 64.41.131.133 64.41.132.165 114.235.123.11 ns www2 www3 www.foobar.com ВНИМАНИЕ! Вы должны удалить вхождения хостов из своего файла /etc/hosts, как только они станут нормально достижимыми через DNS. Причина этого состоит в том, чтобы помочь в поддержке и устранении проблем в будущем; если у вас возникают проблемы с подключением к определенному хосту, вы можете потратить часы на бесплодные поиски, прежде чем сообразите, что жестко закодировали IP-адрес в своем файле /etc/hosts вместо того, чтобы положиться на DNS. Тестирование сетевого соединения с помощью ping После того, как вы завершите конфигурирование сети, настроив ее либо в Sysinstall, либо с помощью /etc/netstart, вы можете использовать команду ping для проверки того, что все настроено правильно. Программа ping — это простой инструмент на базе ICMP, который проверяет наличие эхо-отклика от указанного хоста и сообщает время прохождения каждого пакета до этого хоста и обратно. Использование ping исключительно просто. Вы можете запустить ее либо с IP- адресом, либо с именем хоста (или псевдонимом из /etc/hosts), и она будет работать, пока вы ее не прервете нажатием <Ctrl+C>: # ping fred PING fred (114.235.123.11): 56 data bytes 64 bytes from 114.235.123.11: icmp_seq=0 ttl-243 time=485.344 ms 64 bytes from 114.235.123.11: icmp_seq=l ttl-243 time-351.589 ms ЛС fred ping statistics Статистика ping для fred
Конфигурирование базовых сетевых служб | Z7T I Глава 23 I I 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 351.589/418.466/485.344/66.877 ms Пакетов: отправлено = 2, получено -2, потеряно = О (0% потерь), Приблизительное время приема-передачи в мс: Минимальное = 351.589 мсек, Максимальное = 485.344 мсек, Среднее = 418.466 мсек Это "здоровая" конфигурация TCP/IP, поскольку указанный хост отвечает на ping. Однако если хост не доступен, передача пакетов ICMP прерываются по тайма- уту и выдается отчет о неудаче соединения. Когда такое случается, значит, что-то не так с вашей конфигурацией (или же удаленный хост может быть выключен, так что попробуйте соединиться с несколькими удаленными хостами). Следующий пример показывает, что случается при неудачной попытке ping достичь цели: # ping 64.41.131.133 PING 64.41.131.133 (64.41.131.133); 56 data bytes ping: sendto: Host is down ping: sendto: Хост недоступен ping: sendto: Host is down ping: sendto: Host is down ping: sendto: Host is down ЛС 64.41.131.133 ping statistics 10 packets transmitted, 0 packets received, 100% packet loss Пакетов: отправлено = 10, получено = О, потеряно = 10 (100% потерь) Другие причины неудачи ping могут включать наличие брандмауэра, сконфигурированного на блокировку ICMP (обычная конфигурация для публично открытых сетей — из соображений безопасности), либо перегрузка маршрутизатора (пакеты ICMP легко отбрасываются маршрутизаторами в период значительной нагрузки, поскольку этот трафик наименее важен). Если вы не можете достичь хоста, хорошей идеей будет попробовать соединиться с помощью Telnet с портом хоста, о котором известно, что он должен быть открыт, например, telnet 64.41.131.133 25, чтобы обратиться к порту SMTP. Конфигурирование DNS в файле /etc/resolv.conf Чтобы использовать правильный DNS, вам понадобится доступ как минимум к одному серверу доменных имен. Неважно, где такой сервер находится — большинство серверов имен сконфигурированы так, что принимают запросы отовсюду из Internet, безо всяких ограничений в отношении того, кто может их присылать. Однако такая практика постепенно идет на убыль, и в большинстве случаев вы захотите использовать только адреса серверов имен, представленные вашим поставщиком Internet-услуг или администратором сети предприятия. Сервера имен специфицируются в файле /etc/resolv.conf, и пример такого файла приведен ниже: search example.com nameserver 64.41.131.132 nameserver 207.78.98.20 nameserver 64.40.111.102
I ZT7 I Работа в сети FreeBSD 720 Ключевое слово name serve r специфицирует IP-адрес сервера имен; вы можете указывать столько серверов имен, сколько хотите, и порядок их перечисления определяет порядок их опроса. Если происходит задержка на одном, опрашивается следующий. Многие приложения имеют свои собственные значения таймаутов при выполнении запросов DNS, которые передаются на обработку операционной системе, так что от серверов, находящиеся ниже третьего или четвертого, вероятно, будет мало пользы. Ключевое слово search определяет поисковый домен — строку, добавляемую к именам хостов, которые квалифицированы не полностью. Например, если вы хотите выполнить nslookup www, то преобразователь IP-адресов (resolver) должен прикрепить поисковый домен и выполнить запрос www.example.com. Вы можете перечислить множество поисковых путей в одной и той же строке: search example.com foobar.com cslab.ivyleague.edu Технически /etc/resolv.conf — просто запасной и переопределяющий файл, подобно /etc/hosts. В идеале, или, по крайней мере, согласно дизайну, система должна запускать свой собственный демон DNS, который наследует свою информацию от вышестоящего главного сервера имен. По умолчанию запросы DNS всегда проверяются по DNS локальной системы, если он запущен. Однако в реальном мире DNS — просто еще одна служба, которую необходимо администрировать, представляющая потенциальный риск для безопасности, поэтому вы не захотите запускать DNS без крайней необходимости. В настоящее время необходимо иметь аккуратный файл resolv.conf, содержащий два или три удаленных сервера имен, по которым можно выполнять поиск имен хостов. Если вы хотите запустить DNS на своей собственной машине, обратитесь к главе 32, где рассказывается, как это сделать. СОВЕТ К счастью, /etc/resolv. conf можно редактировать и модифицировать в любое время, безо всяких дополнительных инструментов обновления баз данных или чего-либо еще. Поиск в DNS выполняется только по запросу сетевого приложения, и таблица resolv.conf проверяется только в эти моменты и открытием файла на диске, а не удерживается в памяти постоянно и не опрашивается непрерывно, как это делается с конфигурацией интерфейса IP. Вы можете открыть /etc/resolv.conf в текстовом редакторе, изменить или добавить вхождения nameserver, поменять порядок их опроса и тому подобное. Следующий запрос DNS, который вы выполните из любого приложения, обратится к новому модифицированному /etc/resolv.conf. Обзор других конфигурационных файлов сети Вы уже видели почти все файлы, содержащие конфигурационную информацию сети, с которыми вам, вероятно, потребуется работать. Однако еще несколько дополнительных файлов стоит перечислить кратко. Сюда не входят файлы . conf ig для основных сетевых служб; о них мы поговорим в главах 26 и 32. Большинство этих файлов имеют свои man-страницы руководства; просто используйте man filename, без пути, чтобы просмотреть их (например, man inetcLconf). Вот описания этих файлов.
Конфигурирование базовых сетевых служб Глава 23 721 /etc/network. Как вы уже видели, этот файл содержит символические имена подсетей, которые вы можете использовать в таких местах, как таблица маршрутизации /etc/hosts.allow. Это список достаточно сложных правил безопасности для ответов на соединения различного типа для каждого хоста в отдельности. Вы можете использовать hosts.allow для того, чтобы отклонять попытки подключения с определенных хостов — либо к отдельным службам, либо ко всем сразу — или же специфицировать действия, которые следует выполнять, когда такие попытки подключения предпринимаются. Этот механизм работает только для собственных служб системы; программные пакеты от независимых поставщиков, такие как Apache, обычно используют свои собственные правила управления хостами. /etc/inetd.conf. inetd — это "супер-сервер", отвечающий за прием запросов соединений для служб, указанных Binetd.confn порождающих процесс для обработки каждого из них. Службы, запускаемые изнутри inetd, включают Telnet, FTP, POP3 и прочие службы, которые вы можете пожелать отключить, когда в них нет потребности. Подробнее об этом читайте в главе 30. /etc/services. База данных типов IP-служб вместе с портами TCP и UDP, на которые отображается каждая из служб. Некоторые программы используют эту таблицу для поиска обычно используемых портов; она также представляет удобное руководство о том, каким службам назначены какие порты через IANA (Internet Assigned Numbers Authority — Комитет по цифровым адресам в Internet). /etc/protocols. Похож на /etc/services, но представляет собой таблицу, содержащую отображения ключевых слов на различные номера подпротоколов IP. В основном представляет интерес в качестве руководства. /etc/rpc. Еще одна таблица отображений, еще менее вероятно представляющая интерес для администратора. Поиски RPC представляют службы отображения портов на такие запросы, как NFS, NIS и другие программы отчетности о состоянии. /etc/pam.d. Подключаемые модули аутентификации (Pluggable Authentication Modules — РАМ); предоставляют способ назначения каскадной аутентификации (S/Key, Kerberos и им подобных) для различных служб. Это будет интересно при обсуждении сетевой безопасности в главе 30. /etc/host.conf. Если присутствует, этот файл описывает порядок выделения приоритетов источникам поиска имен. В конфигурации по умолчанию сначала просматривается /etc/hosts, а за ним — преобразователь IP-адресов BIND (DNS, запущенный на локальной машине). Этот файл генерируется автоматически и не требует никакого ручного редактирования.
ГЛАВА 24 Работа в сети с помощью РРР и 802.11 В этой главе... • Дозвон с помощью РРР • РРР поверх Ethernet (PPPoE) • Устранение неполадок в РРР • Подключение к беспроводной (802.11) сети
I ITT I Работа в сети FreeBSD I— I Часть У Подключение вашей машины FreeBSD к Internet с использованием модема коммутируемой линии или беспроводной сети не так гладко, как в потребительских операционных системах типа Windows или Max OS X. Поскольку FreeBSD спроектирована как серверная платформа, ее архитектура предполагает, что она должна оснащаться кабельным Ethernet со статическим IP-адресом, и подавляющее большинство инструментов администрирования системы ориентированы именно на такую конфигурацию. Однако это не означает невозможность заставить FreeBSD работать с коммутируемыми поставщиком Internet-услуг или основанными на DHCP 802.11 домашними либо корпоративными сетями. Все это позволяют осуществить правильно конфигурированные малоизвестные утилиты системы, которые мы обсудим в настоящей главе. НА ЗАМЕТКУ Обратитесь к главе 35 за информацией о настройке FreeBSD на использование преимуществ динамически назначаемых IP-адресов в домашней или корпоративной сети. Дозвон с помощью РРР РРР означает Point-to-Point Protocol (протокол "точка-точка"). Это протокол, применяемый для большинства коммутируемых соединений Internet, и он до сих пор широко используется в многочисленных домах, где широкополосное подключение (DSL или кабельное) невозможно. Если вы — один из множества пользователей, подключающихся к Internet через модем по коммутируемой линии, то вам следует знать, как работает РРР в системе FreeBSD и как заставить его работать с минимальными трудностями. Сбор необходимой информации После того, как вы зарегистрированы поставщиком Internet-услуг, вам нужно собрать следующую информацию. • Коммуникационный порт, к которому подключен ваш модем. Если вы используете компьютер под Windows и знаете, к какому СОМ-порту подключен модем, то следующие устройства FreeBSD соответствуют СОМ-портам DOS: COM1 - cuadO, COM2 - cuadl, COM3 - cuad2 и COM4 - cuad3. • IP-адрес DNS-сервера вашего поставщика Internet-услуг. Он используется для преобразования доменных имен в числовые IP-адреса. • Телефонный номер дозвона вашего поставщика Internet-услуг. • Ваше имя пользователя и пароль. • Тип аутентификации, используемый поставщика Internet-услуг. Это должна быть либо стандартная регистрационная информация оболочки, протокол аутентификации с помощью паролей (Password Authentication Protocol — PAP) или же протокол аутентификации с предварительным согласованием вызова (Challenge-Handshake Authentication Protocol — CHAP). Все эти различные протоколы аутентификации мы обсудим далее в настоящей главе. • Имеете вы статический или же динамический IP-адрес? Если у вас статический IP-адрес, вы должны знать его.
Работа в сети с помощью РРР и 802.11 _ос Глава 24 I 1 Все эти элементы информации за исключением первого можно получить у вашего поставщика Internet-услуг. РРР пользователя и РРР ядра В системе FreeBSD доступны два типа РРР: РРР пользователя и РРР ядра. Оба обладают своими преимуществами и недостатками. РРР ядра должен быть установлен пользователем root, и его поддержка должна быть скомпилирована в ядро системы (встроена в ядро generic). Поскольку это включает процесс-демон, управляющий соединениями по требованию с поставщиком Internet-услуг, РРР ядра может быть очень эффективным и гладким в эксплуатации. С другой стороны, РРР пользователя — это схема, существующая на уровне пользователя; в этом случае поддержку РРР не нужно компилировать в ядро системы, так что участие пользователя root не требуется, кроме первоначальной проверки возможности запуска пользовательского РРР. (Это может быть удобно, если вы не являетесь администратором машины FreeBSD, но, тем не менее, нуждаетесь в использовании РРР.) Пользовательский РРР несколько легче отлаживать, чем РРР ядра, но поскольку он применяет туннельное устройство — разновидность "интерфейса виртуальной сети", которое инкапсулирует специализированный трафик внутри более общего протокола передачи — он может оказаться несколько менее эффективным, чем РРР ядра. В этой книге рассматривается РРР ядра — наиболее распространенный стиль, используемый FreeBSD на сегодняшний день. Если у вас есть лишь пользовательский доступ к машине FreeBSD, и вы хотите работать с РРР, то вам стоит почитать об этом в онлайновом справочнике по адресу http://www.freebsd.org/handbook/userppp.html. Конфигурирование демона РРР ядра РРР ядра управляется демоном pppd. Главные конфигурационные файлы pppd находятся в /etc/ppp; хотя они не присутствуют в инсталляции FreeBSD по умолчанию, вам нужно создать там несколько файлов, как описано ниже, а также модифицировать файл /etc/resolv.conf. НА ЗАМЕТКУ Файл /etc/ppp/ppp/conf задействован в пользовательском РРР, но не в РРР ядра; вы можете игнорировать его, если не применяете пользовательский РРР. Файл /etc/resolv.conf Файл /etc/resolv.conf, как вы узнали из главы 23 — это конфигурационный файл сервера доменных имен (DNS) FreeBSD. Он определяет, как FreeBSD преобразует имена удаленных хостов в числовые IP-адреса. Каждая строка в /etc/resolv. conf содержит ключевое слово name serve г, за которым следует IP-адрес DNS-сервера. Серверы имен опрашиваются в том порядке, в котором перечислены в этом файле; если первый сервер имен не отвечает или на нем отсутствует запрошенная информация, проверяется следующий по списку сервер. Дополнительное полезное ключевое слово — domain; оно позволяет указать доменное имя вашей системы или сети. Если ключевое слово domain присутствует, FreeBSD предполагает, что любое неквалифицированное имя хоста (то есть имя хоста, не содержащее домена после себя) находится в домене, специфицированном ключевым словом domain. Ниже показан пример файла /etc/resolv.conf:
726 Работа в сети FreeBSD Часть V domain example.com nameserver lll.lll.ll.l nameserver 222.222.22.2 Редактировать файл /etc/ re so lv. с on f можно в любом текстовом редакторе. Но для этого потребуется зарегистрироваться в системе в качестве пользователя root. Файл /etc/ppp/options Файл /etc/ppp/options, который по умолчанию не существует — это место, где сохраняется большинство опций времени выполнения демона РРР. Он читается перед любыми опциями командной строки, которые вы специфицируете при вызове pppd, так что вы можете переопределить опции, указанные в файле, используя командную строку. Содержимое файла options служит для указания скоростей передачи модема, опции подтверждения связи, информации о маршрутизации и домене, а также сценарии соединения. Можно использовать РРР ядра без файла options, поскольку все потенциальные опции имеют значения по умолчанию. Однако, скорее всего, вам потребуется создать этот файл и добавить в него несколько базовых строк конфигурации, специфичных для вашего модема и настроек поставщика Internet-услуг. Опции, которые должны быть указаны в этом файле, отличаются в зависимости от типа аутентификации, используемой вашим поставщиком Internet-услуг. Ниже приведен пример файла для использования простой входной аутентификации оболочки с динамическим IP-адресом (методы аутентификации РАР и CHAP раскрываются в деталях в следующем разделе главы): /dev/cuadO 115200 crtscts modem connect "/usr/bin/chat -f /etc/ppp/chat.script" noipdefault silent domain example.com defaultroute НА ЗАМЕТКУ Переносы строк не важны в файле options; они необходимы только для лучшей читабельности. Вы можете поместить все опции и их аргументы в одну строку. А вот что означают перечисленные в файле опции. • /dev/cuadO. Эта строка устанавливает устройство, на котором находится модем. В данном случае это эквивалент СОМ1 в среде DOS. Здесь также устанавливается скорость 115 200 бит/с (большинство поставщиков по коммутируемым линиям не обеспечивают более 56 Кбит/с, или 57600 бит/с). • crtscts. Эта строка включает для модема аппаратный контроль потока. Аппаратный контроль потока требуется для высокоскоростных коммуникаций. Применяйте nocrtscts вместо этого, если ваш модем не использует аппаратного управления потоком.
Работа в сети с помощью РРР и 802.11 I ZTZ I Глава 24 I I • modem. Это указывает pppd использовать управляющие строки модема, ожидать сигнала несущей перед открытием последовательного порта, а также прочее связанное с модемом поведение. Нет необходимости специфицировать эту опцию (она включена по умолчанию), но ее противоположность — опция local. • connect. Это специфицирует программу дозвона для запуска в сценарии. Программа chat может быть использована для автоматизации подключения модема "сценарием соединения", заданным опцией -f. Об этом будет подробно рассказано в следующем разделе. • noipdef ault. Используйте эту опцию, если у вас динамический IP-адрес (ваш поставщик Internet-услуг присваивает вам IP-адрес при каждом вашем подключении). Эта опция указывает pppd, что IP-адрес и адрес шлюза следует получить от сервера дозвона. Если вы пропустите эту опцию и не укажете статический адрес, pppd попытается найти локальный IP-адрес по имени хоста вашей системы, что может спутать попытки удаленного сервера выделить динамический адрес. • silent. Это указывает pppd о необходимости ожидать пакетов протокола управления соединением (Link Control Protocol — LCP) вместо отправки собственных для установки соединения. • domain. Доменное имя вашего поставщика Internet-услуг должно быть указано здесь и оно может использоваться для целей аутентификации. Имя домена добавляется в конец локальных имен. • default route. Это добавляет строку маршрутизации к системе таблиц маршрутизации во время работы pppd. Когда pppd прерывается, маршрут удаляется. Если у вас имеется статический IP-адрес, удалите строку, которая читает noipdef ault и заменить его строкой, выглядящей примерно так: 10.0.0.1:10.0.0.2 Замените первое число до двоеточия IP-адресом, выделенным для вас поставщиком Internet-услуг. Число после двоеточия — адрес шлюза, также выданный вам поставщиком Internet-услуг. Если поставщик Internet-услуг не выдает вам адрес шлюза, можно оставить второй адрес пустым (однако сохранить двоеточие). Оставляя адрес шлюза пустым, или используя опцию noipdef ault, тем самым вы указываете FreeBSD применять адрес, полученный от поставщика Internet-услуг во время процесса установки соединения. Это только некоторые из множества опций соединения, которые вы можете настроить в /etc/ppp/options. Полный список этих опций можно найти в руководстве man pppd вместе с описанием того, что они могут сделать, чтобы помочь вам справиться с различными нюансами поведения сервера РРР. СОВЕТ Если вы инсталлировали FreeBSD на устаревшей системе (вроде 486) и у вас есть внешний модем, вы можете обнаружить, что предыдущая установка дает странные результаты — сброс соединений, зависание при передаче и тому подобное. Это объясняется тем, что старые системы не поставлялись с высокоскоростными коммуникационными микросхемами UART и могут быть не в состоянии поддерживать скорость порта на уровне 115200 бит/с. Если у вас получается нестабильная производительность, попробуйте снизить скорость порта (указав ее в строке /dev/cuadO в файле /etc/ppp/options) до 57600 бит/с.
728 Работа в сети FreeBSD Часть V Сценарий chat Демон pppd не имеет встроенных возможностей дозвона. Поэтому дозвон выполняется внешней программой chat, которая обеспечивает автоматизированное (через командные сценарии) взаимодействие с модемом. Она использует синтаксис "ожидание/передача"; другими словами, сценарий содержит формат приглашения, ожидаемого от сервера, за которым следуют команды, которые он должен отправить в ответ, затем следующая ожидаемая команда и так далее* Рассмотрим простой сценарий chat. Возможно, вам понадобится слегка модифицировать его, чтобы заставить работать с вашим конкретным модемом, но этого достаточно для начала. От имени пользователя root откройте новый файл в любом текстовом редакторе (в данном примере используется файл сценария, сохраненного под именем chat.script в каталоге /etc/ppp) и введите следующее (все в одной строке): ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT5551212 CONNECT "" TIMEOUT 10 ^>ogin:-\\r-ogin: ваше_имя TIMEOUT 5 sword: ваш_пароль Этот сценарий chat можно разбить на следующие команды-компоненты. • ABORT BUSY ABORT fNO CARRIER*. Сообщает о необходимости прерывания сценария, если модем отвечает либо BUSY, либо NO CARRIER. • AT OK ATDT5551212 CONNECT. Сигнал ATTENTION, ожидающий от модема ответа ОК. Когда он его получает, сценарий использует ATDT (Attention Dial Tone) и набирает телефонный номер (555-1212). Затем сценарий ожидает от модема сигнала CONNECT. • TIMEOUT 10. Устанавливает таймаут (время ожидания строки от сервера) равным 10 секундам. • ogin:-\\r-ogin: ваше_имя TIMEOUT 5 sword: ваш_пароль. Ожидает строку ogin: (которой соответствует login: либо Login: — какую первой пришлет сервер;просто на всякий случай) от модема; эта строка представляет собой приглашение регистрации, присланное поставщиком Internet-услуг. После того как сценарий получает приглашение регистрации, он отвечает отправкой ваше_имя, которое должно быть заменено именем пользователя, выданным вам поставщиком Internet-услуг. Если приглашение регистрации не получено в течение 10 секунд, сценарий прерывается. Предполагая, что сценарий получил приглашение регистрации и отправил имя пользователя, таймер затем устанавливается на 5 секунд и сценарий ожидает в течение этого времени получения строки sword: (еще одна сокращенная строка, предназначенная для соответствия приглашению от поставщика Internet-услуг password: или Password:). Когда сценарий получит приглашение на ввод пароля, он посылает ват_парольу который должен быть заменен реальным паролем, испольг зуемым вами для регистрации у поставщика Internet-услуг. После отправки пароля, если сервер вашего поставщика Internet-услуг автоматически переходит в режим РРР, сценарий завершается. Если же вместо этого вы попадаете в оболочку регистрации, узнайте у поставщика Internet-услуг, какие команды оболочки необходимо ввести для запуска РРР. Затем вы просто можете добавить эти команды в конец сценария.
Работа в сети с помощью РРР и 802.11 Глава 24 СОВЕТ Если вы не уверены в синтаксисе приглашения, которое присылает поставщик Internet-услуг, используйте эмулятор терминала, такой как mini com (доступен в дереве портов, в /us r /ports/ comms/minicom) для соединения с телефонным номером вашего поставщика Internet-услуг, и затем выполните ручной вход. Это позволит вам увидеть, какие приглашения присылает сервер поставщика Internet-услуг при запросе различных частей информации, и соответствующим образом обновить сценарий. ВНИМАНИЕ! Если вы хотите разрешить пользователям, отличным от root, запускать демон pppd, файл chat.script должен быть открытым для чтения всем (то есть "миру"). Однако открытый для чтения файл chat. script представляет собой угрозу безопасности, потому что кто угодно, имеющий право входа в командную оболочку вашей системы, сможет увидеть в этом файле ваш пароль на доступ в Internet. Намного лучше использовать аутентификацию CHAP или РАР, если вы хотите обычным пользователям запускать pppd. Файлы chap-secrets и pap-secrets (которые рассматриваются в следующем разделе) должны быть открытыми для чтения только пользователю root, даже если вы разрешаете рядовым пользователям запускать pppd. К тому же, если вы не хотите, чтобы остальной мир мог получить ваш пароль Internet, не забывайте соответствующим образом изменить права доступа к файлу chat. script. Если ваш поставщик Internet-услуг поддерживает возможность иметь пароль дозвона, отличный от вашего пароля электронной почты, вам не нужно беспокоиться о простом текстовом файле chat. script, потому что пароль, который он содержит, не является жизненно важной информацией. Запуск демона pppd После того, как вы завершите предшествующие задачи, РРР-соединение должно быть готово к работе. Просто введите pppd в командной строке, чтобы запустить его. Если все пойдет хорошо, ваш модем должен набрать телефонный номер и подключиться. В случае возникновения проблем обратитесь к разделу, посвященному поиску неисправностей, в конце этой главы. Чтобы остановить демон pppd, вы можете либо найти его идентификатор процесса (PID) командой ps и затем ввести команду kill, или же использовать killall, как показано ниже: # killall pppd ВНИМАНИЕ! будьте осторожны с командой killall; ее поведение в других системах UNIX может отличаться от поведения в системе FreeBSD. Например, в Solaris она уничтожает все запущенные процессы. Аутентификация РАР и CHAP Большинство поставщиков Internet-услуг в наше время поддерживают протоколы аутентификации с помо!цью паролей (Password Authentication Protocol — РАР) или протокол аутентификации с предварительным согласованием вызова (Challenge- Handshake Authentication Protocol — CHAP), а некоторые — в мире, где доступ к ко-
Работа в сети FreeBSD мандным оболочкам все реже применяется — поддерживают только РАР или CHAP. Оба эти типа аутентификации инициируют сеанс РРР немедленно после регистрации, не запуская командной оболочки на стороне сервера (как это делали старые механизмы дозвона РРР). Такой быстрый запуск делает РАР и CHAP немного более эффективным, чем регистрация в оболочке. РАР и CHAP также имеют еще одно преимущество перед регистрацией в оболочке. Сценарий chat должен быть открытым для чтения всем, если вы хотите, чтобы пользователи, не являющиеся root, могли запускать pppd. Если вы используете этот сценарий с регистрацией в оболочке, ваш пароль в нем видим каждому, кто имеет доступ к системе. Применяя РАР или CHAP, файлы, содержащие пароли не должны быть доступны для чтения всем, поэтому они более безопасны в многопользовательской системе. Запросы РАР/CHAP требуют некоторых дополнительных модификаций в файле options, а также создания одного или более дополнительных конфигурационных файлов, где должна сохраняться ваша информация регистрации. Начнем с файла РРР options. Как минимум, одна строка должна быть добавлена в файл /etc/ppp/ options для определения профиля, который должен быть использован для регистрации (об этом профиле вы узнаете больше в разделе "Запуск команд при подключении и отключении" далее в этой главе). В конец файла options добавьте строку user. Эта строка соответствует имени профиля (профили будут добавлены позднее в другом файле). Строка user выглядит так: user you тате Замените уоитате своим регистрационным именем, под которым вы входите на сервер поставщика Internet-услуг. Ниже приведен список других опций, которые могут вам понадобиться для включения в этот файл. • refuse-chap. Если этот оператор присутствует в /etc/ppp/options, то pppd будет отвергать аутентификацию с использованием CHAP, даже если удаленный хост потребует ее. • refuse-pap. Аналогично refuse-chap, но в применении к РАР. • re quire-chap. Если эта опция присутствует в /etc/ppp/ options, то pppd будет требовать от удаленного хоста аутентифицировать себя, используя протокол CHAP. Поскольку сервер вашего поставщика Internet-услуг, скорее всего, не будет аутентифицировать себя для вас, вы, вероятно, не будете использовать эту строку. • require-pap. Подобно require-chap, за исключением того, что применяется к протоколу РАР. Если вы не включите в свой файл options ни оператора refuse-chap, ни оператора refuse-pap, то pppd примет тот механизм аутентификации, который поставщик Internet-услуг предложит первым. Обратите также внимание, что если вы запретите и РАР, и CHAP, то соединение не будет установлено, поскольку ваша система не будет иметь способа аутентификации себя для поставщика Internet-услуг. pap-secrets и chap-secrets Файлы /etc/ppp/chap-secrets и /etc/ppp/pap-secrets содержат информа цию для аутентификации CHAP и РАР соответственно. Единственная строка содер-
Работа в сети с помощью РРР и 802Л1 [ ZTI I Глава 24 I I жимого каждого файла следует базовому формату username hostname password, где username — ваше регистрационное имя у поставщика Internet-услуг, hostname — имя хоста, который нужно аутентифицировать, a password— (разумеется) ваш пароль для коммутируемого соединения. Имя хоста можно заменить шаблоном (*), который сообщит pppd, что это вхождение может аутентифицировать любой хост. Применение шаблонных символов — хорошая идея для конфигурирования вашей учетной записи в Internet, поскольку если вы дозваниваетесь до поставщика Internet-услуг, то уже уверены, что хост, с которым вы контактируете — именно тот, которым он должен быть. Пример строки для обоих этих файлов выглядит так: you тате * yourpassword Здесь у our пате — имя пользователя, * означает, что допускается любой хост, а yourpassword— ваш пароль. Вы можете использовать и другие опции в файлах pap-secrets и chap-secrets, но они обычно используются, только если вы предоставляете службу дозвона РРР. Если вас это заинтересовало, дополнительную информацию об использовании этих файлов можно найти в разделе "Аутентификация" страницы руководства man pppd. ВНИМАНИЕ! ; Файлы /etc/ppp/pap-secrets и /etc/ppp/chap-secrets должны быть доступны для чтения только пользователю root. Поэтому соответствующим образом измените права доступа к ним, иначе любой, имеющий доступ к системе через командную оболочку, сможет узнать ваш пароль Internet из этих файлов. Дозвон по требованию и постоянные соединения Как следует из наименования, дозвон по требованию (dial-on-demand) означает, что pppd автоматически выполняет дозвон, когда обнаруживает исходящий трафик, который необходимо отправить. Постоянное соединение (persistent connection), с другой стороны — это соединение, которое постоянно установлено, и оно выполняет повторный дозвон, как только pppd обнаружит обрыв связи. Следующие подразделы описывают, как включить оба типа соединений в РРР ядра. Дозвон по требованию Дозвон по требованию заставляет pppd устанавливать коммутируемое соединение в любой момент, когда обнаруживает исходящий трафик при разорванном соединении. Необходимые операторы в /etc/ppp/options выглядят следующим образом. • demand. Включает режим дозвона по требованию. • idle л. Здесь л — количество секунд. Эта опция заставляет pppd автоматически разрывать соединение после л секунд простоя (idle), которым считается отсутствие трафика по каналу РРР в течение этого времени. После включения режима дозвона по требованию вы можете создать стартовый сценарий для автоматического запуска демона pppd при каждой загрузке системы. Существует несколько способов сделать это; но, как вы видели в главе 14, наилучший состоит в создании стартового сценария в /us/local/etc/rc.dc единственной строкой pppd в нем. Этот файл можно назвать как вам угодно, но хорошей идеей будет назвать его ррр (что кратко укажет, для чего он предназначен).
Работа в сети FreeBSD СОВЕТ ¦ Если у вас включен режим дозвона по требованию и ваш модем неожиданно набирает номер, то, скорее всего, это означает, что программа пытается выполнить поиск DNS. Чаще всего программа, являющаяся причиной проблемы — это Sendmail. Вы можете исправить это, включив определение SMART_HOST или функцию nodns в конфигурационном файле freebsd.mc, или добавив IP-адрес и имя хоста почтового сервера вашего поставщика Internet-услуг в файл /etc/hosts. Информацию о конфигурировании Sendmail с помощью файла Master Config читайте в главе 25. СОВЕТ Если у вас включен режим дозвона по требованию, и вы запускаете Fetchmail в режиме демона, так что он периодически опрашивает почтовый сервер, это может держать соединение открытым все время в дополнение к регулярной инициализации дозвона pppd. Читайте в разделе "Электронная почта для отдельно стоящих рабочих станций" главы 25 о способах предотвращения таких случаев. Постоянные соединения Вы можете также заставить pppd постоянно удерживать соединение. Это достигается добавлением оператора persist в файл /etc/ppp/options. Если этот оператор присутствует, pppd автоматически заставляет модем восстанавливать соединение, как только оно будет потеряно. ВНИМАНИЕ! Даже если ваш поставщик Internet-услуг говорит, что вам предоставлен неограниченный доступ, убедитесь, что внимательно прочли его сообщение — в нем может быть выражение "по возможности" или что-то подобное, и это значит, что вы сможете занимать модемный слот поставщика лишь по возможности, если только не предоставите явного требования постоянного соединения. Если вы используете опцию persist для того, чтобы держать ваше Internet-соединение открытым 24 часа в сутки, 365 дней в году, то ваш поставщик Internet-услуг может предложить вам приобрести выделенную линию. Запуск команд при подключении и отключении Когда pppd устанавливает соединение, он проверяет наличие файла сценария по имени ip-up в /etc/ppp. Аналогичным образом, когда закрывается соединение РРР, pppd проверяет наличие файла по имени ip-down в /etc/ppp. Если эти файлы существуют, содержащиеся в них команды выполняются. Запуск команд при подключении и отключении может быть полезно, если, например, вы запускаете FreeBSD на портативном компьютере во время путешествия. Вы можете читать и отвечать на сообщения электронной почты, находясь в самолете. Затем, когда вы доберетесь до места назначения и подключитесь к своей сети, то сможете заставить pppd вытолкнуть всю очередь почтовых сообщений (то есть доставить всю почту, что вы написали в самолете), а также запустить программу Fetchmail для загрузки новой почты, адресованной вам. Если вы поместите команды для выполнения этих действий в /etc/ppp/ip-up, они будут автоматически вы-
Работа в сети с помощью РРР и 802.11 Глава 24 733 полнены, когда вы введете pppd для запуска коммутируемого соединения. Затем вы должны будете завести сценарий ip-down для автоматического останова программы Fetchmail, если она запущена в режиме демона, так чтобы она не пыталась получить почту, когда соединение не доступно. Ниже показан пример сценария ip-up: fetchmail mail.myisp.com apachectl start cd /etc/mail; make start Аналогично, ip-down может содержать следующие строки: apachectl stop cd /etc/mail; make stop РРР поверх Ethernet (PPPoE) Многие пользователи xDSL должны устанавливать непостоянные соединения на базе РРР через интерфейс Ethernet. Это случай, например, когда ADSI, модем, подключенный к машине FreeBSD, выполняет дозвон. РРРоЕ может быть использован в среде FreeBSD лишь с несколькими небольшими дополнениями к конфигурационному файлу РРР Создайте новый файл /etc/ppp/ppp.conf, как показано в листинге 24.1, заменив fxpO именем устройства Ethernet, подключенного к xDSL-модему (если необходимо), Biyisp — ключевым словом, идентифицирующим вашего поставщика Internet-услуг, remoteaddr — IP-адресом контактного удаленного сервера дозвона, a you тате и yourpassword — именем и паролем, используемым для регистрации через РРР. Листинг 24.1 ¦ Простой конфигурационный файл РРРоЕ default: set device РРРоЕ: fxp0imyisp set speed sync setmru 1492 setmtu 1492 set ctsrts off enable lqr add default remoteaddr set timeout 0 set redial 0 0 # Network Address Translation (NAT) nat enable yes nat log yes nat same__ports yes nat unregistered__only yes enable dns myisp: set authname у our name set authkey yourpassword
734 Работа в сети FreeBSD Часть V Когда вы захотите подключиться к Internet, то можете запустить ррр без аргументов из командной строки, а затем ввести dial myisp в ответ на интерактивное приглашение. Затем вы увидите вывод, сообщающий об успешном соединении, после чего у вас должен открыться доступ в сеть. Устранение неполадок в РРР На случай, если у вас возникают проблемы с запуском РРР в работу, предлагаем несколько советов по устранению неполадок. Если модем не дозванивается • Убедитесь, что выбрано правильное устройство для вашего модема. Помните, что FreeBSD использует /dev/cuad# в качестве имен устройств, а не /dev/cuaa#, как ряд других систем. • Если вы используете старую системы, попробуйте уменьшить скорость до 57600 или 38400. Некоторые старые системы без высокоскоростных UART не могут поддерживать скорость 115200. • Проверьте сценарий chat или строку set dial. Загляните в документацию по модему, чтобы узнать, что нужно установить для отправки в некоторых строках инициализации помимо стандартной информации, представленной в конфигурационных файлах FreeBSD. Если модем дозванивается, но установить соединение не удается • Удостоверьтесь, что вы используете корректный тип аутентификации для поставщика Internet-услуг (CHAP, PAP или регистрация в оболочке). • Убедитесь, что вы используете правильное регистрационное имя и пароль, выданные вам поставщиком Internet-услуг. • ТГроверьте сценарий chat или строку set dial. Поищите в документации модема строку инициализации, которую нужно ему посылать. • Если вы применяете пользовательский РРР, может быть, стоит попробовать вместо него РРР ядра (иногда встречается такая комбинация модем/поставщик Internet-услуг, с которой РРР ядра работает хорошо, а пользовательский РРР по какой-то причине просто отказывается работать с данным конкретным поставщиком). Если соединение установлено, но попытки обратиться к удаленным хостам по имени хоста и /или домена не удаются • Убедитесь, что у вас перечислены правильные серверы DNS в /etc/resolv.conf. Также проверьте корректность настройки в файле /etc/host .conf. Он должен содержать строку, включающую hosts, за которой следует строка, содержащая bind. Если приведенные советы не помогают решить проблему, попробуйте включить протоколирование и затем снова попытаться установить соединение. Протоколирование может быть включено добавлением строки в /etc/ррр/options, которая содержит debug для РРР ядра и изменением строки set line в /etc/ppp/ppp.conf, чтобы она содержала Ail для пользовательского РРР. Сообщения от РРР ядра протоколируются в /var/log/messages, а сообщения от пользовательского РРР — в /var/log/ppp.log.
Работа в сети с помощью РРР и 802.11 Вы можете отслеживать сообщения в процессе их вывода, введя команду tail -f /var/log/messages или tail -f /var/log/ppp.log. Она покажет вам последние 10 строк файла, и будет обновлять дисплей при каждом изменении файла. Протоколируемая информация носит довольно технический характер. Возможно, вы сможете решить проблему самостоятельно. Если же нет, то содержимое протокола все равно будет полезно для вашего поставщика Internet-услуг, если вы обратитееьг к нему за помощью. Если и специалисты поставщика Internet-услуг не разберутся, они могут обратиться к своим поставщикам RAS и попросить их взглянуть на ваши протоколы и диагностировать проблему. Информации, представленной в этой главе, должно быть достаточно большинству людей для успешного соединения и работы с поставщиком Internet-услуг. Однако как РРР ядра, так и пользовательский РРР — исключительно эзотерические вещи, и настоящая глава не в состоянии охватить все возможные опции, особенно с учетом снижения популярности доступа к Internet по коммутируемым линиям в пользу широкополосных решений. Если вам нужна более совершенная конфигурация РРР, как для РРР ядра, так и для пользовательского РРР, обратитесь к детальным man-страницам, описывающим все доступные опции. Страницы man по РРР ядра открываются командой man pppd, а по пользовательскому РРР — man ррр. Кроме того, примеры конфигурационных файлов можно найти в /usr/share/examples/ррр. Подключение к беспроводной (802.11) сети Продажи портативных компьютеров значительно выросли в последние годы, и вместе с ними — потребность в действительно мобильных вычислениях с применением беспроводных карт Ethernet и базовых станций на основе стандарта Ethernet 802.11, также известного, как Wi-Fi. Если на вашем портативном компьютере установлена FreeBSD, вероятно, вы захотите узнать, как подключить его к вашей беспроводной сети дома или на работе. Это может оказаться непростой задачей — в ней намного больше тонкостей, чем вам может показаться вначале, принимая во внимание протоколы аутентификации и предостережения о безопасности, касающиеся правильно настроенных беспроводных сетей. Однако, хотя многие вещи в мире UNIX сложны, среди них очень мало того, что сделать невозможно. НА ЗАМЕТКУ Этот раздел касается конфигурации вашей машины FreeBSD как беспроводного клиента, использующего сигналы от существующей точки доступа или базовой станции. Если вы хотите сконфигурировать собственную точку доступа на базе FreeBSD, обратитесь к главе 28 и найдите в ней раздел "Конфигурирование точки беспроводного доступа в Internet". Выбор беспроводной карты Первый шаг в обеспечении работы вашего портативного компьютера с беспроводной сетью состоит в том, чтобы убедиться, что карта 802.11 поддерживается FreeBSD. Если ваша беспроводная сеть работает с протоколом 802.11b (наиболее распространенный протокол, поддерживающий скорости до 11 Мбит/с на радиочастоте 2.48 ГГц), то считайте, что вам повезло — почти все распространенные карты 802.11b естественным образом поддерживаются FreeBSD.
736 Работа в сети FreeBSD Часть V Если же ваша беспроводная сеть использует 802.1 lg, преемник 802.11b, который поддерживает скорости до 54 Мбит/с, то ситуация не столь радужная. Лишь немногие карты явно поддерживаются на момент написания этой книги, хотя это область, на которой многие разработчики FreeBSD — в частности, обладатели портативных компьютеров — сосредоточили свои усилия. Однако благодаря стандартизации в отрасли (и благодаря некоторым трюкам, таким как инструменты NDIS, которые могут запускать бинарный драйвер Windows под FreeBSD для поддержки некоторых карт), есть шанс, что вам удастся заставить работать с FreeBSD карту 802.1 lg или даже 802.11а. Обратитесь к онлайновому справочнику (http://www.freebsd.org/ handbook/network-wireless .html) за инструкциями о том, как этого добиться. В приложении Б содержится частичный список беспроводных Ethernet-карт, о которых известно, что они работают с FreeBSD. Базовые (нешифрованные) беспроводные соединения Большинство беспроводных сетей в наше время поддерживают шифрование, что требует более сложной процедуры настройки клиента 802Л1. Чтобы заставить беспроводное соединение работать в наиболее простом базовом случае, отключите шифрование и аутентификацию (это возможно и рекомендуется) в точке беспроводного доступа или на базовой станции. Вы всегда можете включить его обратно после того, как добьетесь соединения FreeBSD с использованием стандартного нешифрованного сигнала. Во-первых, убедитесь в том, что FreeBSD обнаруживает беспроводную карту, используя драйвер wi (Wireless Internet): # ifconfig wiO wiO: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::202:2ea2:dd2d:c938%wi0 prefixlen 64 scopeid 0x7 inet 0.0.0.0 netmask Oxff000000 broadcast 255.255.255.255 ether 00:09:2d:2d:c9:50 media: IEEE 802.11 Wireless Ethernet autoselect (DS/2Mbps) status: no carrier ssid "" stationname "FreeBSD Wireless node" channel 10 authmode OPEN powers avemode OFF power save sleep 100 wepmode OFF weptxkey 1 Строка status: no carrier означает, что карта не подключена, но тот факт, что вы получаете вывод от устройства wiO, означает, что оно поддерживается FreeBSD, и это хороший знак. Следующий шаг — конфигурирование карты для вашей беспроводной сети, которая в данном примере имеет имя, или SSID, MyNetwork: # ifconfig wiO inet 192.168.0.10 netmask 255.255.255.0 ssid MyNetwork Используйте в командной строке соответствующий статический IP-адрес и маску сети вместо 192.168. 0.10 и 255.255.255.0. (Чтобы узнать, как использовать DHCP для автоматического получения IP-адреса, обратитесь к главе 35.) Снова проверьте вывод ifconfig wiO, обращая внимание на строку status. Если вы увидите status: associated, это означает, что вы успешно подключились к беспроводной сети. Также проверьте ssid: MyNetwork (наряду с прочей информацией), указывающую, что вы подключились к корректной сети по имени. Затем попробуй-
Работав сети с помощью РРР и 802.11 I ZTZ I Глава 24 I I те воспользоваться утилитой ping (как было показано в главе 23), чтобы проверить, что вы успешно подключились к Internet. Если ваша беспроводная сеть не использует шифрования и аутентификации, и такая конфигурация вам подходит, можете зафиксировать ее для постоянного применения в файле /etc/rc.conf: ifconfig_wiO="inet 192.168.0.10 netmask 255.255.255.0 ssid HyNetwork" Однако никогда не рекомендуется запускать беспроводную сеть без шифрования — и большинство домашних и корпоративных сетей в обязательном порядке шифруют свой трафик. Вы должны убедиться, что FreeBSD работает с этим дополнительным уровнем защиты. Шифрованные беспроводные соединения Протокол WEP (Wired Equivalent Privacy — приватность, эквивалентная проводной сети) — это схема шифрования беспроводных сетей, которая обеспечивает возможность подключения к сети или перехвата пакетов только для авторизованных пользователей. Это не особенно надежный протокол, и его 40-битный ключ был взломан несколько лет назад. Большинство беспроводных Ethernet-карт поддерживают более надежный 128-битный (на самом деле 102-битный) стандарт. Используйте этот метод, если это возможно. Хотя по ряду причин важно понять, что WEP называется "Wired Equivalent" (эквивалент проводной сети): этот протокол и не задумывался как исключительно надежный, и обеспечивает лишь ту меру безопасности, которая возможна в проводных сетях. Точно так же, как существует опасность, что некто проникнет в ваш дом и подключит кабель Ethernet в ваш коммутатор, также возможен взлом сети WEP для прослушивания ваших коммуникаций. IPSec является намного более безопасным решением, чем WEP; однако не так много точек доступа поддерживают его, как поддерживают WEP. Вы можете узнать подробнее о IPSec в главе 31 или в онлайновом справочнике (http: //www. f reebsd. org/ handbook/ip sec. html). Для начала узнайте, какой секретный ключ установлен в вашей точке доступа. В большинстве случаев это будет обычный текстовый пароль, который вы можете указать в конфигурации точки доступа. Для данного примера предположим, что установлен пароль тураssword. (Обратите внимание, что это не пароль для администрирования самой точки доступа — для этого обычно существует совершенно отдельный пароль.) Если вы ранее отключили шифрования в целях тестирования, теперь включите его обратно. Затем потребуется загрузить модуль ядра wlan_wep: # kldload wlan_wep Если вы планируете часто использовать шифрованный доступ к беспроводной сети, вам стоит добавить его в файл loader.conf либо скомпоновать в специальное ядро, как описано в главе 18. Теперь выдайте команду if con fig, как делали ранее, но на этот раз с несколькими дополнительными командами в конце для включения WEP и спецификации ключа: # ifconfig wiO inet 192.168.0.10 netmask 255.255.255.0 ssid MyNetwork Ь wepmode on wepkey Oxmypassword
Работа в сети FreeBSD Теперь если вы введете if conf ig wiO, то должны будете увидеть строку, похожую на следующую: authmode OPEN privacy MIXED deftxkey 1 wepkey 1:104-bit txpowmax 100 СОВЕТ Если в выводе присутствует deftxkey undef, добавьте deftxkey 1 в строку if conf ig. Теперь, если вы может^ войти в Internet, вас можно поздравить — вы стали полнофункциональным клиентом беспроводной сети с шифрованием соединений! Сценарии подключения и отключения Будет неплохой идеей написать сценарии для ручного запуска и останова беспроводной сети, как при конфигурировании PPR В отличие от РРР, однако, эти сценарии являются по своей природе специализированными, и не встроены ни в какую существующую архитектуру; здесь вам придется положиться на интуицию. Например, в листинге 24.2 показан пример сценария wi-up, который вы можете сделать исполняемым и поместить в /usr/local/bin, чтобы подключаться к беспроводной сети простой командой wi-up. Листинг 24.2. Пример сценария wi-up для подключения к беспроводной сети #!/bin/sh kldload wlan_wep ifconfig wiO inet 192.168.0.10 netmask 255.255.255.0 ssid MyNetwork t wepmode on wepkey Oxmypassword deftxkey 1 echo "Состояние беспроводной сети:" ifconfig wiO , Аналогично сценарий wi-down (показанный в листинге 24.3) может быть полезен для выключения беспроводной карты и выхода из сети, что предотвратит таймауты в попытках подключения к несуществующей сети и сэкономит заряд батареи портативного компьютера. Листинг 24.3. Пример сценария wi-down для выхода из беспроводной сети #!/bin/sh ifconfig wiO destroy echo "Состояние беспроводной сети:" ifconfig wiO kldunload wlan wep
ГЛАВА 25 Конфигурирование почтовых служб В этой главе... • Введение в SMTP • Агенты передачи почты (МТА) и почтовые агенты пользователя (MUA) • Конфигурирование базовых почтовых служб с Sendmail • Понятие ретрансляции • Введение в РОРЗ ¦ • Конфигурирование сервера РОРЗ с помощью Qpopper • Конфигурирование сервера IMAP с помощью IMAP-UW • Электронная почта для отдельно стоящих рабочих станций • Фильтрация мусорной почты средствами Procmail и SpamAssassin • Обзор некоторых альтернатив Sendmail
Работа в сети FreeBSD Что есть Internet без электронной почты? Вероятно, даже Web с его бросающейся в глаза графикой и коммерческими возможностями не сравнится по удобствам и пользе со старейшим приложением Internet — электронной почтой. Каждый сервер UNIX в мире обладает встроенной поддержкой электронной почты — и не только возможностью для пользователей отправлять и получать почтовые сообщения, но и способностью самой системы служить полноценным почтовым сервером. FreeBSD - не исключение. Но ловушка в том, что конфигурирование Sendmail — классического серверного приложения SMTP, которое формирует становой хребет UNIX и Internet — является, возможно, наиболее устрашающей административной задачей из всех, с которыми вам придется столкнуться. Помимо прочего, Sendmail — возможно, наиболее уникальное из всех серверных приложений в том, что имеет конфигурационный файл для своего конфигурационного файла. Однако не волнуйтесь — эта глава предоставит вам солидный фундамент для использования Sendmail и основные знания, необходимые для выполнения функций администратора электронной почты. Вы узнаете, как конфигурировать и управлять почтовым сервером для обеспечения безопасности и производительности, избегая слишком глубокого погружения в детали, которые создают впечатление о том, что Sendmail слишком огромно и неоправданно сложно. Данная глава также расскажет о другой стороне электронной почты: POP и IMAP. Это протоколы, используемые удаленными клиентами для приема электронной почты. К счастью, их применение вовсе не так сложно, как Sendmail, даже когда вы настраиваете их для защищенного (шифрованного) обмена. И, наконец, в этой главе мы опишем некоторые альтернативы Sendmail, и рассмотрим, как переключиться на них, если вы решите, что администрирование Sendmail не стоит головной боли, с ним связанной. Вы также увидите, как конфигурировать почтовый сервер для фильтрации нежелательной "мусорной" почты, называемой спамом, используя инструменты от независимых разработчиков, такие как Procmail и SpamAssassin. Введение в SMTP Простой протокол передачи электронной почты (Simple Mail Transfer Protocol - SMTP) — один из старейших коммуникационных протоколов в Internet; он почти так же стар, как сама электронная почта. Назначение SMTP — передавать простые текстовые сообщения с одного хоста на другой. Эта передача часто происходит между несколькими серверами последовательно, как, например, когда Windows-клиент, работающий по коммутируемому соединению (дозвону) отправляет сообщение электронной почты на почтовый сервер поставщика Internet-услуг, который затем передает его почтовому серверу получателя, с тем, чтобы оттуда его забрала почтовая программа получателя. Последовательности SMTP редко когда бывают длиннее, чем в приведенном примере. Они не похожи на организацию самой сети Internet, с ее иерархической структурой маршрутизации, в которой пакет может преодолеть 20 или 30 маршрутизаторов на пути от одного конца к другому Вместо этого SMTP-сервер отправителя соединяется непосредственно с SMTP-сервером получателя и какие- либо дополнительные звенья в этой цепи достаточно редки. Сам по себе SMTP, как утверждает его название, прост. Клиент SMTP — такой, как настольная программа электронной почты или ретранслирующий SMTP-сервер - инициирует подключение к TCP-порту с номером 25 на удаленном SMTP-сервере, за
Конфигурирование почтовых служб Глава 25 741 которым следует автоматизированный код приветствия (greeting code), некоторые необязательные команды аутентификации и ряд дополнительных команд, устанавливающих тип транзакции, которую пытается выполнить отправитель. Затем получатель запрашивает сообщение, и отправитель его посылает. И, наконец, отправляется команда завершения, после чего соединение закрывается. Это — почти и все, что в действительности делает SMTP, и помимо этого совсем немного дополнительных возможностей встроены в протокол. Никакого специализированного программного обеспечения для использования SMTP не требуется; фактически, вы можете осуществить полностью корректную транзакцию SMTP непосредственно из командной строки FreeBSD. В листинге 25.1 показан пример такой транзакции. Полужирным выделен клавиатурный ввод во время сеанса. Листинг 25.1. Выполнение корректной транзакции SMTP # telnet destination.com 25 Trying 64.41.134.166... Попытка соединения с 64.41.134.166... Connected to destination.com. Подключение к destination.com. Escape character is 'А] ' ¦ Служебный символ ,Л]'. 220 destination.com ESMTP Sendmail 8.13.3/8.13.3; Tue, 10 Jan 2006 Ь 16:13:30 -0800 (PST) HELO stripes.sender.com 250 destination.com Hello w012.z064002043.sjc-ca.dsl.cnc.net [64.2.43.12], Ь pleased to meet you 250 destination.com Hello w012.z064002043.sjc-ca.dsl.cnc.net [64.2.43.12], Ь рады видеть вас MAIL From: frank@sender.com 250 2.1.0 frank0sender.com... Sender ok 250 2.1.0 frankesender.com... Отправитель ok RCPT To: bob@destination.com 250 2.1.5 bob@destination.com... Recipient ok 250 2.1.5 bob&destination. com... Получатель ok DATA 354 Enter mail, end with "." on a line by itself 354 Введите текст сообщения, завершите ". " в отдельной строке From: frank@sender.com То: bob@destination.com Subject: Тестирование, 123— Тестовое сообщение. 250 2.0.0 f4H5uCu53501 Message accepted for delivery 250 2.0.0 f4H5uCu53501 Сообщение принято для доставки QUIT 221 2.0.0 destination.com closing connection 221 2.0.0 Закрытие соединения с destination.com Connection closed by foreign host. Соединение закрыто внешним хостом.
Работа в сети FreeBSD НА ЗАМЕТКУ Команда helo, с которой начинается сеанс SMTP, обычно заменяется на ehlo (Extended helo), которая принимает более сложные аргументы. Как видите, обмен между двумя серверами выполняется посредством четырехбуквенных кодов команд, по соглашению записываемыми заглавными буквами и с аргументами, включенными в заголовки сообщений. Сообщение, которое получает bob@destination.com, придет в его почтовую программу со следующими заголовками: From: frank@sender.com То: bob@destination.com Subject: Тестирование, 123... Заголовки отделены от тела сообщения одной пустой строкой. Единственная точка в строке означает конец тела сообщения; когда программа-получатель SMTP видит ее, она доставляет сообщение — в случае Sendmail добавляя его в файл почтового ящика получателя (/var/mail/bob, если это машина FreeBSD). И это все. Полноценный SMTP-сервер, такой как Sendmail, передает свои сообщения, используя дополнительные команды для повышения производительности и эффективности, но его функциональность работает точно по такому методу, как показано в примере» который вы только что видели. Сложность Sendmail заключается главным образом, в области, находящейся вне действительной транзакции SMTP, и обычно связана с обеспечением доступа к функциям SMTP только для авторизованных пользователей. Причина того, что клиент должен сначала подключиться к SMTP-серверу поставщика Internet-услуг вместо подключения непосредственно к получателю, в том, чтобы использовать преимущества очередизации. Благодаря очередизации, SMTP-сервер может хранить каждое сообщение, которое он получает от клиента (как от локальной, так от удаленной машины) в каталоге "области хранения" (обычно называемой очередью) у где оно ожидает подключения к SMTP-серверу конечного адресата. Это подключение может быть доступно немедленно — в таком случае сообщение почти не задерживается в очереди. Однако, если подключение невозможно, сообщение остается в очереди до тех пор, пока это соединение не, будет установлено и открыто, когда программа SMTP отправит его. НА ЗАМЕТКУ Очереди4ация — это поведение SMTP-серверов уровня приложения. Выгоды от очередизаци для SMTP во многом подобны DNS, который усовершенствует функциональность приложений Internet, не будучи частью стека TCP/IP. Выгода от очередизации состоит в том, что она превращает доставку почты из "синхронного" в "асинхронный" процесс, когда оба клиента не обязаны участвовать во всех фазах транзакции. Очередизация избавляет клиента коммутируемой линии от необходимости искать SMTP-сервер хоста назначения, помещая сообщения в очередь и повторяя попытки соединения через регулярные интервалы. Когда клиент дозванивается, он может установить единственное соединение, загрузить все накопившиеся почтовые сообщения в выходную очередь SMTP и затем отключиться. Сервер
Конфигурирование почтовых служб | ZTT I Глава 25 I I обрабатывает все шаги, начиная с этого момента, а клиент свободен от задач, связанных с отправкой почты. Агенты передачи почты (МТА) и почтовые агенты пользователя (MUA) Роль агента передачи почты (Mail Transfer Agent — МТА) заключается в передаче почты от одного почтового сервера на другой. Схематическая диаграмма пути передачи почты от одного лица другому показана на рис» 25.1. Подключается ли клиент с удаленного сайта через коммутируемый канал или находится за консолью самого почтового сервера, путь сообщения одинаков: от пользовательского ввода к МТА (обычно известного, как клиентская почтовая программа или что-то вроде этого), сообщение помещается в очередь сообщений SMTP-сервера отправителя, откуда МТА (например, Sendmail) извлекает его, как только будет доступно соединение с SMTP- сервером получателя, и он будет готов принять его. (Поскольку этот процесс передает сообщение, которое не начинает и не завершает свой путь на машине самого SMTP-сервера, этот шаг называется ретрансляцией (relaying)). На удаленной системе МТА помещает полученное сообщение в почтовый ящик получателя, где оно может быть прочитано в онлайновом режиме почтовым агентом пользователя (Mail User Agent — MUA) или загружено в MUA стороны клиента по протоколу РОРЗ или IMAP. Администратора FreeBSD будет интересовать способ работы Sendmail в качестве МТА — как в роли отправителя (ретранслятора), так и в роли получателя. В этом разделе мы обсудим также программы MUA — как локального типа, которые пользователь запускает на самой машине FreeBSD, так и удаленного типа, занимающихся выгрузкой и загрузкой сообщений. Вы узнаете, как эти программы взаимодействуют с "областями хранения" в МТА: очередями сообщений и почтовыми ящиками пользователей. Распространенные МТА Перечислим несколько программ — агентов доставки почты, обычно используемых в Internet. • Sendmail. Наиболее широко используемый МТА, программа Sendmail была разработана Эриком Оллменом (Eric Allman) в 1983 году, и с тех пор превратилась в межплатформенный стандарт де-факто, пользующийся как коммерческой поддержкой, так и представляемый в виде свободно распространяемого компонента. Sendmail, Inc. (http: //www. sendmail. com) — полноценная корпорация, созданная для поддержки Sendmail в коммерческих выпусках UNIX и Linux; проект Sendmail (http://www.sendmail.org) предоставляет бесплатный, поддерживаемый добровольцами компонент, позиционируемый традиционным способом открытого кода для пользователей и систем вроде FreeBSD, в которые Sendmail изначально встроен. • Microsoft Exchange. Windows-эквивалент Sendmail, также как и множество других типов систем передачи сообщений (вроде РОРЗ, NNTP, LDAP и календаря), Exchange является коммерческим продуктом с "закрытым кодом" — словом, в традициях Microsoft.
744 Работа в сети FreeBSD Часть V = МТА [(ретранслятор)! Internet (SMTP) Удаленное (коммутируемое) или локальное соединение JT3 Очередь 1—J сообщений СП (SMTP) MUA т Удаленное (коммутируемое) соединение Пользовательский ввод Пользовательский почтовый ящик Локальное соединение Пользователь Рис. 25Л. Диаграмма пути прохождения электронной почты от одного пользователя к другому, демонстрирующая роли MUA и МТА • Postfix. Написанная В. Венемой (W.Venema) в качестве альтернативы Sendmail, программа Postfix задумана как более быстрая, более безопасная и легкая в эксплуатации, чем Sendmail. В конце этой главы вы узнаете о ней больше. • QmaiL Еще один ответ Sendmail. Qmail была написана Дэном Бернстайном (Dan Bernstein) и быстро завоевала популярность благодаря своей репутации как безопасной и быстрой (хотя Postfix по общему мнению еще быстрее). К тому же, в отличие от Postfix (который пытается имитировать Sendmail в его взаимодействии с системой, например, в том, где он хранит свои файлы спулинга и конфигурации), Qmail реализует свою собственную структуру и не пытается облегчить передачу для пользователей Sendmail. Qm^il — хороший выбор для администраторов, применяющих диспетчер почтовых рассылок EZMLM, также принадлежащий "перу** Бернстайна, с которым Qmail тесно интегрирована. Огромное множество МТА используются по всей сети Internet; те, что перенесены в FreeBSD, можно найти в /usr/ports/mail. Распространенные MUA Пользовательские почтовые агенты еще более многочисленны, чем МТА. Поскольку постовые клиенты Windows и Macintosh (такие как Microsoft Outlook/Outlook Express, Eudora. Apple Mail, Mozilla Thunderbird и тому подобные) столь широко известны, следующий список содержит только наиболее популярные MUA, доступные для FreeBSD.
Конфигурирование почтовых служб Глава 25 745 • Pine, Возможно, аббревиатура от "Program for Internet News and Email" (Программа для новостей Internet и электронной почты), но существует версия, что имя этого продукта с открытым исходным кодом от Вашингтонского университета на самом деле расшифровывается как "Pine Is Not Elm" (Pine — это не Elm) (что-то подобное GNU - "GNU Not UNIX" (GNU - это не UNIX)). В любом случае, Pine довольно широко используется, предлагая интуитивно понятный пользовательский интерфейс, множество современных средства обработки сообщений, интегрированное чтение групп новостей USENET и составитель сообщений, включающий мощный редактор pico, который поставляется в пакете с Pine. • Elm. Предок Pine (по крайней мере, если верить молве), Elm эволюционировал от древних программ mail и mailx, которые обслуживали электронную почту в университетских и правительственных сетях, предшествовавших современной коммерческой сети Internet. Довольно примитивный по современным меркам, Elm все еще имеет немало активных сторонников. • Mutt MUA-помесь, включающий средства из Elm, Pine и множества прочих программ. Mutt претендует на звание наиболее развитого среди них всех. Может быть, так оно и есть. Он обладает средствами, которых нет в других программах, включая многие такие, которые требуют графических MUA со стороны клиента в других контекстах, а также обладает значительными возможностями настройки. • mail Предок всех современных дружественных к пользователю почтовых клиентов, утилита командной строки mail доступна на всех платформах UNIX (включая FreeBSD) и предоставляет пользователю рудиментарный доступ к электронной почте, даже когда нет ничего другого. Она также может присутствовать в сценариях и довольно удобно встраиваться в программы оболочки или код на языке Perl. Следует отметить, что перечисленные здесь почтовые агенты являются ориентированными на командную оболочку, то есть могут выполняться в сеансах Telnet или SSH, монополизируя окно сеанса. Это значит, что они (почти) исключительно основаны на тексте, и такие вещи, как встроенные изображения и форматирование HTML в них не работает (хотя их можно конфигурировать на открытие присоединенных документов во вспомогательных приложениях, если вы запускаете их на графических рабочих станциях FreeBSD). Однако это также означает, что вы можете проверять свою почту, используя эти программы, независимо от того, где находитесь, просто открыв сеанс Telnet или SSH. К тому же вы будете почти гарантировано в безопасности от вирусов, ориентированных на Windows/Outlook, которыми переполнен Internet. Множество полноценных графических почтовых приложений также доступны для FreeBSD — они интегрированы в среды KDE и GNOME. Эти приложения превращают FreeBSD в пользовательские рабочие станции, где графические, мультимедиа- сообщения можно просматривать непосредственно, пока вы работаете за компьютерной консолью (они не работают столь же хорошо, если машина FreeBSD является удаленным сервером, где среда XII недоступна). Больше информации о почтовых программах подобного рода читайте в подразделе "Приложения электронной почты" главы 6.
Работа в сети FreeBSD Конфигурирование базовых почтовых служб с Sendmail Система FreeBSD поставляется с установленной программой Sendmail и уже сконфигурирована для обслуживания базовых почтовых нужд. Все, что вам следует сделать для включения Sendmail (чтобы она запускалась при загрузке системы) — это добавить следующую строку в /etc/rc. conf: sendmail__enable="YES" Затем вы можете перегрузиться, чтобы запустить сервер Sendmail, или запустить его с помощью команды /etc/rc. d/Sendmail start. Когда система запущена и работает, вы можете отправить сообщение любому в Internet, и они могут посылать сообщения вам — при условии правильной настройки нескольких вещей. По большей части, речь идет не об элементах конфигурации для самой программы Sendmail, а скорее для системы в целом. Sendmail полагается на систему, чтобы получить несколько гарантий, прежде чем она сможет работать без сбоев. Вы можете решить заменить Sendmail другой МТА, такой как Postfix или Qmail; в конце главы мы расскажем, как это сделать. Между тем, поскольку конфигурация Sendmail по умолчанию работает хорошо на подавляющем большинстве серверов, мы поговорим о том, как эффективно управлять самой программой Sendmail. Раскладка файлов Sendmail Существуют четыре места в системе, имеющие отношения к Sendmail. • /etc/mail. Конфшурационные файлы Sendmail. • /usr/mail. Почтовые ящики пользователей. • /var/spool/mqueue. Файлы очередей входящих сообщений. • /var/spool/clientmqueue. Файлы очередей исходящих сообщений. Сама программа Sendmail находится в /usr/sbin/sendmail, а ее файлы протоколов записываются в /var/log/maillog (они подвергаются ежедневной ротации задачей periodic, о которой говорится в главе 15). [НА ЗАМЕТКУ ] Исторически так сложилось, что некоторые системы помещают бинарный код Sendmail в /usr/ lib/sendmail. И некоторые программы ожидают найти Sendmail именно там, включая ряд старых инструментов Web, которые были разработаны без учета FreeBSD или Linux. Если вы запускаете эти программы, имеет смысл вмешаться в структуру каталогов FreeBSD, создав символическую ссылку от исторического расположения на текущее: # In -в /usr/sbin/sendmail /usr/lib/sendmail
Конфигурирование почтовых служб Глава 25 НА ЗАМЕТКУ : /usr/sbin/sendmaii — это не только сама Sendmail; на самом деле это ссылка на "оболочку", маленькую программу, которая принимает команды и ввод данных и отправляет их Sendmail или другому МТА. Назначение этой оболочки — позволить заменять Sendmail другими МТА вроде Postfix; поскольку все ваши программы взаимодействуют с оболочкой, а не с самой программой Sendmail, оболочка гарантирует, что такой переход будет прозрачным для всех ваших системных функций. Файлы почтовых ящиков (почтовые спулы) в /var/mail — это просто текстовые файлы, каждый из которых назван по имени пользователя — его владельца, с правами доступа, установленными в 600 (читаемый и записываемый только владельцем). Новые сообщения добавляются в конец этого файла. Существуют также временные файлы блокировки POP, имеющие нулевую длину и имя в форме .username.pop. Они принимают содержимое соответствующего файла почтового спула, пока открыто соединение РОРЗ, и любые непереданные остатки затем копируются обратно в почтовый ящик. Позднее в этой главе мы поговорим еще о работе сервера РОРЗ. Конфигурационные файлы Ниже описаны некоторые из файлов в /etc/mail, которые важны для работы Sendmail. /etc/mail/sendmail.cf Это главный конфигурационный файл Sendmail. Однако в отличие почти от любого другого конфигурационного файла для любой другой программы, вам не следует редактировать этот файл, чтобы изменить поведение Sendmail. Вместо этого вы должны вносить изменения на более высоком "макроуровне" в конфигурационном "мастер-файле" (.тс), о котором будет сказано ниже, а затем из него компилировать sendmail. cf. Файл sendmail. cf содержит опции, наборы правил и средства — все в формате, который может показаться весьма запутанным и почти нечитабельным для человека. Поэтому лучше оставить sendmail. cf в покое. Файл sendmail.сf определяет поведение Sendmail в отношении обработки входящей почты, адресованной локальным пользователям. Соответствующий конфигурационный файл submit.сf управляет исходящей почтой, сгенерированной локальными пользователями, и определяет, как она передается удаленным серверам SMTP. Подробности о конфигурировании "исходящей" части Sendmail читайте ниже в этой главе, в разделах "Очередь сообщений" и "Электронная почта для отдельно стоящих рабочих станций**. /etc/mail/freebsd.mc Файл /etc/mail/freebsd.mc — конфигурационный "мастер-файл" Sendmail. Он содержит список средств и опций, переопределяющих настройки по умолчанию стандартного конфигурационного файла, почти в такой же манере, как и /etc/rc.conf переопределяет /etc/defaults/rc.conf. Однако в freebsd.mc формат установок намного более причудлив. Команды задаются на макро-языке т4 (который едва ли используется помимо конфигураций Sendmail). Файл .тс затем компилируется вместе с файлом умолчаний cf .mc из исходных файлов Sendmail в /usr/share/sendmail или
I Z77 I Работа в сети FreeBSD /usr/src/contrib/sendmail для создания выходного файла .cf. Затем вы можете инсталлировать этот файл как новый sendmail. cf. Звучит запутанно и нелепо? Да, это так. Методы конфигурирования Sendmail всегда считались слишком запутанными, и лишь соображения обратной совместимости предотвращают их полный и решительный пересмотр. Однако конфигурационный процесс в наше время уже намного упрощен, благодаря усилиям разработчиков FreeBSD, особенно в наиболее свежих версиях. Раньше для того, чтобы регенерировать файл sendmail. cf, вы должны были перейти в собственный исходный каталог, найти, какой файл .тс наиболее подходит вашей системе, внести изменения, согласно онлайновой документации, а затем углубиться в загадочные команды компиляции т4 для генерации выходного файла, который затем нужно было еще и устанавливать вручную. Состояние дел в наши дни намного улучшилось по сравнению с этим, хотя оно еще и далеко от того, что можно было бы назвать дружественным к пользователю. Каждая строка языка т4 содержит в некоторой точке строку dnl; это означает "delete through newline" (удалить до новой строки), и помечает конец читаемой строки (каждая строка должна иметь такой маркер). Чтобы полностью закомментировать строку, поместите dnl в ее начале. В противном случае — в конце. В каталоге /etc/mail имеется файл makefile, в котором определены цели, позволяющие вам создать новый файл .cf из файла freebsd.mc простой командой make cf. Затем вы инсталлируете выходной файл (freebsd.cf) в sendmail.cf, используя команду make install: # cd /etc/mail # make cf /usr/bin/m4 -D_CFJDIR_-/usr/share/sendmail/cf/ /usr/share/sendraail/cf/ro4/cf.m4 ^freebsd.mc > freebsd.cf # make install install -c -m 444 freebsd.cf /etc/mail/sendmail.cf Файл /etc/mail/Makefile имеет множество других применений, как вы убедитесь чуть позже. НА ЗАМЕТКУ make-файл (по соглашению именуемый как Makefile) — это специальный файл, находящийся на вершине дерева исходного кода; он содержит "цели сборки" (build targets), позволяющие компилировать код некоторым предопределенным образом. Мы говорили о таких файлах, используемых портами, в главе 16. В примере настоящей главы вы можете компилировать программы командой make, но цель install должна указывать команде make, что вы хотите запустить инсталляционные процедуры, предварительно описанные в make-файле данного порта. В /etc/mail, предоставленном FreeBSD, make-файл позволяет компилировать различные базы данных, дополняющие конфигурацию Sendmail, и даже управлять самой программой Sendmail. Но сам по себе он не является конфигурационным файлом. Скорее, это часть системы. Поэтому вы не должны модифицировать его, если только точно не знаете, что делаете. Точно так же, как /etc/mail/f reebsd.mc служит источником для генерации стандартного файла sendmail. cf для входящей почты, так и f reebsd. submit .mc определяет опции для файла submit. cf, управляющего исходящей почтой. Подробнее о конфигурации "исходящей" части Sendmail читайте далее в настоящей главе, в разделах "Очередь сообщений" и "Электронная почта для отдельно стоящих рабочих станций".
Конфигурирование почтовых служб Глава 25 749 /etc/mail/aliases В каталоге /var/mail находятся почтовые ящики для каждого пользователя системы; однако некто, имеющий почтовый адрес на вашей машине, не обязан иметь там учетную запись пользователя. Вы всегда можете установить псевдонимы для отображения адресов входящей электронной почты на любой другой адрес, будь то адрес, расположенный где-то в Internet, другая учетная запись на вашей же машине или даже канал, связанный с файлом или программой. Файл по умолчанию /etc/ mail/aliases включает примеры этого. Строка псевдонима содержит имя псевдонима, двоеточие, пробел или знак табуляции (необязательно) и целевой адрес или программный канал: tiger: bob@stripes.com fsmith: frank pager: "I/usr/local/bin/pageme" dump: "^/home/frank/dun^me" mylist:include:/home/frank/list.txt Последний пример — "включающий" псевдоним, который читает список адресов их текстового файла, находящегося в указанном месте. Это простейший способ управления списками рассылки. Просто внесите изменения во включаемый файл, и псевдоним всегда укажет на свежий список назначенных получателей. Традиционно в соответствии с принятым сетевым этикетом (anetiquettew), в системе предусмотрено множество административных псевдонимов для разных целей, и все они являются псевдонимами root. Некоторые из этих "псевдо учетных записей" включают abuse (адрес для сообщений о нежелательной почте или злонамеренной деятельности, обнаруженной на вашем сервере), postmaster (лицо, запускающее почтовый сервер) и webmaster (лицо, отвечающее за Web-сервер). Некоторые из них уже являются псевдонимами root в конфигурации по умолчанию, а другие можно включить, убрав комментарии с них. После внесения любых изменений в /etc/mail/aliases вы должны перестроить файл aliases.db, который является версией файла aliases с хеш-таблицей, обеспечивающей быстрый поиск (как и в случае с /etc/master .password, о котором шла речь в главе 13). Для этого вы можете воспользоваться традиционной командой newa liases или, в целях согласованности с остальными задачами сопровождения, зайти в /etc/mail и выдать команду make aliases: # make aliases /usr/sbin/sendmail -bi /etc/mail/aliases: 25 aliases, longest 10 bytes, 254 bytes total /etc/mail/aliases: 25 псевдонимов, самых длинный 10 байт, всего 254 байта chmod 0640 /etc/mail/aliases.db Показанные здесь команды не вернут никакого вывода, если база данных псевдонимов не нуждается в обновлении. НА ЗАМЕТКУ Использование глобальных псевдонимов — не единственный способ перенаправить почту с одного локального адреса на другой или же на внешний адрес. Например, если пользователь желает, чтобы вся входящая почта автоматически отправлялась по некоторому внешнему адресу, вы можете использовать /etc/mail/aliases для выполнения этого трюка, однако это потребует доступа от имени root. Существует лучший способ, если пользователь имеет полноценную учетную запись в системе.
750 Работа в сети FreeBSD Часть V Все, что пользователь должен сделать; чтобы перенаправить почту на другой адрес — это создать файл . forward в своем домашнем каталоге и в нем указать адреса для перенаправления почты. Это можно сделать в любом текстовом редакторе либо просто с помощью команды echo: # echo "frank@8omewhereelse.com" > .forward Удаление этого файла прекратит дальнейшее перенаправление почты. /etc/mail/access База данных access предоставляет возможность применить определенные правила к отдельным хостам, подсетям или группам адресов — отличная защита от спама. Применяемые правила включают: OK, REJECT, RELAY, DISCARD и 550 <сообщение>. Содержимое файла по умолчанию /etc/mail/access показывает примеры форматирования поля адрес/имя хоста: cyberspammer.com 550 We don't accept mail from spammers cyberspammer.com 550 Мы не принимаем почту от спамеров FREE.STEALTH.MAILER@ 550 We don't accept mail from spammers another.source.of.spam REJECT okay.cyberspammer.com OK 128.32 RELAY Адреса в левой части могут быть полными именами хостов или IP-адресами либо же частичными именами или адресами; cyberspammer.com соответствует любому имени хоста в домене cyber spammer. com, a 128.32 покрывает целую сеть класса В 128.32 .ххх. ххх. Правая сторона содержит правила, которые могут быть следующими. • ОК. Принимает сообщения от указанного хоста независимо от того, что хост может не пройти другие проверки в системе (такие как антиретрансляционные предосторожности, о которых речь пойдет ниже). • REJECT. Отклоняет соединения, инициируемые указанным хостом. • DISCARD. Молча уничтожает сообщения после их приема, заставляя отправителя думать, что его сообщение было успешно доставлено. • RELAY. Разрешает ретрансляцию для указанного хоста, переопределяя прочие проверки (подобно ОК). • 550 сообщение. Специфицирует сообщение "отклонения", отображающееся у отправителя на указанном хосте. Это сообщение появится во время сеанса SMTP и будет включено в почтовое сообщение об ошибке, отправленное обратно отправителю. После того, как вы внесете изменения в /etc/mail/access, файл access .db должен быть сгенерирован повторно. Это можно сделать с помощью цели make maps, которая генерирует любой из файлов отображения средств, измененных с момента последнего запуска make maps. После этого запустите команду make restart, чтобы перезапустить мастер-процесс Sendmail с новым файлом access.db: • make maps • make restart Restarting; sendmail sendmail-clientmqueue. Перезапуск: sendmail sendmail-clientmqueue.
Конфигурирование почтовых служб Глава 25 /etc/mail/local-host-names Ранее известный как sendmail. cw, этот файл специфицирует все имена хостов, наличия которых требует ваш сервер. Эта информация становится особенно важной, если вы занимаетесь хостингом множества доменов и обеспечиваете почтовые услуги для них (виртуальный хостинг). В этой ситуации, если вы не добавите каждое важное доменное имя в файл local-host-names, входящее сообщение, назначенное для домена, который вы обслуживаете, будет отклонено обратно отправителю с ужасным сообщением MX list for <domain> loops back to myself; 16cal configuration error (Список MX для <домен> содержит петлю на самого себя; локальная ошибка конфигурации). # cat /etc/ local -host-names example.com www.example.com bobsmachine.com Файл local-host-names имеет простой формат: список имен хостов, по одному на строку. Этот файл не существует в установке по умолчанию, но вы должны создать его, если добавляете псевдонимы доменных имен и имен хостов к своей машине через DNS. После добавления имен в список запустите make restart для перезапуска сервера: # make restart Restarting: sendmail sendmail-clientmqueue. Перезапуск: sendmail sendmail-сlientmqueue. /etc/mail/virtusertable Также будучи субъектом виртуального хостинга, /etc/mail/virtusertable предоставляет способ отображения адресов домена, которому предоставлен хостинг, на локальные учетные записи, другие адреса или сообщения об ошибках. Это нечто вроде гибрида базы данных access и файла aliases. Скажем, вы предоставляете хостинг вторичному домену по имени mycave. org. Вы хотите, чтобы послания на webmaster@mycave.org переадресовывались локальному пользователю "Ы1Г, на info@mycave.org — удаленному адресу annedelsewhere.com, а все остальные адреса (@mycave. org) отклонялись. Это может быть сделано посредством следующего набора правил: webmaster@mycave.org bill info@mycave.org anne@elsewhere¦com Gmycave.drg error mouser User unknown Qmyca ve. org error mouser Неизвестный пользователь Обратите внимание, что порядок, в котором специфицированы эти правила, значения не имеет; когда вы строите хеш-таблицу vi r t user table, db, каждое правило получает собственное поисковое значение, и порядок в virtusertable несущественен. Как и с базой данных access, вы должны пересобрать virtusertable.db и затем перезапустить сервер. Проще всего это сделать с помощью команды make maps, хотя имейте в виду, что это перестроит все базы данных отображений в /etc/mail, которые подверглись модификации: # make maps /usr/sbin/makemap hash virtusertable.db < virtusertable chmod 0640 virtusertable.db 751
_со Работа в сети FreeBSD f Ол Ь-г: I—__1 Часть V /usr/sbin/makemap hash access.db < access chmod 0640 access.db # make restart Restarting; sendmail sendmail-clientmqueue. Перезапуск: sendmail sendmail-clientmqueue. Блестящую и полную дискуссию о виртуальном хостинге и использовании файла virtusertable можно найти на информационном сайте консорциума Sendmail (http://www•sendmail.org/virtual-hosting.html). НА ЗАМЕТКУ Кстати, /etc/mail/Makefile и все эти согласованные цели для пересборки различных конфигурационных баз данных являются дополнениями, выполненными командой FreeBSD, и не являются частью программы Sendmail в том виде, как она поставляется разработчиками. Ряд других систем не придерживается этих соглашений. Если вы собираетесь сопровождать установку Sendmail в системе Solaris или на какой-то другой платформе, вам нужно будет узнать, какие там приняты имена целей в make-файле, чтобы выполнять те же самые задачи. В этом отношении очень полезна документация на http: //www. sendmail. org. Преобразование DNS Запуск успешного сервера Sendmail действительно требует, чтобы вы имели аккуратный набор информации DNS, установленной на вашей машине. Если вы просто инсталлировали FreeBSD, назначили ей доступный IP-адрес и пытаетесь отправить почту, то, скорее всего, получите ответ, сообщающий, что удаленный сервер не может преобразовать ваше имя хоста. Многие SMTP-серверы, включая Sendmail в его конфигурации по умолчанию, не принимают почты от отправителей без полностью квалифицированных доменов в их адресах или преобразуемых DNS-имен. Прежде чем вы попытаетесь в полной мере ввести Sendmail в эксплуатацию на вашей машине, вам нужно будет убедиться, что у вас правильно настроены обратные поиски DNS. Вы можете проверить это командой nslookup, сообщив ей IP-адрес вашей машины в аргументе: # nslookup в tripes. example. com Server: lion.example.com Сервер: lion.example.com Address: 64.41.131.132 Адрес: 64.41.131.132 Name: stripes.example.com Имя: stripes.example.com Address: 64.41.131.102 Адрес; 64.41.131.102 Этот вывод показывает корректную настройку DNS, что позволит Sendmail нормально работать. Однако вы можете получить нечто вроде следующего: # nslookup stripes.example .com Server: lion.example.com Сервep: lion.example.com Address: 64.41.131.132 Адрес: 64.41.131.132
Конфигурирование почтовых служб Г ^ ГпаиаМ I 753 *** lion.example.com can't find stripes.example.com: Non-existent host/domain *** lion.example.com не может найти stripes.example.com: Несуществующая пара хост/домен Это значит, что у вас будут проблемы с отправкой почты до тех пор, пока DNS не будет правильно настроен. В главе 32 вы узнаете больше о DNS. НА ЗАМЕТКУ Вы должны выполнить проверку с удаленным и независимым сервером DNS, а не только с тем, что имеется в локальной сети, чтобы быть абсолютно уверенным в правильности конфигурирования DNS для вашей машины; иногда локальный сервер имен может сыграть злую шутку, сообщив информацию, которую знает только он, и которая не распространяется на остальную часть Internet. Управление Sendmail Sendmail работает, сохраняя единственный работающий "мастер-процесс" и прослушивая порт 25 на предмет входящих соединений, с дополнительными процессами для обработки очередей входящих и исходящих сообщений, отправки сообщений удаленным получателям, а также выполнения других задач. Мастер-процесс запускается во время загрузки системы из /etc/гс. Запуск и останов мастер-процесса Sendmail легко осуществляется с помощью make-файла и благодаря интегрированной природе конфигурационных файлов ресурсов в каталоге /etc. Чтобы запустить процесс, просто войдите в /etc/mail и введите make start: # make start Starting: sendmail sendmail-clientmqueue. Запуск: sendmail sendmail-clientmqueue. Эта команда извлекает существенные детали конфигурации из системных конфигурационных файлов, в которых такие флаги, как -q30m (запускать очередь каждые 30 минут) и -bd (запустить, как фоновый демон) определены централизовано. Она даже откажет в запуске процесса, если переменная sendmail_enable в файле rc.conf установлено в N0. Перезапуск или останов мастер-процесса столь же прост: # make restart Restarting: sendmail sendmail-plientmqueue. Перезапуск: sendmail sendmail-clientmqueue. # make stop Stopping: sendmail sendmail-clientmqueue. Останов: sendmail sendmail-clientmqueue. Вы можете видеть состояние каждого процесса Sendmail, используя команду ps в расширенном режиме, в сочетании с grep; каждый процесс сообщит свое положение в очереди как аргумент, находящийся рядом с его именем в таблице процессов. Следующий пример показывает мастер-процесс (419), "бегунок очереди" для исходящих почтовых отправлений (51251), и процесс в середине движения очереди (17353): # ps -wwaux | grep sendmail root 419 0.0 0.1 3460 1124 ?? Ss 31Dec05 2:15.28 ^'sendmail: accepting connections (sendmail)
Работа в сети FreeBSD smmsp 51251 0.0 0.1 3356 712 ?? Is 31Dec05 0:00.27 ^sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue (sendmail) root 17353 0.0 0.2 3576 2028 ?? I 5:21PM 0:00.01 ^sendmail: server S0106000c6ee053fa.cg.shawcable.net [68.147.217.59 Очередь сообщений Деятельность Sendmail можно разделить на две части: входящие сообщения и исходящие сообщения. Входящие сообщения, ожидающие доставки Sendmail локальным пользователям, находятся в /var/spool/mqueue. Подобный каталог /vat/ spool/clientmqueue, содержит сообщения, которые локальные пользователи MUA командной строки отправляют Sendmail для доставки. В конфигурации Sendmail по умолчанию новый процесс sendmail -q запускается каждые 30 минут, проходя через все очередные сообщения в обоих каталогах очередей и пытаясь доставить их по назначению. Это продолжается в течение пяти дней, после чего отправителю возвращается сообщение о невозможности доставки ("undeliverable") с соответствующим присоединенным заголовком ошибки. НА ЗАМЕТКУ Каталог /vat/spool/clientmqueue на самом деле наполняется единственным отдельно стоящим процессом Sendmail, который привязан только к интерфейсу localhost; это мера безопасности, которая исключает необходимость для Sendmail быть setuid-утилитой root, чтобы пользователи — авторы исходяших сообщений писали свои послания в каталоге очереди. Сообщения во входящей очереди, /var/spool/mqueue, технически не должны накапливаться, потому что как только сообщение достигло сервера, нет причин, почему бы доставка локальному пользователю не произошла. Исходящий демон Sendmail включен по умолчанию, но вы можете его отключить (вернувшись к модели, где единственный мастер-процесс Sendmail контролирует как входящую, так и исходящую почту в одном и том же месте — /var/spool/mqueue), установив следующую опцию в /etc/rc.conf: sendmail_submi t_enable=NO Обратитесь к файлу /etc/mail/readme за дополнительными деталями об усовершенствованных конфигурационных опциях разделенной модели Sendmail. Если есть какие-то сообщения в ваших очередях (которые почти наверняка должны там быть, если вы используете систему сколько-нибудь продолжительное время), то вы можете просмотреть их при желании. В отличие от непрозрачных систем, таких как Microsoft Exchange, в которых файлы очередей сохраняются в базе данных и не допускают простого способа поработать с ними или даже просто увидеть файлы, ожидающие отправки, Sendmail предоставляет полный доступ к находящимся в очереди сообщениям. ГвниманиеП Поставленные в очередь сообщения — это простые текстовые файлы, доступные для чтения и редактирования с помощью обычных текстовых редакторов. Это предоставляет администратору великолепную возможность контроля работы почтовой системы; однако, это также дает ему возможность злоупотреблять своими правами, просматривая содержимое ожидающих отправки сообщений, что не только неэтично, но и незаконно. Если вы работаете в системе, в которой доверяете своим пользователям, убедитесь, что они также доверяют вам!
Конфигурирование почтовых служб I „_ I Глава 25 I 55 I Первый инструмент, поставляемый с Sendmail, называется mailq. Он предоставляет возможность перечислить текущее состояние всех сообщений, находящихся в очереди. Обратите внимание, что когда он вызывается без аргументов, mailq выдает отчет о содержимом входящей очереди, /vat/spool/mqueue. Опция -Ас заставляет его просматривать исходящую очередь, что, вероятно, должно оказаться более интересным: # mailq -Ac /var/spool/clientmqueue (2 requests) Q-ID Size Q-Time Sender/Recipient f4HlAhu 36976 6246 Wed May 16 18:10 MAILER-DAEMON (Deferred: Operation timed out with mlists.acmecity.com.) <fredQacmecity.com> f4GKwVW16827 706 Wed May 16 13:58 www (host map: lookup (hotamil.com): deferred) ' bob@hotamil.com Используя mailq подобным образом, вы можете наглядно видеть, какого рода ошибки передачи почты часто происходят в вашей системе. Если пользователи часто забывают специфицировать полные адреса электронной почты или ошибаются в именах хостов популярных почтовых серверов, вы можете решить эту проблему, организовав обучение или распространив руководства. Если же вы получаете много ошибок, связанных с невозможностью нахождения имен хостов, это может указывать на проблемы конфигурации с вашей стороны, mailq — отличный диагностический инструмент. Очередь также предоставляет вам возможность исправления ошибок в сообщениях на их пути к адресатам. Скажем, например, у вас есть вхождение, подобное второму, выданному mailq в примере, показанном выше. Ошибочный домен получателя является результатом простой опечатки; вы можете либо подождать пять дней, пока Sendmail продолжит попытки нахождения hotamil.com и отправит сообщение обратно как ошибочное, либо исправить эту проблему прямо в очереди. Чтобы сделать это, обратитесь к /var/ spool /clientmqueue и найдите файлы, соответствующие ID, указанному в выводе mailq. Это должны быть файлы df f 4GKwVW16827 и qf f 4GKwVW16827. Первый содержит тело сообщения, а второй — заголовки сообщений во внутреннем формате. Просто откройте файл с заголовками (qf f 4GKwVW16827) в текстовом редакторе и замените все вхождения hotamil. com на hotmail.com, сохраните файл и ожидайте следующего запуска очереди. На этот раз сообщений уйдет нормально. Если вы не можете долго ждать, принудительно запустите очередь, введя команду sendmail -q -v -Ac. (Переключатель -q заставляет Sendmail запустить очередь, -v — отобразить результаты всего сеанса, а -Ас — использовать исходящую очередь, /var/spool /clientmqueue.) Это даст вам дополнительный бонус — вы явно увидите, как Sendmail выполняет SMTP-транзакцию со всеми удаленными системами. Для каждого обрабатываемого сообщения Sendmail выдаст на ваш терминал весь вывод транзакции, как в примере, с которого начиналась эта глава. Вы сможете увидеть все интересующие сообщения-приветствия, которые различные административные программы включают в свои МТА, видимые только другим МТА, а потому часто довольно-таки интересные (один из запомнившихся примеров: "mail.wherever.com ready to rock!" ("mail .wherever.com готов танцевать!")). Вы можете использовать <Ctrl+C> для выхода в любой момент — сообщения удаляются из очереди только после того, как были успешно переданы.
756 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Если в очереди нет ожидающих отправки сообщений, команда sendmail -q -v -Ас не даст» какого вывода. Понятие ретрансляции Одно из наиболее свежих дополнений к Sendmail была защита от спама (нежелательной почты) посредством правил антиретрансляции. Эти правила были доступны уже длительное время, но только недавно — начиная с Sendmail версии 8.9 — стали устанавливаться в конфигурации по умолчанию для запрета ретрансляции сообщений от одного сервера другому. Для легитимного дозвона или использования удаленным пользователем вашего SMTP-сервера для отправки другому удаленному получателю, ваш сервер должен работать в качестве ретранслятора, переадресуя сообщение получателю, даже если оно не было отправлено с данной машины и не адресовано ни одному из ее пользователей. Как показано на рис. 25.2, это в точности то, что делает спамер, рассылая нежелательное сообщение одному и тому же получателю через тот же SMTP-сервер. Спамер должен использовать ретрансляцию. Спамер Получатель МТА S2 Легитимный пользователь Рис. 25.2, Ретрансляция, Спамеры и легитимные пользователи, если они не находятся на S1, должны использовать S1 как ретранслятор для переадресации своих сообщений на S2 Как работает ретрансляция Ретрансляция обычно становится возможной с использованием того, что извест- но, как "МХ-запись" — строки в базе данных DNS SMTP-сервера (как находящегося на той же машине, что и SMTPnrepeep, так и на другом сервере в той же сети), которая сообщает всем машинам в пределах сети, что ваш SMTP-сервер (S1) является для них легитимным передатчиком почты.
Конфигурирование почтовых служб | _„ I Глава 25 I I Sendmail в его конфигурации по умолчанию на FreeBSD, принимает почту от отправителя, чья МХ-запись указывает на S1, определяя его как МТА для сети. Это предотвращает использование S1 людьми, находящимися вне сети, в качестве ретранслятора; если они попытаются, то получат сообщение об ошибке типа "Relaying denied" (Ретрансляция запрещена). НА ЗАМЕТКУ 1 Вы можете определить, какой МХ-хост зарегистрирован для домена, с помощью команды host: # host 8Qmecotnpany.com somecompany.com has address 164.199.3.78 some company, com имеет адрес 164.199,3.78 somecompany.com mail is handled (pri=30) bymail-l.somecompany.com somecompany.com mail обрабатывается (pri-30) хостом mail-l.somecompany.com Затем вы можете непосредственно подключиться к этому хосту через порт 25 для выполнения простых SMTP-транзакций (например, в целях тестирования). Конфигурирование S1 для разрешения ретрансляции пользователям Такая конфигурация отлично подходит для сетей предприятий или поставщиков Internet-услуг, которые обладают полномасштабными сетями, записями в DNS для всех хостов в сети, а также правильными записями MX, указывающими на ретранслирующий SMTP-сервер. Но как насчет отдельно стоящих хостов Internet, которые могут иметь пользователей по всему миру, пытающихся использовать их сервера Sendmail для передачи почты? Каждый из таких пользователей, пытаясь отправить сообщение через S1, где бы он ни находился, получит сообщение об ошибке типа "Relaying denied" (Ретрансляция запрещена). Чтобы избежать этой проблемы, вы можете специально сконфигурировать S1 для разрешения ретрансляции этим пользователям. Существует немало способов сделать это, многие из которых не рекомендуются в некоторых ситуациях. • Добавить список "доверенных" доменов отправителей в файл /etc/mail/ relay-domains, которого нет в установке по умолчанию. Любой хост в пределах этого списка доменов получит право ретрансляции через ваш сервер. После модификации этого файла вы должны перезапустить Sendmail. Это просто и эффективно, но как только вы добавите в этот файл крупный популярный домен (вроде aol.com), который может иметь как спамеров, так легитимных пользователей, все преимущества будут потеряны. Добавляйте домены в этот файл по одному в строке, как в /etc/mail/ local-ho st-names (который вы видели ранее в этой главе): # cat /etc/mail/relay-domains good.host.com 23.144.12.115 Обратите внимание, что локальные отправители почты будут отклонены, если только домены, присутствующие в их адресах, не указаны в /etc/mail/local- host-names.
Работа в сети FreeBSD • Включить SMTP-аутентификацию, которая обяжет удаленных пользователей предоставлять имя пользователя и пароль перед тем, как SMTP-сервер позволит им использовать его. Это сложная тема и потребует конфигурирования аутентификации с применением SASL (Simple Authentication and Security Layer - простой уровень аутентификации и безопасности) — обычно посредством инсталляции пакета по имени cyrus-sasl или cyrus-sasl2 (оба доступны в разделе security коллекции портов). Вы также должны убедиться, что это будет работать по соединениям, шифруемым SSL или TSL, чтобы защитить пароли ваших пользователей. Дополнительную информацию о настройке структуры аутентификации и включении SMTP-аутентификации можно найти на http:// www.sendmail.org/~ca/email/auth.html. • Использовать базу данных access (/etc/mail/access). Это средство позволит вам установить правило ОК или RELAY для каждого известного хоста или домена, с которого будут подключаться ваши пользователи. Такой подход хорошо работает с малыми импровизированными сетями или для небольшого числа удаленных хостов с легко идентифицируемыми адресами, но плохо масштабируется для большого количества пользователей с динамическими адресами. Например, если вы запустите отдельно стоящий сервер Internet, к которому подключаются сотни разных людей, чтобы отправить почту, Может оказаться невозможным добавить все их IP-адреса в /etc/mail/access, поскольку большинство пользователей, работающих по дозвону, в наше время получают динамические адреса. Администраторы, запускающие серверы в ситуациях подобного рода должны, вероятно, предложить пользователям отправлять свою почту через SMTP-серверы их собственных поставщиков Internet-услуг, а не через ваши SMTP-серверы. • Включить любое из пяти или шести средств исключения ретрансляции, доступных в Sendmail, добавив их в /etc/mail/freebsd.mc и повторно генерируя файл sendmail.cf (как было показано ранее). Существует средство, которое позволяет разрешить ретрансляцию на основе установки заголовка From: в адрес вашего домена (relay_local_f rот), хотя это может быть легко подделано спамерами, а потому его применение обычно не рекомендуется. Есть также необязательное средство для выполнения проверки по одному из "черных списков" реального времени, которые представляют собой сопровождаемые базы данных известных спамеров (большинство таких списков требуют платную подписку). Это средство присутствует в freebsd.mc по умолчанию, но оно закомментировано; чтобы включить его, переместите маркер dnl в конец строки и пересоберите конфигурационный файл. Это решение можно рекомендовать поставщику Internet-услуг. • Ив качестве последнего из возможных решений, вообще отключите проверку ретрансляции, включив средство promiscuous_relay. Это позволит любому законному пользователю отправлять почту через ваш сервер Sendmail; однако это также позволит спамерам делать то же самое. Некоторые независимые базы данных в Internet ведут учет всех "открытых" почтовых серверов, а некоторые поставщики услуг используют эти базы данных в качестве "черных списков". Наверняка вы не захотите, чтобы ваш сервер попадал в такие списки! Если это случится, то некоторая легитимная почта от ваших пользователей или их корреспондентов может быть блокирована по причине того, что их поставщик Internet-услуг блокирует всю почту, проходящую через ваш сервер. Поэтому это исключительно плохая идея — запускать полностью открытый почтовый сервер.
Конфигурирование почтовых служб I ZTT I Глава 25 I I В качестве главного правила, лучшее решение проблемы ретрансляции — просто проинструктировать пользователей касательно применения SMTP-серверов, предоставленных их собственными поставщиками услуг Internet. Эти поставщики всегда имеют собственные SMTP-серверы, открытые их собственным клиентам. Поскольку заголовки постовых сообщение (такие как адрес From:) исходят из тела сообщения, а потому находятся полностью под контролем клиентских почтовых программ, нет причин, по которым удаленный пользователь захотел бы использовать ваш SMTP- сервер, если у него уже имеется собственный. Консорциум Sendmail предлагает в Internet замечательную страницу, посвященную правилам ретрансляции и разнообразным конфигурационным опциям — http: // www. sendmail.org/tips/relaying.html. Введение в РОРЗ Теперь вы имеете общее представление о SMTP и Sendmail, а также располагаем те необходимыми инструментами для конфигурирования своего сервера в соответствии с нуждами практически любого типичного Internet-сервера. Но SMTP — лишь половина уравнения. Для того чтобы почта попала от одного пользователя к другому, требуется еще один процесс: загрузка почты через почтовый протокол (Post Office Protocol - POP). Этот протокол позволяет пользователям обращаться к своим почтовым ящикам с удаленных клиентских машин и загружать адресованные им сообщения. Необходимость в POP возникла тогда, когда стало ясно, что в конечном итоге появится множество пользователей Internet, применяющих графические клиентские почтовые программы на собственных компьютерах, подключаемых по коммутируемой линии, вместо клиентов оболочки серверной стороны вроде Pine и Mutt. Клиенты, основанные на командной оболочке, читают почту непосредственно из файла пользовательского почтового ящика. Однако чтобы использовать MUA, подобный Microsoft Outlook или Apple Mail, клиент должен подключиться к почтовому серверу, на котором хранится его~файл почтового ящика (см. рис. 25.1), определить, появились ли там новые сообщения с момента последней проверки, и если так, загрузить их. Клиентская программа затем отображает эти новые сообщения и необязательно удалят их из файла почтового ящика на сервере. В отличие от SMTP, РОРЗ (современная стандартная версия POP) требует аутентификации. Это существенно, поскольку хотя безопасность не является проблемой при отправке почты (за исключением защиты вашего сервера от спамеров), она чрезвычайно важна для гарантии того, чтобы только тот, кому адресовано письмо, мог его увидеть. В конце концов, в реальной жизни любой может сбросить письмо в ящик для исходящей почты, но только его адресат может открыть собственный почтовый ящик и извлечь его. Аутентификация несколько затрудняет эмуляцию POP-транзакции по сравнению с транзакцией SMTP. Однако, симуляция POP-транзакции и не нужна — в основном, потому что РОРЗ требует очень мало усилий для конфигурирования. Здесь мало что может пойти не так. Однако сервер РОРЗ — Qpopper, не включен в ядро установки FreeBSD. Чтобы включить службу РОРЗ, вы должны инсталлировать Qpopper из коллекции портов (/usr/ports/mail/qpopper). Эта программа происходит от оригинальной программы POP-сервера Berkeley, которая подверглась псевдо-ком- мерческой доработке (но в бесплатной манере с открытым исходным кодом) ком-
Работа в сети FreeBSD панией Qualcomm, известной также своим популярным почтовым клиентом Eudora. Qpopper уже не разрабатывается и не поддерживается официально, но все еще доступен от Qualcomm вместе с полной документацией. НА ЗАМЕТКУ Другие программы РОРЗ-серверов ведут свою родословную от Qpopper. Возможно, наиболее популярная из них — Dovecot, доступна в коллекции портов или на сайте http://dovecot.org; это полноценный, безопасный РОРЗ- и IMAP-сервер, который великолепно работает, несмотря на то, что на момент написания книги он все еще находился на этапе альфа-тестирования. Другое решение — IMAP-UW, обсуждаемое далее в настоящей главе — также включает РОРЗ-сервер, который можно использовать вместо Qpopper. Сервер РОРЗ запускается через inetd — "супер-сервер". Он слушает соединения TCP и UDP и при получении пакета TCP на порт 110, ищет имя службы в /etc/ services, определяет, как обрабатывать запросы для службы этого типа и запускает процесс Qpopper из /usr/local/libexec/qpopper. (Это местоположение — в каталоге libexec вместо bin или sbin — говорит о том, что Qpopper не является программой, предназначенной для запуска из командной строки. Вместо этого она вызывается другими программами.) Этот процесс обрабатывает транзакции, аутенти- фицирует пользователя, блокирует его почтовый ящик, определяет, какие сообщения должны быть загружены, и обрабатывает их. Все это работает прекрасно в большинстве систем. Хотя Qpopper предусматривает довольно много опций конфигурации, большинство из них полезны только для подстройки производительности сервера, что полезно, если ваш сервер сильно загружен. В большинстве случаев, однако, все, что нужно сделать — инсталлировать порт и включить службу. НА ЗАМЕТКУ Ваша система может быть сконфигурирована так, что inetd не запускается (например, из соображений безопасности, как описано в главе 30). Если это так, Qpopper можно запустить в автономном режиме подобно Sendmail. Чуть позже мы обсудим, как это делается. Важно отметить, что по умолчанию транзакции РОРЗ выполняются в чистом тексте. Это значит, что РОРЗ — источник потенциальной утечки паролей и представляет собой угрозу безопасности. Версия Qpopper 4.0 позволяет шифровать подключения через библиотеки SSL (Secure Sockets Layer — уровень защищенных сокетов), являющиеся частью FreeBSD, и также используется в таких протоколах, как SSH (Secure Shell — защищенная командная оболочка) и защищенный HTTP. В следующих разделах описано, как конфигурировать Qpopper, чтобы воспользоваться преимуществами этих мер безопасности. Конфигурирование сервера РОРЗ с помощью Qpopper Вы можете установить конфигурацию сервера РОРЗ на нескольких разных уровнях. Можно просто инсталлировать сервер и разрешить всем использовать его, можно запустить в автономном режиме, что позволяет избежать применения inetd, если
Конфигурирование почтовых служб | ZT^j I Глава 25 I I вы этого не хотите, можно разрешить "режим сервера", повышающий производительность, в зависимости от ваших условий, и можно также включить шифрование сеансов через TLS/SSL. Последняя опция не исключает всех прочих (то есть может с ними комбинироваться). Рассмотрим все эти режимы по очереди. Базовая инсталляция и конфигурация Qpopper Подъем службы РОРЗ и запуск ее без особых забот о производительности и безопасности — простая задача. Перейдите в каталог qpopper в коллекции портов (/usr/ports/qpopper), соберите и инсталлируйте ее там, как описано в главе 16. Альтернативно вы можете установить пакет qpopper, используя Sysinstall или инструменты работы с пакетами. Затем потребуется включить службу РОРЗ в супер-сервере inetd. Это делается добавлением строки в /etc/inetd.conf. Откройте этот файл в текстовом редакторе и найдите строки, касающиеся РОРЗ, как показано ниже. Добавьте или снимите комментарий с записи о службе рорЗ, используя следующий синтаксис: # пример записи дл необязательного сервера рорЗ # #рорЗ stream tcp nowait root /usr/local/libexec/popper popper рорЗ stream tcp nowait root /usr/local/libexec/qpopper qpopper -s НА ЗАМЕТКУ В целях наследования существует порт, называемый просто popper. Это на самом деле Qpopper в его ранней форме, и его, как правило, отбрасывают. Тот, что вам нужен, называется qpopper. Теперь перезапустите inetd, используя сценарий /etc/rc.d/inetd: # killall -HOT inet4 # /etc/rc.d/inetd start Вы можете проверить доступность службы РОРЗ, подключившись к порту 110 вашей машины через Telnet (для выхода из сеанса введите QUIT): # telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is ,A] '. +0K Qpopper (version 4.0.2) at stripes.example.com starting. b<4763.990313780@stripes.example.com> QUIT +0K Pop server at stripes.example.com signing off. Connection closed by foreign host. Если вы получили такой ответ от сервера, поздравляем — у вас есть работающий сервер РОРЗ. Включение автономного режима Некоторые установки безопасности и конфигурации отключают супер-сервер inetd. Например, если вы решите не включать inetd при инсталляции системы, то для этого в файл /etc/гс .d потребуется добавить следующую строку, таким образом, полностью предотвращая запуск inetd:
Работа в сети FreeBSD Часть V Г" inetd_enable="NO" В системе, где требованиям безопасности уделяется должное внимание, вы не захотите повторно включать inetd только для того, чтобы запускать службы РОРЗ. Именно для этого случая предусмотрен автономный режим Qpopper. Эта опция по умолчанию не включена, но небольшое вмешательство в make-файл очень легко изменяет это. В каталоге /usr/ports/mail/qpopper отредактируйте Makefile, изменив CONFIGURE_ARGS добавлением опции —enable-standalone: CONFIGURE__ARGS= —enable-apop=$ {PREFIX} /etc/qpopper/pop. auth \ —enable-nonauth-file=/etc/ftpusers \ —with-apopuid=pop —without-gdbm \ —enable-keep-temp-drop \ —enable-standalone После этого запустите make и make install, чтобы собрать версию Qpopper, функционирующую в автономном режиме. Она будет по-прежнему инсталлирована в /usr/local/libexec. He перемещайте ее в другой место, поскольку это усложнит последующую деинсталляцию. Вам понадобится запустить автономный процесс Qpopper из сценария во время загрузки системы; это можно сделать, создав сценарий запуска в /usr/ local /etc/ red и назвав его, например, qpopper.sh, как было показано в главе 14. Убедитесь, что Qpopper не включен в inetd, если сделаете так! Включение режима сервера Если с вашей системой работают только пользователи, которые обращаются к своим почтовым ящикам через РОРЗ, то есть никто из них не имеет доступа к командной оболочке и не запускает почтовых программ стороны сервера на базе командной оболочки, тогда вы можете выбрать для Qpopper режим сервера. Режим сервера позволяет Qpopper запускаться в прямолинейной манере. Вместо копирования спул-файла почты во временный дубликат, его блокировки, внесения изменений, отслеживания почты, пришедшей на протяжении этого сеанса и слияния спула блокированного сеанса с его исходным расположением, сервер может работать непосредственно с самим файлом почтового ящика. Имейте в виду, однако, что режим сервера может быть опасным, в частности, когда ваши пользователи имеют доступ к своим почтовым спул-файлам другими способами, такими как почтовые клиенты на основе командной оболочки или почтовые программы, использующие IMAE По этой причине вы должны использовать режим сервера, только если ваша система обслуживает почту только удаленных пользователей через РОРЗ и нагружена до такой степени, что эти меры повышения производительности будут оправданы. Режим сервера можно включить многими способами. Простейший — использовать переключатель -S в строке вызова, будь то в inetd. conf или в командной строке, используемой для автономного режима: рорЗ stream tcp nowait root /usr/local/libexec/qpopper qpopper -s -S Это переведет Qpopper в режим сервера для всех пользователей и на все время. Вы можете сделать это для отдельного пользователя или для группы, если коже. Управление на уровне групп лучше осуществлять через конфигурационный файл. 762
Конфигурирование почтовых служб I Tf^ I Гдаиа^ I 763 I Чтобы заставить Qpopper использовать конфигурационный файл, создайте его в каталоге /usr/local/etc/qpopper (и назовите его, например, qpopper.conf) а затем укажите в командной строке в inetd.conf опцией -f: рорЗ stream tcp nowait root /usr/local/libexec/qpopper ^qpopper -s -S -f /usr/local/etc/qpopper/qpopper.conf Теперь в файле qpopper.cong укажите имя группы для включения или исключения из серверного режима, применяя для этого ключевые слова group-server-mode или group-no-server-mode. Следующий пример включает режим сервера для членов groupl и group2 и отключает его для членов group3: set group-server-mode=groupl set group-server-mode=group2 set group-no-server-mode=group3 Эту технику можно также применять на уровне отдельных пользователей. Вы можете выбрать такой способ конфигурирования Qpopper, если разные пользователи вашей системы желают взаимодействовать с Qpopper по-разному — то есть некоторые хотят использовать его в серверном режиме, а другие — нет. Чтобы сделать это, добавьте переключатель -и в строку вызова (чтобы разрешить конфигурационный файлы уровня пользователя). Затем каждый пользователь, к которому нужно применить режим, должен иметь в своем каталоге файл по имени .qpopper. options, содержащий строку set server-mode. Альтернативно, если вы не хотите разрешать каждому пользователю модифицировать свой собственный файл .qpopper .options, укажите переключатель -U вместо -и и поместите соответствующий файл для каждого пользователя в каталог /var/mail под именем . user, qpopper .options (где user— имя пользователя). Это позволит вам включать и выключать режим сервера на индивидуальной основе. Если сделаете так, не используйте переключатель глобального режима сервера -S! Это лишь запутает программу — будет непонятно, имеете ли вы в виду включение режима сервера глобально или для каждого пользователя отдельно. Включение шифрования SSL Протокол SSL (Secure Sockets Layer — уровень защищенных сокетов) — это набор библиотек, включенный в состав FreeBSD и предназначенный для шифрования трафика заданной службы, так что даже если пакеты этого трафика будут перехвачены злоумышленниками, они не смогут расшифровать, не имея правильного ключа. SSL чаще всего используется для Web-трафика, однако, как будет показано в главе 30, его применение не ограничено HTTP и может быть очень полезно^ для таких служб, как РОРЗ. По умолчанию Qpopper собирается со встроенной поддержкой TLS/SSL. Однако . чтобы воспользоваться этим преимуществом, вы должны создать и инсталлировать сертификаты безопасности, используя библиотеку OpenSSL, встроенную в систему FreeBSD. Для начала необходимо создать каталог для ваших сертификатов: # mkdir -p -m665 /etc/mail/certs # chown root:mail /etc/mail/certs # chmod 660 /etc/mail/certs Далее используйте команду opens si, чтобы сгенерировать запрос сертификата. Это потребует от вас указания некоторой точной информации о вашей организации.
764 Работа в сети FreeBSD Часть V (В приведенном здесь примере троеточием (...) заменен длительный интерактивный сеанс, в результате которого появится файл запроса сертификата.) После этого убедитесь, что полномочия файла секретного ключа (cert.pem) позволяет просматривать его только пользователю root: # opens si req -new -nodes -out req.pem -keyout /etc/mail/certs/cert, pern # chmod 600 /etc/mail/certs/cert.pem # chown root:0 /etc/mail/certs/cert.pem После того, как это будет сделано, вам нужно зарегистрировать сертификат в центре сертификации (Certifying Authority — СА), таком как VeriSign, и отправить запрос сертификата в req.pem службе СА. Затем вы получите обратно подписанный сертификат. Добавьте его в конец cert.pem: # cat signed_req.pem » /etc/mail/certs/cert.pern В качестве альтернативы просто замените старый cert.pem новым signed req.pem. Теперь добавьте поддержку TLS/SSL в конфигурационный файл /usr/local/ etc/qpopper/qpopper.conf, перезапустите сервер (если он работает в автономном режиме) и вы получите шифрование SSL. Любой клиент, поддерживающий SSL, теперь сможет согласовывать безопасное соединение, если оно будет сконфигурировано для этого. Следующие строки должны быть добавлены в файл qpopper. conf: set tls-support = stls set tls-server-cert-file = /etc/mail/certs/cert.pem Иногда регистрация сертификата независимым центром сертификации неосуществима. При желании вы можете эмулировать службу сертификации у себя, создав самостоятельно подписанный сертификат, который можно использовать, чтобы убедиться, что система работает. Однако клиенты, оснащенные SSL, не смогут доверять этому сертификату и потребуют у пользователя ручного подтверждения прежде, чем продолжить работу. Сначала создайте секретный ключ СА (запомнив введенную идентификационную фразу), а затем создайте сертификат СА: # opens si genrsa -des3 -out ca.key 1024 # opens si req -new -x509 -days 365 -key ca.key -out ca.crt Теперь вы можете самостоятельно подписать запрос сертификата, созданный ранее (req.pem): # opens si x509 -req -CA ca.crt -CAkey ca.key -days 365 -in req.pem 4>-out signed-req.pem -Cacreateserial Это должно позволить запустить сервер Qpopper с поддержкой SSL, чтобы протестировать его функциональность. Но не забудьте потом получить действительный сертификат, удостоверенный СА! » Дополнительная информация Хотя Qpopper больше не поддерживается Qualcomm, официальный сайт этого продукта все еще доступен по адресу http://www.eudora.com/products/
Конфигурирование почтовых служб Глава 25 765 unsupported/qpopper/. Он содержит много полезной информации, включая PDF- документ (в разделе Documentation (Документация)), который исчерпывающе описывает все возможные опции конфигурации Qpopper. Он написан с точки зрения Linux, так что многие путевые имена, указанные в документации, слегка отличаются от вашей инсталляции. Еще больше информации, в частности, о применении конфигурационных файлов, можно найти на странице man qpopper. Конфигурирование сервера IMAP с помощью IMAP-UW Протокол доступа к сообщениям Internet (Internet Message Access Protocol — IMAP) — альтернатива POP, которую предпочитают многие пользователи. Фактически в современную эру централизованных почтовых служб вроде Gmail и .Мае это стимулирует пользователей архивировать свою почту для высококачественной индексации на сервере, вместо того, чтобы удалять ее по прочтении, и они выбирают IMAP вместо POP в качестве протокола чтения почты. Вероятно, вы захотите установить его поддержку на почтовом сервере наряду со службами POP и SMTP, чтобы обеспечить полную функциональность. Фундаментальное отличие между IMAP и POP состоит в том, что в то время как POP загружает каждое сообщение с сервера и сохраняет его во внутренней базе данных приложения, IMAP обращается к почте и манипулирует ею целиком на сервере. Клиенты IMAP (подобные Outlook, Apple Mail, Mozilla Thunderbird, а также всем прочим клиентам, которые также поддерживают и POP) кэшируют сообщения, которые они загружают, и сохраняют в локальной базе данных для быстрого доступа, но исходные сообщения хранятся на сервере и не удаляются, пока не будет дана явная команда. Это обеспечивает возможность пользователю IMAP получать доступ к своей почте с разных компьютеров, в отличие от POP (который требует загрузки всей почты на единственный компьютер, если пользователь желает хранить ее всю в одном месте). IMAP также используется как протокол заднего плана для многих систем Web-почты, где почтовая система на базе Web является MUA и синхронизирует сообщения с традиционными МТА. Наиболее популярный IMAP-сервер для UNIX — это IMAP-UW, разработанный в Вашингтонском университете (той же группой, что создала Pine — популярный MUA, о котором вы узнаете позже). Он доступен в коллекции портов, в /usr/ports/mail/ imap-uw, или пакетов (обратитесь к главе 16 за подробностями об установке программного обеспечения из портов или пакетов). Добавьте USE_SSL=YES к обеим командам — make и make install, чтобы собрать порт с поддержкой SSL. Пакет IMAP-UW состоит из программы тестирования почтового ящика (mboxtest) и пяти исполняемых демонов, которые устанавливаются в /usr/local/libexec. Два из них, ipop2d и ipop3d, являются РОР-серверами (для РОР2 и РОРЗ соответственно), которые вам инсталлировать не нужно, если у вас уже установлен Qpopper. Однако эти POP-демоны имеют способность передавать POP-команды ШАР-серверу, так что они могут представлять способ усовершенствования существующих РОР-кди- ентов для перехода к IMAP, если вы пожелаете мигрировать к исключительно IMAP- окружению.
766 Работа в сети FreeBSD Часть V Установка IMAP-UW исключительно проста. Здесь нет конфигурационных файлов, которые нужно редактировать для самой программы; все необходимые модификации проводятся в /etc/inetd.conf (потому что IMAP-сервер управляется inetd, как и Qpopper) и, необяхательно, в /etc/pam.d/imap. Закомментированная строка в /etc/inetd.conf будет хорошо работать с IMAP- UW. Просто снимите комментарий с нее: # пример записи для необязательного сервера imap4 # imap4 stream tcp nowait root /us r/local/libexec/imapd imapd Затем перезапустите inetd: # /etc/rc. d/inetd restart Демон IMAP прослушивает порт TCP с номером 143. Вы можете протестировать правильность его настройки, подключившись к порту 143 через Telnet. Завершите сеанс нажатием <Ctrl+]> и вводом quit: # telnet localhost 143 Trying 127.0.0.1. . . Connected to localhost.example.com. Escape character is 'A] ' . # OK [CAPABILITY IMAP4 IMAP4REV1 LOGIN-REFERRALS AUTH=LOGIN] localhost.example.com ¦^>IMAP4revl 2001.303 at Sun, 10 Jun 2001 11:21:26 -0700 (PDT) A] telnet> quit Connection closed. НА ЗАМЕТКУ Вы можете заметить предупреждения в файле /var/ log /mess ages или сообщения клиентских программ IMAP, говорящие о том, что почтовый ящик уязвим ("vulnerable") и /var/mail имеет защиту 1777 ("1777 protection"). Это проверка безопасности, выполняемая сервером IMAP-UW (Pine также выполняет ее). Полномочия для каталогов почты в FreeBSD установлены в 775. Это значит, что все программы, имеющие доступ или создающие файлы в /var/mail, должны быть установлены (посредством setgid), как принадлежащие группе почты. Однако IMAP-UW не запускает setgid. Поэтому, создавая файлы блокировок (предотвращающие доставку почты в ящики при извлечении новой почты), он не может делать это в /var/mail. Предлагаемый обходной путь заключается в изменении полномочий для /var/mail на 1777, что позволит непривилегированным пользователям добавлять и удалять файлы. Однако только соответствующие пользователи могут модифицировать свои собственные файлы. Это не идеальное решение, но его достаточно в большинстве случаев. Вы можете использовать шифрование SSL/TLS с IMAP — так же, как с РОРЗ. При сборке его из портов, используйте make USE_SSL=YES и make install USE_SSL=YES вместо простых make и make install. Затем вы можете сгенерировать сертификат, используя команду make cert, или просто скопировать файл сертификата, который ранее создали для Qpopper, в каталог /var/ local /certs (где IMAP-UW ожидает его найти). Для согласованности вы можете пожелать изменить конфигурацию Qpopper, чтобы она указывала на тот же сертификат в /var/local/certs, если вы используете его для обеих защищенных служб.
Конфигурирование почтовых служб I _„ I Глава 25 I I Альтернативный путь заключается в обеспечении безопасности как для РОРЗ, так и для IMAP за счет использования stunnel, о котором вы узнаете из раздела "Защита почтовых служб (РОРЗ и ШАР)* главы 30. Однако лучше избегать stunnel, если есть возможность установить поддержку SSL/TLS для самих служб РОРЗ и IMAP. Электронная почта для отдельно стоящих рабочих станций Знание того, как запустить полноценный сервер электронной почты — ценнейшая квалификация администратора. Но это знание не слишком поможет вам, если ваша машина FreeBSD не предназначена для работы в качестве почтового сервера для нескольких десятков пользователей. Что если вы просто запускаете рабочую станцию (так же, как кто-то может запускать настольную Windows-машину) с настольными графическими персональными приложениями GNOME и KDE вместо серверных инструментов? К счастью, настройка электронной почты для отдельно стоящей рабочей станции намного проще, чем для полномасштабного сервера. Конфигурация FreeBSD по умолчанию запускает "подчиненный" процесс Sendmail (настройка sendmail_submit_enable= "YES" по умолчанию включена в /etc/defaults/rc.conf), и вам не нужно добавлять упоминание о Sendmail в /etc/rc.conf, чтобы позволить вашей системе отправлять почту от ваших локальных почтовых клиентов на удаленные SMTP-серверы. Однако важно, чтобы вы знали, как следует управлять окружением отдельно стоящей рабочей станции и настраивать ее поведение для своих нужд, и здесь есть некоторые интересные трюки, которые делают индивидуальные вычисления на FreeBSD более удобными, чем они могли бы быть без них. Использование Fetchmail для извлечения почты с серверов РОРЗ и IMAP Большинство потребительских операционных систем имеют клиентские почтовые программы (такие как Outlook, Apple Mail, Mozilla Thunderbird и тому подобные), которые обладают своими собственными встроенными механизмами проверки серверов РОРЗ и IMAP. Каждая из них получает вашу почту своим собственным способом и затем по-своему сохраняет ее. Некоторые программы MUA такого типа присутствуют и в FreeBSD, о чем упоминалось ранее (в частности, в главе 6), и они работают почти так же, как вы могли бы ожидать от программ такого рода. Однако вы можете предпочесть на своей рабочей станции запуск MUA на основе командной оболочки, подобные Mutt, Elm или Pine, так же, как делаете это на сервере. Эти программы работают непосредственно с каталогом центральной системы /var/mail и вашим спул-файлом почты внутри него, вместо того, чтобы поддерживать свой собственный внутренний кэш загруженных сообщений. Это позволяет вам разделять один почтовый ящик между программами, выполнять поиск в нем с помощью инструментов командной строки, а также пользоваться преимуществами изменчивой и открытой природы почтовой системы, чтобы обеспечить такое ее поведение, которое наиболее отвечает вашим потребностям — например, за счет написания собственных сценариев для разбора почтового спула и его обработки в соответствии с собственными нуждами.
Работа в сети FreeBSD Однако чтобы получить сообщения от сервера РОРЗ или IMAP, где ваш почтовый адрес хранит их (например, вся почта, адресованная frank@earthlink.net накапливается на серверах earthlink.net), на вашу рабочую станцию FreeBSD, что-то должно установить соединение РОРЗ или IMAP и доставить новые сообщения из удаленного почтового ящика в ваш локальный ящик. Это что-то — программа Fetchmail, маленькая, но гибкая утилита, написанная Эриком Реймондом (Eric Raymond). Fetchmail можно инсталлировать из коллекции портов (/usr/ports/mail/ fetchmail) или пакетов. Эта программа запускается как пользовательский процесс по требованию, и читает свою конфигурацию времени выполнения из файла . f etchmailrc в вашем домашнем каталоге. В этом файле специфицированы удаленные серверы РОРЗ и IMAP, у которых нужно запрашивать новую почту, интервалы их проверки и другие многочисленные опции. Затем Fetchmail извлекает новую почту и ретранслирует ее на порт 25 вашей рабочей станции, где Sendmail прослушивает входящие SMTP-соединения. Затем он доставляет почту в ваш локальный почтовый ящик, согласно всем правилам, которые обычно применяются — таким как указанные в файлах . forward и почтовых псевдонимах. После инсталляции Fetchmail (эта программа доступна в коллекции портов FreeBSD в каталоге mail), вам понадобится конфигурационный файл . fetchmailrc в домашнем каталоге, прежде чем вы сможете использовать ее. Его можно сделать одним из двух способов. Первый метод предполагает применение программы f etchmailconf. Это графическая программа для конфигурирования Fetchmail, написанная на языке Python с использованием набора инструментов Тк (предназначенного для построения графических интерфейсов пользователя для системы XII). Хотя fetchmail con f поставляется вместе с программой Fetchmail, она требует для своей работы установленных Python и Tcl/Tk. (Python и Tcl/Тк — популярные языки, доступные на многих различных платформах.) Второй метод конфигурирования Fetchmail предусматривает ручное создание файла • fetchmail re. Формат этого конфигурационного файла достаточно прямолинеен, а man-страница Fetchmail исключительно подробна и раскрывает все детали каждой из опций, применяемых в файле ¦ f etchmailrc. Именно этот метод и будет описан в настоящей главе. Конфигурирование файла . f etchmailrc В своем домашнем каталоге создайте в текстовом редакторе новый файл по имени . f etchmailrc. Этот файл будет содержать три раздела: глобальные опции, опции сервера и пользовательские опции. ВНИМАНИЕ! Очень важно, чтобы разделы файла . f etchmailrc следовали именно в указанном порядке. Также обратите внимание, что ни одна из опций, относящихся к предыдущему разделу, не может использоваться после начала нового раздела. Одной из наиболее часто возникающих ошибок является то, что опции файла .f etchmailrc следуют в неверном порядке и появляются в недопустимых местах.
Конфигурирование почтовых служб | — „ I Глава 25 I I В настоящей главе мы не раскроем все опции, доступные в . f etchmailrc/ поскольку их слишком много. Вместо этого мы создадим пример настройки для извлечения почты с сервера РОРЗ — достаточно типичной ситуации, с которой сталкивается пользователь. Используйте представленную здесь информацию как стартовую точку для запуска программы Fetchmail. Затем обратитесь к man-странице для Fetchmail за информацией о всех дополнительных опциях конфигурации, которые вам могут понадобиться. Первый раздел файла . f etchmailrc содержит глобальные опции. Эти опции применяются ко всем почтовым серверам и пользовательским учетным записям, которые будут перечислены далее в конфигурационном файле. Можно переопределить некоторые из глобальных опций опциями, специфичными для конкретного сервера и пользователя, но в качестве общего правила следует отметить, что эти строки применяются ко всем серверам и учетным записям, проверяемым Fetchmail. Ниже показан пример простого раздела глобальной конфигурации и опций, которые он может содержать: set daemon 600 set postmaster frank set logfile ./.fetchmail.log Это наиболее общие опции, используемые в глобальном разделе. Вот объяснение для каждой строки. • Первая строка заставляет Fetchmail запускаться в режиме демона и проверять новую почту каждые 600 секунд (10 минут). Когда Fetchmail стартует, он проверит новую почту и перейдет в фоновый режим демона. После этого он будет проверять новую почту каждые 600 секунд. Если этой строки нет, то когда вы запустите Fetchmail, он просто проверит новую почту и немедленно завершит свою работу, не выполняя последующих проверок. • Вторая строка — адрес для сообщений о неполадках. Любая почта, которую принимает Fetchmail, не адресованная локальному пользователю, будет отправлена этой учетной записи локальной системы. Вероятно, вам стоит установить здесь имя того же пользователя, от имени которого будет запускаться Fetchmail. • И, наконец, третья опция устанавливает журнальный файл, в котором Fetchmail протоколирует свою деятельность. Альтернативно вы можете использовать вместо этого строку set syslog, которая заставит Fetchmail использовать syslogd для протоколирования, syslogd — системный демон протоколирования, который обрабатывает протоколирование других событий в системе. Подробнее о нем читайте в главе 14. Следующий раздел файла . f etchmailrc — раздел сервера, который содержит информацию о каждом почтовом сервере, на котором необходимо проверять почту. Ниже показан пример такого раздела, который сконфигурирован для проверки почтового сервера: poll mail.example.com proto рорЗ no dns Доступны также и другие опции сервера. Подробности читайте на man-странице Fetchmail. Рассмотрим опции, показанные в данном примере.
Работа в сети FreeBSD Первая строка заставляет пррверять сервер mail • example. com на предмет появления новой почты с интервалом, указанным в опции set daemon глобального раздела, а также проверять его при каждом ручном запуске Fetchmail. Альтернативой могло бы быть skip mail.example.com. В таком случае этот сервер был бы пропущен, и проверка почты на нем не выполнялась бы — ни автоматически с регулярным интервалом, ни при ручном запуске Fetchmail. Если используется опция skip, новая почта на этом сервере проверяется лишь тогда, когда вы специфицируете его по имени в командной строке при ручном запуске Fetchmail. Вторая строка сообщает Fetchmail протокол, который следует использовать с этим сервером. В данном случае это РОРЗ. Другими допустимыми протоколами являются ШАР, АРОР и КРОР. Третья опция указывает Fetchmail не осуществлять поисков DNS при выполнении "многоточечного" преобразования локальных имен (дешифрация локальных имен пользователей по доменам в заголовках адресов каждого сообщения). Если вы подключаетесь к Internet по коммутируемой линии (дозвону), то вероятно, пожелаете включить эту строку, чтобы предотвратить задержки при получении почты. Третий и заключительный раздел файла .fetchmailrc — пользовательский раздел, содержащий информацию о самой учетной записи. Ниже показан пример пользовательского раздела .fetchmailrc: user frank pass secretword fetchall flush Вот некоторые примечания к этому разделу. • Первая и вторая строки содержат имя пользователя и пароль соответственно, которые вы применяете для доступа к почте на сервере вашего поставщика Internet-услуг. (Из соображений безопасности они должны отличаться от паролей, используемых вами для других служб вроде онлайнового доступа к банковским счетам.) • Третья строка сообщает Fetchmail о необходимости извлекать все сообщения с сервера, включая те, что уже были прочитаны. • И, наконец, четвертая строка сообщает Fetchmail, что он должен очищать сервер (удалять сообщения, которые были загружены на локальную машину). Эта строка не является абсолютно необходимой, потому что подразумевается в конфигурации по умолчанию. Доступны также несколько других пользовательских опций, включая опции, которые заставляют Fetchmail не удалять сообщения с сервера, которые были загружены, опции, специфицирующие, что только новые сообщения должны выгружаться, и тому подобные. Все подробности описаны на man-странице Fetchmail. Полный конфигурационный файл Fetchmail выглядит примерно так: set daemon 600 set postmaster frank set logfile ./.fetchmail.log
Конфигурирование почтовых служб | _„ I Глава 25 I 1 poll mail.example.com proto рорЗ no dns user frank pass secretword fetchall flush Сверху вниз этот файл, по сути, говорит следующее: "Проверять новую почту каждые 600 секунд (10 минут). Посылать любые безадресные сообщения пользователю frank. Протоколировать все действия в .fetchmail.log. Выполнять каждый 10 минут проверки сервера mail.example.com, используя протокол РОРЗ, и не пытаться применять DNS для имен локальных пользователей. Использовать имя пользователя frank и пароль secretword для регистрации на сервере, извлекать все сообщения и удалять их на сервере после загрузки". ВНИМАНИЕ! Поскольку файл . f etchmail содержит ваше имя пользователя и пароль входа на почтовый сервер, его полномочия должны быть установлены так, чтобы только вы — пользователь, запускающий Fetchmail, — могли читать этот файл. Полномочия должны быть не выше 600. Вы можете установить их в правильное значение, введя команду chmod 600 . fetchmail. Это разрешит только владельцу читать и записывать в него. Fetchmail уведомит и откажется работать, если вы попытаетесь запустить его с файлом . fetchmail, которые имеет полномочия, отличные от указанных. Это краткое введение в Fetchmail должно помочь вам запустить его в базовой конфигурации. Более развитые опции ищите на man-странице Fetchmail. Там очень подробно объясняются все опции, доступные для указания в файле . fetchmailrс. Конфигурация Sendmail для отдельно стоящих рабочих станций Для работы Fetchmail программы Sendmail (или ее эквивалент) должна быть запущена на порте 25 для приема входящих сообщений. Однако Sendmail по умолчанию конфигурирована для обработки исходящих сообщений, и на то имеется веская причина; обычно это плохая идея — запускать рабочую станцию вообще без МТА. Например, Mutt и другие почтовые клиенты на основе командной оболочки посылают сообщения, передавая их непосредственно Sendmail, вместо того, чтобы подключаться удаленно к некоторому внешнему хосту SMTP. Это предотвращает некоторые описанные ранее неприятные последствия ретрансляции. Все же у вас есть несколько возможностей настроить производительность Sendmail и ее конфигурацию, чтобы оптимизировать для использования в системе, которая не подключена к Internet постоянно. Первое, что можно сделать — применить "интеллектуальный" почтовый хост, а второе — запустить автоматический спул почты. Найдите в файле /etc/mail/f reebsd.mc следующие строки: dnl Dialup users should uncomment and define this appropriately dnl Пользователи, работающие по дозвону, должны убрать комментарий и корректно определить это dnl define(чSMART_H0ST', чyour.isp.mail.server')
I ZZT I Работа в сети FreeBSD I 1 Часть У Уберите комментарий со строки define, удалив в ее начале маркер dnl и заменив your.isp.mail.server на соответствующее имя почтового сервера. Перестройте конфигурационный файл, запустив для этого make cf и make install внутри каталога /etc/mail. Это изменение позволит вашей рабочей станции вести себя подобно любой настольной системе, где каждый почтовый клиент устанавливает свое собственное SMTP-соединение с SMTP-сервером, предоставленным поставщиком Internet-услуг, который затем ретранслирует почту по конечному назначению. Поскольку вы можете использовать MUA на базе командной оболочки, такие как Mutt и Pine, которые отправляют почту, передавая ее непосредственно Sendmail вместо того, чтобы пытаться установить собственное SMTP-соединение с указанным ретранслятором SMTP, вам нужен централизованный способ заставить этих клиентов вести себя подобно их коммерческим Windows-аналогам. Определение SMART_HOST заставляет Sendmail переправлять всю вашу исходящую почту на SMTP-сервер, к которому выполнено коммутируемое подключение. Причина всего этого в том, что большинство SMTP-серверов отклоняют почту, которая приходит от неразрешенных IP-адресов, и многие сети поставщиков Internet-услуг не предоставляют информации DNS своим коммутируемым клиентам. Если вы не определите SMART_HOST, это ограничение не позволит вашей рабочей станции FreeBSD надежно отправлять почту на большую часть почтовых хостов Internet. Однако поскольку у вас есть доступный SMTP-сервер у вашего поставщика Internet-услуг, и поскольку этот сервер ретранслирует почту от всех своих клиентов, подключаемых по дозвону (потому что так работают MUA Windows), вы можете быть уверены, что определение SMART_HOST обеспечит доставку всех ваших сообщений по назначению. Другой элемент конфигурации, с которым вы можете поэкспериментировать- это очередь исходящих сообщений. По умолчанию Sendmail запускает очередь каждые 30 минут (используя опцию командной строки, установленную в /etc/defaults/ re. conf). Если вы — подключаемый по дозвону пользователь, который выходит на связь лишь на короткие периоды, этот интервал может оказаться слишком большим. Вы можете добавить строку в /etc/rc. conf, переопределив интервал по умолчанию (заменив -q30m на -qlOm): sendmail_flags="-L sm-mta -bd -qlOm -ODaemonPortOptions=Addr=localhosf' Однако еще более эффективный способ справиться с этим состоит в том, чтобы оставить без изменения опцию по умолчанию -q30m, и просто выполнять запуск очереди при каждом вашем подключении к Internet. Как вы помните, можно инициировать запуск очереди командой sendmail -q, необязательно добавляя -v для наглядности или в целях отладки. Конечно, делать это вручную утомительно, поэтому вы можете добавить sendmail -q в свой сценарий ip-up, о котором говорилось в главе 24. Фильтрация мусорной почты средствами Procmail и SpamAssassin Как администратор почтового сервера FreeBSD, вы обязаны уделить некоторое внимание противодействию одной из главных бед Internet — "мусорной" почте, или
Конфигурирование почтовых служб Глава 25 773 спаму. Большинство современных почтовых клиентских приложений предусматривают свои собственные встроенные антиспамовые фильтры, применяя для этого такие приемы, как байесовское сравнение шаблонов и другие, основанные на семантике и исследовании контекста, трюки, которые позволяют пользователям "тренировать** свои почтовые программы лучше идентифицировать спам и выбрасывать его в некую карантинную область. Однако эти приемы клиентской стороны — только часть полного решения проблемы спама, и другой значительный фрагмент мозаики может быть составлен на уровне сервера. Если вы сможете предотвращать попадание нежелательных сообщений в пользовательские почтовые ящики, то им придется загружать меньше бесполезных данных при каждом получении своей почты. Большинство почтовых клиентов могут необязательно идентифицировать спам на основе заголовков, установленных почтовым сервером. Это значит, что если сообщение электронной почты появляется с набором заголовков, подобных следующим, то почтовая программа может немедленно обнаружить, что это — спам и выбросить его в папку Junk (мусор): From nobody@spammer.com Wed Jan 11 12:37:35 2006 X-Spam-Flag: YES X-Spam-Checker-Version: SpamAssassin 3.1.0 (2005-09-13) onmail.example.com X-Spam-Level: ****** X-Spam-Status: Yes, score=6.3 required=5.0 tests=BAYES_99/DATE_IN_PAST_12_24, URIBL_SBL autolearn=no version-3.1.0 X-Spam-Report: * 1.2 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date * 3.5 BAYES_99 BODY: Bayesian spam probability is 99 to 100% * [score: 1.0000] * 1.6 URIBL_SBL Contains an URL listed in the SBL blocklist * [URIs: premiumgoodsavailable.com] Эти заголовки устанавливаются в сообщение пакетом, который называется SpamAssassin ("убийца спама"). который — в совокупности с обработчиком почты от независимого поставщика, называемого Procmail — обрабатывает все входящие сообщения, на уровне отдельного пользователя или глобальном, и применяет свои собственные байесовские фильтры и контекстуальные правила вместе с изобилием других тестов подозрительных характеристик. Каждая строка ниже X-Spam-Report: в этом примере заголовков представляет тест, который не прошло данное сообщение, и значение "веса", назначенного тесту. Например, здесь байесовская проверка вероятности спама почти с полной уверенностью определяет мусорное сообщение, и данный тест получает оценку 3.5. Одного этого недостаточно, чтобы SpamAssassin установил флаг X-Spam-Flag в YES, поскольку порог по умолчанию для такого действия установлен в 5 пунктов. Однако пара дополнительных тестов также дают отрицательный результат: один из них, стоимостью 1.2 пункта, определяет, что временная метка сообщения больше, чем на полдня предшествует времени получения сообщения, что является подозрительным знаком; другой же, оцененный в 1.6 пунктов, связан с тем, что тело сообщения содержит URL, известный как принадлежащий спамерскому сайту, и он присутствует в списке, доступном SpamAssassin. Все вместе эти различные тесты дают в сумме 6.3 пункта, что превышает пороговое значение 5.0, которого необходимо, чтобы считать сообщение спамом. Ни одного отдельного теста не достаточно для того, чтобы пометить сообщение как спам; для этого оно должно быть проверено несколькими тестами. Это гарантирует, что вероятность ошибочного вывода очень мала.
774 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Индивидуальные пользователи могут специфицировать пороговое значение этого показателя, за которым сообщения считаются спамом; это задается ключевым словом required_score в файле userprefs, о котором мы поговорим ниже. SpamAssassin изменяет заголовки сообщений, чтобы отобразить в них результаты тестов, и после этого отправляет обратно в пользовательский почтовый ящик. Затем, когда пользовательская почтовая программа загружает сообщение и читает эти заголовки (в частности, Х-Spam-Flag), она уже знает, что сообщение нужно выбросить, чтобы пользователь даже не увидел его. Дополнительно пользователи могут указать, чтобы особенно высокие показатели (выше определенного порога, например, 7.0) перемещались в специальную область хранения или немедленно удалялись на сервере (задача, выполняемая Procmail, как будет показано ниже). Это позволяет вычистить сообщения, которые очевидно являются мусором, так чтобы пользователь даже не тратил время на их загрузку на локальную машину. Вы можете сконфигурировать FreeBSD для обеспечения такой услуги для ваших дользователей всего за несколько относительно простых шагов. SpamAssassin может быть включен глобально для всех пользователей системы, или же только для одного пользователя на определенное время; лучше начать с включения его для одного пользователя (например, для себя), чтобы убедиться, что он работает правильно, прежде чем включать глобально для всех пользователей. НА ЗАМЕТКУ Процесс демона SpamAssassin может здорово потреблять системные ресурсы, в частности — время процессора. Поэтому прежде чем включать SpamAssassin на МТА, оцените возможности существующего оборудования. Установка SpamAssassin Установите пакет SpamAssassin из коллекции портов или пакетов в категории mail. Имя пакета выглядит как p5-Mail-SpamAssassin (на самом деле это набор модулей Perl). Подробнее об инсталляции программного обеспечения читайте в главе 16. Когда SpamAssassin инсталлирован, должен быть включен демон по имени spamd, являющийся частью пакета. Чтобы сделать это, добавьте следующую строку в /etc/red: spamd_enable="YES" Далее убедитесь, что в каталоге /usr/local/etc/rc.d присутствует стартовый сценарий по имени sa-spand. sh и этот сценарий является исполняемым. Теперь, после следующей перезагрузки, SpamAssassin запустится автоматически; можете также запустить его вручную, набрав /usr/local/etc/rc.d/sa-spamd start. Затем вы должны подготовить каждый пользовательский каталог для SpamAssassin, создав подкаталог *SpamAssassin и установив его принадлежность пользователю, чья почта фильтруется: # mkdir -frank/. spamassassin # chown frank:frank *frank/.spamassassin
Конфигурирование почтовых служб | ZZZ I Глава 25 I I Каталог .spamAssassin будет содержать файлы времени выполнения, используемые SpamAssassin для данного пользователя, такие как байесовские лексемы, "накопленные " со временем, которые помечают сообщение как "спам" или "не спам" (также называемый "ham" ("ветчина")), а также автоматический файл "белого списка", помогающий защитить легитимные сообщения от неправильных пометок. Эти файлы создаются и сопровождаются автоматически программным обеспечением SpamAssassin, и становятся все более точными, чем дольше они используются. И, наконец, создайте файл по имени user_pref s внутри каталога . spamAssassin, которому назначается тот же владелец, которому принадлежит сам каталог .spamAssassin. Этот файл определяет поведение SpamAssassin для каждого пользователя. В листинге 25.2 показано содержимое файла user_pref s, который подходит для большинства нужд пользователей; каждый пользователь может модифицировать его на свой вкус при необходимости. Более подробно о значении каждого ключевого слова можно прочесть в man spamAssassin. Листинг 25.2. Пример конфигурационного файла SpamAssassin userjprefз rewrite_subject l report_header 1 use_terse_report 1 defang_mime 0 report_safe 0 use_bayes 1 auto_learn 1 ok locales en Установка Procmail Сам по себе SpamAssassin ничего не делает с вашим почтовым ящиком. Сообщения электронной почты могут быть активно пропущены через сервер spamd для их обработки. Инструмент, который дополняет его, и инструмент, выполняющий пост-обработку, который будет применен к каждому сообщению после того, как spamd сделает свое дело — это программа обработки сообщений по имени Procmail, которая также доступна в категории mail коллекции портов или пакетов. Procmail — в высшей степени настраиваемая утилита, которую каждый пользователь может применять для фильтрации сообщений в папки, перенаправления их другим программам или полного их удаления — в зависимости от содержимого файла .procmailrc в домашнем каталоге пользователя, а также файла .forward, который перенаправляет все входящие сообщения на Procmail. Используйте следующую строку в • forward, чтобы прогнать всю пользовательскую почту через Procmail перед ее доставкой: •'|IFS=' '&&ехес /usr/local/bin/procmail -f-|I exit 75 #frank" После того, как эта команда введена, создайте каталог .procmail в домашнем каталоге пользователя, применяя те же приемы, что и для создания каталога .spamAssassin: # mkdir ~frank/.procmail # chown frank: frank ~frank/.procmail
776 Работа в сети FreeBSD Часть V Этот каталог будет содержать журнал активности Procmail и прочие связанные с ним файлы, которые создаются в процессе его нормального функционирования. Далее потребуется инсталлировать соответствующий файл .procmailrc для пользователя, в котором определен "рецепт" обработки входящих сообщений. В листинге 25.3 показан файл .procmailrc, который подойдет для наших нужд. Листинг 25.3. Простой файл .procmailrc для оснащения SpamAssassin PATH=/usr/bin:/usr/local/bin:/usr/sbin:/usr/local/sbin:/home/frank VERBOSE=off MAILDIR=$HOME/mail DEFAULT=/var/mail/frank PMDIR=$HOME/.procmail / LOGFILE=$PMDIR/log SHELWbin/sh FGREP«/usr/bin/fgrep FORMAIL=/usr/local/bin/formail LOGABSTRACT=all NL=" SPAM=$HOME/spam-folder # начало Spamassassin :0fw: spamassassin.lock I /usr/local/bin/spamc # конец Spamassassin :0: # AX-Spam-Level: \*\*\*\*\*\*\* $SPAM #/dev/null # OK, предполагается сохранение • :0: $DEFAULT Первый блок строк в этом файле представляет переменные окружения, которые вы устанавливаете в распоряжение Procmail; большинство их не важны для этой задачи, но если вы или ваши пользователи захотите настроить дальнейшее поведение Procmail на обработку входящих сообщений более творчески, эти переменные очень пригодятся. Наиболее критичные из них используются позднее в этом файле, а именно (в данном случае) — переменная DEFAULT, определяющая файл спула почты по умолчанию. Строка SPAM также важна. Она определяет имя папки (которая на самом деле является простым текстовым файлом), которая будет хранить все сообщения, определенные SpamAssassin как спам. Две строки в следующем блоке, окруженные комментариями, указывают, куда Procmail помещает каждой входящее сообщение для SpamAssassin. Это делается командой spams, представляющей собой клиента, взаимодействующего с демоном spamd, который вы запустили ранее. Когда Procmail встречает эти строки, он передает сообщение spams и ждет его возвращения, помеченного заголовками, указывающими, является ли оно спамом.
Конфигурирование почтовых служб Глава 25 777 Удаленные клиенты, пользователи электронной почты, могут пожелать сделать это концом их рецепта Procmail — заголовок Х-Spam-Flag уже установлен, и их почтовые программы теперь в состоянии отбрасывать нежелательные послания на основе одного этого флага. Однако следующий блок строк дает вам дополнительные опции для трактовки спам-сообщений. Все сообщения, возвращенные от SpamAssassin, получают заголовок X-Spam-Level, который указывает уровень ("score") спама как строку звездочек (что вы могли видеть в примерах заголовков ранее). Можно использовать строку вроде * ЛХ-Spam-Level: \*\*\*\*\*\*\* для обозначения того, что Procmail должен выполнить дополнительный шаг обработки всех сообщений, содержащих строку звездочек, как минимум, такой же длины. (Обратные слэши важны; они указывают, что звездочки должны интерпретироваться литерально, а не как символы шаблона, которые соответствуют любому и всему содержимому всех сообщений.) В данном примере любое сообщение с уровнем 7.0 и выше (что обозначено строкой из семи звездочек или более) перенаправляется в файл по имени spam-folder в домашнем каталоге пользователя вместо его почтового ящика по умолчанию. Затем пользователь может удалить этот файл, когда будет удовлетворен, или даже настроить задание с г on для удаления его на регулярной основе, тем самым, исключая перерасход дискового пространства. СОВЕТ \ Если пользователь не желает заниматься проверкой папки спама на предмет обнаружения неправильно идентифицированных сообщений и периодическим их удалением для экономии пространства, он может вместо этого указать, что спам-сообщения с уровнем выше определенного порога сразу удалялись, а не направлялись в эту папку. Для этого нужно просто закомментировать строку $spam и убрать комментарий со строки #/dev/null. Это заставит Procmail отправлять эти вредные сообщения прямо в. "битоприемник". И, наконец, последние две строки (которые не являются совершенно необходимыми) указывают Procmail, что нужно возвращать сообщения в ящик по умолчанию, если они не перехвачены ни одной из ловушек, установленных SpamAssassin и вашими правилами Procmail. Поэтому легитимные сообщения будут корректно доставлены пользователю, как и те сообщения, уровень опасности которого, установленный SpamAssassin, не превышает заданного порогового значения (7.0). Это значит, что пользователь будет загружать сообщения, у которых уровень угрозы окажется между 5.0 и 7-0; хотя его почтовые программы все равно будут идентифицировать их как спам (потому что их заголовки Х-Spam-Flag установлены в YES), но пользователь сможет их просмотреть на досуге и проверить, действительно ли это нежелательные сообщения. СОВЕТ Если хотите, можете установить обязательную фильтрацию почты всех пользователей через SpamAssassin, помимо их желания. Чтобы сделать это, используйте файл /usr/local/etc/ procmailrc вместо пользовательских файлов ,procmailrc. Procmail читает рецепты из этого глобального файла и посылает все пользовательские сообщения л указанное местоположения. Читайте в man SpamAssassin дополнительную информацию о глобальном исполнении SpamAssassin.
Работа в сети FreeBSD Обзор некоторых альтернатив Sendmail Хотя Sendmail все еще считается лидирующим в отрасли МТА, он не лишен недостатков — на самом деле их наличие обычно принимается как должное. Sendmail широко критикуется за его малопонятные конфигурационные файлы, за конфигурационный "мастер-файл" в малоизвестном формате т4, за неконтролируемое размножение различных файлов времени выполнения (таких как база данных access и файл virtusertable), за его относительную громоздкость и неуклюжесть. Если вы чувствуете себя комфортабельно, когда Sendmail работает в его конфигурации по умолчанию (что не потребует от вас значительных усилий по сопровождению и администрированию), то вам жаловаться нечего. Однако если у вас возникает потребность в более высокой скорости и ограничении потребления ресурсов, то вам стоит подумать об альтернативном МТА. Замены Sendmail существуют, и у каждой из них есть свои достоинства и недостатки, а также стойкие приверженцы. НА ЗАМЕТКУ Файл, называемый /etc/mail/mailer, conf, контролирует слой абстракции, позволяющий легко заменить Sendmail и иметь работающую систему, как если бы ничего не менялось. Его содержимое — это набор псевдонимов или указателей, которые определяют команды, такие как sendmail и mailq (которые на самом деле являются лишь псевдонимами для специфических опций Sendmail; например, sendmail -bp для mailq), ссылающиеся на специфические бинарные программы, вместо которых по умолчанию подставляется /usr/libexec/sefldmail/sendmail— настоящая программа МТА, поддерживаемая консорциумом Sendmail. /usr/sbin /sendmail — на самом деле символическая ссылка на /usr/sbin/mailwrapper, который использует mailer. conf, так что вы можете продолжать набирать sendmail или mailq, a mail wrapper перенаправит эти команды на новую бинарную программу Postfix вместо Sendmail по умолчанию. Эта техника также облегчает возврат к Sendmail — в случае, если позже вы передумаете. Postfix Возможно, наиболее серьезной альтернативой Sendmail на сегодняшний день является Postfix, разработанный Витсе Венема (Wietse Venema) с прицелом на первоочередное обеспечение скорости и безопасности. К тому же структура этого продукта очень похожа на Sendmail, что делает его хорошим выбором для администратора крупных оснащенных Sendmail систем, который заинтересован в повышении производительности. Однако его наибольшим преимуществом перед Sendmail является то, что его конфигурирование намного, намного проще. Сообщается, что скорость работы Postfix исключительно высока, в этом отношении он легко превосходит даже Qmail, хотя этот показатель и трудно измерить эмпирически. За последние годы Postfix завоевал множество активных сторонников, и набор его возможностей почти сравнялся с возможностями Sendmail; переход на Postfix существенно упрощает задачу конфигурирования, накладывая при этом весьма незначительные ограничения на функциональность. Домашняя страница Postfix находится по адресу http://www.postfix.org.
Конфигурирование почтовых служб | „Q I Глава 25 I I Qmail Дэн Бернстайн (Dan Bernstein) создал Qmail специально в качестве альтернативы Sendmail — быстрой и безопасной. То есть его разработка была ориентирована на те же цели, что и разработка Postfix. В отличие от Sendmail, однако, внутренняя структура Qmail построена с нуля, а не адаптирует структуру Sendmail; это означает, что конфигурация и файловая структура инсталляции Qmail не слишком похожа Sendmail. Qmail состоит из набора отдельных процессов, каждый из которых управляет определенной частью системы МТА — доставкой, протоколированием, очере- дизацией и так далее — каждый со своими собственными полномочиями и планом выполнения. Это придает Qm&il большую гибкость и скорость реакции, наряду с легкостью переконфигурирования "на лету", чем у его конкурентов. Qmail — хороший выбор для администратора, которому нужна скорость и безопасность, но который не слишком привязан к Sendmail. К тому же этот продукт тесно интегрирован с диспетчером почтовых рассылок EZMLM, принадлежащим тому же автору, так что Qmail будет вам особенно полезен, если вы используете EZMLM. Домашняя страница Qmail доступна по адресу http: //www. qmail. org. Exim Разработанный в Кембриджском университете, Exim представляет собой альтернативу Sendmail, чье главное преимущество — исчерпывающая документация, поддержка со стороны разработчиков и списки рассылки. К тому же этот продукт имеет репутацию очень простого в конфигурировании, в значительной мере благодаря хорошей поддержке, и более зрелого, чем некоторые другие альтернативные МТА. Однако Exim имел ранее исторические проблемы с безопасностью и его можно считать одной из худших альтернатив Sendmail в том, что касается модульности и расширенных возможностей. Большинство инсталляций Exim в последние годы были заменены Postfix и Qmail. Однако это все еще высокопроизводительный сервер, который может существенно ускорить службы SMTP по сравнению с Sendmail. Домашняя страница Exim находится по адресу http: //www.exim.org.
ГЛАВА 26 Конфигурирование Web-сервера В этой главе... • Введение в протокол HTTP • Получение и установка Apache • Раскладка файлов Apache • Конфигурирование Apache • Запуск и останов демона HTTP • Базовый контроль доступа в Apache • Виртуальный хостинг • Введение в модули Apache • Включения стороны сервера • Введение в CGI
Работа в сети FreeBSD Электронная почта и Web в наши дни стали революционными приложениями Internet, В то время как электронная почта — ветеран онлайновых приложений, постепенно и тихо меняла способ коммуникации, которым люди пользовались всегда, Web с его потенциалом молниеносно стал полноценной средой и посредником в коммерции. В любом случае можно с достаточной уверенностью предположить, что если вы устанавливаете сервер FreeBSD, то пожелаете, чтобы он наряду с доступом к электронной почте и командной оболочке, выполнял также функции Web-сервера, Однако это не универсальный случай, поэтому в то время, как FreeBSD поставляется с инсталлированной программой Sendmail для выполнения почтовых служб, не существует подобного приложения Web-сервера, устанавливаемого по умолчанию. Вы должны выбрать его самостоятельно из набора портов или пакетов. Для 90% функций Web-сервера, которые могут понадобиться, подойдет Apache. Существует множество других серверов, которые вы можете использовать вместо него, вроде Roxen и AOLserver, но Apache развивался в течение длительного времени, и, видимо, поэтому занимает лидирующее положение в Internet уже многие годы. Проект Apache, доступный в Web по адресу http: //www.apache .org — один из лучших примеров философии открытого кода в действии, производит программное обеспечение, которое выполняет свою работу лучше и лучше соответствует опубликованным стандартам, чем почти любой другой альтернативный продукт. Он также подходит для всех типов сред — от малых, с ограниченным трафиком, неформальных любительских Web-сайтов или персональных блогов, и до полномасштабных сайтов электронной коммерции со многими сотнями параллельных соединений — с добавлением подключаемых модулей, позволяющих использовать такие преимущества серверных технологий, как связность с базами данных и встроенная поддержка сценариев Perl. Эта глава посвящена вопросам конфигурирования Apache для каждого из этих типов инсталляции. Однако, прежде всего мы рассмотрим структуру протокола HTTP, поскольку его понимание позволит управлять Internet-сервером более эффективно. Введение в протокол HTTP Протокол передачи гипертекста (Hypertext Transfer Protocol — HTTP) — основа Всемирной паутины, то есть World Wide Web. Разработанный в 1993 году для поддержки обмена информацией в CERN (Conseil Europeen pour la Recherche Nucleaire- Европейская организация по ядерным исследованиям), Швейцария, HTTP — очень простой протокол, не предусматривающий аутентификации и имеющий лишь несколько возможных клиентских команд. Он оптимизирован для облегченного обслуживания небольших (в основном, несколько килобайт) текстовых файлов и задуман как средство описания разбросанных информационных страниц на вновь разработанном языке разметки, воспринимаемом браузерами HTTP и известном под названием языка гипертекстовый разметки (Hypertext Markup Language — HTML). Хотя изначально HTTP не был для этого предназначен, но в наши дни он используется для передачи крупных бинарных файлов, часто включая множество встроенных графических изображений * запрашиваемых в один прием с HTML-страницы, по мере ее визуализации. Этот вид передачи данных редко применялся в начале существования Web (поддержка GIF и JPEG появилась в 1994 году на многих платформах). В ответ на эти перемены в спецификацию HTTP были внесены определенные допол-
Конфигурирование Web-сервера Глава 26 783 нения. Наиболее важной из них стал стандарт HTTP/1.1, предусматривающий такие средства, как конвейеризация (комбинация ответов на множественные параллельные запросы в единый поток ответов), усовершенствованное кэширование, частичные запросы (для возобновления прерванных загрузок) и сжатие. HTTP/1.1 в наше время широко применяется в большинстве популярных браузеров, но HTTP/1.0 также остается популярным отступлением, которое понимают все браузеры. В отличие от SMTP, FTP и многих других подобных популярных протоколов, HTTP является протоколом без поддержки состояния, в том смысле, что в нем не существует концепции "сеанса", когда клиент соединяется с сервером, выполняет несколько транзакций и затем закрывает соединение. HTTP допускает только единственный запрос на соединение, и потому невозможно определить, сколько пользователей подключены к Web-серверу в любой момент времени (за исключением продолжающихся загрузок). Это также означает, что в HTTP не существует никаких топологических понятий, ассоциированных с протоколами, таких как в SMTP: ретрансляция, МХ-записи, запросы и тому подобное. Вместо этого администратору сервера HTTP приходится иметь дело в основном с пропускной способностью, ресурсами процессора и памяти, а также их наиболее эффективным применением по мере роста параллельной активности пользователей вследствие популярности Web-сайта. Структура запроса HTTP Структура запроса HTTP/1.0 почти так же проста, как он сам. Вы можете эмулировать транзакцию HTTP, подключившись к порту 80 HTTP-сервера и выдав запрос GET (который может включать много строк) в следующей форме: # telnet www.exaxnple.com 80 Connected to www.example.com. Escape character is 'Л]'. Подключение к www.example.com. Управляющий символ ГЛ] *. GET / НТТР/1.0 HTTP/1.1 200 OK Date: Thu, 12 Jan 2006 18:38:23 GMT Server: Apache/1.3.33 (Unix) DAV/1.0.3 PHP/4.4.0 Content-Location: index.html Vary; negotiate,accept-language,accept-charset TCN: choice Last-Modified: Thu, 07 Aug 2003 20:11:54 GMT ETag: "52ab66-3c-43c6a251" Accept-Ranges: bytes Content-Length: 60 Connection: close Content-Type: text/html Content-Language: en <HTML> <TITLE>TecTOBafl CTpaHHua</TITLE> <BODY> Проверка </B0DY> </HTML>
I улл \ Работа в сети FreeBSD I I Часть V Вместо этого вы можете также выдать запрос HEAD в той же форме, чтобы получить только заголовки, без тела сообщения. Для обозначения окончания многострочного запроса вводится пустая строка в конце многострочного запроса (двумя нажатиями клавиши <Enter>). Ответ сервера подразделяется на два раздела: заголовок и тело. Ответ может содержать подмножество заголовков, показанных выше, или других, которые здесь не показаны — в зависимости от типа запрошенного документа и конфигурации сервера. Каждый HTTP-сервер имеет свою собственную уникальную сигнатуру в строке Server:. Эта сигнатура сообщает вам наименование программного обеспечения сервера и платформу, для которой оно построено; имейте в виду, однако, что даже если она сообщает "UNIX", это на самом деле ничего не говорит вам об операционной системе, запущенной на сервере, поскольку она может быть любой — от Linux до Solaris или Mac OS X. Остальные строки, особенно строки Content.:, содержат информацию, помогающую Web-браузеру расположить страницу на экране. Например, если присутствует Content-Length:, то она позволяет браузеру сообщить, сколько еще данных остается выгрузить, a Content-Type: сообщает ему, как следует визуализировать запрошенный файл (как HTML, простой текст, графическое изображение GIF или JPEG и так далее). HTTP/1.0 допускает включение в запрос множества дополнительных строк, включая строки, специфицирующие cookie-наборы, принимаемые кодировки, предпочитаемые языки и так далее. Помимо строки запроса (в данном случае команды'GET), которая должна появляться первой, порядок остальных строк не имеет значения. Однако эти дополнительные строки являются необязательными; обязательной является только одна строка (сама строка запроса). Запрос HTTP/1.1 почти такой же, как в HTTP/1.0, за исключением того, что вторая строка также обязательна — строка Host:. Это дополнение к протоколу, предназначенное для поддержки виртуального хостинга, когда единственный Web-сервер может откликаться на много'разных имен хостов. Это означает, что клиент должен специфицировать имя хоста, чье содержимое он желает видеть. Поскольку Web-браузеры находят IP-адрес сервера по имени хоста и устанавливают IP-соединение на основе IP-адреса (так работают приложения TCP/IP, что описано в главе 22), сервер ничего не знает о том, какое именно имя хоста нужно пользователю, если только клиент не пришлет заголовок Host:, как показано ниже: # telnet www.example.com 80 Connected to www.example.com. Escape character is 'A] '. GET / HTTP/1.1 Host: www.frank8pa9e.com Все основные браузеры в настоящее время, включал чисто текстовые вроде Lynx, поддерживают заголовки Host: в стиле HTTP/1.1. (Однако способ формулировки требования поддержки HTTP/1.1 не согласован. Например, Netscape Navigator поддерживает многие средства HTTP/1.1, но все равно выдает свои запросы как HTTP/1.0.) Это значит, что виртуальный хостинг на основе заголовка Host: (вместо IP-адреса и IP-псевдонимов уровня сети) в настоящее время почти единственный, исключительно используемый метод, который здорово упрощает жизнь. Позднее в этой главе мы поговорим о виртуальном хостинге более подробно.
Конфигурирование Web-сервера Глава 26 785 Коды ответа и перенаправления Хотя существует всего несколько методов запроса (GET, HEAD и POST плюс еще несколько в НТТР/1.1), сервер может вернуть широкое разнообразие ответов. Эти ответы снабжены трехзначными десятичными кодами и сгруппированы по значению первого знака. В табл. 26.1 представлен полный набор кодов ответов HTTP с описанием их значения, в частности, в контексте Apache и его средств. Таблица 26.1. Коды ответов HTTP Числовой код Наименование Значение 200 201 202 203 204 300 301 302 304 400 401 403 404 500 501 502 503 2ХХ - Успех ок Created (Создан) Accepted (Принят) Partial Information (Частичная информация) No Content (Содержимое отсутствует) ЗХХ — перенаправление Стандартный код успеха Multiple Choices (Множественные выборы) Moved Permanently (Перемещено на постоянной основе) Moved Temporarily (Перемещено на временной основе) Not Modified (He модифицировалось) MultiViews или CheckSpelling нашли множественное соответствие Хвостовой слэш пропущен Найдено перенаправление Кэшированная копия может использоваться 4ХХ — Ошибки клиента Bad Request (Неверный запрос) Unauthorized (He авторизован) Forbidden (Запрещено) Для продолжения необходима аутентификация Права доступа к серверу или конфигурация не разрешает доступ Not Found (He найдено) Файл не существует 5ХХ — Ошибки сервера Internal Server Error (Внутренняя ошибка сервера) Not Implemented (He реализовано) .Bad Gateway (Неверный шлюз) Service Unavailable (Служба не доступна) Программа стороны сервера (CGI) дала сбой (общая ошибка) Ресурсы, необходимые для обработки запроса, не доступны
Работа в сети FreeBSD Возможно, вы знакомы с ошибками 404 и 403, а ошибки 500 знакомы тем, кто когда-либо занимался CGI-программированием. Однако имеется один важный, но плохо понимаемый код — 304. Этот код никогда не видят пользователи, поскольку он предназначен для браузера; тем не менее, это один из наиболее часто используемых кодов в рабочих серверах, в чем можно убедиться, заглянув в протокол доступа (/var/log/httpd-access.log). Когда клиент должен сделать запрос файла, который уже содержится в его кэше (например, изображение GIF, встроенное в HTML-страницу), он выполняет запрос GET с полем If-Modified- Since, установленным в дату и время последней загрузки графического изображения. Это заставляет сервер проверить, был ли изменен файл на сервере после указанного времени. Если да, он отправляет файл (с кодом успеха 200); если же нет, возвращается код 304 (Not Modified), что сообщает браузеру, что все в порядке и он может отобразить копию, содержащуюся в его кэше, таким образом, избавляя от необходимости повторной пересылки файла. Другой код, часто видимый браузером, но не человеком — это 301 (Moved Permanently). Этот код часто должен возникать, когда некто запрашивает URL типа http://some.host.com/Subdirectory, где Subdirectory — имя каталога на сервере. Корректная форма URL-адреса, который обращается к индексу этого каталога выглядит как http://some.host.com/Subdirectory/, то есть с хвостовым слэшем. Следует, однако, отметить, что если вы введете URL без хвостового слэша, то все равно получите страницу — браузер самостоятельно добавит слэш. Это связано с тем, что он получает код 301 в ответ на первый запрос, перенаправляющий его на тот же URL, реконструированный из имени хоста сервера и пути запроса, с добавленным слэшем. URL в вашем браузере обновлен, он выполняет второй запрос и получает корректную страницу. Чтобы все это работало незаметно, сервер должен знать точно его имя хоста; для этого служит директива ServerName в Apache, о которой мы поговорим чуть позже в настоящей главе. Дополнительную информацию об HTTP, его структуре, кодах ответа и многом другом можно найти на сайте консорциума W3C по адресу http: / /www. w3 . org/ Protocols. Оригинальная спецификация HTTP/1.0 изложена в документе RFC 1945, а НТТР/1.1 - в RFC 2068. Получение и установка Apache Название Apache происходит от оригинального прозвища "A Patchy Server" ("Сервер в заплатах"), поскольку он вырос из серии заплат, примененных к стандартному для отрасли, но ограниченному серверу NCSA httpd, который появился в начале 1995 года. Apache на сегодня — одна из наиболее широко распространенных программ в мире. Он работает под управлением десятков различных операционных систем — от АГХ до Windows, от BeOS до Mac OS X, а также, разумеется, и под FreeBSD. Возможно, это наиболее полная реализация HTTP из всех доступных. Apache также видится многими как воплощение идеала открытого кода; его успех демонстрирует, как свободные усилия широкого сообщества разработчиков могут конкурировать с крупными коммерческими пакетами от компаний-лидеров рынка, став де-факто стандартным решением. Apache покрывает около 70% всего рынка на момент написания данной книги, и этот показатель продолжает расти. Apache можно получить, инсталлируя его из коллекции портов (/usr/ports/ www/apache 13 либо /usr/ports/www/apache2*) или пакетов. На момент написания
Конфигурирование Web-сервера I "ZZZ I Глава 26 I I книги Apache 1.3 — наиболее зрелая ветвь кода, в которой большинство ошибок и проблем безопасности решены давным-давно; именно эта кодовая база обеспечила популярность и репутацию Apache, и, скорее всего, она способна обеспечить все, что вам только может понадобиться. Однако несколько структурных особенностей (таких как модель ветвления (forking), предусматривающая порождение нового процесса Apache для обработки каждого отдельного запроса) могут показаться проблематичными. В Apache 2.x — современной и наиболее активно разрабатываемой ветви кода — полностью переписана часть, связанная с ветвлением; теперь она использует многопоточность ядра и имеет в большей степени модульную архитектуру, что обеспечивает существенный выигрыш в производительности. В этой главе мы, главным образом, будем говорить об Apache 1.3, поскольку эта версия распространена шире и имеет репутацию весьма стабильной, и потому что много дополнительных модулей от независимых разработчиков доступны только для версии Apache 1.3, но пока не работают в версиях Apache 2.x; однако мы включили в эту главу также обсуждение тех областей, где Apache 2.x отличается в применении или поведении от Apache 1.3. НА ЗАМЕТКУ Установленные файлы поддержки для версий 1.3 и 2.x Apache хранятся раздельно, чтобы позволить администраторам сопровождать параллельные инсталляции и обеспечить постепенный переход от одной версии к другой. Если вы устанавливаете Apache 2.x, то конфигурационные файлы будут находиться в /usr/locak/etc/apache2x, а пути к документации и библиотекам соответственно будут заканчиваться на /apache2, а не /apache; делайте соответствующие поправки, если работаете с Apache 2.x. Почти все операционные директивы в Apache 1.3 и 2.x идентичны, но некоторые имена файлов и пути могут отличаться. Одно из любопытных преимуществ, которые Apache предоставляет пользователям FreeBSD, является то, что многие его части были разработаны непосредственно в среде FreeBSD. Эти компоненты включают модуль URL Rewrite (modre write), разработанный Ральфом Энгельсхолом (Ralf Engelschall), а также множество средств настройки производительности, обсуждаемых в онлайновой документации. Выбор такой среды разработки также означает, что Apache хорошо подходит к структуре каталогов FreeBSD, о чем мы поговорим ниже. Исходный дистрибутив Apache доступен на многих зеркальных сайтах по всему миру — на случай если ваша коллекция портов не может получить его с главного центрального сайта. Список этих зеркальных сайтов вместе с исчерпывающей коллекцией документации Apache можно найти на http; //httpd. apache. org. Раскладка файлов Apache После инсталляции Apache вы заметите, что будет создан новый каталог в /usг/ local, как корневой каталог сервера. Этот новый каталог, /usr/local/www, содержит несколько подкаталогов для различных целей, часть из которых является символическими ссылками. Карта файлов и каталогов Apache показана на рис. 26.1. Как и можно было ожидать, все, что инсталлировано как часть Apache, находится ниже /usr/local, за исключением журнальных файлов (которые попадают в /var/log, вместе со всеми остальными журнальными файлами системы).
788 Работа в сети FreeBSD Часть V /usr/local apache apache I (документация HTML) libexec apache (модули) i (конфигурационные файлы) Рис. 26.1» Карта файлов Apache, демонстрирующая отношения конфигурационных файлов, корень документов сервера и бинарные файлы поддержки Фактически, несколько из этих каталогов находятся во временной файловой структуре, существующей во время установки, что предотвращает повреждение существующих файлов живого сервера сценарием инсталляции. Например, /usr/ local/www/data — расположение, где конфигурация по умолчанию ожидает найти корень документов; однако это расположение является символической ссылкой на /usr/local/www/data-dist и содержит только общие HTML-файлы на разных языках, которые, если оставить их без изменений, сообщат посетителю вашего сайта лишь о том, что Apache был корректно установлен. Ваш первый шаг после инсталляции Apache из портов или пакетов должен заключаться в удалении символической ссылки (rm /usr/local/www/data) и замене ее нормальным каталогом (mkdir /usr/ local/www/data), в который позднее вы поместите свое Web-содержимое. (Одно предупреждение, касающееся сайтов, использующих виртуальные хосты: храните свое Web-содержимое в совершенно другом месте и измените директиву ServerRoot соответствующим образом.) Аналогично, /usr/local/www/cgi-bin — это символическая ссылка на обычный каталог /usr/local/www/cgi-bin-dist. Если вы поместите файлы в cgi-bin, то на самом деле они попадут в cgi-bin-dist, если только вы не создадите нормальный каталог cgi-bin. Внесение этих изменений гарантирует, что если даже вы деинсталлируете пакет Apache, ваш каталог данных и все его содержимое останется нетронутым. Конфигурационные файлы в /usr/ local /etc/ apache, о которых мы поговорим чуть ниже, также имеют варианты -dist или -std — здесь нет символических ссылок, но файлы -dist — единственные, которые затрагиваются при повторной инсталляции или обновлении. Это обеспечивает вам "путь отступления" и ссылочный файл на случай, если вы измените что-либо в вашей живой конфигурации файлов, чего нельзя будет исправить без подсказок. Подобно Sendmail, раскладка файлов Apache в FreeBSD ощутимо отличается от раскладки инсталляций Apache на других платформах. Каждая из них слегка отличается, поэтому знание раскладки FreeBSD не обязательно поможет вам при сопровождении Apache под Linux, Solaris или Windows. Дадим один полезный совет, который может помочь: обычно всегда существует каталог "корня сервера" — такой как /usr/local/www в FreeBSD, в котором находится все, имеющее отношение к Apache. Под Linux это часто /var/ lib /apache; однако в этом стиле инсталляции почти все, ассоциированное с Apache, включая конфигу-
Конфигурирование Web-сервера I ZTT I Глава 26 I I рационные файлы, бинарные программы, протоколы, исходные тексты и сценарии конфигурирования сборки, находится внутри или ниже одного каталога. Хотя это не имеет преимуществ жесткой и согласованной структуры FreeBSD, по крайней мере, вы сможете найти почти все необходимое в одном месте такой инсталляции. Конфигурирование Apache Так же, как /etc/mail (см. главу 25), /usr/local/etc/apache (каталог конфигурации Apache) содержит множество файлов, часть из которых нас интересуют, а часть — нет. Рассмотрим все их по порядку. • httpd.conf. Главный конфигурационный файл Apache. В наше время все необходимое объединяется в этом единственном файле, а не группируется в трех или более специфичных файлах, как это было в прежние годы. Однако многие администраторы используют дополнительные конфигурационные файлы, подобные httpd-vhosts.conf, чтобы отделить друг от друга разделы конфигурации, такие как виртуальные хосты. • mime_types. Этот файл представляет таблицу соответствий между расширениями файлов и типами MIME (заголовки Content-Type) в файлах, посылаемых Apache. Благодаря этому браузеры знают, как обрабатывать загруженные ими файлы. • magic. Альтернативный метод типам MIME — magic, который пытается определить тип файла по некоторым шаблонам, находящимся внутри него, что делает расширения файлов излишними. Этот тот же метод, который используется командой file. Файл magic специфицирует методы, используемые для различных типов файлов. • access . conf и srm. conf. Эти файлы использовались для хранения некоторых частей того, что теперь включено в httpd.conf (этих файлов нет в Apache 2.x). Если вы поместите установки конфигурации в них, они по-прежнему будут прочитаны; этим и объясняется то, что они все еще присутствуют здесь (для поддержки совместимости с унаследованными инсталляциями). Однако эти файлы уже не являются необходимыми, и их можно игнорировать. НА ЗАМЕТКУ Вдобавок Apache 2.x устанавливает каталог /usr/local/etc/apache2x/extra, который содержит несколько дополнительных файлов: httpd-ssl. conf, httpd-vhosts. conf, httpd- userdir. conf и так далее. Эти файлы позволяют вам конфигурировать некоторые специфичные средства Apache (такие как SSL-безопасность или домашние каталоги пользователей) в маленьких внешних файлах, для лучшей организации и облегчения поддержки. Если вы предпочитаете хранить все конфигурационные опции в одном файле, можете скопировать содержимое этих дополнительных файлов в httpd. conf и модифицировать их там. Обратите внимание, что существуют версии -dist всех этих файлов. Немедленно после чистой инсталляции они копируются в обычные версии каждого файла. После внесения изменений в обычные версии в процессе эксплуатации, однако, если вы установите обновленную версию Apache, только файлы -dist будут затронуты инсталляционными сценариями. Это позволяет вам обновлять систему и на досуге объ-
Работа в сети FreeBSD единять новые конфигурационные опции, используя для этого dif f или другой метод по вашему выбору. Использование httpd. conf Файл httpd. conf довольно длинный и весьма подробный, но (в отличие от /etc/ mail/sendmail.cf) полностью читабелен и очень хорошо комментирован. Каждая из директив конфигурации установлена в осмысленное значение по умолчанию; вы можете модифицировать любую из них по своему желанию, и встроенная документация объяснит достаточно ясно, что каждая из них делает. Если вы что-то настроите неправильно, Apache сообщит вам, что именно неверно, когда вы попытаетесь его запустить. ВНИМАНИЕ! Прежде чем вносить любые изменения в httpd.conf, сделайте резервную копию (например, под именем httpd.conf .20061014), чтобы всегда можно было легко вернуться к предыдущей работающей конфигурации. Немедленно после инсталляции Apache может быть запущен, и сможет правильно обрабатывать запросы. Однако на всякий случай сначала стоит установить пару конфигурационных директив. Найдите их в файле httpd.conf и измените соответствующим образом: # # ServerAdmin: Your address, where problems with the server should be # e-mailed. This address appears on some server-generated pages, such # as error documents. # ServerAdmin: Ваш адрес, по которому будут отправляться сообщения о проблемах # с сервером. Этот адрес будет присутствовать на некоторых генерируемых # сервером страницах, таких как документы по ошибкам. # ServerAdmin you@your.address # # ServerName allows you to set a host name which is sent back to clients for # your server if it's different than the one the program would get (i.e., use # "www" instead of the host's real name). # ServerName позволяет установить имя хоста, которое отправляется обратно клиентам # вашего сервера, если оно отличается от того, которое программа может извлечь # (то есть использование "www" вместо реального имени хоста). # # Serve rName www.examp1e.com Вторая директива — ServerName, с которой вы должны убрать комментарий и изменить на имя вашего хоста, используется в переадресациях 301 (описанных выше в настоящей главе). Если хвостовой слэш опущен при запросе индекса каталога или листинга, Apache ответит кодом 301 (Moved Permanently) и URL, к которому должен будет обратиться браузер. Apache должен сконструировать этот URL для переадресации на основе информации, полученной от клиента, которая (как вы увидите), содержит только часть URL, начиная со слэша после имени хоста; например, если запрошенный URL —http://some.host.com/images/foo, то запрос будет выглядеть
Конфигурирование Web-сервера Глава 26 791 как /images/foo. Если это запрос HTTP/1.1, то он содержит заголовок Host:, который Apache может применить для воссоздания полного URL, но в противном случае это будет на его усмотрение, если только вы не специфицируете имя хоста директивой ServerName. HTTP/1.1 вызывает еще несколько последствий, связанных с директивой ServerName. Если вы поддерживаете виртуальный хостинг на базе имен, к которому мы обратимся вскоре, Apache использует ServerName для сопоставления виртуального хоста с запросами на базе его заголовка Host:.Каждый виртуальный хост должен иметь специфицированное ServerName, но даже если вы не поддерживаете виртуальный хостинг, будет хорошей идеей определить ServerName, чтобы помочь Apache сконструировать URL для перенаправления и сравнить запросы с единственной главной конфигурацией хоста, эффективно трактуя конфигурацию по умолчанию как виртуальный хост, который должен соотбетствовать заголовку Host:. Мы могли бы пройтись по всем доступным конфигурационным директивам, но слишком многие из них одинаково важны в связи с некоторыми другими, и не важны для конфигурации по умолчанию. Официальную документацию можно найти на Web-сайте Apache Group по адресу http://httpd.apache.org/docs/. Использование файлов .htaccess и переопределений Хотя httpd.conf предоставляет глобальные опции конфигурации, многие из них также могут быть переопределены на уровне каталогов, без необходимости перезапуска сервера. Вы делаете это, помещая файл по имени .htaccess, включающий все директивы, которые нужно переопределить, в каталог, к которому они должны быть применены. По каждому принятому запросу проверяется глобальная конфигурация, загруженная в память из файла httpd.conf, после чего проверяется конфигурационные файлы каждого каталога (.htaccess) последовательно, на всем пути к запрошенному файлу. Каждый последовательный файл .htaccess применяется к своему собственному каталогу и всем вложенным в него подкаталогам. Это позволяет не только вам, но и вашим рядовым пользователям изменять поведение Apache при обработке файлов из этих каталогов. Должны ли использоваться файлы .htaccess, зависит от установки директивы AllowOverride. Если внимательно почитать httpd.conf, то вы увидите, что AllowOverride установлено в None на уровне корня операционной системы и еще — в каталоге /usr/local/www/data; таким образом, по умолчанию файлы .htaccess игнорируются. Однако вы можете включить их, заменив AllowOverride None (в блоке /usr/local/www/data) любой другой директивой из табл. 26.2 или любой их комбинацией (например, AllowOverride AuthConfig Limit). Таблицы 26.2. Опции конфигурации AllowOverride Директива Разрешает файлам .htaccess переопределение AllowOverride Options Директивы Options. AllowOverride Filelnf о Директив типов файлов, таких как AddType и ErrorDocument. AllowOverride AuthConf ig Директив авторизации, таких как Require и Auth*. AllowOverride Limit Директив доступа к хосту, таких как Allow, Deny и Order. AllowOverride All Всех вышеупомянутых директив.
792 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Директива Options — один из крупнейших и наиболее изменчивых элементов конфигурации Apache; она контролирует доступность многих наиболее существенных средств Apache, таких как ExecCGi (способность выполнять CGI-сценарии), includes (включения серверной стороны) и Multiviews (согласование изменчивого содержимого). Эти средства могут быть добавлены или исключены из текущей конфигурации на любом уровне иерархической структуры каталогов. Обратитесь по адресу http: //httpd. apache. org/docs/1.3/mod/core.html#options за полным описанием директивы Options и ее использования. После соответствующего изменения httpd. conf перезапустите сервер (как — мы расскажем ниже). Теперь вы можете добавлять файлы .htaccess в любой доступный из Web каталог и помещать в них любые директивы конфигурации, которые Apache допускает в файлах .htaccess (подробности о том, какие директивы могут быть применены в контексте .htaccess, читайте в http://httpd.apache.org/docs/). НА ЗАМЕТКУ Файл .htaccess в общедоступном каталоге может стать причиной снижения производительности, поскольку сервер должен будет открывать и читать его при каждом HTTP-запросе. Если возможно, лучше проводить изменения конфигурации в глобальном файле httpd.conf, который читается лишь однажды. Файл httpd.conf (или extra/http-userdir.conf) содержит закомментированный блок для управления пользовательскими каталогами (в /home). Если вы планируете запускать сервер, на котором пользователи могут иметь собственные сайты, но хотите гарантировать, что браузеры, поддерживающие различные методы передачи данных НТТР/1Л (такие как DELETE, COPY и MOVE), не испортят их, то для этого можете раскомментировать следующий блок: # # Control access to UserDir directories. The following is an example # for a site where these directories are restricted to read-only. # Контроль доступа в каталоги UserDir. Ниже приведен пример # для сайта, где к этим каталогам ограничен доступ только по чтению. # #<Directory /home/*/public_html> # AllowOverride Filelnfo AuthConfig Limit # Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec # <Limit GET POST OPTIONS PROPFIND> # Order allow,deny # Allow from all # </Limit> # <LimitExcept GET POST OPTIONS PROPFIND> # Order deny,allow ^ # Deny from all # </LimitExcept> #</Directory> Обратите внимание, что AllowOverride здесь позволяет файлам .htaccess переопределять директивы Filelnfo, AutoConfig и Limit, но директивы Options установлены на глобальном уровне и не могут быть переопределены.
Конфигурирование Web-сервера Глава 26 793 НА ЗАМЕТКУ Согласно исторически сложившимся договоренностям, каталоги документов для отдельных пользователей называются public_html; таким образом, запрос http://some.host.com/-user/ должен показать документы в /home/user/publichtml. Также, по традиции, если присутствует файл index. html, то Apache обрабатывает этот файл вместо выдачи листинга каталога. (Серверы Microsoft обычно используют для этой цели Default.htm.) Вы можете специфицировать столько имен файлов индексов, сколько хотите, используя директиву Directoryindex. Apache попробует каждый из специфицированных вами файлов в том порядке, в котором вы введете их. Запуск и останов демона HTTP Процесс инсталляции из коллекции можете убедиться в этом, найдя процесс портов автоматически запустит сервер. Вы httpd командой ps и grep: # ps -waux | grep httpd root nobody nobody nobody nobody nobody nobody 220 0.0 2.0 4436 2456 303 0.0 2.0 4496 2548 304 0.0 2.0 4460 2452 305 0.0 2.0 4460 2452 306 0.0 2.0 4460 2452 307 0.0 2.0 4460 2452 13963 0.0 2.0 4468 2468 ?? Ss Sat02PM ?? I ?? I ?? I ?? I ?? I ?? I Sat02PM Sat02PM Sat02PM Sat02PM Sat02PM SatlOPM 0:02.79 0:00.01 0:00.00 0:00.00 0:00.00 0:00.00 0:00.00 /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd Обратите внимание, что Apache 1.3 использует модель ветвления, согласно которой "мастер-процесс" (принадлежащий root в показанном выше выводе) прослушивает порт 80 на предмет входящих запросов и затем порождает копию самого себя (принадлежащую непривилегированному псевдо-пользователю nobody), как дочерний процесс для обработки каждого запроса. Мастер-процесс никогда сам не обслуживает никаких запросов. НА ЗАМЕТКУ Очень опасно иметь Web-сервер, который может обрабатывать запросы как root, потому что это значит, что он сможет выполнять CGI-программы от имени root, а эта ситуация чревата тем, что один маленький CGI-сценарий сможет легко стереть содержимое вашего жесткого диска. При такой модели ветвления, когда десятки процессов httpd могут работать параллельно, прерывать и перезапускать каждый из процессов было бы, как минимум, непрактично. Есть лучший способ остановить и перезапустить сервер. Все, что нужно для этого сделать — уничтожить мастер-процесс. Чтобы перезапустить сервер, отправьте мастер-процессу сигнал HUP (kill -HUP 220), что приведет также к уничтожению всех дочерних процессов, перезапуску мастер-процесса и повторному порождению дочерних процессов. Все это выглядит довольно запутанно и предполагает использование инструментов вроде ps, grep и kill в довольно загадочной манере. К счастью, Apache предлагает удобный инструмент для этих целей: apachectl, который инсталлируется в /usr/local/sbin и потому является частью вашего пути поиска программ по умолчанию.
Работа в сети FreeBSD Часть V НА ЗАМЕТКУ В Apache 2.x программа поддержки apachectl объединена в самой программой httpd; если вы вызовите apachectl с любыми аргументами, о которых мы говорили ранее, то эти аргументы в действительности передаются httpd, который теперь обрабатывает эти команды самостоятельно. Таким образом, команда httpd -1 (о которой будет сказано ниже) — это эквивалент apachectl -1, a httpd start даст тот же эффект, что apachectl start. Работа Apache 2.x построена на базе потоков, а не процессов, поэтому он порождает гораздо меньше процессов httpd, чем Apache 1.3. Запуск и останов Apache с использованием apachectl выполняются достаточно просто: # apachectl start /usr/local/sbin/apachectl start: httpd started /usr/local/sbin/apachectl start: httpd запущен # apachectl stop /usr/local/sbin/apachectl stop: httpd stopped /usr/local/sbin/apachectl stop: httpd остановлен После того, как внесены изменения в любые файлы в /usr/ local /etc/apache, следует перезапустить Apache. Это также делается легко программой apachectl: # apachectl restart /usr/local/sbin/apachectl restart: httpd restarted /usr/local/sbin/apachectl restart: httpd перезапущен Команда apachectl restart — эквивалент отправки kill -HUP мастер-процессу httpd: все дочерние процессы при этом будут уничтожены, даже если они находятся в стадии обработки файлов для клиентов — все эти клиенты получат внезапный обрыв связи. Если вы хотите перезапустить Apache менее деструктивным образом, например, если у вас работает тяжелонагруженный сервер, для которого критична целостность данных, в таком случае вы можете отдать предпочтение "вежливому" перезапуску, который использует сигнал SIGUSR1 вместо SIGHUP. Менее срочный сигнал позволяет мастер-процессу перезапустить себя, не уничтожая дочерних процессов, а это означает, что передача данных, находящаяся на полпути, не будет прервана: # apachectl graceful /usr/local/sbin/apachectl graceful: httpd gracefully restarted /usr/local/sbin/apachectl graceful: httpd "вежливо" перезапущен Еще одним распространенным применением apachectl является команда configtest. Она заставит Apache (независимо от того, запущен он или нет) прочитать конфигурационный файл из /usr/ local /etc/apache и сообщить о любых ошибках конфигурации — так же, как это делает команда start, но при этом не запуская сервера. Это отличный инструмент диагностики, являющийся неявной частью обеих команд — restart и graceful, apachectl использует configtest для определения корректности конфигураций после попытки перезапуска сервера; если конфигурация неправильная, она оставит работающие процессы в покое. Это предотвращает непреднамеренное повреждение сервера командами restart и graceful:
Конфигурирование Web-сервера | „_ Глава 26 1 # apachectl graceful /usr/local/sbin/apachectl graceful: configuration broken, ignoring restart /usr/local/sbin/apachectl graceful: (run 'apachectl configtest' for details) /usr/local/sbin/apachectl graceful: конфигурация разрушена, повторный запуск игнорируется /usr/local/sbin/apachectl graceful: (запустите 'apachectl configtest* для получения деталей) СОВЕТ \ Если Apache не выполняется, apachectl restart или apachectl graceful запустят его. Базовый контроль доступа в Apache Некоторые части вашего Web-сайта почти наверняка потребуют защиты от публичного просмотра; контроль доступа позволяет вам ограничить доступ к этим разделам только для авторизованных пользователей — по имени хоста, IP-адресу или же с помощью парольной аутентификации. Рассмотрим оба этих метода. Контроль доступа по адресу Предположим, что вы хотите ограничить доступ к определенному файлу, каталогу или множеству файлов и каталогов коротким ограниченным списком IP-адресов и имен хостов. Это можно сделать на глобальном уровне (httpd, conf), если у вас есть постоянная область вашего сайта (такая как набор административных сценариев), которая требует специальной защиты, или же более эффективно — для рядовых пользователей или временных частных ресурсов — используя файл .htaccess в каталоге, в котором (и ниже которого) находятся элементы, подлежащие защите. Начните с проверки того, что переопределения .htaccess включены в той части сайта, которую требуется защитить. Как вы видели ранее, можно использовать AllowOverride Limit на уровне /us r/ local/ www/data или ниже по структуре каталогов с другим контейнером <Directory>, чтобы включить использование директив контроля доступа Allow, Deny и Order. Поскольку все директивы Apache читаются одновременно, вам следует специфицировать порядок, в котором должны читаться директивы Allow и Deny; в противном случае они переопределят друг друга так, как вы не предполагали. Чтобы закрыть доступ к каталогу для всех, кроме определенных адресов и имен хостов, поместите в этот каталог файл .htaccess со следующим содержимым: Order deny,allow Deny from all Allow from 64.41.131.102 Allow from stripes.example.com Allow from nowhere. com Allow from 10.5.100 Allow from 10.67.22.211/255.255.255.0 Как видите, разрешены разнообразные форматы адреса — это лишь правила сопоставления, и если подключающийся хост соответствует любому из указанных имен
I Z77 | Работа в сети FreeBSD хостов или сетевых шаблонов, доступ к нему будет открыт. Аналогично можно открыть каталог для всех, за исключением определенных хостов: Order allow,deny Allow from all Deny from 133t.hacker.com > Deny from 192.168 Эти команды нужно поместить внутри блока <Directory> или <Location>, если вы делаете это в httpd.conf. Можно также использовать <Files> или <FilesMatch> для перечисления определенных файлов, где бы они ни находились в системе, которые должны быть субъектами контроля доступа: <Piles "*.jpg"> Order deny,allow Deny from all Allow from 64.41.131.102 </Files> FilesMatch может использоваться для указания регулярных выражений для сопоставления имен файлов, как в следующем примере, где задается соответствие файлам .gif, .jpg, .jpegn .png: <FilesMatch "\.(gif|jpe?g|png)$"> Order deny,allow Deny from all Allow from 64.41.131.102 </FilesMatch> Обратите, однако, внимание, что директивы <Directory> и <Location> в файле .htaccess не доступны. Блок <Limit>, несмотря на свое наименование, не требуется для работы предшествующего контроля доступа. Вместо этого его назначение — перечислить определенные методы доступа, к которым должен применяться контроль доступа. Например, вы можете решить ограничить только GET и POST, не затрагивая всех прочих методов доступа. Аналогичным образом можно использовать <LimitExcept> для спецификации только тех методов, к которым контроль доступа не должен применяться. Вы видели пример этого ранее, в закомментированном блоке, управляющим пользовательскими каталогами внутри /home. ВНИМАНИЕ! Ограничения доступа по адресу чреваты ошибками. IP-адреса могут быть подменены злоумышленником. И более того, подмена адреса прозрачна и не трассируется; если же вы используете вместо этого пароли, то происходит диалог, который можно запротоколировать с большей степенью детализации. Когда возможно, выбирайте контроль доступа на основе паролей вместо контроля на основе адресов. Контроль доступа по паролю Иногда бывает непрактично или нежелательно ограничивать доступ по адресу. Привилегированную часть вашего сайта можно сделать доступной для зарегистрированных пользователей, которые, например, внесли некоторую плату, и такие пользо-
Конфигурирование Web-сервера Глава 26 ватели могут заходить с непредсказуемых IP-адресов. В этих случаях более оправдано для контроля доступа использовать парольную аутентификацию. Apache хранит собственные базы данных имен пользователей и паролей — отдельно от системной базы в /etc/master.passwd и ей подобных. Это связано с соображениями безопасности, и было бы исключительно плохой идеей пытаться объединить две системы аутентификации вместе, так что даже и не думайте об этом. База данных паролей FreeBSD предназначена для аутентификации пользователей командной оболочки, которые уже имеют свои учетные записи в системе, в то время как базы данных аутентификации Apache управляют доступом к определенным частям вашего Web-сайта со стороны внешних посетителей. У вас может быть ситуация, когда эти две области функциональности перекрываются (например, в случае внутрен него Internet-сервера компании), но не поддавайтесь соблазну пытаться объединить их в одной базе данных. Даже если у вас получится, это будет небезопасным и безответственным приемом администрирования системы. Такая практика явно отвергается Apache Group и вызовет больше нареканий, чем одобрения со стороны ваших коллег. Оно того не стоит. Чтобы защитить паролем часть вашего Web-сайта, вам нужно использовать файл .htaccess (или эквивалентную конфигурацию в httpd.conf), включая соответствующее использование блоков <Directory>, <Location> и <Files> так же, как при контроле доступа на основе адресов. Содержимое этого файла или блока конфигурации существенно отличается, включая использование совершенно различных модулей Apache для управления доступом. Вот просто пример такого блока: AuthType Basic AuthName "Restricted Area" AuthUserFile /usr/local/www/.htpasswd Require valid-user Этот пример включает минимальное количество директив, необходимых для выполнения работы по защите паролем; каждая из этих директив, или их альтернатив, необходимы. Данные директивы несколько запутанны, поэтому давайте рассмотрим их по отдельности. • AuthType. Может быть либо Basic, либо Digest. Нас интересует только Basic. • AuthName. Просто имя защищаемой области. Это имя возникает в окне аутентификации браузера пользователя (например, "Enter username for 'Restricted Area* at www.example.com" ("Введите имя пользователя для 'ограниченной области* на www.example.comw)), сообщая пользователю, в какую область он входит и какое имя пользователя и пароль от него требуются. Это имя может быть любым, какое вы захотите, единственное условие — если в нем есть пробелы, его следует заключить в кавычки. • AuthUserFile, AuthDBUserFile и AuthDBMUserFile. Одна из этих директив должна присутствовать для указания местоположения файла, содержащего базу данных имен/паролей для данной области. (Если хотите, каждая область может иметь свою базу данных.) Если это простой текстовый файл, используйте AuthUserFile; если же это база в формате db или dbm, предназначенная для ускорения поиска (хорошая идея, если пользователей достаточно много), используйте соответственно AuthDBUserFile или AuthDBMUserFile. Чуть позже мы расскажем о том, как создавать базы данных пользователей в формате db/dbm. 797
Работа в сети FreeBSD • AuthGroupFile, AuthDBGroupFile и AuthDBMGroupFile. Эти директивы работают так же, как директивы предыдущей группы, но с тем отличием, что специфицируют группы пользователей из файла, указанного AuthUserFile, позволяя ограничить доступ для групп вместо определенных пользователей. Эта директива не обязательна, но если вы используете ее, то директива AuthUserFile или эквивалентная (ассоциированная с базой данных пользователей) должна присутствовать, чтобы ее пользователи были реорганизованы, как часть пере численных групп. • Require. Сообщает Apache о том, как аутентифицировать пользователя. Аргументом может быть valid-user (любой пользователь, присутствующий в файле AuthUserFile, который вводит корректный пароль), user <username> <username>. • • (список пользователей) или group <groupname> <groupname>... (список групп). Добавление пользователей После того, как вы установите блок контроля доступа, napachectl con ft est сообщит, что с конфигурацией все в порядке, наступает время добавления пользователей. Во-первых, давайте посмотрим, как создать базу данных пользователей в простом текстовом файле, с которым можно применять директиву AuthUserFile, Команда, необходимая для этого — htpasswd, которая в системе FreeBSD находится в /usr/local/bin, и поэтому является частью пути поиска по умолчанию: • htpasswd -с /usr/ local /www/, htpasswd frank НА ЗАМЕТКУ Опция -с необходима только при первом запуске htpasswd; она указывает программе, что нужно создать файл (поскольку он еще не существует), затем, каждый последующий раз опцию -с можно опускать. Затем будет выдано приглашение ввести пароль пользователя, который необходимо ввести два раза (как обычно). Чтобы выполнить этот сценарий, вы можете использовать опцию -Ь и указать пароль в качестве еще одного аргумента: # htpasswd -bm /usr/local/www/.htpasswd joe Prld3L4ndz Другая опция, применяемая здесь — это -m, которая заставляет htpasswd использовать пароль шифрования на основе MD5 вместо системной процедуры crypt (); это может обеспечить лучшую безопасность. Описание остальных опций можно найти на странице man apachectl. ВНИМАНИЕ! « Файл базы данных пользователей может быть размещен в любом месте системы, в котором пользователь Web-сервера (nobody) сможет его прочитать, и назвать его можно так, как хотите, хотя имя, начинающееся с .htpasswd (например, .htpasswd-rectrictedarea) является традиционным и защищает его от просмотра в листинге каталога — как в оболочке, так и через Web-сервер. Однако было бы очень плохой идеей помещать файл там, где он будет доступен пользователю через Web-браузер! Не размещайте его нигде внутри /usr/local/www/data или в любом другом пользовательском каталоге public_htmi; вместо этого используйте недоступные из Web местоположения, такие как /usr/local/www, или непосредственно внутри домашнего каталога пользователя. Вы же не хотите, чтобы кто-нибудь загрузил базу пользователей и взломал ее!
Конфигурирование Web-сервера I ZTT I Глава 26 I I Базы данных пользователей в текстовых файлах подходят для небольших списков пользователей. Однако когда речь идет о нескольких десятках или сотнях пользователей, то время поиска пользовательского пароля может сделать процесс аутентификации затруднительным или даже нефункциональным. Решение этой проблемы заключается в применении файла настоящей базы данных — в форме либо db, либо dbm, и использовании соответствующей директивы AuthDBUserFile или AuthDBMUserFile в блоке контроля доступа. Программа поддержки, позволяющая вам работать с файлами базы данных — /usr/local/bin/dbmmanage: # dbmmanage /usr/local/www/, htpwddb adduser frank New password: Новый пароль: ч *• Re-type new password: Повторно введине новый пароль: User frank added with password encrypted to NtMDxy6jwyW7A using crypt Пользователь frank добавлен с зашифрованным паролем NtMDxy6jwyW7A, используя crypt Этот пример создает файл базы данных стиля db по имени /usr/local/ www/ .htpwddb, которую вы затем специфицируете в директиве AuthDBUserFile. Эквивалент в формате dbm также может быть применяться при необходимости, хотя и не обязательно. Дополнительные детали о командах управления пользователями читайте на странице man dbmmanage. Добавление групп Список групп в текстовом файле (AuthGroupFile) достаточно прост. Каждая строка содержит имя группы, двоеточие и затем список членов группы: mygroup: frank joe alice Файл групп, вероятно, должен был бы находиться в том же месте, что и файл пользователей, и иметь похожее имя; однако, поскольку файл группы не содержит никаких паролей, соображения безопасности здесь не столь существенны. Достаточно обеспечить, чтобы только root имел возможность записи в этот файл! Файлами групп также можно управлять утилитой dbmmanage, но эта практика обычно не нужна, поскольку (как с /etc/group) редко когда число групп может сравниться с количеством пользователей. Вы можете применять AuthGroupFile в сочетании с AuthDBUserFile, если хотите смешать форматы; это, вероятно, простейший способ поддерживать большой список пользователей наряду с небольшим списком групп. Контроль доступа по адресу и паролю Можно потребовать, чтобы пользователь удовлетворял как ограничениям на адрес хоста, так и парольной аутентификации, прежде чем ему будет выдан доступ к ограниченной области. Это делается с помощью директивы Satisfy: Allow from 64.41.131.102 Require valid-user Satisfy all Satisfy all —установка по умолчанию, если присутствуют обе директивы — Allow и Require; такое поведение означает, что входящий пользователь должен отвечать требованиям Allow и указывать правильное имя пользователя и пароль,
Работа в сети FreeBSD Часть V прежде чем ему будет предоставлен доступ. Можно также использовать Satisfy any для сообщения серверу, что пользователь должен указывать правильный пароль или подключаться с правильного адреса; это удобно, если вы хотите, чтобы пользователи из определенных мест имели безусловный доступ к области, а от остальных требовалась аутентификация (например, если вы предоставляете службу, которую должны администрировать через тот же интерфейс, что и другие пользователи, но не желаете всегда вводить пароль для получения доступа). Виртуальный хостинг Виртуальный хостинг — это практика хранения содержимого Web<aUTOB для разных доменов или имен хостов на одном и том же сервере; единственная инсталляция Apache обслуживает их все. Например, www.mystore.com и www.frankspage.com- оба могут быть конфигурированы в DNS с одним и тем же IP-адресом, на вашей машине FreeBSD, и Apache будет отвечать за обслуживание обоих, наряду с его собственным именем хоста (специфицированным директивой ServerName). Как вы видели, HTTP/1.0 не предоставляет никаких указаний того, какого имени хоста HTTP-клиент пытается достичь (как специфицировано пользователем), поэтому в прежние времена виртуальный хостинг был возможен только путем привязки каждого имени хоста к отдельному IP-адресу, с последующей привязкой каждого IP-адреса к IP-псевдониму одной и то же карты Ethernet. Каждый виртуальный хост затем указывался своим IP-адресом, поэтому запрос, поступивший от Web-браузера, всегда получал ответ в виде корректного ШеЬчгайта. Недостатком такой схемы было то, что привязка огромного блока IP-адресов к одной и той же карте была слишком громоздкой — никто не хотбл проводить изменения DNS при каждой переконфигурации своего Web-сервера, к тому же это приводило к ненужному расходу адресного пространства IP (которое, как вы видели в главе 22, отнюдь не бесконечно). Потребность в таком неуклюжем процессе, однако, была преодолена в HTTP/1.1. Обязательный заголовок Host: специфицирует имя хоста, которого желает достичь клиент. Таким образом, виртуальные хосты на базе имен стали нормой в современной сети. Клиенты, не поддерживающие заголовок Host: почти исчезли в наши дни, поэтому мы будем говорить только о виртуальных хостах на базе имен (а не адресов); если вас интересуют виртуальные хосты на основе адресов, вы можете найти нужную информацию на Web-сайте Apache. Большая часть файла http.conf специфицирует сервер "по умолчанию" — глобальный набор определений, которые применяются ко всем запросам, полученным Apache. В сервере по умолчанию директива ServerNarae используется главным образом для конструирования перенаправлений URL с кодом 301, как было описано ранее. Однако вы можете затем установить небольшие наборы переопределений этих глобальных установок, которые применяются в случае, если заголовок Host: соответствует определенному специфицированному имени хоста. Эти группы переопределений и составляют то, что известно как виртуальные хосты. НА ЗАМЕТКУ В Apache 2.x файл http-vhosts.conf в каталоге extra может применяться для хранения конфигурации вашего виртуального хоста отдельно от главной конфигурации сервера. Это особенно важно, если у вас десяток и более виртуальных хостов. 800
Конфигурирование Web-сервера I "ZT1 I Глава 26 I I Предположим, что ваш сервер называется stripes.example.com, и что именно это имя указано в директиве ServerName. Чтобы сконфигурировать виртуальные хосты на базе имен, вам понадобится директива NameVirtualHost с аргументом * (шаблон, означающий "все имена хостов"), за которым следует столько разных блоков <VirtualHost *>, сколько вам нужно: NameVirtualHost * <VirtualHost *> Serve rName www. example. com DocumentRoot /usr/local/www/data Server Admin webmaster @ example. com ErrorLog logs/www. example. com-error__log CustomLog logs/www.example.com-access_log common </VirtualHost> <VirtualHost *> ServerName www.frankspage.com ServerAlias frankspage.com DocumentRoot /home/frank/public_html ServerAdmin frank@frankspage.com ErrorLog logs/www.frankspage.com-error_log CustomLog logs/www.frankspage.com-access_log common </VirtualHost> НА ЗАМЕТКУ Директивы <virtualHost> в Apache 2.x специфицируют не только имя хоста, но также порт — в формате <virtualHost *:80> (ТСР-порт 80 — стандарт HTTP). Однако, поскольку аргумент * конфликтует с конфигурацией для шифрования SSL, его следует избегать в пользу явно заданных IP-адресов. Внутри контейнера <VirtualHost> директива Serve rName определяет имя хоста, с которым должен сравниваться заголовок Host:, и при совпадении включается соответствующий набор переопределений (нужный блок <VirtualHost> применяется к конфигурации). DocumentRoot специфицирует, где в файловой системе нужно искать файлы, указанные в принятом запросе, а директивы ErrorLog и CustomLog задают альтернативные файлы протоколов для каждого виртуального хоста. ServerAlias предоставляет возможность перечислить альтернативные имена для каждого виртуального хоста. Вы можете также включить любые другие директивы по своему желанию, до тех пор, пока они допускаются внутри блока <VirtualHost> — apachectl conf igtest сообщит вам, если они там не допускаются. Важно отметить, однако, что в настройке, показанной ранее, запрос сервера по умолчанию (striples.exmple.com) или любое другое имя хоста, отображаемое на IP-адрес сервера, но не соответствующее ни одному из блоков <VirtualHost>, не получит никакого ответа от сервера по умолчанию; сервер по умолчанию никогда не отвечает на запросы любого адреса, который специфицирован для виртуальных хостов на основе имен (в директиве NameVirutalHost). Он существует только для спецификации установок конфигурации по умолчанию. Поскольку мы использовали шаблонный символ * для описания виртуальных имен хостов на базе имен на всех IP-адресах, сервер по умолчанию никогда не обслуживает запросов сам. В отсут-
802 Работа в сети FreeBSD Часть V ствие совпадающего с <VirtualHost> запрошенного имени хоста, ответит первый <VirtualHost>, который появляется в конфигурационном файле (в данном случае - www ¦ example. com). Более корректная конфигурация, чем приведенная выше, должна быть такой: NameVirtualHost * <VirtualHost *> ServerName stripes¦example.com </VirtualHost> <VirtualHost *> ServerName www.example.com ServerAlias *.example.com DocumentRoot /usr/local/www/data ServerAdmin webmaster@example.com ErrorLog logs/www.example.com-error_log CustomLog 1ogs/www.example.com-access_log common </VirtualHost> <VirtualHost *> ServerName www.frankspage.com ServerAlias frankspage.com DocumentRoot /home/frank/public_html ServerAdmin frank@frankspage.com ErrorLog logs/www.frankspage.com-error_log CustomLog logs/www.frankspage.com-access_log common </VirtualHost> Эта настройка гарантирует, что конфигурация сервера по умолчанию для stripes. example. com будет той, которая используется для ответа на запрос без явного заголовка Host:. Виртуальные хосты могут быть созданы множеством других способов, позволяя вам указывать разные IP-адреса и порты для соответствия определенным группам блоков <VirtualHost>. Примеры синтаксиса этих методов можно найти в http:// httpd.apache.org/docs/1.3/vhosts/. Введение в модули Apache Одной из сильных сторон Apache считается его модульная структура. Все директивы конфигурации являются частью того или иного модуля, и в то время как в ранних версиях Apache эти модули старательно подключались или отключались во время компиляции, сегодня все они доступны в виде динамических разделяемых объектов (dynamic shared object — DSO), и могут просто подгружаться во время выполнения. Встроенные модули Чтобы увидеть модули, статически компилированные в Apache, используйте httpd -1: # httpd -l Compiled-in modules: Скомпилированные модули:
Конфигурирование Web-сервера http_core.c mod_so.c suexec: disabled; invalid wrapper /usr/local/sbin/suexec suexec: отключено; недопустимая оболочка /usr/local/sbin/suexec Это значит, что директивы модулей Core и mod_so — единственные, доступность которых гарантирована. Модуль Core предоставляет доступ к наиболее фундаментальным директивам, без которых Apache вообще не сможет работать; mod_so обеспечивает поддержку DSO, благодаря которой можно загрузить еще примерно 32 модуля, поставляемых с Apache, а также любые дополнительные модули, которые вы можете пожелать установить. НА ЗАМЕТКУ Не обращайте внимания на замечание относительно suexec; это утилита, позволяющая Apache запускаться в оболочке setuid, исполняя запросы от имени указанного пользователя (обычно своего для каждого виртуального хоста). Оболочка suexec не инсталлируется по умолчанию; вы можете получить дополнительную информацию о ней по адресу http: //httpd.apache .org/ docs/l. 3/suexec. html. К тому же в главе 30 мы расскажем о CGIwrap — более гибкой альтернативе suexec. Следует отметить, что Apache 2.x может и не отображать строку о suexec, а его список DSO существенно отличается. Динамически загружаемые модули Динамические модули — это функциональные библиотеки, которые могут быть добавлены или удалены из сервера Apache во время его выполнения вместо компиляции в бинарную программу httpd. Эти модули (также известные, как DSO (dynamic shared object) — динамические разделяемые объекты) позволяют сократить размер работающих процессов httpd за счет исключения модулей, которые вам не нужны. Это можно легко сделать во время выполнения, комментируя ненужные модули в httpd. с on f. Если вы решите позднее, что вам нужна функциональность определенного модуля, вы просто включаете его и перезапускаете Apache. Полный список всех модулей Apache и директив, являющихся частями каждого модуля, можно найти по адресу http://httpd.apache.org/docs/1•3/mod/. Чтобы включить модуль, необходима директива LoadModule (которая динамически компонует модули в процесс httpd) и директива AddModule (которая включает директивы модуля в правильном порядке для последующего использования в конфигурационном файле). Если вы заглянете в httpd. с on f, то найдете там директивы LoadModule и AddModule для всех связанных модулей Apache, которые инсталлированы в /usr/local/libexec/apache. Что следует отметить относительно LoadModule, так это то, что директива LoadModule обрабатывается встроенным образом перед обработкой всего остального, так что порядок указания модулей очень важен. Если модуль зависит от другого модуля, уже скомпонованного, то эта зависимость может быть вызвана первой. Конфигурация по умолчанию уже составлена с учетом этого. НА ЗАМЕТКУ Директивы AddModule в Apache 2.x не требуются.
Работа в сети FreeBSD Модули от независимых поставщиков Истинная сила модульной структуры Apache проявляется в возможности применения модулей от независимых разработчиков. Эти модули компонуются во время выполнения с остальными доступными модулями Apache, обеспечивая дополнительную функциональность и директивы конфигурации — обычно позволяя Apache более эффективно обрабатывать содержимое серверной стороны. Один из популярных модулей — modjperl, который встраивает интерпретатор Perl, значительно ускоряя CGI-сценарии на языке Perl, избавляя Apache от необходимости запускать командный процесс и исполнять в нем программы CGI при каждом запросе (о модуле modjperl вы узнаете больше в одной из последующих подразделов настоящей главы). Другой модуль, mod_php4, дает возможность Apache разбирать и обрабатывать динамические страницы РНР (аналог технологии ASP от Microsoft в мире UNIX). Более чем 100 модулей Apache от независимых разработчиков доступны в коллекции портов /us r/ports/www; все они начинаются с mod_. Сборка модулей с помощью apxs Раньше при разработке модулей от независимых поставщиков, когда поддержка DSO находилась в лучшем случае в экспериментальной стадии, компиляция такого модуля означала необходимость наличия как исходных текстов Apache, так и самого модуля для перекрестной компиляции в единую гибридную библиотеку. Хотя технически это также был "модульный" подход {по крайней мере, это было лучше, чем вручную "латать" исходный код самого Apache), никто не мог назвать его легким. Он также предполагал построение новой исполняемой программы каждый раз, когда появлялась новая версия Apache или модуля, при этом требуя значительного ручного вмешательства в код для того, чтобы заставить его работать. Появился apxs — инструмент расширения Apache. Его поддерживает программа, находящаяся в /usr/local/sbin, которая использует преимущества уже скомпилированной бинарной поддержки DSO (статически компилированный модуль modso) для обеспечения всех возможностей вашей бинарной программы httpd. Отныне вам не нужно иметь исходный код Apache, чтобы выполнять сборку независимых модулей; apxs компилирует и преобразует модули в "сырой" исходной форме или в виде уже скомпилированных объектов в объекты .so, которые могут быть загружены в Apache директивой LoadModule наряду с остальными. Скорее всего, вам никогда не придется использовать apxs непосредственно; этот инструмент времени компиляции используется прозрачно инструментами сборки в коллекции портов. Все, что потребуется сделать, чтобы построить независимый модуль — это, как и с любым другим портом, перейти в каталог модуля /usr/ports/www и ввести команду make. Остальное сделает apxs. Если вышла новая версия Apache, она может быть собрана и инсталлирована отдельно, и при этом независимые модули продолжат работать. Аналогично, при обновлении модуля вы можете просто пересобрать и повторно установить его. Такова истинная модульность в своем лучшем виде. Дополнительную информацию о apxs можно найти на странице man apxs, если она вас интересует.
Конфигурирование Web-сервера Глава 26 805 mod_perl Одним из наиболее популярных модулей от независимых разработчиков является mod_perl. Хотя Perl по-прежнему наиболее популярный выбор для CGI-программи- рования (о котором речь пойдет ниже), выполнение сценариев Perl означает значительные накладные расходы для Apache. Когда запрос HTTP обращается к CGI-npo- грамме на Perl, Apache должен стартовать процесс командной оболочки и запустить сценарий внутри нее, передав результат обратно клиенту. Благодаря mod_perl, интерпретатор Perl встраивается непосредственно в Apache. Специализированные директивы определяют некоторые типы файлов, как исполняемые сценарии Perl, которые Apache должен выполнить самостоятельно; более того, каждый сценарий Perl, выполняемый Apache, удерживается в компилированной форме в памяти для дальнейшего использования. Это исключает накладные расходы, обычно связанные с исполнением CGI, что значительно ускоряет отклик программ стороны сервера. Дополнительная информация о mod_perl доступна по адресу http : // perl.apache.org. modjpython С появлением Python, как наиболее вероятного наследника Perl, как языка будущего для программирования серверной стороны, mod_python обеспечил те же преимущества Apache для Python, какие mod_jperl принес Perl. Интерпретатор Python сделан непосредственно доступным Apache, что позволяет ему запускать программы Python без каких-либо накладных расходов, которые неизбежны при запуске его в виде CGI. Домашняя страница mod_j?ython находится по адресу http: //www.modpython. org. modjphp PHP — популярный инструмент генерации динамических страниц для UNIX; он сделан как часть Apache через модули modjphp4 и modjphp5. Директивы, предоставляемые этим семейством модулей, позволяют Apache совершенно естественно обрабатывать файлы .php, исполняя встроенную функциональность сценариев для генерации финальной формы страницы перед отправкой ее клиенту. Когда вы собираете и инсталлируете mod_php4, ваш файл httpd.conf автоматически обновляется для обеспечения поддержки типов файлов .php и .phps. Дополнительную информацию по РНР и mod_php4 можно найти по адресу http://www.php.net. modjruby Этот модуль делает для языка Ruby то, что mod_perl и mod_j?ython делают для Perl и Python, существенно ускоряя запуск CGI-сценариев на Ruby. Это особенно важно с учетом растущей популярности таких архитектур Web-приложений, как Ruby on Rails (http://www.rubionrails.org), которая мгновенно заявила о себе, как о конкуренте другим каркасам и технологиям разработки Web-приложений. Доступно еще огромное множество других модулей, обеспечивающих настолько широкую функциональность Apache, что обеспечит вам занятие на длительное время. Модульность Apache лишь недавно полностью устоялась, а широкая доступность стандартизованных модулей от независимых разработчиков в сочетании с коллекцией портов FreeBSD провозвестила беспрецедентно новую эру расширяемого администрирования HTTP-серверов.
806 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Некоторые модули от независимых разработчиков доступны только для Apache 1.3, но не для Apache 2.x. Однако другие поставляются в двух вариантах — по одному для каждой версии Apache; их можно идентифицировать по суффиксу "2" в именах и по тому факту, что они встречаются попарно (например, mod_log_sql и mod_log_sql2). Убедитесь в правильном выборе версии модуля для Apache, и в правильной версии Apache для модулей, которые собираетесь использовать! Включения стороны сервера Одним из популярных средств Apache является возможность обработки включений серверной стороны (server-side includes), или вызовов внутренних функций Apache, которые встроены в простые HTML-файлы и обрабатываются Apache перед отправкой браузеру. Включения серверной стороны позволяют вам выполнять широкий спектр вещей: от простого отображения переменных окружения на странице до импорта модульных фрагментов HTML или выполнения программ серверной стороны при каждом запросе страницы. Включения серверной стороны встроены в то, что известно как разбираемый HTML (parsed HTML), на самом деле представляющий собой просто обычный HTML, который Apache разбирает (обрабатывает лексемы встроенных команд) при запросе страницы. Apache ищет в разобранном HTML включения стороны сервера и обрабатывает каждое из них перед отправкой клиенту Каждое такое включение имеет следующую форму: <!—^command attribute= value attribute= value ... —> ВНИМАНИЕ! Синтаксис оператора включения серверной стороны важен; он должен иметь в точности такую форму, как показана выше. Открывающая строка <! —# command не должна содержать пробелов; в противном случае Apache воспримет эту директиву как комментарий HTML и проигнорирует ее. Вы можете использовать функцию View Source (Просмотр исходного кода страницы), чтобы увидеть, что все неверно оформленные включения серверной стороны игнорируются Apache и передаются браузеру буквально. В этом обобщенном примере command может быть include, exec, config, echo или несколько других возможных вариантов. Пары attribute=value — это способ установки и чтения переменных, которые вы можете определять самостоятельно, используя включения, или читать из доступных переменных окружения. Во-первых, чтобы разрешить включения серверной стороны в Apache, уберите комментарий со следующих двух строк в httpd. conf (или добавьте такие строки в соответствующий файл .htaccess): AddType text/html .shtml AddHandler server-parsed .shtml Обратите внимание, что эти строки могут находиться в разных секциях файла httpd.conf. Убедитесь, что обе они находятся в одном "контейнере" (<Directory>
Конфигурирование Web-сервера Глава 26 807 или <Location>). Это может быть трудно определить, поскольку некоторые контейнеры имеют множество закомментированных блоков и дополнительного текста, что запутывает структуру. НА ЗАМЕТКУ В Apache 2.x директива AddHandler разделена на несколько директив более специального назначения; вторая строка этого примера становится директивой AddOutputFilter: AddOutputFilter INCLUDES .shtml СОВЕТ Расширение . shtml — широко принятый в UNIX стандарт анализируемых на серверной стороне HTML-файлов. Существуют и другие варианты, такие как .shtm и .stm. Чтобы разрешить их наряду с .shtml, сделайте дубликаты строк с директивами, показанными здесь, и соответствующим образом отредактируйте их: AddType text/html .shtml AddHandler server-parsed .shtml AddType text/html .stm AddHandler server-parsed .stm Затем добавьте опцию Includes в блок <Directory> или <Location> (или же в файл .htaccess), управляющий областью Web-сайта, которая вас интересует: Options +Includes Директива AddType отображает класс файлов (по расширениям их имен) на типы MIME, расширяя базовый набор, хранящийся в /usr/ local /etc/apache /mime, types. Директива AddHandler присваивает обработчик (handler — внутренний метод Apache для обработки файла, запрошенного пользователем) определенным расширениям, в данном случае — . shtml, традиционному расширению HTML-файлов, которые Apache должен предварительно разобрать перед обслуживанием. При наличии этих двух директив любой файл . shtml будет разобран для обработки включений сервер ной стороны на своем пути к клиенту. НА ЗАМЕТКУ Помимо содержания включений серверной стороны, единственное отличие между файлами .html и .shtml — расширение имени. И те, и другие являются обычными HTML-файлами. Если вы помещаете включение серверной стороны в файл .html, то просто переименуйте его так, чтобы он имел расширение .shtml, если хотите, чтобы он был разобран перед отправкой браузеру. Включение серверной стороны в файлах .html или .htm будут отправлены клиенту без разбора сервером. ВНИМАНИЕ! Имейте в виду, что разбор любого файла требует больше ресурсов процессора и памяти, чем простая передача неразобранного файла браузеру. Лучше избегать нежелательного разбора простых HTML-файлов; в противном случае производительность Apache будет нанесен ущерб, что может оказаться критичным обстоятельством.
808 Работа в сети FreeBSD Часть V Рассмотрим несколько примеров полезных включений серверной стороны. • <!—#echo var=f,HTTPJJSER_AGENT"--> Печатает строку идентификатора браузера пользователя на странице. Более полная дискуссия о доступных Переменных окружения будет приведена ниже в этой главе, когда пойдет речь о программировании CGI. • <!—#set var="email" value="me@example.com"—> Устанавливает в переменную по имени email в строку me@example.com для остальной части страницы (если только она не будет переопределена позже подобной директивой). • <1—#include virtual="/toolbar.shtml"—> Включает содержимое /toolbar.shtml в текущую страницу. SSI разбираются рекурсивно, поэтому файл, включенный таким способом, может иметь свои собственные включения. • <! —#config timefmt="%A %B %d, %У"~> Устанавливает формат времени для всех серверных включений, выводящих дату и время. Строка формата — та же, что и для команды date; подробнее читайте man date. • <!— #flastmod file=f,index.shtml"~> Отображает дату и время последней модификации index.shtml, в формате времени, специфицированном в примере con fig timeout. • <!—#ехес cgi=,,/cgi-bin/counter"—> Выполняет CGI-сценарий по имени counter и отображает его вывод. Если вы поместите директивы, подобные этим, в файл . shtml и они не будут работать, посмотрите исходный код страницы. Эти директивы не должны появляться в HTML у клиента в той форме, какую они имеют во включениях стороны сервера. Убедитесь, что директивы AddType и AddHandler (или AddOutput Filter) специфицированы правильно, и что они применены именно к той части сайта, которую вы используете. СОВЕТ Страницей по умолчанию, отображаемой в каталоге, когда никакое имя файла не указано, является index.html, но с помощью директивы Directorylndex вы можете изменить это или даже специфицировать список имен файлов, которые в таком случае нужно попробовать: Directorylndex index.php index.cgi index,html index,shtml Apache ищет каждый из этих файлов по очереди, просто опрашивая каталог, и только если ни один из них не найден (и options indexes включена), отобразит список файлов этого каталога. Если вам больше нравится, можете вместо этого просто использовать: Options +MultiViews Directorylndex index INDEX Multiviews сообщает Apache, что он должен искать любой файл, чье имя соответствует базовому имени запрошенного файла (без расширения), a Directorylndex index говорит о том, что любой файл в каталоге, называемый index. * (с любым расширением) должен быть обработан, обычно в алфавитном порядке. Таким образом, вы можете использовать файлы index.htm, index.HTM и index.html — как бы пользователь ни назвал свои файлы.
Конфигурирование Web-сервера I ZT Глава 26 I Однако Multiviews может нанести ущерб производительности, так что вам следует обратить внимание на текущую загрузку процессора, прежде чем разрешать Multiviews в каталоге общего доступа. Полное руководство по включениям серверной стороны, с демонстрацией всего, от условного потока управления до внешних исполняемых CGI-программ, можно найти по адресу http://httpd.apache.org/docs/1.3/howto/ssi.html. Введение в CGI Обычные Web-сайты, состоящие из статических HTML-страниц, доживают последние дни. Включения стороны сервера позволяют вам встраивать огромный объем полезной функциональности в обычные HTML-страницы. Однако для построения настоящих Web-приложений (вроде сайтов электронной коммерции, досок объявлений, баз данных и всего того, что требует от системы подгонки содержимого в соответствие с действиями пользователя) вам понадобится программная среда серверной стороны, которая сможет обработать пользовательский ввод и контролировать запрошенный вывод. Стандартным способом добиться этого является CGI — Common Gateway Interface (Общий шлюзовой интерфейс). CGI представляет собой "протокол-посредник" — уровень на Web-сервере, который позволяет использовать HTML-формы для приема данных от пользователя, которые затем сервер (через CGI) передает в общем формате любой программе на сервере, независимо от того, на каком языке она написана. Программа CGI может быть сценарием Perl, скомпилированным бинарным кодом С, сценарием оболочки или чем-то еще, что может исполнить пользователь Apache (nobody или www). Вывод программы направляется обратно через Apache непогредственно в Web-браузер. Это значит, что, например, вы можете написать программу CGI, которая читает переменные из HTML-формы, обрабатывает их, открывает канал к Sendmail для отправки по почте содержимого переменных и печатает HTML-ответ пользователю. Ниже мы покажем, как это делается, на примере простого сценария Perl. Включение CGI в Apache Существуют два способа использования CGI-программ в Apache. Первый, и самый ясный способ — с помощью директивы ScriptAlias, которая определяет некоторый каталог, как содержащий только CGI-программы, и отображает их на виртуальный путь (видимый Web-браузеру): ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/" Эта строка, включенная'в httpd. conf по умолчанию, говорит Apache, что URL /cgi-bin/ (http: //stripes.example.com/cgi-bin/) является выделенным каталогом CGI, и что все, что находится в нем, должно трактоваться как CGI-программы. Если вы поместите в этот каталог нечто такое, что не является CGI-программой, он вернет код ошибки сервера 500, означающий неудачу запуска CGI. Вы можете добавить столько дополнительных строк ScriptAlias, сколько хотите. Путь файловой системы к каталогу CGI (например, /usr/local/www/cgi-bin) даже не обязан быть частью нормального пути, доступного из Web; вы можете указать псевдоним на любое место в системе, доступное для чтения пользователю nobody (или www). Это
Работа в сети FreeBSD предотвращает возможность просмотра пользователем содержимого каталога и навигации к нему из других листингов каталогов. Обычно вы не должны предоставлять непосредственный доступ к вашим программам CGI — как правило, они вызываются из ссылок или в качестве действий формы, о которых мы поговорим чуть ниже. НА ЗАМЕТКУ * Обратите внимание, что хвостовой слэш в /cgi-bin/ указывается. Это — еще одна мера безопасности, предназначенная для предотвращения неавторизованного доступа к листингу каталога. Программа CGI, как ее видит Apache через ScriptAiias, является именем программы (например, script .cgi), которое добавляется к виртуальному пути ScriptAiias (например, /cgi-bin/), поэтому слеш необходим для того, чтобы сервер сконструировал правильный путь (вроде /cgi-bin/script. cgi). Если хвостовой слэш будет опущен, то сам каталог также можно снабдить псевдонимом, а это значит, что пользователь сможет запросить каталог /cgi-bin и получить список его содержимого; вряд ли вы захотите этого. Перенаправления 301 здесь неприменимы. НА ЗАМЕТКУ Поскольку все файлы в каталоге, специфицированном ScriptAiias, трактуются как CGI-сцена- рии, вам не нужно иметь расширения имен файлов для каждой из этих программ. Можно иметь программу по имени /cgi-bin/test наряду с /cgi-bin/hello. cgi; но вне каталога /cgi-bin/ сценарии CGI должны иметь расширение . cgi или любое другое, которое вы сконфигурируете, используя AddHandier, что будет показано ниже. Другой способ включить CGI-программы — использовать директиву Options для добавления опции ExecCGI в область сервера, специфицированную блоком <Directory> или <Location>. Это удобно для включения CGI-программ в пользовательские каталоги publichtml, что позволит серверу выполнять эти программы как CGI на основе расширений их имен (например, . cgi) при условии, что они установлены как исполняемые. Следующий пример включает CGI-выполнение всех пользовательских файлов .cgi, независимо от того, в каких каталогах они находятся: <Directory /home/*/public_html> Options +ExecCGI AddHandler cgi-script .cgi </Directory> Если файл CGI (будь он в каталоге ScriptAiias или отображенный на обработчик по расширению) не может быть выполнен по какой-то причине, то пользователь получит сообщение об ошибке 500 Server Error; это обобщенное условие ошибки - одно из тех, которые могут быть вызваны многими причинами на стороне сервера и не могут применяться для отладки, помимо сообщения о том, что что-то не так. Более подробные диагностические сообщения вы можете получить, заглянув в журнал ошибок Apache. Ниже показан пример журнала ошибок при ошибочном запросе Perl-сценария по имени blah в /us r/ local /www/ cgi-bin: # tail /var/log/httpd-error.log syntax error at /usr/local/www/cgi-bin/blah line 3, at EOF Execution of /usr/local/www/-cgi-bin/blah aborted due to compilation errors. [Thu Oct 12 11:55:40 2006] [error] [client 64.2.43.44] Premature end of ^script headers: /usr/local/www/cgi-bin/blah
Конфигурирование Web-сервера Глава 26 синтаксическая ошибка в /usr/local/www/cgi-bin/blah f строка 3, EOF Выполнение /usr/local/www/cgi-bin/blah прервано из-за ошибок компиляции. [Thu Oct 12 11:55:40 2006] [ошибка] [клиент 64.2.43.44] Преждевременный конец % заголовков сценария: /usr/1ocal/www/cgi-bin/blah Первые две строки вывода получены непосредственно от Perl, и они точно такие же, как если бы сценарий был вызван из командной строки. Третья строка — сообщение Apache о том, что он пытается выполнить сценарий, но это завершается неудачей до вывода какого-либо HTTP-заголовка вроде Content-type: (что необходимо для корректного CGI-сценария). Поэтому наша задача — убедиться, что программа написана корректно для выполнения как CGI. Разработка CGI-программ Формат, в котором переменные CGI передаются программе серверной стороны, представляет собой URL-кодированную текстовую строку, в которой каждая переменная отделена от ее значения символом равенства (=), а от других переменных — символом амперсанда (&). Сценарий принимает ввод из стандартного входного потока (STDIN). Perl — наиболее широко используемый язык для CGI-программирования, и потому эти два термина часто ошибочно используются в качестве синонимов. Не путайте их! Perl применим для очень многих целей помимо Web-программирования, a CGI допускает все мыслимые языки программирования — даже те, которые еще не существуют. Но, так или иначе, превалирование Perl в мире CGI-программирования заставляет нас обратиться к нему немедленно. Доступ к CGI-программам через формы Сила Perl, как было показано в главе 11, заключается в легкости обработки текста и простоте разработки; это делает его идеальным выбором для ситуаций, когда необходимо читать переменные из HTML-формы (такие как имя пользователя, адрес электронной почты и комментарии) и преобразовывать их в вид, пригодный для использования вами или системой. Типичная CGI-программы на Perl вызывается как действие (action) HTML-формы, например: <FORM NAME^'myform" METHOD="POST" ACTI0N=,7cgi-bin/post2me"> Когда пользователь отправляет форму, все ее переменные пересылаются через интерфейс CGI на post2me, Perl-программу, чья обязанность заключается в их обработке. Первое, что этот сценарий должен сделать — это прочитать переменные из стандартного потока и сформировать из них ассоциативный массив для простого доступа: read(STDIN, $buffer, $ENV{¦CONTENT_LENGTH¦})/ Qpairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/«/, $pair)/ $value — tr/+/ /; $value — s/%([a-fA-F0-9][a-fA-F0-9])/pack<"C", hex($l))/eg; $value -~ s/~!/ ~!/g; $FORM{$name} = $value; > 811
Работа в сети FreeBSD Этот код выполняет некоторые проверки безопасности, чтобы предотвратить отправку злонамеренного ввода в программу. В особенности, если вы пишете CGI-npo- грамму, которая печатает пользовательский ввод формы в HTML-файл, пользователь может встроить в свой ввод вредоносный HTML-код, вызывающий включения стороны сервера, которые запустят некоторую программу на сервере. Поскольку любая программа, выполняемая через HTTP-запросы, выполняется от непривилегированного пользователя nobody (или www), обычно это может лишь вызывать раздражение. Однако все же это — брешь в безопасности, которую следует устранить, и этот блок кода исключает любые потенциально опасные HTML-дескрипторы, вставляя пробелы и тире, где это возможно. НА ЗАМЕТКУ Такого метода проверки "черного списка" или запрещенных кодов не достаточно для противостояния всем возможным методам атак. Вы можете переключить Perl в режим "taint", использовав флаг -т, который предотвратит Perl от выдачи системных вызовов за счет использования любых так называемых "запорченых" ("tainted") переменных в программе CGI. После того, как ваш сценарий прочитает ввод формы, каждая переменная формы становится доступной ему как ключ массива %FORM; содержимое поля ввода HTML по имени email, например, попадает в $FORM{ 'email1} и может использоваться так, как вы хотите. Затем ваш сценарий должен напечатать корректный заголовок HTML. Здесь у вас два выбора: можно вывести HTML-код на стандартный вывод, эффективно создав при этом новую HTML-страницу из сценария, или же перенаправить пользователя на другой URL, пока сценарий выполняет свою работу. Первое выполняется выводом заголовка Con tent-type:, который может быть любого допустимого типа MIME (дело браузера — знать, как его следует обработать), за которым следует две пустые строки — стандартный признак конца блока заголовков: print "Content-type: text/html\n\n"; НА ЗАМЕТКУ Если вы используете модуль CGI .pm (что делается очень часто), то можете печатать стандартный заголовок типа содержимого HTML, используя метод $q->header. Все выведенное вашим сценарием после этого заголовка является частью тела ответа, обрабатываемого браузером как HTML-содержимое. Вы можете использовать тип text /plain, чтобы заставить браузер отобразить простой текст, или любой другой тип, согласно существующим потребностям. Второй метод — перенаправление — обеспечивается заголовком Location: и указанием URL, на который нужно переадресовать пользователя: print "Location: http://www.somewhereelse.com/path/to/file.htmlNnXn"; Все, что будет напечатано после этого заголовка, исчезает, поскольку браузер уже переходит на другой URL. Переменные окружения также доступны CGI-программам, и соединение HTTP само по себе содержит массу интересной информации. Она включает HTTP_REFERER
Конфигурирование Web-сервера I Г71 I Глава 26 I I (ссылаемый URL), HTTP_USER_AGENT (браузер пользователя), REMOTE_HOST (имя хоста пользователя) и многое другое. Вы можете увидеть все это, применив сценарий printenv, который включен в состав инсталляции Apache по умолчанию в каталоге /usr/local/www/cgi-bin. Вы можете получить доступ к нему по URL-адресу http: // www.example.com/cgi-bin/printenv, подставив имя хоста или IP-адрес своей машины FreeBSD. Внутри Perl ваши переменные окружения доступны как ключи в массиве %ENV, так что значение переменной REMOTE_HOST можно получить, обратившись к $ENV{'REMOTEJiOST'b Рассмотрим простую CGI-программу на Perl, которая читает значение трех переменных — name, email и comments из HTML-формы, отправляет их вам по электронной почте и печатает в виде форматированного подтверждения пользователю. Сценарий показан в листинге 26.1. Листинг 26.1. Пример CGI-программы на Perl — sendcomments. cgi #!/usr/bin/perl -wT read(STDIN, $buffer, $ENV{¦CONTENT_LENGTH'}); Spairs = split (/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =- tr/+/ /; $value — s/%([a-fA-F0-9][a-fA-FO-9])/pack("C", hex($l))/eg; $value -~ s/~!/ ~!/g; $FORM{$name} * $value; } print "Content-type: text/htmlXnW; open (MAIL, " | /usr/sbin/sendmail -oi -t"); print MAIL "From: $FORM{•name'} <$FORM{'email»}>\n"; print MAIL "To: you\@your.hostname.com\n"; print MAIL "Subject: Вывод формы\п\п"; print MAIL "$FORM{'name'}, из $ENV{»REMOTE_HOST'} ($ENV{'REMOTE_ADDR*}), ^отправил вам следующий комментарий: \n\n"; print MAIL "$FORM{'comment1}\n"; close (MAIL); print qqA<HTML>\n<HEAD>\n<TITLE>Cnacn6o!</TITLE></HEAD>\nA; print ддл<ВООУ><НЗ>Спасибо!</НЗ>\пБлагодарим за ваши комментарии!</H3>\n ^></BODY>\n</HTML>A; Если вы захотите подстроить этот сценарий под свои собственные нужды, замените заголовок-заглушку То: собственным адресом электронной почты, не забыв поставить обратный слэш перед символом @. Этот пример сценария делает не так MHorcf полезного сам по себе, но после некоторых экспериментов вы поймете, что базовые принципы, которые мы описали здесь, формируют сердце программ стороны сервера, которые вы легко сможете создавать самостоятельно — от маленьких форм обратной связи до крупных онлайновых баз данных и систем электронной коммерции.
Работа в сети FreeBSD Непосредственный доступ к CGI-программам Программа CGI не обязательно должна вызываться из HTML-формы или с помощью метода POST. Вы можете использовать непосредственный URL для вызова CGI-сценария, которому не нужно получать никаких переменных, отправленных ему непосредственно в ассоциативный массив %FORM. Подобный URL мог бы выглядеть так: http://www.example.com/cgi-bin/sysinfo?frank+3 Этот URL вызывает программу sysinfo из каталога /cgi-bin/. Все, что следует за знаком вопроса, считается строкой запроса, и ее содержимое доступно сценарию как элементы массива @ARGV. Аргументы разделены символом плюс (+). Программа sysinfo должна получить строку frank как $ARGV[0] и число 3 как $ARGV[l]. СОВЕТ Вы можете также получить доступ к полной строке запроса через переменную окружения QUERY_STRING, ИЛИ $ENV{ ' QUERY_STRING' } НЭ Perl.
ГЛАВА 27 Конфигурирование FTP-сервера В этой главе... • Введение в протокол передачи файлов • Раскладки файлов аутентифицированного и анонимного FTP • Конфигурирование FTP-сервера • Контроль FTP-доступа • Разрешение анонимного FTP-доступа • Виртуальный хостинг • Использование альтернативных FTP-серверов
Работа в сети FreeBSD Один из наиболее древних методов передачи файлов из одной точки Internet в другую — протокол передачи файлов FTP (File Transfer Protocol) — в наши дни оказался в тени более эффектного и многостороннего протокола HTTP. Однако, хотя FTP — весьма ограниченный протокол, и ему недостает средств, которые в наши дни рассматриваются как критичные (вроде шифрования SSL), он в большей мере предназначен для пересылки более крупных файлов, чем HTTP, и потому может выполнять ряд задач, которые не под силу HTTP, включая легкую загрузку наряду с выгрузкой, обеспечивая при этом более высокую скорость и эффективность. Хотя область применения FTP постепенно сужается, он всегда будет занимать свое место в Internet — до тех пор, пока будут нужны такие службы, как аутентифици- рованная выгрузка и двунаправленная передача. FreeBSD поставляется со встроенным FTP-сервером, но при желании вы можете заменить его другим. Встроенный FTP-сервер достаточно функционально полон и свободен от известных ошибок; он позволяет передавать файлы на вашу машину FreeBSD и с нее без какой-либо дополнительной настройки. В этой главе мы поговорим о некоторых подробностях протокола передачи файлов и его работы. Конфигурация по умолчанию FTP-сервера является довольно-таки базовой, но информация, которую вы почерпнете из настоящей главы, поможет вам воспользоваться преимуществами дополнительных возможностей. НА ЗАМЕТКУ FTP — чисто текстовый протокол, в том смысле, что пакеты информации, которые он передает, могут быть перехвачены, и из них могут быть извлечены важные данные вроде паролей. Безопасный FTP, или sf tp, все более распространяется в наши дни, и его поддерживает все большее число клиентских программ. Вы узнаете больше о защите FTP (путем замены сервера по умолчанию на сервер, предусматривающий шифрование трафика) в конце этой главы и в главе 30. Введение в протокол передачи файлов Для непосвященных FTP и HTTP могут показаться довольно похожими. Оба обеспечивают передачу файлов, оба поддерживают форму пользовательской аутентификации и оба часто используются в Web взаимозаменяемо. Бинарные пакеты или крупные мультимедийные файлы могут привязываться к Web-сайтам либо по протоколу http: //, либо ftp: //, которые, как кажется, делают одно и то же в отношении загрузки файлов на ваш компьютер. Однако если присмотреться внимательнее, можно увидеть, что эти протоколы предназначены для разных целей и потому поддерживают разные наборы средств. В табл. 27.1 демонстрируется существенная разница между двумя протоколами. Главное отличие между FTP и HTTP в том, что FTP — протокол, основанный на сеансе, в том смысле, что полное соединение устанавливается между клиентом и сервером, множество команд передаются туда и обратно и в конце клиент прерывает соединение по своему выбору (HTTP, как вы помните — протокол, не поддерживающий состояние, и единственный запрос, за которым следует конвейеризованный ответ, составляет весь "сеанс" HTTP). FTP фактическим даже выходит за пределы единственного соединения. Полный сеанс FTP состоит из двух соединений: одно для передачи команд и сообщений о состоянии в обоих направлениях (соединение управления), а другое — для обработки собственно передачи файлов (соединение данных). На рис. 27.1 показана диаграмма полного FTP-соединения.
Конфигурирование FTP-сервера Глава 27 Таблица 27.1. Сравнение функциональности FTP и HTTP Средство FTP HTTP 817 Требует аутентификации пользователя. Да Преимущественно предназначен для передачи. Модель соединения. Ориентировано на загрузку/выгрузку. Поддерживает режимы ASCII и бинарной передачи. Поддерживает типизацию содержимого (заголовки MIME). Поддерживает операции файловой системы (mkdir, rm, rename И тому подобные). Да Крупных бинарных файлов Малых текстовых файлов Двойное соединение То и другое Да Нет Да Единичное соединение Загрузка Нет Да Нет (Internet) Пользователь \ Файловая <—> система Клиент FTP Порт 21 Управление < - - - > Данные Сервер FTP <—> Файловая система Рис. 27,1. Сеанс FTP с установленными соединениями управления и данных Клиент FTP, такой как команда ftp, встроенная в FreeBSD, открывает управляющее соединение с портом TCP под номером 21 на сервере FTP. Это соединение остается открытым на протяжении всего сеанса. Когда пользователь вводит команду, подобную Is или get picture.gif, клиент и сервер согласовывают пары ТСР-портов, между которыми они устанавливают соединение данных, которое существует до тех пор, пока ответный листинг или файл не будет передан, после чего соединение закрывается. Для каждой такой передачи открывается отдельное соединение данных. Полный типичный сеанс FTP показан в листинге 27.1. Листинг 27.1. Сеанс командной строки FTP # ftp 8pot8.exanqple.com Connected to spots.example.com. Соединение с spots.example.com. 220 spots.example.com FTP server (Version 6.00LS) ready. 220 spots.example.com FTP-сервер (версия 6.00LS) готов. Name (spots.example.com:frank): Имя (spots.example.com:frank): 331 Password required for frank. 331 Для frank требуется пароль. Password: Пароль:
818 Работа в сети FreeBSD Часть V 230 User frank logged in. 230 Пользователь frank вошел в систему. Remote system type is UNIX. Тип удаленной системы - UNIX, Using binary mode to transfer files. Используется бинарный режим для передачи файлов. f tp> cd mydir 250 CWD command successful. 250 Команда CWD выполнена успешно. ftp> Is 150 Opening ASCII mode data connection for '/bin/Is1. 150 Открытие режима ASCII передачи данных для ' /bin/Is r. total 484 -rw-r—r— -rw-r—r— -rw-r—r— -rw-r—r— -rw-r—r— -rw-r—r— -rw-r—r— 1 frank 1 frank 1 frank 1 frank 1 frank 1 frank 1 frank 43175 100523 37864 37308 52427 18648 175325 8 01:14 addresses.txt 8 01:14 contents.html 8 01:14 directions 8 01:14 lk_logo.gif Apr 8 01:12 picturel.gif Apr 24 13:04 picture2.jpg Apr 8 01:14 resume.html Apr Apr Apr Apr frank frank frank frank frank frank frank 226 Transfer complete. 226 Передача завершена. f tp> get picturel. gif local: picturel.gif remote: picturel.gif локальный: picturel.gif удаленный: picturel.gif 150 Opening BINARY mode data connection for 'picturel.gif (52427 bytes) . 150 Открытие бинарного режима передачи данных для * picturel .gif' (52427 байт). 100% |************************••****•**•*****•**••••••**j 52427 00:00 ETA 226 Transfer complete. 226 Передача завершена. 52427 bytes received in 4.99 seconds (10.25 KB/s) 52427 байт получено за 4.99 секунды (10.25 Кбайт/с) ftp> quit 221 Goodbye. 221 До свидания. Первую часть соединения составляет стадия аутентификации имени и пароля пользователя — так же, как это обычно происходит в соединениях Telnet и SSH. Подобно Telnet, аутентификация пользователя FTP обычно имеет дело непосредственно с информацией пользовательской учетной записи на машине, где запущен FTP-сервер. Этот процесс аутентификации отличается от аутентификации пользователя в HTTP, которая на самом деле является функцией Apache, а не самого HTTP, и требует наличия поддержки у Apache собственной базы данных пользователей. Для того чтобы зарегистрироваться через FTP, пользователь должен либо иметь корректную пользовательскую учетную запись на машине сервера, либо входить, используя "анонимный FTP", если это позволяет сервер (распространенная практика, которая рассматривается позже в этой главе). В FTP доступно множество пользовательских команд, и эти команды ведут себя в основном так же, как знакомые вам аналоги из командной оболочки системы: Is, cd, rnkdir, pwd и тому подобные. Эти команды помогают вам выполнять навигацию по структуре каталогов и модифицировать удаленные файлы, как если бы они находились на локальной (клиентской) машине. Есть еще команда led, позволяющая
Конфигурирование FTP-сервера Глава 27 вам менять текущий каталог на локальной машине — на случай, если хотите загрузить файл в другое место, отличное от того, где вы находились сразу после запуска программы FTP. Вдобавок есть еще команды put (загрузить), get (выгрузить), mput (множественная загрузка), mget (множественная выгрузка), управляющие собственно передачей файлов. Эти пользовательские команды транслируются в клиентские команды (такие как RETR, STOR, CWD и LIST), которые понимает FTP-сервер. Сервер отвечает трехзначными числовыми кодами, почти как в HTTP. Значения кодов ответа знать не обязательно, поэтому мы не будем их описывать здесь. Если интересно — читайте в man f tpd полный список клиентских команд FTP (это руководство по серверу описывает клиентские команды, которые понимает сервер). НА ЗАМЕТКУ Передача файлов по FTP может выполняться в одном из двух режимов — ASCII или Binary (бинарный). Режим ASCII используется для передачи простого текста, когда данные передаются как . алфавитно-цифровые символы и символы конца строки транслируются FTP-приложением в соответствии с принятым стандартом на платформе клиента — CR/LF для DOS/Windows, CR — для классической Mac OS и LF — для UNIX. Бинарный режим удобен для передачи нетранслируемых данных. Некоторые FTP-клиенты, в том числе встроенный в FreeBSD, автоматически определяет тип передаваемого файла и соответственно переключает режим перед выполнением передачи. Другие клиенты требуют явного выбора режима ASCII или Binary перед передачей файлов. Для переключения режимов используйте команды bin и asc. Обычно безопаснее всегда использовать бинарный режим; однако, если возникнут проблемы с текстовыми файлами, такими как файлы HTML и сценарии Perl, которые перестанут правильно отображаться в браузере, попробуйте режим ASCII. Бинарный режим, однако, обязателен для графических изображений, исполняемых программ и прочих разновидностей бинарных файлов. Если такие файлы передавать в режиме ASCII, на машине назначения они окажутся поврежденными. FTP-сервер по умолчанию, который поставляется с FreeBSD, и который вы изучите в этой главе — это стандартный BSD-демон f tpd. Он запускается супер-сервером inetd — так же, как telnetdn Qpopper, а не как автономный демон. Ему недостает определенных средств, поддерживаемых некоторыми его альтернативами (подобными WU-FTPD и ProFTPD), но в нем также нет множества брешей в безопасности, которые встречаются в сложном программном обеспечении. Вы узнаете больше об этих альтернативных демонах в конце настоящей главы, а в следующих разделах мы расскажем о том, как настроить самый базовый FTP-сервер под FreeBSD. Раскладки файлов аутентифицированного и анонимного FTP Если только вы не разрешаете анонимную регистрацию FTP, раскладка файлов FTP очень проста. Раскладка файлов FTP-сервера интегрирована в систему таким же образом, как у большинства служб ядра. Существует несколько конфигурационных файлов в /etc, некоторые из которых выполняют двойную функцию как общесистемные рес)рсы, используемые и другими службами. Домашние каталоги индивидуальных пользователей рассматриваются как часть раскладки FTP-сервера, поскольку каждый аутентифицированный пользователь подключается непосредственно к своему домашнему каталогу. 819
Работа в сети FreeBSD Если вы разрешаете анонимный FTP, то должна быть корневая область сервера, как у Apache; она создается в то время, когда вы решаете разрешить анонимный FTP, что будет продемонстрировано в одном из следующих разделов настоящей главы — "Разрешение анонимного FTP-доступа". Местоположение корня FTP-сервера по умолчанию устанавливается в /var/ftp, ив нем создается несколько каталогов, помогающих серверу управлять пользователями FTP, которые не имеют собственных пользовательских учетных записей в системе. Когда пользователь, имеющий учетную запись на сервере, входит через FTP, указывая имя пользователя и пароль, сервер обеспечивает доступ к его домашнему каталогу и всем его файлам. Пользователь может ввести команду Is для проверки того, что это именно та область, к которой он имеет доступ, проверив находящиеся там файлы. Каждый рядовой пользователь попадает через эти соединения в разные точки FTP-сервера, когда регистрируется, как пользователь — а именно в свой домашний каталог. Анонимный FTP предоставляет возможность подключения пользователю, не имеющему учетной записи. Анонимный пользователь открывает соединение, вводит anonymous или ftp в качестве своего имени и любую текстовую строку (обычно свой адрес электронной почты, хотя это и не обязательно при аутентификации такого рода) в качестве пароля. Затем пользователь получает доступ к "публичной" области FTP: /var/ftp — домашнему каталогу пользователя ftp (который создается при разрешенном анонимном FTP-доступе). Между пользователями с обычной учетной записью и анонимными пользователями FTP существуют фундаментальные отличия. Анонимный FTP по умолчанию выполняется в enroot jail (что-то вроде "песочницы" или "тюрьмы"), а это означает, что для такого пользователя /var/ftp выглядит как корень сервера (/). Ничего вне /var/ftp ему не доступно и не видимо. Пользователь с обычной учетной записью может ввести команду вроде cd /usr/local, чтобы попасть в любую точку системы и получить доступ ко всем файлам с теми же правами на чтение, что и в терминала ном сеансе, но анонимный пользователь 1<ТР не может вообще выйти за пределы /var/ftp. Если он введет команду cd /pub, то окажется в /var/ftp/pub. Вы можете специфицировать дополнительных пользователей, которые также должны видеть в системе измененный корневой каталог, как и анонимные пользователи FTP, добавив их в файл /etc/ftpchroot. Это лишь один пример конфигурационного файла, управляющего FTP-сервером. ВНИМАНИЕ! Аутентифицированные пользователи имеют доступ по FTP к вашей машине FreeBSD no умолчанию, но анонимный вход нужно включать специально, если он вам понадобится. Разрешение анонимного FTP, no сути, открывает вашу систему для неавторизованного, нетрассируемого доступа. Поэтому разрешать анонимный FTP-доступ следует лишь тогда, когда на то имеются веские причины! Конфигурирование FTP-сервера Служба FTP включает довольно много конфигурационных файлов; некоторые из них расположены в /etc, другие — в /var/ftp/etc. Причина этого состоит в том, что некоторые из этих файлов должны быть доступными анонимным пользователям FTP, а такие пользователи, как вы видели, не могут видеть ничего за пределами
Конфигурирование FTP-сервера Глава 27 821 /vat/ftp. Несколько файлов находятся в /etc, которые имеют глобальное отношение ко всему FTP-серверу в целом (не все они присутствуют в инсталляции по умолчанию — некоторые нужно создавать вручную). • /etc/ftpusers. "Черный список" пользователей, которым запрещен доступ по FTP. Добавляйте имена пользователей в этот файл для предотвращения их регистрации через FTP. • /etc/ftpchroot. Любой пользователь, упомянутый в этом файле, получает альтернативный корневой каталог (chroot jail), подобно анонимным пользователям FTP, и имеет доступ только к своему домашнему каталогу. Будет неплохой идеей поместить всех пользователей системы в этот файл, если только нет причины, по которой пользователю нужен доступ ко всей файловой системе; вы можете даже модифицировать сценарий adduser для добавления новых пользователей в этот файл. • /etc/ftphosts. Позволяет конфигурировать виртуальные хосты — почти так же, как для Apache (см. главу 26). Ниже в главе виртуальный хостинг рассматривается более подробно. • /etc/f tpwellcome. Текст приветствия. Содержимое этого файла выдается каждому, кто подключается, сразу после того, как установлено соединение, но перед приглашением регистрации. • /etc/f tpmotd. Второе сообщение приветствия (так называемое "сообщение дня"); появляется после того, как рядовой зарегистрированный пользователь входит в систему. Вы можете регулярно обновлять этот файл, чтобы представлять новости системы и изменения в политике. • /etc/shells. С этим файлом вы сталкивались в главе 9. Его назначение — гарантировать, что любой, кто войдет в систему, получит правильную оболочку, а это предотвращает вход таких пользователей, как bin, t^ty и nobody, для которых в этом файле оболочки не перечислены. Помимо конфигурационных файлов в /etc, есть еще множество дополнительных файлов, управляющих анонимным FTP. И это не только конфигурационные файлы. Если /var/ftp отображается на / для анонимных пользователей, это значит, что инструменты в системных каталогах с бинарными программами (вроде /bin) для них не доступны, равно как и файлы в каталоге /etc. FTP-сервер полагается на несколько системных инструментов, в частности, /bin/Is и /bin/date, для генерации листингов файлов с целью отправки клиентам. Эти инструменты также должны быть доступны анонимным пользователям. Именно для этого существует каталог /var/ftp/bin. Дерево /var/ftp содержит следующие файлы и каталоги. Любой анонимный пользователь может видеть эти файлы, но ни один из них видеть им не опасно (например, /vat/ftp/etc не содержит файла с паролями). • /var/ftp/bin. Этот каталог содержит исполняемые программы Is и date. Они представлены здесь потому, что необходимы для того, чтобы FTP-сервер мог генерировать листинги каталогов, а системные программы /bin/Is и /bin/ date не доступны, если вы сконфигурировали сервер с chroot или открыли FTP-доступ анонимным пользователям к каталогу /var/ftp. (Это поведение по умолчанию.)
822 Работа в сети FreeBSD Часть V • /var/ftp/etc/passwd и /var/ftp/etc/group. Как и инструменты в /var/ ftp /bin, это копии файлов по умолчанию (скелетных) /etc/passwdn /etc/ group, чье назначение — обеспечивать отображения файлов владения при выводе листингов каталогов. Поскольку анонимный FTP-доступ ограничен тем, что имеется в /var/ftp, эти файлы должны существовать для того, чтобы показывать, кто владеет различными файлами в /var/ ftp. Обычно любые файлы в открытой области FTP принадлежат root или другим системным учетным записям, поскольку они помещаются туда вами как администратором. Другие имена пользователей, поскольку они отсутствуют в /var/ftp/etc/passwd, не будут отображаться и покажутся пользователям FTP с числовыми UID вместо имен владельцев. • /var/ftp/etc/ftpmotd. Служит той же цели, что /etc/ftpmotd, за исключением того, что отображается у анонимных пользователей FTP вместо обычных зарегистрированных пользователей. С их точки зрения (с учетом команды chroot, которая превращает /var/ftp в /), этот файл является /etc/ftpmotd. • /var/ ftp /pub. Видимый анонимным пользователям как /pub, представляет собой каталог для всех выгружаемых файлов. Иерархия внутри /pub остается на ваше усмотрение, но принято, чтобы, по крайней мере, в /pub содержалось то, что интересно всем. • /var/ftp/incoming. Этот необязательный каталог имеет права полного доступа с установленным "sticky-битом" (1777). Это значит, что любой анонимный пользователь сможет загружать файлы в этот каталог. Это может оказаться опасным; иметь открытый каталог для загрузки — значит, приглашать людей использовать его для хранения, скажем, музыкальных файлов МРЗ и нелицензионного программного обеспечения. Используйте эту опцию только в случае реальной нужды, и только тогда, когда можете доверять людям в том, что они не станут злоупотреблять загрузкой (например, в тестовой среде). В противном случае в интересах безопасности лучше вообще удалить этот каталог. И последний конфигурационный файл, имеющий отношение к серверу FTP — это /etc/inetd. conf. Как уже упоминалось ранее, f tpd запускается по инициативе супер-сервера inetd, и как таковой, не работает, если inetd не функционирует. Во-первых, используйте ps для проверки того, обслуживает ли демон запросы, применив опции -w (расширенный формат), -а (все пользовательские процессы), -и (показать поля, касающиеся пользователей) и -х (процессы, которые не обязательно прикреплены к терминалам): • ps -waux | grep inetd root 1640 0.0 0.6 1048 780 ?? Ss Thu08PM 0:00.15 inetd -Ww Если вы не видите работающего процесса inetd, это значит, что он не включен в /etc/rc.conf во время начальной установки системы (описанной в главе 2), или же вы отключили его. Поищите в этом файле строку inetd_enable и убедитесь, что он^ присутствует и установлена в YES. Во-вторых, откройте /etc/inetd.conf и убедитесь, что служба f tpd включена: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -1 Если эта строка закомментирована, уберите комментарий, после чего запустите или перезапустите inetd (используя команду /etc/rc.d/inetd restart). Проверьте
Конфигурирование FTP-сервера Глава 27 823 полученную конфигурацию, попытавшись подключиться к серверу (ftp localhost). Если вы увидите приглашение к регистрации, значит все в порядке. Если же нет, проверьте все описанные шаги еще раз, и проверьте, запустился ли процесс inetd после ваших модификаций. Контроль FTP-доступа FTP-доступ не является чем-то таким, что вы должны с легкостью разрешать. Хотя это важно для ваших пользователей — иметь доступ к FTP для загрузки на сервер своих файлов (например, Web-страницы), это также является потенциальным источником проблем, связанных с безопасностью. Это чисто текстовый механизм, а, следовательно, все данные (включая пароли) передаются по сети в открытом, нешифрованном виде, и доступны для подглядывания любому, у кого есть соответствующее программное обеспечение. Как вы узнаете из главы 30, большинство основных чисто текстовых служб могут быть заменены безопасными эквивалентами: Telnet — на SSH, HTTP — на Secure HTTP, a POP3 и ШАР можно дополнить их собственными встроенными уровнями шифрования. Однако, по сути, FTP — небезопасный протокол, и хотя некоторые безопасные решения уже начали появляться (вроде команды sftp, встроенной в пакет OpenSSH), нешифрованный FTP остается последним широко распространенным незащищенным протоколом передачи данных, который трудно заменить и наличие которого фактически является требованием к полнофункциональному серверу. Многие современные клиентские приложения FTP могут поддерживать защищенный FTP, но он все еще не встроен в базовые механизмы FTP систем Windows и Mac OS X, поэтому традиционный нешифрованный FTP все еще является широко востребованной службой для большинства пользователей. В главе 30 и в конце этой главы вы узнаете больше о том, как можно защитить FTP, а между тем, имейте в виду, что открывая FTP-доступ вашим пользователям, потребуется предпринять особые меры предосторожности, дабы гарантировать безопасность системы в целом. Имея все это в виду, вам понадобится способ блокирования доступа по FTP некоторым пользователям. Это можно сделать по-разному. Два наиболее привычных способа предполагают использование файлов /etc/ftpusers и /etc/shells. Третий, /var/run/nologon, управляет разрешением соединений к серверу вообще. Файл /etc/ftpusers Простейший способ запретить определенному индивидуальному пользователю (или группе пользователей) подключаться к FTP-серверу — это добавить регистрационное имя пользователя в файл /etc/ftpusers, который существует в инсталляции FreeBSD по умолчанию и содержит имена различных системных псевдо-пользовате- лей (таких как bin, tty и так далее). Эти пользователи имеют пустые пароли, a f tpd не позволяет подключаться никому с пустым паролем. Но сохранение этих имен в /etc/ftpusers, отклоняющее их доступ явно, по именам, обеспечивает дополнительный уровень безопасности. Вы можете добавить любое имя пользователя в этот файл, и поскольку f tpd читает все конфигурационные файлы при каждом новом соединении, нет необходимости в перезапуске какого-либо процесса. Попробуйте подключиться к FTP-серверу как пользователь, которому запрещен вход, и вы получите реакцию вроде следующей:
Работа в сети FreeBSD # ftp localhost Connected to localhost.example.com. Соединение с localhost.example.com. 220 stripes.example.com FTP server (Version 6.00LS) ready. 220 stripes.example.com FTP-сервер (версия 6.00LS) готов. Name (localhost:frank): Имя (localhost:frank): 530 User frank access denied. 530 Пользователь frank: доступ запрещен. ftp: Login failed. ftp: Сбой в регистрации. ftp> НА ЗАМЕТКУ Сообщение о запрете доступа появляется немедленно после того, как сервер получает имя пользователя — он даже не приглашает ввести пароль. Это предотвращает излишнюю пересылку пароля по сети, обеспечивая дополнительную меру безопасности на случай, когда вы исключаете пользователя за попытки воровства паролей. Вы можете также включить в файл /etc/ftpusers любое имя группы, добавив к нему символ @ (например, @users). Любому пользователю — члену любой из перечисленных в файле групп в доступе будет отказано. Файл /etc/shells После проверки наличия пользователя в файле /etc/ftpusers, ftpd проверяет командную оболочку, ассоциированную с данным пользователем в файле /etc/ shells. Если она не указана, пользователь получает определенного рода сообщение о запрете доступа, как и в случае его наличия в /etc/ftpusers. Вы можете воспользоваться этой функциональностью для предотвращения регистрации пользователя в терминальной программе или клиенте FTP, изменив программу оболочки для пользователя на /sbin/nologin (которую вы видели в главе 9 и которая просто выводит сообщение "account not available" ("учетная запись не доступна") и завершается; она не указана в /etc/shells) или на что-либо сконструированное аналогичным образом. Файл /var/run/nologin Чтобы полностью отключить возможность входа через FTP, не модифицируя при этом /etc/inetd.conf или любые другие конфигурационные файлы подобного рода, вы можете просто поместить файл по имени nologin в каталог /var/run. Если f tpd видит этот файл, то отвечает на все соединения так: # ftp localhost Connected to localhost.example.com. Соединение с localhost.example.com. 530 System not available. 530 Система не доступна. ftp> Для создания этого файла (с нулевой длиной) вы можете ввести команду touch /var/run/nologin и запретить все регистрации по FTP. Удалив этот файл (rm /var/ run/nologin), вы восстановите возможность подключений к FTP-серверу.
Конфигурирование FTP-сервера 1 „с I Глава 27 I I Разрешение анонимного FTP-доступа По умолчанию анонимный доступ FTP не разрешен. Простейший способ включить его, если вы решите это сделать — это воспользоваться Sysinstall. Внутри программы Sysinstall (/usr/sbin/sys ins tall) войдите в разделы Configure (Конфигурация) и Networking (Работа в сети). Прокрутите экран до опции Anon FTP (Анонимный FTP) и нажмите пробел, чтобы открыть экран Anonymous FTP Configuration (Конфигурация анонимного FTP), показанный на рис. 27.2. Рис. 27.2. Опции конфигурации анонимного FTP Опции по умолчанию обычно соответствуют типичной системе FreeBSD. Поля UID (Идентификатор пользователя), Group (Группа) и Comment (Комментарий) управляют способом создания нового пользователя ftp. Домашний каталог этого пользователя устанавливается в /var/f tp, и через него происходит анонимный вход в FTP — регистрация ftp трактуется как рядовой пользователь, который ведет себя так, как если бы он был указан в /etc/f tpchroot. Поэтому любому, кто регистрируется как ftp (или под псевдонимом anonymous), корневой каталог устанавливается в/var/ftp. Вы можете настроить любое из этих полей под особенности вашей системы (например, если у вас уже есть пользователь с UID 14, или если вы хотите назвать каталог для выгрузки иначе, чем incoming). После выбора ОК в нижней части экрана пользователь ftp будет создан вместе с деревом каталогов в /var/ftp, включающим все необходимые подкаталоги. Обратите внимание, что Sysinstall не обеспечивает возможности отключения анонимного FTP после его включения, но вы можете сделать это несколькими другими способами. Ниже перечислены методы в порядке убывания предпочтительности. • Добавить пользователя ftp в /etc/ftpusers (вероятно, простейший и самый "чистый'* метод). Это предотвратит подключения пользователя ftp, анонимного пользователя-гостя, через собственный механизм FTP. • Изменить права доступа к дереву /var/ftp так, чтобы его содержимое не могло быть прочитано рядовыми пользователями. Команда chmod 0700 /var/ftp поможет в этом. • Удалить дерево /var/ftp. • Удалить пользователя ftp.
826 Работа в сети FreeBSD Часть V Аналогичным образом вы можете отключить каталог выгрузки (incoming) — просто удалив его или же изменив права доступа к нему на 755 (права доступа к каталогам по умолчанию, при которых только владелец — root — может писать в них). Восстановить его (или любой другой каталог, в который вы хотите разрешить загружать файлы анонимным пользователям) можно, изменив права доступа на 1777 — например, chmod 1777 /var/ftp/incoming. Виртуальный хостинг Если к вашей машине привязано несколько IP-адресов, вы можете отобразить разные поведения FTP-сервера на каждый из них. Этот механизм виртуального хостинга управляется файлом /etc/ftphosts, который отсутствует в системе FreeBSD по умолчанию (вы должны создать его самостоятельно). Каждый виртуальный хост определяется в отдельной строке, поля которой специфицируют альтернативные конфигурационные файлы, разделенные пробелами. В табл. 27.2 описаны различные поля, их назначение и значения по умолчанию (те, которые используются при отсутствии файла /etc/ftphosts). Таблица 27.2. Поля таблицы виртуального хостинга в /etc/ftphosts Поле Описание По умолчанию Hostname User Statfile Welcome MOTD Имя или IP-адрес виртуального хоста. Следует отметить, что FTP не имеет эквивалента заголовка Host: из НТТР/1.1, поэтому виртуальные хосты FTP определяются IP-адресом вашей машины, к которому подключается клиент, поэтому каждый виртуальный хост должен иметь свой собственный уникальный IP-адрес или псевдоним. Если указать в этом поле имя хоста, то f tpd использует IP-адрес, в который оно разрешается. Имейте это в виду, добавляя виртуальные хосты. Пользователь, чей домашний каталог служит для анонимного FTP-доступа к данному виртуальному хосту. Для анонимных пользователей этот каталог подменяет корневой, поэтому должны присутствовать эквиваленты /var/ftp/ etc и /var/ftp/bin. ftp /var/log/ftpd Файл протокола, фиксирующий все передачи по FTP для виртуального хоста. Приветствие, отображаемое при начальном подключении /etc/f tpwelcome к FTP-серверу. Второе приветствие, отображаемое после успешной реги- /etc/f tpmotd страции. Ниже показано несколько простых виртуальных хостов в /etc/ftphosts. Если поле остается пустым, или содержит -, используется значение по умолчанию: 64.41.131.106 frank /var/log/ftpd-frank /home/frank/hi /home/frank/ni2 ftp2.me.com ftp2 - /etc/ftpd2welcome 64.41.131.107 ftp3 /var/log/ftpd-3
Конфигурирование FTP-сервера I TTZ I Глава 27 I I Использование альтернативных FTP-серверов Существует множество альтернативных пакетов FTP. Из них тремя наиболее популярными являются: WU-FTPD, разработанный в Вашингтонском университете; вы- сокозащищенный vsftpd и в высшей степени конфигурируемый ProFTPD. Все эти пакеты предлагают возможности, которые не доступны в FTP-сервере по умолчанию, включая чрезвычайно высокую степень конфигурируемости и дополнительные меры безопасности. WU-FTPD Изначально разработанный в Вашингтонском университете для обслуживания WUarchive (одного из наиболее популярных разделяемых файловых ресурсов и распределенных местоположений в Internet), WU-FTPD завоевал популярность как наиболее часто используемый FTP-сервер в мире, даже несмотря на то, что его разработка в последние годы приостановилась, и то, что он имеет серьезные проблемы с безопасностью. Он был демоном FTP по умолчанию в Linux и во многих знаменитых коммерческих системах UNIX в течение многих лет, пока не был заменен vs f tpd. Конфигурация WU-FTPD отличается от умолчаний f tpd в системе FreeBSD в нескольких тонких моментах, и обладает несколькими средствами, которых нет у f tpd по умолчанию — инструментом проверки конфигурации, сжатием и архивированием "на лету", а также ограничениями доступа и передачи по времени и дате. Вы можете инсталлировать WU-FTPD для поддержки совместимости с существующими системами, отличными от FreeBSD. WU-FTPD доступен в коллекции пакетов или портов (/usr/ports/ftp/wu-ftpd). После его инсталляции можно переключиться на его использование в FreeBSD, закомментировав строку ftp в /etc/inetd.conf и заменив ее новой: ftp stream tcp no wait root /usr/local/libexec/f tpd ftpd -1 #ftp stream tcp nowait root /usr/libexec/ftpd ftpd -1 СОВЕТ WU-FTPD инсталлируется как /usr/local/libexec/f tpd, и его man-страница не доступна напрямую по команде man ftpd — вы получите страницу о системном ftpd по умолчанию. Чтобы увидеть правильную страницу, используйте опцию ~м, чтобы указать альтернативный путь man, примерно так: man -M /usr/local/man ftpd Подробнее о WU-FTPD читайте на сайте http: //www. wu-f tpd. org. vsftpd Сервер, позиционируемый, как "очень безопасный" (Very Secure — отсюда и наименование), vsftpd — это FTP-сервер, выбранный для большинства современных дистрибутивов Linux. Он аттестован институтом SANS как наиболее безопасное доступное решение FTP, и используется на большинстве основных сайтов FTP-дистри- буции Linux, а также на FTP-сайте самой FreeBSD — ftp. freebsd.org.
Работа в сети FreeBSD Поскольку vsftpd очень компактен и самодостаточен, он использует единственный конфигурационный файл — /usr/local/etc/vsftpd.conf, и только один или два файла списков внешних пользователей, которые вы специфицируете в главном конфигурационном файле. Однако это не значит, что у него недостаточно средств; на самом деле он содержит множество расширенных средств, которые предоставляют только очень дорогие сервера вроде ProFTPD, а именно: виртуальные хосты, вир туальные пользователи, ограничение пропускной способности, ограничения передачи и так далее. Запускается он как автономный демон, а не через inetd. Дополнительную информацию по vsftpd можно найти по адресу http: //vsftpd. beasts.org. ProFTPD ProFTPD был разработан с намерением создать FTP-сервер, которым можно было бы управлять через конфигурационные файлы, похожие на файлы Web-сервера Apache. Конфигурационный файл ProFTPD имеет иерархические блоки конфигурации, подобные тем, что присутствуют в httpd. conf (как было показано в главе 26) и директивы, по стилю подобные директивам Apache. В результате этот сервер имеет очень похожие на Apache средства ограничения доступа, наряду с высокой степенью конфигурируемости, особенно для администраторов, знакомых с Apache. Он доступен в виде пакета или порта (/usr/ports/ftp/proftpd). Одно отличие ProFTPD от его аналогов состоит в том, что он может запускаться в режиме автономного сервера подобно Apache, а не через inetd. Если вы запускаете его из inetd, замените строку ftp по умолчанию следующей: ftp stream tcp nowait root /usr/local/libexec/proftpd prof tpd #ftp stream tcp nowait root /usr/libexec/ftpd ftpd -1 Домашняя страница ProFTPD, http://www.proftpd.org, содержит намного больше информации о его возможностях (таких как поддержка безопасных протоколов FTP, которые мало кто еще может предоставить) и директивах конфигурации. Secure FTP (sf tp) Чисто текстовая природа FTP является его проблемой. Хотя многие пользователи (особенно те, что полагаются на встроенные утилиты своих настольных операционных систем) все еще применяют традиционный FTP без шифрования для передачи файлов, загрузки Web-страниц и тому подобного, а это значит, что важнейшая пользовательская информация (регистрационные имена и пароли) находятся под угрозой перехвата посторонними. Существует, однако, безопасная альтернатива FTP — sf tpd, являющаяся частью пакета OpenSSH, инсталлируемого по умолчанию как часть FreeBSD. Если вы разрешаете SSH-подключения во время первоначальной установки FreeBSD, то безопасные FTP-коммуникации доступны вам без каких-либо дополнительных усилий по конфигурированию с вашей стороны. Клиенты могут использовать команду sf tp (встроенную в FreeBSD, Linux, Mac OS X и так далее) из командной строки или ее графический эквивалент в любом из многих GUI-ориентированных клиентских приложений, чтобы открывать шифрованное соединение с вашим сервером. Это соединение вызывает программу /usr/libexec/ s ftp- server на серверной стороне, и с точки зрения сеанса sf tp функциональность будет такой же, как в обычном сеансе FTP.
ГЛАВА 28 Конфигурирование Internet-шлюза В этой главе... • Основы маршрутизаторов и преобразования сетевых адресов (NAT) • Конфигурирование шлюза NAT в FreeBSD • Включение NAT для систем без статических IP-адресов • Конфигурирование клиентов для использования нового шлюза • Конфигурирование точки беспроводного доступа в Internet • Маршрутизация между тремя и более сетями • Динамическая маршрутизация
830 Работа в сети FreeBSD Часть V Тема маршрутизации и шлюзов была кратко раскрыта в главе 22, наряду с концепцией NAT (Network Address Translations — Преобразование сетевых адресов). В главе 23 также немного говорилось о маршрутизации, но в основном в контексте конфигурирования хоста для использования маршрутизации. В этой главе объясняется, как сконфигурировать FreeBSD в качестве маршрутизатора или шлюза, а также то, как настраивать преобразование сетевых адресов для предоставления служб маршрутизации всей подсети. Начнем с краткого определения каждого элемента, о котором мы будем говорить. Основы маршрутизаторов и преобразования сетевых адресов (NAT) Как упоминалось в главе 22, маршрутизатор — это устройство, которое соединяет вместе две разных IP-сети и определяет то, как дейтаграммы попадают из одной сети в другую. НА ЗАМЕТКУ Дейтаграмма (datagram) — это пакет цифровой информации. Она содержит информацию адресации вместе с передаваемыми данными. Не все дейтаграммы обязательно проходят одинаковый маршрут к своему месту назначения, даже если имеют один и тот же источник. Чтобы лучше понять, что делает маршрутизатор, взгляните на следующие два рисунка. На рис. 28.1 показаны два примера сетей, принадлежащих фиктивной глобальной компании, имеющей офисы в Нью-Йорке и Дании. Нью-Йорк Дания 1 lion > tiger ' концентратор х cheetah ч puma wolf ^^ bear У концентратор! / lynx ч fox | Рис» 28Л Пример глобальной сети фиктивной компании с несколькими хостами в ее офисе в Нью-Йорке и несколькими хостами в офисе в Дании В сети на рис. 28.1 хосты с именами lion, cheetah, tiger и puma знают о суще ствовании друг друга и могут друг с другом взаимодействовать в офисе в Нью-Йорке К тому же хосты wolf, bear, fox и lynx знают о существовании друг друга и мопт друг с другом взаимодействовать в офисе в Дании. Проблема в том, что сети физи чески изолированы друг от друга, и каждая из них подключена только к своему ло кальному вышестоящему поставщику Internet-услуг. Ни один из хостов офиса в Нью- Йорке вообще ничего не знает ни об одном хосте офиса в Дании и наоборот. Нет никакого способа передачи сетевой информации между двумя офисами. Для того чтобы данные могли перемещаться между этими двумя офисами, вам нужно инстал лировать пару маршрутизаторов. На рис. 28.2 показана та же сеть, но на этот раз с маршрутизаторами, установленными в каждом офисе.
Конфигурирование Internet-шлюза Глава 28 831 Нью-Йорк | lion | tiger / концентратор У cheetah v puma simba falcon Дания wolf ^ bear У концентратор! X lynx "^ fox | Рис. 28.2. Та же сеть, что и на рис. 28.1, но с маршрутизаторами, установленными на каждом ее конце После инсталляции маршрутизатора с хостами сети потребуется сделать одно изменение: им нужно просто сообщить о существовании маршрутизатора в офисе. (Как это сделать — читайте в главе 22.) Хосты офиса в Нью-Йорке по-прежнему ничего не знают о хостах офиса в Дании, верно также и обратное. Так что же изменилось в этой установке? Хосты сети теперь знают о существовании маршрутизатора в их офисе. Если каждый хост сконфигурирован на использование этого маршрутизатора как маршрутизатора по умолчанию, он отправит ему весь исходящий трафик для неизвестного хоста. Затем маршрутизатор позаботится о направлении сетевого трафика в нужное место назначения. Например, предположим, что пользователь cheetah желает установить сетевое соединение с lynx. Поэтому, когда cheetah генерирует трафик к lynx, он просто посылает этот трафик simba, который является маршрутизатором офиса в Нью- Йорке. Маршрутизатор simba знает о существовании lynx, и также знает, что может передать трафик для lynx через маршрутизатор, находящийся в Дании (falcon). Последний затем отправляет этот трафик lynx. Это очень простой пример. В реальном сценарии (особенно при пересылке трансокеанского сетевого трафика) обычно участвуют несколько маршрутизаторов, каждый из которых передает трафик следующему, до тех пор, пока он не достигнет правильного места назначения. Если вам нужна аналогия, можете представить маршрутизаторы в виде воздушных диспетчеров, а сетевой трафик — в виде самолета. Самолет на пути из Нью-Йорка в Данию будет передаваться между несколькими различными диспетчерами воздушного движения, каждый из которых знает только своих ближайших соседей в последовательности, пока, наконец, этот самолет не достигнет места назначения. Хорошо. Но зачем вам нужен маршрутизатор? Почему бы просто не сообщить хостам в Нью-Йорке о хостах в Дании и наоборот, чтобы они могли взаимодействовать друг с другом непосредственно? Существуют две главных причины, почему не делается так. • Простота сопровождения. Это может показаться не сложным, когда в сети присутствуют всего восемь систем. Но представьте сеть размером с Internet. Без маршрутизаторов каждая отдельная система, подключенная к сети, должна знать, как подключиться к каждой другой системе в сети. Очевидно, когда речь идет о миллионах систем, это быстро превращается в настоящий кошмар. • Ограничение перегрузки трафика. Если два офиса просто соединены в одну большую сеть, то весь сетевой трафик должен быть отправлен всем компьютерам. Если, например, lion отправляет сетевой трафик хосту cheetah (оба находятся в офисе в Нью-Йорке), этот трафик также должен будет отправлен по каналу, через Атлантический океан, в офис в Дании. И это произойдет даже в том слу-
Работа в сети FreeBSD чае, если хосты в Дании никак не заинтересованы в этом трафике, поскольку он им не предназначен. Представьте себе нагрузку на сеть, если в любое время, когда любой хост в Internet отправляет трафик другому хосту, этот трафик также должен будет попасть к любому другому хосту в Internet. Помимо этого, аренда трансокеанских линий стоит дорого, а вы обычно оплачиваете объем используемой пропускной способности. Это значит, что вы не хотите использовать эту линию тогда, когда вам это не нужно. Маршрутизатор служит своего рода "дверью", которая сохраняет трафик, предназначенный одному из локальных хостов, внутри локальной сети. Только трафик, не предназначенный ни одному из локальных хостов, будет отправлен за пределы локальной сети. (Это также повышает безопасность — вы же не хотите, чтобы ваш внутренний сетевой трафик транслировался через Internet, где кто угодно может перехватить его.) Что такое шлюз? В общей сетевой терминологии гилюз (gateway) — это маршрутизатор, позволяющий остальным хостам внутренней локальной сети получать доступ за ее пределы. По этой причине термины маршрутизатор по умолчанию и шлюз в наши дни почти взаимозаменяемы в большинстве сетевых кругов. В нашем примере из предыдущего раздела маршрутизаторы simba и falcon можно назвать шлюзами. НА ЗАМЕТКУ Согласно техническому определению, шлюз — это маршрутизатор, который может передавать трафик между двумя разными типами сетей, например, между Ethernet LAN и WAN. Одно из наиболее распространенных применений шлюза — обеспечение множеству хостов возможности разделять единственное Internet-соединение — например, чтобы все компьютеры у вас дома смогли использовать одно подключение через кабельный модем. Что такое NAT? NAT, означающий Network Address Translation (Преобразование сетевых адресов) - это способ подключения множества хостов к Internet с использованием единственного IP-адреса. Чтобы этот механизм работал, весь трафик локальной сети должен проходить через маршрутизатор-шлюз, настроенный на выполнение NAT. Хосты внутренней сети могут иметь IP-адреса, которые не обязательно являются допустимыми за пределами локальной сети. Обычно это означает, что трафик извне не может их достичь, однако NAT делает этот трюк возможным. Когда внутренние хосты желают отправить или принять содержимое Internet, их запрос проходит через шлюз NAT. Шлюз "скрывает* внутренний IP-адрес и посылает все запросы от подключенных к нему хостов в Internet, как если бы они исходили с единственного IP-адреса (который является IP-адресом, принадлежащим маршрутизатору-шлюзу NAT). Ответы отправляются обратно по этому одиночному IP-адресу — адресу маршрутизатора-шлюза. Шлюз затем направляет данные правильному внутреннему хосту.
Конфигурирование Internet-шлюза Глава 28 833 У этого метода есть три главных преимущества. • Он экономит IP-адреса. Пул Internet допустимых IP-адресов — это ограниченный ресурс, который уменьшается с каждым днем, и нет причин тратить адреса, когда без этого можно обойтись. NAT исключает необходимость в регистрации IP-адреса для каждой из ваших систем или резервирования подсети IP из драгоценного адресного пространства вашего поставщика Internet-услуг^ Единственная машина, которая нуждается в открытом и зарегистрированном IP-адресе — это шлюз NAT. Все остальные могут иметь частные внутренние IP- адреса. НА ЗАМЕТКУ Благодаря намного более обширному адресному пространству, IPv6 не приходится беспокоиться об экономии адресов, поэтому NAT считается не нужным в Internet на базе IPv6. Однако соображения безопасности все равно не лишают NAT привлекательности. • Если вы — домашний пользователь или пользователь из небольшого офиса, это позволяет вам разделить единственное Internet-соединение между многими компьютерами, и вам не придется приобретать дополнительные пользовательские учетные записи у вашего поставщика Internet-услуг. Вы также можете разделять единственный модем и единственную телефонную линию» что избавит вас от необходимости подключения дополнительных телефонных линий, чтобы более одного компьютера могли работать в Internet в одно и то же время. • NAT защищает вас от огромного множества угроз безопасности, исходящих от злоумышленников, которые атакуют хорошо известные пространства IP-адресов, используемые кабельными модемами и DSL-клиентами. Внешние хосты не могут по своей инициативе контактировать ни с одним хостом внутри NAT. FreeBSD вообще не слишком уязвима для большинства внешних атак, но NAT — первая линия обороны, защищающая вас от внешних угроз (поскольку единственные коммуникации между вашими машинами и внешним миром — те, что инициированы вами). К недостаткам NAT, однако, следует отнести тот факт, что вы не можете получить доступ к Internet-серверу, расположенному за шлюзом NAT. Серверы должны быть общедоступными для клиентских хостов, чтобы к ним можно было обратиться в любое время; поскольку NAT требует, чтобы только вы инициировали соединение, но не принимали внешних, ни один внешний хост не сможет к вам подключиться по собственной инициативе. Если вам нужно запустить сервер, то в этом случае NAT — не подходящее решение. Однако если вы — пользователь с кабельным модемом, то вам, скорее всего, все равно не разрешено запускать серверы. NAT — идеальное решение для домашних и бизнес-сетей, где вся работа состоит в работе с настольного компьютера — просмотре Web-страниц, пользовании электронной почтой, чатом и тому подобным. Чтобы проиллюстрировать некоторые способы конфигурирования различных типов маршрутизирующих служб под FreeBSD, в этой главе мы рассмотрим несколько примеров сценариев. Начнем с раздельного использования единственного модема и Internet-соединения дома или в небольшом офисе.
834 Работа в сети FreeBSD Часть V Конфигурирование шлюза NAT в FreeBSD Маршрутизаторы-шлюзы NAT в наши дни широко доступны за очень небольшие деньги; одним из наиболее популярных типов устройств является беспроводная точка доступа — такое устройство, как AirPort Extreme Base Station от Apple, которое подключается к вашему кабельному модему или DSL-маршрутизатору и реализует NAT для всех устройств вашей домашней сети, подключены ли они по беспроводному или проводному Ethernet. Устройства подобного рода обычно продаются за $300 и меньше. Вы можете, однако сконструировать ваш собственный маршрутизатор-шлюз, используя для этого любой компьютер, который умеет выполнять маршрутизацию - например, вашу машину FreeBSD. В этом сценарии обычно у вас имеется единственное Internet-соединение, которое может быть кабельным модемом, DSL или даже обычным телефонным модемом. Предположим, что у вас есть несколько компьютеров внутри дома или офиса, которым необходим доступ в Internet. На рис. 28.3 показан пример использования внутреннего модема на машине FreeBSD. Internet Нью-Йорк lion tiger модем концентратор ZZZ н Z simba cheetah puma Рис. 283. Простая постройка шлюза. Маршрутизатор simba подключен к Internet через внутренний модем. Идея состоит в том, чтобы позволить lion, cheetah и lynx раздельно использовать этот модем и получать доступ в Internet через simba НА ЗАМЕТКУ Для сетей, имеющих доступ в Internet через кабельный модем или DSL-соединение, вашей машине FreeBSD понадобится две Ethernet-карты: одна для подключения к концентратору или коммутатору, формирующему основу локальной сети, а другая — для подключения к кабельному модему или DSL-маршрутизатору. Последний интерфейс должен быть сконфигурирован с общедоступным IP-адресом, выданным вашим поставщиком услуг Internet. При такой настройке вашей системе понадобится два сетевых интерфейса. Например» рррО будет модемом — интерфейсом с Internet. Вторым интерфейсом, как правило, будет Ethernet-карта (например, edO). Она будет служить интерфейсом с внутренней сетью. Оба эти интерфейса будут сконфигурированы с различными настройками TCP/IP, помещающими их в разные логические сети; общедоступный интерфейс (рррО) - часть реального Internet, а приватный интерфейс (edO) будет использовать сетевой адрес, допустимый только в пределах локальной сети и имеющий смысл только для хостов, находящихся внутри нее.
Конфигурирование Internet-шлюза I ГГГ ] Глава 28 L 1 Работа шлюза заключается в трансляции между этими двумя интерфейсами путем передачи пакетов между ними. Он соединяет Internet с вашей внутренней сетью, делая обе сети видимыми друг другу. Когда внутренний хост соединяется с внешним, расположенным в Internet, шлюз NAT записывает соединение и транслирует исходящие пакеты так, как будто они исходят от него самого. Когда приходит ответ из Internet через интерфейс рррО, шлюз распознает его как часть корректного соединения и передает интерфейсу edO для передачи правильному хосту локальной сети. Однако прежде чем это произойдет, вы должны разрешить пересылку пакетов, чтобы сетевой трафик протекал между этими двумя интерфейсами. Разрешение пересылки пакетов Для того чтобы ваша система работала в качестве шлюза, она должна быть в состоянии пересылать пакеты между своими сетевыми интерфейсами. Ваша система будет обрабатывать входящий и исходящий трафик Internet для других компьютеров вашей сети, так что когда система принимает пакет, который не адресован ей, она должна будет переслать его в правильное место назначения. По умолчанию (для соответствия стандартам Internet) передача пакетов отключена, поэтому FreeBSD будет отбрасывать все пакеты, не адресованные системе, на которой она работает. Разрешение пересылки пакетов может быть включено посредством Sysinstall и состоит всего лишь в добавлении единственной строки конфигурации в файл /etc/rc.conf: gateway_enable="YES" Затем запустите (или перезапустите) маршрутизирующую подсистему, используя следующую команду: # /etc/rc. d/routing restart После выполнения этой команды передача пакетов будет включена, и система сможет передавать их между интерфейсами. Включение NAT для систем без статических IP-адресов Если все системы в вашей сети имеют реальные статические IP-адреса, действительные в Internet, то на этом ваша настройка маршрутизирующего шлюза закончена. Вы можете теперь сконфигурировать другие системы локальной сети на использование хоста simba в качестве маршрутизатора-шлюза. Эти хосты будут посылать этому шлюзу по умолчанию весь трафик, который они не знают, как доставить. Система шлюза по умолчанию затем позаботится об обработке этого трафика и отправке его в правильное место назначения в Internet. НА ЗАМЕТКУ : I ¦ Этот раздел вместе с последующими предполагает, что вы уже имеете в системе работающее Internet-соединение, которое хотите сконфигурировать в качестве шлюза в Internet. Если это не так, обратитесь в главу 23 за описанием настройки сетевого доступа LAN (эта глава также применима, если вы имеете доступ в Internet через DSL или кабельный модем). Если вам нужно сконфигурировать Internet-соединение через модем, обратитесь в главу 24.
Работа в сети FreeBSD Однако в большинстве случаев, если вы конфигурируете шлюз Internet, то другие системы в сети не имеют допустимых IP-адресов, которые действительны для всей сети Internet. Вместо этого они используют внутренние IP-адреса, корректные только в пределах локальной сети — такие как обычно применяемые 10.0.1. ххх, 192.168. ххх. ххх или 172. ххх. ххх. ххх. В таких случаях вам потребуется выполнить еще одну работу. Необходимо включить NAT на вашем шлюзе, чтобы позволить этим другим системам получить доступ в Internet. Если вы используете РРР поверх коммутируемого Internet-соединения, то метод, используемый для включения NAT, будет зависеть от того, применяете ли вы РРР пользователя или РРР ядра. Если вы еще не настроили Internet-соединение, рекомендуется применить РРР пользователя, если вы хотите использовать NAT, потому что это будет проще (читайте в главе 24 дополнительную информацию о пользовательском РРР и РРР ядра). Если же вы имеете дело с РРР ядра или вам нужно настроить NAT для Internet-соединения, не являющегося РРР, процедура будет несколько более сложной. Процедура настройки NAT делится на два следующих раздела. Вы должны прочитать тот раздел, который отвечает вашей ситуации. Применение пользовательского РРР Программа пользовательского РРР в системе FreeBSD имеет встроенную возможность NAT, так что включить ее очень просто. Для этого вы можете лишь указать опцию -nat при запуске ррр. Просто добавьте к прочим опциям, которые вы уже применяете для запуска РРР (подробности — в главе 24 и онлайновом справочнике). Единственное, что нужно сделать еще — сконфигурировать Windows, Macintosh или другой клиент на использование нового сервера-шлюза. Эти вопросы рассматриваются позднее в настоящей главе, в разделе "Конфигурирование клиентов для использования нового шлюза". Использование РРР ядра или выделенного Ethernet-соединения с Internet Если вы используете РРР ядра или имеете выделенное Internet-соединение (DSL, кабельное, Tl, ОСЗ и тому подобное), то конфигурация будет немного сложнее. В этом случае вы должны использовать демон NAT (natd), который требует для своей работы наличия брандмауэра. Чтобы включить этот брандмауэр, вам придется собрать новое ядро. Однако сделать это нетрудно. Вы можете просто добавить следующие две строки в файл конфигурации вашего ядра: options IPFIREWALL options IPDIVERT Вы можете добавить в конфигурационный файл ядра ряд других опций, которые имеют отношение к работе брандмауэра — например, протоколирование. Детальная дискуссия о брандмауэрах не входит в перечень тем настоящей главы, но вы можете прочесть о ней в разделе "Включение брандмауэра" главы 30, прежде чем собирать ядро с поддержкой брандмауэра. Таким образом, пока вам не нужно строить новое ядро, если вы позднее решите, что вам понадобится другая опция для брандмауэра, которая не была включена в ядро изначально.
Конфигурирование Internet-шлюза I TTZ I Глава 28 I I К тому же, если вы не уверены в том, как нужно строить новое ядро, обратитесь за подробностями в главу 18. После завершения сборки нового ядра необходимо будет включить natd. Конфигурирование и включение natd Демон NAT — natd — может быть включен либо конфигурированием сетевых настроек через Sysinstall, либо ручным редактированием /etc/rc. conf. Опять же, если вы уже имеете настройку общедоступной сети, то проще будет внести необходимые изменения вручную вместо прохождения через Sysinstall, поэтому здесь речь пойдет именно о таком методе. Откройте файл /etc/rc.conf в текстовом редакторе и добавьте в него следующие строки: natd_enable=°YES" natd_interface*"pppOM Строка natdinterf асе в данном примере предполагает, что у вас есть модемное соединение с Internet, и что оно находится на интерфейсе рррО. Если же у вас выделенное соединение чрез устройство Ethernet (подобное DSL, кабелю, DSL, T1 или ОСЗ), то вы должны заменить рррО соответствующим сетевым интерфейсом, через который подключаетесь к внешнему миру. Еще несколько других опций natd доступны для управления такими вещами, как протоколирование. Если вас интересуют эти опции, обратитесь к man-странице natd. Но пока не спешите выходить и сохранять модифицированный файл rc.conf, поскольку необходимо добавить еще, по крайней мере, одну опцию. Она касается брандмауэра. Включение и конфигурирование брандмауэра Как минимум, вы должны добавить в /etc/rс.conf следующую строку: firewall_enaMe="YES" Существуют разные способы конфигурирования правил брандмауэра, и соответствующие подробности описаны в главе 30. Здесь предлагается один "обкатанный" метод. В дополнение к предыдущей строке добавьте следующую строку /etc/rc.conf: firewall_type="/usr/local/etc/firewall.conf" Сохраните внесенные изменения в /etc/rc.conf и выйдите из редактора. Затем можно создать файл /usr/local/etc/firewall.conf, в котором просто перечислить правила брандмауэра (за исключением правила по умолчанию, которое по умолчанию запрещает все, что не разрешено явно — подробности читайте в главе 30). Если вы не хотите запрещать никакого сетевого трафика, а просто желаете передавать все насквозь, используйте следующие правила в /usr/local/etc/firewall. conf (заменив edO реальным интерфейсом Ethernet): add divert natd all from any to any via edO add allow all from any to any
838 Работа в сети FreeBSD Часть V Использование этих правил даст тот же эффект, что и полное отсутствие брандмауэра, поскольку просто передает весь трафик и ничего не запрещает. НА ЗАМЕТКУ Разрешение пользователям видеть используемые в вашей системе правила брандмауэра может представлять угрозу безопасности, поэтому вы должны установить права доступа к файлу так, чтобы только root мог читать его. Команда chmod 600 /usr/local/etc/firewall.conf обеспечит это. ВНИМАНИЕ! Приведенные выше правила брандмауэра являются весьма небезопасными, поскольку разрешают передачу трафика любого типа из любого источника, поэтому с радостью передадут любое содержимое любому в системе, кто использует этот шлюз. Это ослабляет безопасность вашей сети и потому является нерекомендуемой конфигурацией. Обратитесь в раздел "Включение брандмауэра" главы 30 за информацией о том, как настроить брандмауэр для блокирования потенциально опасных типов трафика. После завершения всех предыдущих шагов перезагрузите систему, чтобы изменения ядра вступили в силу и загрузились брандмауэр и natd, или воспользуйтесь командой /etc/rc.d/ipfw restart. После этого ваш шлюз сконфигурирован. Единственное, что останется сделать — информировать клиентов о существовании шлюза. Конфигурация различных клиентов рассматривается ниже. Для тех типов клиентов, которые не описаны, обращайтесь к документации по системе. ВНИМАНИЕ! При первоначальном конфигурировании брандмауэра выполняйте всю работу на локальной консоли машины FreeBSD. Если вы обращаетесь к системе удаленно и нечаянно ошибетесь в конфигурации брандмауэра, то сможете блокировать себе доступ к собственной системе. По умолчанию брандмауэр запрещает весь трафик, так что довольно легко сделать это нечаянно. Конфигурирование клиентов для использования нового шлюза Процедуры конфигурирования клиента для применения шлюза варьируются в зависимости от типа используемой им операционной системы. В этом разделе мы расскажем о конфигурировании Windows, Macintosh, FreeBSD и Linux. Имейте в виду, что все последующие инструкции по конфигурированию предполагают, что вы уже имеете некоторую базовую настройку сети, и только показывают, как настроить систему на использование шлюза. Если в вашей системе еще не выполнена базовая настройка сети, обратитесь к документации по системе за описанием того, как это сделать.
Конфигурирование клиентов Windows Чтобы сконфигурировать Windows 2000/XP для использования шлюза, выберите в меню Start (Пуск) пункт Settings^Control Panel (Настройки1^Панель управления), затем — Network Connections (Сетевые подключения). В открывшемся окне найдите запись, представляющую ваше подключение к локальной сети, и дважды щелкните на ней. При этом откроется диалоговое окно конфигурации, показанное на рис. 28.4. ашсшвяаш: The сдлпвсЬогняМ the fofewuSng йдав | Chert for Merosoft Networtcs jjfite and Pw*erSh»ng for Mteweoft Netwotai |QoS Packet Scheduler i «рыттцтф т*ттФшм^»ЛМШн9 Ammmtmm*-******* Wide »W netvifpri* рЮ^ОвЫ that рИВДЙМ <ЙЮИЛЛЙ5Д#0в H'fr" ) Ii И»'**» ^t""' tancef A*c. 2&4. Диалоговое окно свойств сетевого подключения в Windows XP, Windows 98 и других версиях Windows может выглядеть немного иначе В этом диалоговом окне выберите Internet Protocol (TCP/IP) (Протокол Internet (TCP/IP)) и затем щелкните на кнопке Properties (Свойства). Это вызовет диалоговое окно Internet Protocol (TCP/IP) Properties (Свойства: Протокол Internet (TCP/ IP)), показанный на рис. 28.5. Убедитесь, что вы выбрали для использования указанный IP-адрес; затем, наряду с соответствующей информацией TCP/IP, введите IP-адрес маршрутизатора-шлюза в поле Default gateway (Основной шлюз), как показано на рисунке. Щелкните на кнопке О К для сохранения изменений и затем снова щелкните на ОК, чтобы закрыть диалоговое окно свойств сетевого подключения. После этого у вас должен появиться доступ в Internet из вашей системы Windows. Конфигурирование клиентов Mac OS и Mac OS X В классической системе Mac OS (версии 9 и предшествующие) откройте панель управления TCP/IP, как показано на рис. 28.6, и выберите в выпадающем меню Configure (Конфигурация) пункт Manually (Вручную), если только он уже не выбран. Введите IP-адрес шлюза в поле Router Address (Адрес маршрутизатора). Когда вы закроете окно, будет предложено сохранить изменения. Сделав это, вы немедленно приведете в действие новые установки.
840 Работа в сети FreeBSD Часть V Нагга* ГпЛясл» (TCI*/m> ЪшщтЪ** Yoc сел а« fPwiSn®* тшвШ «aaaafccafc t уешггаяий*: «дохи» jhe appfdpwete Я* stfSwige. fw ."V" 13ГГ17Г I 255 255 . 2550 J64 41 . Ш 172 | 64 41 .131 167 J 131 215 .13Э 100 *%ar^ J Г^~\. Рис. 28.5. Диалоговое окно Internet Protocol (TCP/IP) Properties (Свойства: Протокол Internet (TCP/IP)) в Windows XP "TCP/IP (Home) ~ .л»»', _ «__ -_г Cewwotvto: | Ethernet built-in Ш Conflflur». [Мюц»Ну 13 Pi SubiwtmVk: Router addrM»: 64.41.131.172 255.255.255.0 ¦.41.131.167 4.41.131.163 S*«rohdw»«ins: Puc. 28.6. Конфигурирование настроек TCP/IP под Mac OS 9 В системе Mac OS X откройте окно System Preferences (Настройки системы), затем выберите панель настроек сети Network, показанную на рис. 28.7. Выберите свое подключение LAN на главном экране, затем выберите Manually (Вручную) из меню Configure IPv4 (Конфигурация IPv4) и заполните IP-адрес шлюза в поле Router (Маршрутизатор) наряду с остальной соответствующей информацией TSP/IP вашего соединения. Щелкните на кнопке Apply Now (Применить сейчас) для подтверждения изменений. Новые сетевые настройки немедленно вступят в силу.
Конфигурирование Internet-шлюза Глава 28 841 #а^ location: ^ Моте Network Show. f Bu№Mft Ethernet' —«~ H^VffN PPPoE AppleTelk Configure 1Лг4 fManueHy ;..nil";,;r..;.".;,'. f ffAAtwr 64.41 ШЛ72 Subnet Mask 2S5.2SS.2SS.0 ~щ Proxtet^ Ethernet ~Щ Router ' 64.41.13l3S?3 DNS Server»; 61.41 UlW 131,215.139.100 Search Domain*, exempfe.com №v6A<Mre*fc fcertfrurVlP*,.. * ® щт CHett the Jock to prevent further changes. Qtos.st те,.Г) ^u»h/Now"jf | Aic. 2& 7. Конфигурирование установок TCP/IP под Mac OS X В обеих ситуациях у вас имеется опция конфигурирования встроенной Ethernet- карты, беспроводной карты AirPort или других сетевых устройств. Повторите этот процесс для всех соответствующих устройств. Конфигурирование клиентов FreeBSD Чтобы сконфигурировать FreeBSD для использования шлюза по умолчанию, добавьте следующую строку в файл /etc/rc.conf: def aultrouter=" 64.41.131.162" Конечно, вам нужно заменить IP-адрес из этого примера IP-адресом интерфейса шлюза системы FreeBSD, служащей шлюзом. Изменения не вступят в силу до тех пор, пока вы не перезагрузите систему. Если вы не хотите перезагружаться, то можете добавить маршрут по умолчанию следующими командами, введенными в командной оболочке root: # route delete default # route add default 64.41.131.162 Конфигурирование клиентов Linux Из-за множества стилей конфигурирования систем Linux то, как вы сконфигурируете свою систему Linux для использования шлюза FreeBSD, зависит от установленного дистрибутива. Данный пример демонстрирует, как конфигурировать систему Red Hat Linux, но подробности настройки других систем (такие как имя файла, который нужно редактировать) могут слегка отличаться. Документация, сопровождающая ваш дистрибутив, включает полные инструкции по его конфигурированию.
Работа в сети FreeBSD Конфигурация сети в Red Hat Linux управляется файлом /etc/sysconfig/ network. Чтобы использовать шлюз FreeBSD, в этом файле должна присутствовать следующая строка: GATEWAY=64.41.131.162 Замените IP-адрес из этого примера IP-адресом интерфейса шлюза на вашей машине-шлюзе FreeBSD. Перед добавлением этой строки проверьте, не присутствует ли она уже в этом файле, потому что наличие двух строк GATEWAY вызовет конфликт. Чтобы изменения вступили в силу, вам придется перезагрузить свою систему Red Hat Linux. Если же вы не хотите перезапускать систему, можете добавить маршрут по умолчанию следующими командами, введенными в командной оболочке для root: # route del default # route add default gw 64.41.131.162 Конфигурирование точки беспроводного доступа в Internet В последние годы все более популярными становятся домашние и офисные сети, полностью лишенные проводов и использующие любую из широко доступных на рынке беспроводных систем 802Л1 (Wi-Fi). Эти устройства работают сами по себе как NAT-совместимые маршрутизаторы-шлюзы, обеспечивающие дополнительное преимущество вещания беспроводного сигнала для любого аутентифицированного компьютера, находящегося по соседству. К счастью, ваш маршрутизатор FreeBSD также может выполнять эти функции, если он оснащен поддерживаемой беспроводной картой. В настоящее время возможность FreeBSD служить точкой беспроводного доступа требует наличия беспроводной карты, поддерживаемой драйвером wi; к этим картам относятся любые, использующие наборы микросхем серий Lucent Hermes, Intersil PRISM, а также Symbol Spectrum24. Убедитесь (с помощью команды if conf ig -a), что FreeBSD распознает вашу беспроводную карту и поддерживает ее драйвером wi (вы должны увидеть запись сетевого устройства wiO в выводе команды if conf ig). Прежде всего, загрузите модуль bridge в ядро: # kldload bridge СОВЕТ Вы должны добавить этот модуль к процессу запуска вашего ядра, чтобы он был всегда доступным; добавьте следующую строку в файл /boot/loader.conf: bridge_load=MYES" Альтернативно можно добавить следующую строку в конфигурацию ядра и пересобрать ядро: Options BRIDGE Далее введите следующие команды (и добавьте их в файл /etc/sysctl.conf): # sysctl net.link.ether.bridge.enable=l # sysctl net.link.ether.bridge.config="wi0 edO" # sysctl net.inet.ip.forwarding=l He забудьте заменить edO своим собственным интерфейса стороны WAN (pppO, если вы используете модемное соединение).
Конфигурирование Internet-шлюза Глава 28 843 И, наконец, выполните следующую команду для конфигурирования беспроводного интерфейса в качестве точки доступа с настроенным сетевым именем: # ifconfig wiO в8id MyNetwork channel 11 media DS/ 11Mbps mediaopt hostap 4>up etationname " StationName" Замените MyNetwork именем беспроводной сети, которую хотите настроить, а StationName — именем базовой беспроводной станции. После этого у вас должна появиться возможность подключения к базовой станции, используя беспроводной клиентский ПК. Дополнительно вы, вероятно, захотите включить шифрование WEP; WEP — элементарный протокол защиты, который, по большому счету, не обеспечивает никакой защиты от целенаправленных хакеров, но все равно его стоит включить. Это делается следующей командой: # ifconfig wiO inet up said MyNetwork wepmode on wepkey Oxmypassword Wedia DS/11Mbps mediaopt hostap Замените mypassword на текстовую фразу пароля по своему выбору; этот ключ будет затребован от каждого клиента, желающего подключиться к сети MyNetwork. Не забудьте добавить эти опции конфигурации в свой файл /etc/rc.conf, чтобы они применялись каждый раз при загрузке вашей системы. Например, следующая строка /etc/rc.conf комбинирует предыдущие две команды конфигурации и применяет каждую во время загрузки системы: ifconfig_wiO="inet up said MyNetwork channel 11 wepmode on wepkey Qxmypassword 4>media DS/ 11Mbps mediaopt hostap etationname f StationName' " Маршрутизация между тремя и более сетями Во всех ситуациях, которые мы рассматривали до сих пор, конфигурация маршрутизатора предусматривала только один маршрут. Например, наш шлюз simba имел только одно подключение к Internet и обслуживал только одну сеть. На рис. 28.8 показано, как он работает. Internet (сеть 2) Локальная сеть в Нью-Йорке (сеть 1) lion tiger концентратор модем z simba cheetah puma Рис. 28.8. Шлюз simba здесь должен только пересылать пакеты между двумя сетями, одна уз которых - локальная, а другая - Internet В этом простом примере хосты lion, cheetah, lynx и puma используют simba в качестве шлюза по умолчанию для взаимодействия с системами в Internet. Аналогично simba также имеет свой шлюз по умолчанию, и он установлен на маршрутизатор у
844 Работа в сети FreeBSD Часть V поставщика Internet-услуг. Для коммутируемых соединений РРР это прозрачно для вас, потому что маршрут по умолчанию будет добавлен автоматически при установлении РРР-соединения и автоматически удален, когда соединение РРР прервется. Вам не нужно заботиться об этом, но следует помнить, что ваш шлюз использует свой маршрутизатор по умолчанию — так же, как ваши клиенты используют этот шлюз как маршрутизатор по умолчанию. Однако иногда возникает необходимость в более сложных конфигурациях, вроде той, что показана на рис. 28.9. В данной ситуации simba служит маршрутизатором по умолчанию для своей сети, а также служит маршрутизатором по умолчанию для falcon, который сам является маршрутизатором по умолчанию для другой сети. Internet (маршрутизатор поставщика Internet-услуг: 212.214.111.59) Нью-Йорк lion tiger концентратор :z3 н: wolf Дания I bear! simba и cheetah puma falcon |—(концентратор 1 lynx fox simba: 64.41.131.162 falcon: 191.515.116.121 bear: 205.211.117.13 fox: 205.211.117.11 wolf: 205.211.117.14 lynx: 205.211.117.12 Рис. 28.9. Более сложная настройка шлюза, В данном случае simba служит маршрутизатором по умолчанию для своей собственной сети, а наряду с этим — маршрутизатором по умолчанию для falcon, который сам является маршрутизатором по умолчанию для другой сети В этом примере, в дополнение к обслуживанию клиентов своей собственной сети, simba, по сути, выступает поставщиком Internet-услуг для сети, обслуживаемой маршрутизатором falcon. Это значит, что simba теперь должен выполнять маршрутизацию между тремя сетями. Чтобы это работало, вам необходимо добавить еще один маршрут к simba, чтобы он знал, какие пакеты следует отправлять в сеть, обслуживаемую falcon, а также — как их туда направить. Сеть, обслуживаемая falcon, владеет блоком адресов класса С. Обратите внимание, что все адреса сети начинаются с базового адреса 205.211.117.ххх. К тому же отметьте, что falcon имеет IP-адрес 169.151.116.121. Чтобы заставить simba маршрутизировать пакеты в сеть, управляемую falcon, вы можете добавить следующие две строки к /etc/rc.conf: defaultroute="212.214.Ill.59" static_routes="falcon" falcon="-net 205.211.117.0 169.151.116.121" В этом случае IP-адрес 212.214.111.59 — это маршрутизатор по умолчанию для simba. Другими словами, любые пакеты, получаемые simba, предназначен- , ные для хостов, которых он не знает, будут направлены этому маршрутизатору. 212.214.111-59 — маршрутизатор, принадлежащий поставщику услуг Internet, обслуживающему simba.
Конфигурирование Internet-шлюза I TTZ I Глава 28 I I Вы также добавили то, что называется статическим маршрутом. Это — запись в статической таблице маршрутизации, и она неизменна. В данном случае вы сообщаете simba, что все полученные им пакеты, имеющие назначение с базовым адресом 205.211.117.0, должны быть направлены по адресу 169.151.116.121. Это IP- адрес falcon, который сам по себе служит маршрутизатором для другой сети. Как видите, все хосты в сети, обслуживаемой falcon, имеют IP-адреса, начинающиеся с 205.211.117.ххх. Таким образом, любые пакеты, полученные simba и предназначенные для любого из этих хостов, будут отправлены на falcon вместо того, чтобы уйти на маршрутизатор по умолчанию 212.214.111.59. Вдобавок любые пакеты, полученные simba, предназначенные для клиентов в его собственной сети, будут направлены непосредственно его клиентам вместо того, чтобы уйти на маршрутизатор по умолчанию. Для того чтобы статические маршруты заработали, нужно перезагрузить систему. Перезагрузка системы в этом случае рекомендуется, но если вы не хотите ее выполнять, то можете добавить статические маршруты вручную, чтобы они вступили в действие немедленно. В предыдущем примере это можно сделать следующей командой из оболочки для root: # rout* add -net 205.211.117.0 169.151.116.121 Динамическая маршрутизация Все рассмотренные нами до сих пор примеры использовали статические маршруты — то есть маршруты, которые никогда не меняются. Это связано с тем, что в примерах, с которыми мы сталкивались до сих пор, маршрутизаторы имели одно- единственное соединение с Internet. Например, в предыдущем примере simba обращается в Internet через маршрутизатор, принадлежащий его поставщику Internet- услуг, a falcon попадает в Internet через simba. В обоих случаях это единственный канал, связывающий маршрутизатор с Internet. Однако иногда у вас может быть несколько Internet-соединений или несколько маршрутов к одной и той же сети, В этом случае статическая маршрутизация работает не очень хорошо. И здесь лучше подойдет динамическая маршрутизация. Динамическая маршрутизация использует демон маршрутизации вместе с протоколом маршрутизации для поиска новых маршрутов и затем динамически добавляет их в таблицу маршрутизации. В дополнение динамическая маршрутизация автоматически удаляет записи в таблице маршрутизации, когда они становятся недействительными. Для FreeBSD доступно несколько демонов маршрутизации. Один из них, включенный в базовую систему FreeBSD, называется routed. Это довольно-таки старая программа, использующая устаревший протокол маршрутизации, известный как RIP (Routing Information Protocol — протокол маршрутной информации). RIP имеет некоторые проблемы с безопасностью, поэтому существуют лучшие альтернативы. Другие демоны маршрутизации доступны в коллекции портов FreeBSD и включают gated и zebra; оба они находятся в каталоге net дерева портов. Дополнительную информацию по установке программного обеспечения с использованием коллекции портов FreeBSD можно найти в главе 16.
Работа в сети FreeBSD Обсуждение конфигурирование демонов маршрутизации выходит за рамки этой книги. Читайте дополнительную информацию о демоне маршрутизации, который вы решили использовать, на man-страницах и в документации. Хорошие новости связаны с тем, что вам, вероятно, вообще не понадобится запускать демон маршрутизации. Как уже упоминалось ранее, единственный случай, когда вам может понадобиться упомянутый демон — это когда у вас имеется несколько маршрутов для того, чтобы попасть в одну и ту же сеть (например, несколько Internet-соединений). Если вы не имеете нескольких маршрутов в одну и ту же сеть, то вполне достаточно применять статические маршруты, как было показано выше. Маршрутизация в пределах предприятия и DMZ Вариацией предыдущей концепции маршрутизации между несколькими сетями является концепция DMZ (demilitarized zone — демилитаризованная зона), которая довольно широко распространена в производственных средах. Проблема состоит в том, что вам может понадобиться держать некоторые системы за пределами шлюза, чтобы они имели реальные IP-адреса (например, Web- серверы), но с остальными системами вы хотите использовать NAT. Обычно это делается через шлюз, имеющий в себе три сетевых интерфейса. Один интерфейс - внешняя связь с Internet, другой — для систем, которые не должны использовать NAT. Интерфейс, обслуживающий системы с реальными IP-адресами, называется демилитаризованной зоной (DMZ). Подробнее о настройках DMZ читайте в разделе "Использование брандмауэра" главы 30.
ГЛАВА 29 Конфигурирование сервера баз данных В этой главе... • Введение в дизайн и администрирование баз данных • SQL: язык структурированных запросов • Использование баз данных с открытым кодом MySQL и PostgreSQL • Конструирование системы баз данных • Написание административных сценариев • Подключение базы данных к Web • Использование РНР для обеспечения управляемого базой данных содержимого на Web-страницах • Оптимизация производительности базы данных • Выполнение резервного копирования базы данных
Работа в сети FreeBSD Рано или поздно все популярные Web-сайты сталкиваются с необходимостью принятия решения о применении базы данных для предоставления посетителям настраиваемого динамического содержимого. Для коммерческих сайтов это почти требование — дополнять статическое Web-содержимое лежащей в основе базой данных, наполненной профилями пользователей, каталогами продуктов, пользовательскими предпочтениями, а также иного рода информацией, позволяющей администратору предоставлять настраиваемый интерфейс для пользователей. От использования баз данных могут выиграть даже некоммерческие сайты. Эта глава раскрывает основы использования баз данных на заднем плане для любого администратора сайта — будь то коммерческого или некоммерческого. Используя свободно доступные пакеты MySQL и PostgreSQL, вы можете разрабатывать хранилища данных, прикрепленные к вашему Web-серверу. Эта глава научит вас тому, что необходимо знать для эффективного администрирования сервера, конструирования требующихся вашему Web-сайту баз данных, оптимизации их производительности и обеспечения их безопасности. Базы данных предназначены не только для Web. Задолго до появления Web базы данных стали неотъемлемой частью коммерции и инженерных дисциплин. Однако база данных полезна лишь тогда, когда имеется хороший интерфейс для доступа к хранящимся в ней данным, и Web — один из наиболее современных интерфейсных механизмов, обеспечивающих их широкое использование. Поскольку базы данных могут служить для очень многих целей, помимо обеспечения динамического Web-содержимого, в этой главе мы объясним, как вы можете использовать базы данных - как в общем, автономном контексте, так и в контексте подключения к Web. Введение в дизайн и администрирование баз данных Подключение Web-сайта к базе данных может показаться довольно-таки устрашающей задачей. В среде Windows процесс осуществляется проще, благодаря таким стандартизованным интерфейсам, как ODBC (Open Database Connectivity — открытый интерфейс взаимодействия с базами данных), однако они не доступны под FreeBSD. FreeBSD также не имеет доступа к "родным" версиям наиболее популярных пакетов баз данных высшего класса, таким как Oracle, MS-SQL и IBM DB2, и к ставших стандартными Windows-ориентированными языкам размещения динамического содержимого на страницах — ASP и ColdFusion. Создание динамического Web-содержимого в FreeBSD обеспечивается в основном за счет использования альтернатив этих пакетов с открытым исходным кодом. MySQL, PostgreSQL и другие аналогичные базы данных берут на себя роль заднего плана, a PHP, Perl и Python предоставляют инструменты, оснащенные возможностью подключения к этим хранилищам заднего плана. На рис. 29.1 показана схематическая организация Web-сайта с динамическим содержимым, который взаимодействует с базой данных на заднем плане. Пользователь (посетитель сайта) открывает страницу содержимого переднего плана в браузере. Это содержимое редко реализуется на простом HTML. Вместо этого большая часть содержимого Web-страницы пишется на таких языках, как PHP, ASP, ColdFusion, Perl или подобных им каркасах. Эти языки включают и HTML, представляющий страницу, и вызовы базы данных, которые возвращают информацию, используемую кодом страницы для наполнения информационных ее частей. Например, база данных может содержать все банковские транзакции заказчика за месяц. Когда пользователь
Конфигурирование сервера баз данных Глава 29 849 обращается к странице с правильными параметрами для извлечения этих транзакций, страница содержимого печатает стандартные заголовки HTML, графические изображения, а также элементы размещения, общие для сайта. Затем страница обращается к базе данных и осуществляет запрос. База данных возвращает результат этого запроса коду страницы содержимого, которая затем форматирует данные заказчика соответствующим образом (в большинстве случаев помещая их в оболочку HTML) и печатает их на странице, После этого страница завершает свою работу, выводя дополнительную общую часть кода HTML, такую как нижние колонтитулы и информацию, касающуюся авторских прав. Два важнейших концептуальных подразделения систем баз данных для Web-сайтов — это задний план (сама база данных) и передний план (механизм генерации содержимого и вывод HTML). Сначала обратим наше внимание на задний план и рассмотрим, как работают запросы к базе данных, поскольку это основа не только Web-применяемости, но также всех прочих использований баз данных. Пользователь Передний план f Web-сервер (Apache) Задний план ^ Та <HTML> PHP ASP ColdFusion Perl Python </HTML> ^—¦ ODBC, PHP, Perl (SQL) w База данных ^^—м^^ Рис. 29.1. Диаграмма Web-сайта, использующего динамическое содержимое, управляемое базой данных. Содержимое Web-страпицы и сервер (передний план) посылает запросы к базе данных (заднему плану), используя язык структурированных запросов (Structured Query Language - SQL) через промежуточный уровень, такой как ODBC, PHP или Perl; база данных возвращает результаты этих запросов через тот же промежуточный уровень переднему плану, где они форматируются для отображения на странице SQL: язык структурированных запросов Ранние работы по теории реляционных баз данных (то есть баз данных, в которых данные хранятся во множестве таблиц разных размеров, которые могут содержать не только данные, но и отношения между элементами данных), принадлежащие перу Е. Ф. Кодда, изданные IBM в конце 70-х годов, определили язык под названием SEQUEL (Structured English Query Language — язык структурированных запросов на английском), позднее сокращенный до просто SQL. Этот язык пытается стандар-
850 Работа в сети FreeBSD Часть V тиэовать в синтаксисе, подобном английскому языку, методы извлечения и вставки информации в базу данных. Использующий термины вроде SELECT data FROM table WHERE field IS NOT NULL, язык SQL легко изучить, хотя концепции, стоящие за тем, что описывает синтаксис, могут быть достаточно сложными. База данных организована, как показано в простом примере на рис. 29.2. Эта диаграмма показывает базу данных под названием PictureArchive, содержащую множество таблиц (показаны две из них). Каждая из этих таблиц представляет группы сходных строк (row) данных, каждая строка, или запись (record), имеет множество полей (столбцов), содержащих данные, образующие строку. Например, в показанной таблице Users (Пользователи) единственная строка может содержать идентификатор (ID) пользователя, его полное имя, адрес электронной почты, возраст. Каждый из этих столбцов характеризуется определенным типом данных — целое число, символьная строка, число с плавающей точкой, булевское значение и так далее. Строка может иметь пустые значения в своих полях, что обычно представляется значением NULL. Таблица Pictures работает аналогичным образом: она группирует различные наборы данных, с разными полями, составляющими разные части базы данных PictureArchive. Эта таблица содержит такие поля, как имя файла изображения, которое было добавлено в систему, его тип, размер и тому подобное. Но что делает реляционные базы данных особенно полезными — так это способ ассоциировать таблицы вместе через отношения между их элементами. Таблица Users содержит связанную информацию об изображениях, однако таблица Pictures содержит поле с ID пользователя, владеющего каждым изображением. Простая логическая связь между таблицами позволяет получать доступ к данным различными творческими методами, как вы вскоре увидите. НА ЗАМЕТКУ Концептуальную структуру базы данных, ее таблиц и их столбцов обычно называют схемой (schema). PictureArchive 1 Users ID Fullname Email Age Pictures | UserJD Filename Type Size Width Height Datejnsetted Puc. 29.2* Диаграмма простой базы данных
Конфигурирование сервера баз данных I ГГЗ I Глава 29 1 I Базовый синтаксис SQL Начиная с примера базы данных PictureArchive, давайте предположим, что ее таблицы уже содержат какие-то данные — то есть таблицы наполнены и используются. Выбор строк Наиболее частой операцией с базой данных является извлечение информации из нее. Это делается SQL-командой SELECT, СОВЕТ Команды запросов SQL не зависят от регистра: select, Select и select будут работать одинаково. Зависимость от регистра применима в некоторых случаях к данным в полях, о чем вы узнаете далее в настоящей главе. К тому же имена баз данных, таблиц и столбцов являются зависимыми от регистра. Однако в целях объяснения этих примеров мы будем использовать заглавные буквы для написания ключевых слов SQL и смешанный регистр (как в PictureArchive) — для именования таких объектов, как таблицы и столбцы. Команда SELECT, как и большинство SQL-команд, структурирована подобно обычному английскому языку. Во-первых, после SELECT идет существительное — имя поля (или полей), который вы хотите извлечь. Далее идет слово FROM, за которым следует имя таблицы (или таблиц), из которой вы хотите извлечь данные. И в конце запроса находится точка с запятой (/). Приведем пример: SELECT * FROM Users; СОВЕТ Не забывайте о точке с запятой в конце SQL-запроса! Это, наверно, наиболее распространенная ошибка среди новичков в SQL. Если вы пропустите точку с запятой перед нажатием <Enter>, то интерфейс позволит вам продолжать ввод текста как часть того же SQL-запроса. Запросы могут располагаться в нескольких строках. Эта команда, введенная либо вручную в командной строке базы данных MySQL или PostgreSQL, либо переданная программе невидимым образом через интерфейс РНР или Perl, говорит базе данных, что она должна вернуть все данные из таблицы Users — без какой-либо сортировки или ограничений. Эти данные либо будут возвращены программно интерфейсу, который вызвал их, либо распечатаны в табличной форме в командной строке. Если ответ содержит огромный объем данных, а вас интересуют только пользователи, отвечающие определенным критериям, вы можете сузить запрос несколькими способами. Первый — специфицировать только определенные поля для извлечения вместо указания звездочки (*), являющегося сокращением для "всех полей*. Вот пример: SELECT Fullname, Age FROM Users? Поля, запрошенные таким образом, могут быть специфицированы в любом порядке; они даже могут повторяться несколько раз в одном запросе. Ответ, возвращенный этим примером, будет содержать только полное имя пользователя и его возраст.
852 Работа в сети FreeBSD Часть V Далее вы можете дополнительно ограничить поиск, используя для этого ключевое слово WHERE. Это позволит вам применить любое количество критериев к запросам; WHERE может специфицировать, что поле должно быть равно, меньше, больше, не равно или иметь любое количество других отношений к определенному значению. Это значение может быть указано явно в запросе или же может быть именем другого поля, как вы увидите через минуту. Пока ограничим запрос теми пользователями, возраст которых превышает 18 лет, используя для этого операцию "больше или равно". Обратите внимание, что когда специфицируется содержимое поля, оно должно быть взято кавычки: SELECT Fullname,Age FROM Users WHERE Age^'lO"; Аналогично вы можете использовать ключевое слово LIKE и шаблонный символ процента (%) для спецификации того, что вы хотите перечислить всех пользователей старше 18 лет, имеющих адреса электронной почты на AOL: SELECT Fullname,Age FROM Users WHERE Age>*"18" AND Email LIKE "%aol.com"; Теперь вы указали сравнительно узкое подмножество пользователей из таблицы Users. Но может оказаться, что ваша база данных настолько громадна, что вы все равно получите сотни записей; может быть, вы хотите видеть только 20 первых пользователей, отсортированных по возрасту. Это делается добавлением конструкций LIMIT и ORDER BY: SELECT Fullname,Age FROM Users WHERE Age>*"18" AND Email LIKE "%aol.com,f Border by Age desc limit 20; Если ваш запрос не помещается в одну строку, не беспокойтесь! Запросы SQL могут содержать множество строк и ограничиваются лишь точкой с запятой. Тот же пример запроса может быть введен следующим образом: SELECT Fullname,Age FROM Users WHERE Age>-"18" AND Email LIKE "%aoi.com" ORDER BY Age DESC LIMIT 20; Дополнительная ясность, которую дает такое написание, окажет вам неоценимую услугу, когда придется писать по-настоящему длинные сложные запросы после того, как вы станете экспертом по SQL, НА ЗАМЕТКУ Вы должны вводить все эти конструкции в определенном порядке. Так, например, limit не может появляться перед order by* Прототипы полных команд SQL доступны в онлайновой документации к различным приложениям баз данных. Вставка строк Мы рассказали то, что касается базового извлечения данных из единственной таблицы. Подобный же процесс вы используете для вставки данных в таблицу, хотя по своему виду и поведению он более математический. Начать следует с оператора INSERT INTO, за которым следует имя таблицы, затем в скобках вводятся имена
Конфигурирование сервера баз данных | ГГГ I Глава 29 I 853 I столбцов, в которые добавляются данные (при желании вы можете выполнить вставку только в несколько полей, оставляя в прочих полях строки значения NULL). Затем вы вводите конструкцию VALUES, за которой в скобках идут вставляемые значения, перечисленные в том же порядке, что и указанные поля: INSERT INTO Users (Fullname,Email,Age) VALUES ("Sam ЬJones","sjones@somewhere.com","25"); Обновление строк Обновление данных в строке (или группе строк) использует синтаксис, позаимствованный от обеих предыдущих команд — SELECT и INSERT — как показано в следующих примерах: UPDATE Users SET Age="26" WHERE Fullname="Sam Jones"; UPDATE Users SET Fullname="Somebody Under 18" WHERE Age<"18"; UPDATE Users SET Age=Age+l; ВНИМАНИЕ! Третий пример, показанный здесь, не имеет ограничительной части {конструкции where); поэтому он выполняет глобальное обновление, применяемое ко всем записям. Будьте очень внимательны при использовании команд подобного рода! Если конструкция where не специфицирована правильно, то единственная команда может провести тотальные изменения по всей базе данных, испортив ее. Удаление строк И, наконец, чтобы удалить строку из таблицы, применяется синтаксис, подобный тому, что вы уже видели: DELETE FROM Users WHERE Age<"13"; DELETE FROM Users; Вторая строка этого примера удалит все вхождения таблицы Users- Применяйте эту команду с той же осторожностью, с которой используете команду rm -rf *! Если вам когда-нибудь придется вводить запросы DELETE или UPDATE без конструкции WHERE, дважды и трижды проверьте, что вы делаете, дабы убедиться в том, что то, что вы делаете — действительно то, что вам нужно, прежде чем нажать <Enter>. Потом вы поблагодарите себя за осторожность. НА ЗАМЕТКУ В SQL доступны намного более сложные приемы составления запросов, такие как слияния и подзапросы, но они выходят за рамки настоящей книги. Чтобы полностью реализовать мощь базы данных SQL, обратитесь к руководству по SQL или к полностью аннотированной онлайновой документации по серверу баз данных, подобному MySQL (http: / /www. mysql. com).
Работа в сети FreeBSD Использование баз данных с открытым кодом MySQL и PostgreSQL Теперь, имея базовое представление об использовании SQL во всех базах данных, поддерживающих его (а это почти все существующие базы данных), вы можете обратить свое внимание на распространенные базы данных с открытым кодом, обычно используемые под FreeBSD. Речь идет о MySQL и PostgreSQL. В последние годы общий перечень программных пакетов баз данных с открытым кодом сузился до небольшого числа, но более качественных и удобных решений. Ранее администратору приходилось выбирать из дюжин различных решений, каждое из которых предлагало некоторую основную функциональность, но которому не хватало некоторые ключевых возможностей, и каждое чем-то отличалось от других. Но в последнее время усилия разработчиков MySQL и PostgreSQL превратили оба пакета в полноценные продукты, способные заменить коммерческие решения. Даже ограничений, отделяющих эти два пакета друг от друга, становится все меньше и меньше. Сегодня выбор между MySQL и PostgreSQL — в основном, дело персонального вкуса и философии. MySQL — намного более широко используемая и лучше поддерживаемая база данных с открытым исходным кодом, к тому же она заметно быстрее. Вот почему примеры, показанные в этой книге, концентрируются на синтаксисе и применении MySQL. PostrgeSQL, однако, поддерживает более развитые средства, чем MySQL, и может оказаться более удачным выбором для высококлассных серверов, для которых транзакционная целостность данных и набор средств имеют принципиальное значение. Но обе они предоставляют отличную поддержку типичных административных нужд. В чем отличия между MySQL и PostgreSQL? MySQL разработан сотрудниками MySQL AB, коммерческой программной компании, находящейся в Швеции, в то время, как PostgreSQL — более традиционный проект с открытым кодом. В разработке PostgreSQL принимали участие специалисты со всего мира, искушенные в различных областях знаний. Поэтому два пакета отличаются многими архитектурными деталями. Наиболее фундаментальные отличия между этими двумя базами данных состоят в их философии разработки; большинство прочих расхождений продиктованы этой основополагающей причиной. Главная задача MySQL — концентрация на производительности и надежности, вместо реализации всех новейших средств, которые MySQL AB рассматривает как источник неприемлемого риска потери стабильности. Приоритеты PostgreSQL ориентированы в сторону обеспечения полного набора средств. Разработчики PostgreSQL стараются реализовать максимально возможную гибкость и функциональность, с целью создания полноценной замены наилучших коммерческих продуктов. MySQL разрабатывается медленнее, чем PostgreSQL. Планы будущей разработки MySQL включают некоторые средства, поддерживаемые в настоящее время PostgreSQL, но разработчики MySQL рассматривают адаптацию этих средств как менее приоритетную задачу, нежели обеспечение производительности и стабильности кода.
Конфигурирование сервера баз данных I „_ I Глава 29 I I Примером этого отличия философии является то, что PostgreSQL требует периодической операции VACUUM, чтобы очистить пространство, которое было оставлено командами DELETE и UPDATE. Поскольку команда VACUUM имеет тенденцию использовать ощутимые объемы нетривиальных накладных расходов, база данных PostgreSQL будет не лучшим выбором для систем, от которых требуется доступность по схеме 24/7 (24 часа в сутки, 7 дней в неделю). MySQL недостает ряда средств, имеющихся в PostgreSQL, которые могут понадобиться администраторам для некоторых целей; но поскольку основной набор средств MySQL спроектирован более устойчиво, в этой базе данных не возникает потребности в операциях очистки и потому она более подходит для критически важной работы в режиме 24/7. К средствам, поддерживаемым PostgreSQL, но не поддерживаемым MySQL относятся помимо прочих подзапросы, внешние ключи, представления, хранимые процедуры и триггеры (версии MySQL 4.1 и 5.x почти все это поддерживают — Прим. пер.). Некоторые из этих средств действительно великолепны и обеспечивают отличный уровень функциональности для администратора. Если вы заинтересованы в создании сайта, с которым можно поэкспериментировать и изучить возможности SQL, то PostgreSQL подойдет вам лучше. Если же, однако, вы заинтересованы в запуске высокопроизводительного сервера, для которого важны, прежде всего, скорость и доступность, то лучшим выбором будет MySQL. НА ЗАМЕТКУ Оба проекта баз данных — PostgreSQL и MySQL — стремятся к совместимости со стандартом ANSI SQL, но ни один из них не поддерживает его в полной мере. И последнее эксплуатационное отличие между двумя пакетами заключается в том, что MySQL предоставляет полную среду командной строки для взаимодействия с системой непосредственно через терминал (Неточность! Такая среда командной строки есть и у PostgreSQL — прим. пер.). Среда MySQL включает ряд команд, не являющихся частью SQL, но имеющих специальное назначение внутри этой среды — SHOW PROCESSLIST и SET PASSWORD. Интерфейс командной строки PostgreSQL более "аскетичен"; команды оболочки снабжаются сжатыми, предваренными обратным слэшем, кодами, напоминающими командный режим редактора vi, а все прочее, введенное в командной строке, интерпретируется как запросы SQL. НА ЗАМЕТКУ PostgreSQL распространяется бесплатно во всех случаях, хотя доступна коммерческая поддержка за определенную плату. MySQL, однако, имеет такую политику лицензирования, что если вы запускаете ее в коммерческом контексте, в котором предпочитаете не ограничиваться требованиями лицензии GPL, то MySQL AB требует, чтобы вы оплатили лицензию. Подробности можно найти на сайте MySQL по адресу http: //www.mysql. com. Инсталляция MySQL MySQL можно легко инсталлировать из коллекции пакетов или портов, как было описано в главе 16. Каталог портов, который вам понадобится, если вы решите собрать MySQL из портов — /usr/ports/databases/mysqlxx-server. Перейдите в этот каталог и введите команды make и make install.
856 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Для совместимости несколько главных версий MySQL доступны параллельно в виде портов и пакетов. На момент написания книги вы можете инсталлировать MySQL 3.2.3, 4.0, 4.1, 5.0 и 5.1 — в зависимости от ваших потребностей и смелости. Ранние версии более стабильны и проверены, а поздние поддерживают больше возможностей. Как и в случае FreeBSD, хорошей идеей будет установить свежую версию, но не самую последнюю. ВНИМАНИЕ! Перед инсталляцией MySQL убедитесь, что ваш раздел /var достаточно велик, чтобы вместить базы данных, которые вы собираетесь использовать. Раздел /var должен быть достаточно велик, чтобы вместить все ваши данные наряду с внутренними структурами таблиц времени выполнения, которые база данных может создавать. Рекомендуемый объем раздела — минимум 1 Пбайт для баз данных среднего размера и средней сложности, но ваши потребности могут продиктовать меньший или больший размер хранилища данных. Обратитесь в главу 20 за подробностями о разбиении дисков на разделы. После того, как пакет будет откомпилирован, инсталлирован и будет запущен сервер MySQL (/usr/local/etc/rc.d/mysql-server start), вам понадобится настроить начальную защиту пользователя root. По умолчанию root обладает полными привилегиями доступа для управления системой MySQL с пустым паролем. Излишне говорить, что не стоит оставлять это, как есть! Первое, что нужно сделать после завершения инсталляции — выполнить следующую команду: # mysqladmin -u root password new__password Замените new_password новым паролем root для доступа суперпользователя к вашей базе данных MySQL. ВНИМАНИЕ! При обновлении старой версии MySQL обычно нет необходимости делать резервную копию и затем восстанавливать ваши файлы баз данных. Но, как вам сообщит сценарий инсталляции, это будет разумной предосторожностью. Чтобы начать процесс, создайте дамп ваших баз данных (как объясняется ниже в разделе настоящей главы "Выполнение резервного копирования базы данных"). Далее выполните операцию make install и перезапустите сервер. Если возникнут какие-то проблемы, вы сможете восстановить ваши базы данных из файлов дампа. Инсталляция PostgreSQL PostgreSQL также можно легко инсталлировать из пакетов и портов, как описано в главе 16. Если вы решили собрать PostgreSQL из портов, используйте каталог /usr/рогts/databases/postgresqlxx-server. Войдите в этот каталог и наберите make, выполните необходимый выбор в полноэкранном меню опций (или согласитесь с предложенным по умолчанию), а затем запустите операцию make install.
Конфигурирование сервера баз данных Глава 29 НА ЗАМЕТКУ Для совместимости несколько важнейших версий PostgreSQL доступны параллельно в виде портов и пакетов. На момент написания книги можно было инсталлировать PostgreSQL 7.0, 7.2, 7.3, 7.4, 8.0 или 8.1, в зависимости от ваших потребностей, да и смелости. Ранние версии более стабильны и проверены, поздние — поддерживают больше средств. Загляните на Web-сайт PostgreSQL, чтобы найти там самую раннюю версию, обладающую всеми необходимыми вам средствами и лишенную проблем с безопасностью; как и в случае в FreeBSD, хорошей идеей будет инсталлировать свежую версию, но не самую последнюю. ВНИМАНИЕ! В отличие от MySQL обновление от ранней версии PostgreSQL требует выполнения полного дампа базы данных с последующим ее восстановлением. Обратитесь к разделу "Выполнение резервного копирования базы данных* настоящей главы за подробностями о том, как это делается. После начальной инсталляции создается новый пользователь (pgsql) и новый сценарий запуска (/usr/local/etc/rc.d/010.pgsql.sh). Однако не спешите запускать этот сценарий для старта сервера. Сначала потребуется выполнить ручную настройку некоторых вещей. Во-первых, выполните команду initdb; она настроит кластер базы данных, представляющий собой основной каталог для всех файлов базы данных, которые будут созданы впоследствии. Процедура инсталляции порта предполагает применение для этого местоположения по умолчанию /usr/ local /pgsql/ data, и вот как она выглядит: # ей -1 pgsql $ mkdir data $ inittab The files belonging to this database system will be owned by user "pgsql". Файлами, принадлежащими этой системе баз данных, будет владеть пользователь "pgsql". This user must also own the server process. Этот пользователь должен также владеть процессом сервера. creating directory /usr/local/pgsql/data— ok создание каталога /usr/local/pgsql/data... ok creating directory /usr/local/pgsql/data/base... ok creating directory /usr/local/pgsql/data/global... ok creating directory /usr/local/pgsql/data/pg_xlog... ok creating directory /usr/local/pgsql/data/pg_clog... ok creating templatel database in /usr/local/pgsql/4ata/base/l... ok создание базы данных templatel в /'usr/local/pgsql/data/base/'1... ok creating configuration files... ok создание файлов конфигурации... ok initializing pg_shadow... ok инициализация pg_shadow.. . ok enabling unlimited row size for system tables.., ok включение неограниченного размера строк для системных таблиц. .. ok creating system views... ok создание системных представлений. ,. ok
858 Работа в сети FreeBSD Часть V loading pg_description... ok загрузка pg_descript ion... ok vacuuming database templatel... ok очистка базы данных templatel.. . ok copying templatel to templateO... ok копирование templatel в templateO... ok Success. You can now start the database server using: /usr/local/bin/postmaster -D /usr/local/pgsql/data or /usr/local/bin/pg_ctl -D /usr/local/pgsql/data -1 logfile start Успешно. Теперь вы можете запускать сервер баз данных с использованием: /usr/local/bin/postmaster -D /usr/local/pgsql/data или /usr/local/Ып/pgjctl -D /usr/local/pgsql/data -1 logfile start СОВЕТ Вы можете пожелать изменить каталог кластера базы данных PostgreSQL на что-нибудь вроде /var/db/pgsql для соответствия принятому в MySQL каталогу /var/db/mysqi; в конце концов, содержимое баз данных изменчивое и потому логично его сохранять в /var. Другая убедительная причина для такого выбора — если у вас разделы /usr и /var расположены на разных физических дисках. Хранение файлов базы данных и неизменного Web-содержимого на разных дисковых приводах может обеспечить существенный выигрыш в производительности, особенно, если они подключены к разным IDE-контроля ерам. Стартовый сценарий PostgreSQL вызывает su -1, что заменяет текущего пользователя на pgsql и выполняет процесс запуска сервера PostgreSQL Опция -1 читает файлы среды командной оболочки »cshrc и .profile для пользователя pgsql, и каждый из этих файлов устанавливает переменную окружения pgdata в /usr/local/pqsql/data. Чтобы изменить кластер баз данных на /var/db/pgsql, вы не только должны создать каталог и запустить initdb -D /var/db/pgsql вместо команды initdb из приведенного здесь примера, но также отредактировать -pgsql/, cshrc и -pgsql/ .profile, изменив в них строки с pgdata (которые изначально специфицируют $HOME/data ИЛИ ${HOME}/data) как /var/db/pgsql). Теперь вы можете попробовать запустить сервер, игнорируя строки в конце процесса initdb и вместо запуска /usr/local/etc/rc.d/010.pgsql.sh start. Если он стартует успешно, примите поздравления. Однако если вы получите сообщения вроде IpcSemaphoreCreate: semget(key=5432003, num=17, 03600) failed: No space left on device (Сбой IpcSemaphoreCreate: semget (key=5432003, num=17, 03600): на устройстве нет места) вместе с объяснением, что вам нужно повысить ограничь ния ядра на установки семафоров, к сожалению, это будет означать необходимость перекомпиляции ядра (см. главу 18), Вот опции ядра, которые вам потребуется добавить или обновить: options SYSVSHM options SHMMAXPGS=4096 options SHMSEG=256 options SYSVSEM options SEMMNI=256 options SEMMNS*512 options SEMMNU-256 options SEMMAP=256
Конфигурирование сервера баз данных I ГГГ I Глава 29 I I Конструирование системы баз данных Теперь, когда ваша система управления базами данных инсталлирована, самое время приступить к созданию функционирующей базы данных. Этот процесс включает тщательное планирование и проектирование; вы не можете просто необдуманно создавать таблицы и столбцы, не памятуя о максимальной эффективности. К тому же, вы не можете также просто предположить, что позднее сможете вернуться и перепроектировать систему, когда научитесь тому, как это делается. Хотя схемы базы данных могут быть изменены, это сделать не так просто, а в некоторых случаях и невозможно без потери данных или дестабилизации вашего собственного кода приложений, построенного на основе существующей схемы. Итак, прежде чем делать что-то еще, вы должны создать собственную базу данных. Это немногим сложнее, чем создать пустой каталог (через интерфейс MySQL или PostgreSQL), который будет содержать ваши таблицы и индексы. Зарегистрируйтесь в базе данных, используя интерфейс командной строки mysql, и введите команду CREATE DATABASE, как показано ниже: # mysql -p Enter password: Введите пароль: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 to server version: 3.23.51 Type 'help;' or '\h' for help. Type '\c' to clear the buffer Добро пожаловать в монитор MySQL. Команды завершаются с помощью / или \д. Идентификатор вашего подключения к MySQL равен 8 для версии сервера: 3.23.51 Введите 'help; r или ' \h' для получения справки. Введите г\сг для очистки буфера mysql> create database PictureArchive; Query OK, 1 row affected (0.02 sec) Запрос OK, 1 строка затронута(0.02 с) В PostgreSQL вы можете использовать инструмент командной строки creat^db (который следует запустить от имени пользователя pgsql), чтобы открыть новую базу данных, как показано ниже: # su -1 pgsql $ createdb Pi с tureAr chive CREATE DATABASE Проектирование таблиц Прежде чем вы начнете создавать таблицы для своей базы данных, лучше обратиться к концептуальной диаграмме, отражающей, как ваши данные будут организованы, и как будут отражены их отношения. Обычно это делается на диаграмме "сущность- отношение'' (Entity-Relationship — ER). Пример ER-диаграммы показан на рис. 29.3. На этой диаграмме две простых таблицы (Users и Pictures) обозначены прямоугольниками, а составляющие их атрибуты (столбцы) — эллипсами. Отношения между таблицами показаны стрелками, чья форма и направление выбраны по соглашению для указания типа отношений. Поскольку столбец User_ID в Pictures явно указывает на поле ID таблицы Users, это означает отношение "многие к одному". Стрелки на ER-диаграммах направлены в сторону "одного", поэтому в отношении "один ко мно-
Работа в сети FreeBSD гим" стрелка должна была бы указывать от Users на Pictures. При отношении "один к одному", как если бы вторая таблица содержала по одному вхождению на пользователя, следует использовать двунаправленную стрелку. Рис. 293. Пример ER-диаграммы, демонстрирующей простое отношение между двумя таблицами Users и Pictures В более сложных наборах данных могут потребоваться таблицы, представляющие отношения между другими таблицами, возможно, с добавочными полями данных. Скажем, вы хотите добавить таблицу к базе PictureArchive, описывающую набор профилей компоновки Web-сайта (чтобы каждый пользователь мог выбрать для себя внешний вид сайта). Эта новая таблица по имени Prefs, должна будет содержать поля Background_color, Text_color, булевское поле, описывающее, нужно ли отображать адрес электронной почты пользователя, и целочисленный идентификатор (ID). Эта таблица должна быть каким-то образом связана с каждым пользователем, но таблица Prefs не имеет поля, ссылающегося на определенного пользователя (как это имеет место в таблице Pictures), поскольку каждая запись в Prefs — это просто набор атрибутов, который должно быть можно присвоить любому числу различных пользователей. Вы не хотите добавлять к таблице Users новое поле, указывающее идентификатор Prefs ID для каждого пользователя. Поэтому решение состоит в создании новой таблицы по имени User__Pref s, не содержащей действительных данных, а вместо этого лишь содержащей отношения "многие к одному" между Users и Prefs. Измененная ER-диаграмма показана на рис. 29.4. Таблица User_Pref s обозначена ромбом, потому что она хранит лишь набор отношений, а не сами данные. В ней всего три столбца: User_ID, Pref s_ID и третий столбец по имени Last_mod, хранящая дату (в формате времени UNIX как целое число) последнего обновления пользователем своих предпочтений. Таким образом, при каждом обновлении пользователем его предпочтений (через некоторый механизм на Web-сайте, созданию которого вы научитесь чуть позже), процесс обновления просто создает новую запись в таблице User_Pref s вместо обновления существующей (и изменения могут быть легко отменены удалением последней добавленной записи). Вставка новой записи может быть выполнена с помощью запроса вроде следующего, выполненного (к примеру) CGI-сценарием: INSERT INTO User_Prefs (User_ID,Prefs_ID,Last_mod) VALUES ("5я,"3","1030745048");
Конфигурирование сервера баз данных Глава 29 861 Рис. 29.4. Пример ER-диаграммы, показывающей сущности данных и наборы отношений Затем, когда пользователь станет просматривать свою страницу, ваш код сможет запросить в базе данных наиболее свежую запись из User_Pref s для этого пользователя, найдя Pref_ID, и запросить атрибуты этого вхождения Prefs, чтобы сгенерировать страницу в соответствии с этими атрибутами. Вот пример таких запросов: SELECT Prefs_ID FROM User_Prefs WHERE User^ID^'S" ORDER BY Lastjnod DESC LIMIT 1; ¦.. [ Извлечь значение Pref s_ID в переменную $pref s_id, как будет показано ниже ] SELECT Background_color,Text_color,Show_email FROM Prefs WHERE ID-"$prefs_id"; Альтернативно, если у вас хватит смелости, вы можете скомбинировать эти два запроса в один, посредством соединения: SELECT Background_color,Text_color,Show_email FROM User_Prefs, Prefs WHERE User_Prefs.User_ID=w5H AND User_Prefs.Prefs_ID*Prefs.ID ORDER BY Last_mod DESC LIMIT 1; Вы можете даже выполнить тройное соединение, чтобы получить всю пользовательскую информацию из таблицы Users вместе с последними вхождениями из Prefs для каждого пользователя, как показано ниже: SELECT Fullname,Email,Age,Васkground_color,Text_color,Show_email FROM User_Prefs,Users,Prefs WHERE Users.ID="5" AND User_Prefs.User_ID=Users.ID AND Use^Prefs.PrefsJED^Prefs.ID ORDER BY Last_mod DESC LIMIT 1; Планирование структуры таблиц подобным образом до их фактического создания позволит впоследствии избежать головной боли, связанной с необходимостью полного перепроектирования внутри работающей системы.
862 Работа в сети FreeBSD Часть V Создание таблиц Имея в голове рабочий проект вашей базы данных, вы можете приступить к созданию таблиц. Это делается командой запроса CREATE TABLE. Синтаксис этой команды в ее наиболее общей форме весьма прост, но требует знания доступных типов данных, чьи атрибуты могут оказаться достаточно сложными. Наиболее распространенные из них приведены в табл. 29.1, хотя сверх того доступны и другие типы, полностью документированные на Web-сайтах MySQL и PostgreSQL. Таблица 29.1. Часто используемые типы данных столбцов Наименование типа Описание INT, INTEGER FLOAT CHAR(n) VARCHAR(n) BLOB TEXT ENUM BOOLEAN Целое со знаком, от -2147483648 до 2147483647. Этот тип может иметь атрибут UNSIGNED. , Число с плавающей точкой. Строка из п зарезервированных байт, максимум п = 255. Подобно char, но с тем отличием, что хранится лишь столько символов, сколько в действительности занимает строка. Этот тип более предпочтителен, чем char. Вы можете специфицировать binary, чтобы сделать сравнение строк чувствительным к регистру. Большой двоичный объект, содержащий текст или двоичные данные (такие как графические образы) с переменным объемом хранения (как varchar). Максимальный размер — 65 Кбайт. Существуют также tinyblob (до 256 байт), mediumblob (16,7 Мбайт) и longblob (4,3 Гбайт). Между значениями blob в MySQL и PostgreSQL существует тонкое различие. То же, что и blob, с тем отличием, что сравнения строк не зависят от регистра. Существуют также tinytext, mediumtext и longtext. Набор допустимых строковых значений (например, "Красный", "Желтый", "Зеленый"). Эти значения хранятся в максимально сжатой форме в базе данных, с небольшими кодами для каждого допустимого значения, что намного эффективнее, чем использование для тех же целей полей text или varchar. Логический тип, принимает значения "True" (истина) или (ложь). Не поддерживается в MySQL. 'False" Давайте создадим таблицы, о которых мы говорили в примере PictureArchive. Таблица Users должна иметь целочисленное поле ID (идентификатор), текстовые поля Fullname (полное имя) и Email (адрес электронной почты) и еще одно целочисленное поле Age (возраст). Следующий код создаст такую таблицу: CREATE TABLE Users (ID INT, Fullname VARCHAR(64), Email VARCHAR(32), Age INT); Таблица Prefs будет иметь целочисленный идентификатор, два шестисимвольных текстовых поля для описания двух цветов (которые вы наполните шестнадцатерич- ными значениями) и поле типа ENUM для Show_email (поскольку MySQL не поддерживает тип BOOLEAN), Следующий код создаст эту таблицу: CREATE TABLE Prefs (ID INT, Background_color VARCHAR(6), Text_color VARCHAR(6), Show_email ENUM("Y","N"));
Конфигурирование сервера баз данных Глава 29 863 После выполнения команд CREATE TABLE введите команду DESCRIBE Users, чтобы увидеть плоды своего труда, как показано ниже: _+ + + I Nulll Key I Default _.+ + + I YES | | NULL I YES | | NULL I YES | | NULL [ YES | | NULL .+ + + _+ I Extra -+ I mysql> DESCRIBE Users; + + I Field I Type +-, + | ID | int(ll) I Fullname I varchar(64) I Email I varchar(32) I Age I int(ll) + + 4 rows in set (0.00 sec) + + + + + + r+ | Поле | Тип | Null [Ключ | Умолчание \Дополн. \ + + + + + + + I ID | int(ll) I Да | | NULL | I I Fullname I varchar(64) I Да I I NULL \ \ I Email | varchar(32) \ Да \ \ NULL | | | Age | int(ll) I Да I I NULL I 1 4 строки в наборе (0.00 с) После того, как некоторые данные будут введены в таблицу, вывод любого запроса, введенного в командной строке, будет возвращен в табличном формате, вместе с временем, которое потребовалось на выполнение запроса. Если столбцы слишком широки для вашего экрана, они будут перенесены, а не усечены; это может ухудшить внешний вид. Выбирайте поля в запросах таким образом, чтобы получать читабельный вывод. Следующий пример показывает пару многострочных запросов INSERT, которые наполняют таблицу Users, за которыми следует табулированный вывод разумно ограниченного запроса SELECT: mysql> INSERT INTO Users (ID,Fullname,Email,Age) -> VALUES (l,"Joe Smith","jsmith@somewhere,com",22) ; mysql> INSERT INTO Users (ID,Fullname,Email,Age) -> VALUES (2,"Alice Walker","awalker@elsewhere.com",31); mysql> SELECT ID, Fullname, Email, Age FROM Users; + + + +_^ + | ID | Fullname I Email I Age | + + + + + I 1 | Joe Smith | jsmith@somewhere.com | 22 | 1 2 | Alice Walker | awalker@elsewhere.com | 31 | + + + + + 2 rows in set (0.00 sec) Индексы и ключи Теперь вы имеете работающие таблицы, которые могут быть использованы в действующих запросах. Установка полноценной базы данных, однако, не так проста. Еще одно обстоятельство, которое следует рассмотреть при проектировании таблиц — это то, как они будут индексированными. Индексация определяет порядок данных внутри базы данных, а также является тем, что позволяет базам данных быть
Работа в сети FreeBSD такими быстрыми, как они есть. Краткая дискуссия об индексации с применением хеш-таблиц была представлена во врезке "На заметку" в главе 13, но здесь необходимо более полное описание, поскольку индексы, использующие хеш-таблицы требуют значительную часть внимания в жизни администратора базы данных. Представьте себе поиск слова в словаре. Если вы ищете слово база* но не знаете, что такое "алфавитный порядок", то вам придется потратить буквально недели на поиск последовательным просмотром всего словаря до тех пор, пока вы не найдете нужное слово. Но поскольку вы знаете, где в алфавите находится буква Б, то можете найти его очень быстро. Тот же принцип используют компьютеры. Если они не имеют схемы индексации, по которой нужно искать фрагмент данных, то выполняют линейный поиск последовательным просмотром всех хранящихся данных, и хотя могут делать это намного быстрее, чем вы, это все равно получится неприемлемо медленно. Поэтому вы должны создать соответствующие индексы (или хеш-функции, которые для компьютера воплощают ту же концепцию, которую для нас воплощает алфавитный порядок) и ключи (такие как первая буква слова база), помогающие базе данных находить путь среди данных. Все таблицц данных-сущностей (те, что показаны в виде прямоугольников на ER-диаграмме) должны иметь первичный ключ. Это столбец, специально предназначенный для хранения значений, по которым данные таблицы должны автоматически индексироваться. Значения в этом столбце должны быть специфицированы как NOT NULL (другими словами, они не могут содержать значение NULL — пустое введенное значение станет 0 для числовых типов данных и пустой строкой для текстовых типов). Все значения в столбце первичного ключа также должны быть уникальными. Похоже, эта роль подходит для целочисленных столбцов ID в наших таблицах. На самом деле, передовой опыт создания таблиц часто требует, чтобы первый столбец каждой таблицы хранил числовой идентификатор (ID), являющийся первичным ключом со специфицированным атрибутом AUTO_INCREMENT. Это заставляет такой столбец вести себя специальным образом: если вы вставляете строку в таблицу со столбцом AUTO_INCREMENT (который также должен быть первичным ключом), то просто можете оставить это значение пустым или NULL, и база данных автоматически заполнит его очередным не использованным целочисленным значением (максимальное значение столбца таблицы плюс единица) для каждой новой строки. Это отлично подходит для целей, которые мы поставили перед собой в настоящей главе; мы получаем новое уникальное число ID для каждой записи, помещаемой в таблицы, и вам даже не придется вычислять его самостоятельно. Обычно эти атрибуты указываются во время создания таблицы: CREATE TABLE Users (ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Fullname VARCHAR(64), Email VARCHAR(32), Age INT); Однако поскольку в данном случае таблицы уже созданы, вы можете применить команду ALTER TABLE для изменения столбца ID по своему вкусу: ALTER TABLE Users CHANGE ID ID INT NOT NULL PRIMARY KEY AUTO INCREMENT;
Конфигурирование сервера баз данных Глава 29 НА ЗАМЕТКУ PostgreSQL не поддерживает атрибут auto__increment; вместо него имеется специальный тип данных serial (который, будучи встроенным типом, более эффективен, чем функция). Тип данных serial не является субъектом тех же ограничений ключей, что auto_increment, но действует почти так же. Используйте serial вместо int для создания автоинкрементных полей идентификаторов. Обратите внимание, что в PostgreSQL, если вы специфицируете null (вместо 0) для поля id в операции insert, значение null будет вставлено вместо следующего доступного целого числа, которое вы получили бы, если бы просто не указали значения для этого поля, null отменяет свойство serial в PostgreSQL. В отличие от этого, auto_increment в MySQL вызывается при любом значении null или 0, заданном для этого поля. Вы можете специфицировать другие ключи на других столбцах таблицы, используя атрибут KEY после имени переменной во время создания таблицы или указывая конструкцию ADD INDEX в команде ALTER TABLE. Выполнение одной из этих команд создает индекс по каждому специфицированному вами ключу. Можно также создавать индекс по нескольким столбцам. Этот подход удобен, когда уникальная комбинация двух столбцов, взятых вместе, представляет то, что уникально идентифицирует запись в таблице. Создать индекс по нескольким столбцам можно следующим образом: ALTER TABLE Users ADD INDEX (Email,Fullname); Этот код приведет к появлению дескриптора MUL ("multiple", означающего, что таблица имеет множественные индексы) в столбце Key вывода команды DESCRIBE Users. Очень важно попытаться предсказать, к каким таблицам будет чаще выполняться обращение, и какие будут иметь наибольший объем данных. Правильная индексация таких таблиц, с использованием в качестве ключей столбцов, по которым чаще всего в этих таблицах будет выполняться поиск, может привести к невероятному росту производительности. Далее в разделе "Оптимизация производительности базы данных" настоящей главы вы узнаете больше об оптимизации базы данных по скорости. Поддержание безопасности Обращение к вашим базам данных от имени пользователя root — не слишком хорошая идея. Вероятно, вы захотите предоставить другим, рядовым пользователям доступ к их собственным базам данных вашей системы; это тем более верно, когда вы подключаете базу данных к Web. Каждая база данных обладает привилегиями доступа, которые могут быть выданы индивидуальным пользователям на разных хостах, и правильно настроенная система управления базами данных должна определять эти привилегии тщательно и полностью. Предположим, что ваша база данных PictureArchive должна быть доступна пользователю frank в локальной системе, frank должен иметь возможность создавать новые таблицы, добавлять данные к ним, выбирать и удалять данные, а также их обновлять и уничтожать. (Возможность создавать и уничтожать таблицы необходима для обслуживания временных таблиц.) Вы можете выдать эти привилегии пользователю frank в MySQL с помощью команды GRANT: GRANT CREATE,SELECT,INSERT,UPDATE,DELETE,DROP ON PictureArchive.* TO frank@localhost IDENTIFIED BY 'password* WITH GRANT OPTION;
866 Работа в сети FreeBSD Часть V Если вы хотите быть более снисходительными, можете использовать команду GRANT ALL PRIVILEGES вместо явного перечисления выдаваемых привилегий. Вы также можете выдать привилегии на специфические таблицы внутри базы PictureArchive (введя имена этих таблиц вместо звездочки, означающей "все таблицы"), или же выдать привилегии на все таблицы всех баз данных, введя *. * вместо PictureArchive.*. Замените password паролем, который frank предпочитает использовать; указание его в одинарных кавычках как аргумента IDENTIFIED BY хеши- рует пароль и помещает его в систему в зашифрованном формате. И, наконец, необязательная конструкция WITH GRANT OPTIONS дает право frank выдавать привилегии другим пользователям самостоятельно. Аналогичную функциональность в PostgreSQL имеет инструмент createuser, который предоставляет те же опции в интерактивном режиме из обычной системной командной строки, как показано ниже: # ей -1 pgeql $ createuser -P Enter name of user to add: frank Введите имя добавляемого пользователя: frank Enter password for user "frank": Введите пароль для пользователя "frank": Enter it again: Введите его повторно: Shall the new user be allowed to create databases? (y/n) у Разрешить новому пользователю создавать базы данных? (у/n) у Shall the new user be allowed to create more new users? (y/n) у Разрешить новому пользователю создавать других новых пользователей! (у/n) у CREATE USER Чтобы обеспечить безопасность баз данных на уровне пользователей, вы можете пожелать отредактировать /usr/local/pgsql/pg_hba.conf и убрать комментарии со следующих строк примеров (закомментировав текущие активные конфигурационные строки): # TYPE DATABASE IP_ADDRESS MASK AUTHJTYPE AUTH_ARGUMENT local sameuser md5 local all md5 admins Если пожелаете, можете создать файл по имени admins в /usr/local/pgsql/ data, в котором ввести пользователей — по одному в строке; только этим пользователям будет разрешено работать с базами данных. Вы можете делать то же с каждой новой базой данных, которую создаете — просто добавьте отдельный файл для каждой базы данных с именем пользователя, владеющего ею, и именем файла вместо admins из данного примера. Альтернативно вы можете применить политику, согласно которой локальные пользователи могут подключаться без паролей только к своим собственным базам данных (имена которых совпадают с именами пользователей). Например, пользователь frank должен иметь базу данных под названием "frank". Это можно сделать с помощью следующей конфигурационной строки: local all ident sameuser
Конфигурирование сервера баз данных | T7Z I ПммМ I 8б7 I Модель безопасность PostgreSQL в общем более развита и устойчива, чем у MySQL, но она также требует больших усилий по изучению, чтобы применять ее правильно. Обратитесь к онлайновой документации по адресу http: //www.postgresql.org/ docs за дополнительной информацией. Написание административных сценариев Вы достигли следующего уровня в нашем головокружительном путешествии в мир баз данных; теперь, когда таблицы в базе данных примеров установлены, вы можете вернуться к использованию интерактивной командной строки и узнать, как можно автоматизировать некоторые из самых длинных и трудных запросов. Командная строка MySQL или PostgreSQL всегда будет полезна для дизайна и ремонта баз данных. Однако многие задачи, которые необходимо выполнять на регулярной основе, и которые используют длинные, сложные запросы, требуют нахождения менее утомительного способа их выполнения. Как Perl, так и Python предоставляют наборы инструментов, благодаря которым вы можете писать сценарии для взаимодействия с базами данных. Эти наборы инструментов позволяют посылать запросы, извлекать данные, обрабатывать их и возвращать обратно в систему, и все внутри циклов, условных конструкций и всех прочих удовольствий, предлагаемых этими языками. Подключение к базам данных с помощью Perl Существуют доступные модули для подключения ваших РегГ-сценариев к базам данных MySQL или PostgreSQL. Сначала рассмотрим модули, предназначенные для MySQL. Perl и MySQL Необходимые для подключения к MySQL модули Perl устанавливаются вместе с MySQL. Они находятся в /usr/ports/databases/p5-Mysql; документацию можно почитать по команде perldoc Mysql. Наиболее критичная часть этих модулей — часть настройки каждого сценария, предназначенного для подключения к базе данных MySQL. Этот блок настройки включает следующие строки, которые должны быть помещены в самое начало сценария: use Mysql; $dbh = Mysql->connect(undef, "PicureArchive", "frank", "franks-password"); Добавив эти строки к сценарию, вы получаете дескриптор для работы с базой данных — $dbh. Полный набор операций с базой может быть выполнен через этот дескриптор; мы не станем в этой главе обсуждать все эти операции, а опишем только наиболее важные из них. Остальные вы найдете в документации perldoc Mysql. Посылайте запрос любого рода к базе данных, используя метод $dbh->query и присваивая результат переменной, служащей дескриптором этого результата: $queryh = $dbh->query("SELECT Filename,Type FROM Pictures WHERE Usez^ID^'S1"); После этого вы можете использовать метод f etchrow для получения первой строки вывода. Дальше работа выполняется повторным вызовом f etchrow снова и снова (в цикле), пока будет чего выводить; это позволит вам применить один и тот же код
868 Работа в сети FreeBSD Часть V Perl к каждой строке вывода из базы данных, в любом порядке, специфицированном в вашем запросе SQL: while (($filename,$filetype) = $queryh->fetchrow) { print '^filename, $filetype\n"; } Ниже приведен список операций, которые могут пригодиться. • $dbh->quote. Функция кавычек. Окружите переменную этой операцией, чтобы правильно взять в кавычки ее содержимое для вставки в запрос; например, чтобы гарантировать, что полное имя, такое как "Bob (D'Shea* было правильно вставлено, не приводя в замешательство строку запроса наличием апострофа: $dbh->query("INSERT INTO Users (Fullname) VALUES (".$dbh->quote ($fullname).")");. • $queryh->numrows. Функция количества строк. Возвращает количество строк, которое вернет запрос $queryh. • $queryh->inserted. Функция вставки идентификатора. Если ваш запрос — INSERT, и таблица имеет столбец AUTO_INCREMENT, генерирующий новый идентификатор, эта функция вернет этот идентификатор, чтобы вы могли использовать его в будущих запросах. Perl и PostgreSQL Чтобы подключиться к PostgreSQL из кода Perl, вам понадобится инсталлировать порт /usr/ports/databases/p5-Pg. Этот модуль предоставляет почти ту же функциональность, что и модуль p5-Mysql; вы можете установить соединение с базой данных следующими командами: use Pg; $conn - Pg::setdbLogin(undef,undef,undef,undef,"PictureArchive", Vfrank","franks-password"); Далее можно отправить запрос с помощью метода $сопп->ехес: $result = $conn->exec("SELECT Filename,Type FROM Pictures WHERE User_ID=,5"') ; Затем используйте $result->fetchrow, как в примере с MySQL, который вы видели ранее в настоящей главе. Описание всех возможностей дескриптора результата можно найти в документации perl do с Pg, в разделе, озаглавленном как tt2. Result" ("2. Результат"). НА ЗАМЕТКУ Для обоих этих пакетов описываемые примеры выполняются в режиме автоматического подтверждения (autocommit), означающего, что каждый запрос отправляется базе данных немедленно после того, как он сформулирован (посредством $dbh->query или $сопп->ехес), и результаты становятся доступными немедленно для команд f etchrow. Каждый пакет содержит аналогичные команды, которые могут быть использованы для работы в режиме, когда запросы не подтверждаются сразу автоматически. Этот подход часто очень удобен для операций, которые должны быть атомарными (то есть трактоваться как единая инструкция, которая не может быть прервана другими процессами, которые потенциально могут изменить состояние базы данных между началом и концом операции). Атомарные операции считаются намного более безопасными, чем неатомарные, и хорошая практика кодирования приложений баз данных требует использования их, где только возможно. Обратитесь за подробностями к документации perldoc по каждому пакету.
Конфигурирование сервера баз данных I Г7Г I Глава 29 I I Подключение к базам данных с помощью Python Подключение к базам данных с помощью Python построено в соответствии с интерфейсом Python Database API Specification 2.0. За исключением деталей установочных строк и установки самого соединения, синтаксис команд для доступа к базам данных MySQL и PostgreSQL по сути одинаков. Во-первых, соберите и инсталлируйте порт py-MySQLdb или py-pyPgSQL — оба они находятся в /usr/ports/databases — в зависимости от используемой вами базы данных. Чтобы установить соединение с базой данных MySQL, используйте следующие строки инициализации: import MySQLdb db = MySQLdb.connect(database="PictureArchive"); Если же вы работаете с PostgreSQL, эти установочные строки будут выглядеть так: from pyPgSQL import PgSQL db = PgSQL.connect(database-"PictureArchive"); Предыдущие строки устанавливают соединение с базой данных. Затем вы можете создать курсору или дескриптор оператора, используя оператор db.cursor (): cur = db.cursor () Теперь вы можете начать выполнять запросы. API-интерфейс базы данных Python по умолчанию работает в режиме без автоматического подтверждения, поэтому вы можете подготавливать любое количество запросов, прежде чем давать команду на их выполнение, как показано ниже: cur.execute ("INSERT INTO Users (Fullname,Age) VALUES ('Joe Smith','22')•¦) cur.execute ("INSERT INTO Users (Fullname#Age) VALUES ('Alice Walker', '31') ") db. commit () Возможно, простейший способ обработать многострочные ответы на запросы — воспользоваться оператором fetchall, который извлечет все результирующие строки в многомерный массив. Следующие строки кода демонстрируют, как использовать эту команду: cur.execute ("SELECT * FROM Users") r « cur.fetchall() r [[Joe Smith, 22], [Alice Walker, 31]] Как и с модулями взаимодействия с базами языка Perl, через эти интерфейсы можно выполнить огромное множество разнообразных операций. Обратитесь к сайту Python Database API Specification 2.0 по адресу http: //www.python.org/topics/ database/DatabaseAPI-2,0 .html за полной документацией по этим средствам. Сценарий Perl для наполнения базы данных В этом разделе мы рассмотрим простой сценарий, написанный на Perl. Этот сценарий взаимодействует с базой данных MySQL. Его назначение — прочитать набор текстовых файлов в каталоге, каждый из которых содержит информацию об определенном пользователе системы. Сценарий разберет каждый файл, имеющий следующую форму:
870 Работа в сети FreeBSD Часть V Полное имя пользователя Адрес электронной почты пользователя Возраст пользователя Затем он вставит информацию о каждом пользователе в таблицу Users базы данных, используя столбец AUTO_INCREMENT для генерации уникального числового идентификатора каждого пользователя, и в конце вернет количество строк в таблице после завершения всех операций. Код сценария показан в листинге 29.1. Листинг 29,1. populateUser3.pl: сценарий Perl для наполнения таблицы Users базы данных #!/usr/local/bin/perl use Mysql; $dbh « Mysql->connect(undef, "PictureArchive","frank","franks-password"); $filepath = "/usr/local/www/data/users"; opendir (DIR, "$filepath"); @userfiles * sort readdir (DIR); closedir (DIR); foreach $file (Quserfiles) { open (USER,"$ filepath/$ file") ; @userdata « <USER>; chomp ($_) foreach (@userdata); close (USER); $inserth * $dbh->query("INSERT INTO Users(Fullname,Email,Age) ^VALUES (f$userdata[0]',f$userdata[l]',f$userdata[2]•)"); $num++; } $counth - $dbh->query("SELECT ID FROM Users"); $count = $counth->numrows; print "Имеется $count пользователей в таблице, $num из которых только что добавлено Лп\п" ; НА ЗАМЕТКУ Обычно считается дурным тоном непосредственно генерировать содержимое для вставки "на лету"; вместо этого ваш административный сценарий должен сгенерировать файл .sqi ("рецепт" SQL-команд), который вы затем можете загрузить в базу данных. Подключение базы данных к Web Ничего, о чем мы говорили до сих пор в этой главе, не касается исключительно Web. Настроенные вами базы данных могут применяться локальными пользователями системы, они могут администрироваться автоматизированными сценариями и даже быть доступными удаленно для клиентов базы данных на других машинах — при соответствующей конфигурации. Но большинство баз данных в наши дни предусматривают обращение к их содержимому из Web-браузеров. К счастью, поскольку теперь вы узнали все фундаментальные концепции, необходимые для понимания специфики подключения к базам данных из Web, следующий шаг будет легким.
Конфигурирование сервера баз данных I ГГЗ I Глава 29 I I Использование Perl и CGI для доступа к содержимому базы данных Как говорилось в главах 11 и 26, общий шлюзовой интерфейс (Common Gateway Interface — CGI) — стандартизованный программный интерфейс, посредством которого данные (хранящиеся в переменных) передаются от Web-форм программам заднего плана, которые обрабатывают их и возвращают Web-серверу. Любой Perl-сценарий можно превратить в работающую CGI-программу, просто обеспечив следующие моменты. • Правильную установку прав доступа. • Размещение в месте, доступном Web-серверу. • Печать ею соответствующих заголовков HTTP перед выводом содержимого. То же касается программ, написанных на Python, С или любом другом языке программирования. В последующей дискуссии будет использоваться Perl. Вы уже видели, как создается сценарий Perl, взаимодействующий с MySQL или PostgreSQL на заднем плане. Вы видели также (в главе 26), как создать сценарий Perl, который сможет обрабатывать данные, отправленные Web-формой. Создание сценария, который будет выполнять обе задачи, состоит в простом объединении функциональности этих двух сценариев. В последующих разделах будет показано, как этого достичь. Вставка данных в базу Предположим, что имеется Web-форма, принимающая информацию пользователя (те же поля, что вы видели ранее в таблице Users) и передает ее CGI-программе, которая затем вставляет эти информационные поля в базу данных. Чтобы достичь этого, вы просто должны правильно настроить сценарий на обработку ввода формы и поддержку соединения с базой данных. Вот как это сделать: #!/usr/local/bin/perl use Mysql; $dbh = Mysql->connect(undef, "PictureArchive","frank","franks-password"); read(STDIN, $buffer, $ENV{'CONTENT JLENGTH•}); Gpairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =- s/%([a-fA-F0-9][a-fA-FO-9])/pack("C", hex($l))/eg; $value -r s/~!/ ~!/g; $FORM{$name} = $value; } print "Content-type: text/html\n\n";
Работа в сети FreeBSD Теперь, когда некто обратится к странице Web-формы (которая ссылается на сценарий в поле ACTION HTML-дескриптора <FORM>, как было показано в главе 26), то переменные полей формы будут доступны в виде массива %FORM. Код этого блока выполняет несколько операций над вводом формы для предотвращения ввода пользователем злонамеренного HTML-кода вместо легитимных имен и возрастов. Однако когда имеешь дело с базами данных, то существует еще одна ловушка. Вы должны гарантировать, что данные, введенные пользователем, совместимы с функциями, вставляющими информацию в базу данных, как и с самой базой данных. И здесь вступает в действие функция $dbh->quote. В цикле, подобном тому, что представлен в листинге 29.1, вы можете взять введенные строки в кавычки следующим образом: Sinserth = $dbh->querу("INSERT INTO Users (Fullname,Email,Age) ^VALUES (",$dbh->quote($FORM{'fullname1}).",".$dbh->quote($FORM{'e-mail'}).", V.$dbh->quote($FORM{ 'age'}) .") ") ; Функция $dbh->quote корректно защитит все знаки кавычек, апострофы и прочие специальные символы, чтобы гарантировать, что они не исказят текст, введенный пользователем, и этот текст будет вставлен в базу данных без усечений и изменений, и не приведет сценарий к краху (что может случиться в противном случае, если некто введет строку с двойными кавычками в ней!). Подобные сбои могут случиться, если пользователь попытается ввести данные, не совместимые с типом столбцов, для которых они предназначены. Например, если поле Age (возраст) определено, как столбец типа INT, а пользователь введет *Tm not telling!" ("He скажу!") в ответ на вопрос о возрасте, будет внесено значение, равное нулю; аналогично, если поле VARCHAR имеет длину только 10 символов, а пользователь введет строку длиннее, то строка будет усечена при вставке в базу данных. Другие условия также могут вызвать аварийное завершение операции запроса с возвратом ошибки, что приведет к краху всего сценария. По этой причине важно реализовать код проверки согласованности в вашем сценарии, прежде чем данные попадут в базу. Например, вы можете проверить, что данные, предназначенные для столбца типа INT, действительно представляют собой ненулевое целое, поместив его в условный цикл, как показано ниже: if (int($FORM{'age'}) { $updh » $dbh->query("UPDATE Users SET Age-'$FORM{age}• where id='$userid'") ; } else { print "Ошибка!"; } ВНИМАНИЕ! Имейте в виду, что использование одиночных кавычек вокруг имен полей в элементах ассоциативного массива, как в $form{ ' age' h не работает в запросах подобного рода (где вся строка запроса заключена в двойные кавычки, а содержимое полей — в одинарные). Perl позволит вам оставить одинарные кавычки внутри переменной, как показано здесь, но это будет чревато неприятностями. Будет безопаснее присвоить значение $ form {'age1} другой переменной (например, $аде) перед тем, как использовать ее в запросе. Другая предосторожность состоит в использовании атрибута MAXLENGTH в полях вашей HTML-формы.
Конфигурирование сервера баз данных Глава 29 Например, если длина столбца VARCHAR составляет 64 байта, вы можете использовать следующий HTML-код для описания соответствующего поля ввода формы: <INPUT NAME="fullname" MAXLENGTH="64"> Это предохранит пользователя от ввода строки длиннее 64 символов, и вам не придется беспокоиться об усечении данных при вставке в базу. Хорошая практика кодирования требует, чтобы перехват ошибок выполнялся как можно ближе к пользователю. При программировании "от Web к базе данных" вы имеете дело с тремя разными уровнями кода, отделяющими пользователя от хранилища данных: передний план (HTML и JavaScript), уровень CGI (Perl, Python или С) и задний план (API-интерфейс базы данных и встроенные средства логического контроля таблиц). Правильно спроектированные Web-приложения предусматривают максимально возможную степень контроля ошибок в HTML и JavaScript; затем уровень CGI-npo- грамм служит для перехвата более тонких ошибок. В идеале сама база данных никогда не должна иметь дело с ошибками, "свалившимися" на нее из вышестоящих уровней. Создание поисковой формы Теперь вы знаете, как вставлять данные в базу через Web-форму и готовы к реализации кое-чего более полезного — формы поиска. Единственное поле ввода HTML ($FORM{f keywords?}) может принимать произвольный набор слов, разделенных пробелами. Затем код Perl разделит эту строку на слова-компоненты и выполнит поиск в базе данных соответствия каждого из них. Если более одного слова соответствует определенному вхождению, вы можете установить более высокий код совпадения ("score") и отсортировать результаты в соответствии с этим кодом. Еще лучше, если вы добавите вес каждого вхождения» отвечающий порядку следования ключевых слов. Ниже приведен базовый список шагов по созданию кода заднего плана для обработки поисковой формы подобного рода. 1. Проверить, введено ли что-либо в поле ввода (например, "pictures of yosemite* — "изображения Йосемитского водопада**). Затем создать временную таблицу — то есть таблицу, существующую только в период работы программы и уничтожаемую по завершении сеанса $dbh. (Эта таблица по имени Queries, будет содержать все запросы — шаблоны и все, что вы планируете выполнить.) 2. Разделить содержимое поля ввода на элементы массива @querywords: ("pictures", "of", "yosemite"). 3. Создать $comboquery — строку всех ключевых слов, разделенных шаблонным символом %: %pictures%of %yosemite%. Она будет шаблоном запроса, на соответствие которому по порядку будут проверяться записи таблицы. Если вы будете искать на предмет соответствия всему составному шаблону, а также на соответствие каждого из ключевых слов индивидуально, то показатель совпадения ("score") должен отражать количество совпадений каждого из индивидуальных слов плюс совпадения их комбинаций. Таким образом, это должен быть ваш максимальный результат. Добавьте завершающий символ % и затем поместите все в массив @querywords. 4. Пройдите по каждому ключевому слову и создайте переменную с этим словом, ограничив его шаблонными символами % (как в %yosemite%) и снабдив кавычками, чтобы защитить вашу базу данных. Затем внесите это во временную таблицу Queries. 873
I TZT I Работа в сети FreeBSD 1 8 I Часть У Теперь у вас имеется таблица, полная запросов, готовых к выполнению. Следующие примеры показывают, как эти шаги реализуются на Perl. Начнем с преамбулы обработки формы, описанной ранее. После этого в игру вступают перечисленные выше шаги, как указано в комментариях к коду. #!/usr/local/bin/perl use Mysql; $dbh - Mysql->connect(undef, "PictureArchive","frank","franks-password"); read(STDIN, $buffer, $ENV{'CONTENT^LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split{/=/, $pair); $value — tr/+/ /; $value — s/%([a-fA-F0-9][a-fA-FO-9])/раск("Си, hex($l))/eg; $value — s/~!/ ~!/g; $FORM{$name} * $value; } print "Content-type: text/html\n\n"; # Начало обработки ввода формы, if ($F0RM{'keywords'}) { # Step 1 $sth - $dbh->query("CREATE TEMPORARY TABLE Queries (Query VARCfiAR(255)) ") ; dquerywords - split(As/,$FORM{•keywords'}); # Step 2 $comboquery * $FORM{'keywords'}; # Step 3 $comboquery -~ s/\s+/%/g; push (@querywords,$comboquery); foreach (Oquerywords) { # Step 4 $_ « $dbh->quote('%•.$_.'%'); $sth = $dbh->query("insert into Queries (Query) VALUES ($_)"); } Теперь можно выполнить запрос. Здесь мы будем искать имена файлов в Pictures, а уникальное изображение определяется User_ID и Filename, поэтому мы будем группировать по обоим полям. COUNT () этих результатов назовем Score и отсортируем по этому столбцу в убывающем порядке: $searchh - $dbh->query("SELECT Filename,User_ID,COUNT(Filename) AS Score ^FROM Pictures WHERE Filename LIKE Query GROUP BY Filename,User_ID Border by score desc); И, наконец, вы можете присвоить содержимое каждой строки результата массиву и вывести некоторый HTML-код, в соответствии с вашим вкусом: while (Qsearchdata = $searchh->fetchrow) { print "$searchdata[0] (Score: $searchdata[2])<BR>\n" } } Понятно, что можно придумать и более сложный алгоритм поиска, который легче будет спроектировать и который будет более эффективным. В MySQL есть концепция под названием полнотекстовых индексов (fulltext indexes); вы можете определить
Конфигурирование сервера баз данных 1 TZZ I ГпяиаМ I 875 I поле TEXT, как имеющее индекс FULLTEXT, и затем выполнять специализированный поиск по этому столбцу с высокой скоростью и эффективностью. За подробностями обращайтесь в документацию по MySQL (http: //www .mysql. com/doc/en/Fulltext_ Search. html). НА ЗАМЕТКУ Обратите внимание, что поиск по fulltext не работает с ключевыми словами, которые короче четырех символов; поскольку код индексации настроен для работы с очень крупными наборами данных, поиски по малым наборам дадут весьма странные результаты. Блокировка сеанса и целостность данных Если ваше Web-приложение имеет множество пользователей, обращающихся к нему одновременно, то важно кодировать операции с базой данных так, чтобы они были, насколько возможно, атомарными. Как мы упоминали ранее, атомарная операция — это такая, в которой все команды и ответы выполняются как одна инструкция, так что никакой конкурирующий процесс не может вмешаться и внести изменения в состояние базы данных до того, как эта инструкция будет выполнена. И MySQL, и PostgreSQL поддерживают концепцию транзакций, при которых вместо выдачи запросов в режиме автоматического подтверждения (autocommit), когда команды посылаются механизму базы данных немедленно после их ввода и так же немедленно возвращается результат), вы можете создать атомарную операцию, используя команды BEGIN и COMMIT с любым количеством операций-запросов, расположенных между ними. Использование этих команд в транзакции показано ниже ($now— переменная Perl, содержащая текущее время UNIX): BEGIN/ SELECT * FROM Users; UPDATE User_Prefs SET Last_mod=,$nowf WHERE Lastjnod > r$now'; COMMIT; Запросы не исполняются до тех пор, пока не поступит команда COMMIT, и пока эти запросы выполняются, таблицы остаются заблокированными. Заблокированные таблицы не доступны никакому другому процессу, который должен ожидать, пока данный процесс не завершится. Чтобы использовать такие транзакции в MySQL, вы должны начать сеанс со следующей команды: SET AUTOCOMMIT=0; PostgreSQL автоматически сбрасывает режим автоматического подтверждения, получив первый оператор BEGIN. К тому же, если вы используете модули Perl или Python для подключения к PostgreSQL, они автоматически находятся в режиме отключенного автоматического подтверждения. Фактически вы можете выбирать применение методов BEGIN и COMMIT в контексте запроса или через специализированные команды API-интерфейса базы данных, которые делают то же самое. В MySQL транзакции добавлены относительно недавно, и их проще выполнять непосредственно как команды запросов SQL.
Работа в сети FreeBSD Команда ROLLBACK может быть использована вместо COMMIT для отмены всех запросов, которые были отправлены после команды BEGIN. Если, например, вы работаете в интерфейсе командной строки базы данных, и нечаянно ввели команду DELETE FROM User, то если это было сделано после команды BEGIN, можно ввести ROLLBACK и удаление строк таблицы будет отменено. Поэтому естественно, что применение команды BEGIN весьма желательно (хотя и несколько обременительно) и должно войти в привычку. ВНИМАНИЕ! ; Если вы используете транзакции, не забывайте применять commit после проведения ваших (явных) изменений! Об этом легко забыть при написании кода, и в этом случае не всегда легко будет понять, что идет не так, когда придется заниматься отладкой сценария. Соображения безопасности Программы CGI, которые подключаются к базам данных (в частности, к MySQL, который всегда требует паролей), имеют одно слабое место. Пароли для подключения к базе должны быть жестко закодированы в сценарии либо прочитаны из другого файла. Однако если вы реализуете это, и если Web-сервер запускается от имени пользователя www, он будет выполнять CGI-программу также от имени www, и любой файл, содержащий пароль, должен быть доступен для чтения пользователю www. Если вы поместите пароль в файл, доступный для чтения только root, то CGI-npo- грамма не сможет получить доступ к нему. Однако если вы оставите пароль жестко закодированным в файле, доступным для чтения пользователю www, то любой пользователь вашей системы сможет написать собственную CGI-программу, которая прочтет тот же файл и распечатает все, что в нем есть, или же воспользуется этой информацией для подключения к базе данных и выполнения команды DROP DATABASE для ее уничтожения. Это неотъемлемая брешь в безопасности, существующая в настоящее время в мире UNIX, и пока не существует элегантного решения упомянутой проблемы. Простейший обходной путь — запретить рядовым пользователям запуск CGI-сце- нариев. Можно также прийти к более творческим решениям, используя CGIwrap (см. главу 30). Но в конечном итоге все упирается в вопрос о том, какой уровень безопасности вы хотите обеспечить. Доверяете ли вы своим локальным пользователям? Если да, то можно уйти от решения этого вопроса, полагаясь на их лояльность. Но если вы не можете доверять пользователям, имеющим учетные записи в вашей системе, то чтобы исключить вероятность попыток взлома паролей доступа к базе данных в ваших сценариях, вероятно, следует подумать о том, чтобы перенести базу с чувствительными данными на другой сервер. Однако если вы используете PostgreSQL, то можете реализовать систему безопасности, не зависящую от паролей. Эта конфигурация, которую мы обсуждали ранее, с использованием ident и sameuser разрешает пользователю обращаться только к его собственной базе данных и не позволяет ни к какой другой. Конфигурация подобного рода помогает предотвратить проникновение локальных пользователей в базу данных, к которой они не имеют отношения — и вам не нужно беспокоиться о краже паролей для их применения во вредоносных CGI-программах.
Конфигурирование сервера баз данных I TZZ I ГпаиаОО I 877 I Использование РНР для обеспечения управляемого базой данных содержимого на Web-страницах Возможно, вас удивило, что написание ваших собственных Web-приложений с нуля — это единственный способ включения управляемого базой данных содержи* мот в ваши динамические страницы, и у вас возник вопрос — нет ли лучшего и более очевидного способа, аналогичного применению Microsoft ASP или Adobe/ Macromedia ColdFusion. Ответ — да, такой способ есть. Он называется РНР, что изначально расшифровывалось как "Personal Home Page" (персональная домашняя страница), но теперь это — официальное наименование каркаса препроцессора HTML с открытым кодом, который очень широко используется в мире Web-хостинга UNIX. Официальный Web-сайт РНР расположен по адресу http://www.php.net. РНР состоит из команд, которые могут быть встроены в HTML и которые разбираются почти так же, как включения серверной стороны в файлах . shtml (см. главу 26). Файлы РНР имеют расширения .php, ,php3, .php4 или .php5, и Apache во время инсталляции может быть конфигурирован для распознания этих файлов и прогона их через модуль РНР перед отправкой содержимого пользователю. Дискуссия о РНР в этой главе будет краткой, но этого будет достаточно для того, чтобы ввести вас в курс дела. Если вы уже знакомы с наиболее сложными концепциями дизайна баз данных, SQL и подключаемостью через Perl/Python, то РНР в этой последовательности концептуальных фаз покажется вам десертом после долгой трапезы. Инсталляция РНР Проект РНР сопровождается и развивается группой Apache Software Foundation, из чего следует, что РНР и Apache очень тесно переплетены в своем взаимодействии. РНР инсталлируется как модуль Apache — mod_php5, — который связывает библиотеки, использующие механизм обработки Zend, да котором основан РНР. РНР можно инсталлировать из коллекции портов или пакетов. Имя пакета — modj?hp5 (также доступны более ранние версии), а если вы решите инсталлировать его из портов, то обратитесь в /usr/ports/www. Когда вы введете make, то получите список опций для компиляции в РНР. Выберите поддержку MySQL или PostgreSQL, или же того и другого — в зависимости от того, какие базы данных вы используете. Вы можете также выбрать поддержку библиотеки графики GD, шифрования mcrypt, OpenSSL, XML и прочие дополнения. Если только вы в точности не уверены, что они вам понадобятся, эти дополнительные опции можно проигнорировать. НА ЗАМЕТКУ Если вы эксплуатируете Apache 2.0, то вам нужно будет определить переменную окружения with_apache2 перед вводом make. Подробности об установке переменных окружения читайте в главе 9. В конце процесса установки автоматизированный инсталляционный сценарий модифицирует ваш файл httpd. conf, чтобы включить распознавание .php и прочих
Работа в сети FreeBSD файлов, ассоциированных с РНР, и назначить им соответствующий РНР-обработчик. Можете после этого проверить файл httpd.conf, дабы убедиться, что ничего не было нечаянно разрушено в процессе. Поток управления и приемы программирования Формат дескрипторов команд РНР выглядит как <?php ... ?>. Множество внутренних PHP-команд могут быть заключены между этими ограничивающими дескрипторами; вы можете использовать echo () для печати текста, выполнять строковые операции с переменными (включая переменные HTTP-соединения, такие как HTTP_USER_AGENT), а также управлять потоком выполнения. Например, следующий оператор if служит для печати различных блоков кода HTML в зависимости от состояния переменной: <?php if ($a > $Ь) { ?> <В>А больше В.</В> <?php } else { ?> <В>В больше или равно А.</В> <?php ) ?> Синтаксис именования и присваивания значений переменным очень похож на Perl. PHP включает такие Perl-подобные управляющие структуры, как f oreach, while и do.. .while, хотя эквивалентом els if из Perl здесь служит elseif. Существует также контекст массива, хотя префиксом имен массивов здесь является $ — как и имен скалярных переменных. К тому же, как и в Perl, типы переменных РНР программисту объявлять не обязательно — они обрабатываются внутренне и выводятся из контекста. Строки кода РНР завершаются точкой с запятой (;). Внутри блока <?php ... ?> можно определять переменные и функции — в стольких строках, в скольких необходимо; вы даже можете представить, что это — программа Perl. Все, что находится внутри блока <?php ... ?>, будет разобрано внутри HTML-файла, и вывод всех вызванных вами функций заменит этот блок. Блоки кода РНР можно помещать в любое место файла. Взаимодействие с базами данных В настоящей главе нас более всего интересует то, как организовать взаимодействие РНР с MySQL и PostgreSQL. К счастью, это делается способами, очень похожими на приемы, используемые с языком Perl, которые мы продемонстрировали выше. Начальное соединение с базой данных MySQL устанавливается функциями mysql_connect и mysql_select_db, как показано ниже: $conn = mysql_connect("localhost", "frank", nfranks-password"); mysql_select_db("PictureArchive"); Команды установки соединения с базой PostgreSQL выглядят так: $conn = pg_connect ("dbname=Pi с tu re Archive user-frank pa s s wo rd= franks -pass word")}
Конфигурирование сервера баз данных I „Q I Большое количество опций соединений могут быть специфицированы в строках- аргументах mysql_connect или pg_connect — либо в формате parameter=value, показанном в примере с PostgreSQL, либо в виде упорядоченного списка, как в примере с MySQL (оба формата работают с обеими базами данных). Поскольку PostgreSQL зависит от определенных расширений переменных окружения, вы можете установить значения по умолчанию для многих из этих опций, определив их в среде Web-сервера. Используйте директиву Apache SetEnv для установки их в файле httpd. conf или .htaccess, как показано ниже: SetEnv PGHOST localhost SetEnv PGPORT 7890 SetEnv PGDATABASE PictureArchive SetEnv PGUSER frank SetEnv PGPASSWORD franks-password Для MySQL в PHP предусмотрено множество функций вроде mysql .default_user, mysql .defaultjpassword и mysql. connect_timeout, которые могут быть установлены внутри глобального конфигурационного файла PHP — /usr/local/etc/php.ini. Обратите внимание, что этот файл перед использованием должен быть скопирован или переименован из php.ini-dist. После установки соединения с базой данных вы можете посылать запросы почти таким же образом, как в приведенных ранее примерах, используя mysql_query и pg_query, как показано ниже (обратите внимание, что эти две функции принимают идентификатор базы данных и запрос в противоположном по отношению друг другу порядке): <?php $result = mysql_query("SELECT * FROM Users",$conn) or die("Неверный запрос"); ?> s <?php $result =* pg_query($conn,"SELECT * FROM Users") or die("Неверный запрос"); ?> PHP оперирует с обеими базами данных в режиме автоматического подтверждения. Как только вы исполняете команду mysql_query или pg_query, запрос подтверждается, и вы можете начать работать с результатом в $ result: while($rowdata = mysql_fetch_row($result)) { print "$rowdata[0]: $rowdata[l]<BR>\n"; } Этот синтаксис очень похож на синтаксис PerL Если вы заглянете в документацию Perl на сайте http://www.php.net/manual, то под заголовками "MySQL Functions" ("Функции MySQL') и "PostgreSQL Functions" ("Функции PostgreSQC) найдете огромное количество отлично документированных функций, которые работают очень похоже на функции интерфейса с базами данных языка Perl, с которым вы уже знакомы. Важнейшее преимущество РНР перед "доморощенными" сценариями Perl или Python заключается в том, что поскольку обрабатываемый сервером код встраивается в простые файлы HTML, гораздо легче сопровождать компоновку ваших страниц. Вы можете редактировать HTML в тех же файлах, не рискуя нарушить права
Работа в сети FreeBSD доступа или отключить исполняемый код. И поскольку файлы разбираются самим Apache, значительно снижаются накладные расходы на обработку, поскольку запуск индивидуальных процессов CGI при каждом просмотре страницы обходится серверу достаточно дорого. Соображения безопасности РНР потенциально подвергает безопасность вашей системы множеству рисков. РНР восприимчив ко многим тем же опасностям, что и CGI-программы, а кроме того имеет несколько новых областей чувствительности, о которых вам следует знать. Файлы, содержащие пароли подключения к базе данных, будь то сами файлы HTML/PHP или включаемые файлы, являются субъектами доступа локальных пользователей, пишущих CGI-программы для доступа к их содержимому. Чтобы справиться с этой проблемой, вы должны принять те же меры предосторожности, что и при настройке подключений из Perl и Python (как было рассказано выше в этой главе). Аналогично существуют проблемы с виртуальным хостингом и РНР-файлами, которые выполняются вне главного корня сервера, в пользовательских каталогах public_html (если вы разрешите их; тщательно защищенный сервер должен запускать сценарии РНР из ограниченного каталога /cgi-bin и не позволять делать это рядовым пользователям). Поскольку файлы РНР разбираются и выполняются с одними и теми же правами доступа и владением, действия одного пользователя могут потенциально затронуть код базы данных или файлы других пользователей. Опять же, вам придется пересмотреть свою политику безопасности: насколько можно доверять локальным пользователям? Полная безопасность — миф, к тому же безопасность и удобство являются взаимоисключающими. Чем более либеральны вы в том, что касается доступа пользователей к системе, тем менее защищены от злонамеренных действий этих ваших пользователей. К счастью, в том, что касается подключения к базам данных, единственный источник опасности — ваши локальные пользователи, поскольку большинство открытых для Web систем баз данных не допускают прямого доступа к базе данных заднего плана со стороны нелокальных подключений. Однако локальные пользователи могут стать причиной серьезных проблем, если вы разрешите им доступ к системе. Обратитесь к онлайновой документации по безопасности РНР по адресу http:// www.php,net/manual/en/security.php за описанием возможных атак и угроз для серверов РНР, Оптимизация производительности базы данных Независимо от того, насколько хорошо вы спроектировали свою схему базы данных, по мере роста популярности вашего сайта и нагрузки на него, почти наверняка определенная часть его функциональности станет работать все медленнее. Возможно, дело в том, что вы забыли проиндексировать наиболее критичные таблицы. Возможно, выполняются слишком сложные соединения вместо более дешевого использования временных таблиц. Или же дело просто в том, что ваши динамические страницы чересчур сложны и вам нужно создать кэш статической информации, обновляемый на регулярной основе, с тем, чтобы повысить скорость исполнения запросов за счет снижения требований к абсолютной актуальности информации.
Конфигурирование сервера баз данных Глава 29 881 На первый взгляд может показаться невозможным определить, что именно стало причиной ухудшения производительности; все, что вы увидите — постоянная высокая нагрузка на процессы сервера в выводе команды top. К счастью, есть некоторые способы узнать, что именно делает база данных при обработке запросов. В следующих разделах мы обсудим эти приемы. Мониторинг использования базы данных MySQL включает команду SHOW PROCESSLIST. Введенная в интерфейсе командной строки MySQL, эта команда покажет все запросы, находящиеся в процессе обработки: mysql> SHOW PROCESSLIST; I Id | User I Info I 625441 | root 1 Host | localhost 1 db 1 I PictureArchive | Command| Time) State I Query | 0 | NULL I show processlist I I 625443 | frank | localhost | PictureArchive I Query | 0 | Copying to tmpI select name,dirname,id,count(*) from artists,pictures where id=pictures.artistid **>and display=fY' gro I I 625444 | frank | localhost I PictureArchive | Sleep I 1 I | NULL + + + + + + + + 3 rows in set (0.01 sec) Если вы увидите в этом списке десятки процессов со значениями Time (Время)» исчисляющимися сотнями секунд, то знайте, что у вас возникла проблема — особенно, если все запросы (показанные в поле Info (Информация)) делают одно и то же. Если вы сможете определить из структуры запроса, из какого именно места вашего кода он вызывается, то сможете обратиться к участвующим в нем таблицам и проверить, что запрос объединяет их по индексированным столбцам и что соединения разумно сконструированы. Вы можете также перепроектировать код таким образом, чтобы сомнительный запрос выполнялся в другое время, когда центральный процессор сервера не так занят обработкой других запросов. Команда EXPLAIN представляет более прямой, хотя в некоторой степени и загадочный способ исследования ваших запросов для нахождения того, что именно в них более всего загружает процессор. Эта команда, помещенная перед оператором SELECT, отобразит список таблиц, участвующих в запросе, возможные ключи для поиска, размер каждой таблицы и прочую информацию о способе выполнения запроса. Вы можете проверить определения таблицы, чтобы посмотреть, проиндексированы ли правильно все необходимые ключи. Если нет, вы можете добавить необходимые индексы командой ALTER TABLE (как объяснялось ранее в разделе "Индексы и ключи"). Следующий пример показывает более сложную версию той же базы данных, что вы видели в этой главе, включая некоторые таблицы, которые не были использованы ранее: mysql> EXPLAIN SELECT NAME,DIRNAME,ID,COUNT(*) FROM Artists,Pictures ^WHERE ID»Pictures.Artie t_ID AND Display-1 Y' GROUP BY Artiet_ID Border by created desc limit 5/ ~
882 Работа в сети FreeBSD Часть V I table Extra Itype I possiblejceys 1 key (key len j ref 1 / rows/ 1 Artists I range I PRIMARY, Display [ Display J 2 /NULL j 1615/ where used/ Using temporary; Using filesort J | Pictures |ref | PRIMARY, Art is tJLD I Artist_ID | 4 fArtists.ID | 38 \ Using index / + + + + + + + + 2 rows in set (0.18 sec) Команда EXPLAIN в PostgreSQL может быть настроена так, чтобы помочь вам обнаружить и избавится от наиболее дорогостоящих процессов, которые вызывают замедление ваших запросов, через анализ "стоимости" (cost). Следующий пример демонстрирует применение EXPLAIN в PostgreSQL: PictureArchive=# EXPLAIN SELECT Artists.Name, Pictures.name FROM Artists ^LEFT JOIN Pictures ON Artiste.ID«Pictures.Artist_ID; NOTICE: QUERY PLAN: ~ Merge Join (cost=823.39..1012.89 rows=10000 width=32) -> Index Scan using Artists_pkey on Artists (cost=0.00..52.00 rows=1000 "*>width«16) -> Sort (cost=823.39..823.39 rows=10000 width=16) *-> Seq Scan on Pictures (cost=0.00..159.00 rows=10000 width=16) EXPLAIN Здесь вы видите соединение, выполняемое между таблицами Artists и Pictures, но в таблице Pictures нет ключа, который помог бы механизму базы данных искать элементы, по которым необходимо выполнить соединение. Стоимость выполнения каждой операции суммируется снизу вверх; продвигаясь по дереву вверх, вы можете видеть возрастание общей стоимости запроса. Операции последовательного сканирования и сортировки в нижней части дерева наносят существенный ущерб общей производительности системы. Если бы у вас был индекс по ключу Artist_ID в таблице Pictures, то базе данных не пришлось бы выполнять последовательное сканирование, и она могла бы использовать сканирование индекса, что намного быстрее, как показывает следующий пример: PictureArchive=# CREATE INDEX Pictures_Artist_ID_key ON Pictures ( Artist_ID ) ; CREATE PictureArchive=# EXPLAIN SELECT Artists.Name, Pictures.Name FROM Artists 4>LEFT JOIN Pictures ON Artiets. ID«Pictures ¦ Artist_ID; NOTICE: QUERY PLAN: " Merge Join (cost«0.00..628.56 rows=10000 width«32) -> Index Scan using Artists_pkey on Artists (cost»0.00..52.00 rows=1000 **>width=16) -> Index Scan using Pictures_Artist_ID_key on Pictures (cost=0.00*.439.06 ^rows=10000 width=16) EXPLAIN Здесь общий диапазон стоимости сокращен с 823.39-1012.89 до 0.00-628.56. (Эти единицы измерения не имеют особого смысла вне контекста базы данных, однако их очень удобно сравнивать.) Похоже, принятые меры дали весьма хороший результат.
Конфигурирование сервера баз данных Создание временных таблиц На первый взгляд это не очевидно, но иногда более эффективно создать временную таблицу, чем выполнять сложное соединение. Программно может показаться, что наиболее элегантное решение проблемы заключается в выполнении задачи как можно меньшим количеством строк кода — и, фактически, для традиционных языков программирования это в большинстве случаев верно. Но базы данных работают не совсем так. Если вы обнаружили, что соединение четырех таблиц в едином запросе требует очень много времени на выполнение такого запроса, то представьте на минутку, что именно вы просите сделать вашу базу данных. Она должна собрать четыре (возможно, очень больших) несопоставимых группы данных в памяти, ассоциируя ключи каждой таблицы с ключами другой таблицы. Этот процесс происходит в концептуальной матрице, сложность которой возрастает на порядок при добавлении к ней каждой новой таблицы. Многомерные структуры данных, который база должна удерживать в памяти, достигают невероятных размеров при таком соединении, и поиск в них превращается в чудовищно трудную задачу. Чтобы избежать этой проблемы, поэкспериментируйте с временными таблицами. Вы можете создать временную таблицу, просто предварив оператор SELECT оператор ом CREATE TEMPORARY TABLE t_name, где t_name — имя таблицы. Затем в том же сеансе позднее вы можете выбрать из этой таблицы (командой SELECT) необходимую информацию. После того, как таблица создана, убедитесь, что применяются правильные индексы. Если вы сделаете это, то прямой SELECT из этой новой таблицы — даже с учетом создания временной таблицы и индексации запроса — может оказаться на несколько порядков быстрее, чем сложное соединение, которое вам необходимо для того, чтобы свести все к единственному запросу. НА ЗАМЕТКУ — Временные таблицы существуют только до конца текущего сеанса базы данных; в контексте командной строки созданные вами временные таблицы будут существовать только до того момента, как вы закроете регистрацию. В контексте разработки сценариев для Web такие таблицы уничтожаются при разрушении дескриптора базы данных — то есть когда вы даете команду disconnect через программные инструменты или же по завершении сценария. Имена временных таблиц существуют в приватных пространствах имен, поэтому множество временных таблиц с одинаковым именем могут существовать одновременно, если они созданы в разных сеансах базы данных. Использование кэш-таблиц Если ваши запросы велики и сложны, но их не удается ускорить или повысить эффективность посредством индексации, то может оказаться, что у вас нет другого выбора, кроме как создавать кэш-таблицу. Это таблица, содержимое которой является ни чем иным, как периодически обновляемым результатом выполнения намного более сложных запросов. Что вы при этом делаете на самом деле — так это создаете промежуточный уровень, то есть таблицу, из которой пользователь получает информацию очень быстро, прямым и простым запросом, но чье содержимое может быть не слишком точным, пока не будет обновлено периодически запускаемым процессом, который выполняет сложные запросы и вставляет их результат в эту кэш-таблицу.
Работа в сети FreeBSD Это тот случай, когда могут пригодиться Perl-сценарии, не являющиеся CGI-npo- граммами. Например, вы можете запустить задание сгоп, выполняющее Perl-сценарий каждые 10 минут, которое подключается к базе данных и обновляет кэш, запуская сложные запросы. Этот сценарий может работать в атомарной манере, посылая оператор BEGIN, за которым следуют серии запросов, и в конце — оператор COMMIT; таким образом, запросы, которые потенциально могут изменить данные, участвующие в сложных запросах, откладываются до момента завершения обновления кэша. I НА ЗАМЕТКУ I Дополнительную информацию по использованию сгоп для планирования запуска процессов читайте в главе 15. Во время выполнения процесса обновления кэша система будет слегка замедляться, но в промежутках — в течение 10 минут или часа (в зависимости от частоты запуска задания сгоп) — все будет работать неизмеримо быстрее. Выполнение резервного копирования базы данных И, наконец, мы должны коснуться темы резервного копирования. Жизнь устроена так, что оборудование иногда ломается, и обычно это происходит в самые неподходящие моменты. Так же является фактом то, что выполнение программного обеспечения, написанного с наилучшими намерениями,.может приводить к неожиданным последствиям. Все наиболее опытные ветераны баз данных могут рассказывать душераздирающие истории о том, как они замирали, ошеломленно уставившись в экран, и затем роняли голову на стол и сотрясались от рыданий по внезапно и безвозвратно утерянной базе данных. MySQL и PostgreSQL не имеют механизмов "живого" резервного копирования, который есть у коммерческих баз данных высшего класса, таких как Oracle и DB2. (Но существует множество поставщиков программ, которые предлагают приложения, взаимодействующие с базой данных, которые блокируют ее кусочек за кусочком и сохраняют резервные копии на ленту или другую машину сети.) Однако все эти механизмы делают одно и то же — они могут блокировать и создавать "дамп* информации, что должно быть предусмотрено в любой корректно спроектированной базе данных. В следующих разделах мы рассмотрим некоторые инструменты, необходимые для создания удобных резервных копий. Подготовка дампа базы данных MySQL предусматривает два метода подготовки дампа баз данных на диске — mysqldump и mysqlhotcopy. Использование mysqldump mysqldump — инструмент командной строки, блокирующий базу данных, предотвращая любые новые подключения, и затем копирующий структуры таблиц, за которым следует их содержимое, в STD0UT или выходной файл данных. Этот файл, имя которого обычно заканчивается на . sql, представляет собой длинный список
Конфигурирование сервера баз данных Глава 29 885 команд SQL, которые, будучи запущены последовательно, воссоздадут структуру базы данных и заполнят ее информацией. Программа mysqldump должна запускаться от имени пользователя, имеющего доступ к базе данных; безопаснее всего делать это от имени root, но также неплохо специфицировать пользователя — владельца базы данных, опцией -u user или —user=user. Также можно указать пароль пользователя опцией -р password или —password=password. Обычно вы пожелаете оформить это как задание сгоп, с командой mysqldump внутри файла crontab, доступного для чтения только владельцу. Но если вы озабочены локальной безопасностью, то можете завести специального пользователя для резервного копирования, который имеет право на выдачу команд SELECT и LOCK TABLES для всех баз данных, но не имеет никаких других привилегий. Таким образом, если пароль пользователя будет перехвачен, злоумышленник не сможет с ним сделать ничего деструктивного. Команда mysqldump выполняется примерно так: # mysqldump —users" frank" —pas sword» "franks -password" Pic tureAr chive 4» /us r/ local /www/db/Pi с tureAr chive. sql Если вы запустите это как задание сгоп, то, вероятно, захотите предварить эту команду чем-то вроде mv /usr/local/www/db/PictureArchive.sql /usr/local/ www/db/PictureArchive.sql-old с последующей точкой с запятой. Это переместит старый дамп базы в другой место, освободив место для нового. Затем будет запущено построение собственно дампа данных — и все это в одной команде. Использование mysqlhotcopy Если вы хотите быстро сделать снимок всего каталога базы данных, не создавая файл дампа, используйте mysqlhotcopy. Это Perl-сценарий, блокирующий таблицы и копирующий все ассоциированные файлы в новое указанное местоположение; если ваша база данных будет повреждена или утеряна, вы можете просто остановить MySQL, переместить эти файлы в их правильное место под /var/db/mysql и перезапустить сервер. Чтобы выполнить mysqlhotcopy, сделайте следующее: # mysqlhotcopy —user»" frank" —pas sword= "franks -password" Pi с tureAr chive 4>/usr/local/www/db/PiсtureArchive Резервное копирование баз данных PostgreSQL В PostgreSQL эквивалентом команды mysqlhotcopy является pgdump. Проще всего запускать pgdump от имени пользователя pgsql, владеющего базой данных: # pgsql PictureArchive > /usr/local/www/db/PictureArchive. sql Создайте файл crontab, принадлежащий pgsql, с помощью команды crontab -u pgsql, которую вы видели в главе 15. Восстановление базы данных Восстановление из файла . sql вывода mysqldump или pgdump концептуально очень просто. Это просто "ответ" SQL-команд, которые теоретически воссоздадут всю базу данных во всех деталях — вначале построив таблицы и их индексы, а затем вставив данные. Чтобы восстановить базы данных из файла .sql, сначала вы должны создать эту базу данных (если она была удалена или уничтожена) и затем воспользоваться следующей командой:
Работа в сети FreeBSD # mysql -p PictureArchive < /usr/local/www/db/Pic tureAr chi ve. sql У вас будет запрошен пароль. (В качестве альтернативы вы можете специфицировать пользователя frank с помощью опции -и или —user= и его пароль посредством опции -р или —passwords как было показано ранее в этой главе.) Когда он будет принят, файл .sql будет прочитан в базу данных, и посредством команд SHOW TABLES и нескольких DESCRIBE table и запросов SELECT вы сможете убедиться, что все было правильно восстановлено. В PostgreSQL процесс почти такой же. Сначала используйте su pgsql, чтобы изменить текущего пользователя на pgsql; затем создайте базу данных (используя createdb, как вы видели ранее), если она еще не существует. Затем запустите psql, передав ему для чтения файл .sql: $ psql < /usr/local/www/db/PictureArchive.sql Если все прошло успешно, база данных восстановится, и можно будет работать дальше. Проектирование с учетом восстанавливаемости Тем не менее, процесс резервного копирования и восстановления не совершенен. Поскольку таблицы и их содержимое восстанавливаются серией команд, и поскольку эти команды автоматически генерируются программами, понятно, что конфигурация, которую вы, возможно, настроили вручную, не может быть автоматически восстановлена автоматизированными инструментами. Один потенциально осложняющий фактор — в частности, в MySQL — это AUTO_ INCREMENT. Этот специальный тип столбца INT, который должен быть первичным ключом — по определению UNIQUE и NOT NULL. В идеале вы никогда не должны специфицировать значения такого столбца вручную; вы должны получить различные положительные значения для каждой строки в таблице. Однако вы можете — если в этом действительно есть необходимость — зайти в базу данных и вручную специфицировать, что элемент таблицы должен иметь значение 0. Это помешает попыткам восстановления такой базы данных. Когда MySQL попытается восстановить эту таблицу, она вставит строку, явно специфицируя значение 0 для столбца AUTO_INCREMENT. Однако значение 0, как вы помните, трактуется как специальный случай и переназначается в максимальное значение столбца плюс единица. Таким образом, если в вашем Web-приложении имеется код, который должен трактовать эту строку определенным образом, потому что она имеет уникальный ID, равный 0 (например, если у вас есть таблица предпочтений, содержащая строку "установок по умолчанию", которая идентифицирована специальным ID, равным 0), то после восстановления базы вы не найдете в ней эту строку. В результате сценарий даст сбой и вам придется просматривать таблицы и переназначать значения вручную. Конечно, лучшее решение состоит в изначальном избегании путаницы значений для столбца AUTO_INCREMENT. Большинство проблем подобного рода таковы, что вы не можете предвидеть их появление, но правильные меры предосторожности, которые вам стоит предпринять, станут очевидными по мере накопления опыта. Лучший совет, который можно здесь дать — учитесь на своем опыте как можно скорее. Ничего так не способствует росту квалификации UNIX-гуру, чем преодоление препятствий и решение проблем.
30 ГЛАВА Безопасность сети В этой главе... Выбор модели безопасности на основе имеющихся рисков Модели безопасности Риски безопасности, с которыми вы сталкиваетесь Политики паролей Избежание проблем со службами открытого текста Защита терминального трафика (SSH) Защита почтовых служб (РОРЗ и IMAP) Защита FTP Защита Apache Системные профили безопасности и безопасность ядра (Securelevels) Использование брандмауэра Предотвращение проникновений и компрометации Атаки типа "отказа в обслуживании" (DOS) Физическая защита ' Другие ресурсы, посвященные безопасности
Работа в сети FreeBSD Обеспечение безопасности системы — возможно, наиболее важная часть работы любого администратора, будь то сервер Windows, коммерческая система UNIX, Linux или FreeBSD. Теме безопасности посвящено больше книг, чем любой другой теме, и на то имеются серьезные причины. Это чрезвычайно сложный предмет, но и наиболее важный для обеспечения успешного функционирования сетевых систем. Хотя данная глава не претендует на полное раскрытие всех сторон сетевой безопасности, она представляет хороший общий обзор темы и включает информацию по всем наиболее важным аспектам темы. Эта глава поможет разработать политику безопасности для вашей системы FreeBSD на основе факторов риска, с которыми система сталкивается, и ее роли в качестве сервера или рабочей станции. Здесь мы представим инструменты, необходимые для мониторинга периметра системы, поддержания ее в постоянной готовности для обнаружения признаков опасности, "латания" вашей системы в ответ на эти признаки, а также обеспечения того, чтобы службы, которые вы предоставляете вашим пользователям, не делали вашу систему уязвимой для различного рода атак. Кроме того, будут предложены некоторые идеи о том, что вам следует делать, чтобы вовремя обнаруживать попытки взлома вашей машины. Выбор модели безопасности на основе имеющихся рисков В наши дни Internet — не особенно дружественная среда для серверов, и как администратор, вы всегда должны быть начеку и готовы к худшему. Распространение "rootkit-HHCTpyMeHTOB" — оружия, которое могут использовать злоумышленники для получения доступа к вашей системе с правами суперпользователя, а также публикация сценариев взлома предоставляют богатый арсенал в распоряжение бесчисленных "умельцев", которым нечего делать, кроме как заниматься всякими деструктивными хобби. Вы должны исходить из того, что ваша система постоянно будет подвергаться испытанию на прочность защиты, причем степень опасности ситуации будет расти с появлением и публикацией новых методик взлома. Ваша единственная защита — поддержание системы в насколько возможно актуальном ("свежем**) состоянии, в немедленной реализации новых рекомендаций по безопасности, запуске только тех служб, которые действительно необходимы, и изучении реальных опасностей, которые грозят вашей системе, а также источников наибольшего риска. Модели безопасности Вы можете адаптировать для своей системы одну из нескольких моделей безопасности на основе системных установок и использовании шаблонов и философии, касающейся требований безопасности системы. Выбранная вами модель безопасности продиктует степень тщательности исполнения определенных административных задач, таких как политики безопасности, открытые службы, шифрование трафика и так далее. Ниже приведен краткий список некоторых моделей безопасности, каждая из которых определена общим предложением, подводящим итог оценке администратором имеющихся рисков.
Безопасность сети • Я доверяю всем в Internet Безусловно, самгш не рекомендуемая модель при любых обстоятельствах, и именно такая философия ведет к недостатку гарантий безопасности, присущему многим любительским серверам и их администраторам, которые лишь изредка поддерживают их надлежащим образом, за что в конечном итоге им и приходится платить. Такую модель часто можно встретить в университетских системах, особенно в тех, которые появились еще до того, как в Internet настолько разрослась хакерская активность. Системы, админи- стрируемые на основе этой философии, имеют множество открытых служб, не требуют шифрованной регистрации, имеют слабые политики относительно пользовательских учетных записей и паролей и являются легкой добычей для хакерских атак. • Я доверяю всем, кто работает в сети моей системы. Эта философия типична для небольших сетей предприятий, где сервер защищен от Internet брандмауэром или маршрутизатором NAT, и внутренняя сеть объединяет сотрудников единственной компании или факультета университета. В такой модели злонамеренные пользователи редко встречаются во внутренней сети, особенно если организация невелика, поэтому система может позволить себе нешифрованные службы, выдачу учетных записей всем, кто этого просит, и даже отключение защиты регистрации и паролей. К сожалению, в крупных организациях такая модель защиты серверов провоцирует атаки — и эти атаки изнутри сети, то есть со стороны людей, которые считаются достойными доверия, случаются чаще, чем атаки извне. Если ваша организация достаточно велика, вы должны предполагать, что вы не можете доверять всем в вашей сети, а потому придется выбрать другую модель защиты. • Я доверяю моим локальным пользователям. Администраторы, которые придерживаются этой философии, большие параноики, чем администраторы систем, описанных выше, в первых двух моделях. Данная модель защиты характеризуется более строгой политикой безопасности: просеивание пользователей перед выдачей им новых учетных записей, шифрованные сетевые службы (как требуемые, так и поощряемые), отключение всех ненужных служб и пароли, устойчивые к взломам. Однако локальным пользователям разрешен доступ к внутренним службам и просмотру важной информации (такой как строки шифрованных паролей). Идея заключается в том, что как только пользователи утверждены и им выданы учетные записи, они могут работать в системе, и не оправдание этого доверия влечет за собой исключение из системы. Такая модель подходит для любительских систем, обслуживающих аудиторию "низкого риска" (например, Web-сайт фан-клуба или почтовая служба некоторого сообщества), или же для высокопрофильных коммерческих Internet-серверов, где только несколько доверенных людей обладают действительными пользовательскими учетными записями. • Я доверяю только себе и другим администраторам. Эта модель, которую исповедуют большинство "страдающих" паранойей системных администраторов, не только связана со строгой сетевой безопасностью, как и предыдущая модель, но столь же серьезной локальной безопасностью. Рядовым пользователям запрещается доступ к системным конфигурационным файлам и коду программ серверной стороны посредством тщательно продуманной системы привилегий, спискам контроля доступа (Access Control List) и даже меткам MAC (Mandatory Access
890 Работа в сети FreeBSD Часть V Control — принудительный контроль доступа) — развитому механизму контроля пользовательского доступа к файлам, сокетам и процессам во всей системе. Администратор должен тщательно следить за каждым пользователем, чтобы быть уверенным, что не делается ничего запрещенного, и часто предпринимать специальные меры (такие как специализированные командные оболочки, смена корневого каталога, отключение определенных команд) для ограничения доступа каждого пользователя к системным ресурсам. Эта модель используется для высокопрофильных серверов, предоставляющих услуги электронной почты и Web-хостинга сотням и тысячам пользователей из неопределенных и анонимных источников. После того, как вы выберете модель, подходящую для вас, вашей сетевой системы и безопасности уровня пользователя, вам нужно определить области риска данной модели и разработать меры по его снижению в этих областях. Риски безопасности, с которыми вы сталкиваетесь "Абсолютная безопасность" — миф; только сверхчеловеческие усилия могут полностью застраховать систему от всех мыслимых атак. Лучшее, что можно сделать — выяснить, какие области системы подвержены максимальному риску, и подумать, как их защитить. Риски безопасности сетевого сервера можно сгруппировать в три основные категории. • Слабость защити root. Нарушитель использует возможности нешифрованной передачи или известных слабых мест программного обеспечения сервера (чаще всего, связанных с переполнением буфера либо ослабленным контролем ввода в серверном программном обеспечении), чтобы получить доступ к системе с привилегиями суперпользователя. Затем он инсталлирует собственные средства, призванные скрыть его присутствие от инструментов мониторинга системы (подобных lastnps), после чего может беспрепятственно похищать любые критичные данные вашей системы и использовать их в качестве базовой точки для дальнейшей вредоносной деятельности. • Слабость защиты приватности. Если входящий и исходящий сетевой трафик вашей системы не шифруется, злоумышленник может видеть его целиком, включая пароли (что потенциально ведет к ослаблению защиты root) и любую ответственную или приватную пользовательскую информацию. • Отказ в обслуживании. Нарушитель (или целая сеть нарушителей, часто включающая в себя ничего не подозревающих "зомби") использует методы "грубой силы", такие как "затопление" вашего сервера огромными объемами совершенно законного трафика, тем самым связывая его способность обслуживать трафик нормальных клиентов и потенциально угрожая системе крахом. В пределах каждой из этих категорий рисков безопасности наиболее распространенные угрозы исходят от специфических слабостей защиты. • Небезопасные (слабые) пароли. Пароли, которые могут быть угаданы программно с использованием распространенных слов и последовательностей.
Безопасность сети • Службы открытого (чистого) текста. Службы, в которых пароли и другая важная информация может быть получена посредством перехвата нешифрованных пакетов данных в процессе их передачи по проводам. • Необязательные и уязвимые службы. Если вам не нужно предоставлять службу, не предоставляйте ее. В конце концов, это может дорого обойтись. • Открытая ретрансляция SMTP. Позволяет спамерам использовать ваш SMTP- сервер как открытый ретранслятор для передачи "мусорной" почты. • Не фильтруемый доступ к сети. Запустите брандмауэр для предотвращения неавторизованного и нежелательного трафика от попадания на вашу машину. • Устаревшее и уязвимое программное обеспечение. Чем старше программное обеспечение, тем выше шансы того, что кто-то уже нашел способ взломать его. Каждая из этих слабостей представляет собой потенциальную проблему на FreeBSD в ее конфигурации по умолчанию. В последующих разделах мы покажем, как закрыть эти бреши в безопасности и найти необходимые инструменты для сопровождения системы, которые встанут на пути непрошеных гостей — хакеров (или точнее — взломщиков). НА ЗАМЕТКУ Маркус Ранум (Marcus Ran urn) сформулировал "шесть глупейших идей о компьютерной безопасности" ("The Six Dumbest Ideas in Computer Security") на странице http://www.ranum.com/ security/computer_security/editorials/dumb/. Обязательно прочтите! Политики паролей Если ваши пользователи имеют небезопасные пароли, то все прочие меры безопасности, принятые вами, оказываются под вопросом. Возможно, самый ответственный шаг, который вы можете предпринять как администратор системы FreeBSD — это установить политику паролей, требующую (или, как минимум, поощряющую) от ваших пользователей применение паролей, которые невозможно легко угадать или декодировать. Пользователи часто считают пароли неудобством, а строгая политика безопасности усиливает это ощущение вдвое. Если им разрешить, то пользователи попытаются применять в качестве пароля свои имена пользователя, номера телефонов, имена хостов серверов, слова типа "пароль" или строки удобных для ввода символов вроде повторяющихся букв или цифр. Если вы решите ограничить время действия паролей определенным периодом, то первое, что пользователь попробует в ответ на приглашение ввести новый пароль — это снова указать пароль предыдущего периода. Однако аксиомой безопасности является "удобство и безопасность взаимоисключающи", в том смысле, что укрепляя одно, вам придется жертвовать другим. Повышенное удобство ведет к пониженной безопасности. И ни у вас, ни у ваших пользователей нет никакой возможности обойти это правило. Когда пользователь выбирает пароль с помощью системной программы passwd или сценария, вызывающего те же процедуры, что применяет passwd, выполняется несколько проверок. По умолчанию пароль должен быть как минимум шести символов длиной, но это — лишь одно встроенное средство для предотвращения выбора
Работа в сети FreeBSD пользователем слабых паролей. Вы можете применить описанные ниже подходы, чтобы поднять вашу политику паролей на следующий уровень. СОВЕТ Идеальный пароль имеет минимальную длину в восемь символов (в действительности, чем длиннее, тем лучше) и включает в себя смесь заглавных и прописных букв, цифр и знаков препинания или метасимволов. Чтобы обеспечивать строгую безопасность вашей системы, вы должны гарантировать, что пользователи следуют этим указаниям при выборе пароля программой passwd в FreeBSD. Хотя единственная мера безопасности, обеспечиваемая сейчас по умолчанию программой passwd — это требование минимальной длины пароля в шесть символов, сообщество разработчиков FreeBSD трудится над включением в программу passwd дополнительных проверок слабости паролей. Далее в разделе "Обеспечение устаревания паролей" настоящей главы вы узнаете, как использовать login.conf для установки минимальной длины паролей и требования периодического обновления паролей. Обеспечение безопасных паролей с помощью Crack Первый приоритет в поддержке практики безопасных паролей состоит в предотвращении выбора пользователями небезопасных паролей с самого начала. На момент написания этой книги лучший способ убедиться, что пользователь не выбрал легко угадываемый пароль — периодически пытаться угадать его. Инструмент, называемый Crack и доступный в коллекции портов в /usr/ports/security/crack, поможет вам в этом. Хотя может показаться, что это "хакерский" инструмент, Crack предназначен в первую очередь для того, чтобы служить инструментом аудита безопасности для системных администраторов, позволяя вам выполнять атаки "словарем* (пробуя множество английских слов, которые могут быть потенциальными паролями) наряду с множеством других часто используемых "удобных" паролей: повторяющихся строк, имени пользователя, групп чисел и тому подобного. Crack поможет вам определить, кто из ваших пользователей применяет небезопасные пароли. Затем вы можете непосредственно связаться с этими пользователями и попросить их следовать установленным вами правилам относительно паролей. Порт Crack можно собрать и инсталлировать, воспользовавшись инструкциями, которые приведены в главе 16. Полномочия нового каталога /usr/local/crack позволяют только root просматривать его содержимое и запускать любую из его программ. Чтобы проверить системную базу данных на наличие слабых паролей, перейдите в /usr/local/crack и запустите программу Crack, как показано ниже (обратите внимание на регистр символов): # ./Crack -fmt bed /etc/master.passwd Программа Crack собирает некоторые утилиты, компилирует ряд словарей и затем применяет весь свой арсенал против /etc/master .passwd. Crack направляет свой вывод в файлы времени выполнения, которые вы можете проанализировать программой Reporter, как показано ниже: # ./Reporter -quiet passwords cracked as of Sun Oct 15 12:17:41 EST 2006
Безопасность сети I ftQQ I Глава 30 I I 979693112:Guessed frank [frank] Frank Jones [/etc/master.passwd /bin/tcsh] 979693187:Guessed joe [password] Joe User [/etc/master.passwd 4>/usr/local/bin/bash] done Crack сообщает только о тех пользователях, чьи пароли были успешно угаданы. В примере вывода взломанные пароли показаны в первом наборе скобок; пароль Фрэнка — frank, а пароль Джо — password; оба пароля очень слабы, и могут быть угаданы злоумышленником с минимальными усилиями. Вы можете затем связаться с этими пользователями, напомнить им о политике паролей и потребовать изменить пароли на более надежные. После запуска Crack очистите инструменты времени выполнения и выходные файлы следующими двумя командами: # make tidy # rm пдп/F-merged НА ЗАМЕТКУ FreeBSD продолжает разрабатываться, и весьма вероятно, что в программе passwd появится поддержка автоматической проверки надежности паролей, подобная той, что выполняется с помощью Crack; фактически используемые Crack библиотеки доступны в /usr/ports/security/ cracklib. В таких системах, как Linux, cracklib имеет вид подключаемого модуля аутентификации (Pluggable Authentication Module — РАМ), то есть механизма, который также поддерживает FreeBSD (см. man pam), но FreeBSD не имеет поддержки cracklib, полностью интегрированной в РАМ, как в Linux. Однако уже сейчас, если вы не побоитесь перспективы ковыряться в исходном коде экспериментального программного обеспечения, и если вы заинтересованы во включении процедур библиотеки cracklib в программу passwd, можете узнать; как это делается, по адресу http: //www. kearneys. ca/~brent/FreeBSD/passwd42. html. СОВЕТ Инструмент, подобный Crack, но с более интенсивной проверкой и работающий быстрее — это John the Ripper (/usr/ports/security/john). Он может оказаться очень полезным — как в сочетании с Crack, так и сам по себе. Обеспечение устаревания паролей По умолчанию пароли в FreeBSD не устаревают. Однако одной из общепринятых частей политики безопасных паролей является требование периодической смены паролей пользователями — через интервалы времени, установленные вами. Чтобы обеспечить это на FreeBSD, необходимо модифицировать файл /etc/ login. conf. Этот файл управляет возможностями и поведением системы, такими как допустимое количество процессов, максимально допустимый размер процесса, допустимое количество одновременно открытых файлов и определенные характеристики поведения командной оболочки (подробнее об этом читайте в man login.conf). Каждый из этих управляющих параметров может быть назначен "классу* пользователей; вы можете назначить пользователей в классы с помощью команды chf n (как было показано в разделе "Файлы /etc/passwd и /etc/master.passwd" главы 13).
894 Работа в сети FreeBSD Часть V По умолчанию пользователи не ассоциированы ни с какими классами, поэтому значения класса default применимы к каждому пользователю: default:\ :passwd_format=md5:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\ :path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin ^/usr/local/bin /usr/XHR6/bin ~/bin:\ :nologin=/var/run/nologin:\ :cputime=unlimited:\ :datasize=unlimited:\ :stacksize=unlimited:\ :memorylocked=unlimited:\ :memoryuse=unlimited:\ :filesize=unlimited:\ :coredumpsize=unlimited:\ :openfiles-unlimited:\ :maxproc=unlimited:\ :sbsize=unlimited:\ :priority=0:\ :ignoretime@:\ :umask=022: Символы обратного слэша позволяют переносить строки, поддерживая читабельность файла. Чтобы установить дату устаревания пароля, вы добавляете дополнительную строку в класс default, специфицирующую свойство passwordtime. Эта строка может быть включена в блок в любом месте, но проще всего добавить ее в начало, между именем класса и первой строкой существующего свойства: default:\ : passwordtime=90d: \ :passwd_format=md5:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ Этот пример устанавливает срок действия пароля в 90 дней (90d). Вы можете также использовать значения времени вроде 2у (2 года), 6w (6 недель) и 24h (24 часа). Теперь, поскольку /etc/login.conf — база данных, которая должна быть скомпилирована в хеш-таблицу (как и с таблицами в /etc/mail, о которых вы узнали из раздела "Конфигурирование базовых почтовых служб с Sendmail" главы 25, и с файлом /etc/master .passwd с его соответствующими хеш-таблицами пользовательских учетных записей), вы должны запустить программу cap_mktab для генерации хеш-таблицы и включения внесенных изменений: # cap__mkdb /etc/login.conf С этого момента процедуры регистрации пользователей будут требовать от пользователей смены пароля каждые 90 дней. Обратите внимание, что когда установлено свойство passwordtime, passwd пишет время последней смены пароля в шестое поле файла /etc/master.passwd: frank:$l$LXZkCuzD$70a8LyRf5jY0b.XrXiB3d.:1060:100::999066364:0:: ^/home/frank:/bin/tcsh
Безопасность сети Глава 30 СОВЕТ Вы также можете использовать login.conf для изменения минимальной длины пароля. Это делается установкой значения minpasswordlen: :minpasswordlen=8:\ Это устанавливает минимально допустимую длину пароля в восемь символов. Присваивание начальных паролей Когда заводится новая пользовательская учетная запись, может возникнуть искушение установить простой начальный пароль вроде Tempi23 или ChangeThis. Это, на первый взгляд, невинная практика, однако может серьезно ослабить безопасность вашей системы — особенно, бели вы применяете один и тот же временный пароль для каждого вновь добавленного пользователя. К счастью, сценарий adduser предусматривает возможность присвоения случайно сгенерированного пароля, который почти невозможно угадать, каждому новому пользователю, которого вы добавляете в систему. В своей конфигурации по умолчанию во время процедуры анкетирования adduser запросит у вас, какой тип пароля вы желаете создать; но вы можете указать, что он должен сгенерировать случайный пароль для каждого пользователя, добавив следующую строку в файл /etc/adduser .conf: passwdtype=random Альтернативно запустите команду adduser с опцией -w random. Когда вы используете любой из этих двух приемов, то запуск программы adduser даст следующий вывод: adduser: INFO: Successfully added (joe) to the user database. adduser: INFO: Успешное добавление (joe) в базу данных пользователей. adduser: INFO: Password for (joe) is: cwwqAuSpwdOrYG adduser: INFO: Пароль для (joe) : cwwqAuSpwdOrYG Add another user? (yes/no) : no Добавить другого пользователя? (yes/no) : no Goodbye I Всего хорошего! Весьма маловероятно, что случайная программа взлома паролей сможет угадать пароль cwwqAuSpwdOrYG. Теперь, однако, ваша задача — убедиться, что пользователь joe не установил себе в качестве пароля "joe" или что-то столь же тривиальное. Один способ навязать эту политику — использовать одноразовые пароли, которые работают только в единственном сеансе регистрации. СОВЕТ Инструмент для генерации случайных паролей по требованию — pwgen2 — доступен в портах, в категории sysutils. Он позволяет изменить пользовательский пароль в любое время, а не только во время первоначальной регистрации пользователя, и, кроме того, предлагает множество гибких опций при создании нового пароля.
Работа в сети FreeBSD Одноразовые пароли с S/Key Если вы всерьез озабочены безопасностью паролей, то можете поступить так, как это принято в правительственных учреждениях и сверхзащищенных видах бизнеса. А именно: вы можете присваивать вашим пользователям одноразовые пароли, передавая груз забот со своих плеч на плечи пользователей. Идея в том, что пользователи получают наборы паролей (или средства их генерации по требованию), каждый из которых может использоваться для одной попытки регистрации. Одноразовые пароли генерируются программой key, имеющей варианты для множества платформ. Существует даже независимый от платформы вычислитель ключей на языке Java — http://www.cs.umd.edu/-harry/jotp/src.html. (FreeBSD использует в своих вычислениях MD4.) Когда пользователь пытается войти в систему, сервер предоставляет ему кодовую фразу и число. Затем пользователь использует программу key и эти значения ввода для генерации пароля для одной попытки регистрации и вводит этот пароль. Этот пароль затем никогда больше не применяется; при следующей попытке входа он должен генерировать новый пароль, используя для этого новое число, предоставленное сервером. Одноразовые пароли — хорошие кандидаты на использование в системах, в которых вы не обязываете пользователей применять SSH вместо Telnet (об этом речь пойдет ниже). Поскольку новые пароли должны быть сгенерированы пользователем программой key в локальной системе в ответ на предоставленную сервером кодовую фразу и собственный пользовательский секретный пароль, который никогда не передается по кабелю (за исключением начальной установки ключа), злоумышленник никогда не получит никаких полезных данных, перехватывая соединение. Однажды использованный пароль никогда не может быть использован вновь. Пользователь может передавать свой одноразовый пароль в виде открытого текста без опасений. НА ЗАМЕТКУ S/Key — инструмент, предназначенный в большей мере для сознательных пользователей, понимающих важность безопасности, чем для администратора. Многие части установки S/Key (например, программа keyinit) находятся в ответственности пользователя. Если пользователь тщательно заботится о сохранности своего пароля в секрете, он может предпочесть одноразовые пароли, даже если у него имеется другой выбор. Однако это также означает, что пользователь может отказаться от одноразовых паролей, если сочтет это не обязательным. Предположим, что вы хотите сделать так, чтобы пользователь frank не мог войти со своим обычным паролем UNIX с удаленного хоста, но вместо этого использовал одноразовые пароли S/Key. Будучи зарегистрированным на сервере (предпочтительно через SSH), он должен использовать программу keyinit для установки аутентификации S/Key: # keyinit Adding frank: Добавлениеfrank: 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. Напоминание — используйте этот метод только при прямом подключении. Если вы применяете telnet или rlogin, выйдите без ввода пароля и используйте keyinit -s.
Безопасность сети Глава 30 897 Enter secret password: Введите секретный пароль: Again secret password: Еще раз секретный пароль: ID frank s/key is 99 st28077 COL APT HELM TAB DRY TRIM НА ЗАМЕТКУ Если пользователь frank не подключен к серверу безопасным образом (как в случае чистого текстового подключения Telnet), он должен применять keyinit -s, что повышает степень безопасности за счет разделения шагов keyinit и key. Без опции -s keyinit включает программу key в свою собственную операцию. Пользователь frank вводит секретный пароль, сгенерированный key (применяемый только для вычисления одноразовых паролей S/Key и который не должен совпадать с его паролем UNIX) и передает его по сети на сервер. Если соединение не безопасно, секретный пароль может быть перехвачен, что поставит под вопрос все дальнейшие попытки обеспечения безопасности. Если пользователь frank укажет опцию -s, то ему придется сначала вызвать программу key локально — на своей собственной машине Windows, Macintosh или UNIX и сгенерировать пароль, не передавая свой секретный, сгенерированный key пароль по сети. Затем он вводит этот пароль в keyinit в ответ на приглашение s/key access password: (пароль доступа s/key:), которое появляется только при условии указания опции -s. После того, как пользователь frank вызвал keyinit для установки механизма S/Key и добавил элемент для своей регистрации в /etc/skeykeys, вы должны создать файл /еtс/skey.access (если он еще не создан) и добавить в него следующую строку: deny user frank Файл /еtс/skey.access сообщает FreeBSD, при каких условиях удаленному пользователю разрешено указывать свой обычный пароль UNIX, и при каких условиях он должен применять одноразовый пароль S/Key. Строка в skey.access специфицирует правило, начинающееся с permit (разрешающее либо пароль S/Key, либо UNIX) или deny (требующее пароля S/Key), за которым следует столько условий, сколько вам нужно. Эти условия могут специфицировать определенных пользователей, группы, имена удаленных хостов или сетей либо терминалов регистрации (полное описание представлено в man skey. access). Строка-пример, показанная выше, требует, чтобы, когда пользователь frank пытался войти в систему, ему разрешалось бы применять только пароли S/Key, а не пароли UNIX. Следующий раз, когда пользователь frank воспользуется Telnet для подключения к вашей системе, его приглашение на регистрацию будет выглядеть так: # telnet 8tripes.exanple.coia Trying 64.41.131.102... Попытка подключения к 64.41.131.102... Connected to stripes.example.com. Подключение к stripes.example.com. Escape character is 'А] '. Управляющий символ 'Л] '. FreeBSD/i386 (stripes.example.com) (ttyp2) login: frank s/key 99 st28077 Password:
898 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Как упоминалось ранее, S/Key представляет способ обеспечения безопасности даже при регистрации через Telnet с открытым текстом. Однако если вы придерживаетесь строгой политики безопасности, вы должны требовать от своих пользователей применения SSH и отключить вообще доступ по Telnet. Если пользователь frank применяет для подключения SSH, то поведение S/Key будет точно таким, как в приведенном примере, хотя строки вывода могут немного отличаться. Теперь пользователь frank должен воспользоваться программой key (или ее эквивалентом) на своей собственной машине для нахождения пароля, который нужно ввести. Он должен при этом использовать информацию, предоставленную сервером: счетчик итераций (в данном случае 99 — то есть он имеет право выполнить еще 99 входов прежде, чем ему придется запустить keyinit снова), за которым следует начальная строка (здесь st28077 — та же, что вы видели в примере с keyinit). Эти числа, комбинированные с секретным паролем пользователя frank, генерируют пароль S/Key, состоящий из шести коротких английских слов: # key 99 st28077 Reminder - Do not use this program while logged in via telnet or rlogin. Напоминание - не используйте эту программу при регистрации через telnet или rlogin. Enter secret password: Введите секретный пароль: COL APT HELM TAB DRY TRIM Теперь frank вводит эту строку слов в качестве пароля и получает доступ. Нарушителю, если он перехватит эти слова, не повезет — они передаются через сеть только однажды (на пути приглашения входа). Следующий раз, когда система запросит у frank пароль S/Key, количество итераций уменьшится до 98, и пароль будет другим. Итерации продолжают подсчитываться, пока не достигнут нуля — тогда frank должен будет снова запустить keyinit, чтобы снова выставить значение счетчика в 99; в противном случае ему будет запрещен доступ и вам придется вмешаться (изменив правило в /etc/skey. access с deny на permit, пока он не инициализирует S/Key повторно). СОВЕТ При желании пользователь frank может сгенерировать множество ключей сразу, используя key с опцией -п. Затем он может распечатать эти ключи и захватить их с собой, если для него это удобнее или безопаснее: # key -n 5 50 8t28077 Reminder - Do not use this program while logged in via telnet or rlogin. Напоминание — не используйте эту программу при регистрации через telnet или rlogin. Enter secret password: Введите секретный пароль: 41: SHOT YOU BIEN GIN JUDD AS 42: CHOW AVIS DOES EMIT FLAM WORK 43: DOCK ATE ANN WAS JOCK OAT 44: WALE AWL ELK LETS AWK WALE 45: GIFT BERT ROD GRIN YANG EAST Такая практика часто применяется щепетильными работодателями — вроде тех, что выполняют оборонные заказы, где компьютеры весьма серьезно изолированы и их возможности значительно ограничены.
Безопасность сети Запрос пароля S/Key также выдается как часть команды su, помогая избежать передачи пароля root по сети в любое время. Чтобы отключить S/Key для пользователя, удалите запись о нем из /etc/ skeykeys и все упоминания о нем из /etc/skey. access. Kerberos И последний метод аутентификации, достойный упоминания — Kerberos. Разработанный как централизованная система управления регистрацией в Афинском филиале Массачусеттского технологического института (МГГ), Kerberos предоставляет пользователям способ аутентификации на центральном сервере сети, издающей "билеты" для выполнения таких задач, как Telnet, FTP, POP3 и NFS, без необходимости повторной регистрации каждый раз. До тех пор, пока хосты вашей сети, между которыми циркулирует ваш трафик, поддерживают Kerberos и подписаны на услуги мастер-сервера, подсистема Kerberos берет на себя всю работу по аутентификации. FreeBSD позволяет устанавливать мастер-сервер Kerberos, на услуги которого подписываются все прочие хосты сети, или просто поддерживать Kerberos в сети, где он уже работает. До самого последнего времени Kerberos оставался схемой, которая действительно удобна только в ситуациях унаследованных систем или в MIX Его удобство в облегчении часто выполняемых задач в крупных локальных сетях, таких как сети университетов или иерархические сети крупных предприятий, и остается еще множество ситуаций, где Kerberos незаменим для современных сетей. Это в меньшей степени мера безопасности, чем способ сокращения ненужной работы в чистых средах UNIX. Однако поскольку многие сети предприятий применяют Kerberos для предоставления централизованных услуг регистрации, и поскольку модель безопасности Windows 2000/ХР/2003 тесно связана с Kerberos (хотя и с несколько модифицированной его версией), это способствовало его популярности и распространению. Возможно, вам придется настроить свою машину FreeBSD для интеграции с ним. Если вы хотите включить Kerberos в FreeBSD, то можете сделать это: строка kerberos_server_enable="YES" в /etc/rc.conf запустит службы, управляющие мастер-сервером Kerberos; если вы работаете с существующим мастер-сервером Kerberos, то можете убрать комментарии с соответствующих строк /etc/rc.conf для разрешения централизованной аутентификации для поддерживаемых им службами. Вот пример: login auth sufficient pamJcerberosIV.so try_first_j>as8 Дополнительную информацию о Kerberos можно получить на странице man kerberos и в онлайновом справочнике FreeBSD Handbook (http: //www. f reebsd. • org/handbook). Избежание проблем со службами открытого текста Передача информации между вашей машиной и сервером (в приложениях вроде Telnet, электронной почты и HTTP) может показаться вам безопасной; в конце концов, ваши пароли скрыты, и все передается крошечными пакетами данных, которые проходят по сети наряду с миллионами других пакетов. У кого хватит терпения применить сетевой эквивалент "жучка" и собрать вместе фрагменты интересующей транзакции?
Работа в сети FreeBSD Для этого они должны находиться в том же сегменте сети, что и ваша LAN или LAN на противоположном конце, либо же в системе поставщика услуг, обеспечивающего передачу. Кроме того, им нужно прибегать к хитростям и обладать оборудованием, достойным Джеймса Бонда. И если даже они это сделают, им придется подслушать множество таких сеансов, чтобы получить что-то интересное. У кого есть столько времени? Да у любого — вот у кого! Безопасность служб открытого текста (приложений, которые не шифруют свои транзакции) — это миф. Более того, безопасность через непонятность (security through obscurity) — предположение, что ваши коммуникации или службы безопасны, потому что вы считаете, что никто не уделит им внимания — не работает, будучи мифом, неоднократно доказавшим свою ложность за последние годы. Не впадайте в заблуждение, что хакеры не заинтересованы во взломе вашей системы. Всегда следует предполагать, что ваш трафик постоянно находится под наблюдением хакера с дурными намерениями. Использование tcpdump для мониторинга трафика Вы можете проиллюстрировать риски, которым подвергаются ваши сетевые службы открытого текста, используя сетевой анализатор пакетов (packet sniffer) — программный инструмент, следящий за всеми пакетами вашего сегмента сети и отображающий те из них, которые вас интересуют. Анализатор работает, помещая вашу Ethernet-карту в "беспорядочный режим" (promiscuous mode), когда она принимает все пакеты, которые видит в сети, вместо того, чтобы отбрасывать те, что адресованы не ей (информацию о пакетах читайте в главе 22). Эта программа затем применяет широкое разнообразие конфигурируемых фильтров к трафику, который она видит Именно так можно с ужасающей простотой извлечь интересующие пакеты из всего урагана сетевого трафика. Встроенный в FreeBSD анализатор пакетов называется tcpdump и находится в /usr/sbin. Его применение запрещено рядовым пользователям, которые получают ошибку Permission denied (He разрешено) на устройстве /dev/bpf 0 (фильтр пакетов Беркли); лишь администратор (root) может запускать эту программу. Назначение программы tcpdump — не протоколировать реальные данные пакетов TCP/IP, которые она видит (за этой функциональностью вы можете обратиться к tcpf low, доступной в портах /usr/ports/net/tcpf low, или GUI-ориентированной программе Ethereal, доступной на /usr/ports/net/ethereal). Программа tcpdump скорее похожа на Crack в том, что предназначена служить инструментом администратора для аудита безопасности, позволяющим видеть, сколько нешифрованного трафика проходит через вашу систему и следить за подозрительной сетевой активностью, которая может свидетельствовать о недопустимой деятельности части ваших пользователей. НА ЗАМЕТКУ Программу tcpdump можно использовать для шпионажа за деятельностью ваших пользователей, независимо от того, делают ли они что-то не то. Предупреждение в конфигурационном файле ядра generic напоминает вам о необходимости учета этических моментов в случае применения анализатора пакетов. Естественно, все зависит от того, какого рода систему вы эксплуатируете, но анализатор пакетов — это эквивалент телефонных "жучков" или скрытых камер безопасности, и потому вы должны применять tcpdump только в тех случаях, когда считаете себя вправе использовать жучки и скрытые камеры.
Безопасность сети I ГГ^ I 901 Глава 30 I w I Конфигурация tcpdump достаточно сложна, и позволяет вам выполнять много полезных и разнообразных задач. Все, что нас интересует прямо сейчас — это демонстрация опасности трафика TCP/IP с открытым текстом. Давайте настроим простой фильтр для мониторинга порта Telnet (порт TCP под номером 23): # tcpdump -х port 23 tcpdump: listening on fxpO tcpdump: прослушивание fxpO 20:14:19.076941 w044.2064002043.sjc-ca.dsl.cnc.net.54109 > W)12.z064002043.sjc-ca.dsl.cnc.net.telnet: S 1972342903:1972342903(0) ^win 32768 <mss 1460, nop, wscale 0, nop, nop, time stamp 465710 0> (DF) [tos 0x10] 4510 003c e44b 4000 4006 8024 4002 2b2c 4002 2b0c d35d 0017 758f 9077 0000 0000 a002 8000 001b 0000 0204 05b4 0103 0300 0101 080a 0007 lb2e 0000 0000 20:14:19.077050 w012.z064002043.sjc-ca.dsl.cnc.net.telnet > W)44.z064002043.sjc-ca.dsl.cnc.net.54109: S 1734674412:1734674412(0) *>ack 1972342904 win 17520 <mss 1460> (DF) 4500 002c c9c2 4000 4006 9acd 4002 2b0c 4002 2b2c 0017 d35d 6765 07ec 758f 9078 6012 4470 349c 0000 0204 05b4 2D:14:19.677472 w044.z064002043.sjc-ca.dsl.cnc.net.54109 > ^>w012.z064002043.sjc-ca.dsl.cnc.net.telnet: . ack 195 win 33580 (DF) 4>[tos 0x10] 4510 0028 e458 4000 4006 802b 4002 2b2c 4002 2b0c d35d 0017 758f 910a 6765 08af 5010 832c 0c49 0000 5555 5555 5555 AC 134 packets received by filter 134 пакета получено фильтром , 0 packets dropped by kernel 0 пакетов отброшено ядром Опция -х сообщает tcpdump о необходимости выводить последнюю часть полезной нагрузки каждого пакета в шестнадцатеричной форме; если эта опция не указана, tcpdump выводит только заголовки уровня канала. Вам может потребоваться указать -w "filename" для отправки вывода tcpdump в файл по имени filename, чтобы его было удобнее просматривать. Поскольку tcpdump не предназначен быть шпионской программой, он не декоди-. рует шестнадцатеричный вывод. Но при желании вы можете пропустить его через шестнадцатеричный редактор, такой как /usr/ports/editors/hexedit, и получить читабельный текст. Однако если вас интересует содержимое пакетов, то лучше воспользоваться другими программами (подобными tcpf low или Ethereal). Обеспечение дополнительной безопасности с шифрованными протоколами Данные tcpdump не шифруются вообще. Эта программа лишь предпринимает минимум усилий для того, чтобы увидеть полное содержимое каждого пакета, пересылаемого по Telnet. Это сделать легче с помощью других инструментов, которые
Работа в сети FreeBSD выполняют декодирование пакетов — таких как tcpf low, tcpshow и Ethereal. Если эти пакеты содержат сеанс регистрации пользователя, то нарушитель с помощью любой из этих программ сможет узнать пользовательский пароль и использовать их для проникновения в вашу систему. Эта брешь в защите подвергает также опасности трафик РОРЗ, IMAP, FTP и HTTP, а также каждую из небольших и несущественных служб вроде Finger и Syslog. Предосторожности против применения этих программ особенно важны в системах, где передаются пароли или любая другая важная информация. Защита коммуникаций в большей мере касается приватности, поскольку это вопрос безопасности. К счастью, существует способ решения проблемы программ-анализаторов. Вы можете использовать шифрованные альтернативы каждого из основных протоколов передачи данных, многие из которых являются частью инсталляции по умолчанию FreeBSD. Например, SSH (безопасная командная оболочка) — защищенная альтернатива Telnet, a SSL (уровень защищенных сокетов) — метод шифрования трафика Web, электронной почты и других служб. Латание дыр в безопасности, присущих службам открытого текста — это лишь предмет знания о существовании шифрованных версий, их реализации и убеждения пользователей использовать их. Защита терминального трафика (SSH) Терминальный трафик, который обычно идет от приложений Telnet или г log in — это результат взаимодействия удаленных пользователей с системами UNIX; вы, вероятно, привыкли подключаться к своей машине FreeBSD удаленно, как для использования ее в собственных целях, так и для решения административных задач. Однако применение терминала — возможно, наиболее рискованный тип трафика с открытым текстом, но это легче всего исправить. FreeBSD поставляется с полноценным пакетом SSH, предназначенным для замены Telnet и г log in. Пакет SSH называется OpenSSH, и изначально он был разработан для OpenBSD. OpenSSH позволяет пользователям устанавливать полностью шифрованное туннельное соединение с сервером, защищая их пароли регистрации и деятельность в командной строке от вмешательства и подслушивания. Сервер SSH, называемый sshd, запускается на порте 22 как автономный демон, который, подобно Apache, порождает новый процесс sshd для обслуживания каждого входящего подключения. Чтобы разрешить сервер SSH, добавьте следующую строку в файл /etc/rc.conf (если ее еще там нет) и затем перезагрузитесь (или просто введите команду /etc/rc.d/sshd start): sshd_enabIe="YES" Клиент SSH — замена Telnet. Чтобы использовать его вместо программы командной строки telnet, просто введите команду ssh вместо команды telnet: # ssh stripes.example.com Вместо того чтобы просто позволить серверу вывести его собственные приглашения Login: и Password:, клиент SSH сам запрашивает ваш пароль, предполагая, что удаленное имя пользователя совпадает с локальным. Вы можете специфицировать альтернативное имя пользователя, используя для этого пару других методов: # ssh 8tripes. example. com -1 frank # ssh frank@stripes.example.com
Безопасность сети Глава 30 903 Программа ssh устанавливает шифрованное соединение и передает данные регистрации серверу в безопасной манере. С этого момента она работает так же, как обычное соединение Telnet — нет никакого отличия с точки зрения пользователя. Пользователь систем FreeBSD, Linux, UNIX или Max OS X может использовать этот процесс для подключения к вашей машине. Пользователям настольных клиентских систем вроде Windows или классической Mac OS придется проделать небольшую дополнительную работу. Эти платформы имеют клиентские программы SSH командной строки, но есть также великолепные графические терминальные программы, которые включают в себя функциональность и Telnet, и SSH. Пользователи Windows могут обратиться к коммерческой программе SecureSSH (от Ван Дайка (Van Dyke), http: //www. vandyke. com) или же бесплатно распространяемой PuTTY (от Саймона Татема (Simon Tatham, http://www.putty.nl), а пользователи Mac OS 9 — применить NiftyTelnet/SSH или MacSSH. Ваша задача — убедить пользователей перейти с Telnet на SSH. Дайте им знать через публикацию вашей политики сервера, что им рекомендуется использовать SSH, чтобы защитить себя. Однако это не гарантирует, что они сразу начнут использовать его, и вы, как администратор, по-прежнему будете иметь дело с угрозой подслушивания соединений тех пользователей, которые решат не применять SSH. Более жесткий, но радикальный подход — отключить Telnet на сервере полностью и потребовать от пользователей перехода на SSH. Чтобы отключить Telnet, закомментируйте строку telnetd в файле /etc/inetd.conf: #telnet stream tcp nowait root /usr/libexec/telnetd telnetd После этого перезапустите процесс inetd: # /etc/red/inetd restart НА ЗАМЕТКУ SSH имеет две популярных разновидности протокола: SSH1 и SSH2. FreeBSD поддерживает оба, но SSH1 менее специализирован и потенциально более уязвим, чем SSH2. Вы можете отключить SSH1, добавив следующую строку в /etc/ssh/ssh_conf ig: Protocol 2 Однако обратите внимание, что не все клиенты SSH поддерживают SSH2. Не беспокойтесь об отключении SSH1, если только вы не обязаны это сделать. * СОВЕТ Даже если вы отключаете службу Telnet в inetd, рядовые пользователи все же могут запускать программу telnetd самостоятельно. По этой причине вы можете решить вообще удалить telnetd из системы, если придерживаетесь строгой модели безопасности. Защита почтовых служб (РОРЗ и IMAP) РОРЗ и ШАР — вероятно, даже еще более уязвимые службы открытого текста, чем Telnet. Если ваши пользователи настраивают свои почтовые клиенты на соединения с сервером каждые пять минут для проверки новых сообщений, то при каждом таком подключении происходит совершенно открытая передача регистрацион-
Работа в сети FreeBSD ной информации и паролей, в результате чего возникает еще большая опасность их перехвата — особенно потому, что эти службы пересылают свою важнейшую информацию через предсказуемые регулярные интервалы. Если вы применяете на сервере SSH вместо Telnet, то в ваших интересах сделать то же самое с вашими почтовыми службами. Из главы 25 вы узнали, как защитить программу Qpopper, чтобы она использовала встроенные в FreeBSD инструменты SSL для шифрования соединений РОРЗ. Тот же метод можно применить для защиты IMAP, используя программный пакет IMAP-UW. Вы можете разрешить поддержку SSL в IMAP-UW, генерируя сертификат у центра сертификации Certificate Authority (об этом говорилось в разделе "Включение шифрования SSL* главы 25). Если у вас есть сертификат, сгенерированный для другой службы (например, Qpopper) вашего сайта, вы можете использовать его для IMAP- UW. Обратитесь за подробностями к документации IMAP-UW по адресу http: / /www, washington.edu/imap/. Программа stunnel предоставляет альтернативный способ шифрования протоколов РОРЗ и IMAP, stunnel централизованно управляет вашими сертификатами SSL и не использует никакой встроенной в службы поддержки SSL. Также доступная в портах (/usr/ports/security/stunnel), программа stunnel позволяет вам установить универсальный туннель SSL для любой службы системы по вашему выбору. Если вы инсталлируете stunnel из портов, его сценарий запуска по умолчанию (/usr/local/ etc/rc. d/stunnel. sh. sample) запустит процесс-слушатель на порте 993 (для IMAP) и 995 (для РОРЗ), которые обычно являются общепринятыми портами для защищенных версий этих протоколов, как можно видеть в /etc/services. НА ЗАМЕТКУ Не забудьте переименовать stunnel. sh. sample в stunnel. sh, как упоминалось в разделе "Сценарии конфигурации ресурсов" главы 14. Суффикс .sample здесь — как намек, что вам нужно просмотреть содержимое этого сценария, чтобы убедиться, что пути к файлам сертификатов .рат указаны корректно. Если вы решите применить stunnel, вам все равно придется сгенерировать сертификат, как вы делаете это для Qpopper и IMAP-UW. Сертификат stunnel должен быть помещен в /usr/1Ъса1/etc/stunnel.pam. Когда он будет там, клиенты РОРЗ и IMAP должны получить возможность подключиться к соответствующим портам для установки безопасного соединения (993 вместо 143 для IMAP и 995 вместо 110 — для РОРЗ). ВНИМАНИЕ! Многие из популярных клиентских почтовых программ, такие как Microsoft Outlook и Apple Mail, поддерживают шифрование SSL для РОРЗ и IMAP, но другие имеют поддержку только одного из двух или вообще ее не имеют. В других клиентских почтовых программах такая поддержка несовершенна или необязательна. Требование к пользователям применять SSL означает иногда требование замены почтовых программ, что многим людям не нравится. Также обратите внимание» что stunnel не является заменой РОРЗ или IMAR Скорее, это обобщенная надстройка, добавляющая возможности SSL к любой специфицированной службе. Это значит, что рядовые службы РОРЗ и IMAP все равно
Безопасность сети должны быть включены; вы не должны удалять их из /etc/inetd. conf. Если вы хотите навязать политику "только безопасных подключений", то должны будете использовать IPFW (читайте ниже в настоящей главе)Г, чтобы запретить подключения к этим портам с любого хоста, отличного от localhost. Защита FTP Как вы узнали из главы 27, FTP — еще одна служба открытого текста, которая имеет унаследованную парольную аутентификацию и потому является потенциальным "слабым звеном**, уязвимым для нарушителей* прослушивающих кабельные соединения. FTP часто применяется пользователями для выполнения таких задач, как загрузка Web-страниц, но используется непредсказуемо, не через регулярные интервалы, как РОРЗ или ШАР. Это делает FTP чуть менее рискованным для вашей системы, чем Telnet, но, тем не менее, его также стоит защитить. К счастью, безопасный FTP также легко реализовать как SSH. Если вы включили SSH (как было рассказано выше в разделе "Защита терминального трафика (SSH)"), безопасный FTP уже доступен вашей системе. Сеансы шифрованного FTP в действительности работают поверх канала SSH, когда SSH-клиент имеет установленное терминальное соединение, запустив программу /usr/libexec/sf tp-server на стороне сервера и открыв обратное соединение с клиентом по шифрованным каналам. Безопасный FTP-клиент затем работает совершенно прозрачно для пользователя, подобно обычной программе FTP. В FreeBSD встроенная программа sf tp, являющаяся частью OpenSSH, обслуживает клиентскую часть сеанса FTP. В Windows пакет SSH Communications Security предоставляет безопасный клиент, работающий с FreeBSD. Упомянутые выше клиенты Mac OS (NiftyTelnet и MacSSH) также обладают возможностями безопасного FTP, a Mac OS X имеет инструмент командной строки sf tp. Безопасный FTP не столь конфигурируем как обычный FTP, и не использует ни одного из стандартных конфигурационных файлов, которые использует встроенный сервер FTP Вместо этого вы должны применять для безопасного FTP тот же конфигурационный файл, что и для SSH — /etc/ssh/sshd_conf ig (читайте подробности в man sshd_conf ig). Например, если вы хотите запретить определенным пользователям доступ к FTP, то для этого следует применить оператор DenyUsers, который блокирует доступ определенных пользователей в систему через безопасный FTP или SSH: DenyUsers frank joe НА ЗАМЕТКУ Анонимный FTP не поддерживается в модели безопасного FTP. Однако, поскольку основная цель шифрования — предотвратить передачу паролей пользователей в виде открытого текста, нет особого смысла в шифровании анонимного FTP, который не имеет паролей или отношения к вашим локальным пользователям. НА ЗАМЕТКУ Безопасный FTP (SFTP) имеет тонкие отличия от FTPS — похожего решения для защиты трафика FTP. За подробностями этих отличий обращайтесь по адресу http://www.ford-hutchinson. com/~fh-l-pfh/ftps-ext.html.
Работа в сети FreeBSD Альтернативный способ выполнения передачи файлов по защищенному каналу состоит в применении scp. Это средство позволяет вам копировать файлы на удаленный сервер и с него, используя аутентификацию на входе — почти таким же образом, как работает гср (подробности читайте в man rep и man scp), но с тем отличием, что scp работает по шифрованному туннелю SSH. Чтобы использовать scp для передачи файла с вашей локальной машины на удаленный SSH-сервер, выдайте команды вроде следующих: # scp file.txt в tripes: frank@stripes's password; file.txt 100% |*****************************| 511 00;00 Имя удаленного хоста указывается с завершающим двоеточием (:) и может быть как аргументом — источником, так и аргументом — местом назначения. Оба эти аргумента также могут содержать полные путевые имена файлов (например, scp file.txt stripes :public_html/text files). Использование scp — быстрый способ безопасной передачи файлов, если вам не нужны все средства полноценного FTP. Вы можете даже выполнить рекурсивные передачи, сделав scp удобным инструментом передачи целых структур каталогов. Защита Apache HTTP — протокол, по которому работает Web — вероятно, превалирующий протокол в Internet в наше время, и с каждым днем все больше и больше важной информации передается по этому протоколу. Безопасность HTTP жизненно важна для электронной коммерции, поскольку защищает номера кредитных карточек клиентов и информацию о платежах — что более важно, особенно для домашних пользователей Internet, нежели защита регистрационных имен и паролей. Защита HTTP особенно важна, если ваш бизнес зависит от обеспечения конфиденциальности информации ваших клиентов и приватности вашего обращения с ней. Ведущий HTTP- сервер FreeBSD, Apache, должен быть соответствующим образом защищен, если вы намерены использовать его для любого рода коммерческих или связанных с частной информацией целей. Защита HTTP была одним из первоначальных широких применений SSL. До последнего времени интеграция Apache с SSL была делом поставщиков коммерческого программного обеспечения, которые разрабатывали продукты на основе Apache, и существовали сравнимые, но конкурирующие бесплатные версии SSL-поддерживающего Apache. Однако после выхода версии Apache 2.0 SSL был интегрирован в инсталляцию программного обеспечения сервера по умолчанию, и включение его стало намного проще. Для пользователей Apache 1.3 и предшествующих версий мы расскажем о подходящих реализациях SSL. НА ЗАМЕТКУ Безопасный HTTP и HTTP с открытым текстом должны работать бок о бок. Было бы не слишком хорошей идеей обслуживать все HTTP-запросы по SSL, и это бывает редко. Web-сайты с напряженным трафиком страдали бы от снижения скорости из-за накладных расходов, связанных с шифрованием каждой страницы и графического изображения, независимо от того, содержат ли они важную информацию, поэтому такая практика по существующему соглашению не одобряется. Большая часть открытых Web-данных не нуждается в шифровании — в конце концов, она
Безопасность сети I Q~ Глава 30 I общедоступна. Но переключение в безопасный режим происходит, когда пользователь заполняет онлайновый заказ на покупку чего-либо, или же форму для сбора информации, что дает пользователям уверенность в том, что они находятся в надежно защищенной области. Помните, что вы обслуживаете пользовательские ожидания и конфиденциальность в такой же мере, как и пользовательские данные. Apache-SSL Apache-SSL — "официальная" безопасная реализация Apache, существовавшая до появления версии 2.0. Apache-SSL имеет более ограниченный набор средств, чем mod_ssl, и в основном ориентирован на стабильность и производительность, чем на поддержку развитых средств. Разработка Apache-SSL ведется в настоящее время не особенно активно — в основном из-за строго контролируемого набора средств и отсутствия известных ошибок. Двоичная программа Apache-SSL называется httpsd вместо httpd; идея в том, что вы должны запускать httpd для обслуживания рядовых HTTP-запросов на порте 80, a httpsd — для обработки шифрованных запросов на порте 443. Конечно, это значит, что вы должны иметь версию Apache без установленного SSL, чтобы обеспечить это. Apache-SSL можно инсталлировать из портов на /usr/posrts/www/apachel3-ssl, а официальный Web-сайт расположен по адресу http: //www.apache-ssl.org. Apache с mod_ssl mod_ssl — более полная и активная реализация SSL на HTTP, чем Apache-SSL. mod_ssl — стандартный модуль Apache, который встраивает OpenSSH в Apache, используя преимущество современной модульной архитектуры программного обеспечения. Это более прямое решение, чем Apache-SSL, включающее намного больше средств и более гибкую модель конфигурирования. Например, порт apachel3-modssl инсталлирует единственную исполняемую программу httpd — подобно обычному порту apachel3, но с тем отличием, что конфигурационные файлы имеют специальные настройки для включения соединений SSL, когда требуется: <IfDefine SSL> Listen 80 Listen 443 </IfDefine> Вы можете добавить дополнительные модули к Apache с mod_ssl; сюда входят mod_perl, mod_php и все остальные из /usr/ports/www. Особенностью mod_ssl является богатый и полный набор средств вместе с простотой конфигурирования; он не обязательно так быстр и устойчив, как Apache-SSL, но статистика на этот счет весьма скудна. В Apache 2.0 mod_ssl скомпилирован в бинарную программу httpd по умолчанию, и опции его настройки заданы в базовом конфигурационном файле /usr/local/etc/ apache2/ssl.conf, который при необходимости можно включить в httpd.conf. Apache с mod_ssl можно инсталлировать из /usr/ports/www/apachel3-modssl; его официальный Web-сайт — http: //www.modssl.org.
Работа в сети FreeBSD Запуск безопасного Web-сервера Инсталляция Apache-SSL или Apache с mod_ssl немного усложняет сопровождение вашего Web-сервера. Как упоминалось ранее, Apache-SSL работает на основе предположения, что вы запускаете обычный httpd для обработки стандартных соединений HTTP с открытым текстом, ahttpsd — для шифрованных запросов на порте 443. Это значит, что отдельная программа httpsdctl управляет Apache-SSL, работая точно так же, как apachectl с обычным Apache. Более того, программа httpsd.conf добавлена в /usr/local/etc/apache параллельно с httpd. conf. Эти отдельные программы не представлены при установке Apache с mod_ssl, потому что вся функциональность содержится в единственном наборе файлов (эти файлы знакомы вам по главе 26). Порты (и apachel3~ssl, и apachel3-modssl) инсталлируют полное дерево каталогов Apache, включая пиктограммы, примеры HTML-страниц, динамические модули и конфигурационные файлы. По этой причине вы должны позаботиться об обновлении параллельных инсталляций Apache-SSL и обычного Apache. Версия с modjssl имеет единственную инсталляцию, заменяющую стандартную инсталляцию Apache, так что его сопровождение потенциально намного проще. Управление вашими сертификатами OpenSSL Создайте собственные сертификаты OpenSSL, вновь воспользовавшись методом, представленным в разделе "Включение шифрования SSL7 главы 25. Обратите внимание, что mod_ssl ожидает нахождения сертификата в /usr/local/etc/apache2/ ssl.crt/server .crt, а закрытого ключа — в /usr/local/etc/apache2/ssl.key/ server.key. Вы можете исправить директивы в конфигурационном файле Apache, которые указывают эти файлы, чтобы они указывали на существующие сертификаты безопасности, используемые всей системой. В качестве альтернативы, поместите копии этих файлов сертификата в те места, где Apache их ожидает найти. Ваши сертификаты OpenSSL читаются интерактивно в большей мере Web-браузером, чем другими безопасными службами, поэтому вам нужно особо позаботиться о том, чтобы они соответствовали реальности. Если имя хоста в сертификате не соответствует имени хоста сервера, или если сертификат не подписан известным центром сертификации (другими словами, подписан вами самостоятельно), то пользователь получит диалог, показывающий всю информацию о сертификате, и будет запрошено подтверждение того, должен ли браузер принять его. Этот диалог может привести в замешательство ваших пользователей и подорвать их веру в безопасность вашего сайта. Даже если ваш сертификат правильно соответствует информации вашего сайта, пользователь может видеть содержимое сертификата с помощью средства браузера Security Information (Информация безопасности), так что все поля, специфицированные вами при генерации запроса сертификата, будут видимы любой заинтересованной стороне. Имейте это в виду — очень трудно изменить информацию в сертификате после того, как он подписан. Плохо написанные CGI-сценарии Трафик открытого текста — не единственная брешь в безопасности инсталляции Apache. Если ваша модель безопасности не предусматривает доверия вашим локаль-
Безопасность сети ным пользователям, вы также должны позаботиться о возможности пользовательских CGI-сценариев нанести ущерб системе (намереннб или нечаянно) и разрушить файлы. Многие файлы в корне документации Apache принадлежат пользователю www или nobody (особенно файлы, создаваемые динамически вашими собственными программами стороны сервера); тот же пользователь www выполняет все CGI-програм- мы. С учетом этих фактов, CGI-программе не составит труда удалить или модифицировать что-нибудь еще на сервере, что принадлежит www. Это может случиться чаще, чем вы можете представить. Все, что для этого необходимо пользователю — написать CGI-программу, которая удаляет его собственные ненужные файлы, но при этом допустить ошибку в выборе пути к этим файлам. То же может произойти в программе, печатающей данные в файл и могущей потенциально повредить пользовательские данные. Даже наиболее опытные ветераны CGI иногда попадают в эту ловушку. Опасность, конечно, возрастает многократно, если в вашей системе завелся пользователь-вредитель, которые сознательно решит написать вредоносный сценарий для выполнения Apache от имени www. Решение этой проблемы состоит в запуске Apache внутри программы-**оболочки", которая перехватывает пользовательские CGI-программы, выполняет проверку их безопасности (убеждаясь в соответствии привилегий), и исполняет их от имени пользователей — их владельцев, а не от www. Это традиционно делается с помощью оболочки suexec, поставляемой вместе с Apache, но более удобное в применении и гибкое решение предлагается программой CGIwrap, разработанной Натаном Неулингером (Nathan Neulinger). Повышение безопасности CGI-сценариев с помощью CGIWrap Программа CGIwrap, доступная в портах /usr/ports/www/cgiwrap, предоставляет два преимущества в отношении безопасности. Она защищает пользователей и корень сервера от ущерба со стороны плохо написанных CGI-сценариев, а также позволяет пользовательским CGI-программам писать файлы, которые эти пользователи могут сами модифицировать или удалять из командной оболочки. В идеальном мире, где программы всегда пишутся идеально, и никто не пытается повредить чужие файлы, пользовательская CGI-программа могла бы выполняться пользователем, которому она принадлежит, а не непривилегированным пользователем www. Однако наш мир далеко не идеален — люди пишут CGI-сценарии, полные ошибок, и повсюду кишат хакеры. Поэтому довольно просто пользователю создать CGI-программу, принадлежащую root, поместить ее в его каталог и ожидать, когда она будет выполнена владельцем (суперпользователем), нанеся вред любым файлам системы. CGIWrap предохраняет систему от проблем подобного рода. Это не полное и не идеальное решение, однако оно существенно снижает риски для безопасности, связанные с пользовательскими CGI-сценариями, так что вы можете направить административные усилия на что-то другое. Запуская проверки безопасности для всех пользовательских CGI-программ перед тем, как выполнять их, CGIWrap смещает риски, которые исходят от плохо написанных CGI-программ от вас к их владельцам. Когда вы инсталлируете CGIWrap из каталога портов, программа cgiwrap (предварительно компилированный бинарный файл) помещается в каталог cgi-bin верхнего уровня, то есть /us r/ local /www/ cgi-bin. Вместо того чтобы служить оболоч-
Работа в сети FreeBSD кой вокруг самого Apache, как это делает suexec, CGIWrap должна явно вызываться вашими пользователями с помощью URL следующего вида: http://www.example.com/cgi-bin/cgiwrap/frank/myscript.cgi Или как включение серверной стороны: <!—#include virtual*"/cgi-bin/cgiwrap/frank/myscript.cgi"—> Это запустит программу myscript.cgi в /home/frank/public_html/cgi-bin. Все пользовательские CGI-программы должны находиться в их собственном каталоге public_html/cgi-bin, который пользователь должен создать, если таковой еще не существует. СОВЕТ Программы CGI вне пользовательского каталога public_html/cgi-bin не будут выполнены через CGIWrap, поэтому важно, чтобы вы запретили исполнение CGI вне серверного DocumentRoot. Чтобы сделать это, удостоверьтесь, что у вас нет директивы options +ExecCGi в блоке, определяющем пользовательские каталоги, и убедитесь, что пользователи не могут переопределить эту установку в файлах .htaccess (то есть AllowOverride Options не установлено для /home). Официальная домашняя страница CGIWrap расположена па адресу http : // cgiwrap.UNIXtools.org/. Предотвращение ретрансляции SMTP Слабостью защиты вашего сервера Sendmail можно считать его открытость всем для пересылки почты через него. В наши дни открытый ретранслятор почты — почти синоним сервера, обслуживающего спамеров, рассылающих ''мусорные" сообщения и ворующих ресурсы ваших служб. Более того, вы становитесь субъектом запрета в обслуживании, если другие поставщики почтовых услуг добавляют вас в свои черные списки — списки запрещенных удаленных адресов, обмен почтой с которыми полностью запрещен, потому что ваш сервер является открытым и незащищенным ретранслятором почты. Важно сконфигурировать Sendmail так, чтобы ваши собственные легитимные пользователи и их корреспонденты могли продолжать использовать ваш SMTP-сервер, а неавторизованные спаме- ры, желающие посылать почту, которая не была отправлена и не была предназначена вашему серверу, не могли это делать. Соответствующие сведения приведены в разделе "Понятие ретрансляции" главы 25. Системные профили безопасности и безопасность ядра (Securelevels) До появления версии 5.0 система FreeBSD конфигурировалась для обеспечения уровня защиты поверх ее ядра, и пользовательский процесс, реализующий этот механизм, назывался Securelevels. Вы выбираете настройку securelevels во время инсталляции FreeBSD, и она навязывала защиту, такую как установка флага "неизменности" (immutable flag) на ядро, так что даже root не мог удалить или перезаписать его.
Безопасность сети | 77^ I Глава 30 I I К сожалению, Securelevels доказал свою неэффективность (подробности изложены на http://www.securiteam.com/unixfocus/5NP0G0AHFC»html), и настройка securelevels была исключена из стандартной инсталляции и процедур конфигурирования системы в современных версиях FreeBSD. Однако функциональность Securelevels все еще присутствует в FreeBSD, и при желании вы можете включить ее. Кроме того, возможно, вам придется сопровождать унаследованную систему FreeBSD, которая была сконфигурирована с защитой Securelevels, а это значит, что вы должны понимать, как это средство взаимодействует с вашей системой. В настоящем разделе мы объясним концепции, лежащие в основе Securelevels в интересах таких пользователей. Каркас MAC Исключение Securelevels не следует воспринимать так, будто FreeBSD стала менее безопасной. Наоборот, теперь поощряется применение пользователями меток MAC (Mandatory Access Control — принудительный контроль доступа) — гораздо более тонкой и гибкой схемы защиты, которая позволяет администратору осуществлять гораздо более высокую степень контроля пользовательского доступа к системным ресурсам, таким как файлы, сокеты и процессы. Конфигурация меток MAC, однако, исключительно сложна и требует четко придерживаться дисциплины. К сожалению, эта тема выходит далеко за пределы настоящей книги, где безопасности посвящена всего одна глава. Если требования безопасности вынуждают вас применить каркас MAC, то полный курс можно найти в справочнике по FreeBSD на http://www.freebsd.org/ handbook/mac.html. Ядро FreeBSD запускается с разными уровнями безопасности, контролируемыми опцией kern_securelevel в /etc/rc.conf. Эти уровни бывают от -1 до 3. Каждый из этих уровней соответствует профилю, контролирующему такие вещи, как возможность замены ядра на диске, возможность загрузки и выгрузки модулей ядра, возможность установки и смены определенных файловых привилегий и флагов, а также возможность монтирования файловой системы по требованию. Профиль также контролирует, можно ли отключать и модифицировать такие утилиты, как встроенный брандмауэр IPFW (о нем речь пойдет ниже в этой главе). Как вы уже знаете из главы 18, установку secure level можно повышать только во время выполнения — вы никогда не можете понизить ее, кроме как перезагрузкой. Во время инсталляции FreeBSD вы видели установку второго многоуровневого профиля сетевой безопасности. Вы можете увидеть ее вновь в Sysinstall — под опцией Configure (Конфигурация), за которой следует опция Security (Безопасность). Это меню позволяет выбрать один из двух профилей безопасности для всей системы: Medium (Средняя) или Extreme (Очень высокая). Эти профили контролируют необходимость выполнения таких служб, как Sendmail, sshd и inetd, и имеют очень приблизительное отношение к уровням безопасности ядра. В табл. 30.1 показаны схемы каждого из этих профилей безопасности, и какие опции каждый из них устанавливает в /etc/rc.conf. Таблица также включает профили безопасности Low (Низкая) и High (Высокая), которые существовали до версии FreeBSD 4.6. Если ваша система изначально инсталлировалась с ранней версией, то вы, вероятно, видели все четыре профиля.
912 Работа в сети FreeBSD Часть V Таблица 30.1. Профили безопасности всей системы Имя профиля Установки /etc/rc.conf Low Medium High Extreme sendmail_enable-,,YES" sshd_enable«"YESw portmap_enable="YES" inetd_enable="YES" sendmail_enable="YES" sshc^enable^YES" inetd_enable«"YES" kern_securelevel-"1" kern_securelevel_enable="YES" sendmail_enable=,,YES,, sshd_enable=,,YES" portmap_enable=nNO" nfs_server_enable«,rNO" inetd_enable="NO" kern_securelevel="2" kerr^securelevel^enable^'YES" s e ndma i l_en ab 1 e-fl NO w sshd_enable="NO" portmap_enable=,,NO" nfs_server_enable=,,NO" inetd епаЬ1е="ЫОИ Как можно ожидать, профиль Extreme является ограничивающим — вплоть до состояния, делающего систему бесполезной. Уровень securelevel ядра устанавливается в 2, а это означает, что ядро не может быть модифицировано (модулями ядра) или заменено без перезагрузки в однопользовательский режим; единственный способ монтирования и размонтирования файловых систем — явный вызов команд mount и umount (неявное монтирование по требованию, как с amd, не допускается). Вдобавок запрещены inetd, Sendmail, sshd, NFS-сервер и ряд других служб. Профиль High чуть менее ограничен, в нем securelevel, равный 1, а это означает, что файловые системы легче монтируются, но ядро по-прежнему не может быть модифицировано. Sendmail и sshd разрешены, но прочие службы из профиля Extreme — нет. Конечно, поскольку профили безопасности работают просто установкой опций в /etc/rc.conf, вы можете смешивать установки из табл. ЗОЛ по своему усмотрению, создавая профиль безопасности, отвечающий вашей собственной модели функционирования системы. ВНИМАНИЕ! Обычно вы никогда не должны разрешать службу, которая, как вы думаете, вам не понадобится. Если она не делает что-то полезное, то она, как минимум, бесполезна; хуже того — она представляет угрозу безопасности, открывающую в защите вашей системы нежелательные бреши. Поэтому вам следует сохранять ее безопасной, насколько это возможно.
Безопасность сети I q7q"H Глава 30 I I Использование брандмауэра Бесспорно, что брандмауэры (машины, работающие как маршрутизаторы с фильтрами) почти обязательны для Internet-серверов. Скучающие бездельники, которые не находят лучшего занятия, чем пытаться взламывать чужие системы с помощью легкодоступных хакерских инструментов, сделали защиту вашей системы обязательной. Большинство администраторов нуждаются в защите, выходящей за пределы простого отказа от запуска определенных служб и находящейся среди лидеров списка бюллетеней безопасности. Нужен обобщенный щит уровня ядра, который полностью предотвратит доступ к вашей системе через определенные порты, с определенных хостов или по определенным протоколам. Брандмауэры, в частности IPFW, который поставляется с FreeBSD, предоставляет средство удовлетворения таких потребностей. Брандмауэр может предотвратить значительное большинство случайных атак за счет того, что пропускает лишь трафик, который вы определите как допустимый для поступления в вашу систему. Но даже самые дорогие и устойчивые брандмауэры становятся бесполезными при неправильной конфигурации. Большинство неэффективных брандмауэров становятся такими именно из-за неправильной конфигурации, а не из-за низкого качества или дизайна. ВНИМАНИЕ! Ничто не заменит правильно спроектированную и тщательно сопровождаемую политику безопасности, используемую в сочетании с качественным брандмауэром; не думайте, что если вы просто купили более дорогой брандмауэр, то ваши проблемы с сетевой безопасностью уже решены. Такой образ мышления приводит к появлению огромного большинства брешей в безопасности, которые можно видеть в современной сети Internet. Брандмауэр позволяет сконфигурировать вашу систему для фильтрации пакетов, основанной на определенных критериях, специфицированных вами, и запрете нежелательного трафика на уровне ядра (прежде чем он достигнет любой критичной службы системы). Брандмауэры также помогают в администрировании, поддерживая статистику использования вашей системы и наблюдения за объемами и направлением трафика. Брандмауэр IPFW решает обе задачи: вы можете запустить его непосредственно на машине FreeBSD, или же использовать его в системе, служащей маршрутизатором- шлюзом, который защищает множество хостов внутри локальной сети. На рис. ЗОЛ показан второй случай, где машина FreeBSD с тремя картами Ethernet служит маршрутизатором-шлюзом (как вы видели в главе 28), передавая пакеты между внутренней (LAN) "демилитаризованной зоной" (DMZ) и внешней (WAN) сетью (маршрутизаторы-шлюзы подробно рассматриваются в главе 28). НА ЗАМЕТКУ "Демилитаризованная зона" (DMZ) — это сеть, которая передает трафик WAN непосредственно, а не находится в LAN. DMZ, в частности, удобны в случаях, когда IP-адреса LAN транслируются (как вы знаете из раздела "IP-адреса" главы 22). DMZ предоставляет предприятию или поставщику Internet-услуг сеть, в которую помещаются нетранслируемые "пограничные" машины — такие как Web-серверы, почтовые шлюзы и другие хосты, к которым необходим прямой доступ из Internet.
914 Работа в сети FreeBSD Часть V DMZ можно конфигурировать под защитой правил брандмауэра, работающего на маршрутизаторе-шлюзе. Обычно это желательно, но некоторые специальные случаи требуют, чтобы DMZ не подчинялись правилам брандмауэра локальных сетей. Ваша конкретная ситуация в сети продиктует ваши нужды. Internet (WAN) Маршрутизатор- шлюз LAN DMZ й~й Ъ Рис. ЗОЛ. Диаграмма маршрутизатора-гилюза, представляющего службу брандмауэра, которая показывает интерфейсы LAN, DMZ и WAN Включение брандмауэра IPFW не поддерживается ядром GENERIC. Вы можете скомпилировать определенные опции в специализированное ядро для разрешения IPFW, включая IPFIREWALL, IPFIREWALL_VERBOSE и IPFIREWALLJ/ERBOSE_LIMIT=10. Однако вам не нужно собирать новое ядро для того, чтобы использовать IPFW; он доступен в виде модуля ядра, загружаемого автоматически сценарием /etc/re.network. Чтобы включить брандмауэр без перестройки ядра, добавьте следующие строки в /etc/rc. conf: firewall_enable="YES" f irewal l_type= " open " Вторая строка не обязательна, к тому же она не рекомендуется для сетей с высоким уровнем безопасности. Если вы не специфицируете тип брандмауэра как "open", то единственным правилом, с которым будет запущен IPFW, будет правило по умолчанию, с индексом 65535 (максимальным), специфицирующим deny ip from any to any. Другими словами, если вы перегрузите IPFW в его конфигурации по умолчанию, то ваша машина будет полностью блокирована от сети и вам придется использовать только ее физическую консоль, чтобы вернуть ее обратно. Для максимальной безопасности лучше оставить брандмауэр в его конфигурации по умолчанию и затем добавлять специфические правила, разрешая трафик с определенных хостов и на определенных портах. ВНИМАНИЕ! Опасно экспериментировать с IPFW, если у вас нет консольного доступа к системе, потому что очень легко ввести машину в недоступное состояние. До тех пор, пока вы не почувствуете себя достаточно комфортабельно с IPFW, и будете точно знать, что вы делаете, всегда сначала убедитесь, что у вас есть доступ к машине через ее консоль на случай, если что-то пойдет не так.
Безопасность сети Глава 30 915 Если вы заблокируете вашу машину от сети в процессе экспериментов с IPFW, единственный способ восстановить ее — пойти туда, где она находится физически и войти в систему с ее консоли. Затем вы можете отключить IPFW, удалив строки в /etc/rc.conf, или же исправить конфигурацию и выполнить перезагрузку. Один трюк для предотвращения попадания в эту ловушку состоит в установке задания сгоп на отключение брандмауэра каждые пять минут (/etc/red/ipfw stop); включайте эту автоматизированную команду в качестве "страховочной веревки" всякий раз, когда экспериментируете с брандмауэром. Таким образом, если вы нечаянно заблокируете себя, то вам достаточно будет подождать пять минут и система вновь станет доступной. Установка open изменяет правила по умолчанию так, что трафик IP передается (разрешен) по умолчанию, а не блокируется. Блокирование трафика по умолчанию создает действительно безопасную систему, но оно может оказаться излишним для систем, находящихся в защищенном окружении. В то же время разрешение трафика по умолчанию (блокирование только специфицированного IP-трафика) исключает возможность создания полностью безопасной системы. Применяйте установку open, если ваша система находится в сети, которая уже защищена брандмауэром; вероятно, нет смысла применять одну и ту же защиту дважды. После того, как вы правильно настроите /etc/rc.conf, перезагрузитесь. Альтернативно вы можете выполнить команду /etc/rc.d/ipfw start с физической консоли (не с удаленного терминала, что очень опасно, потому что может вызвать потерю сетевого соединения с вашей машиной, и она станет недоступной). О том, что брандмауэр правильно работает, вы узнаете из следующих строк вывода: Kernel firewall module loaded Модуль брандмауэра ядра загружен Flushed all rules. Выгружены все правила. 00100 allow ip from any to any via loO 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any Firewall rules loaded, starting divert daemons:. Все правила загружены, запуск демонов отклонения:. Вы можете также использовать kids tart для того, чтобы убедиться, что модуль IPFW был автоматически загружен: # kldstat Id Refs Address 1 3 ОхсОЮОООО 2 1 OxcOeeeOOO 3 1 0xc0fl9000 Size 355be4 6000 12000 Name kernel ipfw.ko linux.ko Теперь вы имеете полный доступ к команде ipfw, которая позволяет устанавливать правила, регулирующие то, какого рода трафик разрешать, и видеть учетную информацию, аккумулируемую IPFW. Проектирование правил IPFW Команда ipfw служит для добавления и исключения правил для фильтра ядра и системы учета. Правила конструируются в синтаксисе, который похож на естественный английский язык; они состоят из действия (такого как deny), протокола, к кото-
916 Работа в сети FreeBSD Часть V рому действие применяется (наподобие tcp), и адреса спецификации, включающей конструкции from и to. Такое правило, как deny tcp from badhost. com to any, например, блокирует трафик TCP от хоста по имени badhost. com. Вы должны добавить это правило к брандмауэру ядра следующим образом: # ipfw add deny tcp from badhost.coin to any Возможны различные вариации формулировки правила. Вы можете специфицировать адрес на основе сетевой маски — либо шаблоном маски (например, 255.255.255.0), либо битовой маской CIDR (например, /24). Можно также блокировать индивидуальные порты, а не всю систему; эта техника предотвращает хосты крупного поставщика Internet-услуг с непредсказуемыми IP-адресами от обращения к единственной службе на вашей машине. Такое правило может выглядеть примерно так: # ipfw add deny all from avll.iap.com/16 to www.axampla.com 80 Аналогично, вы можете освободить хосты от ранее наложенных правил, добавляя слово allow, как исключения, примерно так: # ipfw add allow all from goodho8t.avil.isp.com to www.axampla.com 80 Что еще более удобно — вы можете блокировать или разрешать трафик от любого внешнего хоста на основе того, используется ли порт TCP или UDP. Например, вы можете разрешить только Web-трафик или трафик электронной почты на ТСР-пор- ты сервера 80 и 25 соответственно: # ipfw add deny tcp from any to www.axampla.com # ipfw add allow tcp from any to www.axampla.com 80 # ipfw add allow tcp from any to www.axampla.com 25 Обратите внимание, что правила IPFW вводятся "цепочкой", в которой каждое правило вычисляется в порядке его указания. Каждое правило имеет номер индекса, обычно отделенный на 100 единиц от соседних, которым вы можете управлять, указывая его после ключевого слова add или deny в команде ipfw; так вы можете указывать порядок выполнения ваших правил. Просмотреть существующий набор правил можно с помощью команды ipfw -a list: # ipfw -a list 00100 0 0 allow ip from any to any via loO 00200 0 0 deny ip from any to 127.0.0.0/8 00300 0 0 deny ip from 127.0.0.0/8 to any 00400 0 0 deny tcp from badhost.com to any 00500 0 0 ipfw add deny all from evil.isp.com/16 to www.example.com 80 00600 0 0 ipfw add allow all from goodhost.evil.isp.com to 4>www. example. com 80 65000 1214 79688 allow ip from any to any 65535 1 40 deny ip from any to any Номер индекса показан в первом столбце; правило номер 65535, как вы видели ранее — это правило deny по умолчанию, которое отвергает все, что указано выше. Установка open помещает allow над правилом deny; однако правило allow имеет высокий номер индекса, чтобы гарантировать, что оно будет следовать после любого другого правила, которое вы можете добавить стандартным образом. Второй и третий столбцы показывают статистику использования, отображая общее количество пакетов и байтов, которые отвечали каждому правилу. Благодаря этому вы можете убедиться в том, что ваши правила действуют.
Безопасность сети Глава 30 Поиск неполадок в IPFW Вы можете обнаружить, что то, что казалось вам очень ясной и однозначной конфигурацией, дает совершенно непредсказуемые результаты. Например, вы могли добавить правило deny для всех хостов и allow — для IP-адреса вашей собственной удаленной машины, но все равно не получить доступа к машине FreeBSD. Всегда следует помнить, что правила IPFW специфицируются и применяются в определенном порядке. Правило, указанное позже в списке, заменяет правило, указанное раньше; пакет проверяется по каждому правилу в порядке их указания по номеру индекса. В большинстве случаев (хотя это зависит в определенной мере от предпринятых действий и системных установок) пакет продолжает проверяться по дополнительным правилам, которые могут соответствовать в более специфичной манере; именно так работают правила "исключений". Однако правило "по умолчанию" с индексом 65535, соответствует только тем пакетам, которые не соответствуют никаким другим правилам. Убедитесь, что индексы ваших правил идут в порядке возрастания, то есть в порядке их спецификации. Чтобы упростить конфигурацию, рассмотрите использование конфигурационного файла брандмауэра, о котором речь пойдет ниже. Вы можете специфицировать множество различных типов брандмауэров в /etc/ rc.conf. Каждое ключевое слово имеет отдельное значение, как показано в табл. 30.2. Точные определения этих профилей может быть расшифровано по коду сценария оболочки в /etc/rc.firewall. Таблица 30.2. Доступные типы брандмауэров Ключевое слово Значение Разрешить доступ от всех ко всем. Запретить все IP-адреса за исключением интерфейса обратной петли (1о0). Установить правила, предназначенные для защиты только данной машины. Установить правила, предназначенные для защиты всей сети. По умолчанию: не загружаются никакие правила, кроме правила deny по умолчанию с индексом 65535. Загружает правила из файла filename. Для ваших целей, если вы настраиваете несложный "законсервированный" профиль IPFW, может подойти такой, как client или simple. Однако с развитием вашей системы, вероятно, вам понадобится более специализированная конфигурация. Применение конфигурационного файла брандмауэра Поскольку правила брандмауэра не постоянны (они очищаются при каждой перезагрузке), вам понадобится поддерживать брандмауэр конфигурационным файлом, если вы корректируете настройки брандмауэра. Это также дает преимущество, выражающееся в облегчении сопровождения и поиска неисправностей, чем при работе с IPFW из командной строки. Поместите специализированный набор правил в файл по своему выбору; для данного примера назовем его /etc/firewall.conf. Перечислите в этом файле нужные вам правила, пропуская саму команду ipf w: open close client simple UNKNOWN filename
Работа в сети FreeBSD add deny top from badhost.com to any add deny all from evil.isp.com/16 to www.example.com 80 add allow all from goodhost.evil.isp.com to www.example.com 80 add 65000 allow all from any to any Теперь измените firewall_type в своем файле /etc/rc.conf: firewall_type='7etc/firewall.conf" После следующей перезагрузки либо запуска /etc/netstart или /etc/red/ipfw start правила из /etc/firewall.conf будут загружены с индексами 100, 200, 300 и так далее. Правило allow all с индексом 65000 представляет поведение по умолчанию, разрешая передачу трафика, а не запрещая его, что желательно в большинстве случаев (если только вы не хотите специфицировать конкретный список хостов, которым разрешен доступ к вашей машине). Дополнительную информацию о IPFW читайте на странице man IPFW и в онлайновом справочнике FreeBSD Handbook на http://www.freebsd.org/handbook. Предотвращение проникновений и компрометации Брандмауэры, политики паролей и шифрование образуют длинный путь к защите вашей машины от злонамеренного доступа. Однако всего этого недостаточно, чтобы защититься от действительно настойчивых хакеров, которые вооружены инструментом типа "rootkit" или другими инструментами, предназначенными для использования некоторых слабых мест в службах вашей системы. Вы можете применять широкое разнообразие инструментов от независимых разработчиков в FreeBSD, функциональность которых выходит за пределы простого брандмауэра для динамического блокирования подозрительных хостов, мониторинга проникновений и контроля доступа к индивидуальным службам на основе "хост- хост". В следующих разделах рассматриваются некоторые из этих инструментов. Использование PortSentry Программа PortSentry от Psionic Software — это демон, который выполняет мониторинг всего входящего сетевого трафика для обнаружения сканирования портов — предварительной атаки, посредством которой хакеры проверяют вашу систему на наличие открытых служб, которые могут быть использованы. PortSentry слушает порты по списку, указанному вами. Когда PortSentry обнаруживает трафик, которые может указывать на попытку сканирования порта, он блокирует доступ этого хоста к вашей системе, "заворачивая" его по маршруту "черной дыры" (маршрут, который молча отбрасывает пакеты от заданного IP-адреса или диапазона адресов) или правилу IPFW. Все последующие попытки подключения от этого хоста пресекаются. PortSentry наблюдает за трафиком TCP и UDP, динамически строя таблицу запрещенных адресов, которая работает как антитело простив вируса. PortSentry реагирует на подозрительную активность, блокируя ее прежде, чем она получит возможность нанести любой вред. PortSentry — инструмент с открытым кодом и может быть инсталлирован из коллекции портов (/usr/ports/security/portsentry). Бинарный файл portsentry устанавливается в /usr/local/bin, а его конфигурационным файлом является
Безопасность сети | ГТТ I Глава 30 I I /usr/local/etc/portsentry.conf. Откройте этот файл в текстовом редакторе; его нужно отредактировать, чтобы PortSentry работал правильно. Вы должны решить, какой набор портов вы желаете поместить под надзор PortSentry. Существуют три возможных набора, описываемые парами TCP_P0RTS и UDP_P0RTS: # Un-comment these if you are really anal: # Уберите комментарий здесь, если вы действительно дотошный: #TCP_P0RTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,513,514... #UDP_P0RTS-"1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,518,635,640... # # Use these if you just want to be aware: # Используйте это, если вы просто хотите быть осведомленными: TCP_PORTS="l,11,15,111,119,540,635,1524,2000,5742,12345,12346,20034,31337... UDP_P0RTS="1,7,9,69,161,162,513, 635,640,641,700,32770,32771,32772,32773... # # Use these for just bare-bones # Используйте это для простой основы #TCP_P0RTS="1,11,15,110,111,143,540,635,1080,524,2000,12345,12346,20034... #UDP_P0RTS="1,7,9,69,161,162, 513, 640, 700, 32770,32771,32772,32773,32774... Первый набор довольно-таки велик; он предназначен для очень строгой политики безопасности, согласно которой любой подозрительный удаленный порт вызовет срабатывание блокирующего правила. Второй набор более умеренный, а третий — минимальный, наблюдающий только за теми портами, с которыми удаленный пользователь, скорее всего, не должен контактировать, если только не выполняет сканирование портов или пытается запустить какую-то вредоносную программу. Средний набор включен по умолчанию. Чтобы переключиться на один из двух других, закомментируйте средний набор и уберите комментарии с того, который вас интересует. При желании вы можете создать свой собственный набор. Убедитесь, что ни один из портов, используемых вашими основными службами, не включен в этот список! Например, порт 143 перечислен во всех трех примерах наборов, но 143 — это порт IMAP. Если вы запускаете службы IMAP, исключите из списка порт 143. Если же эта служба не используется, оставьте его — это позволит поймать нарушителя, который пытается проникнуть через связанные с IMAP дефекты защиты. После выбора портов для мониторинга вы должны выбрать метод блокировки подозрительных хостов. Вы можете сделать это через IPFW (если он запущен, как было описано выше в настоящей главе) или через маршруты "черной дыры" (если вы не запускаете IPFW). Выбор метода включает удаления комментария с единственной строки с KILL_ROUTE, специфицирующей систему команд, которые программа PortSentry должна применять для блокирования хоста-нарушителя. Для систем, использующих IPFW, уберите комментарий со строки в portsentry. conf, содержащей /sbin/ipfw: # For those of you running FreeBSD (and compatible) you can # use their built in firewalling as well. # Те, кто работает в FreeBSD (и совместимых системах), могут # также использовать встроенные возможности брандмауэра. # KILL_R0UTE='7sbin/ipfw add 1 deny all from $TARGET$:255.255.255.255 to any" Если же вы не используете IPFW, примените метод "черной дыры", который, несмотря на комментарий, работает почти так же хорошо, как IPFW:
920 Работа в сети FreeBSD Часть V # FreeBSD (Not well tested.) # FreeBSD (He очень хорошо протестирован.) KILL_ROUTE="route add -net $TARGET$ -netmask 255.255.255.255 Ь127.0.0.1 -Mackhole" После того, как вы включите метод блокировки, PortSentry готова к запуску. Однако на момент написания книги порт PortSentry не поставлялся с автоматизированным сценарием запуска. Вы можете воспользоваться сценарием, представленным в листинге 30.1, сделав его исполняемым и скопировав в каталог /usr/local/etc/ re. d, для запуска PortSentry при каждой загрузке системы. Листинг 30.1. Пример сценария запуска PortSentry — portsentry.sh #!/bin/sh PORTSENTRY^Vusr/local/bin/portsentry" case "$1" in start) ${PORTSENTRY} -tcp && echo " Запуск TCP-режима PortSentry..." ${PORTSENTRY} -udp && echo " Запуск UDP-режима PortSentry..." / ? stop) killall 4basename ${PORTSENTRY}^ } r *) echo "" echo "Использование: xbasename $04 { start I stop }" echo "" r t esac СОВЕТ Во время работы PortsEntry вы можете просмотреть, какие порты находятся в режиме прослушивания, используя команду sockstat: # sockstat USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS root portsent 2432 root portsent 2432 root portsent 2432 2 udp4 *:9 *:* root portsent 2432 3 udp4 *:69 *:* root portsent 2432 root portsent 2432 Каждый раз, когда PortsEntry обнаруживает попытку атаки, он вносит хосты и порты, инициировавшие обнаружение, в списки /usr/.local/etc/portsentry. blocked, tcp для атак TCP и /usr/local/etc/portsentry.blocked.udp для атак UDP. PortsEntry использует эти списки для того, чтобы следить за тем, какие хосты он уже блокировал, дабы не блокировать их снова позже. Вы также можете использо- 0 1 2 3 4 5 udp 4 udp4 udp 4 udp 4 udp4 udp 4 *:1 *:7 *:9 *:69 *:161 *:162
Безопасность сети I ГГ^ | 1 921 I Глава 30 1 _ I вать эти файлы, чтобы увидеть, какие хосты были перехвачены вашей системой обнаружения атак. Эти файлы автоматически очищаются при каждом запуске PortSentry. Когда вы перегружаетесь, то как IPFW, так и таблица маршрутизации очищается от любых элементов, добавленных во время выполнения, так что хост, который был заблокирован ранее, опять получает доступ к вам — по крайней мере, до тех пор, пока не снова не станет пробовать ваши порты. СОВЕТ Если вы используете метод ipfw kill_route, просмотрите текущие правила блокирования командой ipfw -a list: # ipfw -a list 00001 1 44 deny ip from 209.237.26.165 to any Если вы используете маршруты "черной дыры", выдайте команду netstat -rn: # netstat -rn Routing tables Таблицы маршрутизации Internet: Destination Gateway Flags Refs Use Netif Expire 209.237.26.165/32 127.0.0.1 UGScB 0 0 loO Флагом в обозначается маршрут "черной дыры", где пакеты просто отбрасываются. СОВЕТ Всякий раз при обнаружении атаки /var/log/messages принимает строки, сообщающие о том, что делает PortsEntry: Jun 2 23:50:56 stripes portsentry[2430]: attackalert: Connect ^from host: 209.237.26.165/209.237.26.165 to TCP port: 1 Jun 2 23:50:56 stripes portsentry[2430]: attackalert: ^Host 209.237.26.165 has been blocked via wrappers with ^string: "ALL: 209.237.26.165й Jun 2 23:50:56 stripes portsentry[2430] : attackalert: *>Host 209.237.26.165 has been blocked via dropped troute using command: "/sbin/ipfw add 1 deny all 4>from 209.237.26.165:255.255.255.255 to any" Другим инструментом от разработчиков PortsEntry является программа Logcheck (доступная в /usr/ports/security/logcheck). Она анализирует этот и другие файлы протоколов и посылает вам ежедневный отчет о необычной активности и обнаруженных атаках. ВНИМАНИЕ! Как и в случае IPFW, при тестировании PortsEntry следует быть аккуратным. Очень легко инициировать обнаружение атаки; если вы это сделаете, то система, с которой вы администрируете свою машину FreeBSD, будет блокирована. Это может произойти, например, если вы зайдете с помощью telnet на порт 1, "просто, чтобы посмотреть, что произойдет". А произойдет следующее: ваш хост будет блокирован и все последующие попытки соединения будут отклонены. Вам придется подключиться с другого хоста или физической консоли, чтобы удалить ошибочно примененное правило — либо командой ipfw delete 1, либо командой route delete IP-address/32.
"~ТГ1 I Работа в сети FreeBSD 922 ¦ I ЧагтьУ Как и с IPFW, вы можете установить задание сгоп для запуска этих команд каждые пять минут, чтобы защититься от непреднамеренного блокирования самого себя. Если вы хотите защитить определенные хосты (такие как ваша собственная машина) от блокирования PortsEntry, добавьте их IP-адреса в файл /usr/local/etc/portsentry. ignore. Использование /etc/hosts. allow Файл /etc/hosts.allow позволяет блокировать доступ к определенным службам вашей системы со стороны определенных хостов. Этот файл подобен ручной версии PortsEntry. Вы можете специфицировать блок правил для данной службы и применить каждое правило к определенным IP-адресам или множествам адресов; каждое правило либо разрешает, либо запрещает доступ к службе для соответствующих хостов. Ниже показан пример блока правил из файла /etc/hosts .allow по умолчанию, с несколькими дополнительными строками, добавленными для демонстрации примера синтаксиса: sendmail : localhost : allow sendmail : .nice.guy.example.com : allow sendmail : .evil.cracker.example.com : deny sendmail : 231.21.15.0/255.255.255.0 : deny sendmail : 12.124.231. : deny sendmail : ALL : allow Поскольку вы уже видели, как работает IPFW, формат этих правил понять не сложно. Правило состоит как минимум, из трех полей: • Служба (специфицированная именем процесса). • Соответствующие имена хостов или IP-адреса. • Действие, которое следует предпринять (или множество действий, если есть четыре или более полей). Первые два столбца могут быть списками (множеством элементов, разделенных пробелами), а столбец хоста может соответствовать различными способами: ведущая точка может специфицировать всю подсеть DNS, либо хвостовая точка делает то же самое с IP-адресами. Отделите IP-адрес и маску сети слэшем, чтобы специфицировать сеть. Блок должен завершаться правилом "по умолчанию", указывающим, следует ли разрешать или запрещать доступ к службе по умолчанию. В общем случае, если вы запускаете службу, на то должна быть серьезная причина; вероятно, вы захотите, чтобы правилом по умолчанию было allow (разрешить), чтобы клиенты, кроме тех, что указаны явно, могли получить доступ к службе. Вы можете использовать /etc/hosts.allow, чтобы специфицировать и другие действия, кроме простых allow и deny. Вы можете сделать это, чтобы открыть неавторизованный доступ к службе, инициировать отправку сообщения электронной почты вам или же запустить программу, которая выполнит какого-то 'рода встречное прощупывание удаленного хоста (хотя, может быть, это и забавно "бороться с огнем с помощью огня", но это плохая и опасная форма поведения — опускаться до уровня хакера, который атакует вас). Этот файл может выполнить любую команду оболочки в ответ на случай соответствия данному правилу. Правило по умолчанию для службы f ingerd показывает пример конфигурации подобного рода:
Безопасность сети I Q„ I Глава 30 I I f ingerd : ALL \ : spawn (echo Finger. | \ /usr/bin/mail -s "tcpd\: %u@%h[%a] прощупывает меня!'1 root) & \ : deny Коды %u, %h и %а вместе с дополнительными опциями конфигурации описаны в man 5 hosts_access и man hosts_options. Использование Tripwire Вы можете использовать обнаружение проникновения для обеспечения защиты, которая выходит за пределы простого блокирования подозрительных хостов. Достаточно изощренный хакер сможет обмануть ваши проверки безопасности, независимо от того, насколько тщательно вы их построите. Если такое случится, вам нужно иметь возможность вовремя заметить, что он вошел в систему и вызвал какие- то повреждения. Если ваша система будет "подчинена" чужой злой силе, вы захотите узнать об этом, как только это случится, и точно определить масштабы ущерба. Программа Tripwire, доступная в /usr/ports/security/tripwire, представляет собой широко применяемый инструмент обнаружения проникновений. Tripwire сохраняет записи аутентификации для каждой программы в системе. Она компилирует "официальную" запись о вашей программе при ее первом запуске во время инсталляции, и затем добавляет записи о новых программах, когда вы устанавливаете их. Ежедневно Tripwire сравнивает новую запись каждой программы системы с официальной записью. Если Tripwire обнаруживает какие-то отличия в программах (например, если исполняемый файл sshd вдруг изменился в размере, либо каким-то образом изменилось его содержимое или метаданные), она известит вас по электронной почте. Это послание немедленно даст вам знать, что ваша система подверглась опасности. Когда вы впервые инсталлируете Tripwire, она строит свою начальную базу данных "отпечатков пальцев" программ на этапе make install и записывает ее в файл, находящийся в каталоге /var/db/tripwire. Этот файл подписывается локальной идентификационной фразой и идентификационной фразой сайта, которые вы специфицируете во время инсталляции, поэтому вам не нужно беспокоиться о целостности файла базы данных. Если он будет модифицирован без вашего ведома, Tripwire предупредит вас о появлении бреши в защите при следующем его использовании. Сначала вы должны создать конфигурационный файл для Tripwire. Это делается утилитой twadmin; в этом случае вы применяете режим -m F (создать конфигурационный файл), указав ключевой файл сайта с опцией -S и входной конфигурационный файл в конце: # twadmin -m F -S /usr/local/etc/tripwire/site.key ^/usr/local/etc/tripwire/twcfg.txt Please enter your passphrase: Введите свою идентификационную фразу: Wrote configuration file: /usr/local/etc/tripwire/tw.cfg Записан конфигурационный файл: /usr/local/etc/tripwire/tw. cfg С этого момента вы можете заставить систему запускать tripwire каждую ночь в задачах periodic (об этом говорилось в главе 15). Когда tripwire запускается с аргументом —check, она работает в режиме проверки целостности, сканируя все файлы, специфицированные в /usr/local/etc/tripwire/twpol. txt на предмет несоответ-
924 Работа в сети FreeBSD Часть V ствия "отпечаткам пальцев", хранящимся в базе данных. Если будет найдено любое несоответствие, программа сообщит об этом, как в данном примере, где изменилось время модификации файла /usr/sbin/sshd: # tripwire —check Rule Summary: Section: UNIX File System Rule Name Invariant Directories Sources Temporary directories Tripwire Data Files Local files Tripwire Binaries Severity Level Added 66 0 100 0 33 0 100 0 100 0 100 0 Libraries, include files, and other system files 100 0 * System Administration Programs 66 0 User Utilities X11R6 NIS (/var/yp) /etc Security Control Root's home FreeBSD Kernel FreeBSD Modules /dev Linux Compatibility (/compat) 100 0 100 0 100 0 100 0 100 0 100 0 100 0 100 0 100 0 100 0 Removed 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 Modified 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 Total objects scanned: 466299 Total violations found: 1 Может случиться, что вы ожидаете, что эти файлы должны отличаться от того, чего ожидает Tripwire; например, вы инсталлировали обновленную версию sshd. Всякий раз при обновлении файлов, за которыми наблюдает Tripwire, вы должны обновить базу данных Tripwire, чтобы в ней была отражена новая информация. Это делается с помощью опции —update: # tripwire —update Эта команда перезапускает весь процесс генерации базы данных Tripwire, который сканирует всю файловую систему и записывает обновленный файл базы данных, подписанный идентификационными фразами — локальной и сайта (которые вам будет предложено ввести при запуске этой программы).
Безопасность сети ВНИМАНИЕ! Обновляйте базу данных Tripwire только в том случае, если вы знаете точно, что безопасность системы не нарушена! Вы не должны загрязнять базу данных информацией о поврежденных внешним вмешательством файлах, сделав ее образцом для сравнения последующих версий. Наилучшая политика состоит в отключении системы от сети, перезагрузке, запуске сканирования Tripwire для проверки чистоты вашей системы на основе известной ей информации и последующего обновления базы данных Tripwire. Если вы действительно хотите убедиться в безопасности вашей базы данных Tripwire, и не доверяете даже встроенным механизмам подписи, которые защищают ее, то можете создать дискету Tripwire, поместив базу данных в отдельное от компьютера место. Это наиболее безопасный метод гарантировать целостность данных из всех возможных. К сожалению, база данных Tripwire слишком велика, чтобы уместиться на дискете; однако вы можете исключить элементы из "политики" Tripwire, чтобы сделать ее поменьше. Это делается редактированием /usr/local/etc/tripwire/twpol. txt, посредством удаления или комментирования строк, специфицирующих местоположения, которые не нужно контролировать, с последующим созданием действительного (не читаемого человеком) файла политики командой twadmin с аргументом -т Р (или —create-prof ile): # twadmin -шР-S /usr/local/etc/tripwire/site. key *> /uer/local/etc/tripwire/twpol.txt Затем, когда файл базы данных, полученный от другого запуска tripwire —update, станет по размеру меньше 1.44 Мбайт, вы можете перейти в /usr/ports/ security/1ripware и воспользоваться командой make floppy, чтобы автоматически создать дискету с базой Tripwire и связанными с ней инструментами. Однако следует отметить, что создание дискеты Tripwire рассматривается в наше время, как совершенно излишняя мера, потому что файлы локальной базы данных сами по себе защищены, поэтому команда make floppy считается устаревшей и может уже отсутствовать в вашей системе. Другой вариант, естественно, заключается в применении записываемого CD или DVD для вашей автономной базы данных Tripwire. Однако, вам придется создать этот диск вручную, не используя инструменты Tripwire. Воздушные зазоры (air gaps) Когда вы храните базу данных Tripwire на дискете или другом съемном устройстве, то используете так называемый воздушный зазор (air gap) — условие защиты, при котором ни один автоматический процесс не может передать данные от одной стенки "зазора" к другой. Любая система, в которой данные могут перемещаться программным путем из точки А в точку В, потенциально уязвима для проникновения достаточно изобретательного хакера. Потратив определенное время и усилия, некто, заинтересованный в ваших данных, получит доступ к вашим архивам — даже если вы дойдете до того, что установите второй "скрытый" жесткий диск, который автоматически монтируется ночью для выполнения операции резервного копирования. Это — автоматическая процедура, и потому она потенциально уязвима для любого, желающего взломать ее защиту. Корректно спроектированные медицинские и правительственные сети содержат критичные базы данных на машинах, не имеющих сетевых соединение с любыми другими машинами сети; они
л„ I Работа в сети FreeBSD 926 отделены воздушным зазором и потому защищены, по крайней мере, пока заслуживает доверия философия, исповедуемая администраторами. Воздушный зазор — крайняя мера безопасности, в конечном итоге жертвующая удобством в пользу гарантированной безопасности. Если вы храните данные в физически отдельном месте от любых машин, включенных в сеть, ни один хакер не сможет их взломать. Храня важнейшие данные на дискете, CD-R или другом съемном носителе, вы тем самым используете воздушный зазор для защиты ваших данных; даже если вся сетевая система ненадежна. Конечно, при условии, что вы не оставите свой съемный диск в устройстве... Если вы подозреваете, что подверглись нападению... Как уже говорилось, вы всегда должны предполагать, что ваша система — независимо от степени ее безопасности — в определенный момент подвергнется взлому. Хотя Tripwire и PortsEntry могут здорово йомочь в предотвращении проникновения и обнаружении чужаков, все равно вы должны быть начеку и обращать внимание на тонкие и субъективные изменения в поведении системы. Ниже перечислено несколько простых способов мониторинга безопасности системы. • Заглядывайте в top, как описано в главе 15; наблюдайте за загрузкой системы в течение длительных периодов и выявляйте моменты, когда она заметно возрастает; если такое происходит, исследуйте, чем это вызвано. • Не игнорируйте загадочные изменения в поведении, такие как неправильно форматированные приглашения регистрации или неправильный вид вывода командной строки. • Периодически заглядывайте в /tmp и /var/tmp, следя за всем исполняемыми файлами, или setuid, или очень большими файлами. Регулярно очищайте эти каталоги. Ищите в Internet имена всех загадочных файлов, которые обнаружите там, поскольку они могут быть обломками, оставленными после себя каким- нибудь известным инструментом из серии "rootkit". • Следите за файлами системных журналов в /var/log; обращайте внимание на сообщения, которые выглядят подозрительно — с длинными строками или "мусорными" символами. Это почти наверняка следы попыток атаки переполнением буфера. Короче говоря, постоянно ищите что-нибудь необычное. Такие специальные проверки — иногда единственный способ заметить, что ваша система ведет себя не так, как должна. НА ЗАМЕТКУ Лучшее место для обнаружения хакерской активности — /dev. Именно там инструменты анализа пакетов часто помещаются нарушителями, запускающими предварительно упакованные инструменты "rootkit" или сценарии. Однако, поскольку FreeBSD теперь использует динамически сгенерированную файловую систему устройств DEVFS, об этом можно меньше беспокоиться, но все же иногда заглядывать туда явно не помешает. Если вы подозреваете, что подверглись атаке хакера (и особенно, если нашли какие-то свидетельства этого), то должны предположить, что повреждения на самом деле больше, чем кажется. Наиболее распространенная ошибка, которую допускают
Безопасность сети I T7Z I Глава 30 I I администраторы, обнаружив признаки вторжения — просто отключить несколько служб и предполагать, что нарушитель после этого отступит. Часто бывает и так, но такое поведение — способ накликать беду. Нарушителю достаточно оставить "лазейку" некоторого рода, которая позволит ему вернуться и позднее нанести гораздо больший урон, чем до этого. Если вы заподозрили, что подверглись нападению, вот какие шаги вам следует предпринять. 1. Немедленно отключите систему от сети. Независимо от того, какие лазейки нарушитель оставил в вашей системе, он ничего не сможет сделать, если система отключена от сети (то есть находится за воздушным зазором). Это предотвращает "заметание следов" хакером, который понял, что он обнаружен и торопится очистить ваш жесткий диск от результатов своей деятельности. 2. Проверьте /var/cron/tabs и /etc/crontabHa наличие новых заданий; также проверьте atq на предмет наличия заданий, оставленных нарушителем для запуска в его отсутствие. Система может быть вне сети, но задания с г on все равно будут запускаться, и хакер может повредить вашу систему подобным образом, если только вы не отмените все подозрительные отложенные задания. 3. Не пытайтесь связаться с нарушителем или дать ему знать, что он обнаружен. Даже если вы обезопасите свою систему от повторных попыток нападения, нарушитель исчезнет, если поймет, что вы пытаетесь отследить его, и правоохранителям придется потратить гораздо больше усилий, чтобы найти его. Пусть он думает, что вы просто отключили машину от сети, чтобы восстановить ее после повреждения. 4. Оцените масштаб ущерба и решите, захотите ли вы выдвинуть иск против нарушителя. Если да, переходите к шагу 5; иначе — к шагу 6. 5. Зайдите на Web-сайт Национального центра защиты инфраструктуры (National Infrastructure Protection Center — NIPC) по адресу http: //www.nipc.gov (или в его аналог, занимающийся в вашей стране проблемами киберпреступности, если вы находитесь не в США) и заполните анкету отчета об инциденте. Это вооружит ФБР в его борьбе с киберпреступностью и хакерской деятельностью конкретной информацией, с тем, чтобы они могли выследить злоумышленника. Большая часть хакерской активности осуществляется начинающими "малолетками, пишущими сценарии" — случайными вандалами, использующими инструменты, разработанные другими для использования известных уязвимых мест. Хакеров подобного типа обычно можно с успехом найти и привлечь к ответственности. Однако, поскольку ФБР и им подобные органы требуют, чтобы усилия по сбору информации выполнялись под их покровительством и в соответствии с их стандартами, вы должны будете позволить им исследовать информацию в вашей системе, вместо того, чтобы просто предоставить собственные фильтрованные файлы протоколов и данные наблюдений. Вы можете думать, что это должно помочь, но ФБР не опираются в своей работе на данные, чья целостность не гарантирована. 6. Выполните резервное копирование всех важнейших данных — Web-документов, файлов конфигурации, домашних каталогов и всего, что есть в /usr/local, после чего переустановите операционную систему. Для абсолютной уверенности выполните полную очистку содержимого жесткого диска, переустановите
Работа в сети FreeBSD FreeBSD "с нуля" и восстановите локальные данные. Используйте ежедневные отчеты Tripwire, чтобы решить, насколько ваша машина нуждается в тотальной очистке; помните о лазейках, которые могут быть инсталлированы между вашими собственными установленными программами в /usr/local, или даже среди ваших Web-документов или конфигурационных файлов. 7. Обновите существующие службы самыми свежими версиями, обращая внимание на всю сопровождающую информацию, касающуюся безопасности, прежде чем обратно перевести систему в онлайновый режим. Будьте особенно бдительны в первые несколько дней после возвращения системы в работу; хакер может продолжить попытки взлома. Уделите особенно пристальное внимание вашим журнальным файлам в течение этого периода; чем больше свидетельств вы сможете собрать, тем более вы облегчите работу NIPC и ФБР. Атаки типа "отказа в обслуживании" (DOS) В современной терминологии "безопасность" сетей означает три фактора: конфиденциальность, целостность и доступность (Confidentiality, Integrity, Availability — C.I.A.). Таким образом, даже несмотря на то, что атаки типа "отказа в обслуживании" (Denial of Service — DOS) напрямую не нарушают безопасности системы или целостности ее компонентов, защита от них остается центральной частью обеспечения сетевой безопасности. Атаки DOS не связаны с прямым нарушением безопасности или приватности системы. Вместо этого они представляют собой просто методику грубого "наводнения" информацией, посылающую такой объем трафика по сети, что полезный трафик просто теряется в этом потоке. Целью такого нападения часто является крах сервера из-за непомерного объема данных и количества запросов. Атакам подобного рода противостоять намного сложнее, чем прямым нападениям хакеров, которые можно отсечь посредством использования IPFW, PortsEntry и других инструментов, о которых мы говорили. Воздействия атаки DOS невозможно избежать; ее можно только смягчить, потому что атаки DOS осуществляются полностью в рамках легитимного трафика, и они неразличимы на фоне вашего обычного потока ответственных данных. Проблема только в том, что их слишком много. Иногда атака DOS может быть идентифицирована по ее источнику, и вы можете блокировать его, добавив правило брандмауэра для запрета трафика от этого источника. Однако в последнее время такие атаки часто скрывают свой настоящий источник — широковещательные атаки ping (ICMP) выглядят так, как будто они исходят от определенного источника, который на самом деле является жертвой, принимающей на себя главный удар. Атаки типа "распределенного отказа в обслуживании", или DDOS, очень коварны, и охватывают сотни или даже тысячи настольных машин (или "зомби"), помимо воли принимающих участие в нападении — так что отслеживание настоящего виновника оказывается почти невозможным. Некоторые опции конфигурации разных серверов и ядра могут помочь в предотвращении полного затопления вашей системы во время атаки DOS. Следующие разделы посвящены некоторым из этих мер; однако имейте в виду, что они лишь повышают шансы вашей системы выдержать атаки DOS — они не могут нейтрализовать ее саму, как и не могут гарантировать, что нарушитель не попытается усилить нажим — до тех пор, пока ваша система не поддастся и не прекратит работу.
Безопасность сети Ограничение количества порожденных процессов на сервере Многие атаки DOS направлены против определенных служб, таких как Apache, Sendmail или других, которые работают, порождая (forking) новые процессы для обработки каждого входящего запроса. Если нарушитель посылает непомерное количество запросов к службе, она порождает столько процессов, что центральный процессор и память в конечном итоге исчерпываются, дестабилизируя вашу систему. Вы можете смягчить риск, связанный с такими атаками, установив всем службам, порождающим процессы, встроенные ограничения на количество параллельных дочерних процессов, которые они могут иметь. Эти ограничения могут касаться способности службы обрабатывать легитимные запросы во время нормальной работы, но такой компромисс защитит вас от атаки DOS. Apache имеет директиву MaxClients (по умолчанию, установленную в 150), определяющую максимальное количество запросов, которые могут обрабатываться одновременно. Однако хитрый злоумышленник может многократно запускать ресурсоемкий CGI-сценарий, чтобы Apache создавал исполняемые процессы быстрее, чем они завершались. Запросы на исполняемые процессы с большей вероятностью вызовут перегрузку сервера, чем запросы статических HTML-страниц. Если в вашей системе разрешен вход по Telnet или SSH, остановите Apache (apachectl stop), пока атака не окончится. Это может быть единственным способ противостояния такому нападению. Если вам повезет, то DOS-атаку HTTP удастся отследить, и она приведет к единственному клиентскому IP-адресу, который вы затем сможете блокировать правилами IPFW или директивой самого Apache deny from. Если же это не сработает, то вы всегда можете уменьшить значение MaxClients до такого состояния, что даже если сервер достигнет этого значения, клиент не сможет "утопить" его. НА ЗАМЕТКУ В настоящее время большинство DOS-атак на основе HTTP, к сожалению, являются распределенными, и как таковые, не позволяют отследить свой источник. Лучшая защита от таких атак — поместить ваш сервер под защиту сетевого устройства, которое может обнаружить и эвристически отреагировать на массовую активность, отделяя IP-адреса, которые могут быть блокированы, от тех, что должны оставаться открытыми, или создавая "выгребную яму", которая безвредно примет весь атакующий трафик и нейтрализует его. Подобное средство имеется и в Sendmail: MaxDaemonChildren, отключенное по умолчанию, которое вы можете включить, убрав комментарий с него в /etc/mail/ sendmail.cf и перезапустив сервер (make restart). Помимо этого Sendmail снабжен встроенным тормозом, предотвращающим запуск новых процессов, когда загрузка системы превышает 12; однако, этот механизм имеет значительную задержку во время быстрых атак, поэтому может быть, необходимо явно ограничить количество дочерних процессов, которые Sendmail может иметь одновременно.
Работа в сети FreeBSD СОВЕТ Другие директивы Sendmail, которые вы можете применять для изоляции нарушителей (или любого, кто использует ваш сервер слишком агрессивно) — это QueueLA, Ref useLA, Del ay LA и ConnectionRateThrottie. Эти директивы документированы в строках комментариев в самом sendmail. cf и достаточно понятны. Например, с QueueLA (по умолчанию установлено в 8, но отключено) можно убрать комментарий, чтобы заставить Sendmail автоматически ставить сообщения в очередь вместо того, чтобы пытаться доставить их, если уровень загрузки превысит 8. Потенциальное общее решение проблемы атак, ориентированных на порождение процессов, включая те, что происходят из вашей собственной системы (например, от пользователей-ренегатов или просто неопытных), заключается в модификации /etc/login.conf для наложения ограничений на использование процессора, памяти и открытых файлов для отдельного пользователя. Создайте класс пользователя, который запускает службы по запросу — nobody в случае Apache или индивидуального пользователя, чьи ресурсы хотите ограничить — и примените chf n для помещения пользователя в класс. Пример класса в login. conf может выглядеть так: baduser:\ :cputime=30m:\ :openfiles*24:\ :maxproc=32:\ :memoryuse=l6m:\ :tc=default: Затем выдайте cap__mkdb /etc/login. conf, чтобы включить этот новый класс и наложить указанные ограничения на любого пользователя, относящегося к нему. Защита от атак "трамплином" Атака "трамплином* (springboard attack) использует ресурсы вашей собственной сети для достижения ее конечных целей. В то время как атаки грубой силой и порождением процессов требуют от настойчивого злоумышленника выполнения большого объема работы, атаку "трамплина" можно осуществить просто введением в сеть тщательного сконструированного набора запросов. Эти запросы делают собственную инфраструктуру сети ее худшим врагом. Злоумышленник может осуществить атаку рассылкой ping (Smurf), например, посылая нормальные ping-запросы на широковещательный адрес вашей сети (что размножает этот запрос на все хосты вашей сети). Хакер подменяет адрес источника, так чтобы это выглядело, как будто запрос прислан другим хостом. Обычно такой хост становится несчастной жертвой, страдающей намного сильнее, чем вы, при такой атаке, потому что каждый хост в сети отвечает на запрос и затопляет жертву потоком ответов на ping. Умножающий эффект от такого рода атаки может оказаться пагубным для жертвы, а ее источник очень трудно (если вообще возможно) отследить. НА ЗАМЕТКУ Другой тип атаки трамплином вставляет пакет UDP между двумя серверными портами службы эха (echo service ports). Такой пакет заставляет сервера вступить в "войну эха", которую можно прекратить только отключением эхо-порта (в FreeBSD этот порт отключен по умолчанию). * — ¦ ¦¦ ¦ tUn
Безопасность сети Атаки трамплином лучше всего предотвращается на пограничном маршрутизаторе сети. Smurf-атаки могут быть предотвращены таким конфигурированием маршрутизатора, чтобы он не отвечал на широковещательные ping-запросы. Если ваш маршрутизатор — машина FreeBSD (об использовании FreeBSD в качестве маршрутизатора читайте в главе 28), то установка icmp_bmcastechoe"NO" в /etc/defaults/rc.conf предотвратит ее ответы на такого рода запросы, которые почти никогда не используются в благородных целях. Сообщения об ошибках ICMP — еще один распространенный источник атак трамплином. Инструмент ICMP_BANDLIM (скомпилированный в ядро GENERIC по умолчанию) ограничивает рейтинг, на котором отсылаются ответы на сообщения об ошибках ICMP, снижая эффективность таких атак. В FreeBSD 5.0 и более поздних версиях ICMP_BANDLIM уже даже не опция — его просто нельзя отключить. Можно, однако, настроить число ICMP-ответов, которые ваша машина может обработать в секунду, командой sysctl: # sysctl net.inet.icmp.icmplim=100 net.inet.icmp.icmplim: 200 -> 100 Используйте sysctl -а для определения текущего установленного значения этой переменной, как показано ниже: # sysctl -a net.inet.icmp.icmplim net.inet.icmp.icmplim: 100 Физическая защита Самая безопасная система в мире может быть взломана, если неавторизованное лицо сможет получить физический доступ к самой машине сервера, поскольку никакой объем программной защиты не сможет противостоять парню с отверткой. Средства защиты мест хранения оборудования жизненно важны для коммерческих и прочих ответственных серверов Internet. Такие средства включают замыкаемые на ключ серверные стойки в замыкаемых серверных комнатах, вход в которые и физический доступ к аппаратуре разрешен только ограниченному кругу уполномоченного персонала. Ваша система может быть смонтирована в стойке с замыкаемой передней панелью, снабженная средствами безопасности BIOS, которые предупредят вас в случае ее удаления. В лучшем случае средства защиты мест хранения оборудования специально ориентированы на обеспечение физической защиты, как предлагаемые компанией InfoBanker (http://www.infobanker.com). Естественно, такие вещи стоят недешево. Любой, у кого есть физический доступ к машине, может перезагрузить ее в однопользовательском режиме, который не запрашивает пароль root в конфигурации по умолчанию. Вы можете исправить это, чтобы пароль запрашивался, сообщив /etc/ttys, что консоль "небезопасна", то есть, что вы не можете гарантировать, что любой, кто может к ней обратиться, будет авторизован: console none unknown off insecure Однако это не исключит загрузки с дискеты или CD для взлома системы. Другие устройства, подключенные к машине, также могут быть использованы для получения неавторизованного доступа: модемы, например, или беспроводные сети, которые не являются частью ни одной машины, с которых вы пытаетесь ограничить физичес-
Работа в сети FreeBSD кий доступ. Вы можете сконфигурировать BIOS вашей машины так, чтобы позволить загрузку с любого устройства, отличного от первичного жесткого диска, а затем защитить BIOS паролем, но эти меры — только отдельный этап гонки вооружений, которую мотивированный хакер, обладающий физическим доступом, попытается выиграть. Вывод состоит в том, что вы не можете полностью защитить вашу систему, если только не контролируете полностью физический доступ к ней. Другие ресурсы, посвященные безопасности В этой главе было поднято несколько общих тем, связанных с безопасностью, применительно специально к FreeBSD. Однако предмет сетевой безопасности очень обширен, и он продолжает расти по мере того, как все больше и больше злонамеренных пользователей пытаются найти способы нанести вред основным службам Internet. Теме безопасности посвящено множество великолепных ресурсов, как специфичных для FreeBSD, так и общего характера, с которыми вам стоит ознакомиться. Страница man security Составленная Мэттью Диллоном (Matthew Dillon) страница man security содержит длинную дискуссию на общие темы безопасности и описание правильных приемов администрирования. В ней приведены также разнообразные советы о предотвращении взломов и DOS-атак. Эта страница — основа множества онлайновых ресурсов, включая часть онлайнового справочника FreeBSD Handbook. Списки рассылки Подпишитесь на список рассылки freebsd-security@freebsd.org. Сделайте это, отправив сообщение на majordomo@freebsd.org, включив строку subscribe f reebsd-security в тело сообщения. Это список, в котором можно найти наиболее свежую информацию по вопросам безопасности. Как администратор, вы должны быть в курсе последних разработок, чтобы противостоять каждой новой угрозе, о Которой становится известно. Другой полезный список, посвященный безопасности UNIX вообще — это Bugtraq. Этот список принимает сообщения обо всех главных проблемах в безопасности Internet — иногда еще до того, как станет известно их влияние на FreeBSD. Bugtraq находится по адресу http: //www.securityf ocus.com, где можно подписаться на рассылку или порыться в архивах. CERT (http://www.cert.org) и SANS (http://www.sans.org) — обязательные к изучению ресурсы, посвященные безопасности, которые будут держать вас в курсе разработок в мире безопасности и новых угроз для всего спектра операционных систем. И, наконец, группа новостей сотр. risks — доступная в упорядоченной форме на http: //catless .ncl .ac.uk/Risks. Этот список представляет собой форум профессионалов в области безопасности, которые обсуждают технические и философские стороны вопросов безопасности — от серверных платформ до контрольных сумм1 кредитных карточек и радиометок RFID (Radio Frequency Identification — радиочастотная идентификация).
Безопасность сети Рекомендации по безопасности FreeBSD Рекомендации по безопасности отправляются FreeBSD Security Officer в списки freebsdannounce@freebsd.org и freebsd-security@freebsd.org для предупреждения обо всех вновь обнаруженных угрозах. Каждая рекомендация архивируется на http: //www. freebsd.org/security/ и состоит из полной дискуссии о природе и влиянии угрозы, независимо от того, является ли она специфичной для FreeBSD или нет, и о способах решения проблемы. Поскольку это может стимулировать хакеров раскрыть точную природу угрозы до того, как исправление станет доступным, рекомендации издаются только после того, как решение найдено. Это одна из причин для подписки на freebsd-security@freebsd.org; там можно найти дискуссию об угрозе еще до появления рекомендаций. Устранение угроз в портах и пакетах обычно означает простую синхронизацию вашего дерева портов и пересборку порта, находящегося под вопросом (см. главу 16). Однако исправление ядра системы FreeBSD обычно помещается в соответствующую ветвь кода исправления ошибок той версии FreeBSD, которую вы применяете; чтобы воспользоваться ее преимуществами, вам придется пересобрать часть вашей системы после синхронизации исходного кода. Если исправление содержится в относительно фундаментальной части кода системы, вам может понадобиться выполнить полный make world, чтобы защитить вашу систему. Соответствующие инструкции о том, как это делать, ищите в главе 19. Ресурсы в Web Информационная страница о безопасности FreeBSD http: //www. freebsd.org/ security содержит ресурсы и ссылки, ориентированные на администратора и разработчика FreeBSD. Там архивированы рекомендации по безопасности, вместе с множеством советов и приемов, направленных на снижение факторов риска. CERT (http://www.cert.org), ведущий сайт рекомендаций по безопасности в Internet, поддерживает ресурсы об уязвимых местах различных операционных систем и является широко признанным официальным источником предупреждений и информации о восстановлении систем. CERT также обрабатывает отчеты об инцидентах; вы можете направить туда отчет о взломе, и им займутся компетентные службы с тем, чтобы поймать нарушителя. SecurityFocus, сайт, на котором размещен Bugtraq, является сайтом новостей в области безопасности, раскрывающий темы от обнаружения проникновений до защиты от вирусов. Кроме того, он содержит множество статей по передовому опыту в обеспечении безопасности и о том, как следует ответственно эксплуатировать систему. Там не так много специфичных для FreeBSD материалов, но большая часть представленной информации применима на любой платформе. Адрес этого источника — http://www.securityfocus.com. SANS (http://www.sans.org) — ресурс, предлагающий тренировочные курсы ц сертификаты для профессионалов в области безопасности, наряду со статьями о новостях в области состояния безопасности Internet, а также об "Уровне угрозы Internet", который отслеживает уровень разрушительной активности в любое заданное время. /
Работа в сети FreeBSD Книги В качестве рекомендуемой литературы почитайте книги Секреты хакеров. Безопасность сетей - готовые решения, 4-е издание Стюарта Мак-Клара, Джоэла Скембрея и Джорджа Курца (ИД "Вильяме", 2004 год), а также Полный справочник по брандмауэрам Кейта Страссберга, Ричард Гондека и Гари Ролли (ИД "Вильяме", 2004 год). Дополнительные книги и документы по теме безопасности перечислены и оценены по степени полезности на сайте SecurityFocus, под ссылкой "Library" ("Библиотека").
ГЛАВА 31 Виртуальные частные сети (VPN) В этой главе... • Что такое VPN? • Топологии VPN • Службы VPN в FreeBSD: IPSec • FreeBSD как сервер VPN
Работа в сети FreeBSD Если вы добрались до этого места в книге, уделив должное внимание предыдущим главам, посвященным безопасности и управлению сервером, то ясно, что у вас есть активная заинтересованность в том, чтобы стать ответственным (по части безопасности) гражданином сети. Даже если вы не являетесь администратором сети, все равно вы уже знаете о важности обеспечения максимально возможной безопасности транзакций, связанных с вашими ежедневными вычислениями. Вы используете SSH для удаленных терминальных операций, вы шифруете почтовый трафик РОРЗ и IMAP и вы соблюдаете политику безопасности через пароли. Ваша онлайновая жизнь безопасна почти настолько, насколько это возможно. Однако все меняется, как только речь заходит о сетевых протоколах, находящихся вне почтового или терминального трафика. Обеспечение безопасности сети может особенно осложниться, когда в игру вступают такие аспекты, как преобразование сетевых адресов (NAT), брандмауэры и локальные корпоративные сети (LAN), недоступные из внешней открытой сети Internet. Как вы собираетесь организовать совместный доступ к файлам серверов корпоративной сети вашей компании, если находитесь дома или в пути? Как гарантировать шифрование коммуникаций с офисом, вне зависимости от используемого протокола? Эту роль берет на себя модель виртуальной частной сети (Virtual Private Network — VPN). В настоящей главе будут представлены концепции, лежащие в основе VPN, описаны некоторые различные типы реализаций VPN и их топологии, а также предложено руководство по конфигурированию вашей машины FreeBSD для поддержки VPN — как в качестве клиента (работающего с удаленной частной сетью), так и в качестве сервера (позволяющего другим клиентам получать доступ к сети, находящейся под защитой вашей машины FreeBSD). Что такое VPN? Корпоративные сети защищаются от чужих любопытных глаз различными методами, многие из которых уже были описаны в книге. Возможно, наиболее распространенная ситуация — это когда сеть компании расположена за брандмауэром, который выполняет преобразование (NAT) IP-адресов внутри компании в единственный "маскируемый" адрес, видимый извне. Идея, положенная в основу этой конфигурации, состоит в том, что машины внутри сети могут обращаться к ресурсам в Internet, но машины из Internet не могут контактировать с "маскированными" машинами корпорации непосредственно. СОВЕТ Преобразование сетевых адресов (Network Address Translation — NAT) — это техника подключения к Internet, позволяющая множеству хостов получать доступ в Internet, используя единственный IP-адрес. NAT подробно описана в главе 28, в разделе "Что такое NAT?". Как вы узнаете в настоящей главе, можно совмещать операции NAT со службами VPN на одной и той же машине FreeBSD. Защищенные подобным образом, серверы внутри корпоративной сети вольны реализовывать либеральные политики безопасности (позволяя сотрудникам разделять ресурсы корпоративных серверов без шифрования или даже аутентификации) и сетевые службы уровня LAN (вроде совместного доступа к файлам Windows и видеоконференций). Сотрудникам не приходится беспокоиться о безопасности этих
Виртуальные частные сети (VPN) | TTZ I Глава 31 I I служб, поскольку никто извне корпоративной локальной сети не в состоянии получить доступ к чему бы то ни было внутри ее. Это — идеальная конфигурация... до тех пор, пока сотрудники компании находятся постоянно внутри корпоративной сети. Но что происходит, когда сотрудники желают работать на дому? Что если члены группы продаж хотят проверить свою корпоративную электронную почту и календарные сайты, а также получить доступ к документам по маркетингу, хранящимся на внутренних серверах корпорации, из отеля где-то на полпути? Из-за брандмауэра и NAT у них нет возможности подключиться к внутренним серверам непосредственно; если они попытаются поискать эти серверы по именам хостов, то их внешние DNS- серверы не смогут отобразить эти имена на осмысленные IP-адреса. Если они попытаются подключиться непосредственно к внутренним IP-адресам серверов, маршрутизаторы Internet не смогут найти путь к сети, содержащей преобразованные IP-адреса (обычно из зарезервированных диапазонов, таких как Ю.х.х.хи 192.168.х.х). Сотрудники не могут попасть в сеть, поскольку топологически находятся вне частной локальной сети компании. И здесь на помощь приходит виртуальная частная сеть (VPN). Концептуально VPN позволяет клиентской машине извне частной сети подключиться к пулу транслируемых IP-адресов, используемому внутри сети. Пакеты, несущие данные от машины к корпоративным серверам, путешествуют через общедоступные маршрутизаторы Internet, но при этом они зашифрованы, что защищает их от любопытных глаз, которые толпятся за пределами брандмауэра NAT. Такое шифрование создает туннель, который представляет собой дополнительный слой кодирования и заголовки пакетов, которые позволяют нормальным IP-пакетам маршрутизироваться между машинами, чья конфигурация в противном случае не позволила бы им взаимодействовать. В туннеле VPN общедоступные маршрутизаторы Internet передают ваши пакеты данных на сервер VPN, который выполняет остальную часть работы. Концептуальная схема организации VPN показана на рисунках 31.1 и 31.2. VPN создается посредством последовательности аутентификации, в которой клиентская машина обменивается ключами с VPN-сервером для установления легитимности члена корпоративной сети. (Обычно VPN должна использоваться сотрудником, и его имени пользователя и пароля в корпоративной сети должно быть достаточно для получения доступа в VPN. Этот метод безопасен, поскольку сама схема аутентификации VPN зашифрована.) 6e3VPN ^ Данные Нет маршрута i—п ."* , I 1 ' | I 1 Стек TCP/IP / f I Маршрутизатор / Маршрутизатор I Пакет ' Недопустимый I о, протокол I Рис. 31.1. Без VPN пакет либо не имеет маршрута к транслированной корпоративной IP-сети, либо отвергается брандмауэром, как поступивший из неразрешенного источника ^п
938 Работа в сети FreeBSD Часть V cVPN Данные Стек TCP/IP р""| Маршрутизатор Маршрутизатор Пакет VPN 1В^Я ^^^^^1^^Ч А I Туннель Рис* 31.2. Когда VPN добавляется на пути клиентского пакета, то каждый пакет шифруется и получает новое IP-назначение, отправляющее его по туннелю на VPN-сервер в корпоративной сети, который расшифровывает его Впоследствии клиентской машине выдается новый виртуальный интерфейс с IP- адресом, совместимым с адресами внутри частной сети. При наличии VPN поиски DNS по корпоративной сети работают, и службы локальной сети, подобные совместному доступу к файлам Windows, также функционируют нормально (даже несмотря на то, что пакеты зашифрованы и на самом деле путешествуют по Internet, а не по локальной сети). Лучше всего то, что весь процесс целиком шифруется, так что важные корпоративные данные не попадают к тем, кто специально ищет в открытой сети подобные сокровища. НА ЗАМЕТКУ Ответственно подходящие к обеспечению безопасности администраторы осознают, что удаленные пользователи, применяющие Windows для совместного доступа к файлам и другим службам, будучи подключенными к незнакомым сетям, независимо от того, происходит ли это через УРЫ, открывают свои портативные компьютеры потенциальным угрозам со стороны других машин в локальных сетях отелей и аэропортов — просто из-за этого самого совместного доступа к файлам. Эти портативные компьютеры, будучи принесенными обратно в сеть компании, могут инфицировать своих соседей вирусами и "троянскими конями", которые были подхвачены ими извне. По этой причине сотрудники, часто работающие на выезде, должны быть проинструктированы, что VPN сама по себе не может защитить их или обеспечить безопасность компании, и потому они должны избегать использования механизма совместного доступа к файлам Windows без крайней необходимости. Каждая операционная система обеспечивает функциональность VPN по-своему. Реализация FreeBSD требует большего объема работы, чем вы привыкли при использовании полностью разработанной настольной операционной системы, однако она также обладает множеством дополнительных средств, которые очень помогают. Автоматизация в основном заключается в необязательной поддержке IPSec (безопасный IP) в ядре, вместо использования дополнительных инструментов от независимых поставщиков (ниже в разделе "Службы VPN в FreeBSD: IPSec" настоящей главы вы узнаете больше о IPSec).
Виртуальные частные сети (VPN) Глава 31 939 Топологии VPN Все VPN имеют некоторые общие базовые компоненты. • Частная сеть. Сеть, часто относящаяся к классу С, управляемая маршрутизатором, или блок ее 1Р-адр?сов, транслированных брандмауэром NAT в насколько нужно большую внутреннюю виртуальную сеть. • Сервер VPN. Сервер, находящийся внутри маршрутизатора или представляющий часть самого маршрутизатора — как в случае множества современных маршрутизаторов Cisco и других производителей, либо в случае машины FreeBSD, функционирующей в качестве маршрутизатора. • Клиент. Клиент, находящийся где-то в Internet. Детали этих конфигураций, однако, могут значительно отличаться. На рис. 31.3 показана разновидность топологии, вероятно, подходящей для использования сотрудниками, находящимися в дороге. Единственная машина использует стандартное коммутируемое соединение с поставщиком Internet-услуг (вроде того, которое можно найти в отеле или аэропорте) для подключения к Internet. Эта машина затем соединяется с корпоративным сервером VPN, который имеет IP-адрес, не транслируемый и потому доступный непосредственно из Internet. Этот VPN-сервер выполняет необходимую аутентификацию и обслуживает клиентский туннельный IP- адрес, позволяя взаимодействовать с машинами внутри сети NAT. Корпоративная локальная сеть I I I \ VPN/брандмауэр ЩМЁЙ Маршрутизатор VPN (FreeBSD) Рис. 31.3* Единственная клиентская машина подключается к Internet и взаимодействует непосредственно с корпоративным сервером VPN для открытия туннеля
940 Работа в сети FreeBSD Часть V На рис. 31.4 представлена более сложная организация. Здесь клиент VPN — это машина FreeBSD, служащая шлюзом NAT и брандмауэром для домашней (локальной) сети — случай, вероятно, подходящий для использования сотрудником, часто работающим из дома. Корпоративная локальная сеть ' ¦ ¦ I VPN/брандмауэр |ЙИ|]д Маршрутизатор Т Г Локальная сеть Рис 31 А. Две сети, соединенные постоянным туннелем VPN; машины каждой сети могут свободно общаться друг с другом без какого-либо дополнительного конфигурирования Машина FreeBSD создает постоянный туннель, соединяющий ее с частной сетью через Internet, но сама по себе служит маршрутизатором, управляющим сетью машин различного типа. Каждая из этих машин имеет клиентскую машину VPN в качестве маршрутизатора-шлюза; если одна из машин попытается открыть соединение с частной сетью, машина FreeBSD получит постоянный маршрут (туннель VPN), куда направит подключение. Нормальные запросы к Internet будут переданы обычному маршрутизатору поставщика Internet-услуг без изменений. Машины в локальной сети не потребуют никакой специальной конфигурации, чтобы прозрачно взаимодействовать с машинами корпоративной сети. Такая топология позволяет крупным компаниям поддерживать множество дочерних офисов в разных странах мира, в то же время позволяя сотрудникам, находящимся в этих офисах, получать доступ ко всем ресурсам, как если бы они все были подключены к одному коммутатору центрального офиса. Те же принципы лежат как в основе простых, так и более сложных топологий, описанных выше. Далее в настоящей главе вы научитесь применять эти принципы
Виртуальные частные сети (VPN) Глава 31 941 на практике. Во-первых, будет рассмотрено, как следует конфигурировать FreeBSD в качестве клиента VPN для подключения к удаленному серверу VPN, независимо от того, предусматривает ли ваша топология локальную сеть. Затем вы узнаете, как создать VPN-сервер, чтобы другие машины могли общаться по туннелю с вашей собственной частной сетью. Службы VPN в FreeBSD: IPSec Службы VPN на FreeBSD сопровождаются применением IPSec, или Security IP (Безопасный IP). Протокол IPSec маршрутизируется подобно IP, но несет полезную нагрузку, которая шифруется и аутентифицируется. Эта нагрузка должна быть расшифрована машиной на другом конце с применением обмена ключами во время процедуры установки туннеля. IPSec — стандартный промышленный протокол, поддерживаемый FreeBSD уже в течение длительного времени, как результат работы, проведенной в рамках проекта КАМЕ (www.kame.net). Он не встраивается в ядро FreeBSD по умолчанию, однако вы можете легко включить его, собрав новое ядро. СОВЕТ Приемы в настоящей главе описывают настройку VPN с применением встроенной в систему FreeBSD функциональности IPSec. Альтернативная инфраструктура VPN, использующая SSL вместо IPSec, для которой характерна более прямолинейная конфигурация — это OpenVPN, доступная в портах или пакетах (в категории security) и на Web-сайте по адресу http://openvpn.net/. Попробуйте OpenVPN, если архитектура VPN вашей компании поддерживает SSL, или если оба конца туннеля находятся под вашим контролем и вы можете волевым решением потребовать, что VPN должна и использовать SSL вместо IPSec или РРТР. Однако обратите внимание, что OpenVPN не может взаимодействовать с туннелями IPSec или РРТР. Существуют также инструменты от независимых разработчиков, позволяющие FreeBSD работать с туннелем РРТР, если таковой используется вашей компанией. Попробуйте pptpclient, в категории net коллекции портов или пакетов, и обратитесь за руководством на http: // www.freebsddiary.org/pptp¦php. Популярное решение VPN, используемое многими компаниями — это концентратор Cisco серии 3000, который использует соответствующий протокол и программный клиент, недоступный для FreeBSD. Вместо этого применяйте vpnc — совместимый с Cisco VPN-клиент, доступный в категории security коллекции портов и пакетов. Подготовка вашей системы Чтобы добавить поддержку IPSec к вашему ядру FreeBSD, вам нужно добавить следующие три строки options к вашему файлу конфигурации ядра (подробности о модификации ядра ищите в главе 18, если вы не знакомы с этим процессом): options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/ IPSEC) , options IPSEC_DEBUG #debug for IP security Перекомпилируйте ядро и перезапустите систему. После добавления этих опций ядра ваша машина будет иметь две внутренних базы данных, о которых вам следует знать при конфигурировании IPSec.
ГТ7 I Работа в сети FreeBSD 94Z т—г I Часть V • База данных политики безопасности (The Security Policy Database — SPD). Используется для определения политики вашего туннеля, или какие пакеты должны шифроваться. • База данных ассоциаций безопасности (The Security Association Database — SAD). Поддерживает ключи шифрования, используемые для расшифровки пакетов, полученных через Internet. Этими двумя базами данных можно манипулировать командой set key, являющейся частью системы FreeBSD. Затем вам понадобится инсталлировать racoon — инструмент, разработанный КАМЕ для облегчения обмена ключами во время создания туннеля IPSec. Программа racoon, компонент проекта, известного как IPSec-tools (инструменты IPSec), может быть установлена из портов в /usr/ports/security/ipsec-tools. (Обратитесь к главе 16 за дополнительной информацией о коллекции портов FreeBSD.) Назначение racoon в том, что касается базовой установки VPN — автоматически манипулировать SAD и создавать туннель VPN при запуске компьютера. Для того чтобы настроить туннель, вам понадобится следующая информация. • IP-адрес вашей собственной машины. • IP-адрес сервера VPN. • Адрес и маска частной удаленной сети. • "Разделяемый ключ", которым является кодовая фраза, сохраняемая в файле с привилегированным доступом на обоих концах туннеля. Наиболее важное, что необходимо помнить — это разделяемый ключ. Он должен быть заранее согласован между вами и администратором удаленного сервера VPN. Разделяемый ключ хранится в файле /usr/local/etc/racoon/psk.txt, который не существует в инсталляции racoon по умолчанию. Этот файл содержит строка за строкой пары соседних IP-адресов и соответствующие им разделяемые ключи. Файл, находящийся в /us r / local / share /examples /ipsec- tools /psk.txt, содержит примеры строк, демонстрирующие необходимый формат. Создайте каталог /usr/local/ etc/racoon и затем создайте в нем ваш собственный файл psk.txt, добавив в него следующую строку, где IP-address — адрес удаленного сервера VPN, a shared-key— разделяемый ключ, согласованный вами с администратором сервера: IP-address shared-key Другими словами, если IP-адрес сервера — 221.222.223.224, а разделяемый ключ — somesecurestring, то вы должны добавить следующую строку: 221.222.223.224 somesecurestring НА ЗАМЕТКУ Два поля в строке разделяемого ключа, которую вы добавляете в ваш файл psk.txt, могут быть разделены либо пробелами, либо знаками табуляции, как это принято в большинстве конфигурационных файлов.
Виртуальные частные сети (VPN) Глава 31 943 Далее защитите файл psk.txt, назначив ему режим полномочий 600 (читаемый только владельцем) и убедившись, что он принадлежит root; в противном случае racoon откажется читать этот файл: # chmod 600 /usr/local/etc/racoon/psk. txt # chown root /usr/local/etc/racoon/psk. txt В конце создайте конфигурационный файл racoon, скопировав /us r/ local /share/ examples/ipsec-tools/racoon.conf в/usr/local/etc/racoon/racoon.conf; затем внесите пару модификаций, чтобы обеспечить гладкую работу через Internet WAN. Измените поля lifetime time и lifetime byte, специфицированные в блоке sainfo anonymous, на 36000 sees и 50000 KB, соответственно. (Добавьте эти строки, если они отсутствуют в конфигурации по умолчанию.) НА ЗАМЕТКУ Существует несколько вариантов примеров файла racoon.conf внутри /usr/local/share/ examples/ipsec-tools; среди них пример конфигурации для аутентификации GSSAPI (Kerberos), топологий NAT Traversal и ключей PlainRSA (используемых в сетях SWAN). Есть еще подкаталог roadwarrior, который содержит пример конфигурации статического сервера и клиента, пользующегося роумингом (например, портативный компьютер, применяющий непредсказуемые динамические IP-адреса). По завершении блок должен выглядеть примерно так: sainfo anonymous { pfs_group 2; lifetime time 36000 sec; lifetime byte 50000 KB; encryption_algorithm 3des; authentication_algorithm hmac_shal/ compression_algorithm deflate ; } Также добавьте строку lifetime 50000 KB в соответствующую точку блока remote anonymous: remote anonymous { nonce_size 16; lifetime time 1 min; lifetime byte 50000 KB; initial_contact on; support_mip6 on; }
944 Работа в сети FreeBSD Часть V Подключение к серверу VPN в FreeBSD Может быть, вам настолько повезет, что придется работать с сервером VPN на другой машине FreeBSD. Если это тот случай, вы можете настроить обе машины единообразно, с конфигурациями racoon, отражающими друг друга. Однако racoon работает только в том случае, если у вас настроены SPD и SAD с использованием файла /etc/ipspec.conf, который по умолчанию не существует. Вначале разрешите чтение этого файла во время запуска, добавив строку в /etc/ re.conf: ipsec^enable^YES" Кроме того, вам понадобится добавить виртуальный интерфейс gif 0 к доступным сетевым интерфейсам и сконфигурировать его согласно локальным иди удаленным IP-адресам, чтобы ядро могло маршрутизировать туннелированный трафик в правильном направлении. Добавьте строку gif_interfaces в /etc/rc.conf, как показано ниже: gif_interfaces-,,gifO" Протокол IPSec в FreeBSD работает, как показано на рис. 31.5. Каждая машина VPN имеет два сетевых интерфейса. На серверной стороне один из интерфейсов является "частным" и находится в той же LAN, что и частная сеть с транслируемыми адресами, к которой вы хотите подключиться, а другая — "общедоступный" IP-адрес в нетранслируемом адресном пространстве. Сервер VPN Частная локальная сеть 10.0.0.0 I Г" т и Частный адрес 10.0.0.1 Общедоступный адрес 221.222.223.224 |?в« Общедоступный адрес 111.112.113.114 Виртуальный частный адрес 192.168.0.1 Рис. 31.5. Каждая из машин, участвующих в VPN-соединении имеет "общедоступный* и "частный" IP-адреса, Частный адрес на локальной машине — это фиктивный адрес, привязанный к той же карте, что и общедоступный адрес
Виртуальные частные сети (VPN) I TTZ I Глава 31 I I На вашей локальной машине, имеющей только одну физическую карту Ethernet, ваш частный IP-адрес — это на самом деле внутренний "фиктивный" адрес, поскольку ваша машина не маршрутизирует никакого трафика кроме как к самой себе. Однако устройство gif 0 нуждается в частном адресе, чтобы правильно маршрутизировать. Вы должны привязать и общедоступный и частный адреса к вашей единственной карте Ethernet. Предположим, что IP-адрес вашей машины в общедоступном пространстве выглядит как 111.112.113.114 и что этот адрес уже привязан к карте fxpO. Вы можете создать виртуальный адрес 192.168.0.1 для использования с туннелем IPSec. Добавьте следующую строку к /etc/rc.conf непосредственно после строки, конфигурирующей карту: ifconfig_fxpQ_aliasO="inet 192.168.0.1 netmask 255.255.0.0" В дополнение предположим, что удаленный VPN-сервер имеет адрес 221. 2J22.223.224, и что этот сервер управляет внутренней частной сетью класса А с адресом 10.0.0.0, в которой его собственный частный адрес —10.0.0.1. Теперь вы можете сконфигурировать устройство gif 0, добавив следующую строку в /etc/rc. conf: ifconfig_gif0="inet 192.168.0.1 10.0.0.1 netmask 255.0.0.0" Эта строка создает "общедоступную" сторону соединения, направляя трафик с вашего общедоступного адреса 111.112.113.114 на общедоступный адрес сервера VPN, 221.222.223.224. И, наконец, создайте файл /etc/ipsec.conf и добавьте в него следующие строки: flush; spdflush; spdadd 192.168.0.1/32 10.0.0.0/8 any -P out ipsec esp/tunnel/111.112.113.114-221.222.223.224/require; spdadd 10.0.0.0/8 192.168.0.1/32 any -P in ipsec esp/tunnel/221.222.223.224-111.112.113.114/require; Строки spdadd управляют SPD и назначают правила, по которым должен шифроваться трафик FreeBSD. Обратит^ внимание, что есть две строки правил, и они являются зеркальными отражениями друг друга; это связано с тем, что вы создаете виртуальный механизм маршрутизации, а маршрутизаторы должны быть двунаправленными. Первая строка spdadd касается всего трафика, исходящего из частной сети вашей машины (192.168.0.1, с маской CIDR /32, что делает сеть синонимом вашего единственного IP-адреса) и предназначенного удаленной частной LAN (10.0.0,0 — сети класса А). Это говорит о том, что весь трафик, соответствующий этому шаблону, должен быть направлен по туннелю между двумя общедоступными адресами — 111.112.113.114 и 221.222.223.224. СОВЕТ Внеклассовая междоменная маршрутизация (Classless Inter-Domain Routing — CIDR) — это нотация сетевых масок. CIDR-маска /32 описывает сеть, которая соответствует 32 битам данного IP-адреса (сетевая маска 255.255.255.255) или, другими словами, состоящую из единственной машины. Макса CIDR /8 означает маску только в 8 бит длиной, то есть 255.0. о. о, что описывает сеть класса А.
946 Работа в сети FreeBSD Часть V Замените эти цифры адресами, корректными для вашей конфигурации; убедитесь, что вторая строка настроена как зеркальное отражение первой (см. выше). Перезапустите машину, чтобы убедиться, что все элементы конфигурации читаются ясно и чисто. НА ЗАМЕТКУ Удаленный VPN-сервер FreeBSD, вероятно, будет сконфигурирован аналогично вашей собственной машине, используя /etc/ipsec.conf и racoon. Однако важно, чтобы он имел свои собственные правила конфигурации, которые отражали те, что есть на вашей машине. Удаленный VPN-сервер FreeBSD должен быть настроен на отправку шифрованного трафика через его собственный интерфейс gif 0. Добавьте (или пусть администратор удаленной машины добавит) соответствующие строки spdadd, которые должны быть такими же, как те, что показаны здесь. Строки симметричны, так что если перевернуть цифры, то получится тот же набор строк, что и на вашей локальной машине, за исключением дескрипторов in и out: spdadd 10.0.0.0/8 192.168.0.1/32 any -P out ipsec esp/tunnel/221.222.223.224-111.112.113.114/require; spdadd 192.168.0.1/32 10.0.0.0/8 any -P in ipsec esp/tunnel/111.112.113.114-221.222.223.224/require; Теперь, когда ядро настроено на использование виртуального интерфейса gif 0, остается сделать только одну вещь: запустить racoon, который следит за исходящими потоками и обеспечивает соответствующий обмен ключами. Этот процесс осуществляется прозрачно и может вызвать небольшую задержку при отправке первых нескольких пакетов. Когда вы инсталлируете racoon, он создает сценарий запуска в /usr/local/etc/ red. Этот сценарий автоматически запускает racoon во время загрузки системы. Однако если вам понадобится запустить racoon, когда машина уже работает, вы можете сделать это, вызвав сценарий с параметром start: # /usr/local/etc/rc.d/racoon.sh start Попробуйте послать ping на машину в удаленной частной сети (например, ping 10.1.1.10). Если вы получите ответ, значит, туннель VPN работает! Подключение к VPN-серверу Windows В большинстве случаев удаленный VPN-сервер не будет машиной FreeBSD. Гораздо более вероятно в наше время, что это окажется сервер Windows 2000/2003. Однако это не составляет проблемы: после небольших поправок в racoon.conf на вашей стороне вы сможете подключиться к корпоративному серверу Windows совершенно гладко. Первое, что следует отметить — это то, что сервер Windows назначает идентифицирующие адреса динамически; поэтому в блоке remote anonymous закомментируйте весь набор строк, начиная с my_identif ier: #my_identifier address; #my_identifier user_fqdn "sakane@kame.net"; #peers_identifier user_fqdn "sakane@kame.net"; #certificate_type x509 "mycert" "mypriv";
Виртуальные частные сети (VPN) I TTZ I Глава 31 I I Затем перейдите в подблок proposal, чтобы указать методы шифрования и контрольных сумм, предпочитаемые Windows 2000: proposal { encryption__algorithm 3des; hash_algorithm md5; authenticationjnethod pre_shared_key ; dh_group 2 ; } И, наконец, опуститесь до блока sainf о anonymous и измените его следующим образом: sainfo anonymous { pfs_group 2; lifetime time 36000 sec- lifetime byte 50000 KB; encryption_algorithm 3des, des, cast 128, blowfish ; authentication_algorithm hmac_shal, hmac_md5; compression_algorithm deflate; } После этого нужно будет выполнить некоторую настройку со стороны Windows. Следующие инструкции касаются сервера Windows 2000; конфигурация Windows Server 2003 может несколько отличаться. 1. Запустите программу mmc в окне Command Prompt (Командная строка). 2. Выберите пункт Add/Remove Snap-In (Добавить или удалить оснастку) в меню Console (Консоль). 3. Добавьте оснастку IP Security Policy Management (Управление политиками безопасности IP), щелкнув на кнопке Add (Добавить) и затем выбрав оснастку во всплывающем окне. Выберите инсталляцию на локальней компьютер (опция по умолчанию). 4. Закройте окно Add/Remove Snap-In (Добавить/удалить оснастку) для завершения процесса. 5. Щелкните на IP Security Policies (Политики безопасности IP) в дереве, затем выберите Create IP Security Policy (Создать политику безопасности IP) в меню Action (Действие). Будет запущен мастер. Не активизируйте правило ответа по умолчанию (снимите отметку с флажка, который будет вам предложен); вместо этого отредактируйте свойства, когда будет дана возможность делать это. В диалоге Properties (Свойства) щелкните на кнопке Add (Добавить) для добавления нового правила. Убедитесь, что правило имеет следующие свойства: • Правило не специфицирует туннель. • Правило применяется к LAN. • Чтобы защитить обмен ключами, используйте строку — ту же строку "разделяемого ключа", что вы поместили в psk.txt (somesecurestring) в при- * веденном ранее примере. 6. В следующем разделе создайте новый фильтр IP, чтобы только трафик от исходного адреса подсети вашей машины Windows (или любого IP-адреса) в на-
948 Работа в сети FreeBSD Часть V правлении специфического адреса вашей машины FreeBSD подчинялся политике безопасности. Выберите этот новый фильтр. 7. Выберите действие фильтра Require Security (Требуется безопасность) и щелкните на кнопке Edit (Редактировать) для модификации правила, чтобы верхняя строка имела следующие свойства (используйте кнопки Move Up (Вверх) и Move Down (Вниз)): • АН отключено. • ESP Confidentiality (Конфиденциальность ESP) установлено в 3DES. • ESP Integrity (Целостность ESP) установлено в MD5. 8. Закройте мастер и проверьте список правил. Он должен выглядеть, как показано на рис. 31.6. [) о*** ***>* _a*Jj_Q о* Q m_ мтжштш паяя il ftcttor>,__^w? Eavorites lj jy+ JJ5NlXi Tn>jr*mtof| ¦щ.а наводи |?3 Console Root J jj JDeW^tton, |И flier* (Respond Orty) Communicate nomeIy(uns,,'—ffe ^Secure Server (Requires... For el IP traffic, alweysreq... No |йServer (Request Security) For el IP traffic, e*«y*raq... No EUta* No Рис. 31.6. Диалог IP Security Rules (Правила безопасности IP), показывающий новый, только что созданный фильтр; щелкните на флажке, предшествующем листингу фильтра, чтобы подключить его 9. Используя управляющую программу Component Services (Службы компонентов) (один из инструментов администрирования панели управления), перезапустите IPSec Policy Agent (Агент политики IPSec), как показано на рис. 31.7. Вы должны перезапускать агент после каждого внесенного в процессе отладки изменения, потому что это гарантирует, что изменения вступят в действие. 10. Активизируйте новую политику, щелкнув на флажке, предшествующем листингу фильтра в диалоге, показанном на рис. 31.6 (щелчок на флажке подключает фильтр). Теперь в другом окне командной строки запустите программу ipsecmon, чтобы увидеть правила туннеля в действии. В третьем окне попробуйте запустить ping на вашу машину FreeBSD. Первый ping выдаст сообщение "Negotiating IP
Виртуальные частные сети (VPN) Глава 31 949 Security" ("Взаимодействие с безопасностью IP "), но все последующие должны пройти успешно. Если это так, значит, ваш туннель IPSec работает. Л1М Rule» JGenetall Security rules fcx cowmunicatino with othei compter* IP Security Rutetf i IPfitorUt EFfee8SDi«not» |D<Dynefnio И i F3t« Action Require Security Default Response 1 Authentication., j Tu Pretheedltey № Kerberos Nc J »J A*t~ ?*.. В*»*» I P U«eAdd&**rf Dose fe^cd Рис. 32.7. Активизация новой политики безопасности с помощью флажка в программе nunc FreeBSD как сервер YPN Не всегда может быть так, что вам нужно лишь подключить одну машину FreeBSD к удаленной виртуальной частной сети. Возможно, вам придется настраивать собственную маршрутизируемую, транслируемую подсеть и создавать постоянный VPN- туннель к удаленной сети, чтобы использовать множество машин вашей собственной подсети. К счастью, поскольку вы уже установили интерфейс gif 0 для использования виртуального частного IP-адреса на вашей собственной локальной машине, переход к полностью маршрутизируемому VPN-каналу должен оказаться парой пустяков. Все, что для этого требуется — это вторая карта Ethernet на вашей машине, которая подключается к частной локальной сети. Следуйте инструкциям, перечисленным в предыдущем разделе, за исключением той части, где вы назначаете частный адрес (192.168.0.1) общедоступной карте Ethernet. Вместо этого назначьте его второй карте. Затем настройте строки spdadd на отображение сетевого адреса всей сети, которой вы управляете, вместо вашей единственной машины. Например, следующие строки в /etc/ipsec.conf должны открыть туннель для всей частной сети 192.168.0.0 (класс В с маской в 16 бит) на удаленный сервер VPN, позволяя машинам вашей сети общаться с машинами удаленной сети 10.0.0.0 и наоборот: 1 spdadd 192.168.0.0/16 10.0.0.0/8 any -P out ipsec esp/tunnel/111.112.113.114-221,222.223.224/require; spdadd 10.0.-0.0/8 192.168.0.0/16 any -P in ipsec 4 esp/tunnel/221.222.223.224-111.112.113.114/require;
950 Работа в сети FreeBSD Часть V Один последний момент, который следует отметить — для запуска правильной подсети машина FreeBSD должна будет выполнять всю работу по маршрутизации и обслуживанию NAT/брандмауэра. В противном случае вам понадобится специальное выделенное оборудование на вашем конце туннеля, чтобы выполнять эти задачи, равно как и на другом его конце. На рис. 31.8 показана топологическая организация сети, включая несколько потенциально допустимых мест для VPN-устройства или функциональности (помечено "VPN" в пунктирном прямоугольнике). VPN может обслуживаться выделенной машиной или же той же машиной, что служит брандмауэром или маршрутизатором. Если ваша машина FreeBSD выполняет все эти задачи самостоятельно, вам, вероятно, беспокоиться не о чем; однако, вы должны убедиться, что каждая часть функциональности правильно позиционирована в сети, чтобы корректные адреса были видимы устройствам, которым они нужны. Особенно имейте в виду, что если у вас где-то в сети присутствует функциональность VPN, то ваш брандмауэр почти наверняка должен быть настроен так, чтобы пропускать этот трафик с применением специальных правил. Более того, ваш маршрутизатор должен иметь возможность направлять туннельный трафик на устройство VPN и от него. Большинство ошибок в конфигурации VPN происходят от некорректного брандмауэра или маршрутизатора, который не принимает во внимание специальные требования адресации туннеля VPN. НА ЗАМЕТКУ Обратитесь в главу 28 за детальной информацией о маршрутизации подсети, используя FreeBSD наряду с конфигурацией NAT. Подробнее о брандмауэрах читайте в главе 30. Брандмауэр Маршрутизатор LAN Рис, 31,8, Топологическая диаграмма подсети, включающая LAN, брандмауэр, NAT, маршрутизатор и WAN, наряду с четырьмя потенциалъньши местами для размещения устройства VPN
32 ГЛАВА Сервер доменных имен В этой главе... • Введение в структуру, функции и программное обеспечение DNS • Включение демона сервера доменных имен • Запуск BIND в sandbox • Работа с конфигурационным файлом BIND (named.conf) • Создание файла зоны • Конфигурирование кэширующего сервера имен
Работа в сети FreeBSD В главах 22 и 23 было показано, как DNS (Domain Name System — система доменных имен) предоставляет общую схему именования для нахождения хостов в Internet, исключающую необходимость пользователям запоминать IP-адреса. Вы также изучили процесс настройки машины FreeBSD для сбора информации от назначенного сервера. Однако теперь мы обратимся к теме конфигурирования машины FreeBSD для того, чтобы она сама служила сервером доменных имен, предоставляя поисковую информацию себе и любой клиентской машине, которая к ней обратится. Служба доменных имен — один из наиболее сложных одиночных субъектов сетевого администрирования. Хотя достаточно легко настроить Web-сервер на каждом из любого количество различных серверов, какие вы можете инсталлировать в сети, и в любой из ситуаций, с которыми вам придется столкнуться за время жизни сети, однако инсталляция сервера имен — это нечто такое, что обычно выполняется только один раз. Во многих случаях инсталляцию выполняет "гуру", чья работа быстро входит в фольклор для остального персонала сети, в результате чего получается настройка DNS, которую трудно сопровождать или даже понимать. Администраторов, которые знают DNS изнутри и снаружи, гораздо меньше, чем тех, кто этого не знает. Мы не пытаемся в данной главе описать DNS полностью. Для этого существуют объемные книги, посвященные исключительно этой теме. Цель настоящей главы — научить вас настраивать вашу машину FreeBSD в качестве базового сервера имен в любой из нескольких распространенных конфигураций. Введение в структуру, функции и программное обеспечение DNS DNS — это иерархический протокол, работающий по всей сети Internet в манере, подобной работе маршрутизации. Множество "корневых серверов" поддерживаются университетами и правительственными организациями, распределенными географически в Internet из соображений обеспечения избыточности. Этот список корневых серверов сопровождается Корпорацией Internet по присвоению имен и номеров (Corporation for Assigned Names and Numbers — ICANN), и их местоположения перечислены на сайте http: //www. root -servers. org. Каждое доменное имя (например, example. com) определяется в обратном порядке от корневой зоны, с суффиксом домена — com, org, net и так далее — служащим верхним уровнем иерархии, непосредственно за одиночной точкой (.), которая ссылается на корневую зону. Ниже каждого из суффиксов (обычно известного как домен верхнего уровня — top level domains (TLD)) следуют рядовые доменные имена, каждое из которых обычно определено не корневыми серверами, а индивидуальными хостами DNS в Internet. Например, домен example. com должен иметь свой DNS, администрируемый сервером в его собственной сети, такой как nsl .example.com. Этот сервер является "официальным" хостом DNS для данного домена. Центральный реестр, также сопровождаемый IGANN, хранит записи об этих индивидуальных доменах, так что корневые сервера могут предо^ ставлять на них официальную поисковую информацию. Вы определяете эти "записи хостов", когда устанавливаете новый сервер имен, заполняя форму регистрации домена — у Network Solutions или любого из сотен других полномочных регистраторов, которые признаны ICANN. Когда клиент выполняет запрос DNS, он обращается к серверу имен, сконфигу-г рированному в настройках TCP/IP. Обычно это сервер в его собственной сети, как
Сервер доменных имен Глава 32 953 показано на рис. 32 Л. Если этот сервер не может ответить на запрос, он передает его на вышестоящий DNS, если таковой доступен. Если нет, то запрос отправляется непосредственно корневым серверам. Корневые серверы не поддерживают в себе никаких официальных данных DNS. Все, что на них есть — записи хостов, называемых записями NS, указывающие официальные серверы имен для каждого домена. Корневой сервер посылает обратно ответ DNS, направляющий на официальный сервер имен домена, который нужно найти клиенту. Последний отсылает запрошенные данные DNS на локальную машину, кото- рая возвращает их клиенту. Локальный DNS может сохранять поисковую информацию в кэше в течение периода времени, заданного официальным сервером имен. Это ускоряет процесс обработки запросов, позволяя локальным клиентам получать немедленные отклики на DNS-запросы от локального сервера, не пересылая его по Internet. Однако это означает, что изменения в записях DNS на официальном DNS-сервере не будут доступны клиенту до тех пор, пока не истечет срок хранения кэшированной копии. До этого момента информация DNS, видимая клиенту, остается статичной и потенциально неточной. Период времени между обновлениями информации кэша DNS может контролироваться для каждого домена с использованием значения Time-To-Live (TTL), о котором вы узнаете далее в настоящей главе. Корневые серверы на Записи хостов I / example.com J / =64.41.131.16 DNS 162 ns1 .example.com (официальный) Клиент | поиск: example.com Рис. 32J. Диаграмма поиска DNS, демонстрирующая путь от клиента к локальному DNS, корневым серверам и официальному серверу имен Программное обеспечение DNS: BIND Программное обеспечение DNS вездесуще. Для систем UNIX, которые составляют подавляющее большинство серверов имен в Internet, применяется программное обеспечение BIND от консорциума ISC (Internet Software Consortium — Консорциум Программного обеспечения для Internet). BIND — сокращение Berkley Internet Name Domain (Домен Internet-имен Беркли), состоит из одной главной программы-демона (named), набора библиотек распознавателя, обеспечивающих поиск имен, и различных инструментов администрирования. BIND встроен в FreeBSD, хотя и не включен по умолчанию.
Работа в сети FreeBSD Зоны BIND позволяет вам определять зоны — логические группы IP-адресов и имен хостов, которые существуют на определенном уровне иерархии имен DNS. Например, com. — зона, находящаяся внутри корневой зоны (.), а example.com. — зона, существующая внутри зоны com. Обратите внимание, что имена зон всегда оканчиваются точкой, указывающей на корневую зону — это будет важно, когда вы станете создавать файлы вашей зоны! Субдомены — это зоны, управляемые индивидуальными серверами доменных имен; cluster.example.com. — зона, которая может содержать в себе множество машин; на самом деле она может иметь в себе вложенные подразделения, если вы пожелаете их сконфигурировать. Зоны обеспечивают прямые поиски DNS, или отображения имен на IP-адреса. Аналогично, обратные поиски DNS, или отображения IP-адресов на имена хостов, управляются в зонах. Поскольку DNS и IP-адреса происходят от APRAnet (см. подробности в главе 22), и в основе своей сохранили неизменной свою структуру с тех времен, обратное DNS-имя зоны имеет форму CCC.BBB.AAA.in-addr.arpa. Это имя конструируется из адресного пространства IP в обратном порядке, с добавлением к нему .in-addr.arpa. Например, сеть 64.41.131.* должна быть определена зоной 131.41.64.in-addr.arpa. Каждая зона, которой будет управлять ваш сервер имен, должна быть определена в файле зоны — форматированной текстовой базе данных, хранящей определения отображений имен хостов на IP-адреса (или наоборот) внутри зоны. Файл зоны также содержит параметры для поведения зоны, такие как период хранения кэша. Файлы зоны — наиболее важная часть правильной конфигурации DNS; мы детально обсудим их позднее в настоящей главе. Файлы и программы BIND Поскольку BIND — встроенная часть FreeBSD, вам не нужно беспокоиться о его инсталляции или об обеспечении размещения нужных файлов в правильных местах. Хотя стоит знать, какие программы участвуют в работе сервера имен, и где следует проводить изменения конфигурации. • /usr/sbin/named. Сам демон сервера имен. Он прослушивает порт 53 на предмет входящих запросов на поиск DNS, используя и TCP, и UDP. UDP применяется для нормальных поисков имен для машин-хостов; TCP используется для более сложной инфраструктуры DNS, такой как перенос зон между серверами имен. • /usr/sbin/ndc. Программа контроля демона имен. Этот инструмент вы можете применять для запуска, останова, перезагрузки и мониторинга сервера named. Однако предпочитаемый метод управления демоном на FreeBSD — сценарий /etc/red/named, который работает, как описано в главе 14. • /etc/namedb. Вся ваша конфигурация BIND и файлы состояния времени выполнения, включая файлы определения зоны, находятся в этом каталоге (или любых вложенных подкаталогах, которые вы создадите). На самом деле, как будет показано в следующем разделе, это символическая ссылка на /var/named/ etc/namedb.
Сервер доменных имен Глава 32 955 • /etc/namedb/named.conf. Конфигурационный мастер-файл BIND. Этот файл сообщает BIND, какими доменами вы управляете, а также как следует обрабатывать каждый из них. Включение демона сервера доменных имен Включение BIND на FreeBSD — простейшая часть его конфигурирования. Все, что нужно для этого сделать, как и с другими встроенными службами FreeBSD, о которых мы говорили ранее — это добавить следующую строку в /etc/rc. conf: named_enable="YES" После установки этой опции named запускается автоматически во время загрузки системы. Чтобы запустить его без перезагрузки, воспользуйтесь соответствующим сценарием г с: # /etc/rc. d/named start Starting named. Запуск named. Теперь сервер запущен. Однако это лишь поверхностная часть конфигурации BJND. НА ЗАМЕТКУ Если вы включаете BIND на своей машине FreeBSD, внесите строку name server в файл /etc/ resolv.conf, ссылающуюся на адрес обратной петли (127.0.0.1), как первичный сервер имен. Таким образом, вы сможете быстрее всего выполнять поиски DNS — на вашей собственной машине. Убедитесь, что эти строки находятся перед любыми дополнительными серверами: search example.com nameserver 127.0.0.1 nameserver 64.41.131.167 Запуск BIND в sandbox Как вы видели в главе 27, часто имеет смысл (из соображений безопасности) запускать определенные службы внутри "песочницы" — sandbox, или структуры каталогов, которая создает иллюзию, что то, что в ней есть — это все, что имеется в файловой системе. В FTP это известно как chroot jail: это когда эффективный "корень" файловой системы изменяется, так что сервер и процессы, которые он создает, не могут видеть ничего вне своей собственной структуры каталогов выше определенной точки. BIND предоставляет подобную возможность, хотя в большей части документации это называется "sandbox", а не "chroot jail". Тем не менее, это та же самая концепция. , FreeBSD по умолчанию запускает named в "песочнице". (Эта предосторожность — ответ на множество брешей в безопасности, обнаруженных в named в последние годы.) Корень "песочницы" находится в каталоге /var/named; если вы заглянете в этот каталог, то найдете там вложенные подкаталоги /dev, /etc и /var — все они необходимы для работы named (который не может видеть реальные каталоги /dev, /etc и /var, когда запущен в режиме chroot). В самом деле, если вы включаете named,
Работа в сети FreeBSD то вторая файловая система устройств (devfs) монтируется в /var/named/dev. Это может показаться неожиданным, когда вы видите его в выводе df, но остальное необходимо для обеспечения правильной работы named в "песочнице". Набор символических ссылок необходим для того, чтобы не приходилось иметь дело с загадочным деревом каталогов /var/named. Каталог /etc/namedb, традиционно служащий конфигурационным каталогом для named — это символическая ссылка FreeBSD, указывающая на /var/named/etc/namedb; поэтому вы можете поместить файлы вашей зоны внутри /etc/namedb/master, и они в действительности окажутся в /var/named/edc/namedb/master — корректное местоположение внутри "песочницы" chroot. СОВЕТ Конфигурация по умолчанию named, работающего в "песочнице", появилась в середине серии FreeBSD 5.x. До этого файлы зоны сохранялись непосредственно в /etc/namedb, который в то время был обычным каталогом. Если вы сопровождаете унаследованную инсталляцию FreeBSD, то должны перенести свои файлы зоны в новую раскладку, скопировав их в /var/named/etc/ namedb/master (или slave), и затем удалив каталог /etc/namedb и заменив его символической ссылкой на /var/named/etc/namedb. Это позволит сценарию /etc/rc/namedb запускать правильно namedb с его защитой chroot. Не рекомендуется пытаться отключать или подавлять поведение named, связанное с "песочницей", но иногда ситуация того требует. Если вы вынуждены запускать named вне "песочницы", это можно сделать, добавив следующую строку в /etc/ re. conf: named_chrootdir=м,, Работа с конфигурационным файлом BIND (named, conf) Чтобы заставить ваш сервер имен делать что-то полезное, вам следует убедиться, что он находится топологически в правильном месте по отношению к своим клиентам и остальной сети, и что он сконфигурирован для правильного взаимодействия с другими серверами имен. Неправильно сконфигурированный сервер имен приводит к резкому возрастанию трафика между вашим сервером и корневыми серверами, поскольку он пытается безуспешно синхронизировать данные. Ваш файл /etc/namedb/ named.conf должен быть правильно составлен, а потому его нужно правильно понимать. ВНИМАНИЕ! У вас должно войти в привычку делать резервную копию файла named, conf (называя ее, например, named.conf .20061015), прежде чем вносить в него какие-либо изменения. Всегда оставляйте себе путь к отступлению — к вашей предыдущей работающей конфигурации! К счастью, BIND 9 (версия, включенная в FreeBSD на момент написания книги)- значительно упрощает многие загадочные детали конфигурации сервера имен, ко-
Сервер доменных имен Глава 32 957 торые были характерны для BIND 4 и более ранних версий. BIND 8, заменивший BIND 4, значительно добавил возможностей конфигурирования и в то же время исключил многие элементы, которые устарели или были неудачно спроектированы. BIND 9 продолжил это упрощение, В листинге 32.1 показан пример файла named.conf, дающий представление о его синтаксисе и структуре. Листинг 32.1. Пример файла /etc/namedb/named, conf /* * A simple BIND 8/9 configuration * Простая конфигурация BIND 8/9 */ logging { category lame-servers { null; }; category cname { null; }; }; options { directory "/etc/namedb"; }; zone "example.com" { type master; file "master/example.com"; }; zone "131.41.64.in-addr.arpa" { type master; file "master/131.41.64.in-addr.arpa"; }; 4 * * * ' • • zone "elsewhere.com" { type slave; file "slave/elsewhere.com"; masters { 113.125.2.145; }; }; zone "." { type hint; file "named.root"; }; zone "0.0.127.in-addr.arpa" { type master; file "master/localhost.rev"; }; zone "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.INT" { type master; file "master/localhost.rev"; }; -i
Работа в сети FreeBSD Как видно из этого листинга, конфигурационный файл состоит из множества блоков (или операторов) в стиле синтаксиса языка С, с вложенными операторами внутри фигурных скобок ({}). Все возможные операторы перечислены и описаны на странице man named.conf. Некоторые из наиболее полезных операторов — это options, controls, logging и zone. Комментарии в named.conf также представлены в стиле С; однострочные комментарии начинаются с двойного слэша (//), а блочные комментарии — в синтаксисе /* комментарий */. Также поддерживаются комментарии в стиле командной оболочки (#). Файл named, conf, существующий в инсталляции FreeBSD по умолчанию, включает некоторые из операторов, показанных в листинге 32.1. Он также содержит значительный объем документации, описывающей применение каждого из них. Всякий раз, внеся изменения в named, conf или в любой из файлов зон (о которых мы поговорим ниже в настоящей главе), перезапускайте named с помощью программы ndc: # ndc reload Reload initiated Перезагрузка активизирована Использование экспедитора Вспоминая топологию, показанную на 32.1, скажем, что forwarder (экспедитор) — это сервер имен в вышестоящей сети — более крупной сети, которая находится ближе к корневым серверам, — позволяющий вам запрашивать у него информацию DNS. (Обратите внимание, что доступ к серверу имен может быть ограничен, как вы вскоре убедитесь.) Хорошим кандидатом для экспедитора может быть вышестоящий сервер имен вашего ISP, если ваша машина FreeBSD служит сервером имен для домашней сети. Обычно если ваша машина не может ответить сама на запрос DNS, она должна запросить официальный ответ у корневых серверов (находящихся в /etc/ namedb/named. root). Эти дополнительные шаги требуют времени и увеличивают сетевой трафик. На самом деле нет необходимости всем постоянно получать официальные ответы. В большинстве случаев вполне допустимо работать с неофициальной информацией DNS, полученной от кэшированного сервера имен: # nslookup www.freebsd.org ns.exaniple.com Server: ns.example.com Address: 64.41.131.172 Non-authoritative answer: Name: freefall.freebsd.org Address: 216.136.204.21 Aliases: www.freebsd.org НА ЗАМЕТКУ Хотя в примерах этой главы используется устаревшая программа ns lookup (из-за ясности ее вывода), большинство администраторов заменяют ее более гибкой и красноречивой программой dig. Конфигурация вашей системы FreeBSD для запроса одного или более экспедиторов позволяет воспользоваться преимуществами кэша вышестоящего сервера имен,
Сервер доменных имен Глава 32 959 вместо извлечения официальных данных по калсдому запросу. Отрицательной стороной (как уже говорилось ранее) является то, что каптированные данные могут оставаться "неактуальными" в течение длительного времени, указанного в файле зоны официального сервера (период, часто изменяемый днями, хотя большинство экспедиторов используют разумно короткие значения TTL, что смягчает этот недостаток). На рис. 32.2 показан путь запроса DNS, в котором участвует экспедитор. Он выполняет большую часть работы, накапливая кэш собственными запросами и запросами по заказу его клиентов. Нижестоящий DNS, указывающий на него, нуждается лишь в запросе к экспедитору, что предотвращает нежелательные задержки и рост трафика запросов. Корневые серверы В Записи хостов ns1 .example.com (официальный) поиск: example.com Рис. 32.2, Диаграмма поиска DNS, включающая экспедитора, который предоставляет копированную информацию DNS в неофициальном виде локальным DNS и клиенту СОВЕТ "Потоп" DNS-трафика, упомянутый ранее, часто вызван серверами имен, сконфигурированными неправильно, которые никогда не использует преимущества кэшируемых серверов имен. Эти экспедиторы предотвращают излишний трафик от низкоуровневых ссылок, например, для обслуживания хостов DNS в качестве официального сервера имен для домена с малым DSL или коммутируемым каналом. Без кэширующих серверов имен каждый хост в Internet должен был бы посылать запросы DNS, перегружая сервер имен непосредственно. С экспедиторами загрузка канала целевого хоста значительно сокращается. Их использование — хороший тон для добропорядочного гражданина сети, а, кроме того, это ускоряет выполнение ваших собственных запросов и повышает их эффективность. Чтобы разрешить использование экспедитора, замените 12 7.0.0.1 в блоке forwarders оператора options IP-адресом вышестоящего сервера имен (127.0.0.1 — адрес localhost здесь не будет работать) и уберите комментарий с блока, удалив дескрипторы /* и */: forwarders { 127.0.0.1; 66.114.72.112; >; */
Работа в сети FreeBSD Часть V Вы можете специфицировать столько экспедиторов, сколько хотите, и named будет обращаться к каждому из них, прежде чем сдастся и обратится к корневым серверам. Вы можете дополнительно убрать комментарий с оператора forward only; в блоке options, чтобы заставить named обращаться только к экспедиторам во всех запросах. Обычно ваша машина будет обращаться к экспедиторам за данными DNS, если только они не окажутся недоступными или разрушенными — в этом случае выполняются полные запросы к корневым серверам. Установка опции forward only; предотвращает запросы к корневому серверу в любом случае. Конфигурации ведущего и ведомого Каждый блок zone определяет домен или субдомен, который будет администрировать ваша машина FreeBSD. Чаще всего блок zone определяет домен в форме example. com: zone "example.сот" { type master; file "master/example.com"; }; Все, что абсолютно необходимо в этом блоке — это имя домена или субдомена (без хвостовой точки, которая обычно ассоциируется с именем зоны), оператор type, определяющий, является ли это конфигурацией ведущего или ведомого для этого домена, и имя файла, содержащего информацию о зоне (относительно корня /etc/namedb, который на самом деле /var/named/etc/namedb). Давайте проверим, что это значит для сервера имен — выполнять функции ведущего (master) или ведомого (slave) для определенной зоны. Вложенный оператор type может принимать значения master, slave, stub, forward или hint. Чаще всего используются master и slave; остальные применяются только при определенных условиях, которые будут рассмотрены ниже. Зона master указывает, что сервер является официальным в своей зоне; это значит, что сервер обладает мастер-копией файла зоны, определяющего отображения имен на адреса, которые подлежат распространению через Internet, и любые изменения в нем должны выполняться вручную, но эти изменения переопределяют информацию в кэше каждого другого сервера имен DNS, когда эта информация устаревает. Зона slave — реплика мастер-зоны, полученной от другого сервера, с файлом зоны, унаследованным от одного из тех, что имеет мастер. Ведомые (slave) сервера могут предоставлять официальные ответа на запросы DNS. Блок зоны slave выглядит так: zone "elsewhere.com" { type slave; file "slave/elsewhere.com"; masters { 113.125.2.145; }; }; Оператор masters содержит разделенный точками с запятой список ведущих серверов, от которых передается информация зоны. Эти ведущие серверы могут быть действительными официальными ведущими серверами зон либо другими ведомыми, но если специфицированный ведущий имеет оператор allow-transfer в своей гло- 960
Сервер доменных имен I ГГЗ I Глава 32 I I бальной конфигурации, IP-адрес ведомого должен быть перечислен в этом операторе. (Ограничения доступа обсуждаются ниже в настоящей главе.) Оператор file в ведомой зоне ссылается на имя автоматически сгенерированного файла зоны, который named создаст, когда получит его от ведущего. В данном примере файл elsewhere.com автоматически сгенерирован внутри подкаталога /etc/namedb/slave. Файлы ведущей зоны, который вы создаете вручную, хранятся в подкаталоге master. СОВЕТ Когда вы настраиваете ведомую зону на своем сервере, запустите ndc reload, чтобы заставить BIND выполнить перенос зоны и создать новый файл зоны в месте, которое вы специфицируете в операторе file. Когда изменения проводятся в файле ведущей зоны на ведущем сервере имен, ваш ведомый сервер наследует изменения только после истечения периода хранения кэша, указанного в файле. Вы можете принудительно немедленно обновить этот файл, просто удалив файл зоны в каталоге slave и введя команду reload, чтобы пересоздать его. Прежде чем вводить команду ndc reload, убедитесь, что каталог /etc/namedb/slave существует; в противном случае эта команда завершится неудачей. Другие типы зоны Как описано в man named, conf, вы можете иметь блоки zone трех других типов. Эти следующие типы: • stub. Зона stub работает так же, как зона slave, но с тем отличием, что передает только записи NS — записи, специфицирующие, где клиенты могут найти корректную информацию DNS для указанного домена. • forward. Вы можете использовать тип зоны forward для пересылки запросов зоны на другой сервер или множество серверов. Блок forwarders может быть специфицирован в операторе zone этого типа, действуя как глобальный в блоке options; это позволяет вам переопределить глобальный список forwarders. • hint. Зона hint используется только в сочетании с начальным списком потенциальных корневых серверов, находящихся в /etc/ namedb / name d • г о о t. Этот начальный список не является на самом деле официальным списком корневых серверов; это список "подсказок" для BIND, указывающих серверы, которые содержат текущий правильный список корневых серверов. Содержание этого списка имеет тенденцию изменения вместе с изменяющимися условиями в сети. Ограничение доступа к DNS В сложной конфигурации DNS интерес для администраторов может представлять способность BIND ограничивать доступ на базе списков управления доступом (Access Control List — ACL). Требование ACL не является обязательным, но они могут значительно упростить конфигурирование сервера, позволяя применять сокращенные имена для списков адресов, которые вы склонны использовать многократно. ACL специфицируется оператором acl, который задает имя списка и содержит критерии включения в него хостов. Эти критерии могут принимать множество разных форм
Работа в сети FreeBSD и могут быть рекурсивными; другими словами, ACL может содержать в себе Другие ACL. Следующие ACL являются предопределенными. • any — разрешает все хосты. • попе — запрещает все хосты. • localhost — разрешает IP-адреса всех интерфейсов вашей системы. • localnets — разрешает любой хост в сети, для которой у системы есть интерфейс. Другие допустимые типы элементов списка могут быть IP-адресами (например, 111.112.113.114), сетями в формате CIDR (например, 111.112.113/24), "отрицающей" версией того и другого (1111.112.113.114 — означает "любой хост кроме 111.112.113.114") или оператором key (используется в защищенных DNS-транзак- циях, тема которых выходит за рамки данной главы). Когда вы компилируете список элементов ACL, то лучше поместить более специфичные элементы перед более общими, поскольку список оценивается в порядке следования его содержимого. Если хост соответствует любому элементу, он будет разрешен, независимо от того, что обнаружится соответствие этого хоста последующему "отрицающему" элементу. Поместите все исключения в начало списка. Поскольку содержимое named.conf читается последовательно, ACL должен быть специфицирован в файле до того, как к нему будет выполнено обращение. Лучше всего поместить оператор acl в начало файла named, conf, перед блоком options. Пример ACL может выглядеть следующим образом: acl "my_list" { localhost; localnets; another_list; •132.112.14.124; 132.112.14/24; }; Этот список в начале содержит встроенные ACL localhost и localnets, а затем — другой ACL по имени another_list, который должен быть определен в файле где-то в другом месте. Далее следует хост (132.112.14.124)с префиксом !, что исключает его из указанной следом подсети 132.112.14/24. Таким образом, ACL содержит все, что есть в подсети, за исключением единственного хоста 132.112.14.124. После того, как у вас специфицирован список, вы можете использовать его позднее наряду с другими адресами-элементами списка в операторе zone (для управления доступом к запросам только для этой зоны) или в глобальном операторе options. Ниже приведен список возможных операторов контроля доступа. • allow-query { address_JListjelem&nts; ...}; Специфицирует хосты, которым разрешено выполнять обычные запросы DNS. allow-query может также быть специфицирован в операторе zone — в этом случае он переопределяет оператор options allow-query. Если не указан, по умолчанию разрешает запросы от всех хостов. • allow-transfer { address_2ist_elements; ...}; Указывает, каким ведомым (slave) серверам разрешено принимать переносы зон от данного сервера, allow-transfer также может быть специфицирован в опера-
Сервер доменных имен Глава 32 963 торе zone — в этом случае он переопределяет оператор options allow-transfer. Если не указан, по умолчанию разрешаются все переносы от всех хостов. • allow-recursion { address_2ist_elements; ...}; Специфицирует хосты, которым разрешено выполнять рекурсивные запросы через этот сервер. Если не указан, по умолчанию рекурсивные запросы разрешены от всех хостов. • blackhole { address^listjelements; ...}; Специфицирует список адресов, от которых сервер не будет принимать запросы или использовать для их распознавания. Запросы с этих адресов останутся без ответов. Например, вы можете ограничить запросы глобально только членами ACL my_list, специфицированного ранее. Вы также можете ограничить запросы для домена example. com до членов my__list, наряду с дополнительной сетью, и ограничить переносы зон только двумя специфицированными ведомыми серверами следующей частичной конфигурацией: options { directory "/etc/namedb"; allow-query { my_list; }; }; zone "example.com" { type master; file "example.com"; allow-query { my_list; 64.2.43/24; }; allow-transfer { 64.2.43.167; 123.15.221.3; }; }; Создание файла зоны Файл зоны — это место, где определены отображения имен хостов и IP-адресов внутри домена; это также место, где обычно допускается большинство ошибок в конфигурации BIND, поэтому рассмотрим его подробно. Формат файла зоны (часто называемого мастер-файлом зоны или просто мастер- файлом) достаточно сложен и регламентирован, хотя некоторые вещи вы можете отбросить. "Живой" файл зоны в существующей установке BIND не может быть непонятным. Он помогает понять, какого рода примитивы (директивы) допускаются и как каждая из них специфицируется, а также какие сокращения допустимы и обычно используются. Для начала рассмотрим простой файл зоны и его компоненты, показанные в листинге 32.2. Обратите внимание, что точка с запятой — это символ комментария в файлах зон. Листинг 32.2, Пример файла зоны для домена example .сош $TTL 3600 example^com. IN SOA stripes.example.com. root.example.com. ( 2006101000 ; Серийный номер 10800 ; Обновление 3600 ; Повтор
964 Работа в сети FreeBSD Часть V ; Серверы DNS @ IN NS @ IN NS ; Имена машин localhost IN A nsl IN A ns2 IN A mail IN A @ IN A 604800 ; Истечение срока 86400 ) ; Минимальное TTL stripes.example.com. spots.example.com. 127.0.0Л 64.41.131.162 64.41.131.163 64.41.131.167 64.41.131.162 ; Псевдонимы www IN CNAME ftp IN CNAME ; Запись MX @ IN MX 10 www.example.com. mail.example,com. Хотя это может показаться неформатированной мешаниной, на самом деле этот файл имеет строгую структуру. Листинг 32.2 состоит из шести базовых элементов. • Директива $TTL. • Запись SOA (Start of Authority — начальная запись зоны). • Блок записей NS (Name Server — сервер имен). • Блок записей A (Address — адрес). • Блок записей CNAME (Canonical Name — каноническое имя), определяющий псевдонимы. • Запись MX (Mail Exchanger — обмен почтой). Помимо директив, каждый элемент файла является записью ресурса (resource record— RR), определяющей свойства имени в пределах зоны, относительно определенного "начала". Следующие разделы рассматривают каждый из этих элементов по порядку. Начальные записи зон (S0A) Вслед за базовыми директивами, которые могут появляться в начале файла (такими как $TTL, которая специфицирует время жизни по умолчанию), мы подходим к первой записи ресурса в файле зоны: записи SOA (Start of Authority — начальная запись зоны). Это наиболее важная часть файла зоны, и чаще всего выполняемая небрежно. Много ошибок являются результатом неинтуитивного стиля формата записей SOA. Чтобы понять эту запись, вам нужно разобрать ее "по косточкам". Вот пример записи SOA из листинга 32.2: example.com. IN SOA stripes.example.com. 2006101000 10800 3600 604800 86400 ) root.example.com. ( Серийный номер Обновление Повтор Истечение срока Минимальное TTL
Сервер доменных имен I ГГГ I Глава 32 I I SOA, как и все записи, имеет следующую базовую форму: name [ttl] [class] type value Если имя пате не абсолютно, то к нему добавляется текущее содержимое директивы $ ORIGIN (которое начинается с того же значения, что и соответствующий оператор zone в файле named.conf). В данном случае оно абсолютно (заканчивается точкой). Поле ttl опущено, потому что файл примера имеет глобальную директиву $TTL, описывающую его. IN (для "Internet") — это класс; BIND поддерживает другие виды классов, но они нас пока не интересуют. Если in специфицировано в операторе zone в файле named, conf, это поле является устаревшим и может быть опущено. Поле value в большинстве записей достаточно простое — IP-адрес, имя хоста или некоторое символическое имя. В записи SOA, однако, оно более сложно. Прежде всего, оно начинается с имени официального сервера имен зоны (stripes.example.com). Следующий фрагмент информации — адрес электронной почты администратора домена с символом @, замененным точкой. Может присутствовать также хвостовая точка. В нашем примере администратор (root@example.com) указан как root. example. com., и это будет использоваться BIND для отправки нотификаций о состоянии ответственному лицу. НА ЗАМЕТКУ Причина замены @ точкой в адресе электронной почты состоит в том, что символ @ в файле зоны имеет специальное значение. Это сокращение текущего значения директивы $ origin, которое разворачивается BIND в полное квалифицированное доменное имя. Обратите внимание, что символ @ должен быть полным ключом, если вы используете его; он не может расширяться неявно, как в www.8 или подобной конструкции. Следующий далее адрес администратора представляет собой параметризованный блок настроек; скобки специфицируют блок, в котором игнорируются переносы строк, поэтому вы можете форматировать значения для большей ясности. Это числа, определяющие поведение данных зоны в Internet. • Серийный номер. Это способ, которым BIND отслеживает актуальность файла зоны. При каждом обновлении файла зоны вы должны увеличивать число, чтобы BIND знал, что нужно обновить эту информацию из файла. Стандартная практика состоит в использовании для этого числа формата YYYYMMDDNN (год, месяц, день, номер обновления); последние два знака — для номера обновления на протяжении дня. Обновляйте число, чтобы оно отражало день проведения изменений. НА ЗАМЕТКУ Когда вы используете ndc reload для обновления информации файла зоны, BIND автоматически определяет, что данные должны быть обновлены — независимо от серийного номера. Однако аккуратная поддержка корректного серийного номер — полезная привычка; это гарантирует правильность операций в таких случаях, как ручное обновление данных ведомой зоны.
Работа в сети FreeBSD • Частота обновления. Это число в секундах задает частоту проверки ведомыми серверами ведущих для обновления данных зоны. Если серийный номер ведущего изменился с момента последней синхронизации зоны, будет выполнен перенос зоны. • Частота повтора. Если не удается подключиться к ведущему серверу, ведомые будут повторять попытки с интервалом, указанным в этом параметре (в секундах). • Время истечения. Если не удается подключиться к ведущему серверу в течение этого времени (в секундах), ведомые серверы отбрасывают все свои данные о зоне. • Минимальное значение TTL. Это число (в секундах) указывает, насколько долго следует удерживать ответы "негативного кэша" (указывающего на отсутствие фрагмента данных). Записи серверов имен (NS) В листинге 32.2 содержатся следующие примеры записей серверов имен (Name Server - NS): ; Серверы DNS @ IN NS stripes.example.com. @ IN NS spots.example.com. Эти записи специфицируют серверы DNS, которым разрешено давать официальные ответы на запросы, касающиеся зоны. Обратите внимание, что символ @ представляет собой ссылку на текущее значение $ ORIGIN (которое в данном случае — example. com.), и что оба имени серверов включают хвостовые точки (указывающие на то, что они абсолютны). Вы можете создавать записи NS для субдоменов, или зон внутри текущей зоны. Например, предположим, что у вас есть кластер машин внутри зоны по имени cluster.example.com., с их информацией DNS, обрабатываемой его собственным сервером имен (ns,cluster.example.com). Корректная запись NS об этом сервере, позволяющая внешним хостам опрашивать его об IP-адресах кластера, должна выглядеть так: cluster IN NS ns.cluster.example.com. Помните, что отсутствие хвостовой точки после cluster заставит BIND добавить текущее значение $ORIGIN (example. com). Записи адресов (А) Запись адреса (А), или запись хоста — это то, что вы используете для ассоциации имени хоста с IP-адресом. Наш пример содержит следующие записи: ; Имена машин localhost IN A 127.0.0.1 stripes IN A 64.41.131.162 spots IN A 64.41.131.16a mail IN A 64.41.131.167 0 IN A 64.41.131.162
Сервер доменных имен [ T7Z I Гпа»аЯ9 I 967 I Смысл этих записей достаточно очевиден. Неквалифицированные имена слева дополняются текущим значением $ORIGIN. Поэтому имя mail .example, com должно распознаваться как 64.41.131.167. Аналогично символ 0 расширяется так, чтобы запрос example.com возвращал 64. 41.131.162. Имена, определенные в записях А называются каноническими именами, в противоположность псевдонимам (которые определятся записями CNAME). Записи канонических имен (CNAME) Записи канонических имен (CNAME) служат для создания псевдонимов. Терминология такова, что в нашем примере из листинга 32.2, псевдоним www (который расширяется с $ORIGIN до www.example.com) указывает на каноническое имя 0, или example. com. (чей IP-адрес определен в блоке записей А): ; Псевдонимы / - www IN CNAME @ ftp IN CNAME www.example.com. НА ЗАМЕТКУ . Важно помнить, что хвостовая точка в конце имени хоста указывает на то, что имя абсолютно (полностью квалифицировано). Если точка опущена, то значение $origin добавляется автоматически. Если вы обнаружите, что ваши программы ищут хост по имени вроде www.example.com. example.com, то знайте, что в этом повинна конфигурация DNS, в которой имя хоста осталось неквалифицированным и нуждается в добавлении точки. Записи CNAME часто удобны тем, что они не связываются немедленно с IP-адресами. Вы можете использовать записи CNAME для указания на имена в другой зоне, например, которая затем может управляться владельцем этой зоны. К тому же записи CNAME полезны для уменьшения количества изменений, которые могут быть проведены в файле зоны при изменении IP-адреса. Записи обмена почтой (MX) Записи обмена почтой (Mail Exchanger — MX) определяют, какие хосты должны быть использованы для доставки почты по адресам зоны. Sendmail (и другие МТА) ищут наиболее предпочтительную запись MX внутри зоны и открывают соединение с ней; вы можете найти хосты MX для домена командой host: # host somecompany.com somecompany.com has address 207.114.98.18 somecompany.com имеет адрес 207.114.98.18 somecompany.com mail is handled (pri=100) bymail.uu.net Почта somecompany.com обрабатывается (приоритет=100) mail.uu.net somecompany.com mail is handled (pri=5) bymx-l.somecompany.com Почта somecompany.com обрабатывается (приоритет=5) mx-1. somecompany.com Каждая запись MX имеет уровень "приоритета", ассоциированный с ним, и почтовые серверы домена перебираются от минимального до максимального числового значения приоритета, пока не будет установлено успешное SMTP-соединение. Приоритет указывается как часть поля значения записи, как в следующем примере, где установлен приоритет 10:
968 Работа в сети FreeBSD Часть V ; Запись MX @ IN MX 10 mail.example.com. ВНИМАНИЕ! Запись MX не может указывать на IP-адрес — вы должны задать имя. К тому же многие МТА и почтовые клиенты "ругаются", если обнаруживают запись MX, указывающую на CNAME. Убедитесь, что ваши записи MX указывают на определенные имена, специфицированные где-то записями А! Записи указателей (PTR) Записи указателей (Pointer — PTR) — противоположность записей А или CNAME и используются в файлах зон обратного просмотра DNS (например, 131.41. 64 . in-addr .агра) для отображения IP-адресов на доменные имена. (Пример файла зоны обратного просмотра DNS показан в листинге 32.3.) Можно специфицировать более одной записи PTR для данного IP-адреса — это практика конфигурации, которая все шире применяется для таких целей, как контроль спама. Однако, поскольку обратный DNS-поиск возвращает только одно имя, многие администраторы прикрепляют только одну запись PTR к заданному IP-адресу, даже если существуют другие имена хостов, преобразуемые в этот адрес; это значит, что файлы зон обратного просмотра часто короче, чем их аналоги для прямого просмотра. Файлы зон обратного просмотра DNS Файл зоны обратного просмотра DNS, определяющий зону в форме 131.41. 64. in-addr .агра, используется для отображения IP-адресов на имена. Файлы подобного рода указываются в named, conf и распространяются на ведомые серверы почти так же, как файлы зон прямого просмотра DNS. В листинге 32.3 показан пример файла зоны обратного просмотра DNS. Листинг 32.3. Пример файла зоны обратного просмотра DNS для зоны 131.41.64. in-addr. агра $TTL 3600 131.41.64.in-addr.агра. INSOAstripes.example.com. root.example.com. ( 2006101000 ; Серийный номер 10800 ; Обновление 3600 ; Повтор 604800 ; Истечение срока ii 86400 ) ; Минимальное TTL stripes.example.com. spots.example.com. stripes.example.com. spots.example.com. mail¦example.com. @ 8 162 163 167 IN NS IN NS IN PTR IN PTR IN PTR
Сервер доменных имен Глава 32 969 Обратите внимание на использование записей PTR вместо записей А или CNAME. Имя, на которое указывает каждая запись PTR — это каноническое имя для этого IP- адреса. В файле зоны обратного просмотра также нет необходимости в записях MX, прежде всего потому, что записи MX не могут ассоциироваться с IP-адресами. Создание файла зоны localhost Для правильной работы зоны localhost (0 .0 ¦ 127 . in-addr. apra) должен существовать специальный файл зоны. В каталоге /etc/namedb имеется специальный сценарий оболочки, который поможет вам его создать. Сценарий называется make-localhost, он читает шаблон (PROTO. localhost.rev) и наполняет его информацией, полученной на основе вашего ввода. Поскольку он не является исполняемым, его следует запускать с помощью команды sh: # sh make-localhost Enter your domain name: example.com Введите имя вашего домена: example,com Полученный в результате файл /etc/namedb/master/localhost.rev должен выглядеть примерно так, как показано в листинге 32.4. Листинг 32.4. Автоматически сгенерированный файл зоны localhost .rev ; From: @(#)localhost.rev 5.1 (Berkeley) 6/30/90 ; $FreeBSD: src/etc/namedb/PROTO.localhost.rev,v 1.6 2000/01/10 ^15:31:40 peter Exp $ This file is automatically edited by the "make-looaihost1 script in. the /etc/namedb directory. Этот файл автоматически отредактирован сценарием чmake-localhost1 из каталога /etc/namedb. $TTL 3600 @ IN SOA stripes.example.com. root.stripes.example.com. ( 2006101000 ; Серийный номер 3600 ; Обновление 900 ; Повтор 3600000 ; Истечение срока 3600 ) ; Минимальное TTL IN NS stripes.example.com. 1 IN PTR localhost.example.com. Не забудьте создать этот файл перед полным развертыванием службы DNS! Конфигурирование кэширующего сервера имен Вполне возможно запустить сервер имен, который не является официальным ни для одной зоны. Это называется кэширующим сервером имен, и его задача состоит исключительно в выполнении запросов DNS по просьбе клиентов и сохранении результатов для последующего использования. Это противоположный эффект опции forward
I q7~ I Работа в сети FreeBSD II ЧастьУ only, о которой говорилось выше в главе. В то время как сервер имен forward only должен передавать все запросы на обработку своему экспедитору, кэширующий сервер имен выполняет все запросы самостоятельно и кэширует полученные результаты. Другие серверы имен могут установить его в качестве экспедитора, используя результаты ранее выполненной им работы. Чтобы сконфигурировать кэширующий сервер имен, просто пропустите все операторы zone в своем файле named, conf, кроме тех, что необходимы для его собственной работы. В листинге 32.5 показан пример такой конфигурации. Листинг 32,5. Пример файла /еtc/namedb/named.conf /* * Простая конфигурация BIND 8 V logging { category lame-servers { null; }/ category cname { null; }; }; options { directory "/etc/namedb"; }; zone "." { type hint; file "named.boot"; }; zone "0.0.127.in-addr.arpa" in { type master; file "master/localhost.rev"; >; zone "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.1Р6.INT" { type master; file "master/localhost.rev"; }; Поскольку кэширующий сервер имен — просто "вырожденный случай" полностью сконфигурированного сервера имен, вы можете легко расширить функциональность вашего сервера, со временем добавив к нему дополнительные зоны. Между этими двумя "режимами" нет принципиальной разницы. Ваша конфигурация DNS будет со временем изменяться по мере развития сети. Каждый раз, когда добавляется новый хост или изменяется его имя, и каждый раз, когда вы добавляете к зоне или удаляете начальную запись сервера имен, вам придется вносить изменения в конфигурацию. Поэтому вам стоит практиковаться в администрировании DNS, чтобы эти задачи со временем становились для вас все более и более естественными.
33 ГЛАВА Сетевая файловая система В этой главе... • Введение в NFS • Конфигурирование сервера NFS • Конфигурирование клиента NFS • Демон автоматического монтирования (amd)
I TZI I Работа в сети FreeBSD 1 1 Часть V Сетевая файловая система (Network File System — NFS) представляет собой способ совместного доступа к файлам в системах UNIX. Windows и Mac OS имеют собственные механизмы совместного доступа к файлам, позволяющие включенным в сеть компьютерам обращаться к файлам на удаленных машинах в локальной сети, как если бы они были локальными. NFS предоставляет те же преимущества машинам UNIX, но с несколькими дополнительными возможностями, которые отсутствуют у других протоколов совместного доступа, хотя также и не без ограничений. В этой главе будет описано, как сконфигурировать вашу машину FreeBSD для выполнения функций сервера и/или клиента NFS, разделяющего файлы с другими машинами UNIX по вашей локальной сети или Internet. Введение в NFS Windows использует NetBIOS/SMB/CIFS для совместного использования файлов, a Macintosh — AppleTalk и AppleShare/IP. Это все одноранговые протоколы, в которых каждая система сообщает о своем присутствии в LAN, и все машины могут монтировать совместно используемые папки друг друга динамически. NFS несколько отличается тем, что это — клиент-серверный протокол, с выделенными серверами, позволяющими монтировать свои каталоги специфицированным клиентам NFS. Такая модель предназначена для организации централизованных файловых серверов, как это принято в сетях предприятий или университетов» Однако при правильной конфигурации NFS может делать почти все то же, что и другие протоколы, и даже более, за исключением обнаружения сервера (server discovery). Под Windows и Mac OS встроенные протоколы совместного использования файлов на компьютерах рассылают информацию о своих собственных совместно используемых ресурсах и запрашивают в сети другие доступные ресурсы подобного рода. Эти запросы на обнаружение и ответы посылаются каждой машиной сети и инициируют частые ответы от всех других машин — в результате получается довольно "болтливая" сетевая среда. NFS не имеет такого механизма обнаружения. Как вы увидите, каждый клиент NFS должен знать, где искать каждый сервер и монтирует его вручную. Однако это значит, что сеть гораздо меньше нагружена, благодаря отсутствию трафика обнаружения. СОВЕТ Протокол поиска сервера {Server Location Protocol — SLP) — это отдельная технология, позволяющая выполнять автоматический поиск и просмотр сетевых ресурсов, таких как совместно используемые ресурсы NFS. Вы можете инсталлировать пакет OpenSPL (в категории net коллекции портов и пакетов), чтобы обеспечить своей машине FreeBSD возможность обнаружения ресурсов NFS в сети; современные версии Windows и Mac OS X имеют встроенную функциональность в их файловых браузерах. Однако в отсутствие SLP вы должны знать имя и местоположение (и требования аутентификации) каждого ресурса NFS, который вы собираетесь монтировать. Такая менее удобная структура NFS имеет собственные преимущества. Централизованная модель обеспечивает лучшую безопасность; сервер может контролировать явно то, какие клиенты способны подключаться к нему — например, по имени хоста и IP-адресу или через централизованную регистрацию вроде NIS или Kerberos. Другое свойство NFS состоит в том, что благодаря тому, что он не зависит от широковеща-
Сетевая файловая система Глава 33 973 тельных рассылок для обнаружения серверов, он может быть использован в Internet почти так же легко, как и в пределах LAN. Клиент в Бостоне при необходимости может монтировать ресурс сервера из Сан-Франциско. В отличие от этого протоколы NetBIOS/SMB/CIFS и AppleTalk могут оперировать только "доменами" и "зонами" в локальной сети либо через туннель VPN, где все хосты топологически расположены в той же LAN (хотя AppleShare/IP может свободно работать через Internet). В контексте FreeBSD файловая система NFS подобна любой другой. Вы можете монтировать ресурс NFS по сети, как монтируете дискету или новый раздел жесткого диска, как было рассказано в главе 12. Каталоги совместного доступа даже могут монтироваться автоматически, когда запрашиваются их ресурсы. Далее в этой главе мы с вами пройдем процедуры монтирования ресурсов NFS вручную и автоматически. Клиент-серверная структура NFS спроектирована так, чтобы можно было централизовать ресурсы вашей сети. Например, предприятие может выделять всем своим сотрудникам домашние каталоги на центральной машине UNIX, и все прочие системы в сети, поддерживающие NFS, будут иметь возможность монтировать эти домашние каталоги и обращаться к ним удаленно, не требуя наличия копии каждого домашнего каталога на каждой машине. На рис. 33.1 показана такая топология сети в действии. То же самое можно сделать с каталогами сборки (в окружении разработки программного обеспечения) или с совместно используемыми приложениями, установленными централизованно (как в университетском кластере рабочих станций). Монтирование NFS может применяться в сочетании с NIS (централизованным управлением входами пользователей) для предоставления целой сети с пользовательской аутентификацией; затем принадлежность и права доступа к каждому файлу в смонтированном ресурсе работает так, как на самой машине NFS-сервера. Вы можете даже инсталлировать FreeBSD через NFS, если смонтируете инсталляционный DVD на NFS-сервере и укажете его программе Sysinstall. Сервер NFS Клиенты NFS Рис. 33.1. Сеть предприятия с центральными домашними каталогами, монтируемыми в NFS Интересный аспект NFS заключается в том, что эта система в основном базируется на UDP, а не TCP. Как вы знаете из главы 22, UDP не обладает надежностью ориентированной на соединения структуры TCP и, следовательно, ненадежен. Хотя это кажется странным, что ответственный по отношению к данным сетевой протокол должен использовать UDP в качестве транспортного механизма, выбрасывающего
I "ZZZ I Работа в сети FreeBSD 974 —— I * I ЧастьУ дейтаграммы из сервера клиенту без какой-либо гарантии их целостности, NFS — на самом деле является одним из лучших примеров правильного использования UDP. Полноценное TCP-соединение здесь на самом деле не нужно, особенно в локальных сетях. Клиенты NFS появляются и исчезают в сети при включении и выключении их машин, а TCP-соединение должно постоянно поддерживать потоки данных, пересылающие файлы и информацию каталогов туда и обратно между конечными точками по запросу. Монтирование NFS может оставаться в "спящем" состоянии в течение нескольких дней и затем неожиданно вновь быть вызванным для использования. UDP позволяет обеспечить немедленный доступ без накладных расходов, связанных с открытием соединения, и если хост покидает сеть, это не составит проблемы для сервера. Целостность данных поддерживается самим программным обеспечением NFS, главным образом, за счет стека OSI на уровне приложения, сохраняя информацию контрольных сумм и последовательности в полезной нагрузке пакетов, тем самым выполняя всю работу, которую в противном случае пришлось бы делать TCP. Однако существуют и клиенты NFS, работающие по TCP, и сервер NFS поддерживает их также. NFS no TCP предназначен главным образом для монтирования по WAN, где потерянные пакеты намного более вероятны, и преимущества полноценного соединения TCP уменьшают преимущества, предоставляемые UDP соединениям LAN. NFS на базе TCP также может быть полезно для администраторов брандмауэров, которым нужен предсказуемый порт TCP, принимающий трафик NFS (трафик на базе UDP имеет тенденцию использования широкого и непредсказуемого диапазона портов, что мешает конфигурированию брандмауэров). НА ЗАМЕТКУ Недостатком применения UDP, однако, является то, что когда клиенты пытаются соединиться с NFS-сервером, которого нет, это может продолжаться бесконечно. Недостаток полноценного TCP-соединения означает необходимость в большем количестве примитивных методов определения того, работает ли сервер. Далее в настоящей главе мы поговорим о некоторых способах избежать длительных таймаутов NFS. ВНИМАНИЕ! NFS не поддерживает никакого встроенного шифрования, поэтому она должна использоваться в Internet только в том случае, если вы работаете с файлами, которые могут быть открытыми для общего доступа. Ответственные или секретные данные никогда не должны пересылаться по NFS, кроме как по шифрованному туннелю VPN. Машина FreeBSD может быть сконфигурирована как NFS-сервер, NFS-клиент или как то и другое. В зависимости от тогр, как вы сконфигурируете ее, система запустит несколько разных процессов, каждый из которых управляет своим концом NFS-соединения. Сначала мы поговорим о настройке машины FreeBSD в качестве NFS-сервера, а затем — о настройке ее в качестве клиента.
Сетевая файловая система I TZT I " Глава 33 I I Конфигурирование сервера NFS Настройка машины FreeBSD в качестве NFS-сервера включает добавление единственной строки в/etc/rc.conf: nfs_server_enable="YES" Также удостоверьтесь, что rpcbind_enable (в версиях FreeBSD до 5.0 — portmap_enable) установлено в "YES", потому что по умолчанию оно отключено, если вы не переопределите его. Демон rpcbind (или portmap) должен быть запущен для работы NFS, потому что сервер NFS нуждается в механизме, с помощью которого он сообщит своим клиентам, к какому порту им следует подключаться. Службы UDP работают только с одним "подключением" на порт, поэтому при начальных подключениях к серверу NFS на порт 2049 эти соединения отображаются вызовами удаленных процедур (Remote Procedure Call — RPC), обслуживаемых rpcbind, на новый и не используемый порт сервера. Обратите внимание, что службы rpcbind крайне уязвимы и служат причиной многих проблем, связанных с безопасностью. По этой причине будет плохой идеей выставлять NFS-сервер в Internet без защиты его брандмауэром. Подробнее о брандмауэрах читайте в главе 30. Когда вы устанавливаете опцию nf s__server_enable и перегружаете машину (или запускаете /etc/rc.d/nfsserver start), FreeBSD запускает два вида процессов- демонов — и три, если считать rpcbind — после чтения содержимого файла /etc/ exports для определения того, какие части файловой системы следует отдавать в совместный доступ через NFS. Следующий раздел посвящен каждому из этих компонентов и объясняет, как они работают и как ими управлять. Демон NFS (nf sd) Демон сервера NFS, эквивалент sshd или httpd — это nf sd. Определенное количество процессов nf sd запускается при инициализации сети (по умолчанию — четыре); эти процессы назначаются для обслуживания клиентов NFS, когда они подключаются — по одному на клиента. В конфигурации по умолчанию к вашему NFS-серверу может подключиться максимум четыре клиента одновременно. Вы можете настроить это установкой nfs_server_flags в /etc/rc.conf, для которой по умолчанию принято следующее: nfs_server_flags="-u -t -n 4" Флаг -п может устанавливать любой количество соединений; поставьте здесь максимальное количество одновременно подключаемых NFS-клиентов, которое вы ожидаете. Флаги -t и -и сообщают процессам nf sd, что нужно обслуживать как TCP-, так и UDP-клиентов. При необходимости доступны также и другие флаги. Например, если ваша машина имеет несколько сетевых интерфейсов, вы можете специфицировать среди прочих флагов -п 64.41.131.102, чтобы привязать серверы NFS к интерфейсу с адресом 64.41.131.102. (Вы также можете указать имя хоста вместо IP-адреса.) Это пригодится, потому что механизм UDP устроен так, что вы не можете указать nf sd, на каком конкретном IP-адресе ему следует обрабатывать запросы, и не гарантируется, что его ответы придут с того же адреса, к которому подключился клиент. Вы можете перечислить столько адресов, сколько нужно, используя несколько флагов -п. Например, предположим, что у вас есть сервер, работающий в качестве шлюза с двумя сетевыми картами — одной "внутри" сети, а другой — "снаружи" сети.
I TZZ I Работа в сети FreeBSD 976 I *fP I Часть У Ваша "внутренняя1* карта имеет два адреса IP, привязанных к ней, и вы хотите предоставлять ресурсы NFS только клиентам, находящимся внутри. Для этого вы можете настроить NFS примерно так: nfs_server_flags="-u -t -n 4 -h 64.41.131.102 -h 64.41.131.116" Затем вы можете блокировать доступ к службе NFS на внешнем интерфейсе правилом IPFW: ipfw add deny udp from any to 64.41.131.10 nfsd Обратитесь в раздел "Использование брандмауэра" главы 30 за дополнительной информацией о том, как конфигурировать правила брандмауэра, применяя IPFW. Демон монтирования NFS (mountd) В то время как nfsd — это программа, обеспечивающая конец соединения для каждого индивидуального монтирования NFS, другая программа отвечает за прослушивание запросов новых NFS-клиентов (на TCP-порте с номером 2049). Эта программа называется mountd — демон монтирования. Она выполняется автоматически наряду с процессом nfsd во время процедуры установки сети на этапе запуска системы, если опция nf s_server_enable установлена в "YES". mountd принимает входящие соединения NFS и передает их процессам nfsd. Также он отвечает за отслеживание ресурсов NFS, специфицированных в /etc/exports. Чтобы перезапустить службы NFS после внесения изменений в /etc/exports, как вы увидите ниже, необходимо послать сигнал HUP процессу mountd. У mountd не так много полезных опций. Установки по умолчанию в /etc/def aults/ г с. con f, которые вы можете переопределить в /etc/rc.conf, следующие: mountd__flags-"-r" Флаг -г позволяет mountd обслуживать и рядовые файлы, а не только каталоги, чтобы поддерживать совместимость с некоторыми бездисковыми рабочими станциями, которые загружаются через NFS. Флаг -1 позволяет протоколировать все запросы на монтирование NFS, а флаг -п — монтировать ресурсы NFS на удаленных системах, таких как компьютеры под управлением Windows, не разделяющие модель владения и полномочий, принятую в UNIX» Определение совместно используемых ресурсов в файле /etc/exports В файле /etc/exports перечислены деревья каталогов, к которым должен быть открыт совместный доступ через NFS, а также — кому именно. Если /etc/exports не существует или является нечитаемым на момент запуска сетевых интерфейсов при загрузке системы, процессы nfsd и mountd не стартуют. Полный формат /etc/exports описан в man exports. Базовая строка экспорта специфицирует один или более каталогов, которые должны быть экспортированы (совместно использованы), любые из нескольких опций, затем — необязательный список хостов (по IP-адресам, сетям, сетевым группам или именам хостов), которым разрешен доступ к указанным каталогам. Например, следующая строка отдает в совместный доступ каталог /home и все его подкаталоги всем, кто подключается: /home -alldirs
Сетевая файловая система I TZZ I Глава 33 I I Обратите внимание, что опция -alldirs может быть специфицирована, если совместно используемый ресурс — точка монтирования файловой системы (например, /usr или /var). Если это не так, например, если /home не является отдельной файловой системой, а каталогом внутри другого, такой ресурс не станет доступным. Ресурс, который может быть доступен только трем указанным хостам, и доступен только по чтению, должен выглядеть примерно так: /usr2 -ro -alldirs stripes.example.com spots.example.com 64.41.131.165 СОВЕТ Вы можете создавать группы хостов, специфицируя их в файле /etc/netgroup, который отсутствует в инсталляции по умолчанию. Группа может быть определена в следующей форме: groupname (host, user, domain) (host, user, domain) . .. Например, чтобы создать группу по имени desktops, содержащую три конкретных хоста (по имени sol, luna и terra), строка должна выглядеть так: desktops (sol,,) (luna,,) (terra,,) Сетевая группа, определенная по именам пользователей? должна выглядеть следующим образом: developers (,frank,) (,bob,) (,alice,) Затем вы можете использовать в /etc/exports имена сетевых групп вместо имен хостов, чтобы ограничить доступ к совместно используемым ресурсам NFS только членам этой группы. Принадлежность файлов в ресурсе NFS отображается на основе TJID каждого файла и каталога. Если имена пользователей и UID на сервере и клиентской машине совпадают (например, если регистрации пользователей на машинах синхронизированы с помощью NIS или Kerberos), то полномочия будут совпадать. Однако если UID 1045 отображается на сервере на имя пользователя bill, а на стороне клиента UID 1045 принадлежит John, то файлы, которые на сервере принадлежат пользователю bill, окажутся в совместно используемом ресурсе в собственности пользователя j ohn. Экспортируя ресурс, содержащий файлы, принадлежащие многим разным пользователям, убедитесь, что существует инфраструктура, которая обеспечит согласованное отображение между UID, именами пользователей и всеми машинами в сети. Вы можете использовать опцию -maproot=username или -maproot=C/ID для отображения принадлежности, чтобы имя пользователя, соответствующее user name или ID пользователя, соответствующий UID на клиентской машине, получили полные привилегии root в совместно используемом ресурсе. Например, вот как можно выдать в совместное пользование всю файловую систему NFS-сервера любому из сети 64.41.131, причем пользователь frank клиентской машины будет иметь полный доступ по чтению и записи ко всем файлам: / -maproot=frank -network 64.41.131 -mask 255.255.255.0 После внесения любых изменений в /etc/exports необходимо перезапустить процесс mountd (если он уже запущен). Делайте это командой /etc/rc.d/mountd restart или обратившись к файлу PID времени выполнения непосредственно: # kill -HUP Ncat /var/run/mountd.pid%
978 Работа в сети FreeBSD Часть V НА ЗАМЕТКУ Вы не можете иметь множество строк экспорта для точек монтирования внутри одного и того же раздела или файловой системы. Это предотвращает проблемы в тех случаях, когда полномочия экспорта для разных ресурсов в одной файловой системе могут конфликтовать. Клиент NFS не может получить доступ к одной файловой системе из другой, которую он смонтировал, и одинаковые полномочия доступа должны применяться ко всем совместно используемым ресурсам внутри файловой системы. Следующая настройка недопустима: /home/frank 64.41.131.102 /home/joe 64.41.131.102 А вот эта корректна: /home/frank /home/joe 64.41.131.102 Для отображения правильных совместно используемых ресурсов с их полномочиями служит программа showmount (с опцией -е, то есть "показать список экспорта"). Вот как можно проверить правильность настройки в /etc/exports: # showmount -e Exports list on localhost: Список экспорта на localhost: /usr Everyone /home/frank 64.41.131 /home/joe 64.41.131 / 64.41.131 102 102 .0 Конфигурирование клиента NFS Если ваша машина FreeBSD будет монтировать у себя совместно используемые ресурсы NFS из других серверов, то вам нужно конфигурировать ее в качестве клиента. Технически это не является необходимостью — вы можете сразу смонтировать ресурс NFS простейшим способом. Однако конфигурирование системы как клиента NFS предоставляет несколько возможностей, гарантирующих высокую и надежную производительность, среди которых диспетчер nf siod. Чтобы настроить клиентскую машину NFS, просто включите следующую строку в /etc/rc.conf: nfs_client_enable="YES" Эта настройка включает демон ввода-вывода NFS — nf siod, который помогает направлять клиентские запросы NFS и настраивает некоторые настройки ядра для сокращения времени доступа. Все это выполняется автоматически в сценарии /etc/ re. network во время загрузки системы, наряду с настройками сервера NFS (которые вы видели ранее). Демон ввода/вывода NFS (nf siod) Демон nf siod не обязателен для правильных клиентских операций NFS, однако он помогает их ускорить. Демон nf siod работает, обеспечивая возможность выполнения операций чтения и записи NFS в асинхронной манере, с операциями "опережающего чтения" (read-ahead) и "отложенной записи" (write-behind), выполняемыми
Сетевая файловая система Глава 33 979 в фоновом режиме, вместо ожидания завершения каждого последовательного шага процесса. Как и с nf sd, должно быть запущено столько процессов nf siod, сколько имеется смонтированных совместно используемых ресурсов NFS на клиентской машине. Вы можете настроить количество процессов установкой nf s_client_f lags в /etc/rc. conf, с указанием опции -п для создания процессов по умолчанию: nfs_client_flags="-n 4" У nf siod нет других устанавливаемых опций. Чтобы запустить его без перезагрузки машины, просто запустите соответствующий сценарий гс: # /etc/rc. d/nfsclient start Монтирование удаленных файловых систем Монтирование совместно используемого ресурса NFS выполняется командой mount_nf s, являющейся сокращением от mount -t nf s (как вы должны помнить из главы 12). В наиболее общей форме вы должны передать два аргумента: имена хоста и ресурса в комбинированной строке, а также локальную точку монтирования: # mount_nfe spots:/home /home2 При успешном монтировании не будет выдано никакого вывода. Вы можете убедиться в успехе операции монтирования с помощью команды df: # df Filesystem /dev/adOsla /dev/adOslf /dev/adOsle proofs spots:/home lK-blocks 992239 26704179 9924475 4 9924475 Used 54353 4872963 1642343 4 1642343 Avail 858507 19694882 7488174 0 7488174 Capacity 6% 20% 18% 100% 18% Mounted on / /home /usr /proc /home2 Если вы зайдете в каталог /home2, то увидите там каталоги, находящиеся внутри /home на сервере NFS, причем принадлежность файлов будет основана на UID, как было сказано ранее. Файловая система останется смонтированной до тех пор, пока вы явно не размонтируете ее командой umount: # umount /home2 ВНИМАНИЕ! Не забудьте выйти из всех смонтированных каталогов NFS, прежде чем попытаетесь размонтировать их. В противном случае вы получите ошибку типа "device busy" ("устройство занято"), если попытаетесь размонтировать файловую систему, находясь внутри ее. Совместно используемые ресурсы NFS могут быть смонтированы самыми разнообразными способами, и все эти возможности изложены на странице man mountnf s. Вот некоторые из наиболее полезных: опция -Т, которая принуждает применять транспорт TCP вместо UDP (полезно при монтировании по каналам WAN), флаги -sh-x seconds, которые позволяют смонтировать ресурс на строго определенной время ("мягкое" монтирование). Вот пример: # mount_nfs -з -х 60 spots:/home /home2
Работа в сети FreeBSD СОВЕТ Еще одна полезная опция — это -i, которая разрешает прерываемость. Обычно если вы монтируете совместно используемый ресурс NFS и сервер по каким-то причинам становится недоступным, то любые вызовы файловой системы, которые вы выполняете (команды, имеющие дело с совместно используемыми файлами, вроде is) могут подвесить систему так, что даже нажатие комбинации клавиш <Ctrl+C> (сигнал прерывания) не сможет их остановить. Опция -i делает так, что <Ctrl+C> позволит прервать выполнение команды и вернет управление вам. Как и с другими типами файловых систем, вы можете добавить монтирования NFS в /etc/f stab, чтобы установить предопределенные точки монтирования, тем самым упростив этот процесс. Поместите любые опции, которые хотите передать команде mount_nf s, в столбец Options (Опции), разделив их запятыми, как показано ниже: # Device Mountpoint FStype Options Dump Pass# spots:/home /home2 nfs rw,-T,-i,noauto 0 0 Имея такую строку в таблице, вы можете смонтировать файловую систему NFS намного более простой командой mount: # mount /home2 Автоматическое монтирование удаленных файловых систем при загрузке системы Все файловые системы в /etc/fstab автоматически монтируются при запуске операционной системы, если только не указана опция noauto. Вы можете указать, что удаленные совместно используемые ресурсы NFS должны быть смонтированы во время запуска, простым добавлением их в /etc/fstab, как вы видели выше. Однако при этом следует помнить о некоторых вещах. Прежде всего — NFS имеет чрезвычайно длительный период таймаута, и эта фаза монтирования файловых систем при загрузке является синхронным, блокирующим процессом. Если ваш NFS-сервер или серверы не могут быть найдены — например, если серверная машина не запущена или сетевое соединение вашей машины конфигурировано неправильно — то процесс загрузки может повиснуть на невыносимо длительный период, прежде чем NFS сдастся и позволит системе завершить загрузку. Вы можете решить эту проблему, поместив опцию noauto в /etc/fstab, как было показано в приведенном выше примере. Однако это значит, что вы должны монтировать каждый совместно используемый ресурс NFS вручную после полной загрузки операционной системы. Но есть и лучший способ справиться с этим, а именно — опция -Ь. Вот пример: # Device Mountpoint FStype Options Dump Pass# spots:/home /home2 nfs rw,-b 0 0 Опция -b заставляет mount выполнить быструю попытку соединиться с сервером, и если не она не удается, порождается дочерний процесс, продолжающий попытки, в то время как загрузка системы идет своим ходом. Аналогично, если вы монтируете совместно используемый ресурс из командной строки, применяя -Ь, то процесс порождается в фоновом режиме и возвращает вас к приглашению командной строки.
Сетевая файловая система Глава 33 Ниже показан вывод, который вы получите, пытаясь смонтировать ресурс, указанный в приведенном выше примере строки /etc/f stab, после попыток в течение 60 секунд: # mount /home2 spots:/home: nfsd: RPCPROGJtfFS: RPC: Port mapper failure - RPC: Timed out nfs: Cannot immediately mount spots:/home, backgrounding nfs: Невозможно немедленное монтирование spots:/home, перевод в фоновый режим Фоновый процесс mount_nf s продолжит попытки монтировать ресурс до тех пор, пока они не увенчаются успехом. Этот метод удобен в частности в кластерах компьютеров или опьггных средах, в которых монтируемые ресурсы NFS желательно иметь, но они не обязательны для корректной работы, например, в кластерах, где точки монтирования NFS содержат популярные программы или игры, но все критичные системные функции доступны на дисках локальной системы. Демон автоматического монтирования (amd) Демон автоматического монтирования, amd, еще более облегчает монтирование NFS. Этот демон позволяет вам монтировать ресурс NFS (и другие типы файловых систем) динамически, просто в процессе обращения к каталогу, в котором он должен быть смонтирован, даже без необходимости беспокоиться о командах mount. FreeBSD предоставляет базовый способ настройки amd. Просто добавьте следую- пгую строку в /etc/rc. conf: amd_enable="YES" Когда система загружается с этой опцией, amd запускается с опциями, специфицированными в настройках amd_f lags, которые таковы, что все, что имеется в каталогах /host или /net (оба создаются amd автоматически), будет автоматически смонтировано по имени. Вы можете также стартовать его так же, как это происходит во время загрузки системы, введя команду /etc/red/amd start. При работающем amd воспользуйтесь командой cd, чтобы перейти в каталог /host. Осмотритесь, и вы обнаружите, что каталог пуст: # cd /host # Is # Однако если попробовать запросить листинг по имени, как если бы это был каталог с таким же именем, как у известного NFS-сервера в сети, то получится следующее: # Is stripes home Итак, это выглядит так, как будто каталог по имени stripes присутствует в каталоге /host, и внутри него есть каталог /home, который содержит все, что есть в совместно используемом ресурсе stripes: /home. To есть вы только что автоматически смонтировали этот ресурс в каталог /host, просто запросив его листинг по имени каталога, /host /stripes/ home — это функционально то же самое, что и точка монтирования /home2, которую вы создали вручную в предыдущем примере. С помощью команды df можно проверить это: 981
982 Работа в сети FreeBSD Часть V # df Filesystem lK-blocks Used Avail Capacity Mounted on stripes:/home 9924475 1642345 7488172 18% /.amd_mnt/stripes/host/home НА ЗАМЕТКУ Обратите внимание, что совместно используемые ресурсы NFS, смонтированные подобным образом, на самом деле появляются смонтированными внутри каталога по имени .amt_mnt в корневом каталоге. Этот каталог в действительности не существует; это просто вид сокращения, используемого демоном amd в целях учета. Чтобы специфицировать постоянное местоположение для ресурса NFS, просто создайте символическую ссылку на соответствующий путь внутри /host или /net: # In -s /home2 /host/ a tripes /home С этого момента всякий раз, когда вы заходите в каталог /home2, будет автоматически смонтирован совместно используемый ресурс stripes:/home и предоставлен доступ к его файлам. Когда ресурс не используется, он будет автоматически размонтирован. СОВЕТ В файле /etc/amd.conf можно специфицировать намного более сложные карты монтирования amd, представляющие более прямые методы монтирования файловых систем в определенные точки. Этот файл не существует в инсталляции FreeBSD по умолчанию; подробности о его формате и возможностях читайте в man amd.conf.
ГЛАВА 34 Совместное использование файлов и печати с Microsoft Windows В этой главе... • SMB/CIFS и Samba • Установка и конфигурирование Samba • Прочие компоненты Samba • Доступ к совместно используемым файлам в системе Windows (файловая система smbf s)
Работа в сети FreeBSD Файловая система NFS — великолепное решение для разделения файлов между FreeBSD, Linux и подобным системам, где полномочия UNIX и файловые метаданные (такие как время модификации) должны сохраняться от машины к машине. Однако NFS не поддерживается широко на многих потребительских операционных системах. Windows и Mac OS поддерживают ее только через приложения от независимых поставщиков и, что более важно в промышленных средах, в ней отсутствуют какой-либо механизм "обнаружения", встроенный в NFS, чтобы позволить клиентам просматривать списки доступных служб. Когда вы включаете машину FreeBSD в существующую сеть, то велика вероятность того, что на большинстве уже работающих в ней компьютеров установлена операционная система Windows. Действительное взаимодействие с этими клиентами и существующими файловыми серверами Windows требует, чтобы FreeBSD разделяла доступ к файлам точно таким же образом, как это делает Windows. Этот метод предусматривает использование протокола SMB (Server Message Block — блок серверных сообщений) и протокола CIFS (Common Internet File System — общая файловая система Internet), который приходит на смену ему в новых версиях Windows. Совместное использование файлов через SMB/CIFS не является встроенным в FreeBSD. Однако дополнительный пакет под назначением Samba дает машине FreeBSD возможность функционировать в качестве файлового сервера и участвовать во всех действиях, связанных с совместным доступом к файлам, подобно настоящему клиенту Windows. Samba — проект с открытым кодом, продвигаемый добровольцами и начатый Эндрю Тригделлом (Andrew Trigdell), а в настоящее время разрабатываемый совместно в сообществе UNIX. Он обеспечивает системе UNIX (такой как FreeBSD) возможности делать все, что может делать система совместного использования файлов Windows, включая появление их в просматриваемых списках сети, защиту соединений на основе регистрации в доменах NT и имен пользователей, а также предоставление служб сетевой печати. Кроме того, Samba также содержит инструменты, поддерживающие многие административные функции сервера Windows. При условии наличия модуля ядра smbf s, позволяющего FreeBSD работать в качестве клиента Windows, имеющего разделенный доступ к файлам (вы узнаете больше об smbf s далее в настоящей главе), вы можете использовать машину FreeBSD в сетевом окружении Windows почти с тем же набором функциональности, который имеют "родные" машины Windows. Эта глава проведет вас сквозь процесс конфигурирования Samba. Здесь вы узнаете о том, как добавлять Windows-подобное совместное использование файлов и средства управления печатью в вашу систему FreeBSD, включая интеграцию в рабочие группы и домены Windows, так что ваша машина становится неотличимой в сети от компьютеров, функционирующих под управлением Windows. НА ЗАМЕТКУ Официальный Web-сайт Samba находится по адресу www. samba. org; на нем можно выбрать любой из множества зеркальных сайтов, расположенных в разных уголках мира.
Совместное использование файлов и печати с Microsoft Windows 1 „« I Глава 34 I I SMB/CIFS и Samba Спецификации SMB, впервые опубликованные в 1985 году компанией IBM и позднее расширенные Microsoft и Intel, представляют обобщенную систему совместного использования (разделения) всех видов ресурсов в локальной сети. Эти ресурсы включают файлы, принтеры, последовательные порты и программные абстракции, такие как именованные каналы. Это протокол, работающий в формате "клиент-сервер *, даже несмотря на то, что структура разделения файлов в Windows выглядит одноранговой. SMB — фундаментальная часть многих операционных систем, включая MS-DOS, Windows, OS/2 и Linux, хотя в настоящее время она преимущественно используется в Windows и распространяется компанией Microsoft. Команды SMB и CIFS могут пересылаться по сетевым протоколам, таким как IPX, NetBEUI, Banyan VINES и DECnet. Эти протоколы работают на "сетевом" уровне стека — том же, что и IP (как было показано в главе 22), а потому SMB не ограничен транспортом TCP/IP. Однако чаще всего используемым транспортом для SMB является NetBIOS (Network Basic Input/Output System (Сетевая базовая система ввода-вывода) — система, описанная в документах RFC 1001 и RFC 1002), работающая через IP и взаимодействующая как с компонентом TCP, так и UDR Это протокол, используемый Windows для разделенного доступа к файлам. Просмотр Преимущество SMB перед такими протоколами, как NFS, состоит в том, что он поддерживает автоматический поиск серверов, или просмотр, В Windows, если вы откроете окно Network Neighborhood (Сетевое окружение) или My Network Places (Мои места в сети), то увидите в нем имена всех доступных серверов SMB в локальной сети. Этот список строится динамически — каждая машина периодически рассылает пакеты в поисках "мастер-браузера" сети (компьютера с окончательным списком локальных и удаленных хостов SBM), сообщая о собственном присутствии. Каждая другая машина в сети строит на основании этих рассылок "список просмотра". Имя каждой машины, как оно появляется в окне просмотра сети (как показано на рис. 34.1) — это ее NetBIOS-имя, то есть назначение, длина которого в Windows допускается до 15 символов. Хотя Windows принимает ваш ввод имен NetBIOS в верхнем регистре, но показывает его в окне просмотра сети только с первой заглавной буквой. 1*^-^--— ¦--¦¦¦* -'¦¦¦--* t-CMawwt.... -.^Z.l I *»jEnlireNetwofkj ?r*»e Netwoifc J^Gamrig-pc V/mdom machine ]&) Stripe* FreeBSD macNne Рис. 34.1. Окно просмотра сети Windows, демонстрирующее машину FreeBSD с запущенной системой Samba
Работа в сети FreeBSD В средах других операционных систем (вроде FreeBSD) имя NetBIOS совпадает с именем хоста, но при необходимости усеченным до 15 символов. Имена NetBOIS обрабатываются разновидностью службы имен, подобной DNS, но отображающей NetBOIS-имена на основе других критериев, а не только на IP- адреса (поскольку NetBIOS не ограничивается IP). Компонент сервера имен Samba отделен от самого сервера данных SMB. Недостатком NetBIOS является то, что он функционирует только в локальной сети; пакеты NetBIOS являются широковещательными и потому не пересылаются маршрутизаторами. Протокол WINS (Windows Internet Name Service — служба Internet-имен Windows) предназначен для соединения зон разделенного доступа в разных сетях, тем самым несколько смягчая данное обстоятельство. VPN также может открыть вам доступ к совместно используемым ресурсам Windows через Internet, хотя задержки в каналах WAN могут сделать трафик такого рода неудобным, если только не применяются технологии ускорения на сетевом уровне. Безопасность, рабочие группы и домены Доступ к совместно используемым ресурсам SMB управляется на разных уровнях. Высший уровень ограничивает доступ на основе IP-адреса хоста или посредством парольной аутентификации, скрывая содержимое файлового сервера. Ниже этого уровня каждый индивидуальный ресурс (каталог, принтер или другой) обладает своими собственными привилегиями доступа и необязательными ограничениями хостов и паролей. И, наконец, внутри ресурса индивидуальные файлы являются субъектами полномочий доступа, основанных на аутентифицированных пользователях или хостах, которые получают доступ к ресурсу. Аутентификация пользователя с паролями может обрабатываться распределенным образом (каждым индивидуальным разделяемым хостом) или централизованно (главным сервером регистрации сети). В этом состоит разница между "рабочими группами" и "доменами" Windows. Рабочая группа (workgroup) — это коллекция машин, которая появляется в окне просмотра сети как единое целое, но каждая из машин индивидуально обеспечивает собственную аутентификацию и безопасность. Домен (domain) — это группа машин, чья безопасность обеспечивается центральным сервером, к которому должны быть приписаны все машины-члены домена. Samba предоставляет возможность ограничить доступ на всех этих уровнях, а также служить "мастер-браузером" (в контексте рабочей группы) или контролером домена (официальным центром регистрации пользователей в доменном окружении). Ниже вы увидите, как это делается. Более того, новейшие версии Samba спроектированы так, чтобы служить полной заменой службы Microsoft Active Directory; инструкции о том, как этого достичь, содержатся на Web-сайте Samba — подробности выходят за рамки настоящей главы. Совместное использование файлов и печати с клиентами Macintosh, применяющими AppleTalk Клиентские системы Macintosh представляют другую сложность для администратора файлового сервера. Современные системы Mac OS могут обращаться к ресурсам NFS, SMB/C/FS, AppleShare/IP или AppleTalk, но машины со старыми системами Mac OS ограничены только AppleTalk. Даже самые современные Мае, естественно, лучше воспринимают свои собственные протокрлы; Мае, использующий совместный доступ к файлам в стиле Windows, может оставлять
Совместное использование файлов и печати с Microsoft Windows | Qft_ Глава 34 I "метафайлы" по всему серверу при каждом просмотре. По этой причине вам может пригодиться поддержка ресурсов AppleTalk на вашей машине FreeBSD. Программный пакет, обеспечивающий функциональность AppleTalk на платформах UNIX, называемый netatalk, доступен в коллекции портов и пакетов. Чтобы инсталлировать поддержку AppleTalk, соберите netatalk из портов в /usr/ports/net/netatalk. Затем вам понадобится также включить опцию netatalk в конфигурации ядра. Информацию о построении специализированного ядра читайте в главе 18. Порт netatalk устанавливает множество конфигурационных файлов, по одному для каждого демона, наряду с копиями ссылок .dist. Его демоны запускаются в инсталлированной конфигурации по умолчанию; вы можете изменить некоторые из конфигурационных файлов, чтобы разобраться в их поведении. Каждый компьютер Macintosh в сети увидит машину в зоне AppleShare, в Chooser (Селектор) (или в тому Network (Сеть) в программе Mac OS X Finder). Обратитесь на официальный Web-сайт netatalk по адресу http: //netatalk. sourceforge.net/ за более полным описанием различных инструментов пакета netatalk и ссылками на другую документацию. Установка и конфигурирование Samba Samba доступна в коллекции портов в /usr/ports/net/samba3 (или samba — для неподдерживаемой унаследованной версии, которой недостает некоторых новейших средств взаимодействия с Windows) или же в пакетах. Обратитесь в главу 16 за подробными инструкциями по инсталляции пакета или порта. После того, как вы установите пакет Samba, на вашей машине будет инсталлировано широкое разнообразие новых элементов, включая исполняемые программы демонов (в /usr/local/sbin), инструменты администрирования (в /usr/local/bin), документация и примеры (в /usr/ local /share) и конфигурационные файлы, которые попадают в /usr/local/etc. Некоторые из конфигурационных файлов не существуют в инсталляции по умолчанию; вы должны создать их самостоятельно, если хотите воспользоваться преимуществами их функциональности. Имеются также кодовые страницы (в /usr/local/etc/codepages), отображающие наборы символов Windows на наборы UNIX. Единственный конфигурационный файл, который присутствует в пакете — это smb.conf.default, который вы должны переименовать в smb.conf, чтобы он работал. Аналогично, сценарий запуска /usr/local/etc/rc. d/samba. sh. sample должен быть переименован в samba. sh. Простейший способ запуска Samba предусматривает только редактирование smb.conf с модификацией строки workgroup для отражения той рабочей группы или домена, частью которого должна быть ваша машина: # workgroup = NT-Domain-Name or Workgroup-Name, eg: REDHAT4 workgroup = МУGROUP После этого Samba стартует автоматически при загрузке системы. Чтобы запустить ее вручную, запустите сценарий samba.sh с параметром start: # /usr/local/etc/rc.d/samba.sh start Samba# НА ЗАМЕТКУ В выводе сценария нет переноса строки после имени службы Samba. Это косметическое средство необходимо потому, что во время запуска системы каждая служба в /usr/local/etc/rc. d стартует поочередно, и вывод каждого запуска добавляется в одну и ту же строку.
Работа в сети FreeBSD Демоны sntbd и nmbd Если сценарий samba.sh запустится успешно, вы увидите два уведомления о выполняющихся процессах smbd и nmbd, как показано ниже: # ps -wwaux | grep mbd root 3855 0.0 1.5 2368 1816 ?? Is 2:43PM 0:00.00 /usr/local/sbin/smbd -D root 3857 0.0 1.2 1940 1496 ?? Ss 2:43PM 0:00.02 /usr/local/sbin/nmbd -D Демон smbd — это сам сервер данных, процесс, который обрабатывает запросы SMB/CIFS от подключенных клиентов Windows, то есть запросы на передачу файлов, задания печати, листинги и тому подобное. В отличие от NFS, SMB не требует запуска отдельного процесса для каждого из параллельных подключений; мастер-процесс smbd порождает новую копию самого себя для каждого нового клиентского сеанса и обрабатывает все клиентские запросы на протяжении этого сеанса. Опция -D специфицирует, что smbd должен работать как автономный демон, прослушивая запросы на TCP-порте под номером 139. Работающая параллельно с smbd программа nmbd — это сервер имен NetBIOS. Этот процесс позволяет клиентам Windows видеть вашу машину FreeBSD в сети, как было показано на рис. 34.1. Его задача также состоит в ответе на клиентские запросы к определенному хосту NetBIOS, если он специфицирован по имени; если клиент Windows использует синтаксис \\name для подключения к определенному серверу по имени патеу то клиент посылает широковещательный запрос имени, спрашивая IP-адрес сервера с таким именем NetBIOS. Работа nmbd — отправить ответ с IP-адресом запрошенного хоста, чтобы клиент мог открыть сеанс SMB непосредственно на сервере. Это чем-то похоже на DNS (в том, что отображает общее имя на непосредственный адрес) и также имеет много общего с ARP (тем, что работает в LAN через широковещательные запросы имен, а не через выделенный центральный сервер имен). smb.conf и SWAT Главный конфигурационный файл Samba — это /usr/ local /etc/ smb. conf. В нем вы можете установить десятки различных опций и создавать совместно используемые ресурсы со специализированными настройками. В этом файле строки, начинающиеся с символов # или ;, являются комментариями; применение smb. conf .default (примера конфигурационного файла) сводится к применению символов # или ; для включения и отключения строк конфигурации. Каждая опция smb.conf .default достаточно хорошо документирована. Однако было бы весьма утомительно разбираться во всех возможных опциях этого файла, поскольку их слишком много (все перечислены в man smb.conf), и между ними существует множество тонких различий. Существует и альтернативный метод администрирования smb.conf, если условия вашей сети допускают это. Этот метод включает SWAT — Samba Web Administration Tool — инструмент, показанный на рис. 34.2. SWAP поставляется с портом Samba и позволяет конфигурировать Samba графически — через интерфейс Web-браузера. Эта возможность графического администрирования упрощает процесс управления файлом smb.conf и снижает риск внесения ошибок. Однако, поскольку SWAP является Web-приложением, опасности, связанные с ним, существенны. SWAP аутентифицирует пользователей по системной базе данных пользователей в /etc/master, pas sword; пароли аутентификации пересылают-
Совместное использование файлов и печати с Microsoft Windows Глава 34 989 ся в виде открытого текста по сети от вашей клиентской машины на сервер Samba, который вы хотите сконфигурировать. Если только вы не конфигурируете Samba с локальной машины (localhost, использующий Web-браузер на основе XII), это представляет существенный риск для безопасности. Этим риском можно управлять различными способами, но полной безопасности не гарантирует ни один из них. I * * Ж * Ж + » ®•и*-'/10-0-1-l0901/tf«bals SX9 3 & €Ш Щф\\ш\\ф || //Г5 НОМЕ Ц 01OBAL3 Ц SHARES \\ ИВМТбЯ» Ц WgARO || «ТАТЩ Global Parameters Current Vl*wf»: ©flastc О Advanced ШШВШ'Х^ lrf.Afeal ?" ¦ ARCUCHT STTUPES Stripts ttfitt MflfSrtOefrMJt) -,flK ,-, , {sittOefVut't) C'swDtfautt") ^QStoi^iuS) ^^SetftH&rfl) ^Sttjfowih) „^йха.ж'а i\«r. 34.2. S№IT - Web-инструмент администрирования Samba Решая применить SWAT, вам следует придерживаться одного из следующих правил. • Обращаться к SWAT только с localhost. Это полностью предотвращает любой трафик по проводам. • Работать полностью под защитой брандмауэра, который не пропускает никакого трафика извне. Файл smb.conf принадлежит root, поэтому ваш браузер должен по умолчанию подключаться к SWAT с паролем root, пересылая его по сети в открытом виде с каждым запросом HTTP, обращенным к программе SWAT. Этого никогда нельзя делать в сети, в которой возможен перехват паролей злоумышленниками. • Создать "фиктивного" пользователя (например, samba) и назначить его владельцем файла smb.conf (командой chown). При запуске SWAT регистрироваться под именем этого пользователя, а не root. He используйте имени фиктивного пользователя ни для каких других задач на сервере; также не выдавайте пользователю никаких привилегий, не назначайте командную оболочку и не создавайте домашнего каталога. Имейте в виду, что пароль этого пользователя может быть перехвачен и тогда злоумышленник сможет изменить вашу конфигурацию Samba. Однако он больше не сможет сделать ничего другого.
Работа в сети FreeBSD Если такой риск для безопасности для вас приемлем, и вы решите придерживаться одного из этих методов доступа к SWAT, вы можете включить его, убрав комментарий со следующей строки в /etc/inetd.conf: swat stream tcp nowait/400 root /usr/local/sbin/swat swat НА ЗАМЕТКУ Файл /etc/services — это то, что отображает номера портов TCP и UDP на имена широко известных служб. Убедитесь, что служба swat указана в этом файле и назначена ТСР-порту 901; если ее там нет, добавьте ее. После этого перезапустите inetd: # /etc/rc.d/inetd restart Теперь вы сможете обратиться к SWAT no URL http: //stripes.example. com: 901, подставив соответственно имя Samba-сервера или localhost. Вам будет предложено ввести имя пользователя и пароль. Используйте имя пользователя системы, которому решили предоставить доступ к SWAT root, если ваша ситуация с безопасностью допускает это, или же соответствующего фиктивного пользователя. SWAT позволяет вам получать доступ и модифицировать совместно используемые ресурсы и принтеры, а также глобальные установки; вы можете также видеть текущее состояние сервера и управлять пользователями Samba. Если SWAT распознает имя пользователя, под которым вы зарегистрирован, как имеющего полный доступ к файлу smb .conf, вы увидите все восемь кнопок действий, показанных на рис. 34.2. В противном случае вы увидите только четыре из них — те, которые позволяют просматривать информацию и состояние Samba, но не позволяют вносить изменения в конфигурацию. Поскольку SWAT работает в качестве интерфейса к smb ¦ conf и потому, что SWAT не обязателен для администрирования, остальная часть настоящей главы будет сосредоточена на конфигурировании Samba непосредственно через smb. conf, а не через эквивалентные действия SWAT Совместный доступ к каталогам Множество примеров конфигурирования совместно используемых каталогов можно найти в smb. conf. default. Чтобы включить любой из них, внесите соответствующие изменения в smb.conf; затем перезапустите Samba: # /usr/local/etc/rc.d/samba.sh restart Примеры разделяемых ресурсов идут под строкой ===== Share Definitions ===== в smb.conf. Каждое имя ресурса перечислено в квадратных скобках, и конфигурационные строки, следующие за ним, применяются до того, как встретится следующий блок в квадратных скобках. Файл smb.conf начинается с блока [global], позволяющего установить глобальные параметры; остальная часть блока определяет ресурс, чьи настройки перезаписывают ранее определенные глобальные настройки — почти так же, как httpd. conf работает с Apache (как было показано в главе 26).
Совместное использование файлов и печати с Microsoft Windows Глава 34 991 СОВЕТ Страница man smb.conf перечисляет все доступные конфигурационные параметры и определяет в деталях, что они делают. Однако вы можете решить, что проще просмотреть страницу в формате HTML, где заголовки и примеры отделены элементами форматирования и легче читаются, к тому же снабжены контекстными гиперссылками. За форматированной версией документации обратитесь по адресу http://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html. Чтобы открыть совместный доступ к обычному каталогу, определите блок описания ресурса вроде следующего: [my-public] comment = Public Stuff path = /usr/local/share/samba-stuff public - yes writeable * yes printable - no write list = @staff Когда этот блок включен, клиент увидит совместно ресурс по имени my-public на верхнем уровне списка совместно используемых ресурсов сервера. Однако если только пользователь не аутентифицирован и не является членом группы UNIX staff, файлы в этом каталоге будет доступны ему только для чтения. Удалите строку write list, чтобы разрешить запись в этот ресурс всем пользователям. Обратите внимание, что writable «yes эквивалентно read only * no. По умолчанию ресурс [homes] определен и включен. Этот специальный ресурс является встроенным, позволяя каждому пользователю получать доступ к своему домашнему каталогу на сервере Samba, если клиент Windows подключается к нему с правильными полномочиями доступа (о безопасности уровня пользователя и уровня разделяемого ресурса вы узнаете чуть позже). [homes] comment = Home Directories browseable « no writeable * yes Поскольку этот ресурс настроен как не просматриваемый, домашние каталоги, не принадлежащие клиентам-пользователям, не отображаются; если клиент подключается под именем корректного пользователя, имеющего домашний каталог на сервере Samba, то его домашний каталог (помеченный его именем пользователя, потому что это имя каталога на UNIX) появляется как один из доступных совместно используемых ресурсов. Ни один домашний каталог других пользователей не появляется. Разделяемые принтеры Как и [home], [printers] — это специальный ресурс, который ведет себя несколько иначе, чем обычные ресурсы. Под FreeBSD все присоединенные принтеры, которые определены в /etc/printcap, доступны пользователям Samba. В главе 17 объясняется, как настроить вашу машину FreeBSD для поддержки локальных принтеров в/etc/printcap. По умолчанию ресурс [printers] настроен следующим образом:
992 Работа в сети FreeBSD Часть V [printers] comment = All Printers path = /var/spool/samba browseable - no # Set public = yes to allow user 'guest account1 to print # Установите public = yes, чтобы разрешить 'гостям* печатать guest ok = no writeable = no printable = yes Как следует из включенного комментария, вы можете объявить ваши принтеры общедоступными, так что любой пользователь в сети сможет применять их. Это вводит в игру гостевого пользователя (guest user), о котором вы узнаете в последующих разделах главы. Обратите внимание, что public — синоним guest ok, поэтому вы должны исправить в строке guest ok слово по на yes, вместо того, чтобы добавлять строку public = yes, разрешая пользователю-гостю выполнять печать. В Samba 2.0 и позднее поддерживаются вызовы удаленных процедур (RPC) печати в стиле Windows 2000. Это значит, что вы можете передать соответствующие драйверы принтеров клиенту, которому их недостает. Документацию об этой возможности ищите на Web-сайте Samba. Контроль доступа Контроль доступа Samba включает множество абстрактных концепций, которые может быть трудно примирить друг с другом. Схемы аутентификации пользователей Windows включают LAN Manager (LANMAN), Windows NT/2000/XP, Windows 95/ 98/Me и Windows for Workgroups — все они слегка отличаются в обработке шифрования, регистрационных имен и процедурах запросов/ответов. В Samba существуют два широко используемых способа контроля доступа: на уровне пользователя и на уровне совместно используемого ресурса. По умолчанию применяется уровень пользователя, определенный опцией security: # Security mode. Most people will want user level security. See # security_level.txt for details. # Режим защиты. Большинство будет выбирать уровень пользователя. # Для дополнительной информации см. securi ty__level. txt. security - user Контроль доступа уровня пользователя В защите уровня пользователя клиент предоставляет серверу пары имя/пароль во время начальной установки соединения. Сервер определяет, можно ли принять клиента на основе пары имя/пароль и идентифицирует самостоятельно клиентскую машину. Если клиент приемлем, все разделяемые ресурсы ему доступны. Однако правильно настроить безопасность уровня пользователя может оказаться непростым делом. Имя пользователя Windows, которое определено либо при его входе в локальный профиль, либо через контролер домена в сеансе Windows, должен существовать на сервере Samba как обычный пользователь UNIX (или отображаться на пользователя UNIX). Например, если пользователь Windows по имени harris входит на машину Windows, открывает окно My Network Places (Мои места в сети) и пытается подключиться к вашему серверу Samba, доступ ему будет запрещен (и вы-
Совместное использование файлов и печати с Microsoft Windows дано приглашение на ввод пароля к ресурсу по имени \\STRIPES\IPC$), если только пользователь harris не зарегистрирован на машине UNIX. СОВЕТ Вместо непосредственной аутентификации пользователей на вашей машине FreeBSD вы можете задать security'server вместо security-user, а затем — строку password server - windows-Server-Name для указания имени машины-сервера, который должен выполнить аутентификацию. Этот сервер должен быть запущен в режиме уровня пользователя — будь то настоящая машина Windows или другой сервер Samba. Samba поручит эту задачу этому второму серверу и аутентифицирует пользователя по результатам, который сообщит эта другая машина. НА ЗАМЕТКУ В Windows 2000/XP приглашение на ввод пароля позволяет вам ввести имя пользователя наряду с паролем. Однако в Windows 95/98/Ме вы получите только приглашение на ввод пароля, а имя пользователя будет унаследовано от имени, под которым вы зарегистрированы в Windows. Пользователи Samba должны существовать в базе данных паролей /usr/local/ private/smbpasswd, подобной /etc/master*passwd тем, что в ней сохраняются зашифрованные пароли для каждого локального пользователя UNIX. Когда инсталлируется Samba, то пользователи из /etc/master.passwd преобразуются в формат Samba и помещаются в /usr/local /private/smbpasswd, снабженные паролями как для LANMAN, так и для Windows NT/2000/XP (оба представлены для совместимости), установленными в строки из 16 символов X, что говорит о том, что вход пользователю запрещен: harris:1001:ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ: ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ: [U ] :LCT-00000000:Pauline Harris Чтобы разрешить пользователю вход, вы должны установить какое-то правильное значение пароля; это можно сделать программой smbpasswd. Она работает подобно passwd, приглашая ввести старый пароль Samba, а затем — новый, причем дважды, если только вы — не root. В последнем случае вам не нужно вводить старый пароль, и вы можете изменить пароль любого пользователя наряду со своим собственным: # smbpasswd harris New SMB password: Новый пароль SMB: Retype new SMB password: Введите повторно новый пароль SMB: Password changed for user harris. Пароль для пользователя harris изменен. Новый пароль пользователя harris после этого сохраняется в зашифрованной строке в файле smbpasswd: harris:1001:2E89BF7B23B65C7EB79AE2610DD89D4C: DADDCE7852B574A9EAE9F164F876D025: [U ]:LCT-4421CC23:Pauline Harris
Работа в сети FreeBSD ВНИМАНИЕ! Пароли, согласованные между клиентами Windows и сервером Samba, шифруются по умолчанию перед передачей (хотя шифрование можно отключить для совместимости с очень древними версиями Windows). Зашифрованные пароли — хотя и кажутся существенной мерой безопасности — на самом деле не увеличивают степень безопасности на серверной стороне, даже наоборот. Шифрованные пароли Samba, сохраняемые в файле /usr/local/private/smbpasswd — это те же пароли, что пересылаются по кабелю. Таким образом, шифрованные пароли по степени защиты эквиваленты паролям, хранящимся в виде открытого текста. Нарушитель, получивший доступ к файлу smbpasswd, может немедленно войти под именем любого пользователя (включая root) через Samba, в то время как шифрованные пароли в /etc/master .passwd должны быть взломаны каким-то методом грубой силы. (По контрасту, пароль UNIX передается в виде открытого текста и затем шифруется на сервере и сравнивается с хранящимися в файле паролями; такая организация представляет меньшую угрозу для серверного файла паролей). Защищайте файл smbpasswd почти так же тщательно, как и master .passwd, если не больше! СОВЕТ Вы можете отобразить пользователей Windows на пользователей UNIX по схеме "многие к одному", обеспечивая группы пользователей Windows теми же привилегиями, что у единственного пользователя UNIX. Чтобы сделать это, создайте файл, хранящий отображения — например, /usr/local/etc/snbusers.map. Формат этого файла предусматривает по одной строке на отображение, как показано ниже: UNIX-user * win-u$er-l [win-user-2 . . . ] Например, чтобы отобразить трех разных пользователей Windows на имя пользователя UNIX webadmin, используйте следующую строку: webadmin - harris erodriguez mfoster Затем включите файл отображений, добавив следующую строку в любое место раздела [global] файла smb. conf: username map * /usr/local/etc/smbusers.map Каждый из перечисленных пользователей Windows должен будет входить с корректным паролем пользователя UNIX, на которого он отображен. Контроль доступа уровня совместно используемого ресурса При контроле доступа уровня ресурса клиент может подключаться к серверу Samba без какой-либо аутентификации по имени/паролю и получать список ресурсов; ему будет отказано в доступе, только если его IP-адрес указан в файле smb. conf (в строке hosts allow). Однако каждый разделяемый ресурс имеет свою собственную аутентификацию пользователя, используя ту же схему пароля, которая была описана выше, в разделе, посвященном пользовательской аутентификации. В публичный ресурс, доступ к которому открыт для всех, можно входить без всяких преград. Разделяемый ресурс, который открыт только определенному пользователю (как домашние каталоги из блока [homes]), однако, защищен требованием определенного имени/пароля, как и в случае защиты уровня пользователя, представленной при начальном соединении.
Совместное использование файлов и печати С Microsoft Windows Глава 34 995 Подробную информацию о работе с защитой уровня пользователя и уровня ресурса можно найти по адресу http://www.samba.org/samba/docs/man/Samba-HOWTO- Collection/ServerType.html#id2526819. Гостевой пользователь Для некоторых служб Samba — в частности, для печати — может понадобиться открыть доступ всем пользователям сети, независимо от аутентификации. Вы можете обеспечить это с помощью учетной записи гостевого пользователя. Учетная запись гостевого пользователя представляет непривилегированного пользователя, имеющего доступ в качестве пользователя UNIX только к определенным службам. Обратите внимание, что гостевые пользователи предназначены в первую очередь для применения на серверах Samba, работающих в режиме безопасности уровня пользователя, поскольку доступ гостевому пользователю открывается и закрывается только на базе ресурса. Чтобы разрешить вход гостевому пользователю guest, раскомментируйте строку guest account в файле smb.conf: # Uncomment this if you want a guest account, you must add this to /etc/passwd # otherwise the user "nobody" is used # Снимите здесь комментарий, если требуется гостевой пользователь, вы должны # добавить это в /etc/passwd, иначе будет выбрано имя пользователя "nobody" guest account « pcguest Затем вы должны добавить в систему учетную запись pcguest (или с любым другим именем по вашему выбору), используя для этого adduser. Для настройки возможностей пользователя примените chfп; пользователь ftp может служить хорошей моделью для учетной записи гостевого пользователя Samba. (Пользователь ftp создается Sysinstall, если ваша система разрешает анонимный FTP. Подробности настройки сервера FTP читайте в главе 27.) Когда эта учетная запись будет включена, любой пользователь Windows, подключающийся к серверу Samba, получит полный доступ к любому разделяемому ресурсу, для которого установлено значение yes в параметре guest ok или public. Никакой аутентификации не потребуется для этого ресурса. Убедитесь, что параметры read only установлены для ресурсов, которые вы не хотите отдавать в шаловливые руки каждому Иванову, Петрову и Сидорову в вашей сети! СОВЕТ Параметр guest only = yes может быть специфицирован, чтобы указать, что только гостевые подключения допускаются к службе. Файлы журналов Samba В /var/log находятся несколько файлов журналов Samba — по одному для каждого типа службы и каждого подключаемого клиента. Имена этих файлов имеют форму log. service (где service — имя службы): # 1в -1 /var/log/log.* -rw-r—г— 1 root wheel 468 Jun 9 12:42 /var/log/log.gaming-pc -rw-r—r— 1 root wheel 2343 Jun 9 14:49 /var/log/log.nmb -rw-r—r— 1 root wheel 1606 Jun 9 14:44 /var/log/log.smb
Работа в сети FreeBSD Файлы log.nmb и log.smb фиксируют состояние и ошибочные условия серверов nmdb и smbd соответственно. Вдобавок всякий раз, когда возникают сообщения об ошибках для любого подключаемого клиентского хоста (такие как неудачи в аутентификации), эти сообщения выводятся в файл log «name для данного клиента. Обратите внимание, что это может привести к засорению вашего каталога /var/log значительным количеством файлов, если в сети присутствует много клиентских ПК. Вы можете переключиться на комбинированный формат журнала, закомментировав строку log file в smb«conf: • this tells Samba to use a separate log file for each machine • that connects • это указывает Samba использовать отдельный журнальный файл • для каждой машины, которая подключается ; log file = /var/log/log.%m Ошибки SMB для индивидуальных хостов после этого попадают в log. smb. Еще одна полезная строка, которую стоит модифицировать — это max log size, которая установлена по умолчанию в 50 Кбайт. Эта строка позволяет установить максимальный размер любого журнального файла. Когда любой файл журнала Samba достигает указанного вами размера, он переименовывается с добавлением расширения .old к имени файла, и новые элементы добавляются в новый файл. При следующем переименовании . old перезаписывается. • Put a capping on the size of the log files (in Kb) . • Установите предельный размер журнальных файлов (Кбайт). max log size = 50 Переменные Samba Параметры конфигурации в smb.conf не должны быть указаны жестко. В вашем распоряжении множество разнообразных подстановок, поэтому вы можете установить определенные опции динамически — в зависимости от условий соединения. Например, вы можете установить опцию отражения имени пользователя в переменной %и, что позволяет вам устанавливать такие параметры, как path=/usr/local/ share /user- f iles/%u. Пользователь harris при этом получает путь /us r/local/ share/user-files/harris. Ниже приведен список нескольких наиболее часто используемых переменных. • %и. Имя пользователя-клиента. • %д. Имя первичной группы пользователя %и. • %S. Имя текущей службы, если есть. • %Н. Домашний каталог пользователя %и. • %h. Имя хоста в Internet сервера Samba. • %М. Имя хоста в Internet клиентской машины. • %L. Имя NetBIOS сервера Samba. Позволяет изменять вашу конфигурацию в зависимости от того, какой клиент вызывает вас; ваш сервер может обладать "раздвоением личности". • %ш. Имя NetBIOS клиентской машины. %1. IP-адрес клиентской машины.
Совместное использование файлов и печати с Microsoft Windows Глава 34 997 • %Т. Текущая дата и время. • %$ (en war). Значение переменной окружения en war. Полный список переменных для подстановки содержится в man smb. conf* Прочие компоненты Samba Пакет Samba включает множество дополнительных инструментов. • smb client. Простой FTP-подобный клиент, позволяющий подключаться к удаленным разделяемым ресурсам SMB и печатать на удаленных принтерах Windows. • testparm. Утилита проверки синтаксиса конфигурационных файлов, проверяющая правильность вашего smb.conf; аналог apachectl проверки конфигурации Apache. • smbcontrol. Инструмент, позволяющий посылать сообщения работающим процессам smbd, например, команды пользователям покинуть систему. • smb status. Отображает текущие соединения с сервером Samba. SWAT, как вы видели ранее, имеет страницу, показывающую форматированный вывод этой команды в Web-браузере. • nmblookup. Позволяет вам выполнять запросы имен NetBIOS, подобные запросам хостов Windows на непосредственное подключение к разделяемым ресурсам SMB по имени. Эти инструменты и множество других, поставляемых в составе пакета Samba, также описаны в man samba; для каждого из них предусмотрена собственная страница man с дополнительными деталями. В конечном итоге, эти инструменты являются дополнением к программам smbd, nmbd и smbpasswd, о которых мы говорили ранее в этой главе. Каждая из них также имеет собственную страницу man. Доступ к совместно используемым файлам в системе Windows (файловая система smbf s) Совместное использование файлов SMB может работать в обоих направлениях. Samba позволяет вам настроить машину FreeBSD только в качестве сервера SMB, но есть способ также настроить ее в качестве клиента и монтировать удаленные ресурсы SMB как любой другой том, доступный для чтения FreeBSD. Это предусматривает использование файловой системы SMBFS, которая не встроена в ядро по умолчанию, но может быть добавлена в виде модуля ядра или скомпилирована в составе специализированного ядра. Реализация SMBFS в системе FreeBSD включает модуль ядра smbf s. ко в /modules и инструмент mount_smbf s в /sbin, который работает подобно любому другому инструменту mount_* из тех, что вы видели в главе 12. Наилучпгую документацию по SMBFS можно найти на странице man mount_smbf s. Чтобы смонтировать файловую систему SMB с использованием smbf s, запустите mount_smbf s с несколькими базовыми опциями. Флаг -I специфицирует имя хоста или IP-адрес сервера, а два оставшихся аргумента представляют имя удаленного
998 Работа в сети FreeBSD Часть V разделяемого ресурса (в форме //userQNetBIOS-hostname/share-name) и локальную точку монтирования. Чтобы смонтировать ресурс по имени public с машины Windows под названием gaming-pc в локальный каталог /smb/public, примените следующий синтаксис: # mount_srabfs -I 64.41.131.139 //guest6gaming-pc/public /smb/public Вам будет предложено ввести пароль. Используйте пустой пароль, если ресурс предоставляет полный дрступ; укажите соответствующий пароль, если ресурс настроен на доступ только по чтению или режим с парольной защитой. НА ЗАМЕТКУ Модуль ядра smbf s. ко загружается программой mount_smbf s автоматически. Если вы хотите, можете загружать его во время запуска системы, добавив следующую строку в /boot/loader.conf: smbfs_load="YES" Однако в этом, вероятно, нет необходимости, если только вы не регулярно монтируете ресурсы SMB. Если вы активно используете разделяемые ресурсы SMB, то можете рассмотреть возможность встраивания поддержки SMBFS в ядро, используя для этого следующую опцию: options SMBFS Чтобы добавить разделяемый ресурс SMB к /etc/fstab, воспользуйтесь следующим синтаксисом: //guestQgaming-pc/public /smb/public smbfs rw,noauto 0 О
ГЛАВА 35 Протокол динамической конфигурации хоста (DHCP) В этой главе... • Как работает DHCP • Включение DHCP • Программа dhclient • Запуск сервера DHCP
Работа в сети FreeBSD DHCP, что означает Dynamic Host Configuration Protocol (протокол динамической конфигурации хоста) — это сетевой протокол, позволяющий клиенту получить его IP-адрес, информацию сервера имен, информацию сервера-шлюза, и другую информацию о конфигурации сети, от функционирующего сервера DHCR В настоящей главе будет показано, как сконфигурировать клиент DHCP в вашей системе FreeBSD (чтобы она могла получать IP-адрес от сервера DHCP). Также будут рассмотрены вопросы конфигурирования вашей машины FreeBSD в качестве DHCP- сервера сети. Как работает DHCP DHCP исключает необходимость ручного конфигурирования информации TCP/IP в вашей системе, а вместо этого извлекает ее с центрального сервера. Программа, называемая dhclient, позволяет FreeBSD работать клиентом DHCP. Когда система, сконфигурированная для использования DHCP, загружается и стартует dhclient, он посылает широковещательные запросы на UDP-порт с номером 68 в поисках любого сервера в LAN, который отвечает информацией DHCP. Поскольку эти дейтаграммы отправляются по широковещательному адресу (255.255.255.255), неважно, что клиентская машина пока не имеет никакой конфигурированной информации TCP/IP. Если в сети присутствует сервер DHCP, он слушает эти запросы на порте 68. Когда он принимает запрос конфигурационной информации, то проверяет свою базу данных на предмет свободного IP-адреса, который может быть присвоен клиенту. Затем он отправляет эту информацию (опять же по широковещательному адресу, поскольку клиент еще не имеет собственного адреса IP) и "выдает" предлагаемый IP-адрес. После некоторых согласований, которые происходят, опять-таки, по широковещательному адресу, и потому видимы всем компьютерам сети, сервер DHCP подсылает клиенту (на UDP-порт с номером 67) всю конфигурационную информацию, которую в противном случае пришлось бы устанавливать вручную. IP-адрес, присвоенный клиенту, исключается из пула свободных адресов, так, чтобы его нельзя было выдать другому клиенту, запросившему конфигурационную информацию DHCP. Этот хост, запускающий dhclient, применяет у себя согласованную конфигурацию TCP/IP, и с этого момента может использовать маршрутизированную IP-сеть, применяя назначенный ему IP-адрес и прочие установки. Аренда IP-адреса Когда DHCP-сервер присваивает IP-адрес клиенту, клиент не заполучает этот адрес в какое-то персональное "владение". Скорее, он арендует этот адрес на срок, установленный DHCP-сервером. Информация о том, как долго можно арендовать адрес посылается клиенту вместе с прочей конфигурационной информацией. Аренда IP-адресов служит двум целям. • Если с сервером DHCP невозможно установить контакт, клиент проверяет собственную базу данных, чтобы найти арендованный адрес, который все еще в силе. Предполагая, что аренда этого адреса действует, клиент может продолжить нормально функционировать — даже если в настоящий момент DHCP-сервер выключен, несмотря на то, ^гго имеющаяся конфигурация является временной, и в конечном итоге станет недействительной.
Протокол динамической конфигурации хоста (DHCP) Глава 35 1001 • Он автоматически помещает неиспользуемые IP-адреса обратно в пул после того, как истекает их срок аренды. Это позволяет экономить IP-адреса. Например, когда фирму навещает гость из филиала, он может подключить свой портативный компьютер в сеть и получить IP-адрес, чтобы иметь возможность работать в сети. Когда он покидает офис, выданный ему IP-адрес, в конечном итоге, становится недействительным и возвращается обратно в пул для дальнейшего использования другими клиентами. Таким образом, IP-адрес не тратится на систему, которая более не существует. Преимущества DHCP перед статическими IP-адресами В зависимости от вашей конкретной ситуации, DHCP может иметь ряд преимуществ перед простым присвоением каждой системе собственного IP-адреса. Среди этих преимуществ следующие. • Простота сопровождения. DHCP автоматически отслеживает, какие адреса находятся в использовании, а какие свободны. Это избавляет системного администратора от ручного обновления списков IP-адресов, присвоенных новым клиентам, а также от необходимости помнить об исключении старых IP-адресов, когда клиенты навсегда удаляются из сети. Все это выполняется DHCP автоматически. • Простота инсталляции новых клиентов. Когда новые клиенты инсталлируются, вам (или пользователю) не приходится заботиться о настройке сетевой информации. Вы можете просто попросить нового клиента получить эту информацию через DHCP, и все сетевые настройки будут установлены автоматически. • Простота применения для командировочных. Если ваши пользователи регулярно ездят в филиалы, то DHCP значительно облегчит им жизнь. С DHCP они могут просто включать свои портативные компьютеры в сеть офиса-филиала и получить всю конфигурационную информацию сети автоматически. Приезжая в другой офис, они могут сделать то же самое и получить новый набор корректных настроек. Таким образом, ваши пользователи не должны каждый раз переконфигурировать свои сетевые настройки. • Это позволяет экономить IP-адреса. Это особенно верно, если у вас есть путешествующие пользователи, которые навещают филиалы от случая к случаю и включают свои портативные компьютеры в сеть. DHCP позволяет автоматически возвращать эти IP-адреса после того, как такой пользователь покидает сеть. Таким образом, вы не тратите IP-адреса на системы, которые лишь изредка подключаются в сеть. • Исключаются проблемы, вызванные конфликтами IP-адресов. Стоит одному пользователю допустить одну опечатку при настройке системы, как это может породить разнообразные проблемы в сети. Пользователь может ввести IP-адрес, который конфликтует с другой системой в сети, например, или же адрес, конфликтующий с IP-адресом сервера. DHCP исключает эту проблему за счет автоматической^ присвоения IP-адресов и отслеживания их использования, чтобы невозможно было присвоить один и тот же адрес нескольким системам. DHCP стало неотъемлемой частью любой корректно настроенной корпоративной сети и необходимым условием правильного управления сетью. Даже для пользователей домашних сетей DHCP незаменим, пусть они и не знают о его существовании —
I л t\r\*\ I Работа в сети FreeBSD 1 00Z I Часть У это значит, им больше не приходится беспокоиться о вводе загадочных настроек TCP/IP собственноручно, когда они подключаются к поставщику Internet-услуг либо к домашней беспроводной сети. В самом деле, DHCP в последние годы стало одним из краеугольных камней распространения домашнего Internet, без чего миллионам людей пришлось бы иметь дело с техническими сложностями в большей мере, чем это нужно сейчас. Единственный случай, когда нецелесообразно применять DHCP — это когда вы запускаете сервер. Машины с присвоенными DNS-именами и машины, предоставляющие такие службы, как совместно используемые ресурсы NFS, Web, электронная почта, должны иметь статические IP-адреса, чтобы клиентские машины могли надежно к ним подключаться» По этой причине общая корпоративная сетевая топология построена так, что внутренняя сеть основана на DHCP, так что сотни и даже тысячи сотрудников, чьи IP-адреса не важны, могут получать динамическую информацию TCP/IP внутри корпоративной сети; однако корпоративный Web-сервер при этом находится в сети DMZ со статическим IP-адресом и открытым именем DNS, так что может быть доступен в любое время, из любой точки планеты. НА ЗАМЕТКУ Причина, по которой многие поставщики широкополосных служб не позволяют своим клиентам запускать серверы, заключается не только в ограниченной скорости загрузки по кабелям или соединениям ADSL, но также в том, что присвоение динамических IP-адресов через DHCP намного более экономно, чем резервирование статических IP-адресов для тысяч или сотен тысяч клиентов сети. Включение DHCP Для трго чтобы можно было сконфигурировать FreeBSD в качестве клиента сети DHCP, он должен иметь возможность перевести свой сетевой интерфейс в "беспорядочный режим*; это означает, что он может видеть и отвечать на пакеты, которые не предназначены явно его IP-адресу. Эта функциональность обеспечивается устройством Berkley Packet Filter (фильтр пакетов Беркли), скомпилированным в ядро. Это устройство устанавливается по умолчанию в ядре GENERIC, так что если только вы не строите специализированное ядро с его удалением, вам не придется ничего делать. Чтобы проверить, установлен ли Berkley Packet Filter в ядре системы, поищите следующую строку в файле конфигурации ядра: device bpf Если эта строка присутствует, то вам ничего не нужно делать. Если же ее нет, вам придется ее добавить и пересобрать ядро. Полная инструкция по сборке ядра содержится в главе 18. После того, как вы убедитесь, что ядро обладает возможностями коммуникаций "беспорядочного режима", вы можете включить DHCP, отредактировав файл /etc/ г с. con f. Если там уже есть строка if con fig, специфицирующая информацию для вашего сетевого интерфейса (например, ifconf ig_fxO), измените ее следующим образом: ifconfig_edO=,,DHCP,f
Протокол динамической конфигурации хоста (DHCP) I щм I Глава 35 I I Если этой строки нет, добавьте ее. Затем либо перезапустите систему, либо выполните сценарий /etc/netstart, чтобы активизировать новую конфигурацию. Программа dhclient Программа dhclient представляет собой клиентскую часть DHCR Она запускается автоматически при каждой загрузке системы, если у вас есть сетевые интерфейсы, сконфигурированные на использование DHCP. Опции командной строки dhclient Если вам нужно модифицировать поведение по умолчанию dhclient, вы можете сделать это, применив к нему флаги с опцией в /etc/rc. conf. Эта опция должна появляться ниже строки if conf ig, в которой конфигурируется интерфейс DHCP: dhcp_f lags*" flags4* Здесь flags — список опций dhclient, которые передаются программе при ее вызове из командной строки. В табл. 35.1 представлен список допустимых опций. Таблица 35.1. Допустимые опции dhclient Опция Действие -4 Эта опция заставляет dhclient оставаться в фоновом режиме вместо перехода на передний план после получения конфигурационной информации. Должна использоваться только в отладочных целях и никогда не должна применяться в /etc/rc. conf. "Я. Эта опция заставляет dhclient выполняться в "молчаливом" режиме (другими словами, не печатать никаких сообщений, за исключением ошибочных условий). -1 Эта опция заставляет dhclient выполнять только одну попытку получения IP-адреса. Если попытка не удается, dhclient завершается с состоянием 2. Обратите внимание, что это — цифра 1, а не прописная буква L Файл dhclient. conf /etc/dhclient. conf — это конфигурационный файл для dhclient, в котором вы можете специфицировать различные опции помимо простых переключателей поведения, доступных в командной строке или г с. conf. Этот файл должен существовать, чтобы dhclient мог выполняться, хотя по умолчанию файл не содержит ничего кроме комментариев, dhclient предусматривает разумные значения по умолчанию, которые хорошо работают в большинстве типичных случаев, так что большая часть пользователей не должна беспокоиться о содержимом этого файла. Однако вам стоит знать о некоторых опциях, которыми можно управлять в этом файле. В табл. 35.2 перечислены некоторые из них. Намного больше опций могут использоваться в конфигурационном файле /etc/dhclient. conf. Информацию о доступных опциях в этом файле читайте в man dhclient.conf. Также за дополнительной информацией об опциях, которые могут быть запрошены или затребованы от сервера DHCP, обращайтесь в man dhcp-options.
1004 Работа в сети FreeBSD Часть V Таблица 35.2. Некоторые опции dhclient.conf Опция Действие timeout л retry л select-timeout л reboot л request option require option default option value supersede option value reject address Здесь л — количество секунд, в течение которых dhclient должен ожидать ответа, пытаясь соединиться с сервером DHCP перед тем, как сдаться и решить, что сервер недоступен. По умолчанию принято 60 секунд. Здесь л — количество секунд, в течение которых dhclient должен ожидать перед тем, как повторно попытаться соединиться с сервером DHCP, если первый запрос снят по таймауту. По умолчанию ожидает пять минут. В некоторых сетях может присутствовать более одного сервера DHCP. В таком случае клиент может принять несколько предложений конфигурационной информации. Первое полученное предложение — не всегда лучшее (например, если второе полученное предложение содержит тот же IP-адрес, который клиент использовал в предыдущем сеансе, то более предпочтительно предложение, в котором IP-адрес отличается). Здесь л — количество секунд, в течение которых dhclient должен ожидать после получения первого предложения, чтобы увидеть, не ответят ли другие серверы со своими предложениями. Когда стартует dhclient, он пытается получить тот же IP-адрес, который он имел в последний раз. Если он не может получить тот же адрес, то принимает другой. Здесь л — количество секунд, в течение которых dhclient ожидает, прежде чем сдаться и решить, что он не может получить тот же IP-адрес, который он получал последний раз. По умолчанию принято 10 секунд. Клиент запросит информацию по указанным опциям {option) от сервера DHCP. Информацию о доступных опциях читайте в man dhcp-options. Клиент потребует информации об указанных опциях (option) от сервера DHCP. Если запрошенная информация не предоставлена, клиент отвергнет предложение. Информацию о доступных опциях читайте в man dhcp-options. Если сервер DHCP не предоставляет информации об указанной опции {option), то для этой опции будет принято значение value. Информацию о доступных опциях читайте в man dhcp-options. Указанная опция {option) всегда будет использовать значение value, даже если сервер DHCP пришлет другое значение для нее. Информацию о доступных опциях читайте в man dhcp-options. Любые предложения, присланные сервером DHCP, со значением IP-адреса address будут отвергнуты.
Протокол динамической конфигурации хоста (DHCP) | 1rtn,, I гп***Ы I 1005 1 Как упоминалось ранее, большинству пользователей не понадобится вносить какие-либо изменения в /etc/dhclient .conf, поскольку значения по умолчанию dhclient обычно хорошо работают, за исключением очень специализированных сред DHCP. Запуск сервера DHCP Программное обеспечение, необходимое для запуска сервера DHCP, не является встроенным в FreeBSD. Однако доступны пакеты от независимых разработчиков, выполняющие эту функцию, в составе коллекции портов и пакетов; возможно, наиболее популярный и полнофункциональный пакет — это пакет сервера ISC DHCP, "ссылочная реализация** набора инструментов, написанных теми же разработчиками, которые создали BIND. Порт, называемый isc-dhcp3-server, доступен в каталоге net дерева портов. Информацию об установке портов читайте в главе 16. При инсталляции isc-dhcp3 создается файл запуска в /usr/local/etc/rc.d, называемый isc-dhcp.sh. Следующий раз, когда вы перезапустите систему, этот файл автоматически заставит стартовать сервер DHCP. Однако прежде, чем вы сделаете это, необходимо подстроить файл dhcp. conf, чтобы он отвечал нуждам вашей системы. Вероятно, будет не слишком хорошей идеей просто переименовать файл по умолчанию /usr/local/etc/dhcpd. conf .sample в dhcpd.conf и надеяться, что все будет в лучшем виде. Файл примера содержит огромное количество примеров конфигураций, предназначенных для демонстрации правильного синтаксиса для каждой из нескольких возможных сетевых сред. Если вы просто используете это файл, как он есть, то получите конфигурацию, которая не имеет ничего общего с реальностью. Поэтому вместо этого создайте совершенно новый файл dhcpd.conf, используя dhcpd.conf .conf в качестве руководства по настройке вашей сети DHCP согласно существующим специфическим нуждам. Например, сначала вы должны решить, хотите ли вы ограничить службу DHCP только определенными подсетями, как следует определить пул доступных IP-адресов и так далее. Затем поищите в образце конфигурационного файла примеры настроек, отвечающих вашим потребностям. Содержимое dhcp.conf состоит из операторов option, которые могут быть помещены внутри блока конфигурации, применяемого к определенной группе клиентов (такой как subnet), или вне всех блоков, чтобы применить ко всем клиентам. Вы должны начать файл с опций, которые вы хотите применить ко всем клиентам, подключающимся к серверу: option domain-name nexample.com"/ option domain-name-servers nsl.example.com, ns2.example.com; default-lease-time 600; max-lease-time 7200; ddns-update-style ad-hoc; НА ЗАМЕТКУ Операторы, начинающиеся с ключевого слова option, описывают конфигурационную информацию, которая передается непосредственно клиенту как часть протокола DHCP. Операторы без префикса option — это команды, управляющие поведением самого сервера DHCP, таким как работа аренды адресов или указание корректных диапазонов IP-адресов.
1006 Работа в сети FreeBSD Часть V Затем вам понадобится минимум одно объявление подсети (subnet), которая задает сеть, где "живет* сервер DHCP, и хостам которой нужно присваивать адреса. Это место, где вы поместите такие операторы, как range (определяющий пул доступных IP-адресов) и option routers (который по своей природе является опцией конфигурации, специфичной для подсети, указывая маршрутизатор, обслуживающий сеть). subnet 64.41.131.32 netmask 255.255.255.224 { range 64.41.131.40 64.41.131.63; option routers 64.41.131.162; } Вы можете также поместить опции вроде default-lease-time в блок subnet; эти более специфичные определения перекрывают глобальные установки для подсетей, в которых они содержатся. Доступно еще великое множество дополнительных опций, которые вы можете счесть необходимыми, в зависимости от сложности вашей сети. Обратитесь к странице man dhcpd и примерам в dhcpd.conf .sample за руководством по этим более специализированным конфигурациям.
TbVI ЧАС Приложения В этой части... Приложение А. Команды и конфигурационные файлы Приложение Б. Списки совместимого оборудования Приложение В. Поиск и устранение проблем в процедуре установки и загрузки Приложение Г. Источники дополнительной информации
ПРИЛОЖЕНИЕ Команды и конфигурационные файлы Это приложение представляет собой мини-справочник по наиболее часто используемым в FreeBSD командам. Оно состоит из нескольких разделов, в каждом из которых перечислены команды, предназначенные для выполнения какой-нибудь определенной задачи, например, для работы с файлами и каталогами, либо для работы с учетными записями и привилегиями пользователей, либо для администрирования системы и так далее. Для каждой команды приводится краткое описание и номер главы, в которой о ней можно найти дополнительную информацию. Кроме того, в этом приложении также содержится перечень некоторых наиболее часто используемых конфигурационных файлов. СОВЕТ Получить более подробную информацию о той или иной из перечисленных здесь команд можно и воспользовавшись руководством, то есть отыскав посвященную этой команде страницу во встроенном руководстве FreeBSD. Чтобы найти ту или иную страницу во встроенном руководстве, следует ввести команду man command, где command — это имя интересующей вас команды. Опции команд Почти все из описываемых в этом приложении команд могут использоваться с опциями, также называемыми переключателями или аргументами. Чтобы использовать с командой опцию, следует после имени команды поставить пробел, а затем ввести дефис и представляющий нужную опцию символ. Например, чтобы отобразить перечень элементов каталога в подробном формате, нужно использовать опцию -1, то есть необходимо ввести 1а -1. Если необходимая опция представляет собой не одну букву, а, к примеру, целое слово, перед ней следует ввести не один, а два символа дефиса (например: —password). Если этого не сделать, каждая буква будет восприниматься как отдельная опция, что может привести к непредсказуемым или даже разрушительным последствиям, в зависимости от предназначения этой опции. Обратите внимание на то, что поскольку буквы воспринимаются как отдельные аргументы, если перед ними стоит одиночный символ дефиса, команде можно передавать сразу несколько опций в виде одного единственного аргумента. А
1010 Приложения Часть VI Например, чтобы просмотреть все имеющиеся в каталоге файлы (включая скрытые) да и к тому же в подробном формате, вы могли бы использовать такую команду: Is -al Некоторые опции сами могут принимать аргументы, которые, в свою очередь, могут задаваться несколькими способами: crontab -u frank mysql —usereroot В большинстве случаев команды, которые выполняют операции с файлами или имеют определенный обязательный аргумент (такие как команда kill, которой обязательно в качестве аргумента должен передаваться идентификационный номер процесса), требуют, чтобы опции указывались между именем команды и обязательным аргументом или именем файла. Например: kill -1 1453 Запомните, что все это принятые соглашения, и что есть команды, которые не ведут себя так, как описывается здесь. Всегда проверяйте по руководству те команды, с которыми вы не знакомы, дабы удостовериться в том, что их опции будут вести себя именно так, как вы ожидаете. Команды для работы с файлами и каталогами Команда Действие cd dirname Is ср old file new file mv old file new file Используется для перехода в каталог dirname. Если путь не указывается, она предполагает, что каталог dirname является относительным для текущего пути (см. главу 8). Отображает содержимое текущего каталога. Часто попользуется вместе со следующими опциями: -1, которая позволяет ей отображать атрибуты каждой записи в каталоге, -а, которая позволяет ей отображать скрытые файлы (то есть те, имена которых начинаются с точки), и -F, которая позволяет ей дифференцировать типы файлов (см. главу 8). Копирует файл oldfile в файл newfile. Если ни к одному из файлов путь не указывается, она предполагает, что эти файлы находятся в текущем каталоге. Наиболее часто используется с такими опциями: -R, которая позволяет ей рекурсивно копировать каталог, -р, которая позволяет ей сохранять информацию о полномочиях и владельце файлов при копировании, и -i, которая позволяет ей выполнять копирование в интерактивном режиме, исключающем случайное перезаписывание существующих файлов (см. главу 8). Перемещает файл oldfile в файл newfile. Если ни к одному из файлов путь не указывается, она предполагает, что эти файлы находятся в текущем каталоге. Наиболее часто используется с опцией -i, которая позволяет ей выполнять копирование в интерактивном режиме, исключающем случайное перезаписывание существующих файлов. Эта команда также применяется для переименования файлов и каталогов (см. главу 8).
Команды и конфигурационные файлы Приложение А 1011 Команда Действие rm filename rmdir dirname touch filename mkdir dirname In filel file2 mount filesystem mountpoint umount mountpoint Удаляет файл по имени filename. Данный процесс является необратимым. Эта команда наиболее часто используется вместе с такими опциями: -i, которая позволяет ей запрашивать подтверждение на выполнение удаления, -f, которая позволяет ей выполнять операцию удаления принудительно и подавлять предупредительные сообщения системы, и -г, которая позволяет ей рекурсивно удалять содержимое каталогов (см. главу 8). Удаляет каталог по имени dirname при условии, что он пуст (см. главу 8). Обновляет время доступа к файлу filename. Если такой файл еще не существует, создает его (см. главу 8). Создает каталог dirname. Опция -р позволяет ей создать такие каталоги по всему указному пути, если таковые еще не существуют (см. главу 8). Создает ссылку по имени file2, которая будет служить альтернативным именем для файла filel. Опция -s позволяет ей * создавать не жестко закодированную ссылку, а символьную, похожую на ярлык в Windows. Монтирует файловую систему filesystem в каталоге mountpoint, чтобы сделать ее доступной для использования (см. главу 12). Размонтирует файлов/ю систему, смонтированную в каталоге mountpoint, делая ее недоступной для использования (см. главу 9). Команды для работы с учетными записями и правами пользователей Команда Действие chmod permissions filename chown use тате filename chgrp groupname filename passwd adduser rmuser username vipw Изменяет права доступа к файлу filename, используя числовые и символьные коды прав доступа (см. главу 13). Заменяет владельца файла filename на пользователя username (см. главу 13). Заменяет группу, к которой относится файл filename, на группу groupname (см. главу 13). Изменяет пароль, используемый для входа в систему. Пользователь root может указать после passwd имя какого-то другого пользователя и изменить его пароль (см. главу 13). Запускает сценарий, который добавляет в систему нового пользователя (см. главу 13). Запускает сценарий, который удаляет из системы того или иного пользователя. Этот пользователь больше не сможет подключаться к этой системе (см. главу 13). Позволяет редактировать файл /etc/master .passwd напрямую и обновляет базу данных при выходе (см. главу 13).
1012 Приложения Часть VI Команды, наиболее часто используемые в оболочке Команда Действие grep pattern filename less filename cat filename wc filename diff filel file2 fmt filename cut options filename head filename tail filename sort filename cal date Отыскивает в файле filename указанный образец pattern или регулярное выражение (см. главы 8 и 9 для получения более подробной информации о регулярных выражениях). Отображает содержимое файла filename по одному экрану за раз. Команда more является синонимом команды less (см. главу 8). Последовательно отображает содержимое файла filename. Команда cat обычно используется вместе с переадресацией и конвейерами для отправки содержимого файла через какую-нибудь другую команду (см. главу 8). Отображает количество слов, строк и символов в файле filename (см. главу 8). Сравнивает содержимое файла filel с содержимым файла file2 и затем отображает отличия между этими файлами. Вместе с опцией -г позволяет рекурсивно сравнивать содержимое целых каталогов (см. главу 8). Форматирует файл filename, размещая его строки так, чтобы этот файл стал пригодным для отправки по электронной почте. Вывод этой команды по умолчанию отправляется в stdout (см. главу 8). Отображает только определенный столбец или поле из табличных данных в файле filename. Вывод этой команды по умолчанию отправляется в stdout (см. главу 8). Соответствующей командной, которой можно пользоваться для объединения нескольких файлов в текстовую таблицу, является команда paste. Отображает первые десять строк файла filename. При желании просмотреть другое количество строк, следует просто указать в этой команде в качестве опции нужное число (например, так: -50) (см. главу 8). Отображает последние десять строк файла filename. При желании просмотреть другое количество строк, следует просто указать в этой команде в качестве опции нужное число (например, так: -50) (см. главу 8). Сортирует содержимое файла filename в алфавитном или (если используется опция -п) в числовом порядке. Вывод этой команды по умолчанию отправляется в stdout (cm. главу 8). Отображает календарь на текущий месяц. Если вместе с ней используется опция -у, показывает календарь на все месяцы в году, а если вместе с ней используется опция -у year (год), показывает календарь на указанный год (более подробную информацию об этой команде можно найти на соответствующей странице встроенного руководства, воспользовавшись командной man cal). Отображает текущую дату и время. Пользователь root может также применять эту команду для изменения даты и времени. Для нее доступно множество опций форматирования (более подробную информацию об этой команде можно найти на соответствующей странице встроенного руководства, воспользовавшись командной man date).
Команды и конфигурационные файлы Приложение А 1013 Команда Действие man command Отображает страницу встроенного руководства, посвященную команде command (см. главу 8). vi Вызывает текстовый редактор vi. Если указано имя файла, открывает этот файл в vi (см. главу 6). ее Вызывает текстовый редактор ее (Easy Editor). Если указано имя файла, открывает этот файл в ее (см. главу 6). Команды для обслуживания системы и вызова системных утилит Команда Действие ps top kill n killall pname at crontab filename shutdown reboot Отображает список процессов, работающих сейчас в системе. Наиболее часто используется вместе со следующими опциями: -1, которая позволяет ей отображать в этом списке дополнительные сведения, -а, которая позволяет ей отображать абсолютно все процессы, -х, которая позволяет ей отображать также и процессы демонов, и -w или -ww, которые позволяют ей отображать список процессов в "широком" (wide) формате (см. главу 15). Отображает постоянно обновляющийся перечень процессов и статистику используемых ими ресурсов (см. главу 15). В этой команде л — это идентификационный номер процесса, который требуется завершить. Вместе с этой командой могут использоваться и другие опции, позволяющие посылать процессу различные сигналы (см. главу 15). В этой команде рпате — это имя процесса, который требуется завершить. Все процессы, имена которых совпадают с указанным и которые принадлежат вам, будут завершены (с сигналом term). Вместе с этой командой могут использоваться и другие опции, позволяющие посылать процессу различные сигналы (см. главу 15). Позволяет спланировать задание или команду для выполнения в определенное время (см. главу 15). Позволяет спланировать задание или команду для регулярного выполнения. Может использоваться с опцией -е (для редактирования существующего файла crontab) и опцией -и (для указания файла определенного пользователя). Аргумент filename является необязательным и представляет собой имя файла crontab, который нужно отредактировать (см. главу 15). Завершает работу системы или перезагружает ее. Для этой команды доступно множество опций, позволяющих помещать систему в различные режимы, такие как, например, однопользовательский режим (см. главу 4). Перезагружает систему. Доступна еще одна аналогичная команда — halt. Команда halt принимает такие же аргументы, как и reboot, но не перезагружает систему, а завершает ее работу (см. главу 4).
1014 Приложения Часть VI Команды для работы с принтером Команда Действие ___^___ 1рг Отправляет задание на печать (см. главу 17). lprm л в этой команде л — это номер задания. Эта команда удаляет задание, отправленное на принтер. Другие опции позволяют ей удалять задания определенного пользователя и т.п. (см. главу 17). 1pq Отображает список заданий, находящихся в очереди на печать (см. главу 17)* !рс Позволяет управлять очередями заданий на печать и демонами печати (см. главу 17). Команды для установки и удаления пакетов программ Команда Действие pkg_info pkg_add раскадепате « pkg_delete раскадепате make make install make deinstall make clean make distclean Отображает перечень установленных в системе пакетов программ с кратким описанием каждого из них (см. главу 16). Устанавливает пакет программ раскадепате на систему. Опция -г позволяет команде pkg_add самостоятельно загрузить указанный пакет из Internet, не заставляя делать это вас (см. главу 16). Удаляет пакет программ раскадепате из системы (см. главу 16). В случае, когда эта команда выполняется из каталога порта, она извлекает файлы порта и компилирует порт. В противном и более часто бывающем случае она используется для компиляции программ на основе целевых элементов, указанных в файле Makefile (см. главу 16). В случае, когда эта команда выполняется из каталога порта, она устанавливает порт, при условии, что он уже скомпилирован. В противном случае она сначала извлекает необходимые файлы и компилирует порт (см. главу 16). В случае, когда эта команда выполняется из каталога порта, она удаляет с системы установленный порт, а также все его зависимые компоненты, если их наличие не требуется для нормальной работы какого-нибудь другого порта или пакета (см. главу 16) В случае, когда эта команда выполняется из каталога порта, она удаляет все рабочие файлы и файлы объектов, которые были созданы во время компиляции порта, и тем самым освобождает использовавшееся ими пространство на жестком диске (см. главу 16). В случае, когда эта команда выполняется из каталога порта, она удаляет все рабочие файлы и файлы объектов, которые были созданы во время компиляции порта, а также все файлы исходного Дистрибутива, которые загружались из Internet, и тем самым освобождает использовавшееся ими пространство на жестком диске (см. главу 16).
Команды и конфигурационные файлы Приложение А НА ЗАМЕТКУ Команда make clean не деинсталлирует порт, а также не удаляет исходный архивный файл, который был загружен из Internet. Общие конфигурационные файлы Имя файла Предназначение /etc/rc.conf Главный конфигурационный файл системы, в котором находятся опции, отвечающие за запуск FreeBSD (см. главу 11). /etc/red/ Каталог, содержащий сценарии гс, которые отвечают за десятки различных функций системы, таких как inetd, сервер имен named, брандмауэр ipf w и другие. Каждый сценарий может принимать следующие аргументы: start, stop и restart. . login Конфигурационный файл командных оболочек в стиле С (csh и tcsh). (См. главу 9.) .profile Конфигурационный файл командных оболочек в стиле Bourne (sh, ksh и bash). (См. главу 9.) . cshrc Содержит опции конфигурации командных оболочек в стиле С (csh и tcsh), действие которых распространяется на подоболочки и оболочки, используемые по умолчанию. (См. главу 9.) .bashrc Содержит опции конфигурации командных оболочек в стиле Bourne (sh, ksh и bash), действие которых распространяется на подоболочки и оболочки, используемые по умолчанию. (См. главу 9.) /etc/csh. login Содержит используемые по умолчанию глобальные опции конфигурации командных оболочек в стиле С (csh и tcsh), действие которых распространяется на всех пользователей. (См. главу 9.) /etc/profile Содержит используемые по умолчанию глобальные опции конфигурации командных оболочек в стиле Bourne (sh, ksh и bash), действие которых распространяется на всех пользователей. (См. главу 9.) . forward Отвечает за перенаправление электронной почты пользователя, в домашнем каталоге которого он находится (см. главу 25). . xinitrc Отвечает за опции Х11, такие как оконный диспетчер и приложения, которые должны автоматически запускаться при запуске Х11 (см. главу 7). /etc/xil/xorg.conf Главный конфигурационный файл системы X Window System (см. главу 7). НА ЗАМЕТКУ В версиях FreeBSD, предшествующих 5.3, в которых используется XFree86, а не Xorg, этот файл называется /etc/Xll/XF86Config.
ПРИЛОЖЕНИЕ Списки совместимого оборудования В этом приложении приводятся списки некоторых устройств, с которыми FreeBSD точно может работать, а также список видеокарт, которые на текущий момент поддерживает система X Window System. Обратите внимание, что эти списки подходят только для FreeBSD, устанавливаемой на платформе х86 (то есть на базе Intel и совместимого с Intel оборудования). Также данное приложение является далеко не исчерпывающим источником информации об абсолютно всем поддерживаемом оборудовании, а скорее кратким руководством, которое может вам помочь достаточно быстро определить перед установкой FreeBSD, является ли по крайней мере большая часть вашей системы совместимой с FreeBSD. Полный перечень совместимого оборудования можно найти по адресу http: //www. freebsd.org/ (щелкнув на ссылке Hardware Notes (Оборудование) напротив нужной версии FreeBSD). Требования к системе Минимальные требования: • процессор — Intel 486 или другой совместимый процессор; • объем ОЗУ - 8 Мбайт; • объем свободного пространства на диске — 80 Мбайт. FreeBSD может пользоваться преимуществами самых последних технологических новинок, таких как симметричные многопроцессорные материнские платы (SMP) и видеокарты с акселераторами, и когда служит настольной рабочей станцией с KDE или GNOME, может требовать столько же ресурсов (объема ОЗУ и пространства на диске), сколько и Windows или Мае. Указанным здесь минимальным требованиям не стоит особо доверять; если вы хотите запустить современную версию FreeBSD на старом оборудовании, либо для того, чтобы "продлить жизнь" какому-то любимому системному блоку, либо для того, чтобы потом иметь возможность хвалиться всем, что вам удалось сделать довольно полезным очень ограниченное по своим возможностям оборудование, рекомендуется считать минимальными такие требования: • процессор — Intel Pentium или другой совместимый процессор; • объем ОЗУ - 32 Мбайт; Б
• Объем свободного пространства на диске — по крайней мере 1 Гбайт для полной установки (вместе с XII) плюс пространство для дополнительных сторонних программ. Для серверов может требоваться и больший объем свободного пространства, что зависит от количества пользователей и служб, которые данный сервер предоставляет. Кроме того, если вы планируете запускать X Window System, рекомендуется также учитывать и следующие требования к системе. • Монитор, способный (без проблем) поддерживать разрешение 1024x768. Разрешение 800x600 является допустимым, но чревато загромождением рабочего стола. • Поддерживаемая видеокарта SVGA (см. раздед "Видеокарты, поддерживаемые XII") с минимум 1 Мбайт видеопамяти. • По крайней мере, 64 Мбайт ОЗУ. • Трехкнопочная мышь. Поддерживаемое оборудование Все перечисляемое в следующих разделах оборудование точно может работать с FreeBSD. Дисковые контроллеры (IDE/ATA) • Любой обобщенный контроллер с MFM или RLL (WD1003) • Любой обобщенный контроллер с интерфейсом IDE (WD1007) • Контроллеры с интерфейсом АТА • FreeBSD поддерживает режим UDMA на контроллерах, которые могут его использовать • Для контроллеров RAID производства Adaptec, Dell, MegaRAID и AMCC поддерживается интерфейс Serial ATA (SATA) НА ЗАМЕТКУ Также поддерживаются USB-устройства массовой памяти (еще называемые внешними жесткими дисками) большинства производителей, таких как Iomega, ADTEC, Logitech, Panasonic, IBM, TEAC, Sony и другие. Однако загрузка с USB-устройств, скорее всего, будет проблематичной. Дисковые контроллеры (SCSI) Обратите внимание на то, что в некоторых SCSI-контроллерах (вроде SCSI-контроллеров SoundBlaster) используются наборы микросхем других производителей, таких как Adaptec. Если вам не удается найти именно такую, как у вас, карту здесь, попробуйте узнать, какой набор микросхем в ней установлен. В некоторых случаях этот набор микросхем будет присутствовать в следующем списке.
Списки совместимого оборудования I 40%Af% I _ * ( _ loig Приложение Б I , I Adaptec: • EISA SCSI-контроллеры серии 174Х в стандартном и расширенном режиме • EISA/VLB/PCI SCSI-контроллеры серии 274Х/284Х/2920С/294Х/2950/ 3940/3950 (Narrow/Wide/Twin) • Встроенные SCSI-контроллеры AIC-7850, AIC-7860, AIC-7880, AIC-789X • ISA SCSI-контроллеры серии 1510 (не для загрузочных устройств) • ISA SCSI-контроллеры серии 152Х • SCSI-контроллеры серии 154х и 174х • Хост-адаптеры серии AIC-7770 и А1С-78хх • SCSI-контроллеры RAID серии 2120S, 2130S, 2200S, 2130SLP, 2230SLP, 5400S AdvanSys: Поддерживаются все SCSI-контроллеры AdvanSys. BusLogic: • Хост-адаптеры серии MultiMaster "V/", такие как ВТ-948, ВТ-958 и ВТ-9580 • Хост-адаптеры серии MultiMaster "C\ такие как ВТ-946С, ВТ-956С, BT-956CD, ВТ-445С, ВТ-747С, ВТ-757С, BT-757CD, ВТ-545С и BT-540CF • Хост-адаптеры серии MultiMaster "S", такие как BT-445S, BT-747S, BT-747D, ВТ- 757S, BT-757D, BT-545S, ВТ 542D, ВТ-742А и ВТ-542В • Хост-адаптеры серии MultiMaster 'А", такие как ВТ-742А и ВТ-542В Compaq: Усовершенствованные контроллеры дисковых массивов: IDA, IDA-2, IAES, SMART, SMART-2/E, SMART-2/P, SMART-2/SL; Integrated Array; и Smart Arrays 3200, 3100ES, 221, 4200 и 4250ES. DPT: Поддерживаются: SmartCACHE Plus, SmartCACHE III, SmartRAID III, SmartCACHE IV, and SmartRAID IV SCSI/RAID. Пока не поддерживаются: DPT SmartRAID/CACHE V. Также поддерживается контроллер DPT PM3754U2-16M SCSI RAID. DTC: SCSI-контроллер 3290 в режиме эмуляции Adaptec 1542. MegaRAID: SCSI-контроллеры серии 320-х, серии Enterprise 1200, серии Elite 1500 и серии Express 100. SymBios (также NCR): PCI SCSI-контроллеры 53C810, 53C810a, 53C815, 53C820, 53C825a, 53C860, 53C875, 53C875J, 53C885 и 53С896, такие как ASUS SC-200; Data Technology DTC3130 (всех видов); Diamond FirePort (все); карты NCR (все); карты SymBios (все); Tekram DC390W, 390U и 390F; и Туап S1365. QLogic: Контроллеры SCSI и оптические серии 1020, 1240, 2100 и 2200.
Приложения Часть VI НА ЗАМЕТКУ FreeBSD поддерживает устройства типа SCSI-1 и SCSI-II. Однако устройства типа CD-RW и WORM поддерживаются поставляемым с FreeBSD драйвером только в режиме для чтения. Чтобы получить доступ для записи к таким устройствам, установите из коллекции портов FreeBSD порт cdrecord. Оптические дисководы (CD-ROM/DVD) • Любой дисковод, совместимый с ATAPI • SCSI-дисководы • Патентованные дисководы производства Matsushita/Panasonic (или SoundBlaster производства Creative Labs) (в частности, такие модели, как 562 и 563) • Все патентованные дисководы Sony Сетевые карты В этом разделе перечисляются сетевые карты, поддерживаемые FreeBSD. Обратите внимание, что во многих обычных картах, также как и во многих встроенных сетевых адаптерах, будет использоваться один из этих наборов микросхем. Поэтому, если конкретно ваша карта здесь не упоминается, попробуйте узнать, какой набор микросхем в ней установлен. Например, во многих обычных сетевых картах используется набор микросхем NE 2000, а во многих встроенных адаптерах — набор микросхем EtherExpress, оба из которых поддерживаются FreeBSD. Adaptec: Адаптеры Duralink PCI Fast Ethernet, в которых используется набор микросхем Adaptec AIC-6195 Fast Ethernet, такие как: • ANA-6201: 64-разрядный однопортовый адаптер 10/100BaseTX • ANA-62022: 64-разрядный двухпортовый адаптер 10/100BaseTX • ANA-62044: 64-разрядный четырехпортовый адаптер 10/100BaseTX • ANA-69011: 32-разрядный однопортовый адаптер 10/100BaseTX • ANA-62020: 64-разрядный однопортовый адаптер 100BaseFX Allied-Telesyn: • АТ1700 • RE2000 Alteon Networks: Сетевые карты Alteon Networks PCI Gigabit Ethernet, разработанные на основе наборов микросхем Tigon 1 и Tigon 2, такие как Alteon AceNIC (Tigon 1 и 2), 3Com 3c985-SX (Tigon 1 и 2), Netgear GA620 (Tigon 2), Silicon Graphics Gigabit Ethernet, DEC/Compaq EtherWORKS 1000 и NEC Gigabit Ethernet. AMD: • PCnet/PCI (серии 79С97х и 53C974 или 79С974)
Списки совместимого оборудования | ^ллл \ "" Приложение Б I I RealTek: Сетевые карты 8129/8139 Fast Ethernet, такие как: • Allied-Telesyn AT2550 • Allied-Telesyn AT2500TX • Genius GF100TXR (RTL8139) • NDC Communications NE100TX-E • OvisLink LEF-8129TX • OvisLink LEF-8139TX • Netronix Inc. EA-1210 NetEther 10/100 i - • • KTX-9130TX 10/100 Fast Ethernet • Accton "Cheetah" EN1207D (MPX 5030/5038; копия RealTek 8139) • SMC EZ Card 10/100 PCI 1211TX Lite-On: Сетевые карты 98713, 98713A, 98715 и 98725 Fast Ethernet, такие как: • LinkSys EtherFast LNE100TX • NetGear FA310TX Rev. Dl • Matrox FastNIC 10/100 • Kingston KNE110TX Macronix: Сетевые карты 98713, 98713A, 98715, 98715A и 98725 Fast Ethernet, такие как: • NDC Communications SFA100A (98713A) • CNet Prol20A (98713 или 98713А) • CNet Prol20B (98715) / т > ' • SVEC PN102TX (98713) Macronix/Lite-On: Сетевые карты PNIC II LC82C115 Fast Ethernet, такие как LinkSys EtherFast LNE100TX, версия 2. Winbond: Сетевые карты W89C840F Fast Ethernet, такие как Trendware TE100-PCIE. Via Technologies: Сетевые карты VT3043 "Rhine Г и VT86C100A "Rhine 1Г Fast Ethernet, такие как Hawking Technologies PN102TX и D-Link DFE-530TX Silicon Integrated Systems: Сетевые карты SiS 900 и SiS 7016 PCI Fast Ethernet Sundance Technologies: Сетевые карты ST201 PCI Fast Ethernet, такие как D-Link DFE-550TX SysKonnect: Карты SK-984x PCI Gigabit Ethernet, такие как:
I 1П?? I Приложения I I Часть VI • SK-9841 lOOOBaseLX (одномодовое оптоволокно, один порт) • SK-9842 lOOOBaseSX (многомодовое оптоволокно, один порт) • SK-9843 lOOOBaseLX (одномодовое оптоволокно, два порта) • SK-9844 lOOOBaseSX (многомодовое оптоволокно, два порта) Texas Instruments: Сетевые карты ThunderLAN PCI, такие как: • Compaq Netelligent 10, 10/100, 10/100 Proliant, 10/100 Dual-Port (двупорто- вая), 10/100 ТХ Embedded UTP (встраиваемый НВП), 10 Т PCI UTP/Coax и 10/100 ТХ UTP • Compaq NetFlex ЗР, ЗР Integrated (интегрируемая) и ЗР с BNC-соединителем • Olicom ОС-2135/2138, ОС-2325 и ОС-2326 10/100 ТХ UTP • Многоцелевые карты Racore 8165 10/100BaseTX и 8148 lOBaseT/100BaseTX/ 100BaseFX ADMTek: Сетевые карты PCI Fast Ethernet, разработанные на основе AL981 и AN985. ASIX Electronics: Сетевые карты PCI AX88140A, такие как Alfa Inc. GFC2204 и CNet ProllOB. Broadcom: Интерфейсы 10/100/lOOObaseTX серии ВСМ570х, среди которых множество карт и интегрируемых наборов микросхем для материнской платы 3Com, Dell, IBM, HP, Netgear и SysKonnect. DEC: • Сетевые карты EtherWORKS III (DE203, DE204 и DE205) • Сетевые карты EtherWORKS II (DE200, DE201, DE202 и DE422) • Сетевые карты DC21040-, DC21041- или DC21140 (SMC Etherpower 8432T, DE245 и так далее) • Сетевые карты'FDDI (DEFPA/DEFEA) Efficient: • ENI-155p ATM PCI FORE: • PCA-200E ATM PCI Fujitsu: • MB86960A/MB86965A HP: Карты PC Lan+ (номера моделей: 27247В и 27252А). Intel: • EtherExpress ISA (не рекомендуется из-за нестабильной работы драйвера)
__, Списки совместимого оборудования I . „^ Приложение Б I • Карты серии EtherExpress Pro/10 • EtherExpress Pro/100В PCI Fast Ethernet • Карты Gigabit Ethernet серии Pro/1000 Isolan: • AT 4141-0 (16 бит) Isolink: • 4110 (8 бит) Novell: • NE1000 • NE2000 • NE2100 Сетевые карты PCI, эмулирующие NE2000, такие как: • RealTek8029 • NetVin5000 • Winbond W89C940 • SurecomNE-34 • VIAVT86C926 3Com: • 3C501 • 3C503 Etherlink II • 3C505 Etherlink/+ • 3C507 Etherlink 16/TP • 3C509 • 3C579 • 3C589 (PCMCIA) • 3C590/592/595/900/905/905B/905C PCI and EISA (Fast) Etherlink III/ (Fast) Etherlink XL • Серверные адаптер ЗС980/ЗС980В Fast Etherlink XL • Адаптер 3CSOHO100-TX OfficeConnect Toshiba: Все карты Ethernet производства Toshiba. Карты PCMCIA: Карты PCMCIA Ethernet от IBM и National Semiconductor. Беспроводные сетевые карты • Карты из набора Intersil PRISM (обязательно, если вы создаете точку беспроводного доступа)
1024 Приложения Часть VI • Карты WaveLAN ISA производства NCR, AT&T или Lucent • Карты Aironet 802.11b производства Cisco • Карты Raylink производства Raytheon » Карты серии AIR производства Cisco • Карты серии DWL производства D-Link • Карты серии LD-WL54 производства Elecom • Карты серии Е5454 и FMV-JW481 производства Fujitsu • Карты серии NC4000 производства HP • Карты серии I/O Data WN-A • Карты серии WMP и WPC производства Linksys • Карты PA-WL/54AG производства NEC • Карты серии WA и WG производства Netgear • Карты серии 8480 и 8470WD производства Orinoco • Карты серии 4030/4032 производства Proxim Skyline • Карты SWL-5200N производства Samsung • Карты 2536W-AG и 2735W производства SMC • Карты PCWA производства Sony • Карты 3CRPAG175 производства 3Com USB-устройства • USB-клавиатуры • USB-мыши • USB-принтеры и кабели для преобразования USB-принтера в параллельный принтер • USB-концентраторы • USB-сканеры • Цифровые камеры Optical (Pentax) Optio 230/330 производства Asahi Аудиоустройства • UART 16550 (Midi). (Тестируется; требует добавления определенного ключа в файл советов.) • Advance Asound 100, ПО и Logic ALS120. • Звуковые карты Aureal Vortex 1/Vbrtex2 и Vortex Advantage при наличии соответствующего драйвера стороннего производителя. • Creative Labs SB16, SB32, SB AWE64 (включая Gold), Vibral6, SB PCI (тестируется), SB Live! (тестируется) и практически все карты, совместимые с SoundBlaster. • Creative Labs SB Midi Port (тестируется) и SB OPL3 Synthesizer (тестируется). • Crystal Semiconductor CS461x/462x Audio Accelerator. (Поддержка для порта CS461x Midi, тестируется.)
Списки совместимого оборудования I . ft-_ "" Приложение Б I • Аудиоконтроллер Crystal Semiconductor CS428x. • CS4237, CS4236, CS4232 и CS4231 (ISA). • ENSONIQAudioPCIES1370/137l. • ESS ES1868, ES1869, ES1879 и ES1888. • Gravis UltraSound PnP и MAX. • NeoMagic 256AV/ZX (PCI). • OPTi931 (ISA). • OSS-совместимый синтезатор (Midi). (Тестируется.) • Trident 4DWave DX/NX (PCI). • Yamaha OPLSAx (ISA). Устройства FireWire (IEEE 1394) Скорее всего, поддерживаться будут интерфейсные карты FireWire следующих производителей: • Adaptec • Apple • Intel • NEC • National Semiconductor • Ricoh • Sony • Sun • Texas Instruments Устройства Bluetooth • 3Com/HP 3CRWB6096-A и 3CREB96 • AIPTEKBR0R02 • EPoXBT-DG02 • Mitsumi USB • MSIMS-6967 • TDK USB Видеокарты, поддерживаемые Х11 Ниже приводится список видеокарт, которые на текущий момент поддерживает Xorg. В конце каждого раздела перечислены драйверы, которые для них следует выбирать. Этот список был взят с Web-сайта проекта Xorg Project. Если именно такой, как у вас, модели в этом списке нет, попробуйте узнать, какой набор микросхем используется в вашей карте, и отыскать свою карту в перечне наборов микросхем.
I 4лл& 1 Приложения I 10ZB 1 ЧШЕИ.У1 Alliance ProMotion (apm): • ProMotion 6420 • ProMotion 6422 • AT24 • AT3D • AT25 Chips & Technologies (chips): Наборы микросхем: ct65520, ct65525, ct65530, ct65535, ct65540, ct65545, ct65546 ct65548, ct64200, ct64300, ct65550, ct65554, ct65555, ct68554, ct69000 и ct69030. Cirrus Logic (cirrus): Поддерживаются все карты и наборы микросхем производства Cirrus Logic. Cyrix (cyrix): • MediaGX, MediaGXi, and MediaGXm • Natsemi 'Geode' • Наборы микросхем CS5510, CS5520, CS5530 и CS5530A Glide (glide): • 3Dfx Voodoo 1 и 2 GUNT/Permedia (glint): • Наборы микросхем 3Dlabs (GLINT MX, GLINT 500TX, GLINT 300SX, GLINT GAMMA, GLINT DELTA, GLINT GAMMA2, Permedia, Permedia 2, Permedia 2v, Permedia 3, R3, R4) • Наборы микросхем Texas Instruments (Permedia, Permedia 2) Number 91128(1128): • 1128 rev 1 • 1128-11 • I128-T2R (Ticket 2 Ride) • I128-T2R4 (Ticket 2 Ride IV) Intel i740 (1740): Поддерживаются все карты и микросхемы производства Intel серии i740. Intel 1810 (1810): Наборы микросхем 810, i810-DC100, i810e, i815, 830M, 845G, 852GM, 855GM, 865G, 915G и 915GM. Matrox (mga): • MGA2064W • MGA1064SG (Mystique) • MGA2164W (Millennium II) • G100 (Productiva G100)
— Списки совместимого оборудования I 4ЛЛ^ I ¦ — =—*^ =Н 1UZ7 Приложение Б I I • G200 (Millennium G200 и Mystique G200) • G400 (Millennium G400, Millennium G400 MAX, Millennium G450 и Marvel G450 eTV) • G550 (Millennium G550 и Millennium G550 Dual DVI) Neomagic (neomagic): • MagicGraph 128 (NM2070) • MagicGraph 128V (NM2090) • MagicGraph 128ZV (NM2093) • MagicGraph 128ZV+ (NM2097) • MagicGraph 128XD (NM2160) • MagicGraph 256AV (NM2200) • MagicGraph 256AV+ (NM2230) • MagicGraph 256ZX (NM2360) • MagicGraph 256XL+ (NM2380) Newport (newport): Карты Newport/XL в SGI Indy и Indigo2. NSC (nsc): GXLV (с набором микросхем 5530), SC120Q, SC1400 и GX2 (с набором микросхем 5535). NVIDIA (nv): • RIVA128(NV3) • RIVATNT(NV4) • RTVA TNT2 (NV5) • GeForce 256, QUADRO (NV10) • GeForce2, QUADR02 (NV11 8c NV15) • GeForce3, QUADRO DCC (NV20) • nForce, nForce2 (NV1A, NV1F) • GeForce4, QUADR04 (NV17, NV18, NV25, NV28) • GeForce FX, QUADRO FX (NV30, NV31„NV34, NV35, NV36, NV37, NV38) • GeForce 6XXX (NV40, NV41, NV43, NV44, NV45) • GeForce 7XXX (G70) ATI Rage 128 (r 128): Все видеокарты производства ATI Rage с набором микросхем серии 128, такие как Rage Fury AGP (32 Мбайт), XPERT 128 AGP (16 Мбайт) и XPERT 99 AGP (8 Мбайт). ATI RADEON (radeon): • R100 (Radeon 7200) • RV100 (Radeon 7000/VE, M6) • RS100 (Radeon IGP320/M)
1Л^Р ! Приложения Часть VI • RV200 (Radeon 7500, М7, FireGL 7800) • RS200 (Radeon IGP330/M, IGP340/M) • RS250 (Radeon Mobility 7000 IGP) • R200 (Radeon 8500, 9100, FireGL 8800/8700) • RV250 (Radeon 9000PRO/9000, M9) • RS300 (Radeon 9100 IGP) • RS350 (Radeon 9200 IGP) • RS400 (Radeon XPRESS 200/200M IGP) • RV280 (Radeon 9200PRO/9200/9200SE, M9+) • R300 (Radeon 9700PRO/9700/9500PRO/9500/9600TX, FireGL Xl/Zl; 2D только двухмерные) • R350 (Radeon 9800PRO/9800SE/9800, FireGL X2; 2D только двухмерные) • R360 (Radeon 9800XT; 2D только двухмерные) • RV350 (Radeon 9600PRO/9600SE/9600, MlO/Mll, FireGL T2; 2D только двухмерные) • RV360 (Radeon 9600XT; 2D только двухмерные) • RV370 (Radeon X300, M22; 2D только двухмерные) • RV380 (Radeon X600, М24; 2D только двухмерные) • RV410 (Radeon X700, М26 PCIE; 2D только двухмерные) • R420 (Radeon X800 AGP; 2D только двухмерные) • R423/R430 (Radeon X800, М28 PCIE; 2D только двухмерные) • R480/R481 (Radeon X850 PCIE/AGP; 2D только двухмерные) Rendition/Micron (rendition): • VeriteVlOOO • VeriteV2100 • VeriteV2200 S3 ViRGE (s3virge): • ViRGE (86C325) • ViRGE VX (86C988) • ViRGE DX (86C375) • ViRGE GX (86C385) • ViRGE GX2 (86C357) • ViRGE MX (86C260) • ViRGE MX+(86C280) • Trio 3D (86C365) • Trio 3D/2X (86C362, 86C368) S3 Savage (savage): • Savage3D (2D (двухмерные), 3D (трехмерные))
__ Списки совместимого оборудования Приложение Б • Savage4 (2D (двухмерные), 3D (трехмерные)) • Savage2000 (только 2D (двухмерные)) • Savage/MX(2D (двухмерные), 3D (трехмерные)) и Dualhead) • Savage/DC (2D, 3D, Dualhead) • SuperSavage/MX (2D, 3D, Dualhead) • SuperSavage/IX (2D, 3D, Dualhead) • ProSavage PM133 (2D, 3D) • ProSavage KM133 (2D, 3D) • Twister/ProSavage PN133 (2D, 3D) • TwisterK/ProSavage KN133 (2D, 3D) • ProSavage DDR (2D, 3D) • ProSavage DDR-K (2D, 3D) Silicon Motion (siliconmotion): • Lynx(SM910) • LynxE (SM810) • Lynx3D (SM820) • LynxEM (SM710) • LynxEM+(SM712) • Lynx3DM (SM720) • Cougar3DR (SM730) SiS/XGI (sis): • SiS5597/5598 • S1S530/620 • SiS6326/AGP/DVD • S1S300/305 • SiS540 • S1S630/730 • S1S315/E/H/PRO • S1S550/551/552 • SiS650/651/661/741 • SiS330 (Xabre) • SiS760/761 • XGI Volari V3/V5/V8 • XGI Volari Z7 SiS USB (sisusb): Набор микросхем SiS315E/PRO
I min I Приложения 3Dfx (tdfx): • Voodoo Banshee • Voodoo3 • Voodoo4 • Voodoo5 Trident (trident): • Blade3D, CyberBlade il, i7 (DSTN), il, il (DSTN), Ail, Ail (DSTN), CyberBlade/e4, CyberBladeXP, CyberBladeAil/XP, BladeXP • 3DImage975, 3DImage985, Cyber9520, Cyber9525, Cyber9397, Cyber9397DVD • ProVidia 9682, 9685, Cyber9382, Cyber9385, Cyber9388 • TGUI 440AGi, 9660, 9680 • ISA/VLBus 8900C, 8900D, 9000, 9200CXr, Cyber9320, 9400CXi, 9440AGi (не теси- ровалась) Tseng (tseng): Все видеокарты производства Tseng. НА ЗАМЕТКУ Если вашей карты нет в этом списке, попробуйте воспользоваться обобщенным драйвером vesa или vga.
ПРИЛОЖЕНИЕ Поиск и устранение проблем в процедуре установки и загрузки Первым шагом к разрешению проблемы, возникшей во время установки или загрузки системы FreeBSD, является выявление источника этой проблемы. Содержащаяся в этом приложении информация позволит вам определять и устранять некоторые наиболее часто случающиеся во время процедуры установки и загрузки проблемы. Первый раздел посвящен проблемам, возникающим во время установки, а второй — способам диагностики и устранения проблем, которые случаются во время загрузки. НА ЗАМЕТКУ В этом приложении перечислены далеко не все проблемы, которые могут у вас возникнуть: такое вообще вряд ли возможно. Здесь перечислены только некоторые наиболее часто случающиеся проблемы, с которыми вы можете столкнуться в свои первые дни работы с FreeBSD, а также возможные пути их решения (которых в мире UNIX может существовать и несколько для одной и той же проблемы). Дополнительная информация о проблемах и способах их устранения доступна на Web-сайте FreeBSD по адресу http: //www. f reebsd. org. В онлайновом руководстве по FreeBSD содержатся сведения по выявлению и устранению множества самых распространенных проблем. В случае отсутствия нужной информации в онлайновом руководстве, можно также отправить сообщение с подробным описанием проблемы в список рассылки f reebsd-questions. 'Узнать больше о списках рассылки FreeBSD вы сможете в приложении Г. Проблемы, возникающие во время установки В этом разделе приложения будут описаны проблемы, с которыми вы можете столкнуться во время первоначальной процедуры установки FreeBSD, а также возможные способы их устранения. 4 в
1032 _П? иложения Часть VI Загрузка с дискеты приводит к зависанию или перезагрузке системы Существует несколько причин, по которым загрузка с дискеты может приводить к зависанию или перезагрузке системы, но наиболее вероятной из них является неисправность дискеты, с которой производится загрузка. Не забывайте, что загрузочный образ записывается на дискету без проверки формата, и что используется вся дискета целиком независимо от того, сколько места занимает сам образ. Даже единственный поврежденный сектор на дискете может послужить причиной возникновения данной проблемы. Попробуйте записать образ загрузочного диска на новую дискету и посмотрите, решит ли это проблему. Если использование новой дискеты не помогло и если вы применяли FTP для получения файла с образом или для его отправки на машину, где затем создавали дискету, убедитесь, что во время передачи был включен бинарный режим, а не режим ASCII. Режим ASCII может приводить к повреждению двоичных файлов. Еще одной возможной причиной такой проблемы является срабатывание на материнской плате функции защиты от вирусов. Отключить эту функцию можно с помощью утилиты настройки BIOS. Более подробную информацию о том, как именно отключать эту функцию, вы сможете найти в документации, прилагаемой к вашему компьютеру. Загрузочная дискета зависает на этапе "Probing Devices" ("Проверка устройств") Загрузочная дискета иногда "зависает", когда встречает в цепочке IDE какие-нибудь необычные устройства вроде дисков Zip и Jaz. Если у вас имеется один из таких дисков, попробуйте отключить его и посмотрите, будет ли система после этого загружаться. Если да, вы сможете установить FreeBSD и затем снова подключить этот диск, когда процесс установки будет завершен. Система загружается с CD-диска, но программа установки сообщает о том, что CD-ROM не обнаружен Эта проблема чаще всего возникает из-за того, что устройство CD-ROM просто неправильно сконфигурировано. Не забывайте о том, что на большинстве ПК пространство выделяется для четырех дисков: ведущего и ведомого на каждой из двух цепочек IDE. В некоторых системах CD-ROM является ведомым диском на вторичном контроллере, и ведущий диск на вторичном контроллере отсутствует. А некоторые дисководы CD-ROM не могут нормально функционировать в подчиненном режиме (то есть в качестве ведомых дисков на вторичном контроллере). Чтобы решить эту проблему, вы должны будете открыть кожух системного блока и с помощью переключателей и схемы контактов переместить CD-ROM на позицию ведущего диска в его цепочке IDE. При первом запуске система обычно отображает перечень дисков, которые ей удалось обнаружить, дисков CD-ROM включительно, а также информацию о том, как они сконфигурированы: как ведущие или как ведомые.
Поиск и устранение проблем в процедуре установки и загрузки | л по<| | Приложение В I 1 Геометрия жесткого диска не распознается должным образом Если FreeBSD не удается правильно распознать геометрию жесткого диска, обычно эту проблему можно устранить двумя способами. • Первый: создать небольшой DOS-раздел в начале диска. Такой раздел, как правило, позволяет FreeBSD правильно распознать геометрию жесткого диска. • Второй: воспользоваться программой pfdisk, которая доступна на прилагавшемся к этой книге DVD-диске (в каталоге tools), pfdisk запускается под DOS и обычно корректно распознает геометрию жесткого диска, после чего необходимые для раздела FreeBSD параметры можно ввести и вручную. Micron и/или другие системы зависают при загрузке В процедурах PCI BIOS некоторых систем Micron (и, возможно, других систем) встречаются ошибки, из-за которых устройства PCI при распознавании могут быть сконфигурированы неправильно, что приводит к неожиданному поведению, например, к зависанию во время загрузки или к отсутствию функциональности карт Ethernet. Устранить эту проблему можно, отключив в настройках BIOS поддержку для устройств Plug-and-Play. Проблемы, возникающие во время загрузки, и другие проблемы, случающиеся уже после установки FreeBSD В этом разделе приложения будут описаны проблемы, возникающие во время загрузки, а также другие проблемы, с которыми вы можете столкнуться уже после успешной установки FreeBSD. FreeBSD при загрузке отображает сообщение "Missing Operating System" ("Отсутствует операционная система") Это сообщение обычно означает, что FreeBSD, когда устанавливалась, неправильно распознала геометрию жесткого диска. Существует два способа устранения этой проблемы. • Создать небольшой DOS-раздел в начале диска и установить в него минимальную копию DOS (FreeDOS, аналог MS-DOS, доступна бесплатно по адресу http: //www. freedos.org). Это должно позволить FreeBSD получить правильные сведения, необходимые ей для разбиения на разделы. • Использовать программу pfdisk (которая доступна на прилагавшемся к этой книге DVD-диске, в каталоге tools), чтобы получить сведения о геометрии жесткого диска, и затем вручную указать их в редакторе разделов FreeBSD (Partition Editor). В любом случае без переустановки FreeBSD не обойтись.
1034 _П? иложения Часть VI Диспетчер загрузки FreeBSD зависает на сообщении "F?" Причиной этой проблемы, которая означает, что системе не удается найти загрузочные DOS-разделы (секции), является обычно то, что во время установки FreeBSD неправильно распознала геометрию жесткого диска. О том, как можно устранить эту проблему, рассказывалось в предыдущем разделе* Загрузчик операционной системы FreeBSD отображает сообщение "Read Error" ("Ошибка чтения") и зависает Опять-таки, причиной этой проблемы обычно является то, что во время установки FreeBSD геометрия жесткого диска была распознана неправильно. Информацию о том, как можно устранить эту проблему, вы найдете в предыдущих двух разделах. Никакой экран диспетчера загрузки не появляется; сразу же загружается Windows Либо диспетчер загрузки не установился, когда устанавливалась FreeBSD, либо вы сделали в Windows что-то такое (например, выполнили команду fdisk /mbr), что привело к затиранию диспетчера загрузки FreeBSD. К счастью, эту проблему можно достаточно легко устранить. 1. Загрузитесь с прилагавшегося к этой книге DVD-диска или установочных дискет, которые вы создали. 2. Попав в программу Sysinstall, выберите последовательно опцию Configure (Конфигурация) и Fdisk (если вам необходимо вспомнить, как работает программа Sysinstall, обратитесь в главу 2). 3. Если в системе установлено несколько жестких дисков, последует приглашение указать, на каком из них следует запустить fdisk. Выберите главный диск, с которого загружается ваша система. 4. Попав в fdisk, просто нажмите клавишу <W>, чтобы записать изменения. Появится сообщение, предупреждающе о том, что эту операцию можно выполнять только для внесения изменений в уже существующую установку. Выберите вариант Yes (Да) и нажмите клавишу <Enter>. 5. Когда система запросит, что делать с загрузчиком операционной системы, выберите вариант Master Boot Record (Отавная загрузочная запись). После того, как вы сделаете все это, диспетчер загрузки должен снова заработать. FreeBSD распознает меньший объем ОЗУ, чем на самом деле доступный в системе FreeBSD не всегда удается получить из BIOS правильные сведения о доступном в системе объеме памяти. Обычно она распознает только 64 Мбайт ОЗУ, даже если на самом деле в системе доступно больше памяти. Чтобы устранить эту проблему, вам придется добавить в конфигурацию ядра следующую опцию: options "МАХМЕМ=л"
Поиск и устранение проблем в процедуре установки и загрузки I Лме 1 Приложение В I I Здесь п — это объем доступной памяти в килобайтах. Не забывайте, что в двоичной математике один килобайт на самом деле равняется не 1000, а 1024 байтам. Следовательно, если в вашей системе доступно 512 Мбайт ОЗУ, вы должны будете ввести здесь число 524288. После того, как вы внесете это изменение, вам нужно будет заново скомпилировать ядро (процедура компиляции ядра подробно описывалась в главе 18). При попытке смонтировать диск CD-ROM FreeBSD отображает сообщение "Device Not Configured" ("Устройство не сконфигурировано") Эта проблема может возникнуть по нескольким причинам. • Возможно, в дисководе CD-ROM отсутствует диск; просто вставьте CD-диск и повторите попытку. • Возможно, дисковод ATAPI CD-ROM сконфигурирован как ведомый диск на вторичном контроллере, а ведущий диск на этом контроллере отсутствует. Если это так, вам придется переконфигурировать дисковод CD-ROM так, чтобы он стал ведущим диском на этом контроллере (обычно это можно сделать с помощью переключателей, расположенных на задней панели дисковода CD-ROM). • Если в системе установлен CD-ROM стандарта SCSI, возможно, он просто не успевает ответить на запрос сброса шины, поступающий при запуске ядра. Если этот так, отыщите в конфигурационном файле ядра строку SCSI_DELAY и увеличьте время задержки. (Время указывается в миллисекундах. По умолчанию используется значение 5000, соответствующее пяти секундам. Для начала вы можете попробовать увеличить его вдвое, то есть до 10000.) После этого вам нужно будет заново скомпилировать ядро (см. главу 18). Работа программ завершается и появляется сообщение об ошибке "Signal 11" Эта проблема в некотором роде напоминает ошибку "illegal operation" ("запрещенная операция") в Windows. Она, по сути, означает, что программа, попыталась получить доступ к ячейкам памяти, которые для нее не выделялись. Причиной этого может быть наличие неполадки в программе или, если то же самое происходит и с утилитами, которые поставлялись с FreeBSD, наличие неполадки в самой FreeBSD. Еще одна возможная причина такой проблемы — это неустойчивое оборудование. Если данная проблема возникает со случайной периодичностью во время компиляции программного обеспечения, вы можете быть практически полностью уверены в том, что все дело в старом или дефектном оборудовании. Чаще всего источником таких проблем бывают дефектное ОЗУ, перегревающийся процессор (работает ли вентилятор? процессор работает на более высоких частотах, чем это предусмотрено его рабочими характеристиками?), неполадки в памяти кэша или некачественное энергоснабжение. Вы можете выявить эти проблемы с оборудованием, загрузив в своей системе другую операционную систему, такую как Knopix, которая представляет собой дистрибутив Linux и работает полностью с CD-диска (то есть вам не нужно устанавливать ее на своем жестком диске, чтобы увидеть, случаются ли в ней те же связанные с
Приложения Часть VI оборудованием проблемы, что и в FreeBSD). Knopix доступна бесплатно по адресу http: //www.knoppix.net. Вы еще также можете воспользоваться такой программой, KaKmemtest86 (http://www.memtest86.com), загрузив и записав ее на CD-диск, чтобы провести диагностику возможных проблем с памятью. При запуске top, ps и других системных утилит появляются странные сообщения (вроде "proc size mismatch") Такие ошибки практически всегда возникают из-за не скоординированной работы окружения (world) и ядра, которая является следствием разного состояния лежащего в их основе кода. Нередко проблема возникает потому, что команда make world для компиляции системы из исходного кода использована была, а вот новое ядро после этого собрано не было. Или наоборот: новое ядро из загруженного исходного кода скомпилировано было, а вот команда make world перед: этим не выдавалась. Поскольку намного быстрее заново скомпилировать ядро, чем окружение, самым простым решением данной проблемы будет сначала попробовать собрать новое ядро и перезагрузиться (процедура перекомпиляции ядра подробно описывалась в главе 18). Если после перекомпиляции ядра проблема не исчезнет, следует попробовать перекомпилировать окружение (информацию о том, как именно выполняется процедура make world, можно найти в главе 19). И, наконец, если не поможет ни то, ни другое, реанимировать систему позволит только загрузка самой последней версии исходного кода (см. главу 19) и поочередное выполнение процедур компиляции окружения и ядра. Если вы забыли пароль пользователя root Если вы забыли свой пароль пользователя root, вы можете загрузиться в однопользовательский режим и восстановить его. Чтобы попасть в однопользовательский режим, перезагрузите компьютер и затем в меню загрузчика операционной системы выберите указанную под номером 4 опцию Boot FreeBSD in Single User Mode (Загрузить FreeBSD в однопользовательском режиме). Когда появится приглашение указать программную оболочку, которая должна использоваться, просто нажмите клавишу <Enter>, чтобы запустить программную оболочку по умолчанию. После этого должно появиться приглашение ввести команду для пользователя root, выглядящее так: # В строке с этим приглашением введите mount -u и нажмите клавишу <Enter>, чтобы смонтировать файловую систему пользователя root в режиме чтения-записи. Затем введите mount -а, чтобы смонтировать все остальные файловые системы. Теперь вы можете ввести passwd root и изменить пароль, указанный для учетной записи пользователя root. (Если это не сработает, введите /usr/bin/passwd root.) Приглашения ввести старый пароль не последует. Просто введите новый пароль, который вы бы хотели использовать, нажмите клавишу <Enter>, введите этот пароль еще раз, чтобы подтвердить его, и затем снова нажмите клавишу <Enter>. И, наконец, перезагрузите компьютер с помощью команды shutdown -r now.
ПРИЛОЖЕНИЕ Источники дополнительной информации У FreeBSD имеется большое и постоянно пополняющееся количество пользователей и разработчиков. По FreeBSD и связанных с этой операционной системой продуктам доступно очень много источников информации. В этом приложении будут перечислены некоторые такие источники. Источники информации о FreeBSD В этом разделе будут названы ресурсы, доступные в виде Web-сайтов, списков рассылки, технических листингов и тому подобного. Web-сайты www.freebsd.org Это официальный Web-сайт проекта FreeBSD. Именно здесь можно найти все новости, обновления и информацию о различных портах и пакетах. Также на этом сайте доступно онлайновое руководство и другая документация по FreeBSD. www.freebsddiary.org Этот сайт представляет собой хранилище часто задаваемых вопросов и статей по самым разным связанным с FreeBSD темам, а также место проведения некоторых дискуссионных форумов. www.freshports.org На этом сайте всегда доступна самая свежая информации о появившихся новых и обновленных версиях портов FreeBSD, а также здесь можно подписаться на получение новостей об определенных портах. www.freebsdmall.com Это сайт, на котором продаются различные вещицы с символикой FreeBSD. Здесь можно купить CD-диски, футболки, куртки, коврики для мыши, чашки, кепки, книги и тому подобное. Здесь также можно получить платные профессиональные консультации. г
1038 Не иложения Часть VI Списки рассылки Списки рассылки — это место, где пользователи FreeBSD могут обмениваться информацией и публиковать вопросы, которые другие пользователи, подписавшиеся на этот список, могут просматривать и, соответственно, отвечать на них. Существует масса причин, по которым стоит подписываться на различные списки рассылок, среди которых возможность получения уведомлений об обнаруженных в исходном коде проблемах, об уязвимых местах в системе безопасности и так далее. Все эти списки рассылок являются официальными и обслуживаются членами главной команды разработчиков и пользователями FreeBSD. Каждый из них посвящен определенной теме, например, портам, новостям, новым разработкам и прочему. Чтобы подписаться на какой-нибудь из списков рассылки, просто отправьте электронное сообщение по адресу majordomo@freebsd.org, включив него такой текст: subscribe list-name list-name — это название списка, на который вы хотите подписаться. Отменить подписку на любой список, который вы подписались, вы сможете, отправив по адресу majordomo@freebsd.org следующее электронное сообщение: unsubscribe list-name Многие из списков рассылки очень объемны и потому будут генерировать большое количество электронных сообщений. Чтобы избежать этого, вы можете подписаться на несколько списков рассылки в форме дайджеста. Если вы сделаете это, электронное сообщение из каждого списка, на который вы подписались, будет отправляться вам только тогда, когда количество опубликованных сообщений превысит 100 Кбайт. При этом все сообщения будут отправляться в виде одного единственного электронного сообщения. ВНИМАНИЕ! Решив отказаться от подписки на какой-нибудь список рассылки, прежде чем отправить соответствующее сообщение, всегда проверяйте, чтобы в поле адресата был указан адрес inajordomo@freebsd.org, а не адрес самого списка рассылки. Отправка электронного сообщения с отказом от подписки в список рассылки вместо программы Majordomo чревато последствиями. Во-первых, в этом случае из списка получателей рассылки вы удалены все равно не будете. Вместо этого ваше электронное сообщение с отказом от подписки будет опубликовано в списке рассылки для всеобщего обозрения. Во-вторых, это вызовет раздражение у подписчиков данного списка рассылки (многие из которых являются опытными пользователями UNIX и терпеть не могут новичков). Заработать у них плохую оценку — далеко не лучший способ начать свою карьеру администратора UNIX. Общие списки Любой может подписаться и принимать участие в создании общих списков рассылки. Однако прежде чем публиковать свои сообщения в списке, вы должны внимательно ознакомиться с правилами пользования списками рассылки (которые будут высланы вам в электронном сообщении после того, как вы подпишетесь на тот или иной список рассылки). Ниже перечислены основные списки рассылки и вкратце объясняется, для чего каждый из них предназначен.
Источники дополнительной информации | 4 Л0%е% | Приложение Г I I Полный перечень списков рассылки, а также Web-интерфейсы для доступа к их архивам, можно найти по адресу http://www.freebsd.org/community/mailinglists.htniL cvs-all В этом списке публикуется информация об изменениях, вносимых в дерево исходного кода FreeBSD. Этот список доступен только для чтения и представляет интерес только для "заядлых" разработчиков, которые обожают копаться в грудах исходного С-кода. freebsd-advocacy В этом списке обсуждаются преимущества операционной системы FreeBSD и различные способы ее популяризации. freebsd-announce В этом списке публикуются важные сообщения, касающиеся FreeBSD. Этот список доступен только для чтения и является относительно небольшим по объему. freebsd-arch В этом списке публикуется информация, касающаяся архитектуры и дизайна си- v стемы FreeBSD. freebsd-bugbusters В этом списке пользователи FreeBSD обсуждают работу базы данных неполадок в FreeBSD. freebsd-bugs В этом списке публикуются отчеты о неполадках в FreeBSD. Обратите внимание на то, что отчеты о неполадках должны отправляться в этот список рассылки не напрямую, а путем заполнения формы, которая находится на странице http:// www.freebsd.org/send-pr.htm (или с помощью поставляемой с FreeBSD программы send-pr). Только после этого отчет о неполадках уже публикуется в самом списке рассылки и становится доступным для всех подписавшихся на этот список пользователей, а также фиксируется в базе данных. freebsd-chat В этом списке публикуются сообщения нетехнического характера, отправляемыми общающимися между собой пользователями FreeBSD. freebsd-current Если вы следите за изменениями в ветви CURRENT дерева исходного кода FreeBSD, вы должны обязательно подписаться на этот список рассылки. Публикуемая в этом списке информация позволит вам, помимо всего прочего, избежать "создания системы с нуля" в случае появления в дереве исходного кода проблем, делающих систему непригодной для использования. Вам не стоит подписываться на этот список рассылки, если вы просто хотите знать, как справляться с подобными проблемами, но не разбираетесь в технических деталях. Сообщения с вопросами типа "как сделать
1040 Приложения Часть VI то-то и то-то" в этом списке публиковать нельзя. Здесь можно публиковать только сообщения с техническими вопросами, касающимися поведения CURRENT. Сообщения с вопросами другого типа будут либо вообще игнорироваться, либо сопровождаться приглашением опубликовать их в списке f reebsd-questions. freebsd-isp В этом списке публикуются сообщения общающихся между собой поставщиков Internet-услуг, которые пользуются FreeBSD. Обратите внимание на то, что это список рассылки предназначен для поставщиков, а не для обычных пользователей. Другими словами, если у вас проблемы с подключением FreeBSD к серверу поставщика Internet-услуг, это совсем не то место, где вы должны публиковать свои вопросы. freebsd-jobs Если вы ищущий работу специалист по FreeBSD, вы сможете найти в этом списке рассылки объявления о вакансиях. Если вы работодатель, которому срочно требуется специалист по FreeBSD, вы сможете опубликовать в этом списке свое объявление о требующихся услугах. freebsd-policy Этот список рассылки доступен только для чтения и в нем свои сообщения публикуют члены главной команды разработчиков FreeBSD, в которых они обсуждают изменения в политике разработки FreeBSD. freebsd-questions Здесь публикуются сообщения с техническими вопросами о FreeBSD. Публикуя здесь сообщение с каким-нибудь вопросом, следует конкретно описывать ситуацию. Другими словами, сообщение вроде "Я не могу заставить pppd работать. Что я делаю не так?" лучше не публиковать. Такое сообщение никак не поможет разобраться в причинах неполадки и, хотя оно выглядит как "сигнал бедствия", никаких чувств, кроме раздражения, у остальных подписчиков он не вызовет. Чтобы получить "дельный" ответ, следует предоставить детали, типа содержимого сообщений об ошибках, записавшихся в журналы, сведений об используемой конфигурации, содержимого соответствующих разделов конфигурационных файлов (таких как файлы .conf) и тому подобные сведения. Также следует быть вежливым и не проклинать этот список рассылки, если ответ не поступит сразу же. Нужно всегда помнить о том, что люди, публикующие сообщения в этом списке, делают это в свое личное время и что все они — добровольцы. У большинства из них есть своя основная работа, которой они занимаются, и они, читая и отвечая на сообщения в этом списке, тратят часть своего личного свободного времени. Никто из них не получит денег за то, что помог вам. Обратите внимание, что для того, чтобы опубликовать свое сообщение в этом списке, подписываться на него вовсе не обязательно. Однако электронный адрес следует указывать правильный, чтобы людям было кому отправлять ответы. freebsd-security-notifications За информацией, публикуемой в этом списке, нужно следить всем пользователям FreeBSD. Именно здесь публикуются уведомления об обнаруженных "брешах" в системе безопасности FreeBSD, а также инструкции по их устранению. Нет лучшего
Источники дополнительной информации | л л л л I Приложение Г I I способа оставаться в курсе всех важных событий, связанных с безопасностью, чем подписаться на этот список. freebsd- s table В этом списке публикуются сообщения, касающиеся ветви STABLE дерева исходного кода. Как и в случае с ветвью CURRENT, если вы следите за изменениями в ветви STABLE, вы должны обязательно подписаться на этот список рассылки. Хотя серьезные проблемы, способные разрушить дистрибутив и сделать так, что система перестанет загружаться, случаются в ветви STABLE намного реже, чем в CURRENT, они все- таки могут и таки случаются в нем. Разработчики и поклонники FreeBSD — просто люди, и как все люди они иногда допускают ошибки. Подписавшись на этот список, вы всегда будет знать о появлении проблем в данной ветви дерева исходного кода, а также о том, когда ее можно будет снова безопасно использовать. Обратите внимание, что публиковать в этом списке вопросы общего технического характера, также как и вопросы типа "как сделать то-то и то-то" нельзя. Такие вопросы следует публиковать в списке f reebsd-questions. freebsd-test Если вам срочно нужно разослать сообщение вроде "Тестирование, тестирование, 1, 2, 3...", вам следует отправлять его именно в этот список, и ни в какой другой. Используйте этот список, если хотите быть уверенными в том, что ваши почтовые сообщения дойдут до серверов FreeBSD. Технические списки Существует также и множество списков технического плана, посвященных различным, связанным с FreeBSD вопросам, таким как перенос FreeBSD на другие платформы, перенос различного ПО на FreeBSD, использование FreeBSD во встраиваемых системах и так далее. Поскольку такие списки большинству людей не интересны, ни перечисляться, ни описываться они здесь не будут. Однако, если что — полный перечень технических списков можно найти по адресу http: //www. freebsd.org/doc/ handbook/eresources.html. Уже само название этих списков (то есть категория, в которую они были вынесены) говорит о том, что они насыщены технической информацией и, скорее всего, могут представлять интерес только для разработчиков. Не публикуйте в этих списках никаких вопросов общего характера. Практически все они сопровождаются инструкциями по использованию. Поэтому прежде чем публиковать в них какое-либо сообщение, обязательно прочтите правила, содержащиеся в электронном сообщении, которое вы получите после того, как подпишетесь на тот или иной технический список. ВНИМАНИЕ! Технические списки подходят в основном только для опытных пользователей FreeBSD. Отправка в такой список сообщения с вопросом типа "как сделать то-то и то-то" или с несоответствующей теме информацией может закончиться, в лучшем случае, отсутствием ответа, а в худшем — недобрыми словами в ваш адрес.
I 1ПЛ? I Приложения I I Часть VI Посвященные FreeBSD группы новостей в Usenet В Usenet доступны следующие посвященные FreeBSD группы новостей (узнать о том, какой сервер новостей вы должны использовать для получения доступа к Usenet, вы можете у своего поставщика Internet-услуг): • сотр.unix¦bsd.freebsd.announce • сотр. unix. bsd. fapeebsd.misc Каналы IRC Для пользователей IRC (Internet Relay Chat) доступно несколько каналов, по которым они могут получить помощь или консультацию по FreeBSD. Здесь не будут перечисляться все эти каналы, потому что некоторые из них носят слишком общий характер, и публикуемые в них темы редко когда касаются FreeBSD. Ниже названы два канала, по которым вам наверняка удастся получить помощь от реальных пользователей FreeBSD: • В сети EFNet: #f reebsdhelp • В сети Undernet: #freebsd СОВЕТ В сети Freenode также доступно несколько каналов, по которым можно получить информацию по FreeBSD и которые пользуются особой популярностью среди программистов-сторонников ПО с открытым кодом. Отыскать их можно по адресу http://irc.netsplit.de/. Обратите внимание на то, что в зависимости от времени дня, когда вы подключаетесь к каналам IRC, на них может находиться много людей и в то же время они могут казаться очень спокойными. Хотя у вас может сложиться впечатление, что люди вас игнорируют, на самом деле это может быть совсем и не так. Многие из этих людей находятся на работе и просто подключены к этим каналам. Также, во время периодов высокой сетевой активности, на передачу вашего сообщения может уходить намного больше времени. Имейте это в виду, когда долго не будете получать ответ (в таком случае, возможно, будет даже лучше, если вы перейдете на другой сервер). Находясь в IRC, ведите себя так, как хотите, чтобы люди вели себя с вами. Если вы начнете грубить, потому что долго не получаете никакого ответа или потому что получили не тот ответ, какой ожидали, будьте готовы, что вас начнут игнорировать или грубить вам в ответ (более того, администратор канала вообще может удалить вас из своего канала). Помните, что и как в списке рассылки freebsd-questions, никому здесь за помощь не платят. Люди в IRC, помогая вам, тратят свое личное свободное время, поэтому имейте это в виду, когда решите обозлиться на них. Источники информации по BSD в целом Такие источники посвящены не исключительно FreeBSD, a BSD в целом. Поскольку FreeBSD является самой популярной из операционных систем типа BSD, многие из этих источников вполне подходят для поиска информации и именно о FreeBSD. Однако в них также рассматривается и много других связанных с BSD вопросов.
Источники дополнительной информации j . fi ^ | Приложение Г I I Web-сайты www.freebsd.org Этот сайт, конечно же, является официальной домашней страницей проекта FreeBSD. Именно здесь следует в первую очередь искать всю последнюю информацию о различных версиях FreeBSD, об обнаруженных новых уязвимых местах в системе безопасности FreeBSD, способах их устранения и тому подобном. www.daemonnews.org Главный сайт, на котором можно найти новости обо всем, что касается BSD. На этом сайте имеется несколько форумов и доступен целый архив познавательных статей. Кроме того, это еще и домашняя страница комиксов "Source Wars" (которые на самом деле находятся на странице по адресу http: //darby.daemonnews.org). www.serverwatch.com Этот сайт позволяет следить за рейтингами популярности различных операционных систем и убеждаться в том, что FreeBSD не отстает от своих "бесстрашных" соперниц. Другие источники в Internet В этом разделе главы будут перечислены некоторые другие доступные в Internet ресурсы, так или иначе связанные с FreeBSD. В частности, в этом разделе будут перечислены домашние страницы ряда программ, которые использовались и описывались в настоящей книге. Web-сайты www.х.org Это домашняя страница ассоциации X.org Foundation и ее проекта Xorg, который является бесплатной реализацией системы X Window System (XI1), поставляемой вместе с FreeBSD. Именно здесь можно найти всю необходимую документацию по системе XII. www.gnu.org Это домашняя страница проекта GNU (полное название которого выглядит как "GNU's Not UNDT ("GNU - это не UNIX")). Многие из поставляемых с FreeBSD утилит (такие как компилятор GCC, язык поиска по образцу GAWK, редактор Emacs и компилятор f77 языка FORTRAN) являются частью этого проекта. На этом сайте доступна информация о почти всех программах проекта GNU. www.gnome.org Это домашняя страница проекта GNOME Desktop Environment (Настольная среда GNOME). Здесь можно найти все новости, документацию и другую касающуюся GNOME информацию.
1044 Приложения Часть VI www.kde.org Это домашняя страница проекта К Desktop Environment (Настольная среда К). Здесь можно найти новости и инструкции по использованию KDE, а также документацию на многие из встроенных в KDE приложения. www.apache.org Это домашняя страница проекта Web-сервера Apache, являющегося самым популярным Web-сервером в мире. Этот сервер распространяется бесплатно и рекомендуется к использованию с FreeBSD. На этом сайте также доступна информация о проектах, которые можно использовать для расширения функциональных возможностей Apache, таких как PHP, Perl, TCL и других. www. mysql. com MySQL — это распространяемая вместе с исходным кодом база данных SQL, которая наиболее часто используется с FreeBSD. На этом сайте доступна документация, инструкции и много другой информации о программах MySQL. www.postgresql.org Это домашняя страница проекта PostgreSQL, представляющего собой еще одну распространяемую с исходным кодом базу данных SQL, которая доступна для FreeBSD. PostgreSQL обладает большими функциональными возможностями, чем MySQL, но работает немного медленнее. www.php.net Это домашняя страница встраиваемого языка сценариев, который наиболее часто используется для разработки Web-приложений. Язык РНР является соперником языка ASP (Active Server Pages — Активные серверные страницы) в мире ПО с открытым кодом и чаще всего применяется для обеспечения связи между Web-сайтами и базами данных. Он очень хорошо взаимодействует с MySQL и PostgreSQL. www.perl.com На этом сайте представлена информация и инструкции по использованию языка программирования Perl, который не входит в состав FreeBSD, но лежит в основе многих очень часто используемых в ней утилит, таких как диспетчер списков рассылки Majordomo, а также огромного количества написанных для динамических Web- сайтов CGI-программ. www.python.org Домашняя страница языка программирования Python, который является популярной альтернативой языка Perl. www.sendmail.org Домашняя страница агента пересылки сообщений Sendmail, который используется в FreeBSD по умолчанию.
Источники дополнительной информации I -Л-_ I — — т г —j 1045 Приложение Г I I www.postfix.org Домашняя страница популярного альтернативного агента пересылки сообщений. Postfix используется вместо Sendmail все чаще и чаще, потому что его легче настраивать. www.osnews.com На этом сайте новостей, хоть он и не посвящен специально FreeBSD, часто встречаются статьи, содержащие как общие, так и специфические сведения о FreeBSD, которые могут пригодиться пользователям FreeBSD. Группы новостей в Usenet В этом разделе будут перечислены некоторые полезные, хоть и не посвященные специально FreeBSD, группы новостей, которые доступны в Usenet (узнать о том, какой сервер новостей вы должны применять для получения доступа к Usenet, вы можете у своего поставщика Internet-услуг). Общие группы новостей, посвященные UNIX Эти группы новостей охватывают темы, которые именно FreeBSD не посвящены, но могут представлять интерес для пользователей UNIX в целом. Например, в них могут рассматриваться технологии администрирования систем UNIX, общие вопросы безопасности в UNIX, основные способы использования оболочки в UNIX и тому подобные темы. • сотр.security.unix • сотр.sources.unix • сотр.unix.admin • сотр.unix.advocacy • сотр.unix.misс • сотр.unix.programmer • сотр.unix.questions • сотр.unix.shell * • сотр. unix. user,-friendly Группы новостей, посвященные Х11 • сотр.emulators.ms-windows.wine • comp.windows.x • сотр.windows.x.announce • сотр.windows.x.apps • сотр.windows.x.i386unix ; • сотр.windows.x.intrinsics • сотр.windows.x.motif • сотр.windows.x.pex
Предметный указатель А ACL (Access Control List), 437; 961 ATA (Advanced Technology Attachment), 618 Apache, 786; 789; 802 -SSL, 907 ARP (Address Resolution Protocol), 686; 696 ASCII, 819 В Binary, 819 BIND (Berkley Internet Name Domain, 953 BIOS (Basic Input/Output System), 124 С CGI (Common Gateway Interface), 809; 871 CIDR (Classless Inter-Domain Routing), 945 CIFS (Common Internet File System), 984 CPAN (Comprehensive Perl Archive Network), 399 CSU (Channel Service Unit), 680 CUPS (Common UNIX Printing System), 536; 564 CVS (Concurrent Versions System), 589 CVSup, 525 D Desktop Switcher, 153 Device Manager, 55 Disk Label Editor, 66 DLL (Dynamic Link Library), 508 DMA (Direct Memory Access), 619 DMZ (demilitarized zone), 846 DNS (Domain Name System), 471; 701; 952 DoS (Denial of Service), 67; 928 DSU (Digital Service Unit), 680 F FHS (Filesystem Hierarchy Standard), 407 FQDN (Fully Qualified Domain Name), 702 FreeBSD Boot Manager, 65; 112 G GAG, 112 GDI (Graphics Device Interface), 536 GIMP (GNU Image Manipulation Program), 190 GNOME, 143; 147 GUI (Graphical User Interface), 171 H HTML (HyperText Markup Language), 174; 782 I IANA (Internet Assigned Numbers Authority), 721 IDE (Integrated Drive Electronics), 618 IP-псевдоним, 716 IPSec, 941 IRQ (interrupt request), 580 ISP (Internet Service Provider), 678 J JDK (Java Development Kit), 210 JRL (Java Runtime Library), 210 К KDE, 143 KDevelop, 155 KDM (KDE Display Manager), 146 KEdit, 155 KMail, 155 KOffice, 155; 187 Konqueror, 155 L LBA (Logical Block Addressing), 624 Linux, 49 M MAC (Mandatory Access Control), 889; 911 MAC (Media Access Controller), 695 Mac OS X, 48; 435 * MBR (Master Boot Record), 125 MTA (Mail Transfer Agent), 205; 743 MUA (Mail User Agent), 743 MX (Mail Exchanger), 967 MySQL, 867 N NAT (Network Address Translation), 830; 936 NFS (Network File System), 118; 691; 972 NIC (Network interface card), 681 NIPC (National Infrastructure Protection Center), 927 О ODBC (Open Database Connectivity), 848 OSI (Open System Interconnection), 676 p РАМ (Pluggable Authentication Modules), 721 Perl, 867 PHP, 877 PIO (Programmed I/O), 619 Postfix, 778 PostgreSQL, 868 PostScript, 542 POST (Power-On Self Test), 124 ProFTPD, 828 Python, 869
Предметный указатель 1047 Quanta, 155 RPM (Rad Hat Package Manager), 506 Samba, 984; 987 SASL (Simple Authentication and Security Layer), 758 SAD (Security Association Database), 942 SATA (Serial ATA), 618 Secure FTP (sftp), 828 Sendmail, 753; 778 SEQUEL (Structured English Query Language), 849 Service pack, 648 SMB (Server Message Block), 984 SMP (Symmetric Multi-Processing), 574 SPD (Security Policy Database), 942 SQL (Structured Query Language), 849 SOA (Start of Authority), 964 SSH (Secure Shell), 436; 760 SSL (Secure Sockets Layer), 763 SWAT (Samba Web Administration Tool), 988 Sysinstall, 59 и Ultra DMA, 620 UTP (Unshielded twisted pair), 681 uudecode, 207 uuencode, 207 w WEP (Wired Equivalent Privacy), 689; 737 WPA (Wi-Fi Protected Access), 689 WU-FTPD, 827 XServer,95;141 X Window System, 93 Агент почтовый пользователя (MUA), 743 передачи сообщений (МТА), 205; 743 Адрес IP, 694 MAC, 695 сети широковещательный, 692 Аккорд, 85 Анонимный FTP, 820; 905 Атака DoS, 67 "трамплином", 930 Аудиоприложение, 191 Аутентификация Kerberos, 899 База данных MySQL, 854 PostgreSQL, 854 ассоциаций безопасности, 942 политики безопасности, 942 реляционная, 849 Базовая система ввода-вывода (BIOS), 124 Безопасность, 645; 890 ядра, 910 Безопасный FTP (SFTP), 905 Библиотека общая, 508 Бинарная модернизация, 588 Блок данных, 430; 431 Брандмауэр, 913 Браузер Firefox, 198 Konqueror, 150; 155 Lynx, 199 В Видеокарта, 224 Виртуальная память, 68; 489 Виртуальный хостинг, 800; 826 Восстановление, 667 Вход в систему FreeBSD, 132 Выражение регулярное, 387 Выход из системы FreeBSD, 134 Генерация случайных паролей, 895 Геометрия жесткого диска, 622 Главная загрузочная запись, 125 Гостевой пользователь, 995 Группа, 439 добавление, 799 bACL,451 рабочая, 986 управление, 461 Дейтаграмма, 830 Демилитаризованная зона (DMZ), 846; 913 Демон amd, 981 IMAP, 766 inetd, 480 lpd, 537; 549 mountd, 976 named, 953 natd, 837 nfsd, 975 nfsiod, 978 nmbd, 988 pppd, 728
1048 Предметный указатель pppd, 725 smbd, 988 syslogd, 769 Дескрипторы файлов, 361 Джордан Хаббард, 506 Диалоговое окно Run (Запуск программы), 164 Run Command, 173 в КОЕ, 173 Динамический модуль, 803 Динамическое связывание, 508 Директива AddType, 807 AllowOverride, 791 Options, 792 ServerName, 801 Диск SCSI, 621 геометрия жесткого диска, 622 головка, 623 дорожка, 623 метка, 630 новый, 632 пластина, 623 разбиение, 626 раздел, 627 секция, 627 форматирование, 633 цилиндр,623 Диспетчер AfterStep, 141 FreeBSD Boot Manager, 112 FVWM, 141 GAG, 112 GDM, 148; 260 KDM, 146; 260 Windows Maker, 141 Window Maker, 142 XDM, 260 XFce, 141 загрузки, 65; 112 графический, 146; 148; 260 окон, 94 устройств, 55 Дистрибутив, 75 Дозвон, 740 по требованию, 731 Домашний каталог, 277 Домен, 986 верхнего уровня, 952 Драйвер VESA, 246 wi, 736 Ж Жесткий лимит, 430 Журнал, 425 Samba, 995 Загрузка, 488 системы FreeBSD, 466 средние значения, 488 Загрузочный блок FreeBSD, 466 Загрузчик, 467 Запись, 850 NS, 953 синхронная, 660 Запрос, 849 на прерывание, 580 Запуск приложений автоматический, 251 удаленного, 259 Защита Apache, 906 FTP, 905 почтовых служб, 903 Зеркальное копирование, 671 Зеркальный сервер, 668 Зона, 954 forward, 961 hint, 961 master, 960 slave, 960 stub, 961 демилитаризованная, 846 начальная запись зоны. 964 и Идентификатор пользователя, 88 Имя каноническое, 967 пользователя, 88 Индекс, 863 полнотекстовый, 874 Индексный дескриптор, 430; 432 Инсталляция MySQL, 855 PHP, 877 PostgreSQL, 856 Инструмент CVSup, 525 S/Key, 896 SWAP, 988 Интегрированная среда разработки KDevelop, 155 Интерфейс CGI, 871 IDE, 618 KDE, 553 Кабель, 681 витая пара, 681 прямая, 682 перекрестная, 682
Предметный указатель 1049 Канал выверенный, 645 Карта Ethernet, 705 ISA, 705 PCI, 705 PCI/МИ, 705 PCMCIA, 706 Каталоги FreeBSD, 68; 406; 407 Квота, 411 Клавиатура, 218 Клавиатурная подстановка, 89 Клиент, 644 SMTP, 740 VPN, 940 Клиентская почтовая программа, 743 Ключ, 863 СА,764 первичный, 864 Кодирование Base64,209 uuencode, 207 Команда abort, 558 apachectl graceful, 794 apachectl restart, 794 apachectl start, 794 apachectl stop, 794 arp, 697 at, 499 awk, 298 bootOcfg, 113 boot kernel.GENERIC, 610 cat, 299; 421 cd,280 chfn, 460 chgrp, 442 chmod, 255; 329; 445; 542 chown, 441 clean, 561 cp,281 cut, 296 cvsup, 600 df, 409; 979 disable, 559 du, 410 echo, 330 egrep, 294 expr, 339 fdisk, 418 fgrep, 294 find, 291; 605 finger, 463 fmt, 297 format, 108 fsck, 422; 427 getopts, 338; 371 grep, 272; 294; 538 gvinum, 638 head, 293 halt, 137 host, 757 hostname, 714 htpasswd, 798 ifconfig, 710; 737; 842 ipfw, 915 kill, 359; 491; 493 killall, 729 kldload, 539 kldstat, 572 ksh, 368 less, 293 In, 284 locate, 522 lpc, 557 lpd, 549 lpq, 554 lpr, 550 lprm, 555 lptcontrol, 567 Is, 278 mail, 299 mailq, 755 make aliases, 749 make build, 524 make buildworld, 607 make checksum, 524 make clean, 528 make configure, 524 make extract, 524 make fetch, 524 make install, 520 make installworld, 612 make kernel, 584 make patch, 524 make restart, 753 make start, 753 make stop, 753 man, 164 man ftpd, 827 man loader, 468 man Is, 273 man nis, 646 mkdir, 284 more, 293 mount, 411; 634 mt, 668 mv, 283 mysql, 886 mysqldump, 885 mysqlhotcopy, 885 netstat, 713 pdksh, 368 periodic, 502
1050 Предметный указатель pgsql, 885 ping, 718 pkg_add, 145; 188; 210; 306 portinstall, 532 printenv, 322 printf, 332 ps, 492; 753 psql, 886 quota, 430 read, 335; 336 reboot, 137 rehash, 306 restart, 561 rm, 283; 441 rmuser, 458; 463 route, 714 sed, 298 sendmail, 755 set, 323; 367 setfacl, 451 sftp, 828 shift, 346 shutdown, 101; 134 shutdown now, 424 sort, 295 stat, 558 stop, 558 stty, 319; 320 su, 437 tail, 293 test, 342 top, 493 topq, 561 touch, 284 tr, 296; 568 ttmkfdir, 256 typelinst, 256 umount, 413 unalias, 318 uname, 593; 615 unset, 323 wc, 292 xf86cfg, 97 xhost, 257 xsetroot, 252 ypwhich, 462 завершение команд, 300 настройка приглашения, 318 подстановка команд, 338; 371 Командная оболочка, 266; 304 Bourne (sh), 268 Bourne Again (bash), 270 С (csh), 268 Korn(ksh),269;365 pdksh, 269 POSIX, 268 tcsh, 269; 270 zsh, 271 добавление в систему, 304 замена оболочки по умолчанию, 308 защищенная, 436 настройка среды, 317 установка из коллекции портов, 305 установка из пакетов, 305 файлы инициализации, 313 Коммутатор, 685 Конвейер, 298; 326 Конфигурация ресурсов, 471 Конфигурирование Apache, 789 XII с помощью сценария xorgconfig, 214 Концентратор, 683; 684 Копирование зеркальное, 669 файлов и каталогов, 281 Корневой раздел, 70 Кэш-таблица, 883 л Лимит жесткий, 430 мягкий, 430 Литерал, 379 Льготный период, 430 м Маршрут статический, 845 Маршрутизатор, 687; 698; 830 беспроводной, 688 по умолчанию, См. Шлюз, 832 Маршрутизация внеклассовая междоменная, 945 динамическая, 845 Маска максимальных полномочий, 451 сети, 692 Массив, 367 ассоциативный, 383 Мастер Network Folder Wizard, 152 Меню загрузчика, 125 Метасимвол, 288 Микроядро, 571 Микшер, 193 Модель OSI, 676 Модернизация бинарная, 588 до активной линии разработки, 594 до промежуточной сборки, 592 до рабочей версии, 592 перезагрузка после модернизации, 615 с помощью процесса make world, 595 ядра, 609
Предметный указатель 1051 Модули ядра, 572 Модуль bridge, 842 mod_perl, 805 mod_php, 805 mod_python, 805 mod_ruby, 805 динамический, 803 Монитор, 221 жидкокристаллический, 229 Мышь PS/2, 216; 243 Мягкий лимит, 430 Настройка bash, 320 tcsh, 318 видеокарты, 224 монитора, 221 мыши, 84; 216; 242 параметров консоли, 82 производительности, 658 пути команды ,319 раскладки символов, 319 ядра, 659 Неполадки, 603; 608 устранение, 603; 608; 611 . Область коллизий, 685 спула, 537 Оконный диспетчер, 140; 142 AfterStep, 141 Blackbox, 157; 249 FVWM, 141; 157 TWM, 156 Windows Maker, 141 Window Maker, 157; 158 XFce, 141 смена, 249 установка, 156 Оператор, 347 &&, 344 11,344 break, 348 case, 354 continue, 348 elif, 351 else, 350 false, 347 if, 349 true, 347 Операция И, 356 ИЛИ, 356 Очередизация, 742 Очередь, 742 печати, 537 сообщений, 754 Ошибка "Kernel panic", 72 п Пакет, 506 csvup, 525 IMAP-UW, 765 KOffice, 155; 187 OpenOffice.org, 187 ProFTPD, 828 qpopper, 761 Quanta, 155 sftp, 828 Samba, 984 SpamAssassin, 773 WU-FTPD, 827 обновлений, 518; 648 удаление, 518 установка, 513 из Sysinstall, 513 Память виртуальная, 68; 489 Панель Dock (Стыковка), 162 Mouse Preferences, 166 Пароль одноразовый, 896 теневой, 652 Переадресация ввода-вывода, 298 Перезагрузка после модернизации, 615 Переключатель рабочего стола (Desktop Switcher), 153 Переменная имя, 335 оболочки, 323; 333 среды, 322; 333 Печать, 544 bKDE,553 в OpenOffice.org, 552 изменение приоритета, 561 из командной строки, 549 из приложений XI1, 551 на принтерах PostScript, 543 очистка очереди, 561 поиск и устранение неполадок, 566 файлов PostScript на принтерах не-PostScript, 544 через сеть, 563 Подкачка, 68 Подпрограмма, 393 Подстановка команд, 371 Пользователь гостевой, 995 добавление, 455 управление с помощью NIS, 462
1052 Предметный указатель Порт, 506; 519 netatalk, 987 каскадирования, 682 модернизация, 530 обновление,525 обслуживание, 525 сборка, 528 удаление, 524 установка, 524 Постоянное соединение, 731 Почтовая программа клиентская, 743 Приложение Gnumeric, 187 KMail, 155; 209 wmCalClock, 162 запуск удаленного приложения, 259 клиентское, 435 серверное, 435 с графическим пользовательским интерфейсом (GUI), 171 с интерфейсом командной строки (CLI), 171 Приложения Java, 211 KDE, 154 Принтер GDI, 536 локальный, 548 управление, 557 Программа bitmap, 253 cat, 541 CGIwrap, 909 chsh, 308 Control Center, 154 Crack, 892 cron, 496 CVSup, 76; 655 dhclient, 1003 dig, 958 Easy Editor (Простой редактор), 175 Elm, 745 Exim, 779 FIPS, 105 GIMP, 190 GNOME-DB, 187 fsck, 130; 423 getty, 132 GhostScript, 542 ink, 130 Java, 211 keyinit, 896 kill, 494 KolorPaint, 189 Krita, 189 login, 132 lpc, 562 lptcontrol, 539 mail, 745 Mutt, 207; 745 ndc, 954 Network Folder Wizard, 152 nologin, 312 Norton Partition Magic, 105 nslookup, 958 Pine, 205; 745 ping, 718 PortSentry, 918 Postfix, 744; 778 Preferences (Настройки), 165 ps, 491; 492 pwgen2, 895 Qmail, 744; 779 Reporter, 892 Sendmail, 743; 753 sftp, 905 shutdown, 136 ssh, 903 stunnel, 904 sync, 130 sysctl, 662 Sysinstall,59;118;514 syslogd, 67 tcpdump, 900 Tripwire, 923 ttmkfdir, 256 Wallet, 152 xhost, 257 xmixer, 195 XMMS, 196 xorgcfg, 97 xorgconfig, 214 xv, 253 X Window System, 140 Производительность, 658 Протокол ARP, 686; 696 CGI, 809 CHAP, 724; 729 CIFS, 984 DHCP, 702; 1000 FTP, 200; 816 анонимный, 820; 825 HTTP, 782 ICMP, 689; 691 IMAP, 765 IP, 689; 692 IPSec, 941; 944 NFS, 691 PAP, 729 POPS, 759 RIP, 845
РРР ("точка-точка"), 724 SLP, 972 SMB, 984 SMTP, 740 SSH, 81; 760 SSL, 763 TCP, 689; 690 TCP/IP, 676 UDP, 689; 690 WEP, 737 Профиль, 434 безопасности, 912 Процесс make world, 595 Псевдоним, 318; 749 IP, 716 P Рабочая группа, 986 Рабочая оболочка, 90 Рабочий стол, 94 KDE, 149 Window Maker, 159 стиль, 164 тема, 164 Раздел, 416; 650 BSD, 106; 627 DOS, 106 внешний расширенный, 628 корневой, 70 подкачки, 68; 71 Регулярное выражение, 387 Редактор AbiWord, 187 Disk Label Editor, 630; 631 ее, 175 gedit, 186 KEdit, 155; 186 vi, 178 меток дисков, 66 секций fdisk, 628 Режим передачи файлов ASCII, 819 Binary, 819 Резервная копия, 664 Резервное копирование, 104 Ретранслятор, 756 Ретрансляция, 743 с Самозагрузка, 125 Самотестирование при включении (POST), 124 Сеанс X без оконного диспетчера, 141 Секция, 125; 416; 650 Сервер cvsupd, 669 DHCP, 1005 Предметный указатель FTP, 820 proftpd, 828 sftp, 828 SMTP, 740 VPN, 939 vsftpd, 827 wu-ftpd, 827 X Server, 93 доменных имен (DNS), 471 имен кэширующий, 969 корневой, 701 Сертификат СА, 764 Сетевая маска, 692 Сетевая файловая система (NFS), 118 Сетевой анализатор пакетов (packet sniffer), 900 Сеть частная, 939 Сигнал прерывания, 360 Синхронизация при передаче данных двойная, 620 Синхронная запись, 660 Системный регистратор (syslogd), 482 Служба FTP, 820 Соединение постоянное, 731 Сортировка текста в файле, 295 Спам, 773 Спираль смерти, 488 Список, См. Массив, 367 контроля доступа (ACL), 437 включение ACL в смонтированную файловую систему, 450 добавление пользователя или группы.в ACL, 451 конфигурирование ядра для поддержки ACL, 448 отказ в доступе с помощью ACL, 454 удаление записей, 454 управления доступом, 961 Спулер, 537 Ссылка жесткая, 284 мягкая (символическая), 285 Субдомен, 954 Суперблок, 426 Сценарий, 268 /etc/netstart, 715 /etc/rc.d/devfs, 580 adduser, 455 chat, 728 Perl, 386; 870 wi-dpwn, 738 wi-up, 738 xorgconfig, 214 запуска PortSentry, 920
Предметный указатель конфигурации ресурсов, 131; 471 оболочки Когп, 368 отладка, 363 управления выполнением (Run Control), т Таблица кэш, 883 Текстовый фильтр, 541 Тема рабочего стола, 164 Точка монтирования, 70; 408 Транзакция, 875 Трансивер, 688 Туннель, 937 Туннельное устройство, 725 у Удаление файлов и каталогов, 283 Уровень запуска, 466 Установка Apache, 786 FreeBSD по сети, 114 GNOME, 147 KDE, 145 оконных диспетчеров, 156 Утилита, 509 bootOcfg, 113 CVSup, 589 dmesg, 575 dump, 666 edquota, 429 fdisk, 623 FIPS, 105 gvinum, 639 hostname, 714 ifconfig, 708; 710 mergemaster, 612 newfs, 427 ping, 737 pkg_add, 509; 516 pkg_create, 509 pkg_delete, 509; 518 pkg_info, 509 pkg_update, 509 pkg_version, 509; 512 Portupgrade, 532 Preferences, 165 Procmail, 775 reorder, 472 restore, 667 route, 712; 714 ScanDisk, 106 Sysinstall, 660; 706 top, 486; 490 xbiff, 205 xorgcfg, 97 Ф Файл, 440; 522 .fetchmailrc, 768 .htaccess, 792 .htaccess, 795 .procmailrc, 776 .xinitrc, 249 /etc/adduser.conf, 895 /etc/crontab, 499 /etc/csh.cshrc, 315 /etc/csh.cshrc, 313 /etc/csh.login, 313 /etc/csh.logout, 315 /etc/defaults/rc.conf, 473 /etc/exports, 976 /etc/fstab, 421 /etc/ftphosts, 826 /etc/ftpusers, 823 /etc/group, 439; 461 /etc/hostxonf, 721 /etc/hosts, 717 /etc/hosts.allow, 721; 922 /etc/inetd.conf, 721; 822 /etc/mail/access, 750 /etc/mail/aliases, 749 /etc/mail/freebsd.mc, 747 /etc/mail/local-host-names, 751; 757 /etc/mail/mailer.conf, 778 /etc/mail/relay-domains, 757 /etc/mail/virtusertable, 751 /etc/master.passwd, 459 /etc/motd, 311 /etc/network, 721 /etc/pam.d, 721 /etc/passwd, 459 /etc/passwd, 652 /etc/ppp/chap-secrets, 730 /etc/ppp/options, 726 /etc/ppp/options, 730 /etc/ppp/pap*ecrets, 730 /etc/ppp/ppp/conf, 725 /etc/printcap, 548 /etc/profile, 315 /etc/protocols, 721 /etc/rc.conf, 475 /etc/rc.conf, 714; 837 /etc/red, 761 /etc/rcJocal, 484 /etc/resolv.conf, 725 /etc/resolv.conf, 719 /etc/rpc, 721 /etc/services, 721» 990 /etc/shadow, 652 /etc/shells, 306; 824 /etc/sysctl.conf, 662 /etc/vinum.conf, 637
/usr/local/etc/procmailrc, 777 /usr/local/etc/smb.conf, 988 /usr/local/etc/sudoers, 655 /var/run/dmesg.boot, 538 /var/run/nologin, 824 crontab, 497 dhclient.conf, 1003 distinfo, 522 httpdxonf, 790; 792 inetdxonf, 480 make, 748 make.conf, 605 Makefile, 520; 522 namedxonf, 955; 956 patch-aa, 522 patch.ab, 522 pkg-comment, 522 pkg-descr, 522 pkg-plist, 522 ports-supfile, 526 racoon.conf, 943 README.html, 522 runme.sh, 522 sendmail.cf, 747 smb.conf, 989 sup, 600 syslog.conf, 482 UPDATING, 603 xorg.conf, 99; 236; 254 xorg.config, 215 владение, 440 группа (group), 440 другие (others), 440 пользователь (user), 440 доступ, 440 выполнение (execute), 440 запись (write), 440 чтение (read), 440 зоны, 954; 963; 968 журнальный, 548 конфигурационный ядра, 577 мастер, 963 пакетный, 268 прототип,664 режим, 440 Файловая система, 404 FreeBSD, 277; 405; 408 навигация, 280 Linux монтирование, 417 NFS, 984 сетевая, 972 Файлы инициализации командной оболочки, 313 пакетов RPM, 507 Фильтр, 536 входной,548 Предметный указатель для принтеров PostScript, 543 преобразования, 546; 548 текстовый, 541 Фоновый рисунок, 252 Формат OpenDocument, 189 Функция, 361 Soft Updates, 660 X Хакер, 88 Хеш таблица, 460 -функция, 864 Хостинг виртуальный, 800; 826 Ц Цвет фона, 252 Цикл for, 345 until, 343 while, 341 бесконечный, 347 прерывание цикла, 347 ч Частная сеть, 939 ш Шифрование, 689 WEP, 689 WPA, 689 Шлюз, 700; 832 NAT, 834 Шрифт, 254 Adobe Type 1,254 TrueType, 255 э Экспедитор, 958 Эмулятор терминала minicom, 729 Я Ядро, 47; 125; 126; 406; 570 конфигурационные файлы ядра, 577 GENERIC, 578 LINT, 581 NOTES, 581 модули ядра, 572 Язык Perl, 374; 811; 867 модули, 395 РНР, 878 Python, 377; 869 SQL, 849 гипертекстовой разметки (HTML), 174
Научно-популярное издание Брайан Таймэн FreeBSD 6. Полное руководство Верстка Т.Н. Артеменко Художественный редактор СЛ. Чернакозинский Издательский дом "Вильяме" 127055, г. Москва, ул. Лесная, д. 43, стр. 1 Подписано в печать 06.07.2007. Формат 70x100/16. Гарнитура Times. Печать офсетная. Усл. печ. л. 85,14. Уч.-изд. л. 71,56. Тираж 2000 экз. Заказ № 1953. Отпечатано по технологии CtP в ОАО "Печатный двор" им. А. М. Горького 197110, Санкт-Петербург, Чкаловский пр., 15.