Skip to content
andyceo edited this page Jun 25, 2024 · 8 revisions

Файловая система BTRFS

Устройство BTRFS и некоторая терминология

sda1     sda2     sd..    sdn      <-- block devices (aka "Devices" in BTRFS terms) 
 |        |        |       |
 +--logical address space--+
 |        |        |       |
 +--metadata and extents---+
 |        |        |       |
@root   @usr     @home    @var     <-- subvolumes (root elements of filesystem, entry points) 
 |        |        |       |
 +----files and folders----+

Субвольюмы

В BTRFS нет томов, аналогичных томам в LVM. Есть subvolume. Это не блочное устройство и не может трактоваться так. Субвольюм гораздо ближе к понятию директория, чем к LVM-тому.

Имя субвольюма может быть произвольным и не обязано начинаться на @. Это просто соглашение, чтобы отличать папки от субвольюмов. Субвольюм с именен @ и subvolume id = 0 является истинным корневым субвольюмом, не показывается при использовании команды btrfs subvolume list. Субвольюмы должны начинаться с @, чтобы использовать timeshift.

  • показать список всех субвольюмов: btrfs subvolume list /path/to/any/subvolume. Ключ -d покажет также субвольюмы, которые были удалены пользователем и на текущий момент находятся в процессе удаления с диска.

  • создать субвольюм: btrfs subvolume create /mnt/subvolume_name. По умолчанию, владелец субвольюма будет root. Можно сменить владельца, используя chown

  • удалить субвольюм: btrfs subvolume delete /mnt/subvolume_name. Также субвольюм можно удалить командой rm.

    • удалить все subvolumes в папке /var/lib/docker/btrfs (не повторять на рабочей системе!):

      sudo btrfs subvolume list /var/lib/docker/btrfs/subvolumes
      sudo ls /var/lib/docker/btrfs/subvolumes | xargs -i sudo btrfs subvolume delete /var/lib/docker/btrfs/subvolumes/'{}'
      
  • посмотреть свойства субвольюма: btrfs subvolume show /mnt/subvolume_name

  • вывести субвольюм, который будет монтироваться по умолчанию, если в параметрах монтирования не указан субвольюм:

      btrfs subvolume get-default /path/to/any/subvolume
    
  • установить субвольюм, монтируемый по умолчанию: btrfs subvolume set-default 258 /path/to/any/subvolume

Субвольюм можно скопировать командой cp, но в результате получится просто новая директория. Более эффективный способ копирования (или бекапа субвольюмов) - это снапшоты. Снапшот - это такой же субвольюм, у которого установлены поля Parent UUID и Received UUID - записи о том, от какого субвольюма был произведен снапшот. У обычного субвольюма эти поля тоже есть, только пустые.

  • создать снапшот: btrfs subvolume snapshot /path/to/subvol /path/to/snapshot

  • создать снапшот "только для чтения": btrfs subvolume snapshot -r /path/to/subvol /path/to/snapshot. В этом случае снапшот нельзя будет изменять, файлы гарантировано останутся в том состоянии, в котором они пребывали на момент создания снапшота. Операция создания снапшота нерекурсивна: вместо вложенных сабвольюмов в снапшоте будут созданы пустые директории.

  • установить/сбросить флаг "только для чтения" (работает для любых сабвольюмов, не только для снапшотов):

      btrfs property get /path/to/subvol ro
      btrfs property set /path/to/subvol ro true
    
  • сравнить два субвольюма (они должны быть "только для чтения"):

      btrfs send --no-data -p SHAPSHOT_OLD  SHAPSHOT_NEW  |  btrfs receive --dump  |  grep ^update_extent
    

    Также, интересное решение находится здесь: https://github.com/sysnux/btrfs-snapshots-diff

Создание файловой системы BTRFS на каком-либо блочном устройстве

mkfs.btrfs /dev/sdc -L single_drive

-L задает метку файловой системе (необязательно)

Изменение размера файловой системы BTRFS

btrfs filesystem resize max /

Дедупликация

Сама по себе файловая система BTRFS предоставляет возможность дедупликации данных, но делается это сторонними утилитами.

  • bees: утилита для поблочной дедупликации
  • to be continued

@todo текст про дедупликацию ниже - перепроверить, т.к. он был написан давно.

Для того чтобы воспользоваться функцией дедупликации на BTRFS, нужно воспользоваться утилитой bedup, которая, в свою очередь, находится в пакете burp. Поэтому сначала установим burp:

sudo aptitude install burp

Теперь можно запустить bedup:

sudo bedup -n /var

, где флаг -n отключает чтение файла конфигурации /etc/burp/burp.conf, который мы после установки burp не настраивали, и задает примонтированную файловую систему для дедупликации, в данном случае, /var. Указывать надо именно точку монтирования, а не устройство.

Полезные ссылки:

Ошибки и решения

Часто встречается ошибка BTRFS: could not find root 8 (Ubuntu 16.04). Можно попробовать такое решение:

btrfs quota enable /
reboot

Источник. Также можно попереходить по ссылкам на этой странице.

Полезные утилиты

  • compsize: пример использования: sudo compsize -x / - показывает истинный размер, занятый данными, с учетом сжатия и дедупликации. См. справку.
  • btdu: как ncdu, только для BTRFS. (В Arch Linux только в AUR)

Ссылки

Устройства хранения: диски, блочные устройства, файловые системы

В этом разделе находится информация об устройствах хранения, файловых системах и утилитах для работы с ними.

Clone this wiki locally