Btrfs

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Btrfs and the translation is 89% complete.

Outdated translations are marked like this.
Other languages:
English • ‎español • ‎italiano • ‎polski • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

Btrfs — это copy-on-write (копирование при записи (CoW)) файловая система для Linux, предназначенная для реализации расширенных возможностей, с уделением особого внимания отказоустойчивости, восстановлению и простоте администрирования. Совместно разработана Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO и многими другими. Btrfs лицензирована под GPL лицензией и открыта для участия всех желающих.

Возможности

Ext4 является безопасной и стабильной и может обрабатывать большие файловые системы с экстентами, но зачем переключаться? Хотя Btrfs все еще считается экспериментальной, стабильность её растет, и время, когда Btrfs станет файловой системой по умолчанию для систем Linux, становится все ближе. Некоторые дистрибутивы Linux уже начали переключаться на нее в своих текущих релизах. Btrfs имеет ряд дополнительных функций, общих с ZFS, которые и сделали файловую систему ZFS популярной для BSD дистрибутивов и устройств NAS.

  • "Копирование при записи" и создание снимков - Делает инкрементные резервные копии безболезненными даже из "активной" файловой системы или виртуальной машины (ВМ).
  • Контрольные суммы уровня файла - Метаданные для каждого файла включают контрольную сумму, которая используется для обнаружения и исправления ошибок.
  • Сжатие - Файлы могут быть сжаты и распакованы "на лету", что ускоряет работу чтения.
  • Автоматическая дефрагментация - Файловые системы настраиваются фоновым потоком, в то время как они используются.
  • Подтома - Файловые системы могут совместно использовать одно общее пространство (pool) вместо того, чтобы размещаться в собственных разделах.
  • RAID - Btrfs осуществляет свои собственные реализации RAID, поэтому LVM или mdadm не требуются для RAID. В настоящее время поддерживаются RAID 0 и 1; на подходе RAID 5 и 6.
  • Разделы являются необязательными - Хотя Btrfs может работать с разделами, она может напрямую использовать неформатированные устройства (/dev/<device>).
  • Дедупликация данных - Существует ограниченная поддержка дедупликации данных; однако, дедупликация в конечном итоге станет стандартной функцией в Btrfs. Это позволяет Btrfs экономить место, сравнивая файлы через бинарные изменения (binary diff).
Совет
Обновленный и отчасти исчерпывающий список функций смотрите на странице статуса проекта. Однако не все функции достаточно стабильны для повсеместного использования.

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

Установка

Ядро

Активируйте следующий параметр ядра, чтобы включить поддержку файловой системы Btrfs:

Ядро Включение Btrfs в ядре
File systems  --->
    <*> Btrfs filesystem

Emerge

Пакет sys-fs/btrfs-progs содержит утилиты необходимые для работы с файловой системой Btrfs.

root #emerge --ask sys-fs/btrfs-progs

Использование

Ввод длинных команд Btrfs может быстро надоесть. Каждая команда (кроме начальной команды btrfs) может быть сведена к очень короткому набору инструкций. Этот метод полезен при работе в командной строке, чтобы уменьшить количество вводимых символов.

Например, ниже показана длинная команда, чтобы дефрагментировать файловую систему расположенную в /.

root #btrfs filesystem defragment -v /

Сократите каждую из длинных команд после команды btrfs, уменьшив их до их уникального, кратчайшего префикса. В этом контексте уникальный означает, что нет других команд btrfs, которые соответствуют команде в самом коротком её варианте. Укороченная версия указанной команды:

root #btrfs fi de -v /

Никакие другие команды btrfs не начинаются с fi; filesystem - единственная. То же самое относится к подкоманде de команды filesystem.

Создание

Предупреждение
Команда mkfs.btrfs необратимо уничтожит все содержимое раздела, который будет форматироваться. Пожалуйста убедитесь, что выбран правильный диск и раздел перед запуском какой-либо mkfs команды!

Чтобы создать файловую систему Btrfs на разделе /dev/sdXN:

root #mkfs.btrfs /dev/sdXN

В примере выше замените N на номер раздела, а X на букву диска. Например, чтобы отформатировать в Btrfs третий раздел на первом диске запустите:

root #mkfs.btrfs /dev/sda3
Важно
Для всех разделов Btrfs в файле /etc/fstab в последней колонке нужно выставить 0. Нет нужды запускать fsck.btrfs и btrfsck при каждом запуске системы.

Монтирование

После создания, файловую систему можно смонтировать несколькими способами:

  • mount - смонтировать вручную.
  • fstab - определить точку монтирования в файле /etc/fstab, что позволит автоматически монтировать файловую систему во время загрузки.
  • съемные носители - автоматическое монтирование по запросу (полезно для USB-носителей).
  • AutoFS - автоматическая настройка для доступа к файловой системе.

Конвертация ext* файловых систем

Можно сконвертировать файловые системы ext2, ext3 и ext4 в Btrfs с помощью утилиты btrfs-convert.

Следующие инструкции подходят только для преобразования отмонтированных файловых систем. Чтобы сконвертировать root-раздел, загрузитесь с системного аварийного диска (SystemRescueCD работает отлично) и запустите команду конвертации для root-раздела.

Сперва убедитесь, что отмонтировали раздел:

root #umount <mounted_device>

Проверьте целостность файловой системы с помощью соответствующей утилиты fsck. Далее показан пример для файловой системы ext4:

root #fsck.ext4 -f <unmounted_device>

Воспользуйтесь btrfs-convert для того чтобы сконвертировать отформатированное в ext* устройство в Btrfs:

root #btrfs-convert <unmounted_device>

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

Файл /etc/fstabЗамена ext4 на btrfs
<device>   <mountpoint>  btrfs  defaults  0 0

Дефрагментация

Другая полезная функция Btrfs это онлайн дефрагментация. Чтобы дефрагментировать файловую систему root с Btrfs запустите:

root #btrfs filesystem defragment -r -v /
Предупреждение
Дефрагментация с версиями ядра < 3.9 или ≥ 3.14-rc2, а также со стабильными версиями ядра Linux ≥ 3.10.31, ≥ 3.12.12 или ≥ 3.13.4 разрывает ссылки между файлами и их копиями COW[1] и, таким образом, может значительно увеличить использование пространства. Убедитесь, что достаточно свободного места и не слишком много снимков на диске, так как заполненные разделы btrfs могут быть очень медленными.

Сжатие

Btrfs поддерживает прозрачное сжатие с помощью алгоритмов zlib, lzo и zstd[2].

Можно сжать конкретный файл с помощью атрибутов файла:

user $chattr +c

Параметр монтирования compress по умолчанию сжимает все вновь созданные файлы. Чтобы повторно сжать всю файловую систему выполните следующую команду:

root #btrfs filesystem defragment -r -v -clzo /

В зависимости от производительности процессора и диска использование сжатия lzo может улучшить общую пропускную способность.

Можно использовать алгоритм сжатия zlib вместо lzo. zlib более медленный, но имеет более высокую степень сжатия:

root #btrfs filesystem defragment -r -v -czlib /

Уровень сжатия

Начиная с версии ядра 4.15.0[3], сжатие zlib можно установить с помощью уровней 1-9. Например, чтобы задать для zlib максимальное сжатие во время монтирования:

root #mount -o compress=zlib:9 /dev/sdXY /path/to/btrfs/mountpoint

Или установить минимальное сжатие:

root #mount -o compress=zlib:1 /dev/sdXY /path/to/btrfs/mountpoint

Или отрегулируйте сжатие путем перемонтирования:

root #mount -o remount,compress=zlib:3 /path/to/btrfs/mountpoint

Уровень сжатия должен быть виден в /proc/mounts или путем проверки последних выходных данных dmesg | grep -i btrfs.

root #dmesg | grep -i btrfs
[    0.495284] Btrfs loaded, crc32c=crc32c-intel
[ 3010.727383] BTRFS: device label My Passport devid 1 transid 31 /dev/sdd1
[ 3111.930960] BTRFS info (device sdd1): disk space caching is enabled
[ 3111.930973] BTRFS info (device sdd1): has skinny extents
[ 9428.918325] BTRFS info (device sdd1): use zlib compression, level 3


Коэффициент сжатия и использование диска

The usual userspace tools for determining used and free space like du and df may provide inaccurate results on a Btrfs partition due to inherent design differences in the way files are written compared to ,for example, ext2/3/4[4].

It is therefore advised to use the du/df alternatives provided by the btrfs userspace tool btrfs filesystem. In Addition to that, The compsize tool found from the sys-fs/compsize package can be helpful in providing additional information regarding compression ratios and the disk usage of compressed files. The following are example uses of these tools for a btrfs partition mounted under /media/drive.


user $btrfs filesystem du -s /media/drive
     Total   Exclusive  Set shared  Filename
 848.12GiB   848.12GiB       0.00B  /media/drive/
user $btrfs filesystem df /media/drive
Data, single: total=846.00GiB, used=845.61GiB
System, DUP: total=8.00MiB, used=112.00KiB
Metadata, DUP: total=2.00GiB, used=904.30MiB
GlobalReserve, single: total=512.00MiB, used=0.00B
user $compsize /media/drive
Processed 2262 files, 112115 regular extents (112115 refs), 174 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
TOTAL       99%      845G         848G         848G       
none       100%      844G         844G         844G       
zlib        16%      532M         3.2G         3.2G 

Multiple devices (RAID)

Btrfs can be used with multiple devices in order to create RAIDs. Using Btrfs to create filesystems that span multiple devices is much easier than creating using mdadm; there is no initialization time needed for creation.

The simplest method is to use the entirety of the unpartitioned block device to create a filesystem that spans multiple devices. For example, to create a filesystem in RAID1 mode across two devices:

root #mkfs.btrfs -m raid1 <device1> <device2> -d raid1 <device1> <device2>

Converting between RAID modes is possible with the balance sub-command. For example, say a multiple device RAID 1 is mounted at /srv. It is possible to convert this RAID1 to RAID0 with using the following command:

root #btrfs balance start -dconvert=raid0 -mconvert=raid0 --force /srv

RAID mode conversion can be performed while the filesystem is online and in use. Possible RAID modes in btrfs include RAID0, RAID1, RAID5, RAID6, and RAID10. See the upstream BTRFS wiki for more information.

Предупреждение
В настоящее время не безопасно использовать уровни RAID 5 или 6[5]. В уровнях RAID 5 и 6 были исправления[6] в Linux 4.12, но общее состояние по-прежнему помечено как нестабильное.[7][8]. Пользователям, которые хотят использовать функции btrfs RAID5 или RAID6, рекомендуется проверять страницу состояния btrfs на предмет стабильности указанных уровней перед их использованием.

Подтома

Как уже упоминалось выше в списке функций, Btrfs может создавать подтома. Подтома могут быть использованы, чтобы лучше организовать и управлять данными. Они становятся особенно мощными в сочетании с моментальными снимками. Важное различие должно быть сделано между подтомами Btrfs и подтомами созданными менеджером логических томов (LVM). Подтома Btrfs не являются устройствами уровня блока, они представляют собой пространства имен файлов POSIX.[9] Они могут быть созданы в любом месте файловой системы и будут действовать как любой другой каталог в системе с одной оговоркой: подтома могут быть смонтированы и размонтированы. Подтома вкладываемы (подтома могут быть созданы внутри других подтомов), и легко создаются или удаляются.

Заметка
Подтом не может быть создан между разными файловыми системами Btrfs. Если /dev/sda и /dev/sdb содержат отдельные (не RAID-массивы) файловые системы Btrfs, то нет возможности, чтобы подтом можно было бы распределить по двум файловым системам. Снимок можно перенести из одной файловой системы в другую, но он не может охватывать обе. Он должен быть на /dev/sda или /dev/sdb.

Создание

Чтобы создать подтом, выполните следующую команду внутри пространства имен файловой системы Btrfs:

root #btrfs subvolume create <dest-name>

Замените <dest-name> на желаемое место и имя подтома. Например, если существует файловая система btrfs в /mnt/btrfs, подтом может быть создан внутри неё, используя следующую команду:

root #btrfs subvolume create /mnt/btrfs/subvolume1

Список

Чтобы увидеть созданный(е) подтом(а), используйте команду subvolume list в соответствующем месте файловой системы Btrfs. Если текущий каталог находится где-то внутри файловой системы Btrfs, следующая команда отобразит подтом(а), которые существуют в файловой системе:

root #btrfs subvolume list .

Если в точке монтирования файловой системы Btrfs, существуют подтома, созданные командой из примера выше, вывод команды списка будет выглядеть примерно так:

root #btrfs subvolume list /mnt/btrfs
ID 309 gen 102913 top level 5 path mnt/btrfs/subvolume1

Удаление

Подтома могут быть корректно удалены с помощью команды subvolume delete, за которой следует путь к подтому. Все доступные пути подтомов в файловой системе Btrfs можно увидеть, используя приведенную выше команду списка.

root #btrfs subvolume delete <subvolume-path>

Как и выше, замените <subvolume-path> на фактический путь к подлежащему удалению подтому. Чтобы удалить подтом, используемый в приведенных выше примерах, будет выполнена следующая команда:

root #btrfs subvolume delete /mnt/btrfs/subvolume1
Delete subvolume (no-commit): '/mnt/btrfs/subvolume1'

Снимки

Снимки - это подтома, которые обмениваются данными и метаданными с другими подтомами. Это стало возможным благодаря способности Btrfs копирование при записи (CoW).[9] Снимки можно использовать для нескольких целей, одной из которых является создание резервных копий структур файловой системы в определенные моменты времени.

Если корневая файловая система - это Btrfs, то можно создать снимок с помощью команды subvolume snapshot:

root #mkdir -p /mnt/backup/rootfs
root #btrfs subvolume snapshot / /mnt/backup/rootfs/

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

Файл btrfs_snapshot.shПример задачи cron для снятия снимка с root файловой системы Btrfs
#!/bin/bash
NOW=$(date +"%Y-%m-%d_%H:%M:%S")
 
if [ ! -e /mnt/backup ]; then
mkdir -p /mnt/backup
fi
 
cd /
/sbin/btrfs subvolume snapshot / "/mnt/backup/backup_${NOW}"

Монтирование

Подтом может быть смонтирован в месте, отличном от того, где он был создан, или пользователи могут не монтировать их вообще. Например, пользователь может создать файловую систему Btrfs в /mnt/btrfs и создать подтома /mnt/btrfs/home и /mnt/btrfs/portage. Затем подтома могут быть смонтированы в /home и /usr/portage, при этом исходный верхний уровень подтома оставлен не примонтированным. Это приводит к конфигурации, в которой относительные пути подтомов от верхнего уровня подтома отличаются от их фактического пути.

Чтобы смонтировать подтом, выполните следующую команду, где <rel-path> - это относительный путь подтома от подтома верхнего уровня, который можно получить через команду subvolume list:

root #mount -o subvol=<rel-path> <device> <mountpoint>

Аналогично, можно обновить колонку filesystem, чтобы смонтировать подтома Btrfs следующим образом:

Файл /etc/fstabМонтирование подтомов
<device>  <mountpoint>  btrfs  subvol=<rel-path>  0 2

Устранение проблем

Using with VM disk images

When using Btrfs with virtual machine disk images, it is best to disable copy-on-write on the disk images in order to speed up IO performance. This can only be performed on files that are newly created. It also possible to disable CoW on all files created within a certain directory. For example, using the chattr command:

root #chattr +C /var/lib/libvirt/images

Очистка кэша свободного места

Можно очистить кэш свободного места Btrfs путем монтирования файловой системы с помощью параметра монтирования clear_cache. Например:

root #mount -o clear_cache /path/to/device /path/to/mountpoint

Btrfs захват памяти (дискового кеша)

При использовании некоторых специальных способностей Btrfs (таких как создание множества --reflink копий или создание безумного количества снимков) много памяти можно съесть и не освободить достаточно быстро от кеша индексного дескриптора ядра. Эта проблема может быть не обнаружена, поскольку память, предназначенная для кеша диска, может быть не видна в традиционных утилитах мониторинга системы. Утилита slabtop (доступная как часть пакета sys-process/procps) была специально создана для определения того, сколько памяти потребляют объекты ядра:

root #slabtop

Если кэш индексного дескриптора потребляет слишком много памяти, ядру можно вручную указать на сброс кэша путем передачи целочисленного значения с помощью команды echo в файл /proc/sys/vm/drop_caches[10].

Для безопасности и чтобы помочь ядру определить максимальный объем освобождаемой памяти, обязательно запустите sync перед запуском echo команд как показано ниже:

user $sync

В большинстве случаев, пользователям Btrfs, вероятно, потребуется echo 2, чтобы просто восстановить объекты slab (dentries и btrfs_inodes):

root #echo 2 > /proc/sys/vm/drop_caches

Чтобы очистить весь дисковый кэш (объекты slab и кэш страниц), используйте echo 3:

root #echo 3 > /proc/sys/vm/drop_caches
Предупреждение
Хотя приведенные выше команды являются неразрушающими (при условии завершения выполнения команды sync перед их запуском), они могут серьезно, но временно замедлить работу системы, пока ядро опять загружает в память только необходимые элементы. Дважды подумайте, прежде чем запускать вышеуказанные команды на системах под большой нагрузкой!

Более подробную информацию о slab ядра можно найти в этой записи блога dedoimedo.

Не удается смонтировать btrfs, при монтировании возвращается: неизвестный тип файловой системы 'btrfs'

Оригинальное решение Тима на Stack Exchange вдохновило на следующий способ - сборка ядра вручную, вместо использования genkernel:

#cd /usr/src/linux
#make menuconfig
#make && make modules_install
#cp arch/x86_64/boot/bzImage /boot
#mv /boot/bzImage /boot/whatever_kernel_filename
#genkernel --install initramfs

Корневая файловая система Btrfs не загружается

Genkernel's initramfs, созданная с помощью приведенной ниже команды, не загружает btrfs:

root #genkernel --btrfs initramfs

Компилируйте поддержку btrfs в ядре, а не как модуль, или используйте genkernel-next или Dracut для генерации initramfs.

Смотрите также

  • Btrfs snapshots - Скрипт, который создает моментальные снимки при изменении файлов.
  • Btrfs/System Root Guide - Использование файловой системы btrfs, как коллекции подтомов, в том числе, в качестве корневой файловой системы.
  • Btrfs native system root guide - Альтернативное руководство по использованию подтома в файловой системе btrfs в качестве корневой файловой системы.
  • ext4 - Файловая система по умолчанию для большинства дистрибутивов Linux.
  • Samba shadow copies - Использование Samba для предоставления теневых копий как 'предыдущих версий' клиентам Windows.
  • Snapper - Программа командной строки, способная управлять снимками файловой системы Btrfs.
  • ZFS - Файловая система, которая имеет много общего с Btrfs, но имеет проблемы с лицензированием.

Внешние ресурсы

Ссылки