This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
Btrfs
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:
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 /
Compression level
Since kernel version 4.15.0[2], zlib compression can now be set by levels 1-9. For example, to set zlib to maximum compression at mount time:
root #
mount -o compress=zlib:9 /dev/sdXY /path/to/btrfs/mountpoint
Or to set minimal compression:
root #
mount -o compress=zlib:1 /dev/sdXY /path/to/btrfs/mountpoint
Or adjust compression by remounting:
root #
mount -o remount,compress=zlib:3 /path/to/btrfs/mountpoint
The compression level should be visible in /proc/mounts or by checking the most recent output of 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
Compression ratio and disk usage
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[3].
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
RAID
Создать RAID в Btrfs гораздо проще, чем создать RAID с помощью mdadm.
Самый простой способ создать RAID, это использовать все устройства:
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[4]. В уровнях RAID 5 и 6 были исправления[5] в Linux 4.12, но общее состояние по-прежнему помечено как нестабильное.[6][7]. Пользователям, которые хотят использовать функции btrfs RAID5 или RAID6, рекомендуется проверять страницу состояния btrfs на предмет стабильности указанных уровней перед их использованием.
Подтома
Как уже упоминалось выше в списке функций, Btrfs может создавать подтома. Подтома могут быть использованы, чтобы лучше организовать и управлять данными. Они становятся особенно мощными в сочетании с моментальными снимками. Важное различие должно быть сделано между подтомами Btrfs и подтомами созданными менеджером логических томов (LVM). Подтома Btrfs не являются устройствами уровня блока, они представляют собой пространства имен файлов POSIX.[8] Они могут быть созданы в любом месте файловой системы и будут действовать как любой другой каталог в системе с одной оговоркой: подтома могут быть смонтированы и размонтированы. Подтома вкладываемы (подтома могут быть созданы внутри других подтомов), и легко создаются или удаляются.
Подтом не может быть создан между разными файловыми системами 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).[8] Снимки можно использовать для нескольких целей, одной из которых является создание резервных копий структур файловой системы в определенные моменты времени.
Если корневая файловая система - это 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[9].
Для безопасности и чтобы помочь ядру определить максимальный объем освобождаемой памяти, обязательно запустите 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 в некоторых ситуациях.
Ссылки
- ↑ man page for btrfs-filesystem(8), Btrfs wiki. Retrieved on 6th February, 2017.
- ↑ https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f51d2b59120ff364a5e612a594ed358767e1cd09
- ↑ https://btrfs.wiki.kernel.org/index.php/Compression#How_can_I_determine_compressed_size_of_a_file.3F
- ↑ Article mentioning that parity RAID code has multiple serious data-loss bugs, Btrfs wiki. Retrieved on January 1st, 2017.
- ↑ Michael Larabel, Btrfs RAID56 "Mostly OK", Phoronix. July 8, 2017.
- ↑ btrfs: scrub: Fix RAID56 recovery race condition, source commit, April 18th 2017.
- ↑ GIT PULL Btrfs from Chris Mason, Linux kernel mailinglist, May 9th 2017.
- ↑ Jump up to: 8.0 8.1 Section explaining the differences between subvolumes and logical volumes in LVM, Btrfs wiki. Retrieved on January 1st, 2017.
- ↑ Documentation for /proc/sys/vm/*, Kernel.org. Retrieved on January 1st, 2017.