Установка (перенос) системы linux на btrfs subvolume
Установка/переустановка загрузчика grub с установленной на btrfs subvolume системой (смотрите параметры скрипта)
Управление снимками на btrfs
Версия stable: 20260211_01
Рекомендуется ознакомление с инструкцией в docx или pdf
GITFLIC: https://gitflic.ru/user/medved0001
Вконтакте: https://vk.com/medved0001
Статья на Habr: Habr
Описание
Не все инсталляторы linux могут установить систему на btrfs subvolume.
Данная инструкция и скрипт предназначены для переноса системы (установленной на btrfs раздел) на btrfs subvolume.
Также есть параметр только для установки/переустановки загрузчика grub.
Скрипт может не удовлетворять всем вашим потребностям. Например, не поддерживается работа с шифрованными разделами (LUKS) и системой установленной в MBR режиме.
Скрипт создает плоскую структуру subvolume (все subvolume расположены в корне раздела). Вложенные subvolume, где используется путь вместо имени, не допускаются.
Работа скрипта проверена на live инсталляторе:
- Astra linux 1.8.4.48;
- ALTLinux 11.2.
Проверен перенос систем:
- Astra linux 1.8.4.48;
- Debian 13;
- ALTLinux 11.
ОС, установка которых выполняется не из live системы (например, установщик Debian installer), необходимо установить выполнив разбивку по аналогии с инструкцией, создав как минимум ESP раздел с точкой монтирования /boot/efi и btrfs раздел c точкой монтирования корня /. После установки перезагрузитесь в live систему и выполните скрипт.
Приведу пример установки Astra linux 1.8.
По любым вопросам и проблемам со скриптом обращайтесь в личные сообщения Вконтакте.
Инструкция к скрипту btrfs-autocreate-subvol
Установка системы
1.Выберите ручную разметку диска и откройте программу разметки.
Рекомендуется использовать последнее доступное ядро, т.к. в новых версиях обычно есть различные улучшения для btrfs. Пакет btrfs-progs в репозитории обычно соответствует последней доступной версии ядра.
2.Разметьте диск.
Обязательно создайте ESP раздел /boot/efi. Перенос установленной системы в MBR режиме не поддерживается.
На текущем этапе нужно создать btrfs раздел с точкой монтирования корня / и не создавать дополнительные subvolume. На 10.01.2026 инсталлятор не поддерживает прямую установку системы в subvolume.
Пример разметки есть в файле инструкции
3.Отключите перезагрузку ПК после завершения установки и начните установку системы.
4.Дождитесь завершения установки и не перезагружайте компьютер.
Скрипт с автовыполнением по заданным параметрам
Скачайте скрипт btrfs-autocreate-subvol.sh и запустите его с параметрами.
Допустимые параметры запуска:
Переустановка GRUB
-rg "Значение"). Параметр для переустановки grub (Перенос системы на subvolume будет пропущен). В значении необходимо указать имя subvolume в котором находится система. Пример команды:./btrfs-autocreate-subvol.sh -f -neb "astra" -ceb -rg "@"
Необязательные параметры при переносе
-
-amf) (alter move files) Альтернативный перенос файлов в subvolume. По умолчанию файлы в subvolume переносятся в рамках подключенного корневого раздела btrfs. Если вы укажите этот параметр, то каждый subvolume, перед переносом в него файлов, будет монтироваться в отдельный каталог с указанными вами параметрами монтирования для subvolume (могут быть применены не все параметры монтирования, т. к. subvolume будет смонтирован без отключения корня btrfs раздела). -
-im) (installer mode) Параметр считывающий UUID системного btrfs и efi разделов из файла. Используется при установке системы. Если файл/tmp/uuid-system-partсуществует, то первая строка будет взята для определениясистемного btrfs раздела, а вторая дляefi раздела. Подробно про внедрение данного скрипта вlive installer astra linuxбудет описано в скриптеastra linux create iso. -
-nsa) (no security attribute) Не выставлять атрибут безопасностиsecurity.PDPLна кореньbtrfsраздела дляAstra linux. Укажите этот параметр, только если не будете использоватьМКЦ/МРД. Безsecurity.PDPLнаAstra linuxне будет работатьМКЦ/МРД, но корректно восстанавливается снимок черезTimeshift. Для работы со снимками, с учетомМКЦ/МРД, используйте родные командыbtrfsили написанный мной скриптbtrfs-snapshot. -
-mb "Значение") (mount btrfs) Добавить в fstab монтирование корня btrfs раздела по указанному вами пути. Путь должен начинаться со знака/и содержать только допустимые символы:A-Z a-z 0-9 . / _ -. Полезно при ручном создании/восстановлении снапшотов. При использованииTimeshiftне нужно. -
-ceb) (copy efi boot) Заменить файл/EFI/boot/bootx64.efiвESPразделе файломgrubx64.efiсозданным при установке grub.
Обязательные параметры при переносе
-
-f) (first) Автоматический выбор первого доступного btrfs раздела. Если этот параметр не указан, то должен быть указан-sbp. -
-neb "Значение") (name efi boot) Имя efi загрузчика для установки grub. Обязательный параметр. Имена текущих загрузочных записей вы можете посмотреть через командуefibootmgr. Начиная сastralinux 1.8.3в системе используется наименование загрузочной записиastra. -
-sbp "Значение") (select btrfs part) Имя btrfs раздела с системой (например, nvme0n1p4). Если параметр не указан, то должен быть указан параметр-f. -
-sp "Значение") (subvolume param) Значение в специальном формате для добавления строки монтирования в fstab и создания указанных subvolume (точка монтирования;имя subvolume;параметры монтирования;признак использования nocow;тип сжатия). Если не будет указан параметр-spс точкой монтирования корня/, то будет использоваться значение по умолчанию:/;@;defaults;0;.
1)-Точка монтирования — Обязательное поле. Допустимые символы: A-Za-zА-Яа-я0-9./@_-
2)-Имя subvolume — Обязательное поле. Скрипт создает плоскую структуру subvolume (все subvolume расположены в корне раздела). Вложенные subvolume, где используется путь вместо имени, не допускаются. Допустимые символы: A-Za-z0-9.@_-
3)-Параметры монтирования — Необязательное поле. Если не указать, то будет использоваться defaults.
Многие параметры, например, nodatacow, nodatasum, compress не могут быть выставлены для отдельных subvolume, а применяются ко всей файловой системе.
Список всех параметров монтирования: https://btrfs.readthedocs.io/en/latest/Administration.html
4)-Признак использования nocow — Обязательное поле (0/1):
• 0 - Не выполнять изменения;
• 1 - Выставить атрибут nocow для subvolume. Атрибут добавляется командой chattr +C. nocow отключает копирование при записи и сжатие.
5)-Тип сжатия — Необязательное поле. Может принимать следующие значения:
• lzo
• zlib
• zstd
• no - отключить сжатие (эквивалент chattr +m)
• пустое значение - ничего не делать
Если значение сжатия указано, то будет добавлен атрибут файловой системы командой: btrfs property set <PATH> compression <VALUE>. Атрибут установленный через btrfs property имеет приоритет над глобальными настройками монтирования, т.е., при установлении атрибута, параметр сжатия в fstab для этого subvolume учитываться не будет.
Рекомендуется:
- вынести
/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 "/;@;;0;" -sp "/home;@home;;0;" -sp "/tmp;@tmp;;1;" -sp "/var/cache;@varcache;;1;" -sp "/var/log;@varlog;;1;" -sp "/var/tmp;@vartmp;;1;" -sp "/swap;@swap;;1;"
Пример полной команды: ./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;"
Если в переносимой системе будет найден вложенный subvolume var/lib/portables или var/lib/machines, создаваемые утилитами из пакета systemd-container, то он будет удален, если пуст, и создан пустой каталог по этому пути.
Перед переносом файлов создается снимок корня раздела. Если во время переноса будет ошибка, то будет запущено удаление содержимого в корне раздела, кроме созданного до переноса снимка корня.
Решение возможной проблемы создания EFI записи
В связи с существованием различных специфичных реализаций UEFI, на некоторых платах/виртуальных машинах при выполнении команды grub-install может не добавится загрузочная запись. По умолчанию UEFI обычно ищет /EFI/boot/bootx64.efi на ESP разделе.
Варианты решения (Зависит от реализации UEFI):
-
1.Добавить запись через
BIOS, указав нужный файл загрузчика (если поддерживается вашим BIOS); -
2.Заменить файл
/boot/efi/EFI/boot/bootx64.efiфайлом созданным grub (например/boot/efi/EFI/astra/grubx64.efi). Если смонтированESPраздел, то/boot/efiв пути не будет (можете использовать опцию-cebпри запуске скрипта); -
3.Оставить в каталоге
/boot/efi/EFIтолько один загрузчик (Если смонтированESPраздел, то/boot/efiв пути не будет); -
4.Попробовать добавить запись через команду:
Внимание! Известны случаи повреждения firmware при использовании efibootmgr на некоторых устройствах с Phoenix UEFI.
efibootmgr -c -d /dev/sda -p 4 -L "ALTLinux" -l "\EFI\altlinux\grub64.efi"
- 5.Для
VirtualBox:
1-ый вариант выполнить в ещё загруженной системе:
echo "fs0:\EFI\altlinux\grubx64.efi" > /boot/efi/startup.nsh
Или то же самое сделать потом, из EFI Shell:
echo "fs0:\EFI\altlinux\grubx64.efi" > fs0:\startup.nsh
2-ый вариант выполнить замену файла /boot/efi/EFI/boot/bootx64.efi файлом созданным grub.
Подробнее про UEFI можно прочитать тут:
https://wiki.astralinux.ru/pages/viewpage.action?pageId=371804424
Управление снимками с помощью btrfs-snapshot
Рекомендуется ознакомление с инструкцией в docx/pdf.
Написанный мною скрипт для управления снимками btrfs. Работает на Astra linux с включенным МКЦ/МРД (не нужно отключать security.PDPL на корне раздела).
Скрипт работает с плоской структурой subvolume и снимков (все subvolume и снимки расположены в корне раздела). Вложенные, где используется путь вместо имени, не допускаются.
Если корень 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 системе доступен только интерактивный режим и он запускается по умолчанию.
Резервные копии системы с помощью Timeshift
Timeshift — удобная программа для создания резервных копий.Программа поддерживает несколько режимов работы:
-
1.
RSYNC -
Снимки создаются путём копирования системных файлов при помощи rsync и создания жёстких ссылок на неизмененные файлы из предыдущего снимка;
-
Все файлы копируются при создании первого снимка. Последующие снимки являются инкрементальными. Неизменные файлы будут связаны с предыдущим снимком, если он доступен;
-
Системный раздел может быть отформатирован в любой файловой системе. Резервный раздел может быть отформатирован в любой файловой системе Linux, поддерживающей жесткие ссылки. Сохранение снимков на несистемный или внешний диск позволяет восстановить систему, даже если системный диск повреждён;
-
Можно задать исключения для файлов и каталогов для экономии дискового пространства.
-
2.
BTRFS -
Снимки создаются с использованием встроенных средств файловой системы BTRFS;
-
Снимки создаются и восстанавливаются мгновенно (атомарная транзакция на уровне файловой системы);
-
Снимки сохраняются на том же диске, с которого они созданы (системном диске). Хранение на других дисках не поддерживается. Если системный диск выйдет из строя, снимки, хранящиеся на нём, будут потеряны вместе с системой;
-
Снимок можно передать на другой btrfs раздел (локально или через ssh) или сохранить в файл для последующего восстановления на другом ПК на диск с btrfs разделом. (ищите информацию о
btrfs sendиbtrfs receive). Передаваемый черезbtrfs sendснимок должен быть в режимеreadonly. https://help.ubuntu.ru/wiki/btrfs. -
Нет возможности исключать файлы и каталоги;
-
Размер снимков
BTRFSизначально равен нулю. При изменении системных файлов, данные записываются в новые блоки данных, которые занимают дисковое пространство (копирование при записи). Файлы в снимке продолжают указывать на исходные блоки данных; -
ОС должна быть установлена на раздел
BTRFSс разбивкой на подразделы@и@home.
Сборка deb пакета Timeshift для Astra/Debian из исходников
ВАЖНО: Timeshift создает, но не восстанавливает снимки на Astra linux в связи с особенностями МКЦ/МРД и меткой безопасности на корне раздела. На Astra linux рекомендуется управлять снимками вручную через команды btrfs.
-
1.Скачайте исходный код
Timeshift: https://github.com/linuxmint/timeshift -
2.Скачайте пакет
timeshift_*.debian.tar.xzс файлами для сборки пакета: https://packages.debian.org/ru/sid/timeshift -
3.Распакуйте архив с исходным кодом
Timeshift, например в$HOME/temp/timeshift-master -
4.Распакуйте содержимое архива
timeshift_*.debian.tar.xz(каталогdebian) в каталог с исходным кодомTimeshiftс заменой всех файлов кромеchangelog. -
5.В файле
controlпо желанию вы можете поменять следующее: -
В
MaintainerиUploadersпоменять имя/почту. Например:local build <build@loc.local>; - В
Build-Dependsдобавить строкуgzip; -
В
Dependsдобавить строкиdebianutilsиbtrfs-progs | btrfs-tools. -
6.Если вы хотите, чтобы
Timeshiftсоздавалreadonlyснимки (рекомендуемое поведение.btrfs sendработает только сreadonlyснимками), то внесите изменения в файл*/src/Core/Main.vala: -
Добавьте в строку содержащую
btrfs subvolume snapshotпараметр-r. Пример полной строки:
string cmd = "btrfs subvolume snapshot -r '%s' '%s' \n".printf(src_path, dst_path);
Для установки чтение/запись на subvolume вручную: sudo btrfs property set -ts <путь_к_снапшоту> ro false
Для установки только чтение на subvolume вручную: sudo btrfs property set -ts <путь_к_снапшоту> ro true
- 7.Установите в систему необходимые для сборки пакеты:
apt update && apt -y install devscripts
apt update && apt -y install debhelper autotools-dev libgtk-3-dev pkg-config intltool fakeroot
apt update && apt -y install meson help2man gettext valac libvte-2.91-dev libgee-0.8-dev libjson-glib-dev libxapp-dev
- 8.Запустите терминал в каталоге исходного кода
Timeshiftи выполните команду:
fakeroot ./debian/rules binary
Эта команда запустит компиляцию Timeshift и сборку пакета.
На выходе получаем deb пакет.
Резервные копии с помощью Snapper+snapper-rollback+Btrfs Assistant
Важно: Мне писали, что связка Snapper+snapper-rollback работает на Astra linux с МКЦ. Сам я не настраивал и не проверял данное решение.
Ссылка: snapper-rollback
Ссылка: snapper-in-debian-guide
Btrfs Assistant - это инструмент управления файловой системой BTRFS с графическим интерфейсом, который упрощает управление метаданными, снапшотами и другими функциями BTRFS. Современный фронтенд для Snapper и инструментов обслуживания Btrfs.
Инструкцию по компиляции Btrfs Assistant из исходников для Debian-based систем смотрите в pdf/docx файле.
Резервные копии с помощью easy-btrfs
easy-btrfs также, как и TimeShift не может восстанавливать снимки на Astra linux с security.PDPL (МКЦ/МРД).
Проблема заключается во вложенной структуре хранения.
При восстановлении заменяемый subvolume должен быть переименован в текущем каталоге или перенесен в другой, чтобы система корректно продолжила работать до перезагрузки.
Т.к. создаваемые easy-btrfs и TimeShift каталоги не имеют нужных атрибутов, то перенести в них subvolume у которых имеется security.PDPL атрибут (в котором записаны значения МКЦ/МРД) невозможно. В связи с чем алгоритмы, которые используют вложенную структуру хранения не будут работать.
Без security.PDPL, а также в других системах, easy-btrfs является еще одним вариантом для управления снимками.
Ссылка: easy-btrfs