Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #127, ИЮЛЬ 2009 г.

На пути к совершенству. Обзор интересных новшеств мира Linux

Евгений Зобнин (zobnin@gmail.com)


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

Очеловечивание пакетного фильтра

Система фильтрации пакетов ядра Linux прошла долгий путь развития. В ядре версии 2.0 появилась первая реализация BSD-подобного межсетевого экрана ipfw и закрепленная за ним утилита управления ipfwadm. В версии 2.2 их сменил файрвол ipchains. С выходом ветки 2.4 он, в свою очередь, был вытеснен связкой netfilter/iptables. Netfilter действительно хорош: он грамотно спроектирован; обладает мощными возможностями для конфигурирования таких фич, как трансляция сетевых адресов, прозрачное проксирование, перенаправление трафика, балансировка нагрузки; умеет отслеживать состояние соединений (stateful firewalling). Это позволяет распознавать и блокировать, например, stealth-сканирование; а благодаря дополнительным плагинам он способен обрабатывать пакеты практически любого типа. Огорчает только способ его конфигурирования, который основан на передаче невнятных аргументов командной строки утилите iptables.

Можно долго спорить о преимуществах и недостатках способа настройки, предлагаемого iptables, но факт остается фактом: он слишком громоздок и ориентирован на машину, а не человека. Команда разработчиков netfilter уже не раз смотрела в сторону альтернативных систем конфигурирования, предложенных пакетным фильтром pf и различными обертками вокруг iptables (например ferm, ferm.foo-projects.org). Переписать только саму утилиту не представлялось возможным, потому как она была тесно связана с кодом ядра. Patrick McHardy, один из активных разработчиков подсистемы netfilter, взялся за переработку всей системы фильтрации пакетов. Надо сказать, она и без того страдала от других недостатков (необходимость в перезагрузке всех правил во время их обновления, возможность задавать только одну цель для каждого правила, непродуманный механизм расширений, слишком плоская модель кода, не допускающая создавать высокоуровневые абстракции, противоречивые способы сопоставления с шаблоном).

В результате на свет появился nftables – пакетный фильтр нового поколения, состоящий из трех взаимосвязанных частей:

  1. Пакетный фильтр, работающий внутри ядра.
  2. Утилита пользовательского уровня nft.
  3. Библиотека libnl, связывающая код ядра и утилиту nft через механизм netlink.

Утилита nft читает файл конфигурации (который теперь похож скорее на скрипт, чем на список правил), генерирует на его основе простой компактный псевдокод и передает эти данные ядру. Код nftables, работающий внутри ядра, разбирает псевдокод и применяет его правила к проходящим по цепочкам пакетам.

Для конфигурирования nft применяется настоящий язык программирования, который позволяет задавать условия, создавать переменные, выполнять математические операции. Он прост в освоении и достаточно развит для создания сложнейших правил обработки пакетов. Приведенный автором проекта код фильтрации исходящего трафика выглядит так:

Пример конфигурационного файла nftables

include "ipv4-filter"

chain filter output {
ct state established,related accept
tcp dport 22 accept
counter drop
}

А способ инкрементального добавления правил очень похож на то, как это делается в OpenBSD:

# nft add rule output tcp dport 22 log accept

Генерируемый на выходе псевдокод прост и прямолинеен. Львиную долю работы по проверке правил возложили на компилятор nft. Это позволило существенно сократить код фильтрации, работающий внутри ядра. Теперь он выполняет только базовый набор действий, таких как разбор пакетов, сравнение данных и т.д.

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

Очередное расширение

Для Linux было создано и портировано из других операционок огромное количество файловых систем, но только одна из них может гордо носить имя официальной - это файловая система ext3.

ФС ext3 - уже третья эволюция стандартной файловой системы Linux. До нее была ext2, в основном отличающаяся отсутствием журнала. Еще раньше была ext, первая файловая система, созданная специально для Linux. Однако надолго в ядре она не задержалась (этому способствовали многочисленные ограничения, такие как максимальный размер в 2 Гб и отсутствие поддержки дат модификации файлов).

Четвертая реинкарнация файловой системы ext (июнь 2006) стала следствием требований разработчиков – новые функции и возможности могли нарушить обратную совместимость или сделать файловую систему нестабильной и слишком сложной для поддержки. Спустя 5 месяцев предварительная версия ext4 появляется в ядре Linux 2.6.19, помеченная как «экспериментальная разработка». Допиливание файловой системы продолжалось больше года, и только с выходом ядра версии 2.6.28 (25 декабря) ext4 становится стабильной и рекомендованной для повсеместного тестирования.

Из-за отсутствия требований к обратной совместимости разработчики ext4 смогли применить самые изощренные техники для повышения производительности, надежности и расширяемости файловой системы. Далее мы рассмотрим все ключевые новшества ext4, которые позволили ей стать одной из самых производительных и богатых на функциональность файловых систем:

  • 48-битная адресация блоков. Размер файловой системы ext3 ограничен 16 терабайтами, а размер файла - двумя, что может быть недостаточно для больших хранилищ данных и систем потокового вещания мультимедиа. Файловая система ext4 использует 48-битную адресацию блоков и доводит эти ограничения до фантастических в наши дни 1 экзабайта (1 Эб = 1048576 Тб) и 16 Тб соответственно.
  • Механизм пространственной записи файлов. Файловая система ext3 использует традиционную методику слежения за блоками данных файлов, основанную на карте соответствия. Последняя представляет собой закрепленный за файлом список адресов блоков файловой системы, хранящих информацию этого файла. Во время чтения или записи в файл файловая система проходит по карте соответствия в поисках нужного блока. Недостаток: низкая эффективность. Карта соответствия большого файла может содержать от нескольких десятков до сотен тысяч записей, проход по которым отнимет значительное время. ФС ext4 использует более современный подход. Он основан на так называемых экстентах, которые представляют собой непрерывную последовательность блоков, закрепленных за файлом. Там, где ext3 требовалась карта соответствия с 10 тысячами элементов, ext4 может хранить информацию о закрепленных за файлом блоках всего лишь в нескольких экстентах. Благодаря этому механизму ext4 стала более производительной и менее подверженной фрагментации.
  • Многоблочное распределение. Перед записью данных на диск файловая система должна найти нужное количество свободных блоков для размещения данных. ФС ext3 использует для этого технику поблочного распределения, когда за один проход может быть найден только один свободный блок. Эта особенность делает ext3 более медленной в сравнении с другими современными файловыми системами. ФС ext4 хранит не только информацию о количестве и адресах свободных блоков, но и данные об их непрерывных областях, которые обрабатываются за один проход. Это позволяет сократить время распределения блоков для новых данных и снизить уровень фрагментированности ФС.
  • Отложенное распределение. В отличие от ext3, которая распределяет блоки под новые данные сразу, ext4 откладывает эту операцию насколько это возможно. Например, если приложение делает системный вызов write(), чтобы дописать данные к существующему файлу, выделение блоков для этой операции в ext4 будет отложено до момента фактической записи на диск. Та может произойти либо после вызова sync(), либо в момент записи кэша на диск. В совокупности с многоблочным распределением новый подход дает существенный прирост производительности.
  • Предварительное распределение. Существует целый класс приложений, которым необходимо заранее выделять дисковое пространство под файлы. Это различные системы бэкапа, клиенты p2p-сетей и любые программы, от которых требуется стабильная и устойчивая работа. Еще совсем недавно для выполнения этой операции приложениям приходилось самостоятельно создавать пустые файлы, заполненные нулями. Затем разработчики ввели функцию libc posix_fallocate(), которая, по сути, занималась тем же самым. И только в последних версиях файловой системы ext3 и новой ext4 появилась возможность заранее распределить дисковое пространство на уровне файловой системы. Это позволило поднять скорость выполнения операции и снизить фрагментацию за счет однократного непрерывного выделения блоков.
  • Больший размер inode. Размер inode увеличен со 128 до 256 байт, и появилась возможность увеличить точность временных меток (время создания и модификации файлов) до наносекунды и вместить в inode несколько расширенных атрибутов. Последнее означает, что доступ к атрибутам ACL, SELinux, Samba и другим теперь может происходить до 3-7 раз быстрее.
  • Резервирование inode. При создании каталогов файловая система заранее выделяет несколько inode, за которыми в будущем могут быть закреплены вновь созданные файлы. Такая техника увеличивает скорость создания файлов за счет экономии времени на выделение для них inode.
  • Группы неиспользуемых inode. Файловая система ext4 хранит информацию о неиспользуемых inode, что позволяет утилите fsck обойти эти индексные дескрипторы стороной во время проверки файловой системы. Выигрыш в скорости проверки может составить от 2 до 20 раз, в зависимости от заполненности файловой системы.
  • Контрольные суммы журнала. ФС ext4 хранит контрольные суммы для каждой журнальной транзакции. Это делает файловую систему более надежной в сравнении с ext3, ошибка в журнале которой может привести к последующей порче данных во время проверки файловой системы.
  • Онлайн-дефрагментация. В будущем планируется реализовать возможность «самодефрагментации» файловой системы по мере появления в этом необходимости. Пока же доступна специальная утилита e4defrag, способная дефрагментировать как отдельные файлы, так и всю файловую систему.
  • Неограниченное количество подкаталогов. Максимальное количество подкаталогов в ext3 - 32000. Новая ФС полностью снимает это ограничение.

Несмотря на отсутствие поддержки обратной совместимости в самой ФС, драйвер ext4 поддерживает прямую совместимость со своей предшественницей. ФС ext3 можно смонтировать в режиме ext4, используя при этом большинство преимуществ новой ФС.

Новый этап в развитии Grub

Вместе с пингвином развиваются и средства его загрузки. Еще совсем недавно единственным загрузчиком Linux был неуклюжий, но хорошо справляющийся со своими задачами LiLo. Позднее его сменил пришедший из мира GNU/Hurd «многоцелевой» grub, который по уровню функциональности вполне мог потягаться с первыми версиями операционной системы MS-DOS.

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

  • Поддержка скриптинга, включая условия, циклы, переменные и функции.
  • Графический интерфейс.
  • Динамическая загрузка модулей (дает возможность расширения загрузчика во время работы, а не во время компиляции).
  • Портабельность на множество архитектур.
  • Интернационализация. Поддержка не-ASCII кодировок, каталоги сообщений по типу gettext, шрифты, графические консоли и т.д.
  • Настоящее управление памятью (делает загрузчик более расширяемым).
  • Модульный, иерархический, объектно-ориентированный фреймворк для файловых систем, файлов, дисков, терминалов, команд, таблиц разделов и загрузчиков ОС.
  • Кросс-платформенная установка (позволяет инсталлировать grub с разных архитектур).
  • Спасательный режим для «незагружаемых случаев».
  • Избавление от Stage 1.5.
  • Исправление ошибок дизайна grub1, которые не могли быть решены с сохранением обратной совместимости (например, способ именования разделов).

С точки зрения рядового пользователя grub2 интересен красивым внешним видом, поддержкой различных шрифтов и полностью автоматизированным процессом настройки. Впечатляет, что варианты графического оформления - не просто шкурки, а совершенно разные системы меню. Они могут коренным образом отличаться друг от друга. Загрузчик стал гораздо умнее: конфигурационный файл /boot/grub/grub.cfg теперь содержит прямое упоминание о том, что вместо его ручного редактирования следует воспользоваться командой update-grub. Команда сама найдет все установленные операционные системы и подсобные самодостаточные утилиты (memtest86, например) и добавит их в конфигурационный файл.

В новой версии код загрузчика разбит на множество модулей, которые могут быть загружены в любой момент. Stage 1.5 (второй компонент бутлоадера, располагающийся в начале файловой системы), наконец, остался в прошлом, благодаря чему grub стал более гибким и устойчивым к сбоям.

Особое мнение разработчиков Debian

В отличие от BSD-систем, большинство компонентов которых развивает одна команда разработчиков, дистрибутивы Linux держатся на кирпичиках, созданных независимыми командами. Дворец, именуемый «операционная система Linux», построен огромным количеством людей, и каждый из них имеет собственное представление об удобстве, стиле и подходе к написанию приложений. Такая ситуация доставляет множество проблем создателям дистрибутивов, но зато оставляет право выбора (не нравится - приготовь сам). Разработчики дистрибутива Debian воспользовались этим правом, чтобы заменить один из главных компонентов ОС Linux - стандартную библиотеку языка Си.

Это может показаться странным, но мантейнеры наиважнейшего компонента ОС Linux, библиотеки glibc (GNU C Library), умудрились довести свою разработку до такого состояния, что недовольным пришлось создать собственную группу поддержки их продукта. Стартовавший совсем недавно проект eglibc занялся поддержкой особой версии glibc, которая бы не только решала проблемы сопровождения библиотеки, но и позволяла использовать ее во встраиваемых системах. Проект был быстро взят на вооружение мантейнерами Debian. Их аргументы были более чем весомы:

  • Более открытое сообщество разработчиков.
  • Развивающаяся стабильная ветка, в которой регулярно происходит исправление ошибок (в случае с glibc разработчикам дистрибутивов приходится поддерживать собственные ветки библиотеки, содержащие багфиксы).
  • Поддержка встраиваемых систем (glibc ориентирована на десктопы и серверы).
  • Поддержка множества командных интерпретаторов (glibc поддерживает только bash).
  • Возможность сборки библиотеки с оптимизацией по размеру (флаг gcc '-Os').
  • Гибкая система настройки, позволяющая исключить ненужные компоненты библиотеки.

Библиотека eglibc полностью бинарно совместима с glibc и уже используется другим известным проектом OpenWrt (openwrt.org).

Борьба за безопасность

В начале 2006 года компания Novell анонсировала новую систему создания политик безопасности для приложений. Проект получил имя AppArmor и был нацелен на тех пользователей и системных администраторов, которым требовалась более удобная и простая в сопровождении альтернатива SELinux. Однако, к несчастью компании, AppArmor не смог составить достойной конкуренции SELinux, и Novell пришлось отказаться от применения новой разработки в своих дистрибутивах.

Провал AppArmor не был вызван головотяпством маркетологов Novell. Причины неудачи носили чисто технический характер. Одной из них был неэффективный, по мнению специалистов, способ привязки политик безопасности к файловому пути (а не к объекту, как это сделано в SELinux). Другая проблема - костыли в коде, которые пришлось нагородить, потому что механизм LSM (Linux Security Modules) не предусматривал возможности привязки действий по обеспечению ограничений приложения к файловому пути. Мантейнеры Linux-ядра обозвали присланные Novell патчи кашей, которую просто некошерно включать в основной код.

Несмотря на все это, идея привязки политик безопасности к файловому пути была слишком лакомым кусочком, чтобы кто-то другой не заинтересовался ей и не попытался реализовать вновь. Одними из таких людей стали разработчики MAC-системы TOMOYO Linux (elinux.org/TomoyoLinux). Пройдя долгий и тернистый путь, сопровождаемый множеством переработок дизайна, они добились-таки включения своей разработки в ядро версии 2.6.30.

Набор модулей ядра TOMOYO Linux очень похож на AppArmor, но концептуально более изящен. Он прост в использовании и поддерживает режим обучения, однако пока не представляет той гибкости, которой обладает SELinux.

Другая система обеспечения безопасности, принятая в ядро версии 2.6.30, была разработана сотрудниками IBM. Она представляет собой инфраструктуру для контроля целостности исполняемых файлов. Ее следует использовать совместно с SELinux или Slim (Simple Linux Integrity Module - простая реализация песочницы, используемая в серверном ПО IBM). Система предоставляет набор средств, которые позволяют привязать цифровую подпись и контрольную сумму к любому файлу. Если злоумышленник получит прямой доступ к машине и сможет воспользоваться LiveCD для модификации файлов основной системы, система заблокирует доступ к измененным файлам после следующей загрузки.

Мигрируем на ext4fs

Сейчас мы разберемся, как перейти на ext4 без потери данных. Сразу должен предупредить: после выполнения приведенных действий ext3-раздел больше нельзя будет смонтировать как ext3 – только как ext4!

Открой терминал и набери:

# tune2fs -O extents,uninit_bg,dir_index /dev/имя_устройства

На момент ввода этой команды устройство должно быть размонтировано. Если требуется преобразовать корневую файловую систему в ext4, то команду следует вводить с LiveCD.
После этого проверим файловую систему:

# fsck -pf /dev/имя_устройства

Монтирование файловой системы производится следующим образом:

# mount -t ext4 /dev/имя_устройства /точка_монтирования
# mount -t ext4 /dev/disk/by-uuid/UUID-устройства /точка_монтирования

Если раздел автоматически монтируется через /etc/fstab, не забудь исправить файловую систему на ext4:

UUID=UUID-раздела /точка ext4 defaults,errors=remount-ro,relatime 0 1

Если ты изменил тип файловой системы корневого раздела, то необходимо отредактировать файл /boot/grub/menu.lst и добавить опцию «rootfstype=ext4» в список параметров ядра. Например:

title Linux
root (hd0,1)
kernel /boot/vmlinuz-2.6.28.1 root=UUID=879f797c-944d-4c28-a720-249730705714 ro quiet splash rootfstype=ext4
initrd /boot/initrd.img-2.6.28.1
quiet

Денис Колисниченко (dhsilabs@mail.ru, www.dkws.org.ua), автор многих книг и статей, посвященных Linux.

Критика ext4

Многочисленные техники, направленные на увеличение производительности новой файловой системы, сыграли злую шутку с ее создателями. Резкая критика обрушилась в их адрес после включения поддержки ext4 в дистрибутив Ubuntu. Суть проблемы заключалась в следующем: благодаря отложенному распределению и увеличению периода сброса данных на диск, между созданием нового файла и его фактической записью на диск могло проходить до 150 секунд. Если в течение этого периода происходило отключение питания компа, файл бесследно исчезал. Разработчики ext4 сняли с себя ответственность, сказав, что подобным образом ведет себя любая современная ФС (XFS, Reiser4), а пинать следует разработчиков приложений, которые не заботятся о выполнении системного вызова sync() после записи важных данных. В пример был поставлен редактор emacs, который никогда не теряет файлы на ext4.

Назад в прошлое: командный интерпретатор в ядре

Unix стал первой операционной системой, командный интерпретатор которой был вынесен в отдельный процесс. Matt Ranon решил вернуть все на прежние места и представил патч с реализацией интерфейса командной строки в ядре Linux. Kcli базируется на библиотеке libcli и предназначен для применения в монолитных образах Linux для встраиваемых систем.

INFO

Несмотря на все достоинства и уникальные черты, файловая система ext4 - не долгосрочное решение, а лишь промежуточный шаг на пути к btrfs, файловой системе нового поколения, которая должна стать официальной ФС Linux через несколько лет.

В рамках акции по защите австралийского Тасманского Дьявола от вымирания, Linux-ядро версии 2.6.29 получило новый логотип, на который ты можешь полюбоваться, открыв файл Documentation/logo.svg.

Содержание