Btrfs
Материал из Xgu.ru
btrfs (иногда произносится butter fs) — свободная файловая система, разрабатываемая при поддержке компании Oracle. Распространяется по лицензии GPL. Несмотря на то, что её разработка ещё далека от завершения, 9 января 2009 года файловая система была интегрирована в ядро Linux.
Находится в процессе активной разработки (17 июня 2009 года была выпущена версия 0.19, которая отличается повышенной производительностью).
Многие воспринимают систему как ответ на файловую систему ZFS, которая не может быть включена в состав ядра Linux из-за лицензионной несовместимости с ним (ZFS распространяется по лицензии CDDL, которая несовместима с лицензией GPL, по которой распространяется ядро Linux). Ряд возможностей файловой системы btrfs ранее отсутствовали в файловых системах Linux, таких как, например, ext3 или XFS, но в то же время, они есть в ZFS: Например, файловая система btrfs, так же как и ZFS, интегрирует в свой состав программный RAID, она позволяет делать снимки данных (snapshots) и проверку целостности без размонтирования. В то же время, основатель btrfs и ключевой её разработчик, Крис Масон, говорит, что файловая система возникла не как ответ на ZFS, а сама по себе — в связи с необходимостью решения проблем, которые неизбежно встанут перед Linux-сообществом в ближайшие 10 лет [1].
Возможности, которые поддерживаются в настоящий момент (или будут поддерживаться в ближайшем будущем):
- Проверка целостности без размонтирования;
- Записываемые снимки (writeable snapshots);
- Динамическое выделение индексных дескрипторов (динамические иноды, dynamic inodes);
- Контрольные суммы данных и метаданных;
- Интеграция с device-mapper;
- Поддержка RAID-массивов (одна файловая система на нескольких томах);
- Сжатие;
- Подтома (subvolumes);
- Эффективное клонирование файловой системы и создание инкрементальных архивов;
- Дефрагментация смонтированной файловой системы.
Содержание |
[править] История
В 2006 году, после саммита разработчиков файловых систем, состоявшегося в июне в Сан-Хосе [2], Крис Мэсон (Chris Mason) начал работу над созданием новой файловой системы, btrfs.
В начале 2007 года он сообщает в списке рассылки разработчиков ядра Linux, что первые результаты работы уже готовы (на тот момент это "10 547 строк слабо комментированного кода"), и что желающие приглашаются к тестированию [3].
В ноябре 2007 года (12-23 ноября 2007, или всё же в феврале [4]?) происходит двухдневная встреча разработчиков файловых систем, посвящённая вопросу создания файловой системы нового поколения для Linux (next generation filesystem, NGFS). На встрече присутствуют инженеры компаний Oracle, IBM, Intel, HP и Red Hat, принимающие участие в разработке файловых систем ext2, ext4, OCFS2, lustre, btrfs, AdvFS, Reiser4 и XFS.
В результате было решено [5], что:
- Linux файловая система нового поколения необходима;
- Файловая система Криса Масона, называемая btrfs, наиболее хорошо подходит на роль такой файловой системы;
- Разработка файловой системы нового поколения и переход на неё будут осуществляться продолжительное время, и на этом этапе в качестве основной файловой системы стоит использовать ext4.
В начале 2009 года файловая система btrfs включается в ядро Linux. Разработка файловой системы далека от завершения. Промышленная эксплуатация файловой системы выполняется с 2010.
[править] Работа с файловой системой btrfs
[править] Подготовка файловой системы
Для эксперимента создадим файловую систему в файле. Файл будет привязан к loop-устройству /dev/loop0.
$ dd if=/dev/zero of=img count=200 bs=1024k 200+0 records gelezen 200+0 records geschreven 209715200 bytes (210 MB) gekopieerd, 0,104074 s, 2,0 GB/s $ sudo losetup /dev/loop0 img $ sudo losetup -a /dev/loop0: [2049]:1048607 (/tmp/aaa/img)
$ sudo apt-get install btrfs-tools $ sudo mkfs.btrfs -m single -f /dev/loop0
$ sudo btrfs filesystem show /dev/loop0 Label: none uuid: 01a50fe2-8402-4678-9824-b7b8025a3429 Total devices 1 FS bytes used 28.00KiB devid 1 size 200.00MiB used 12.00MiB path /dev/loop0 btrfs-progs v4.0
[править] Работа с подтомами и снэпшотами
$ sudo btrfs subvolume create /btrfs/sub1 Create subvolume '/btrfs/sub1'
$ sudo dd if=/dev/zero of=/btrfs/sub1/file1 bs=1024k count=50 50+0 records gelezen 50+0 records geschreven 52428800 bytes (52 MB) gekopieerd, 0,0168499 s, 3,1 GB/s b0:aaa$ sudo btrfs subvolume snapshot /btrfs/sub1 /btrfs/sub1s Create a snapshot of '/btrfs/sub1' in '/btrfs/sub1s' b0:aaa$ ls -l /btrfs/sub1s total 51200 -rw-r--r-- 1 root root 52428800 jul 25 13:29 file1
[править] Работа с квотами и определение размеров снэпшотов
$ sudo btrfs quota enable /btrfs/ $ sudo btrfs qgroup show /btrfs/ WARNING: Rescan is running, qgroup data may be incorrect qgroupid rfer excl -------- ---- ---- 0/5 0.00B 0.00B 0/256 50.00MiB 0.00B 0/257 50.00MiB 0.00B
Содаём новый файл на одном из снэпшотов:
$ sudo dd if=/dev/zero of=/btrfs/sub1s/file2 bs=1024k count=50
Пока не видно, что что-то поменялось:
$ sudo btrfs qgroup show /btrfs/ WARNING: Qgroup data inconsistent, rescan recommended qgroupid rfer excl -------- ---- ---- 0/5 0.00B 0.00B 0/256 50.00MiB 0.00B 0/257 50.00MiB 0.00B
[править] Примеры команд по работе с btrfs (неотсортировано)
Создание файловой системы:
mkfs.btrfs
Управление томами, подтомами, снимками; проверка целостности файловой системы:
btrfsctl
Сканирование в поисках файловых систем btrfs:
btrfsctl -a btrfsctl -A /dev/sda2
Создание снимков и подтомов:
mount -t btrfs -o subvol=. /dev/sda2 /mnt btrfsctl -s new_subvol_name /mnt btrfsctl -s snapshot_of_default /mnt/default btrfsctl -s snapshot_of_new_subvol /mnt/new_subvol_name btrfsctl -s snapshot_of_a_snapshot /mnt/snapshot_of_new_subvol ls /mnt
Проверка extent-деревьев файловой системы:
btrfsck
Вывести метаданные в текстовой форме:
debug-tree debug-tree /dev/sda2 >& big_output_file
[править] Создание файловой системы на нескольких устройствах
Сейчас поддерживается RAID-0, RAID-1 и RAID-10. Планируется поддержка RAID-5 и RAID-6 в будущем.
При перестроении RAID-массива и синхронизации блоков на разных дисках, можно копировать только блоки, занятые файловой системой, а не все.
Кроме того, уровень RAID в этом случае не привязан к количеству устройств в нём. Можно добавлять и удалять устройства в RAID-массив произвольно.
Причём можно делать один уровень RAID для данных, а другой — для метаданных. Например:
%# mkfs.btrfs -m raid1 -d raid10 /dev/sda /dev/sdb /dev/sdc /dev/sdd
Метаданные хранятся на массиве RAID1, а данные — на массиве RAID10.
Создание файловой системы на нескольких устройствах:
(копии на всех устройствах)
mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd /dev/sde
Можно монтировать любое из них:
mount /dev/sde /mnt
RAID 0:
mkfs.btrfs -m raid0 /dev/sdb /dev/sdc
RAID 10:
mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
Посмотреть все известные файловые системы btrfs:
btrfs-show
Горячее добавление устройств к файловой системе:
mkfs.btrfs /dev/sdb mount /dev/sdb /mnt btrfs-vol -a /dev/sdc /mnt
Метаданные теперь должны быть на всех устройствах:
btrfs-vol -b /mnt
[править] Превращение файловой системы ext3 в btrfs
Файловую систему ext3 можно превратить в btrfs, и работать с ней дальше уже как с новой файловой системой. Причём состояние исходной файловой системы ext3, будет доступно и потом.
# Always run fsck first %# fsck.ext3 -f /dev/xxx # Convert from Ext3->Btrfs %# btrfs-convert /dev/xxx # Mount the resulting Btrfs filesystem %# mount -t btrfs /dev/xxx /btrfs # Mount the ext3 snapshot %# mount -t btrfs -o subvol=ext2_saved /dev/xxx /ext2_saved # Loopback mount the image file %# mount -t ext3 -o loop,ro /ext2_saved/image /ext3
Теперь в каталоге /ext3 видно состояние исходной файловой системы.
Размонтирование происходит в обратном порядке:
%# umount /ext3 %# umount /ext2_saved %# umount /btrfs
Можно вернуться на файловую систему ext3 и потерять сделанные изменения:
%# btrfs-convert -r /dev/xxx
Или можно остаться на btrfs и удалить сохранённый образ файловой системы ext3:
%# rm /ext2_saved/image
Подробнее: Conversion from ext3 (англ.) и Преобразование ext3fs в btrfs (рус.)
[править] Использование btrfs поверх SSD-накопителей
При использовании btrfs поверх SSD-накопителей рекомендуется использовать опцию -o ssd при монтировании. Это ускоряет запись, особенно для накопителей, у которых медленная произвольная запись [6].
При использовании опции -o ssd в сочетании с обычным накопителями со шпинделями, прироста производительности не наблюдается.
[править] Планы по развитию
(список устарел, часть уже реализована, а часть уже и не будет реализовываться)
Предполагается, что в версии 1.0 файловой системы будут такие возможности:
- Offline fsck and metadata imaging tool
- Compat flags in the super block, tree roots and inodes
- Правильная обработка ENOSPC.
- Поддержка O_DIRECT (без контрольных сумм)
- Поддержка AIO
- Настраиваемые алгоритмы хэширования для каталогов и контрольных сумм (Configurable hash algorithms for directories and checksumming)
- Резервирование количества индексных дескрипторов для каталогов (Inode number reservations for directories)
- Увеличенная производительность fsync (Improved fsync performance)
- Поддержка Fallocate (at least disk format level)
- New directory format to avoid collisions in the inode number index
- Поддержка ACL
- Дерево каталогов подтомов (Directory tree of subvolumes)
- Subvolume quotas and inherited space usage information
- Поддержка NFS
- Additional tunables in the multi-device code, including device latency characteristics and starting offsets for stripe alignment
- Superblock duplication, stripe alignment and rotation
- Удаление снимков
- Автоматизация регресионного тестирования.
- Reserved space for online fsck and the ability to add storage so that a background extent allocation check can proceed
- Дополнительные вызовы ioctl, предназначенные для установки атрибутов индексных дескрипторов (nodatacow, nodatasum и т.д.)
- Disk format requirements for hybrid storage
- Disk format requirements for added raid personalities
- Disk format requirements for coarse grained file data checksumming
- Lost file prevention
- Поддержка преобразования файловых систем ext4 в btrfs (Ext4 conversion program)
Подробнее:
[править] Возможности
Возможности, появившиеся в файловой системе, начиная с версии 0.16 [7]:
- Полностью распределенное блокирование B-дерева. При поиске в B-дереве блокировка узлов теперь спускается вместе с курсором; узлы на верхних уровнях освобождаются по мере необходимости. С блокированием при выделении экстентов все еще есть проблемы, которые должны быть решены в будущем;
- Усовершенствование журналирования данных (режим data=ordered). В режиме data=ordered btrfs будет записывать грязные блоки пользовательских данных до фиксации транзакции. Теперь журналирование данных затрагивает только сами блоки данных и относящиеся к ним экстент-итемы B-дерева. Остальные метаданные транзакции могут сбрасываться на диск параллельно с записью блоков данных (раньше приходилось ожидать сброса пользовательских блоков).
- Поддержка ACL. ACL реализованы и включены по умолчанию.
- Предотвращение потери файлов. Слой Linux VFS и POSIX API заставляют файловую систему разрывать связь между файлом и каталогом до его удаления из ФС (т.е. освобождения его блоков и inode). В случае краха ФС между разрывом связи и удалением этот файл остается на диске, но не имеет имени. Теперь btrfs отслеживает такие случаи и гарантирует полное освобождение всех занимаемых файлом ресурсов в случае краха ФС.
- Новый формат индекса каталога. Btrfs индексирует каталоги двумя способами: первый оптимизирован для быстрого поиска имен, второй возвращает inodes в порядке, близком к их расположению в B-дереве, что важно для высокой производительности при создании полных бэкапов ФС. Теперь в btrfs для элементов каждого каталога введён sequence-номер, с помощью которого устраняются некоторые наихудшие случаи второго способа индексирования для файлов, имеющих множество имен (жестких ссылок) в одном каталоге.
- Уменьшенное время размонтирования. Раньше btrfs ожидала удаления всех старых транзакций перед размонтированием ФС. В новой версии введен кэш учёта ссылок, существенно снижающий нагрузку на диск и улучшающий производительность ФС на всех режимах.
- Улучшения в потоковых записи и чтении. Новый код журналирования данных улучшил производительность потоковой записи. Потоковое чтение усовершенствовано за счет оптимизации пула потоков (threads), занимающихся проверкой контрольный сумм после прочтения данных. Теперь, на машинах с достаточно мощным CPU, производительность режимов datasum и nondatasum практически сравнялась.
[править] Критика
Эдуард Шишкин (Edward Shishkin), один из разработчиков Reiser4, выступил с резкой критикой устройства файловой системы. См. например [8].
[править] История
[править] v0.19, июнь 2009
- Формат ФС изменен. Изменения добавлены в 2.6.31-rc1, однако драйвер ФС обратно совместим с v0.18.
- Заметный прирост производительности на любой нагрузке.
[править] v0.18, 17 января 2009
То же, что и v 0.17, но исправлена небольшая ошибка.
[править] v0.17, 12 января 2009
Изменения:
- Поддержка сжатия файлов (-o compress);
- Управление общими блоками для снимков;
- Создание исходной ФС для снимков (seed filesystem);
- Усовершенствованы алгоритмы выделения блоков.
[править] v0.16, 6 августа 2008
Многочисленные усовершенствования, в том числе:
- Полностью распределенное блокирование B-дерева.
- Усовершенствование журналирования данных (режим data=ordered);
- Поддержка ACL;
- Предотвращение потери файлов;
- Новый формат индекса каталога;
- Уменьшенное время размонтирования;
- Улучшения в потоковых записи и чтении.
[править] 29 мая 2008, v0.15
- Обратные ссылки,
- online-расширение и уменьшение (online growing and shrinking),
- поддержка преобразования файловой системы ext3,
- поддержка режиме data=ordered,
- поддержка записи COW-free.
[править] 30 апреля 2008, v0.14
[править] Дополнительная информация
- btrfs project wiki (англ.) -- wiki-сайт проекта btrfs
- «Архитектура и реализация btrfs» (рус.), Андрей Пешеходов (fresco)
- Linux Don't Need No Stinkin' ZFS: BTRFS Intro & Benchmarks (англ.) — подробное сравнение возможностей BTRFS и ZFS
- zfs vs btrfs comparison (англ.) — ещё одно сравнение
- BTRFS Fun (англ.)
[править] См. также
Сетевые файловые системы с похожими функциями: