К btrfs приглядывался давно, даже на дисках с различными медиа-данными использовал около года, но расширенной функциональностью этой замечательной файловой системы не пользовался.
А вот появилось обновление — два новеньких SSD, было решено во время переноса системы заодно перейти на btrfs.
Всё отлично — RAID0 для данных RAID1 для метаданных средствами файловой системы, сжатие на лету, корень в одном суб-томе (subvolume), домашняя папка в другом, веб-сайты в третьем. Всё это грузится прямо с UEFI в Linux EFI stub без GRUB и других загрузчиков, работает быстро и удобно.
И вот дошло дело до снимков (snapshot), их я хотел использовать для резервных копий суб-томов средствами всё того же драйвера btrfs.
Поиск выдает несколько релевантных решений, но одни решения слишком громоздки (синхронизация резервных копий, через сеть, создание каких-то репозиториев, вложенных потоков и т.д.) и навязывают свою архитектуру, другие не имеют адекватной ротации резервных копий (можно указать только один интервал и количество копий в нём).
Решение принято — новому инструменту быть!
И что получилось?
Получился небольшой скрипт на PHP, который при запуске читает конфигурацию из простого JSON файла вида:
[
{
"source_mounted_volume" : "/",
"destination_within_partition" : "/backup/root",
"date_format" : "Y-m-d_H:i:s",
"keep_snapshots" : {
"hour" : 60,
"day" : 24,
"month" : 30,
"year" : 48
}
},
{
"source_mounted_volume" : "/home",
"destination_within_partition" : "/backup/home",
"date_format" : "Y-m-d_H:i:s",
"keep_snapshots" : {
"hour" : 120,
"day" : 48,
"month" : 60,
"year" : 96
}
}
]
И создает по указанному пути снимок, а так же при повторном запуске контролирует количество снимков, удаляя устаревшие.
В указанном примере конфигурации мы получим папку /backup, внутри которой будут отдельные папки для снимков корня и домашней папки. Снимки создаются только для чтения, таким образом мы имеем прямой доступ к любому снимку с сохранением прав доступа и без опасности повредить созданный снимок.
Так как btrfs поддерживает CoW (Copy on Write), то место занятое снимком определяется количеством и объемом измененных файлов с последнего снимка. При удалении снимка все файлы, которые есть только в нем, и больше нигде удаляются, освобождая свободное пространство.
Итого имеем мгновенный доступ к любому снимку и экономию занятого пространства (что вдвойне правда при наличии сжатия файловой системы).
Планы
Нужно будет добавить в readme настройку создания снимков перед установкой/удалением/обновлением пакетов (тут уже будет нужна помощь сообщества, так как пользуюсь Ubuntu, и не в курсе как сделать такое для систем с RPM или чем-то более экзотичным).
Хорошо было бы создать deb/rpm/? пакеты для популярных (и не очень) дистрибутивов, но раньше этого делать не приходилось, не в курсе что да как.
Возможно что-то ещё подскажете:)
Где взять
https://github.com/nazar-pc/just-backup-btrfs
Надеюсь, статья и решение будут полезными, делитесь рецептами использования btrfs в комментариях.
Автор: nazarpc