Btrfs

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

Outdated translations are marked like this.
Other languages:
English • ‎español • ‎français • ‎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 более медленный, но имеет более высокую степень сжатия:

To force zlib compression across the whole filesystem:

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

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

Обычные инструменты пользовательского пространства для определения используемого и свободного места, такие как du и df могут давать неточные результаты для раздела Btrfs из-за внутренних конструктивных различий в способе записи файлов по сравнению с, например, ext2/3/4[4].

Поэтому рекомендуется использовать альтернативы du / df, предоставляемые инструментом пользовательского пространства btrfs filesystem . В дополнение к этому, compsize инструмент взятый из пакета sys-fs/compsize может быть полезным при предоставлении дополнительной информации о коэффициентах сжатия и использовании сжатых файлов на диске. Ниже приведены примеры использования этих инструментов для раздела btrfs, смонтированного в /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 

Несколько устройств (RAID)

Btrfs может использоваться с несколькими устройствами для создания RAID-массивов. Использование Btrfs для создания файловых систем, объединяющие несколько устройств, намного проще, чем создание с помощью mdadm; для создания не требуется времени инициализации.

BTRFS handles data and metadata separately. This is an important factor to keep in mind when using a multi-device filesystem. It is possible to use separate profiles for data and metadata block groups. For example, metadata could be configured across multiple devices in RAID1, while data could be configured to RAID5. This is profile possible when using three or more block devices, since RAID5 requires a minimum of 3 block devices.

This type of profile offers the benefit of redundancy for metadata on each device and striping for data across devices, which increases read speeds. The drawback of this profile is more space than necessary is used for metadata, and write speeds are reduced for data blocks, since RAID5 uses a parity bit.

Creation

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

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

Conversion

Преобразование между режимами RAID возможно с помощью подкоманды balance. Например, предположим, что RAID1 с несколькими устройствами смонтирован в /srv. Можно преобразовать RAID1 в RAID0 с помощью следующей команды:

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

Преобразование режима RAID может быть выполнено, когда файловая система находится в работе и используется. Возможные режимы RAID в btrfs RAID0, RAID1, RAID5, RAID6, and RAID10. Для получения дополнительной информации см. Вики-страницу BTRFS.

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

Removal

By device path

Block devices (disks) can be removed from multi-device filesystems using the btrfs device remove subcommand:

root #sudo btrfs device remove /dev/sde /srv
By device ID

Use the usage subcommand to determine the device IDs:

root #btrfs device usage /srv
/dev/sdb, ID: 3
   Device size:             1.82TiB
   Device slack:              0.00B
   Data,RAID1:             25.00GiB
   Data,RAID5:            497.00GiB
   Data,RAID5:              5.00GiB
   Metadata,RAID5:         17.00GiB
   Metadata,RAID5:        352.00MiB
   System,RAID5:           32.00MiB
   Unallocated:             1.29TiB
 
/dev/sdc, ID: 1
   Device size:             1.82TiB
   Device slack:              0.00B
   Data,RAID1:             25.00GiB
   Data,RAID5:            497.00GiB
   Data,RAID5:              5.00GiB
   Metadata,RAID5:         17.00GiB
   Metadata,RAID5:        352.00MiB
   System,RAID5:           32.00MiB
   Unallocated:             1.29TiB
 
/dev/sdd, ID: 4
   Device size:             1.82TiB
   Device slack:              0.00B
   Data,RAID1:             25.00GiB
   Data,RAID5:            497.00GiB
   Data,RAID5:              5.00GiB
   Metadata,RAID5:         17.00GiB
   Metadata,RAID5:        352.00MiB
   System,RAID5:           32.00MiB
   Unallocated:             1.29TiB
 
/dev/sde, ID: 5
   Device size:               0.00B
   Device slack:              0.00B
   Data,RAID1:             75.00GiB
   Data,RAID5:              5.00GiB
   Metadata,RAID5:        352.00MiB
   Unallocated:             1.74TiB

Next use the device ID to remove the device, in this case /dev/sde will be removed:

root #btrfs device remove 5 /srv

Подтома

Как уже упоминалось выше в списке функций, 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

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

Использование c образами ВМ

При использовании Btrfs с образами дисков виртуальных машин, лучше всего отключить копирование при записи на образы дисков, чтобы повысить производительность ввода-вывода. Это можно сделать только для вновь созданных файлов. Также можно отключить CoW для всех файлов, созданных в определенном каталоге. Например, с помощью команды chattr:

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
Active / Total Objects (% used)    : 2259363 / 2338091 (96.6%)
Active / Total Slabs (% used)      : 467797 / 467803 (100.0%)
Active / Total Caches (% used)     : 83 / 175 (47.4%)
Active / Total Size (% used)       : 1489775.62K / 1512200.52K (98.5%)
Minimum / Average / Maximum Object : 0.02K / 0.65K / 4096.00K

Если кэш индексного дескриптора потребляет слишком много памяти, ядру можно вручную указать на сброс кэша путем передачи целочисленного значения с помощью команды 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, но имеет проблемы с лицензированием.

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

* https://wiki.debian.org/ru/Btrfs - Как описано в Debian вики. * https://wiki.archlinux.org/index.php/Btrfs_(Русский) Статья Btrfs - как описано в Arch Linux вики. * http://www.funtoo.org/BTRFS_Fun - BTRFS Fun на вики Funtoo. * http://marc.merlins.org/perso/btrfs/post_2014-05-04_Fixing-Btrfs-Filesystem-Full-Problems.html - Советы и рекомендации по устранению проблем файловой системы Btrfs в некоторых ситуациях.

Ссылки