Btrfs (Русский) - ArchWiki

Jump to content

Перевод этой статьи или раздела не отражает оригинальное содержание.

Причина: Невычитанная копипаста из переводчика DeepL. (Discuss)

Related articles

- File systems
- Snapper
- dm-crypt/Encrypting an entire system#Btrfs subvolumes with swap

Из Btrfs Вики:

  Btrfs - это современная файловая система "копирование при записи" (CoW) для Linux, нацеленная на реализацию расширенных возможностей, а также на отказоустойчивость, ремонт и простоту администрирования. Совместно разработанная несколькими компаниями, Btrfs лицензирована под GPL и открыта для участия всех желающих.

Warning: Btrfs имеет некоторые нестабильные функции. Более подробную информацию смотрите в разделах Btrfs Wiki Статус, Стабилен ли Btrfs? и Начало работы. См. раздел #Известные проблемы.

## Подготовка

Для утилит пользовательского пространства установите пакет btrfs-progs, который необходим для базовых операций.

Если вам нужно загрузиться с файловой системы Btrfs (т.е. ваше ядро и initramfs находятся на разделе Btrfs), проверьте, поддерживает ли ваш загрузчик Btrfs.

## Создание файловой системы

Ниже показано, как создать новую файловая система Btrfs. Чтобы преобразовать раздел ext3/4 в Btrfs, смотрите #Преобразование Ext3/4 в Btrfs. Чтобы использовать установку без разделов, смотрите #Диск Btrfs без разделов.

Дополнительную информацию смотрите в mkfs.btrfs(8).

### Файловая система на одном устройстве

Чтобы создать файловую систему Btrfs на разделе `/dev/partition`:

    # mkfs.btrfs -L mylabel /dev/partition

Размер узла по умолчанию в Btrfs для метаданных составляет 16 КБ, а размер сектора по умолчанию для данных равен размеру страницы и определяется автоматически. Чтобы использовать больший размер узла для метаданных (он должен быть кратен размеру сектора, допускается до 64 КБ), укажите значение `nodesize` с помощью переключателя `-n`, как показано в этом примере с блоками по 32 КБ:

    # mkfs.btrfs -L mylabel -n 32k /dev/partition

Примечание: Согласно mkfs.btrfs(8) § OPTIONS, "[меньший] размер узла увеличивает фрагментацию, но приводит к более высоким b-деревьям, что, в свою очередь, приводит к меньшей конкуренции при блокировке. Больший размер узла дает лучшую упаковку и меньшую фрагментацию ценой более дорогих операций с памятью при обновлении блоков метаданных".

### Файловая система с несколькими устройствами

Warning: Режимы RAID 5 и RAID 6 в Btrfs фатально несовершенны, и не должны использоваться для "чего-либо, кроме тестирования с выброшенными данными." Список известных проблем и частичных обходных путей. См. страницу Btrfs о RAID5 и RAID6 для обновления статуса (похоже, не обновляется).

Для создания RAID-массива можно использовать несколько устройств. Поддерживаемые уровни RAID включают RAID 0, RAID 1, RAID 10, RAID 5 и RAID 6. Начиная с ядра 5.5 поддерживаются RAID1c3 и RAID1c4 для 3- и 4- копий уровня RAID 1. Уровни RAID могут быть настроены отдельно для данных и метаданных с помощью опций `-d` и `-m` соответственно. По умолчанию данные имеют одну копию (`single`), а метаданные зеркалируются (`raid1`). Это похоже на созданию конфигурации JBOD, где диски воспринимаются как одна файловая система, но файлы не дублируются. Дополнительную информацию о том, как создать том Btrfs RAID, смотрите в Использование Btrfs с несколькими устройствами.

    # mkfs.btrfs -d single -m raid1 /dev/part1 /dev/part2 ...

Вы должны включить либо `udev` хук, либо `btrfs` хук в `/etc/mkinitcpio.conf`, чтобы использовать несколько устройств Btrfs в пуле. Дополнительную информацию см. в статье Mkinitcpio#Общие хуки[ссылка недействительна: раздел не найден].

Note:

- Существует возможность добавить устройства в файловую систему с несколькими устройствами позже. Дополнительную информацию см. в статье Btrfs wiki.
- Устройства могут быть разных размеров. Однако, если один диск в конфигурации RAID больше остальных, дополнительное пространство не будет использоваться.
- Некоторые загрузчикы, такие как Syslinux, не поддерживают файловые системы с несколькими устройствами.
- Btrfs не читает автоматически с самого быстрого устройства, поэтому смешивание различных типов дисков приводит к нестабильной производительности. Подробности см. в [1].

Советы по обслуживанию многоуровневых файловых систем Btrfs см. в #RAID.

## Настройка файловой системы

### Копирование при записи (CoW)

По умолчанию Btrfs постоянно использует copy-on-write для всех файлов. При записи данные не перезаписываются; вместо этого модифицированная копия блока записывается в новое место, а метаданные обновляются, чтобы указать на новое место. Подробности реализации, а также преимущества и недостатки см. в разделе Btrfs Sysadmin Guide.

#### Отключение CoW

Warning: Отключение CoW в Btrfs также отключает контрольные суммы. Btrfs не сможет обнаружить поврежденные файлы `nodatacow`. В сочетании с RAID 1 перебои в электропитании или другие источники повреждений могут привести к рассинхронизации данных

Чтобы отключить копирование при записи для вновь созданных файлов в смонтированном субтоме, используйте параметр монтирования `nodatacow`. Это повлияет только на вновь созданные файлы. Для существующих файлов копирование при записи все равно будет происходить. Опция `nodatacow` также отключает сжатие. Подробности смотрите в btrfs(5).

Note: From btrfs(5) § MOUNT OPTIONS:

  в рамках одной файловой системы невозможно монтировать одни подтома с `nodatacow`, а другие с `datacow`. Опция монтирования первого смонтированного субтома применяется ко всем остальным субтомам.

Чтобы отключить копирование при записи для отдельных файлов/каталогов, выполните следующие действия:

    $ chattr +C /dir/file

Это отключит копирование при записи для тех операций, в которых существует только одна ссылка на файл. Если ссылок больше одной, например, из-за клонирования файлов / облегченного клонирования или снимков файловой системы, копирование при записи все равно будет происходить. Обратите внимание, что начиная с coreutils 9.0, `cp` пытается выполнять облегченные копии по умолчанию — см. cp(1) для более подробной информации.

Note: From chattr(1):

  Для btrfs, флаг '`C`' должен быть установлен для новых или пустых файлов. Если он установлен на файле, который уже имеет блоки данных, то неизвестно, когда блоки, назначенные файлу, станут полностью стабильными. Если флаг '`C`' установлен для каталога, он не будет иметь никакого эффекта на каталог, но новые файлы, созданные в этом каталоге, будут иметь атрибут `No_COW`.

Tip: В соответствии с примечанием выше, вы можете использовать следующий трюк, чтобы отключить копирование при записи для существующих файлов в каталоге:

    $ mv /path/to/dir /path/to/dir_old
    $ mkdir /path/to/dir
    $ chattr +C /path/to/dir
    $ cp -a --reflink=never /path/to/dir_old/. /path/to/dir
    $ rm -rf /path/to/dir_old

Убедитесь, что данные не используются во время этого процесса. Также обратите внимание, что `mv` или `cp` без `--reflink=never`, как описано ниже, работать не будут.

### Сжатие

Btrfs поддерживает прозрачное и автоматическое сжатие. Это уменьшает размер файлов, а также значительно увеличивает срок службы флеш-носителей за счет уменьшения усиления записи. См. Fedora:Changes/BtrfsByDefault#Compression, [2] и [3]. Это также может улучшить производительность, в некоторых случаях (например, однопоточные задачи с интенсивным файловым вводом-выводом), и в то же время явно ухудшить производительность в других случаях (например, многопоточные задачи и/или задачи с интенсивным процессором и большим файловым вводом-выводом). Более высокая производительность обычно достигается при использовании самых быстрых алгоритмов сжатия, zstd и lzo, и некоторые benchmarks предоставляют подробные сравнения.

Опция монтирования `compress=alg` позволяет автоматически рассматривать каждый файл на предмет сжатия, где `alg` - это либо `zlib`, `lzo`, `zstd`, либо `no`. (для отсутствия сжатия). Используя этот параметр, btrfs будет проверять, уменьшает ли сжатие первой порции данных. Если да, то вся запись в этот файл будет сжата. Если нет, то ничего не будет сжато. При использовании этой опции, если первая часть записи не уменьшится, сжатие не будет применено к записи, даже если остальные данные сильно уменьшатся. [4]. Это сделано для того, чтобы не заставлять диск ждать начала записи, пока все записываемые данные не будут полностью переданы btrfs и сжаты.

Вместо этого можно использовать опцию монтирования `compress-force=alg`, которая заставляет btrfs пропустить проверку, сжимает ли сжатие первую часть, и включает автоматическую попытку сжатия для каждого файла. В худшем случае это может привести к (незначительному) увеличению загрузки процессора без всякой цели. Однако эмпирическое тестирование на нескольких системах смешанного использования показало значительное улучшение примерно на 10% сжатия диска при использовании `compress-force=zstd` по сравнению с просто `compress=zstd`, который также имел 10% сжатие диска.

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

Чтобы применить сжатие к существующим файлам, используйте команду `btrfs filesystem defragment -calg`, где `alg` - это `zlib`, `lzo` или `zstd`. Например, чтобы повторно сжать всю файловую систему с помощью zstd, выполните следующую команду:

    # btrfs filesystem defragment -r -v -czstd /

Чтобы включить сжатие при установке Arch на пустой раздел Btrfs, используйте опцию `compress` при монтирование файловой системы: `mount -o compress=zstd /dev/sdxY /mnt/`. Во время настройки добавьте `compress=zstd` в опции монтирования корневой файловой системы в fstab.

Tip: Сжатие также может быть включено для каждого файла без использования опции монтирования `compress`; для этого примените `chattr +c` к файлу. Когда эта опция применяется к каталогам, новые файлы будут автоматически сжиматься по мере их появления.
Warning:

- Системы, использующие старые ядра или btrfs-progs без поддержки `zstd`, могут быть не в состоянии прочитать или восстановить вашу файловую систему, если вы используете эту опцию.
- GRUB ввел поддержку zstd в версии 2.04. Убедитесь, что вы действительно обновили загрузчик, установленный в MBR/ESP с тех пор, запустив `grub-install` с соответствующими опциями для вашей настройки BIOS/UEFI, поскольку это не делается автоматически. См. FS#63235.

#### Просмотр типов и коэффициентов сжатия

compsize берет список файлов (или всю файловую систему btrfs) и измеряет используемые типы сжатия и эффективные коэффициенты сжатия. Размер без сжатия может не совпадать с числом, выдаваемым другими программами, такими как du(1), потому что каждый объем учитывается один раз, даже если он перелинкован несколько раз, и даже если часть его больше нигде не используется, но не была собрана в мусор. Опция `-x` удерживает его на одной файловой системе, что полезно в ситуациях типа `compsize -x /`, чтобы избежать попыток поиска в подкаталогах не-btrfs и сбоя всего запуска.

### Субтома

This article or section is a candidate for merging with User:I2Oc9/Btrfs_subvolumes.

Notes: A more straightforward introduction (Discuss in Talk:Btrfs (Русский))

"Подтомник btrfs не является блочным устройством (и не может рассматриваться как устройство), вместо этого подтомник btrfs можно рассматривать как пространство имен файлов POSIX. Доступ к этому пространству имен может осуществляться через подтомный том верхнего уровня файловой системы, или он может быть смонтирован сам по себе." [5].

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

Более подробную информацию можно найти по следующим ссылкам:

- Btrfs Wiki SysadminGuide#Subvolumes
- Btrfs Wiki Начало работы#Основные команды файловой системы
- Btrfs Wiki Деревья.

#### Создание подтома

Чтобы создать субтом:

    # btrfs subvolume create /path/to/subvolume

#### Список подтомов

Чтобы просмотреть список текущих подтомов и их идентификаторы под `path`:

    # btrfs subvolume list -p path.

#### Удаление подтома

Чтобы удалить подтомник:

    # btrfs subvolume delete /path/to/subvolume.

Начиная с Linux 4.18, можно также удалять подтомник как обычный каталог (`rm -r`, `rmdir`).

#### Монтирование подтомов

Подтомные тома можно монтировать как разделы файловой системы, используя флаги монтирования `subvol=/path/to/subvolume` или `subvolid=objectid`. Например, вы можете иметь субтом с именем `subvol_root` и монтировать его как `/`. Можно имитировать традиционные разделы файловой системы, создавая различные подтома на верхнем уровне файловой системы и затем монтируя их в соответствующих точках монтирования. Предпочтительнее монтировать, используя `subvol=/path/to/subvolume`, а не субтом, поскольку субтом может измениться при восстановлении #Snapshots[ссылка недействительна: раздел не найден], что потребует изменения конфигурации монтирования.

Совет: Изменение компоновки субтома упрощается, если не использовать субтом верхнего уровня (ID=5) в качестве `/` (что делается по умолчанию). Вместо этого следует создать подтомник для хранения фактических данных и смонтировать его как `/`.
Note: From btrfs(5) § MOUNT OPTIONS:

  Большинство опций монтирования применяются к всей файловой системе, и только опции для первого монтируемого субтома будут иметь силу. Это связано с недостаточной реализацией и может измениться в будущем.

Смотрите в Btrfs Wiki FAQ, какие опции монтирования можно использовать для каждого подтома.

Смотрите Snapper#Предлагаемая схема файловой системы[ссылка недействительна: раздел не найден], Btrfs SysadminGuide#Managing Snapshots и Btrfs SysadminGuide#Layout для примеров схем файловых систем с использованием субтомов.

Полный список опций монтирования, специфичных для btrfs, приведен в разделе btrfs(5).

#### Монтирование субтома в качестве корневого

Чтобы использовать субтом в качестве корневой точки монтирования, укажите субтом через kernel parameter, используя `rootflags=subvol=/path/to/subvolume`. Отредактируйте корневую точку монтирования в `/etc/fstab` и укажите параметр монтирования `subvol=`. В качестве альтернативы можно указать субтом с его id, `rootflags=subvolid=objectid` в качестве параметра ядра и `subvolid=objectid` в качестве опции монтирования в `/etc/fstab`. Предпочтительнее монтировать, используя `subvol=/path/to/subvolume`, а не субтом, поскольку субтом может измениться при восстановлении #Snapshots[ссылка недействительна: раздел не найден], что потребует изменения конфигурации монтирования, иначе система не загрузится.

#### Изменение субтома по умолчанию

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

    # btrfs subvolume set-default subvolume-id /.

где subvolume-id можно найти с помощью listing[ссылка недействительна: раздел не найден].

Note: После изменения стандартного подтома в системе с GRUB, вы должны запустить `grub-install` снова, чтобы уведомить загрузчик об изменениях. См. эту тему форума.

Изменение подтома по умолчанию с помощью `btrfs subvolume set-default` сделает верхний уровень файловой системы недоступным, за исключением использования опций монтирования `subvol=/` или `subvolid=5` [6].

### Квота

Warning: Qgroup еще не стабильна, и сочетание квоты с (слишком большим) количеством снимков субтомов может вызвать проблемы с производительностью, например, при удалении снимков. Кроме того, есть еще несколько известных проблем.

Поддержка квот в Btrfs реализована на уровне субтома с помощью групп квот или qgroup: По умолчанию каждому субтому назначается группа квот в виде 0/subvolume_id. Однако при желании можно создать группу квот с любым номером.

Для использования qgroups необходимо сначала включить квотирование с помощью команды

    # btrfs quota enable path

С этого момента вновь созданные субтома будут контролироваться этими группами. Чтобы ретроспективно включить их для уже существующих субтомов, включите квотирование в обычном режиме, затем создайте qgroup (группу квотирования) для каждого из этих субтомов, используя их subvolume_id, и повторно просканируйте их:

    # btrfs subvolume list path | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} path
    # btrfs quota rescan path

Группы квот в Btrfs образуют древовидную иерархию, в которой qgroups прикреплены к субтомам. Ограничения на размер устанавливаются для каждой qgroup и применяются при достижении любого предела в дереве, содержащем данный субтом.

Ограничения на группы квот могут применяться либо к общему использованию данных, либо к использованию данных без общего доступа, либо к использованию сжатых данных, либо к обоим. Копирование и удаление файлов могут влиять на лимиты, так как лимит нераспределенных данных другой qgroup может измениться, если файлы исходного тома удалены и осталась только одна копия. Например, свежий снимок разделяет почти все блоки с исходным субтомом, новые записи в любой из субтомов будут увеличивать эксклюзивный лимит, удаление общих данных в одном томе увеличивает эксклюзивный лимит в другом.

Чтобы применить ограничение к qgroup, используйте команду `btrfs qgroup limit`. В зависимости от использования вы можете использовать либо общий лимит, либо неразделенный лимит (`-e`), либо сжатый лимит (`-c`). Чтобы показать использование и лимиты для заданного пути в файловой системе, используйте

    # btrfs qgroup show -reF path

### Интервал фиксации

Периодичность записи данных в файловую систему диктуется самой Btrfs и общесистемными настройками. По умолчанию Btrfs устанавливает 30-секундный интервал между контрольными точками, через который новые данные фиксируются в файловой системе. Это можно изменить, добавив опцию монтирования `commit` в `/etc/fstab` для раздела btrfs.

    LABEL=arch64 / btrfs defaults,compress=zstd,commit=120 0 0

Общесистемные настройки также влияют на интервалы фиксации. Они включают файлы в разделе `/proc/sys/vm/*` и выходят за рамки данной вики-статьи. Документация по ядру для них доступна по адресу https://docs.kernel.org/admin-guide/sysctl/vm.html.

### SSD TRIM

Файловая система Btrfs может освобождать неиспользуемые блоки с SSD диска, поддерживая команду TRIM. Начиная с версии ядра 5.6 имеется поддержка асинхронного отбрасывания, включаемая опцией монтирования `discard=async`. Освобожденные экстенты не отбрасываются сразу, а группируются и обрезаются позже отдельным рабочим потоком, что улучшает задержку фиксации.

Дополнительную информацию о включении и использовании TRIM можно найти в Solid State Drives#TRIM.

## Использование

### Файл подкачки

Файл подкачки в Btrfs поддерживаются начиная с ядра Linux 5.0.[7]. Правильный способ инициализации файла подкачки заключается в том, чтобы сначала создать подтомник без снэпшотов для размещения файла, а затем установить атрибут `No_COW` на весь каталог с помощью chattr.

    # chattr +C /path/to/swapsubvolume

С этого момента любой новый файл, созданный внутри поддиска подкачки, будет иметь установленный атрибут `No_COW`.

Продолжите действия в разделе Файл подкачки#Создание файла подкачки. Настройка гибернации для файла подкачки описана в Power management (Русский)/Suspend and hibernate (Русский)#Гибернация в файл подкачки на Btrfs.

Примечание: Начиная с ядра Linux 5.0, Btrfs имеет встроенную поддержку файла подкачки с некоторыми ограничениями:

- Файл подкачки не может находиться на подтоме с моментальным снимком. Правильной процедурой является создание нового подтома для размещения в нем файла подкачки.
- Не поддерживаются файлы подкачки на файловых системах, которые охватывают несколько устройств. См. btrfs(5) § SWAPFILE SUPPORT и обсуждение на форумах Arch.

### Отображение используемого/свободного пространства

Общие инструменты пользовательского пространства linux, такие как df(1), будут неточно отображать свободное пространство на разделе Btrfs. Рекомендуется использовать `btrfs filesystem usage` для запроса разделов Btrfs. Например, для получения полной статистики распределения и использования устройств:

    # btrfs filesystem usage /

Note: Команда `btrfs filesystem usage` в настоящее время не работает корректно с `RAID5/RAID6` RAID-уровнями.

В качестве альтернативы, `btrfs filesystem df` позволяет быстро проверить использование выделенного пространства без необходимости запуска от имени root:

    $ btrfs filesystem df /

Более подробную информацию см. в [8].

Те же ограничения относятся к инструментам, анализирующим использование пространства для некоторого подмножества файловой системы, таким как du(1) или ncdu(1), поскольку они не учитывают перелинковку, снимки и сжатие. Вместо этого смотрите btduAUR и compsize[ссылка недействительна: раздел не найден] для альтернатив с поддержкой btrfs.

### Дефрагментация

Warning: Крупная регрессия в ядре Linux версии 5.16.x < 5.16.5 вызывает бесконечный цикл дефрагментации Btrfs на некоторых системах, влияя как на ручную, так и на автоматическую дефрагментацию. Это вызывает экстремальные нагрузки ввода-вывода на затронутые диски, что может сильно сократить срок их службы и повлиять на их производительность. Поэтому не рекомендуется использовать `autodefrag` в этих версиях, следует даже использовать `noautodefrag`, чтобы убедиться, что автоматическая дефрагментация отключена. См. [9] и [10].

Btrfs поддерживает онлайн-дефрагментацию через опцию монтирования `autodefrag`, см. btrfs(5) § MOUNT OPTIONS. Чтобы вручную дефрагментировать корень, используйте:

    # btrfs filesystem defragment -r /

Использование вышеприведенной команды без ключа `-r` приведет к дефрагментации только метаданных, хранящихся в подтоме, содержащем каталог. Это позволяет дефрагментировать один файл, просто указав путь.

Дефрагментация файла, имеющего COW-копию (либо моментальную копию, либо копию, созданную с помощью `cp` или bcp), плюс использование переключателя `-c` с алгоритмом сжатия может привести к созданию двух несвязанных файлов, что эффективно увеличит использование диска.

### RAID

Btrfs предлагает встроенный "RAID" для #Многоустройственная файловая система[ссылка недействительна: раздел не найден]ов. Примечательными особенностями, которые отличают btrfs RAID от mdadm, являются самовосстанавливающиеся избыточные массивы и онлайн балансировка. Дополнительную информацию см. на вики-странице Btrfs. На странице сисадмина Btrfs также есть раздел с более подробной технической информацией.

Warning: В коде Parity RAID (RAID 5/6) есть несколько серьезных ошибок потери данных. Более подробную информацию смотрите на RAID5/6 page Btrfs Wiki и в сообщении об ошибке в linux-btrfs mailing list. В июне 2020 года кто-то опубликовал полный список текущих проблем и полезное руководство по восстановлению.

### Скраб

This article or section needs expansion.

Reason: Исследует ли Btrfs scrub субтом или устройство, на котором он находится? (Discuss in Talk:Btrfs (Русский))

В Btrfs Wiki Glossary говорится, что Btrfs scrub - это "[a]онлайн инструмент проверки файловой системы. Считывает все данные и метаданные в файловой системе, использует контрольные суммы и дубликаты копий из RAID-хранилища для выявления и восстановления поврежденных данных."

Note: Запущенный процесс очистки предотвратит приостановку системы, подробности см. в этой теме

#### Запуск вручную

Чтобы запустить (фоновый) скруб на файловой системе, содержащей `/`:

    # btrfs scrub start /

Чтобы проверить состояние запущенного скраба, выполните следующие действия:

    # btrfs scrub status /

#### Запуск с помощью службы или таймера

Пакет btrfs-progs приносит блок `btrfs-scrub@.timer` для ежемесячной очистки указанной точки монтирования. Включите таймер с помощью экранированного пути, например, `btrfs-scrub@-.timer` для `/` и `btrfs-scrub@home.timer` для `/home`. Вы можете использовать `systemd-escape -p /path/to/mountpoint` для экранирования пути, подробности смотрите в systemd-escape(1).

Вы также можете запустить скраб, starting `btrfs-scrub@.service` (с тем же кодированным путем). Преимущество этого способа перед `btrfs scrub` (от имени пользователя root) в том, что результаты очистки будут записаны в журнал systemd journal.

На больших NVMe-дисках с недостаточным охлаждением (например, в ноутбуке) скрабирование может считывать данные достаточно быстро и долго, чтобы диск сильно нагрелся. Если вы запускаете скрабы с помощью systemd, вы можете легко ограничить скорость скрабирования с помощью опции `IOReadBandwidthMax`, описанной в systemd.resource-control(5), используя drop-in файл.

### Баланс

"Баланс" снова пропускает все данные в файловой системе через аллокатор. В первую очередь он предназначен для восстановления баланса данных в файловой системе между устройствами, когда устройство добавляется или удаляется. Баланс восстанавливает недостающие копии для избыточных уровней RAID, если устройство вышло из строя." [11] См. Страница FAQ по Upstream.

В файловой системе с одним устройством баланс может быть также полезен для (временного) уменьшения количества выделенных, но неиспользуемых (мета)чанков данных. Иногда это необходимо для устранения проблем "filesystem full".

    # btrfs balance start --bg /
    # btrfs balance status /

### Снапшоты

"Снапшот - это просто субтом, который делится своими данными (и метаданными) с другим субтомом, используя возможности COW в btrfs." Подробности смотрите в Btrfs Wiki SysadminGuide#Snapshots.

Чтобы создать моментальный снимок:

    # btrfs subvolume snapshot source [dest/]name

Для создания снимка, доступного только для чтения, добавьте флаг `-r`. Чтобы создать доступную для записи версию снимка, доступного для чтения, просто создайте его снимок.

Примечание:

- Возможно преобразование моментального снимка на месте из readonly в writeable. Однако, это не рекомендуется, поскольку это вызывает проблемы с любой будущей инкрементной отправкой/получением. Создание нового снимка с возможностью записи предотвращает такие проблемы.
- Снимки не являются рекурсивными. Каждый вложенный подтомник будет пустым каталогом внутри моментального снимка.

### Отправка/получение

Подтомник может быть отправлен на stdout или в файл с помощью команды `send`. Обычно это наиболее полезно при передаче в команду Btrfs `receive`. Например, для отправки снимка с именем `/root_backup` (возможно, снимок, который вы сделали ранее из `/`) в `/backup`, вы должны сделать следующее:

    # btrfs send /root_backup | btrfs receive /backup

Отправляемый снимок должен быть доступен только для чтения. Приведенная выше команда полезна для копирования подтома на внешнее устройство (например, USB-диск, смонтированный по адресу `/backup` выше).

Вы также можете отправить только разницу между двумя моментальными снимками. Например, если вы уже отправили копию `root_backup` выше и сделали новый снимок с возможностью чтения в вашей системе с именем `root_backup_new`, то для отправки только инкрементной разницы в `/backup` сделайте следующее:

    # btrfs send -p /root_backup /root_backup_new | btrfs receive /backup

Теперь в `root_backup_new` будет присутствовать новый субтом с именем `/backup`.

Смотрите Btrfs Wiki's Incremental Backup page и #Incremental backup to external drive[ссылка недействительна: раздел не найден] о том, как использовать это для инкрементального резервного копирования и об инструментах, автоматизирующих этот процесс.

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

Используя копирование при записи (CoW), Btrfs может копировать файлы или целые подтома без фактического копирования данных. Однако каждый раз, когда файл изменяется, создается новая "правильная" копия. Дедупликация делает еще один шаг вперед, активно определяя блоки данных с общими последовательностями и объединяя их в объем с той же семантикой копирования при записи.

Инструменты, предназначенные для дедупликации разделов в формате Btrfs, включают duperemove, bees, bedupAUR и btrfs-dedup. Также может потребоваться просто дедуплицировать данные на уровне файлов, используя, например, rmlint, jdupesAUR или dduper-gitAUR. Обзор возможностей этих программ и дополнительную информацию можно найти на upstream Wiki entry.

Кроме того, разработчики Btrfs работают над внутриполосной (также известной как синхронная или поточная) дедупликацией, то есть дедупликацией, выполняемой при записи новых данных в файловую систему. В настоящее время это все еще эксперимент, который разрабатывается вне дерева. Пользователям, желающим протестировать новую функцию, следует ознакомиться с соответствующей вики-страницей ядра.

### Изменение размера

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

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

- Новый размер должен быть больше размера существующих данных; в противном случае произойдет потеря данных.
- Новый размер должен быть равен или меньше текущего размера устройства, поскольку размер файловой системы не может выходить за пределы доступного пространства.

При уменьшении размера файловой системы на устройстве убедитесь, что новый размер удовлетворяет следующим условиям:

- Новый размер должен быть больше размера существующих данных; в противном случае произойдет потеря данных.
- Новый размер должен быть равен или меньше текущего размера устройства, так как размер файловой системы не может выходить за пределы доступного пространства.

Note: Если вы планируете также уменьшить размер логического тома, на котором находится файловая система, убедитесь, что вы уменьшили размер файловой системы до того, как попытаетесь уменьшить размер устройства или логического тома.

Чтобы увеличить размер файловой системы до максимально доступного размера устройства:

    # btrfs filesystem resize max /

Чтобы расширить файловую систему до определенного размера:

    # btrfs filesystem resize size /

Замените `size` на желаемый размер в байтах. Вы также можете указать единицы измерения значения, например K (килобайты), M (мебибайты) или G (гибибайты). В качестве альтернативы можно указать увеличение или уменьшение текущего размера, дополнив значение знаком плюс (+) или минус (-) соответственно:

    # btrfs filesystem resize +size /
    # btrfs filesystem resize -size /

## Известные проблемы

Несколько ограничений следует знать, прежде чем пробовать.

### Шифрование

Btrfs не имеет встроенной поддержки шифрования, но это может появиться в будущем. Пользователи могут зашифровать раздел перед запуском `mkfs.btrfs`. См. dm-crypt/Шифрование всей системы#Вложенные тома Btrfs с подкачкой.

Существующие файловые системы Btrfs могут использовать что-то вроде EncFS или TrueCrypt, хотя, возможно, без некоторых возможностей Btrfs.

### Проблемы проверки btrfs

Инструмент `btrfs check` имеет известные проблемы и не должен запускаться без дополнительного чтения, см. раздел #btrfs check[ссылка недействительна: раздел не найден].

## Советы и рекомендации

### Диск Btrfs без разделов

Warning: Многие пользователи не хотят использовать этот тип установки и вместо этого должны установить Btrfs на обычный раздел. Более того, GRUB настоятельно не рекомендует установку на диск без разделов

Btrfs может занимать все устройство хранения данных, заменяя схемы разбиения MBR или GPT, используя subvolumes[ссылка недействительна: раздел не найден] для имитации разделов. Однако использование схемы без разделов не обязательно для того, чтобы просто Создать файловую систему Btrfs на существующем раздел, который был создан другим методом. Существуют некоторые ограничения для однодисковых установок без разделов:

- Невозможно разместить другие файловые системы на другом разделе того же диска.
- В связи с предыдущим пунктом, размещение ESP на этом диске невозможно. Для загрузки UEFI необходимо другое устройство.
- Если используется версия ядра Linux до 5.0, вы не можете использовать swap area, так как Btrfs не поддерживала swap files до 5.0 и нет места для создания swap partition.

Чтобы перезаписать существующую таблицу разделов в Btrfs, выполните следующую команду:

    # mkfs.btrfs /dev/sdX

Например, используйте `/dev/sda`, а не `/dev/sda1`. Последний вариант форматирует существующий раздел, а не заменяет всю схему разметки. Поскольку корневым разделом является Btrfs, убедитесь, что `btrfs` скомпилирован в ядро, или поместите `btrfs` в mkinitcpio.conf#MODULES и mkinitcpio (Русский)#Создание загрузочного образа.

Установите загрузчик, как для устройства хранения данных с Partitioning (Русский)#Главная загрузочная запись (MBR). Смотрите Syslinux#Ручная установка[ссылка недействительна: раздел не найден] или GRUB/Типы и трюки#Установка на диск с разделами или без разделов. Если ядро не загружается из-за `Failed to mount /sysroot.`, добавьте `GRUB_PRELOAD_MODULES="btrfs"` в `/etc/default/grub` и создайте конфигурацию grub (GRUB#Generate the main configuration file).

### Преобразование Ext3/4 в Btrfs

Warning: В списке рассылки btrfs есть много сообщений о неполной/корректной/сломанной конвертации. Убедитесь, что у вас есть рабочие резервные копии всех данных, которые вы не можете позволить себе потерять. Смотрите Конвертация из Ext3 на btrfs wiki для получения дополнительной информации.

Загрузитесь с установочного CD, а затем выполните конвертацию:

    # btrfs-convert /dev/partition

Смонтируйте раздел и проверьте преобразование, проверив файлы. Обязательно измените `/etc/fstab`, чтобы отразить изменения (type на `btrfs` и fs_passno [последнее поле] на `0`, поскольку Btrfs не выполняет проверку файловой системы при загрузке). Также обратите внимание, что UUID раздела изменился, поэтому обновите fstab соответствующим образом при использовании UUID. `chroot` в систему и перестройте список меню загрузчиков (см. Install Arch Linux from existing Linux (Русский)). При преобразовании корневой файловой системы, пока она еще chrooted, запустите `mkinitcpio -p linux` для регенерации initramfs, иначе система не сможет успешно загрузиться.

Примечание: Если что-то не так, или не удается смонтировать или записать файлы на только что преобразованную btrfs, всегда есть возможность отката, пока резервный подтом `/ext2_saved` все еще там. Для отката используйте команду `btrfs-convert -r /dev/partition`, которая отменит все изменения в новой файловой системе btrfs.

Убедившись в отсутствии проблем, завершите преобразование, удалив резервный подтом `ext2_saved`. Обратите внимание, что без него вы не сможете вернуться к ext3/4.

    # btrfs subvolume delete /ext2_saved

Наконец, balance[ссылка недействительна: раздел не найден] файловая система восстановит пространство.

Помните, что некоторые приложения, которые были установлены ранее, должны быть адаптированы к Btrfs.

### Аппаратное ускорение контрольной суммы

The factual accuracy of this article or section is disputed.

Reason: Согласно [12], алгоритм CRC, выводимый следующей командой, просто соответствует "любой криптобиблиотеке, загруженной в данный момент", и "может произвольно меняться во время загрузки файловой системы". Поэтому не следует полагаться на этот метод, чтобы определить, какой алгоритм CRC в данный момент использует Btrfs. (Discuss in Talk:Btrfs (Русский))

CRC32 - это новая инструкция в Intel SSE4.2. Чтобы проверить, является ли контрольная сумма Btrfs аппаратно ускоренной:

    # dmesg | grep crc32c

    Btrfs loaded, crc32c=crc32c-intel

Если вы видите `crc32c=crc32c-generic`, это, вероятно, потому, что ваш корневой раздел - Btrfs, и вам придется скомпилировать `crc32c-intel` в ядро, чтобы заставить его работать. Вставка `crc32c-intel` в mkinitcpio.conf не работает.

### Восстановление повреждений

Warning: Инструмент `btrfs check` имеет известные проблемы, см. раздел #btrfs check[ссылка недействительна: раздел не найден]

btrfs-check не может быть использован на смонтированной файловой системе. Чтобы иметь возможность использовать btrfs-check без загрузки с live USB, добавьте его на начальный ramdisk:

    /etc/mkinitcpio.conf

    BINARIES=(btrfs)

Regenerate the initramfs.

Затем, если возникнут проблемы с загрузкой, утилита будет доступна для восстановления.

Примечание: Если процесс fsck должен аннулировать кэш пространства (и/или другие кэши?), то это нормально, если последующая загрузка зависнет на некоторое время (может появиться консольное сообщение о зависании btrfs-transaction). Система должна восстановиться после этого через некоторое время

Дополнительную информацию см. на Btrfs Wiki page.

### Загрузка в моментальные снимки

Для загрузки в снимок применяется та же процедура, что и для монтирования подтома в качестве корневого раздела, как описано в разделе mounting a subvolume as your root partition[ссылка недействительна: раздел не найден], поскольку снимки можно монтировать как подтома.

- При использовании GRUB вы можете автоматически заполнить меню загрузки снимками btrfs при регенерации конфигурационного файла с помощью grub-btrfs или grub-btrfs-gitAUR.
- При использовании rEFInd вы можете автоматически заполнить загрузочное меню снимками btrfs с помощью refind-btrfsAUR, после systemd (Русский)#Использование юнитов. `refind-btrfs.service`.

### Использование подтомов Btrfs с помощью systemd-nspawn

См. статьи Systemd-nspawn#Use Btrfs subvolume as container root и Systemd-nspawn#Use temporary Btrfs snapshot of container.

### Сокращение времени доступа к обновлению метаданных

Из-за того, что Btrfs работает по принципу copy-on-write, простой доступ к файлам может вызвать копирование и запись метаданных. Уменьшение частоты обновления времени доступа может устранить это непредвиденное использование диска и увеличить производительность. Смотрите fstab#atime options для доступных опций.

### Инкрементное резервное копирование на внешний диск

Следующие пакеты используют `btrfs send` и `btrfs receive` для инкрементной отправки резервных копий на внешний диск. Обратитесь к их документации, чтобы увидеть различия в реализации, возможностях и требованиях.

- btrbk — Инструмент для создания моментальных снимков и удаленных резервных копий подтомов Btrfs.

  https://github.com/digint/btrbk || btrbkAUR

- buttersink — Buttersink - это как rsync для моментальных снимков Btrfs. Требуется Python 2.

  https://github.com/AmesCornish/buttersink.git || buttersink-gitAUR

- snap-sync — Используйте снимки Snapper для резервного копирования на внешний диск или удаленную машину.

  https://github.com/wesbarnett/snap-sync.git || snap-sync

- snapsync — Утилита синхронизации для Snapper.

  https://github.com/doudou/snapsync || ruby-snapsyncAUR

Следующий пакет позволяет создавать резервные копии моментальных снимков snapper на файловые системы, отличные от Btrfs.

- snapborg — borgmatic-подобный инструмент, который интегрирует моментальные снимки snapper с borg резервными копиями.

  https://github.com/enzingerm/snapborg || snapborgAUR

Устранение неполадок == Устранение неполадок ==

Для общего устранения неполадок смотрите Btrfs Problem FAQ.

### GRUB

#### Смещение раздела

Проблема смещения может возникнуть, когда вы пытаетесь встроить `core.img` в диск с разделами. Это означает, что it is OK можно внедрить `core.img` от GRUB в пул Btrfs на диске без разделов (например, `/dev/sdX`) напрямую.

GRUB может загружать разделы Btrfs, однако модуль может быть больше, чем у других файловая система. А файл `core.img`, созданный `grub-install`, может не поместиться в первые 63 сектора (31.5KiB) диска между MBR и первым разделом. Современные инструменты разметки, такие как `fdisk` и `gdisk`, позволяют избежать этой проблемы, смещая первый раздел примерно на 1 или 2 Мбайт.

#### Отсутствующий корень

The factual accuracy of this article or section is disputed.

Reason: Suggestgestues editing a non-configuration file manually. (Discuss in Talk:Btrfs#Should not suggest to edit files in /usr/share)

Пользователи сталкиваются со следующим: `error no such device: root` при загрузке с RAID-массива, то отредактируйте /usr/share/grub/grub-mkconfig_lib и уберите обе кавычки из строки `echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"`. Пересоздайте конфиг для grub и система должна загрузиться без ошибок.

### Монтирование затянулось

Иногда, особенно на больших массивах RAID1, монтирование может прерваться во время загрузки с сообщением в журнале, например:

    Jan 25 18:05:12 host systemd[1]: storage.mount: Mounting timed out. Terminating.
    Jan 25 18:05:46 host systemd[1]: storage.mount: Mount process exited, code=killed, status=15/TERM
    Jan 25 18:05:46 host systemd[1]: storage.mount: Failed with result 'timeout'.
    Jan 25 18:05:46 host systemd[1]: Failed to mount /storage.
    Jan 25 18:05:46 host systemd[1]: Startup finished in 32.943s (firmware) + 3.097s (loader) + 7.247s (kernel)>
    Jan 25 18:05:46 host kernel: BTRFS error (device sda): open_ctree failed

Это можно легко обойти, обеспечив более длительный тайм-аут с помощью специфической для системы опции монтирования `x-systemd.mount-timeout` в fstab. Например:

    /dev/sda                /storage    btrfs       rw,relatime,x-systemd.mount-timeout=5min  0 0

### BTRFS: open_ctree failed

По состоянию на ноябрь 2014 года, похоже, существует ошибка в systemd или mkinitcpio, вызывающая следующую ошибку на системах с многоуровневой файловой системой Btrfs, использующих хук `btrfs` в `mkinitcpio.conf`:

    BTRFS: open_ctree failed
    mount: wrong fs type, bad option, bad superblock on /dev/sdb2, missing codepage or helper program, or other error

    In some cases useful info is found in syslog - try dmesg|tail or so.

    You are now being dropped into an emergency shell.

Обходным решением является удаление `btrfs` из массива `HOOKS` в `/etc/mkinitcpio.conf` и добавление `btrfs` в массив `MODULES`. Затем mkinitcpio (Русский)#Создание загрузочного образа и перезагрузитесь.

Вы получите ту же ошибку, если попытаетесь смонтировать raid-массив без одного из устройств. В этом случае необходимо добавить опцию монтирования `degraded` в `/etc/fstab`. Если ваш root находится на массиве, вы также должны добавить `rootflags=degraded` в параметры ядра.

По состоянию на август 2016 года, потенциальным обходным решением этой ошибки является монтирование массива только по одному диску в `/etc/fstab` и разрешение btrfs обнаруживать и добавлять остальные диски автоматически. Похоже, что сбою способствуют групповые идентификаторы, такие как UUID и LABEL. Например, массив RAID1 из двух устройств, состоящий из 'disk1' и disk2', будет иметь присвоенный ему UUID, но вместо UUID будет использоваться только `/dev/mapper/disk1` в `/etc/fstab`. Более подробное объяснение см. в следующей статье blog post.

Другим возможным обходным решением является удаление хука `udev` в mkinitcpio.conf и замена его хуком `systemd`. В этом случае `btrfs` не должен находиться в массивах `HOOKS` или `MODULES`.

Смотрите оригинальную тему на форумах и FS#42884 для дальнейшей информации и обсуждения.

### Проверка btrfs

Warning: Поскольку Btrfs находится в стадии интенсивной разработки, особенно команда `btrfs check`, настоятельно рекомендуется создать System maintenance (Русский)#Резервное копирование и проконсультироваться с btrfs-check(8) перед выполнением `btrfs check` с ключом `--repair`.

Команда btrfs-check(8) может быть использована для проверки или восстановления размонтированной файловой системы Btrfs. Однако этот инструмент ремонта еще не доработан и не может исправить некоторые ошибки файловой системы, даже те, которые не делают файловую систему немонтируемой.

## См. также

- Официальный сайт
  - Btrfs Wiki
  - Btrfs Documentation
- Связанные с производительностью
  - Btrfs на необработанных дисках?
  - Изменение размера листа и размера узла в Btrfs
  - $th5$1@dough.gmane.org/ Поддержка Btrfs для эффективной работы с SSD (выравнивание блоков данных)[устаревшая ссылка 2022-09-17]
  - Оптимизирована ли Btrfs для SSD?
  - Phoronix mount option benchmarking
    - Linux 5.8
    - Linux 5.0
    - Linux 4.9
    - Linux 3.14
    - Linux 3.11
    - Linux 3.9
    - Linux 3.7
    - Linux 3.2
  - Lzo vs. zLib
- Разное
  - Funtoo:BTRFS Fun
  - Ави Миллер представляет Btrfs на SCALE 10x, январь 2012 г.
  - Резюме выступления Криса Мейсона с LFCS 2012 г.
  - Btrfs: прекратите предоставлять операцию bmap, чтобы избежать повреждений файла подкачки 2009-01-21
  - Выполнение быстрого инкрементального резервного копирования с помощью Btrfs Send and Receive

Category:

- File systems (Русский)

Hidden categories:

- Pages or sections flagged with Template:Bad translation (Русский)
- Pages with broken section links
- Pages or sections flagged with Template:Merge
- Pages or sections flagged with Template:Expansion
- Pages or sections flagged with Template:Accuracy