Мой Компьютер, №14, 01.04.2008
Немного о FreeBSD
Популярность Linux фактически затмила другие альтернативы Windows. Но на серверном фронте у админов спросом пользуется именно семейство *BSD-систем. Появление FreeBSD датировано началом 1993 года. За основу был взят код и исходные тексты 386BSD, одной из систем, разработанных в недрах Калифорнийского Университета Беркли (Berkeley Software Distribution, отсюда и приставка «BSD») — правда, для соблюдения лицензионной чистоты большая часть кода в версии 2.0 была переделана. Целью проекта является предоставление программного обеспечения, которое может быть использовано для любых целей и без дополнительных ограничений. Это гарантируется применяемой BSD-лицензией, которая насчитывает всего 3 пункта и разрешает использование исходного кода системы без его обязательной публикации (как в GNU GPL).
FreeBSD, в отличие от Linux, разрабатывается как целостная операционная система, то есть все, начиная от исходного кода ядра, драйверов устройств и основных программ пользовательского уровня (я не имею в виду среды вроде KDE, речь о базовых программах), содержится в одном дереве системы управления версиями (CVS) и поддерживается одной группой разработчиков. В Linux это выглядит несколько иначе: код ядра, драйвера устройств и прочее поддерживается разными группами, а в единое целое их собирают уже разработчики дистрибутивов, добавляя свои особенности.
Несмотря на изначальную ориентировку на работу в командной строке, FreeBSD является самой современной системой. И хотя эта система больше популярна на серверах, FreeBSD нормально чувствует себя и на рабочих столах. Правда, отсутствие понятных простому пользователю инструментов установки и настройки привело к появлению отдельных проектов, о которых мы уже говорили на страницах журнала: DesktopBSD, PC-BSD, FreeSBIE и других. Зато в портах (sysutils/desktopbsd-tools) наконец появились графические инструменты, разрабатываемые проектом DesktopBSD, заметно упрощающие настройку этой системы.
Помимо программ, включенных в базовую поставку, дополнительные утилиты можно установить при помощи прекомпилированных пакетов — пакаджей (система портов). Последние позволяют буквально одной командой скачать, скомпилировать и установить программу, а сегодняшнее дерево портов насчитывает около 18 тысяч приложений. Да не стоит забывать о бинарной совместимости с Linux.
Параллельно существуют две ветки FreeBSD — CURRENT и STABLE. Первая относится к нестабильной, тестовой. В ней обкатывается новый экспериментальный код, она предназначена больше для энтузиастов и опытных пользователей. После тестирования новинки попадают в ветку STABLE, которая тем не менее также считается веткой для разработчиков. Рабочие серверы рекомендуется переводить на STABLE только после проверки работоспособности системы. На основе STABLE периодически появляются тщательно протестированные релизы RELEASE. Итак, мы сегодня имеем релиз 7.0, а сама седьмая ветка из CURRENT перешла в STABLE.
Разработчики (а заодно и мы вместе с ними) шли к этому событию два с половиной года. Изменений в новом релизе очень много, затрагивают они буквально все — ядро системы, сетевые протоколы, файловую систему и прочее. Простое перечисление всех новшеств занимает несколько экранов монитора (www.opennet.ru/opennews/art.shtml?num=14429). Некоторые из них были доступны уже в 6.3, перебравшись из 7_CURRENT. Сетевые возможности FreeBSD претерпели весьма глобальные изменения, что в общем-то не удивительно, так как это направление всегда во FreeBSD развивалось очень активно. Многие подсистемы были переписаны с учетом работы в мультипроцессорной системе. Поэтому разберем только самые интересные.
Что нового?
В новой версии полностью обновлено прикладное программное обеспечение: KDE 3.5.8, GNOME 2.20.2, X.Org 7.3, GCC 4.2.1, BIND 9.4.2, Sendmail 8.14.2, OpenSSL 0.9.8e и многие другие.
Список архитектур не изменился: AMD64, i386, ia64, pc98 и PowerPC. Но сегодня ведутся работы по портированию на ARM, поэтому, возможно, когда-нибудь мы увидим FreeBSD и на встроенных устройствах Sun Niagara (UltraSparc T1). Скачать продукт можно как через Bittorrent (torrents.freebsd.org:8080), так и через традиционный FTP (ftp://ftp.freebsd.org/pub/FreeBSD). Состав образов, в общем, не изменился: первый — загрузочный, остальные с пакетами, плюс отдельный образ с документацией.
Процесс установки глобальных изменений не претерпел, все тот же старый знакомый sysinstall.
Хоть, признаться, я ожидал увидеть новый инсталлятор finstall (wiki.freebsd.org/finstall), имеющий более дружественный графический интерфейс.
Finstall построен по модульному принципу, в котором front-end и back-end разделены, написан на языке Python (для GUI использован модуль PyGTK). Это открывает перед разработчиками широкие перспективы для его модификации и наращивания функций. Пока его обещают включить в стандартную поставку начиная с версии 7.1 в качестве второго дополнительного инсталлятора. За исключением архитектур, не поддерживаемых finstall (все кроме i386 и amd64), для которых sysinstall останется единственным средством.
Разработчики не могли не учесть растущую популярность беспроводных сетей. Поэтому в этом направлении была проделана довольно большая работа, в результате чего система получила полную поддержку семейства стандартов 802.11 (Wi-Fi и WiMax).
В новой версии FreeBSD усовершенствована подсистема Linuxulator, которая позволяет запускать бинарные файлы Linux без модификации и без потерь на трансляцию системных вызовов одной ОС в другую. Осуществлен переход на Linux-ядро 2.6.16. Последняя возможность не включена по умолчанию, так как является экспериментальной, используется эмуляция 2.4. Но включить ее просто, для этого устанавливаем значение sysctl переменной compat.linux.osrelease в «2.6.16».
В утилите freebsd-update, обеспечивающей все обновления безопасности за счет установки двоичных пакетов без необходимости пересборки системы, появилась дополнительная команда «upgrade», позволяющая обновить систему до последнего релиза.
Поддержка нескольких процессоров
В анонсе, появившемся после выхода FreeBSD 7, отмечалась повышение производительности и стабильности системы в целом, и особенно это касается многопроцессорных систем. Как доказательство был представлен ряд тестов (http://people.freebsd.org/~Ekris/scaling), в которых FreeBSD 7 в 3.5 раза показывала большую производительность по сравнению с FreeBSD 6.X и приблизительно на 15% обгоняла Linux с ядрами ветки 2.6. За счет чего обеспечивается такой прирост?
Исторически FreeBSD разрабатывался под однопроцессорные системы и не очень дружил с несколькими процессорами. Используемый алгоритм Giant lock был далек от оптимального. И хотя в этом случае пользовательский код мог выполняться на нескольких процессорах, ядро, «охраняемое» mplock, могло обрабатывать только один процесс в единицу времени. В 2000 году был создан проект SMPng (SMP next generation), в рамках которого предполагалось изменить дизайн ядра таким образом, чтобы программы могли выполняться параллельно. Дебют новой модели состоялся в версии FreeBSD 5.0, в которой mplock был заменен целым набором локальных блокировок. А с версии FreeBSD 5.3 начался процесс адаптации к параллельной работе некоторых системных функций, в частности, сетевого стека и виртуальной памяти, который был продолжен в шестой версии системы. Правда, giant lock дожил практически до выхода 7.0. Теперь уже со старым грузом распрощались, а FreeBSD является системой, полностью поддерживающей параллельное выполнение задач.
Второй фактор, влияющий на повышение производительности — появление нового планировщика задач ULE в его третьей редакции, который заменил штатный 4BSD scheduler, доставшийся из прошлых времен. Новый планировщик был существенно переделан и оптимизирован для работы на мультипроцессорных системах. По умолчанию в версии 7.0 ULE отключен:
% grep SCHED /usr/src/sys/conf/NOTES
options SCHED_4BSD
#options SCHED_ULE
Потому чтобы увидеть в работе новый планировщик, ядро придется таки пересобрать. Тем более что ULE официально рекомендуется к использованию для повышения производительности системы. Обещают, что начиная с 7.1 ULE будет использоваться по умолчанию. Также можно отметить замену библиотеке phkmalloc, отвечающей за управление динамической памятью, разработанной еще в середине 90-х. Новая версия ejmalloc написана с учетом работы на многопроцессорных системах.
Файловые системы
FreeBSD получила поддержку файловой системы ZFS (Zettabyte File System), первоначально разрабатываемой Sun для Solaris. ZFS является 128-битной, поэтому может работать с файлами и разделами очень большого размера, ее характеризует высокое быстродействие, простое управление объемами хранения данных, отсутствие фрагментации, переменный размер блока и механизмы, обеспечивающие целостность данных. Но пока такая поддержка отмечена как экспериментальная и имеет к тому же ряд ограничений. Так, FreeBSD пока не сможет загружаться с ZFS, не поддерживается ACL, доступна только для платформ amd64, i386 и pc98. Но файловые системы UDF теперь можно строить прямо на ZFS. По умолчанию модуль ZFS отключен — перед началом работы советую почитать ZFSQuickStartGuide (http://wiki.freebsd.org/ZFSQuickStartGuide).
В версию 7 добавлен порт проекта NetBSD — файловой системы tmpfs. В Linux данная возможность появилась раньше, в FreeBSD модуль пока помечен как экспериментальный, но он протестирован и вполне готов к работе. При помощи tmpfs можно использовать участки ОЗУ как обычные блочные устройства. Будет ли востребована данная функциональность на серверах, неизвестно, но в случае успешного применения FreeBSD на встроенных устройствах лишней она точно не будет. Чтобы подключить tmpfs, достаточно выполнить команду:
# echo ‘tmpfs_load=»YES»’ >> /boot/loader.conf
И теперь монтируем любой каталог, например /tmp:
# mount -t tmpfs tmpfs /tmp
Для автоматического монтирования при загрузке добавляем эту запись в /etc/fstab, только в качестве последнего параметра обязательно должен стоять 0, иначе fsck попробует его проверить и потерпит неудачу, так как не поддерживает этот тип ФС.
К GEOM, появившемуся во FreeBSD 5, добавлен новый класс GEOM_JOURNAL, позволяющий журналировать файловую систему UFS (на данный момент поддерживается только она). Для управления этим процессом предназначена утилита gjournal. Журналирование осуществляется на уровне блоков, а не файловой системы — то есть в протокол попадают данные и метаданные. При этом данные и журнал могут храниться как на одном, так и на разных поставщиках. Настроить журналирование на файловой системе UFS при помощи gjournal достаточно просто:
# gjournal load
Теперь создаем GEOM-поставщика при помощи gjournal:
# gjournal label /dev/da0
Натравливаем newfs или tunefs с ключом -J:
# newfs -J /dev/da0.journal
# mount -o async /dev/da0.journal /mnt
Параметр async команды mount весьма рекомендуется при использовании журнала. Ядро «генерик» версии 7 поддерживает gjournal по умолчанию, нужный модуль загружается при запросе. Можно настроить журналирование и на существующей файловой системе, но только в том случае, если последний сектор, в котором gjournal хранит информацию, не использован файловой системой.
Класс gvirstor (http://wikitest.freebsd.org/gvirstor) позволяет создавать виртуальных GEOM-провайдеров в режиме overcommit, превосходящих емкостью имеющееся физическое устройство. К такому виртуальному устройству по требованию можно добавить дополнительные разделы. В самом простом случае процесс выглядит так: сначала создаем устройство /dev/virstor/mydisk, к которому привязываем диски ad5 и ad6:
# gvirstor label -v mydisk /dev/ad5 /dev/ad6
Создаем раздел:
# newfs /dev/virstor/mydisk
Дополнительный диск добавляется командой:
# gvirstor add mydisk ad7
Если устройство не востребовано, его так же легко можно удалить, используя параметр remove.
Долгое время реализация файловой системы unionfs в FreeBSD находилась в весьма плачевном (очень плачевном) состоянии. Даже в официальной документации большими буквами было написано, что она есть, но лучше ее не трогать.
В версии 7 появилась новая, стабильная реализация этой файловой системы, написанная Даичи Гото (Daichi Goto) с нуля. Даже более того, она перекочевала и в шестую ветку FreeBSD. Это открывает большие возможности — например, среда Jail, при использовании которой реально все изменения будут производиться в виртуальном каталоге, смонтированном в unionfs. Приведу классический пример использования unionfs. Например, так можно смонтировать CD-ROM и «записывать» в него информацию:
# mount -t cd9660 -o ro /dev/acd0 /cdrom
# mount –t unionfs -o noatime /var/cdrom /cdrom
Теперь каталог /var/cdrom примонтирован поверх /cdrom, и с ним можно работать как с обычным разделом жесткого диска. Кстати, в новой «фре» убраны все mount_*-утилиты (mount_devfs, mount_ext2fs, mount_linprocfs, mount_procfs, mount_linsysfs и так далее), теперь тип файловой системы задаем через mount -t.
Это далеко не все изменения, коснувшиеся дисковой подсистемы. Был портирован код из Linux, реализующий поддержку файловой системы XFS — правда, в режиме «только чтение». Код многих файловых систем был переписан с учетом работы на многопроцессорных системах.
Как видите, во FreeBSD 7 появилось много полезного и интересного. Правда, стоит отметить, что новинки этого релиза больше ориентированы все-таки на серверное применение, чем на рядового юзверя, но его уже устанавливают на рабочих столах. А проекты вроде PC-BSD и DesktopBSD уже объявили о будущих релизах, основанных на новой ветке. Так что вперед! Да, и уже доступна FreeBSD 8_CURRENT, в которой обещается не меньше новинок.
Сергей ЯРЕМЧУК
Web-droid editor