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);
  • Эффективное клонирование файловой системы и создание инкрементальных архивов;
  • Дефрагментация смонтированной файловой системы.


Содержание

[править] История

Крис Масон, ведущий разработчик файловой системы btrfs, а также директор по разработке ядра Linux в Oracle (Director of Linux Kernel Engineering, Oracle) на 8м ежегодном Kernel Summit в сентябре 2008 даёт интервью, посвящённое файловой системе btrfs (видео)

В 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], что:

  1. Linux файловая система нового поколения необходима;
  2. Файловая система Криса Масона, называемая btrfs, наиболее хорошо подходит на роль такой файловой системы;
  3. Разработка файловой системы нового поколения и переход на неё будут осуществляться продолжительное время, и на этом этапе в качестве основной файловой системы стоит использовать 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-накопителей

Преимущества использования ключа -o 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

[править] Дополнительная информация

[править] См. также

Сетевые файловые системы с похожими функциями:

Xentaur
Дисковая подсистема
Linux | FreeBSD

Диски и разделы
Файлы устройств: Блочное устройство | Символьное устройство | Raw-устройство | loop-устройство
Диски: IDE | SATA (SATA hotplug) | SCSI | USB
RAID-массивы: Аппаратный RAID | Linux RAID | FreeBSD RAID
Дисковые разделы: Раздел | MBR | fdisk | parted | disklabel | GPT

Управление томами
Логический том | Физический том | Группа томов | Снимок | Клон
device-mapper | dm-ioband | dm-crypt | dm-userspace | multipath
Системы управления томами: LVM | CLVM | EVMS | Btrfs* | ZFS* | AdvFS* | Zumastor

Сетевые хранилища и репликация
Отказоустойчивость: DRBD | Xen + DRBD | ggate + gmirror | HAST
Сетевые хранилища: AoE | iSCSI | FCoE | GNBD

Файловые системы
Монтирование | Проверка целостности | Дефрагментация | Суперблок | inode | Журнал | Кэш | VFS | UUID | FUSE
Локальные: ext3 | ext3cow | ext4 | JFS | Reiser4 | XFS | ZFS | Btrfs | AdvFS | ISO | aufs
Сетевые: NFS | CIFS | AFS | POHMELFS
Кластерные: GFS | OCFS2 | CXFS | VMFS | GPFS
Распределенные: Lustre | PVFS | Ceph | Coda

* Btrfs, ZFS и AdvFS — это файловые системы с возможностями управления томами
Источник — «http://xgu.ru/wiki/Btrfs»
На других языках