Поиск по сайту:

Понимание и работа с файловой системой 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 

Статьи по данной тематике: