Андрей Пешеходов
Файловая система ZFS от Sun Microsystems, вышедшая в 2005 году, явилась
настоящим прорывом в области архитектуры универсальных файловых систем общего
назначения. Однако цели и задачи, которые ставят перед собой разработчики новой
файловой системы btrfs от компании Oracle, впечатляют даже после знакомства с
особенностями ZFS, которую, казалось бы, никто не сможет превзойти еще много
лет.
Btrfs, о начале разработки которой было объявлено в июне 2007 года, находится
сейчас на стадии альфа-версии. Тем не менее основные ее возможности ясны, и
многие из них можно попробовать уже сейчас.
Посмотрим подробнее, что именно
предлагает пользователям Chris Mason – основной разработчик btrfs:
n Поддержка доступных на запись снапшотов.
n Поддержка субтомов – множественных именованных
корней в одной файловой системе с общим пулом хранения.
n Поддержка сложных многодисковых конфигураций –
RAID уровней 0, 1, 5, 6 и 10, а также реализация различных политик избыточности
на уровне объектов ФС – то есть возможно назначить, к примеру, зеркалирование
для какого-либо каталога или файла.
n Copy-on-write (COW)-журналирование.
n Контроль целостности блоков данных и метаданных
с помощью контрольных сумм.
n Зеркалирование метаданных даже в однодисковой
конфигурации.
n Полностью распределенное блокирование. Давно
известно, что все составные объекты множественного доступа, защищаемые
глобальной блокировкой, имеют серьезные проблемы с производительностью. В btrfs
распределенное блокирование реализовано для верхних уровней всех B-деревьев.
Алгоритмы обработки метаданных продуманы таким образом, чтобы не удерживать
блокировки на разделяемых данных во время ожидания ввода/вывода. В ZFS этому
вопросу также уделено серьезное внимание.
n Поддержка ACL.
n Защита от потери данных.
n Выбор хэш-алгоритма.
n Поддержка NFS.
n Флаги совместимости, необходимые для изменения
дискового формата в новых версиях btrfs с сохранением совместимости со старыми.
n Резервные копии суперблока, по крайней мере –
по одной на устройство.
n Скоростные приоритеты для дисков. Диск-итемы btrfs
(своего рода дескрипторы дисков пула; их роль и структура будут показаны ниже)
имеют поля для хранения показателей производительности устройства. Эти счетчики
учитываются при выборе устройства для размещения данных того или иного типа. Аллокатор
также стремится выбирать наименее занятый диск для равномерного распределения
нагрузки по всему пулу.
n Гибридные пулы. btrfs старается перемещать
наиболее используемые данные на самое быстрое устройство, вытесняя с него
«залежавшиеся» блоки. Эта политика хорошо согласуется с появившейся недавно
моделью использования SSD (Solid State Drive). В частности, компания Sun Microsystems
планирует c 2008 года начать выпуск серверов с небольшими SDD, используемыми в
качестве быстрой памяти для наиболее «популярных» данных. К слову сказать, в
ZFS возможности приоретизации дискового трафика не предусмотрено, поэтому Sun
вынуждена будет реализовывать ее на более высоких уровнях, теряя
универсальность такого решения. Справедливости ради стоит заметить, что
поддержка приоритетов устройств может быть относительно легко добавлена и в ZFS
– правда, ценой изменения дискового формата.
n Балансировка данных между устройствами в btrfs
возможна сразу после добавления диска к пулу, отдельной командой – а не только
постепенно, в процессе использования (как это реализовано в ZFS).
n Диски для горячей замены, поддержка которых
появилась и в ZFS.
n Онлайн-конфигурирование RAID будет реализовано
на уровне объектов файловой системы – субтомов, снапшотов, файлов. Возможно
будет также устанавливать некоторые параметры ввода-вывода для каталогов – с
наследованием этих свойств всеми дочерними объектами.
n Выделение и резервирование objectid. В
настоящее время вновь выделенный objectid (аналог номера inode) представляет
собой число, равное последнему objectid+1. Более оптимальным будет
резервирование диапазона objectid каждым каталогом, для чего планируется вести
специальный итем (итемом здесь называется объект B-дерева, инкапсулирующий
какие-либо сторонние, не относящиеся к самому дереву данные). Код выделения inode
также должен искать «дыры» в пространстве ключей, а не просто инкрементировать
последний.
n Производительность вызова fsync(), фиксирующего
на диск все «грязные» данные, является для btrfs большей проблемой, нежели для
других ФС, т.к. объем побочного дискового трафика (за счет множества
метаданных, разбросанных по разным B-деревьям) достаточно велик. Решением
проблемы видится создание своеобразного журнала логических операций и частичный
сброс только пользовательских данных. При частичной фиксации вызов fsync()
будет сбрасывать на диск изменившиеся части только одного дерева, занося
информацию об остальных модификациях в особый итем дерева корней.
Смонтированная после крэша ФС будет считывать эти данные и вносить оставшиеся
изменения уже во время эксплуатации пула, незаметно для пользователя.
n Directory-операции с деревом корней. Дерево
корней в btrfs хранит глобальную информацию о субтомах и снапшотах пула, а
также о других группах метаданных. Со временем дерево корней станет настоящим
каталогом и будет поддерживать все характерные системные вызовы.
n Конвертер из ext2/3/4.
Дизайн
Btrfs реализована на простых и хорошо известных механизмах. Все они должны
давать хороший результат и сразу после mkfs, но более важным разработчики сочли
сохранение хорошей производительности на старой, интенсивно используемой
файловой системе.