1

Такой вопросец: кто использует снапшотовые ФС на корне? И каким образом?

Лично я использую BtrFS (на SSD). Выглядит это так.

Отдельный том (subvolume) - это "zone". Зоны располагаются в корне ФС и монтируются в каталог /zone. Список зон:

  • wine - вайновские потроха

  • repo - дерево portage и оверлеи

  • depo - зона сорсов ядра и кэш тарболлов пакетов

  • fragment/* - зона моего домашнего каталога, включающий зоны-снапшоты

  • root/* - то же самое для корня системы

  • root/embryo и fragment/embryo - ro-зоны, содержащие первозданное состояние системы и профиля пользователя

Далее, отдельные зоны связываются в наборы (в моей терминологии "zet"), представляющие собой изолированные загрузочные варианты системы, состоящие из файла ядра в /boot, зоны-снапшота root и зоны-снапшота пользователя (впрочем, root - это тот же пользователь). И всё это добро управляется накостыленными баш-скриптами. Поясню на примере как я переводил генту на systemd:

zet clone current systemd - создаются rw-снапшоты текущих зон root и fragment под именами root/systemd и fragment/systemd (полные пути будут выглядеть как /zone/root/systemd, но полные пути и не нужны).
zet in root/systemd - в зону root/systemd монтируются необходимые каталоги и зоны (у меня это /boot, /dev, /repo, /sys, /proc, /usr/src) и выполняется chroot.
Далее в chroot делались нужные манипуляции по переходу на systemd. После exit:
zet off root/systemd - отмонтирование вышеперечисленных каталогов и зон.
zet set systemd - в конфиг загрузчика (использую extlinux из-за его простоты, ибо grub2 - заскриптованный ужос) и в fstab соответствующей зоны вносятся правки.

После ребута в бутменю видна новая запись вида <hostname> <zone_name>. Выбираю её и отныне жизнь системы пошла по новому пути, ни на грамм не пересекающемуся с прежними. Естественно, при первой загрузке с systemd у меня возникли траблы и система не грузилась до конца, поэтому я просто ребутался, выбирал предыдущую запись в бутменю и загружалась полностью рабочая система с openrc без каких-либо следов systemd, из которой можно было гуглить решение проблем.
То же самое я делаю при обновлении мира. Таким образом, у меня сейчас есть пять абсолютно непересекающихся комплектов (зетов), в которые можно загрузиться в любой момент по желанию. Если, например, обновление мира прошло неудачно, можно просто выбрать другой зет, а неудачный удалить. И так далее. Проблемы корявых обновлений исчезают вообще как класс.

BtrFS тут выгодно отличается от ZFS тем, что у последней откат к снапшоту через zfs rollback влечёт автоматическое уничтожение всех томов позднее выбранного снапшота.

Также видел, что в некоторых системах (в openSUSE, к примеру) собираются использовать снапшоты на уровне отдельных каталогов корня (/usr, /etc, /lib и др.), но не могу понять смысла такого костылизма - всё равно ведь будут где-то пересечения между различными состояниями, не лучше ли было сделать как сделал я?

Короче, если используете снапшоты - делитесь своими рецептами.