Понимание и работа с файловой системой BtrFS в Linux |
Цель этой публикации в блоге – помочь вам начать работу с файловой системой B-tree (BtrFS). Файловых систем на основе ядра в дереве ядра Linux в настоящее время более 55, и каждая файловая система имеет свои плюсы и минусы. Здесь мы подробно расскажем, как администрировать файловую систему BtrFS в Linux.
Некоторые файловые системы имеют ограниченное или, скорее, очень специфическое использование, а файловые системы действительно общего назначения — это системы extN, такие как ext2, ext3, ext4. Они стабильны и мощны, но все же имеют определенные ограничения.
Файловая система B-дерева (BtrFS), которая произносится как Better FS, уже довольно давно проникает в Linux. На момент написания этой статьи доступной стабильной версией является 4.9. Давайте теперь перейдем к основам использования файловой системы BtrFS в управлении Linux.
Что такое БтрФС?
BtrFS — это файловая система Linux общего назначения следующего поколения, предлагающая уникальные функции, такие как расширенное интегрированное управление устройствами, масштабируемость и надежность. BtrFS масштабируется до 16 эксабайт (EB) и ориентирована на функции, которых нет ни в одной другой файловой системе Linux. Некоторые даже утверждают, что Btrfs — это ответ Linux на Sun/Oracle ZFS, но ее архитектура более масштабируема, чем ЗФС. Фактически, файловая система BtrFS в Linux в настоящее время привлекает огромное внимание.
BtrFS создает основу для распределенной файловой системы Ceph и уровня хранилища объектов RADOS для «облачных» технологий. Он включает в себя идеи файловых систем ext4, XFS, HP aufs и Reiser. Разработка BtrFS очень активна, и новые функции добавляются с огромной скоростью.
Почему БтрФС
Файловая система BtrFS в Linux предоставляет следующие функции и возможности.
- Встроенное копирование при записи
- Мощные возможности создания снимков
- Встроенное управление томами с помощью подтомов.
- Масштабная масштабируемость до 16 эксабайт
- Встроенная целостность данных (контрольные суммы)
- Оптимизация SSD
- Возможности сжатия
- Облако готово
- RAID встроен в BtrFS
- Ручная дефрагментация
- Онлайн-управление файловой системой
- Целостность данных и метаданных
- Преобразование на месте из ext2/3/4 и ReiserFS
- Группы квот
- Онлайн-расширение и уменьшение размера файловой системы
- RAID уровня объекта
- Высевающие устройства
- Поддержка нескольких устройств
Характеристики Btrfs
- Максимальный размер тома: 16 ЭБ (2 ^64 байта).
- Максимальный размер файла: 16 ЭБ.
- Максимальный размер имени файла: 255 байт.
- Проверка файловой системы: онлайн и оффлайн
- Алгоритм поиска в каталоге: B-дерево.
- Символы в имени файла: любые, кроме 0x00.
Совместимость
- Жесткие и символические ссылки
- Списки контроля доступа (ACL)
- Расширенные атрибуты (xattrs)
- Владелец/разрешения файла POSIX
- Асинхронный и прямой ввод-вывод
- Разреженные файлы
BtrFS действительно поддерживает максимальный размер файла 16 эксабайт. Если термин «эксабайты» вас немного смущает, обратитесь к диаграмме ниже, которая поможет вам визуализировать перспективу.
Чтобы проверить, какие файловые системы в настоящее время поддерживает ваше ядро, вы можете найти в файле /proc/filesystems. Пример показан ниже для моей локальной системы.
# cat /proc/filesystems
nodev sysfs
nodev rootfs
..............
btrfs
ext3
ext2
ext4
vfat
xfs
fuseblk
nodev fuse
nodev fusectl
Для поддержки BtrFS выходные данные должны содержать ключевое слово btrfs.
Установка BtrFS в дистрибутивах Linux
В системах на базе Debian:
sudo apt update
sudo apt -y install btrfs-progs
Системы на базе RHEL:
sudo yum -y install btrfs-progs
Арч Линукс
sudo pacman -S btrfs-progs
Генту
sudo emerge --ask sys-fs/btrfs-progs
Полезные параметры монтирования BtrFS
Более подробную информацию о доступных опциях можно найти на странице руководства btrfs.
$ man 5 btrfs
Работа с BtrFS – использование примеров
В настоящее время на моей лабораторной машине есть два дополнительных жестких диска, каждый из которых содержит 1 ГБ
, которые можно использовать в демонстрациях, которые вскоре последуют. Чтобы продолжить, вы можете запустить виртуальную машину, установить пакет btrfs-progs
и добавить два дополнительных жестких диска.
Создание и монтирование раздела BtrFS
Чтобы начать демонстрацию, мы начнем с создания файловой системы BtrFS в одном разделе 1 ГБ
и смонтируем ее в каталог /data
. Мы собираемся создать раздел в /dev/vdb
, который будет занимать 30%
блочного устройства. Чтобы создать базовую файловую систему BtrFS и смонтировать ее, используйте следующие команды:
sudo parted --script /dev/vdb "mklabel gpt"
sudo parted --script /dev/vdb "mkpart primary 1 30%"
sudo parted /dev/vdb print
sudo mkdir /data
sudo mkfs.btrfs /dev/vdb1
sudo mount /dev/vdb1 /data
Чтобы убедиться, что смонтированный раздел работает так, как мы хотели, скопируем в него некоторые данные следующим образом:
sudo find /usr/share/doc -name '*[a,b].html' -exec cp {} /data \;
ls -l /data
Проверьте файловую систему также с помощью команд btrfs
:
btrfs filesystem show /dev/vdb1
btrfs filesystem df -h /data/
btrfs filesystem usage /data/
Из этих команд вы увидите, что мы скопировали некоторые из существующих файлов html, чтобы получить реальные данные для демонстрации. Последняя команда подтверждает размер, близкий к 300MB (30% от 1 ГБ)
.
Вывести список подтомов корневого тома
$ btrfs subvolume list /data/
Просмотрите использование дискового пространства:
$ btrfs filesystem df -h /data
$ btrfs filesystem show /dev/vdb1
Увеличение файловой системы btrfs
После предыдущего разделения dev/vdb
у нас осталось около 700 МБ неразмеченного. Мы собираемся использовать это для увеличения файловой системы btrfs.
sudo parted /dev/vdb mkpart primary 30% 60%
sudo btrfs device add /dev/vdb2 /data/
btrfs filesystem show /data
df -h /data/
Удаление устройств btrfs
Используйте команду удаление устройства btrfs
, чтобы удалить подключенное к сети устройство. Он перераспределит любые используемые экстенты на другие устройства в файловой системе для их безопасного удаления.
Пример :
sudo btrfs device delete /dev/vdb2 /data
Это все, что нам нужно было сделать для расширения файловой системы BtrFS. Это было подтверждено результатами, показанными ниже:
Расширить файловую систему BtrFS
Вы также можете изменить размер напрямую, указав предполагаемый размер. Синтаксис следующий:
sudo btrfs filesystem resize amount /mount-point
Сумма может быть заданного размера, например ”+3g ” для увеличения на 3 ГиБ, или “max ” для увеличения файловой системы до заполнения целое блочное устройство. Используйте ”-3g ” для уменьшения на 3 ГиБ. Рассмотрим пример ниже, чтобы добавить новый раздел /dev/sda4
в /home
и расширить его.
$ sudo btrfs device add /dev/sda4 /home -f
$ sudo btrfs filesystem resize max /home
$ sudo btrfs filesystem show /home
Label: 'home' uuid: b40ffd9b-c09d-403e-a5f3-b79b5c314505
Total devices 2 FS bytes used 79.71GiB
devid 1 size 88.81GiB used 88.81GiB path /dev/mapper/arch-home
devid 2 size 8.89GiB used 1.00GiB path /dev/sda4
Обратите внимание, что новое устройство было успешно добавлено.
Балансировка файловой системы
Если нам не хватает дискового пространства в исходном томе, мы можем добавить дополнительный раздел. Метаданные и данные на этих устройствах по-прежнему хранятся только в /dev/vdb1. Теперь его необходимо сбалансировать, чтобы распределить по всем разделам, используя следующие команды:
$ sudo btrfs balance start -d -m /data
Аргументы:
-d: представляет данные.
-m: представляет метаданные.
Это обеспечит одинаковое использование дисков.
Тестирование:
Пришло время провести тестирование нашей файловой системы BtrFS в Linux. Чтобы проверить работу балансировки, я сгенерирую два случайных данных размером 100 МБ
каждый.
sudo dd if=/dev/urandom of=/data/hugefile1 bs=1M count=100
sudo dd if=/dev/urandom of=/data/hugefile2 bs=1M count=100
sudo btrfs balance start -d -m /data
sudo btrfs filesystem show /data
Вы должны заметить, что данные в двух томах хорошо сбалансированы.
Если вы хотите, чтобы каталог /data
монтировался во время загрузки, добавьте приведенную ниже запись в файл /etc/fstab
:
/dev/vdb1 /data btrfs device=/dev/vdb1,device=/dev/vdb2 0 0
Создание файловой системы для нескольких устройств
С файловой системой BtrFS в Linux. Возможно управление несколькими устройствами. При этом используются параметры -d и -m с командой mkfs.btrfs. Действительные характеристики:
- одинокий
- RAID0: чередование без избыточности
- рейд1: зеркалирование диска
- рейд10: Полосатое зеркало.
Одиночная опция -m указывает, что дублирование метаданных не выполняется. Это может быть желательно при использовании аппаратного рейда.
Чтобы добавить новое устройство в уже созданную файловую систему с несколькими устройствами, используйте:
sudo mkfs.btrfs /dev/device1 /dev/device2 /dev/device3
sudo mount /dev/device3 /mount-point
Перезагрузите модуль btrfs и запустите:
sudo btrfs device scan
для обнаружения всех файловых систем нескольких устройств.
Давайте рассмотрим пример ниже для создания файловой системы raid10
и raid1
btrfs. Обратите внимание, что для правильной работы рейда 10 требуется как минимум четыре устройства.
Четыре устройства с зеркальным отображением метаданных и чередованием данных
sudo mkfs.btrfs /dev/device1 /dev/device2 /dev/device3 /dev/device4
Два устройства, чередование метаданных, но без зеркалирования
sudo mkfs.btrfs -m raid0 /dev/device1 /dev/device2
raid10
используется как для данных, так и для метаданных
sudo mkfs.btrfs -m raid10 -d raid10 /dev/device1 /dev/device2 /dev/device3 /dev/device4
Полная емкость каждого используемого устройства, если диски имеют разные размеры:
sudo mkfs.btrfs /dev/device1 /dev/device2 /dev/device3
sudo mount /dev/device1 /mount-point
Не дублируйте метаданные на одном диске.
sudo mkfs.btrfs -m single /dev/device
Сканирование устройств BtrFS
Сканируйте все блочные устройства в /dev и проверьте наличие томов BtrFS, используя:
sudo btrfs device scan
sudo btrfs device scan /dev/device
Создание подтомов BtrFS
Подтома позволяют использовать отдельные идентификаторы управления в файловой системе BtrFS. В этом разделе мы создадим два субтома: subvolume1 и subvolume2. Для этого мы начнем с создания новой BtrFS на устройстве /dev/vdb3, создадим точку монтирования и смонтируем ее:
sudo parted /dev/vdb mkpart primary 60% 100%
sudo mkfs.btrfs /dev/vdb3
sudo mkdir /subvol_btrfs
sudo mount /dev/vdb3 /subvol_btrfs
Теперь давайте создадим два подтома в /subvol_btrfs.
sudo btrfs subvolume create /subvol_btrfs/subvolume1
sudo btrfs subvolume create /subvol_btrfs/subvolume2
Когда мы определяем подтома, в файловой системе будут созданы как каталоги, так и объекты подтомов BtrFS.
Создайте несколько файлов в /subvol_btrfs
и подтомах:
sudo touch /subvol_btrfs/btrfsmainfile.txt
sudo touch /subvol_btrfs/subvolume1/subvolume1file.txt
sudo touch /subvol_btrfs/subvolume2/subvolume2file.txt
Перечислите доступные на данный момент подтома в /subvol_btrfs
:
$ sudo btrfs subvolume list /subvol_btrfs
ID 256 gen 9 top level 5 path subvolume1
ID 257 gen 9 top level 5 path subvolume2
sudo umount /subvol_btrfs
Монтаж подобъемов
Вы можете смонтировать субтом в точку монтирования. Давайте сделаем это и сравним результаты с помощью команды ls -l
:
$ sudo mount /dev/vdb3 /subvol_btrfs/
$ ls -l /subvol_btrfs/
$ sudo umount /subvol_btrfs/
$ sudo mount -o subvol=subvolume1 /dev/vdb3 /subvol_btrfs/
$ ls -l /subvol_btrfs/
$ sudo mount -o subvol=subvolume2 /dev/vdb3 /subvol_btrfs/
$ ls -l /subvol_btrfs/
Сделайте субтом по умолчанию вместо текущего корневого тома:
Давайте сделаем subvolume1
субтомом по умолчанию. Нам нужен его идентификатор:
$ sudo umount /subvol_btrfs/ 2>/dev/null
$ sudo mount /dev/vdb3 /subvol_btrfs/
$ ID=`btrfs subvolume list /subvol_btrfs/ | grep subvolume1 | awk '{print $2}'`
$ btrfs subvolume set-default ${ID} /subvol_btrfs
Проверьте, перемонтировав /dev/vdb3
:
$ sudoumount /subvol_btrfs/
$ sudo mount /dev/vdb3 /subvol_btrfs/
$ ls -l /subvol_btrfs/
total 0
-rw-r--r--. 1 root root 0 Jan 10 11:22 subvolume1file.txt
Обратите внимание на вывод выше: данные, которые мы создали в subvolume1
, доступны по умолчанию при монтировании /dev/vdb3
.
Чтобы вернуть корневой том по умолчанию, используйте идентификатор 0 или 5:
$ sudo btrfs subvolume set-default 0 /subvol_btrfs
$ sudo umount /subvol_btrfs
$ sudo mount /dev/vdb3 /subvol_btrfs/
$ ls -l /subvol_btrfs/
total 0
-rw-r--r--. 1 root root 0 Jan 10 11:22 btrfsmainfile.txt
drwxr-xr-x. 1 root root 36 Jan 10 11:22 subvolume1
drwxr-xr-x. 1 root root 36 Jan 10 11:22 subvolume2
Работа со снимками BtrFS
Файловая система BtrFS в функции моментальных снимков Linux может использоваться как копии данных только для чтения или для чтения/записи. Снимки можно использовать следующими способами:
1.
Создание моментального снимка только для чтения и последующее резервное копирование моментального снимка. Таким образом, резервная копия будет относиться к файловой системе хоста на момент создания моментального снимка.
2.
Использование его в качестве точки возврата при изменении большого количества файлов. Если изменения приводят к отрицательным результатам, вы можете легко вернуться к копии моментального снимка.
Снимок должен быть создан в той же файловой системе, что и целевые данные, поскольку на быстрое создание снимка влияет форма внутренних ссылок внутри файловой системы.
ПРИМЕЧАНИЕ. Вы не можете создать снимок всей файловой системы. Это связано с тем, что изменения в снимке необходимо будет записать обратно в него самого, что приведет к бесконечной рекурсии.
В целях демонстрации мы будем использовать два подтома, которые мы создали ранее. Наш сценарий заключается в том, что мы создаем снимок рабочего подтома subvoume1
, доступный только для чтения.
$ sudo btrfs subvolume snapshot -r /subvol_btrfs/subvolume1 /subvol_btrfs/subvolume2/backup/
Create a readonly snapshot of '/subvol_btrfs/subvolume1' in '/subvol_btrfs/subvolume2/backup'
Мы можем перечислить доступные подтома с помощью команды:
$ sudo btrfs subvolume list /subvol_btrfs/
ID 256 gen 24 top level 5 path subvolume1
ID 257 gen 24 top level 5 path subvolume2
ID 258 gen 24 top level 257 path subvolume2/backup
Из вывода мы видим, что снимок отображается как новый подобъем. Перечисление содержимого обоих каталогов должно указывать на то, что содержимое одинаковое:
$ ls /subvol_btrfs/subvolume2/backup/
subvolume1file.txt
$ ls /subvol_btrfs/subvolume1/
subvolume1file.txt
Если мы удалим все файлы из /subvol_btrfs/subvolume1/
, технология копирования при записи (COW) в BtrFS создаст файлы в /subvol_btrfs. /subvolume2/backup
. В случае катастрофы мы можем просто скопировать файлы обратно в исходное местоположение, поскольку они не будут изменены, если изменятся исходные файлы.
Миграция BtrFS на месте; Преобразование файловой системы ext4 в BtrFS
В этом примере я покажу вам, как преобразовать файловую систему ext4 в BtrFS. Поскольку я использую сервер CentOS на KVM, я добавлю дополнительный жесткий диск, создам раздел ext4
, а затем преобразую его в BtrFS, чтобы вы могли получить полное представление о том, как это делается.
Добавьте вторичное блочное устройство 1 ГБ
, это нужно сделать на хост-компьютере:
syudo virsh vol-create-as default --name btrfs-sec.qcow2 1G
sudo virsh vol-list --pool default
sudo virsh attach-disk --domain cs1 --source /var/lib/libvirt/images/btrfs-sec.qcow2 --persistent --target vdc
Подтвердите, что он добавлен на виртуальную машину:
$ lsblk /dev/vdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdc 252:32 0 1G 0 disk
Создайте раздел ext4:
sudo parted --script /dev/vdc "mklabel gpt mkpart primary 0% 100%"
sudo parted --script /dev/vdc print
sudo lsblk -f /dev/vdc
Смонтируйте вновь созданную файловую систему, создайте несколько файлов и каталогов, затем размонтируйте файловую систему:
sudo mkdir /ext4tobtrfs
sudo mount /dev/vdc1 /ext4tobtrfs/
sudo mkdir /ext4tobtrfs/test-{1-4}-dir
sudo touch /ext4tobtrfs/test-file{1..10}.txt
sudo ls -l /ext4tobtrfs/
sudo umount /ext4tobtrfs/
Преобразуйте файловую систему в Btrfs:
# btrfs-convert -l convertedfs /dev/vdc1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating btrfs metadata.
copy inodes [o] [ 0/ 22]
creating ext2 image file.
set label to 'convertedfs'
cleaning up system chunk.
conversion complete.
Снова смонтируйте файловую систему и просмотрите тип файловой системы:
# mount /dev/vdc1 /ext4tobtrfs/
# df -hT /ext4tobtrfs/
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdc1 btrfs 1022M 51M 643M 8% /ext4tobtrfs
Обратите внимание, что файловая система /ext4tobtrfs
имеет тип btrfs.
Для просмотра подтомов, информации и содержимого BtrFS используйте:
# btrfs filesystem show /ext4tobtrfs/
Label: 'convertedfs' uuid: 3e985770-66a0-4b85-810e-2e93182696f3
Total devices 1 FS bytes used 34.78MiB
devid 1 size 1022.00MiB used 616.25MiB path /dev/vdc1
# btrfs subvolume list /ext4tobtrfs/
ID 256 gen 6 top level 5 path ext2_saved
# ls -l /ext4tobtrfs/
total 16
drwxr-xr-x. 1 root root 10 Jan 10 13:22 ext2_saved
drwx------. 1 root root 0 Jan 10 13:14 lost+found
drwxr-xr-x. 1 root root 0 Jan 10 13:19 test-{1-4}-dir
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file10.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file1.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file2.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file3.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file4.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file5.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file6.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file7.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file8.txt
-rw-r--r--. 1 root root 0 Jan 10 13:19 test-file9.txt
# file /ext4tobtrfs/ext2_saved/image
/ext4tobtrfs/ext2_saved/image: Linux rev 1.0 ext4 filesystem data, UUID=7e6849f2-8560-4b9d-add8-d344ef577650 (extents) (64bit) (large files) (huge files)
> To mount subvolume or the image in ext2_saved subvolume, use:
# mount -o subvol=ext2_saved /dev/vdc1 /mnt/
# ls -l /mnt
# umount /mnt
# mount -o loop /ext4tobtrfs/ext2_saved/image /mnt/
# ls -la /mnt/
Вернитесь к файловой системе ext4
:
# umount /ext4tobtrfs/
# btrfs-convert -r /dev/vdc1
rollback complete.
# mount /dev/vdc1 /ext4tobtrfs/
# df -hT /ext4tobtrfs/
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdc1 ext4 990M 2.6M 921M 1% /ext4tobtrfs
Если вы просмотрите файлы в /ext4tobtrfs/, вы заметите, что каталоги, созданные вами в BtrFS, исчезли, остались только те, которые изначально были созданы в файловой системе ext4.
преобразовать существующую систему с одним устройством
Преобразуйте существующую систему с одним устройством, /dev/vdb1
в данном случае, в систему с двумя устройствами, raid1
, чтобы защититься от сбоя одного диска, используйте следующие команды :
# umount /subvol_btrfs/
# mount /dev/vdb1 /subvol_btrfs/
# btrfs device add /dev/vdb2 /subvol_btrfs/ -f
# btrfs balance start -dconvert=raid1 -mconvert=raid1 /subvol_btrfs/
Задачи обслуживания BtrFS
Файловая система BtrFS в Linux всегда требует от администратора знаний, как выполнять следующие задачи обслуживания.
1.
Проверьте контрольные суммы с помощью скраба:
Откройте окно терминала и запустите:
# watch btrfs scrub status /subvol_btrfs/
Откройте другое окно терминала и запустите:
# btrfs scrub start /subvol_btrfs/
watch
в первом запросе покажет ход очистки.
2.
Посмотреть баланс:
На одном терминале запустите:
# watch btrfs balance status /subvol_btrfs/
На другом терминале запустите:
# btrfs balance start /subvol_btrfs/
3.
Рекурсивно дефрагментируйте файловую систему,
# btrfs filesystem defragment -r /subvol_btrfs/
Замена вышедших из строя устройств в файловой системе btrfs
Если устройство отсутствует или суперблок поврежден, перед устранением неполадок файловую систему необходимо смонтировать в ухудшенном режиме. Пример показан ниже:
# mkfs.btrfs -m raid1 /dev/vdb /dev/vdc /dev/vdd
# mount -o degraded /dev/vdb /mnt
# btrfs device delete missing /mnt
Заключение
В этом руководстве по файловой системе BtrFS в Linux я подробно описал файловую систему BtrFS в Linux, начиная с основ и заканчивая практическими настройками. BtrFS — это действительно то, с чем стоит начать работать уже сейчас, поскольку в ближайшие годы она станет файловой системой предприятия по умолчанию. Мы увидели, как файловая система BtrFS в Linux упрощает управление файловой системой и томами, объединяя их в единую модель работы. Надеюсь, вам было интересно работать с BtrFS.
Рекомендации
1.
Страница руководства btrfs(8)
— хорошее место для начала. Он охватывает все важные команды управления, включая:
- Управление субвоумами и снимками
- Использование команд
очистки, балансировки и дефрагментации
- Управление файловой системой с помощью команды
manage
- Команды
device
для управления устройствами.
Другие справочные страницы включают:
Чтобы узнать больше о файловой системе BtrFS в администрировании Linux, обратитесь к следующим справочным страницам.
# man mkfs.btrfs
# man 5 btrfs
# man 8 fsck.btrfs