Btrfs

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

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).
Совет
Обновленный и отчасти исчерпывающий список функций смотрите на upstream wiki. Однако не все функции достаточно стабильны для повсеместного использования.

В будущем новые кластерные файловые системы легко могут использовать 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.

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

user $chattr +c

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

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

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

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

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

RAID

Создать RAID в Btrfs гораздо проще, чем создать RAID с помощью mdadm.

Самый простой способ создать RAID, это использовать все устройства:

root #mkfs.btrfs -m raid1 <device1> <device2> -d raid1 <device1> <device2>
Предупреждение
В настоящее время не безопасно использовать уровни RAID 5 или 6[2]. В уровнях RAID 5 и 6 были исправления[3] в Linux 4.12, но общее состояние по-прежнему помечено как нестабильное.[4][5]. Пользователям, которые хотят использовать функции btrfs RAID5 или RAID6, рекомендуется проверять страницу состояния btrfs на предмет стабильности указанных уровней перед их использованием.

Подтома

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

Заметка
Подтом не может быть создан между разными файловыми системами 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).[6] Снимки можно использовать для нескольких целей, одной из которых является создание резервных копий структур файловой системы в определенные моменты времени.

Если корневая файловая система - это 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

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

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

Можно очистить кэш свободного места 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[7].

Для безопасности и чтобы помочь ядру определить максимальный объем освобождаемой памяти, обязательно запустите 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, но имеет проблемы с лицензированием.

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

Ссылки