Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 113, МАЙ 2008 г.

Великолепная семерка

Владимир «turbina» Ляшко (v.turbina@gmail.com)

Хакер, номер #113, стр. 113-086-1

Обзор новшеств в FreeBSD 7.0

В последние дни февраля была анонсирована седьмая версия популярной операционной системы FreeBSD, де факто являющейся стандартом для серверов различной направленности. Разработчики шли к этому событию свыше двух лет. Многочисленные изменения затрагивают почти все компоненты ОС – ядро, сетевые протоколы, файловую систему... Самое время познакомиться с новинками.

Несколько слов о FreeBSD

Чтобы начать разговор, нужно пару слов сказать о самой FreeBSD. Проект возник в начале 1993 года на основе кода одной из систем, разработанных в недрах Калифорнийского Университета Беркли (Berkeley Software Distribution, отсюда и приставка BSD). Цель проекта – предоставление программного обеспечения, которое может быть использовано для любых целей и без дополнительных ограничений. Это гарантируется применяемой BSD лицензией, насчитывающей всего три пункта и разрешающей использование исходного кода системы без его обязательной публикации (как в GNU GPL).

Несмотря на изначальное ориентирование на работу в командной строке, FreeBSD является самой современной ОС, поддерживающей многопроцессорные и многоядерные системы, сетевое оборудование, мультимедиа устройства и прочее. И хотя эта операционка больше популярна на серверах, она также комфортно чувствует себя на ноутбуках и рабочих станциях.

Помимо программ, включенных в базовую поставку, доступна коллекция портов и прекомпилированных пакетов, предоставляющая простой метод установки приложений. Не стоит забывать и о бинарной совместимости, благодаря которой FreeBSD умеет работать с приложениями, написанными для Linux.

Существует две ветви FreeBSD — CURRENT и STABLE. Первая относится к нестабильной и тестовой. В ней обкатывается новый экспериментальный код, поэтому предназначена она, скорее, для энтузиастов и опытных пользователей. После тестирования фичи попадают в производственную ветку STABLE, которая, как ни странно, тоже считается веткой для разработчиков. Рабочие серверы рекомендуется переводить на STABLE только после проверки работоспособности системы. На основе STABLE периодически появляются тщательно протестированные релизы (RELEASE).

Итак, сегодня у нас на руках релиз 7.0, а седьмая ветка из CURRENT перешла в STABLE.

Повышение производительности

В анонсе, появившемся после выхода FreeBSD 7.0, отмечались повышенные производительность и стабильность системы в целом (особенно это касается многопроцессорных систем). В качестве доказательства был представлен ряд тестов (people.freebsd.org/~kris/scaling). Последняя фряха показывала в 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 началась адаптация к параллельной работе некоторых системных функций, в частности сетевого стека и виртуальной памяти, которая была продолжена в шестой версии системы (например, VFS и UFS уже допускали параллельный доступ). Впрочем, giant lock присутствовал практически до выхода 7.0 (например, сетевой NET_NEEDS_GIANT убран летом 2007). Теперь же FreeBSD является операционкой, полностью поддерживающей параллельное выполнение задач. Отмечается, что при последовательном увеличении процессоров до восьми, общая производительность системы растет линейно.

Новый планировщик ULE в третьей редакции был переписан и оптимизирован для работы на мультипроцессорных системах. Алгоритм, использующий балансировку деревьев, достаточно сложен, и при выборе CPU учитывает большое количество параметров, например, на каком из процессоров задача выполнялась в предыдущий раз. Низкоприоритетная задача, запущенная на одном из CPU, вытесняется высокоприоритетной. Правда, в версии 7.0 по умолчанию используется древний 4BSD sheduler:

% grep SCHED /usr/src/sys/conf/NOTES

options SCHED_4BSD

#options SCHED_ULE

Поэтому, чтобы увидеть в работе новый планировщик, ядро придется пересобрать. Но ULE уже официально рекомендуют для повышения производительности системы. Обещают, что с 7.1 он будет использоваться по дефолту. Кстати, обрати внимание на название параметра – SCHED_ULE. Третий ULE является форком оригинального ULE 2.0 и раньше назывался – SCHED_SMP (наверное, поэтому именно так он указывается во многих новостных лентах и обзорах).

Библиотека phkmalloc, отвечающая за управление динамической памятью и разработанная еще в середине 90-х Поулом Кампом, заменена ejmalloc (people.freebsd.org/~jasone/jemalloc), которая написана с учетом работы на SMP-системах.

Файловые системы

FreeBSD получила поддержку файловой системы ZFS (Zettabyte File System), которая первоначально разрабатывалась Sun Microsystems для Solaris. Особенностью 128-битной ZFS является возможность работы с файлами и разделами очень большого размера. В ней объединена концепция файловой системы и менеджера логических дисков (как LVM). Ее отличает высокое быстродействие, простое управление объемами хранения данных, отсутствие фрагментации, переменный размер блока и механизмы, обеспечивающие целостность данных. Но пока такая поддержка отмечена как экспериментальная и имеет ряд ограничений. Например, FreeBSD не может загружаться с ZFS, также не поддерживается ACL и некоторые другие характеристики ZFS. К тому же, она пока доступна только для платформ amd64, i386 и pc98. Но главное – файловые системы UDF теперь можно строить прямо на ZFS! По умолчанию модуль ZFS отключен и перед началом работы советую почитать ZFSQuickStartGuide (wiki.freebsd.org/ZFSQuickStartGuide).

Назову еще один немаловажный нюанс. Обычно каталог /boot монтируется в режиме только для чтения (в single mode), но утилитам ZFS необходима возможность записи в /boot/zfs, иначе, в случае изменения структуры, при следующей загрузке возможно завершение с ошибкой. Это нужно помнить при использовании ZFS.

В версию 7.0 добавлен порт файловой системы tmpfs, которая была разработана NetBSD'шниками в рамках программы Google Summer of Code. Этот модуль тоже помечен как экспериментальный, но он тщательно протестирован и вполне готов к работе. В Linux технология появилась намного раньше. С ее помощью можно использовать участки ОЗУ как обычные блочные устройства. Учитывая, что обмен данными в оперативке на несколько порядков выше, можно увеличить скорость выполнения некоторых операций. Не знаю, окажется ли востребованной эта функциональность на десктопах и серверах, но на встроенных устройствах лишней она точно не будет. Чтобы подключить tmpfs, достаточно выполнить команду:

# echo ‘tmpfs_load="YES"’ >> /boot/loader.conf

А при компиляции ядра не забываем включить параметр «options TMPFS». И теперь монтируем любой каталог, например /tmp:

# mount -t tmpfs tmpfs /tmp

Для автоматического монтирования при загрузке добавляем эту запись в /etc/fstab. Последним параметром обязательно должен стоять 0. Иначе fsck попробует проверить tmpfs и потерпит неудачу (так как не поддерживает данный тип ФС), что остановит или задержит процесс загрузки.

К модульной системе управления дисками GEOM, появившейся в FreeBSD 5.х, добавлен новый класс GEOM_JOURNAL (ранее требовался патч). Он обеспечивает любой объект GEOM средствами регистрации данных. Поддержка в коде UFS (пока только UFS) означает, что при необходимости ее очень легко можно сделать журналируемой, увеличивая скорость загрузки системы (не нужно запускать fsck) и гарантируя целостность данных. Для управления журналированием файловой системы предназначена утилита gjournal(8). Журналирование осуществляется на уровне блоков, а не на уровне файловой системы, то есть в протокол попадают данные и метаданные. При этом данные и журнал могут храниться как одном, так и на разных поставщиках. Последний вариант пригодится при повышении производительности дисковой подсистемы. Чтобы оптимизировать производительность, при использовании gjournal следует отключать механизм Soft Updates.

Но это еще не все. Например, gjournal может быть сконфигурирован поверх других поставщиков (gmirror, graid3), которые теперь также будут поддерживаться в целостном состоянии. А значит, синхронизацию после отказов системы на них можно отключить. Настроить журналирование на UFS при помощи gjournal достаточно легко:

# gjournal load

Теперь создаем GEOM-поставщика:

# gjournal label /dev/da0

На устройство натравливаем newfs или tunefs с ключом '-J' и выполняем монтирование:

# newfs -J /dev/da0.journal

# mount -o async /dev/da0.journal /mnt

Параметр async команды mount рекомендуется при использовании журнала. Дефолтное ядро версии 7.0 поддерживает gjournal по умолчанию, и нужный модуль загружается при запросе. При самостоятельной пересборке не забудь включить «options UFS_GJOURNAL». Для подстраховки следует указать загрузку модуля:

# echo ‘geom_journal_load="YES"’ >> /boot/loader.conf

Можно настроить журналирование и на существующей файловой системе, но только в том случае, если последний сектор, в котором gjournal хранит информацию, не использован файловой системой.

Класс gvirstor (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, а введя «gvirstor list», получим список задействованных устройств.

Это далеко не все изменения, коснувшиеся дисковой подсистемы. Класс GEOM_MULTIPATH (gmultipath) позволяет создавать несколько точек доступа к диску, управление возможно при помощи утилиты gmultipath. Из Linux был портирован код, реализующий поддержку файловой системы XFS, правда, в режиме «только чтение».

Серверная и клиентские части NFS и псевдо ФС (procfs и другие) избавились от глобальных блокировок, что дает заметный прирост производительности на многопроцессорных системах.

Долгое время реализация файловой системы «промежуточного уровня» unionfs в FreeBSD находилась в весьма плачевном состоянии. Даже в официальной документации большими буквами пугали нашего брата, мол, поддерживается она не полностью, использовать ее можно лишь на свой страх и риск. Да и понятие «стабильность работы» как таковое отсутствовало. Уронить систему или потерять информацию при использовании unionfs было просто. В версии 7.0 появилась новая, стабильная реализация этой файловой системы, написанная Даичи Гото (people.freebsd.org/~daichi/unionfs) с нуля. Более того, она перекочевала и в шестую ветку FreeBSD. Это открывает большие возможности, например, можно смонтировать 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 и т.д.). Теперь тип файловой системы задается через параметр '-t'.

Сетевые возможности

Сетевые возможности претерпели не менее глобальные изменения, что, в общем-то, неудивительно, так как это направление всегда активно развивалось во фряхе. К примеру, новая реализация системного вызова sendfile() умеет отправлять большие объемы данных и совместно с TSO и другими дополнениями обеспечивает чуть ли не пятикратное увеличение производительности, особенно в гигабитных сетях. Добавлена поддержка протокола передачи с управлением потоком SCTP (Stream Control Transmission Protocol) – пока экспериментальная, но в GENERIC по умолчанию она активирована. Появление TSO (TCP/IP Segment Offload) и LRO (Large Receive Offload) дает возможность перенести обработку TCP соединений на сетевые карты, что снижает нагрузку на систему и опять же повышает производительность. Надо сказать, поддержка реализована не для всех драйверов.

Добавим сюда возможность автоматического определения размера TCP буфера в зависимости от скорости соединения. Ранее размер составлял 32 кбит, но на гигабитных скоростях этого уже недостаточно. Кроме того, появилась поддержка 10-гигабитных сетевых карт.

Напомню, что еще в версии 6.3 появился портированный из Open/NetBSD драйвер, позволяющий объединять каналы в виртуальный сетевой интерфейс с возможностью обеспечения бесперебойной работы – lagg(4):

# ifconfig ed0 up

# ifconfig vr0 up

# ifconfig lagg0 create

# ifconfig lagg0 up laggproto lacp laggport ed0 laggport vr0

# ifconfig lagg0 192.168.1.200 netmask 255.255.255.0

# route add -net 0.0.0.0 192.168.1.1 0.0.0.0

В FreeBSD добавлены новые узлы Netgraph: ng_car – алгоритмы ограничения трафика, ng_deflate и ng_pred1 – поддержка deflate и predictor-1 сжатия для PPP.

В ноябре 2005 года была предложена KAME реализация IPSec, но в это время на основе KAME и кода OpenBSD под руководством Сема Леффлера уже проводились работы по адаптации IPSec к многопроцессорному окружению. Некоторое время FAST_IPSEC был доступен в виде патчей. Теперь KAME официально убран, а в FAST_IPSEC добавлена поддержка IPv6 и аппаратного ускорения шифрования.

Разработчики учли все возрастающую популярность беспроводных сетей. В этом направлении была проделана неплохая работа, в результате чего система получила полную поддержку семейства стандартов 802.11 (Wi-Fi и WiMax).

Полностью отказались от утилиты wicontrol, которая применялась для настройки работы беспроводных интерфейсов, – теперь для этих целей предложено использовать более привычный ifconfig.

Для sysctl появились новые переменные, позволяющие на лету управлять параметрами различных подсистем ядра. Например, kern.conftxt позволяет просмотреть содержимое файла конфигурации для текущей сборки ядра, net.inet.icmp.reply_from_interface включает отправку ICMP ответов с IP, на который пришел пакет, а в kern.hostuuid записан уникальный идентификатор узла UUID.

Теперь стало возможным без наложения дополнительных патчей динамически вычислить размер TCP буферов в зависимости от типа сетевой активности. Управление осуществляется через ряд переменных sysctl, начинающихся с net.inet.tcp.sendbuf_* и net.inet.tcp.recvbuf_*:

net.inet.tcp.sendbuf_auto=1

net.inet.tcp.recvbuf_auto=1

Пространство пользователя (aka userland)

Первое, что бросается в глаза в новой версии, это полное обновление прикладного программного обеспечения. Особо можно отметить: 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. Причем, в GCC по умолчанию включена защита от атак, направленных на переполнение стека (Stack-Smashing Protector).

До версии 1.0 обновлена библиотека OpenBSM (Open Source Basic Security Module), реализующая Sun BSM – подсистему аудита системных событий, отслеживающую их в реальном времени (была разработана в рамках проекта TrustedBSD).

Список архитектур не изменился: AMD64, i386, ia64, pc98 и PowerPC, однако сейчас ведутся работы по портированию на ARM и UltraSparc T1, поэтому возможно когда-нибудь мы увидим FreeBSD на наладонных устройствах и Sun Niagara.

Скачать продукт можно как через Bittorrent (torrents.freebsd.org:8080), так и через традиционный FTP (ftp://ftp.freebsd.org/pub/FreeBSD). Состав образов не изменился: первый – загрузочный, остальные – с пакетами, плюс отдельный образ с документацией.

Процесс установки не претерпел глобальных изменений, это все тот же старый знакомый sysinstall. Хотя, признаться, ожидал увидеть новый инсталлятор finstall (wiki.freebsd.org/finstall), имеющий более дружелюбный графический интерфейс. Подробнее о нем – смотри на врезке.

Проект Finstall активно развивается. В нем реализованы продвинутые функции, которых нет в sysinstall: возможность запуска с LiveCD и установка по сети. Он написан на языке Python с использованием модуля PyGTK и построен по модульному принципу, в котором front-end и back-end разделены. Такой подход открывает перед разработчиками широкие возможности по модификации и наращиванию функционала. Пока его обещают включить в стандартную поставку в качестве второго дополнительного инсталлятора с версии 7.1 (за исключением архитектур, не поддерживаемых finstall (ia64, pc98 и PowerPC), в которых sysinstall останется единственным средством).

Усовершенствована подсистема Linuxulator, которая позволяет запускать бинарные файлы Linux без модификации и потерь на трансляцию системных вызовов одной ОС в другую. Осуществлен переход на Linuх ядро 2.6.16. Однако по умолчанию эта возможность не включена, так как является экспериментальной (по дефолту используется эмуляция 2.4). Но включить просто, для этого устанавливаем значение sysctl переменной compat.linux.osrelease в «2.6.16».

В утилите freebsd-update, обеспечивающей все обновления безопасности за счет установки двоичных пакетов без необходимости пересборки системы, появилась дополнительная команда upgrade (обновляет систему до последнего релиза).

К сожалению, порт Dtrace, который позволяет «увидеть» процессы, происходящие внутри операционной системы и пользовательских приложений, еще нельзя отнести к стабильным и полностью работоспособным.

Заключение

Даже из такого беглого обзора видно, что нововведения в версии 7.0 носят не косметический, а глобальный характер. Радует улучшенная поддержка многопроцессорных систем на всех уровнях ОС и увеличение списка поддерживаемых устройств и ФС. Администраторы вместе с пользователями оценили новинку и активно переходят на FreeBSD седьмой ветки. Надеюсь, теперь и ты присоединишься к ним.

INFO

Талисманом системы является демоненок Beastie. Есть и еще один, менее известный, талисман: Devilette (ака daemonbabe, daemoness) – девушка в демоническом красном костюме.

В новой фре убраны все утилиты mount_*. Привыкай задавать тип файловой системы через «mount -t»!

Упростить настройку FreeBSD можно за счет использования графических инструментов, разрабатываемых проектом DesktopBSD. Ты найдешь их в портах (sysutils/desktopbsd-tools).

Дерево портов FreeBSD содержит правила сборки для 18000 приложений.

В FreeBSD 8 нас ждут: улучшенный планировщик ULE, bsdlabel, поддерживающий 26 разделов, поддержка загрузки из разделов GPT (GUID partition tables), виртуализация сетевого стека, продолжение работы по портированию Dtrace и многое другое.

WARNING

Реалтековская звуковая карта, без проблем работающая в шестой фре, в седьмой версии запускаться отказалась! Вполне возможно, что с добавлением поддержки нового оборудования модули для поддержки некоторых девайсов были убраны или отключены в настройках по умолчанию.

WWW

В «Руководстве FreeBSD», которое можно прочитать на сайте проекта (www.freebsd.org/doc), ты найдешь ответы на подавляющее количество вопросов по системе. Причем, оно уже давно переведено на русский язык.

Интересные особенности поддержки сети в FreeBSD можно узнать из интервью с разработчиками на www.onlamp.com.

Информацию по всем настройкам ZFS можно получить на странице WiKi – wiki.freebsd.org/ZFS.

Содержание
ttfb: 464.27607536316 ms