Питон со снапшотом

Уже достаточно давно для создания и управления снапшотами на файловой системе btrfs я использую скрипт, о котором писал здесь. Напомню, что этот скрипт создаёт снапшот определённого подтома btrfs в определённой папке, а также удаляет устаревшие снапшоты.

Такая связка (btrfs + подтома + этот скрипт) работает, с моей точки зрения, вполне нормально. Не знаю даже, что мне нравится больше: возможность быстро восстановить неудачно обновлённую систему (редко, но бывает) или возможность восстановить неудачно обновлённый документ.

Но однажды мне очень захотелось поэкспериментировать, и я за пару дней взял, и переделал этот скрипт на Питоне. Зачем? Да просто захотелось. Почему на Питоне? А почему нет? Тем более, что в Линуксах Питон обычно устанавливается по умолчанию. В общем, повозился я несколько дней, и получилось у меня это.

Итак, последние две недели я использую собственный скрипт. Называется он snapshot_rotate. От прежнего он имеет одно (нет, всё-таки два) отличия:

  1. Написан на Python 3. Поскольку у меня не было возможности провести полномасштабное тестирование, не могу пока точно сказать, все ли версии третьего Питона поддерживаются. Уверен только за текущий Питон 3.10
  2. Мой скрипт по умолчанию создаёт обычные, не-read-only снапшоты. Впрочем, можно использовать ключ -r (я добавил такую возможность).

Впрочем, достаточно всего лишь ввести snapshot_rotate -h, и получить справку:

Take and rotate snapshots on a btrfs file system

usage: snapshot_rotate [-h] [-r] [-q] source target snap_name count

Take and rotate snapshots on a btrfs file system

positional arguments:
 source          path to make snapshot of
 target          snapshot directory
 snap_name       base name for snapshots,to be appended to date
 count           number of snapshots in the timestamp-@snap_name format to keep at one time for
                 a given snap_name.

options:
 -h, —help      show this help message and exit
 -r, —readonly  create readonly snapshot
 -q, —quiet     be quiet

В остальном мало что изменилось. Например, команда:

sudo /usr/local/bin/snapshot_rotate / /.snapshots daily 8

создаст в папке /.snapshots снимок файловой системы / (подтом @) с именем типа 2022-04-15—09-31-43-@daily. То есть предполагается, что это — ежедневный снимок (daily), и в папке их должно быть не более восьми. По мере добавления новых снимков старые будут удаляться.

Для автоматизации процесса создания снапшотов я по-прежнему использую anacrontab, куда вставил следующие строки:

1 10 daily_snap /usr/local/bin/snapshot_rotate / /.snapshots daily 9 -q
1 15 data_snap /usr/local/bin/snapshot_rotate /home /.snapshots data 12 -q
1 20 update_grub update-grub

Напомню, что запуск update-grub необходим, чтобы иметь возможность загружаться в сохранённые системные снапшоты непосредственно через grub.

Хочу также отметить:

  1. Повторюсь, у меня не было возможности полноценного тестирования скрипта. Поэтому вы можете его использовать, но я ничего не гарантирую. 🙁
  2. Допускаю, что в какой-нибудь из старых версий Python3 скрипт не будет работать.
  3. При наличии желания или необходимости можно создать подобный скрипт для zfs или добавить поддержку zfs в этот скрипт, чтобы он оправдывал своё название.
  4. Неплохо было бы ещё что-нибудь полезное создать…

На сегодня, пожалуй, всё!

Максим Перехрест

Оставьте комментарий