Btrfs (B-tree File System)
Btrfs (B-tree File System)

Привет, Хабр!

Не все инсталляторы linux могут установить систему на btrfs subvolume. Ни один инсталлятор не может установить систему с применением nocow и compress только для определенных subvolume.

На примере Astra linux 1.8.4 с максимальным уровнем защищенности (включен МКЦ и МРД) и написанных мною скриптов для автоматизации я покажу, как перенести установленную систему на btrfs subvolume, а также установить nocow только у необходимых subvolume. Дополнительно будет описан второй скрипт для создания и восстановления снимков.

В скриптах есть полное описание кода, если кто захочет разобраться, как они работают или модифицировать их.

Часть 1. Перенос системы на btrfs subvolume через скрипт btrfs-autocreate-subvol

Скрипт может не удовлетворять всем вашим потребностям. Например, не поддерживается работа с шифрованными разделами (LUKS) и системой установленной в MBR режиме.

Работа скрипта проверена на live инсталляторе Astra linux 1.8.4.48.

Мною проверен перенос следующих систем: Astra linux 1.8.4.48 и Debian 13. Рекомендуется переносить систему сразу после установки, т.е. до первого запуска ОС. Например, ОС Astra linux с включенным МКЦ после первого запуска не получится перенести на subvolume.

Изображение (пример разметки)
Пример разметки
Пример разметки

Рекомендуется использовать последнее доступное ядро, т.к. в новых версиях обычно есть различные улучшения для btrfs. Пакет btrfs-progs в репозитории обычно соответствует последней доступной версии ядра.

После установки системы, если используется live инсталлятор, не перезагружайте ПК.

ОС, установка которых выполняется не из live инсталлятора (например, установщик Debian installer), необходимо установить в��полнив разбивку по аналогии с изображением выше, создав как минимум ESP раздел с точкой монтирования «/boot/efi» и btrfs раздел c точкой монтирования корня «/». После установки перезагрузитесь в live систему и выполните скрипт.

Описание основных параметров скрипта

-nsa) (no security attribute) Не выставлять атрибут безопасности security.PDPL на корень btrfs раздела для Astra linux. Укажите этот параметр, только если не будете использовать МКЦ/МРД. Timeshift на Astra linux корректно создает, но не восстанавливает снимки, если на корень раздела при переносе будет выставлен security.PDPL. Для работы со снимками, с учетом МКЦ/МРД, используйте родные команды btrfs или написанный мной скрипт btrfs-snapshot.

-f) (first) Автоматический выбор первого доступного btrfs раздела. Если этот параметр не указан, то должен быть указан -sbp.

-ceb) (copy efi boot) Заменить файл /EFI/boot/bootx64.efi в ESP разделе файлом grubx64.efi созданным при установке grub.

-neb "Значение") (name efi boot) Имя efi загрузчика для установки grub. Обязательный параметр. Имена текущих загрузочных записей вы можете посмотреть через команду efibootmgr. Начиная с astralinux 1.8.3 в системе используется наименование загрузочной записи «astra».

-rg "Значение"). (reinstall grub) Параметр для переустановки grub (Перенос системы на subvolume будет пропущен). В значении необходимо указать имя subvolume в котором находится система. Пример команды:

./btrfs-autocreate-subvol.sh -f -neb "astra" -ceb -rg "@"

-sbp "Значение") (select btrfs part) Имя btrfs раздела с системой (например, nvme0n1p4). Если параметр не указан, то должен быть указан параметр -f.

-sp "Значение") (subvolume param) Значение в специальном формате для добавления строки монтирования в fstab и создания указанных subvolume (точка монтирования;имя subvolume;параметры монтирования;признак использования nocow;тип сжатия). Параметр может быть указан более 1 раза.

Пояснения к параметру '-sp'

  • Точка монтирования — Обязательное поле.

  • Имя subvolume — Обязательное поле.

  • Параметры монтирования — если не указать, то будет использоваться defaults. Многие параметры монтирования, например, nodatacow, nodatasum, compress не могут быть выставлены для отдельных subvolume, а применяются ко всей файловой системе.

    Ссылка: Параметры монтирования btrfs

  • Признак использования nocow — Обязательное поле (0/1):

    0 - Не выполнять изменения;

    1 - Выставить атрибут nocow для subvolume. Атрибут добавляется командой chattr +C. nocow отключает копирование при записи и сжатие.

  • Тип сжатия — Необязательное поле. Может принимать следующие значения:

  1. lzo

  2. zlib

  3. zstd

  4. no - отключить сжатие (эквивалент chattr +m)

  5. пустое значение - ничего не делать

Если значение сжати�� указано, то будет добавлен атрибут файловой системы командой: btrfs property set <PATH> compression <VALUE>. Атрибут установленный через btrfs property имеет приоритет над глобальными настройками монтирования, т.е., при установлении атрибута, параметр сжатия в fstab для этого subvolume учитываться не будет.

Если не будет указан параметр «-sp» с точкой монтирования корня '/', то будет использоваться значение по умолчанию: '/;@;defaults;0;'.

Рекомендуется:

  • вынести /home, /tmp, /var/cache, /var/log, /var/tmp в отдельные subvolume;

  • к /tmp, /var/cache, /var/log, /var/tmp указать признак использования nocow со значением 1;

  • Если используется swap файл, создать его на отдельном subvolume с применением nocow.

Примеры полной команды:

./btrfs-autocreate-subvol.sh -f -ceb -neb "astra" -sp "/;@;space_cache=v2,nodiscard,relatime,compress=zstd;0;" -sp "/home;@home;nodiscard,relatime;0;" -sp "/tmp;@tmp;nodiscard,relatime;1;" -sp "/var/cache;@varcache;nodiscard,noatime;1;" -sp "/var/log;@varlog;nodiscard,noatime;1;" -sp "/var/tmp;@vartmp;nodiscard,relatime;1;" -sp "/swap;@swap;nodiscard,noatime;1;"
Изображения (выполнение скрипта и итог)
 Обработка переданных параметров
Обработка переданных параметров
 Информация о используемом диске и разделах
Информация о используемом диске и разделах
 Предварительная настройка (формирование fstab и выставление атрибута security.PDPL на корень файловой системы. Атрибут применим только на Astra linux)
Предварительная настройка (формирование fstab и выставление атрибута security.PDPL на корень файловой системы. Атрибут применим только на Astra linux)
 Создание subvolume и перенос данных
Создание subvolume и перенос данных
 Удаление ранее созданного снимка после успешного переноса
Удаление ранее созданного снимка после успешного переноса
 Установка  GRUB
Установка  GRUB
 Вывод списка загрузочных записей
Вывод списка загрузочных записей
 Обновленный Grub (в пути до boot есть имя subvolume корня системы ‘@’)
Обновленный Grub (в пути до boot есть имя subvolume корня системы ‘@’)
Как выглядит в системе
Как выглядит в системе
Выставленные атрибуты nocow
Выставленные атрибуты nocow
 Debian 13 перенесенный на btrfs subvolume
Debian 13 перенесенный на btrfs subvolume

Часть 2. Создание и восстановление снимков через скрипт btrfs-snapshot

Написанный мною скрипт для управления снимками btrfs. Работает на Astra linux с включенным МКЦ/МРД (не нужно отключать security.PDPL на корне раздела).

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

По умолчанию для неинтерактивного режима используется файл /etc/fstab в качестве источника subvolume и UUID разделов на которых они расположены.

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

export file_btrfs_part_list="путь-к-файлу"

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

UUID=98fb74e2-513c-4492-9df5-50c49e3a1539 / btrfs subvol=@

Изображение (пример запуска с указанием файла)
Пример запуска с указанием своего файла
Пример запуска с указанием своего файла

Параметры запуска

Создание снимка (-crw и -cro):

  • ./btrfs-snapshot.sh -crw "Имя-subvolume" - Будет создан снимок (чтение/запись) с именем "@snapshot_дата-время_имя-subvolume".

  • ./btrfs-snapshot.sh -cro "Имя-subvolume" - Будет создан снимок (только чтение) с именем "@snapshot_дата-время_имя-subvolume".

Восстановление снимка (--restore и --restore-last):

  • ./btrfs-snapshot.sh --restore "Имя-снимка" - Будет восстановлен снимок с указанным именем вместо subvolume указанного в конце имени снимка.

  • ./btrfs-snapshot.sh --restore-last "Имя-subvolume" - Будет восстановлен последний по дате снимок к указанному subvolume.

Список снимков (--list-snapshots):

  • ./btrfs-snapshot.sh --list-snapshots "Имя-subvolume" - Будет показан список снимков для указанного вами subvolume.

Перезагрузка после восстановления (--reboot должен быть указан до параметра --restore или --restore-last):

  • ./btrfs-snapshot.sh --reboot --restore "Имя-снимка" - Будет восстановлен снимок с указанным именем вместо subvolume указанного в конце имени снимка и выполнена перезагрузка.

  • ./btrfs-snapshot.sh --reboot --restore-last "Имя-subvolume" - Будет восстановлен последний по дате снимок к указанному subvolume и выполнена перезагрузка.

Список параметров запуска (-h или --help):

  • ./btrfs-snapshot.sh --help - Будет показан список параметров запуска.

Интерактивный режим (-i):

  • ./btrfs-snapshot.sh -i - Запуск скрипта в интерактивном режиме. При запуске в live системе доступен только интерактивный режим и он запускается по умолчанию.

Изображения (пример выполнения)
 Создание снимка чтение/запись для указанного subvolume
Создание снимка чтение/запись для указанного subvolume
Создание снимка только чтение для указанного subvolume
Создание снимка только чтение для указанного subvolume
Восстановление указанного снимка
Восстановление указанн��го снимка
Восстановление последнего снимка к указанному subvolume
Восстановление последнего снимка к указанному subvolume
Интерактивный режим.Выбор раздела и выбор subvolume
Интерактивный режим.Выбор раздела и выбор subvolume
Интерактивный режим. Выбор действия для subvolume
Интерактивный режим. Выбор действия для subvolume
Интерактивный режим. Запуск из live системы (Параметры скрипта не используются в live системе)
Интерактивный режим. Запуск из live системы (Параметры скрипта не используются в live системе)

Ссылка на репозиторий: Gitflic