Восстановление / откат отдельных файлов или папок на btrfs
Я планирую использовать btrfs для системы NAS.
Теперь мне интересно, можно ли откатиться к снимкам на уровне файла / папки. Я спрашиваю об этом, потому что обычно требуется откатить только отдельные элементы, сохраняя состояние остальной части диска.
Есть ли какой-нибудь собственный способ сделать это, а если нет, то как лучше всего этого добиться? Я прочитал Восстановление отдельных файлов из снимка btrfs, не выполняя полную копию, что кажется способом, но не таким удобным. Хотя, возможно, это лучший способ сделать это.
Ответы
При создании моментального снимка создается подобъем, к которому можно получить доступ в структуре каталогов базового тома. Оттуда, если у вас есть соответствующие права, он может просматривать его и копировать файлы или папки. Для --reflinkэтого, похоже, не нужна возможность копирования, хотя это лучше, поэтому при копировании вещи не дублируются.
с инструментами btrfs
При желании можно создать подобъем для снимков:
btrfs subvolume create .my_snapshots
Создание снимка:
btrfs subvolume snapshot -r /mnt_point /mnt_point/.my_snapshots/snapshot1
Использование -rфлага делает снимок только для чтения (https://wiki.archlinux.org/index.php/btrfs#Snapshots).
Без предварительного создания вложенного тома и без настройки только для чтения это могло бы выглядеть так:
btrfs subvolume snapshot /mnt_point /mnt_point/snapshot1
Восстановление может быть выполнено путем копирования файла (ов) или папки (ов) из снимка:
cp /mnt_point/.my_snapshots/snapshot1/sub/dir/file /sub/dir/file
(Полученный из https://lore.kernel.org/linux-btrfs/[email protected]/t/#m16db5d9f29d26f41a8adb4499ffe3e220a85d9b8)
внешние инструменты (в качестве примера использован снэппер)
Использование внешних инструментов, таких как snapper, имеет некоторые преимущества, поскольку они делают обработку снимков немного более удобной и обладают полезными функциями.
Сначала необходимо создать файл конфигурации для (под) тома, для которого нужно создать моментальные снимки:
snapper -c config-name create-config /mnt_point
Это создает файл конфигурации с именем config-name. Обратите внимание, что это также обычно позволяет создавать автоматические моментальные снимки, основанные на времени, а также правила для их очистки после некоторой логики. Обратите внимание, что созданные вручную снимки не удаляются такими правилами.
Затем снимок можно сделать вручную с помощью:
snapper -c config-name create --description description-content
где config-nameимя ранее созданной конфигурации и description-contentможет быть заполнено некоторым описанием для снимка.
(Полученный из https://wiki.archlinux.org/index.php/Snapper)
Затем восстановление работает аналогично тому, как описано выше для раздела инструментов btrfs, с доступом к смонтированному снимку и копированием вещей.
Дополнительно snapper предоставляет команду для этого, которую также можно использовать для отмены изменений для текущего тома в соответствии с документацией openSUSE . Обратите внимание, что это может привести к несогласованности данных. Также в документации Red Hat говорится, что эту команду нельзя использовать с корневой файловой системой.
Теоретически файлы можно восстановить с помощью:
snapper -c config-name -v undochange SNAPSHOT_ID..0 FILENAME
где SNAPSHOT_ID- идентификатор снимка, из которого нужно восстановить (и ..0указывает, что файлы восстанавливаются на основной том), и FILENAMEпуть к файлу для восстановления. Также можно указать более одного файла.
(Полученный из https://doc.opensuse.org/documentation/leap/archive/15.0/reference/html/book.opensuse.reference/cha.snapper.html#proc.snapper.restore.cmdl)
Снимки BTRFS работают на уровне подтома. Это означает, что вы можете «откатить» вложенные тома, но не отдельные файлы.
Поскольку вложенные тома отображаются в файловой системе как каталоги, можно сказать, что можно выполнить откат каталогов.
Для отката отдельных файлов я использую копию рефссылки, как показано в предоставленной вами ссылке. Однако у меня соответствующие подтомы смонтированы автоматически, /etc/fstabтак что неудобств нет.