Вопрос или проблема
Я пытаюсь создать собственный небольшой скрипт резервного копирования, хочу использовать снимки BTRFS и сохранять их на некоторое время. В то же время создание снимков больше не является для меня проблемой, но теперь я хотел бы удалять их через 5 дней.
Я разработал следующую команду для получения времени создания снимков.
/usr/bin/find /run/btrfs-root/sdb/__snapshot/ -mindepth 1 -maxdepth 1 -name "auto-sn-*" -exec /usr/sbin/btrfs subvolume show {} \; | /usr/bin/grep "__snapshot|Creation"
вывод:
__snapshot/auto-sn-data-20210803
Creation time: 2021-08-03 14:59:01 +0200
__snapshot/auto-sn-Log-20210803
Creation time: 2021-08-03 15:00:42 +0200
К сожалению, я не могу найти способ принять решение об удалении на основе строковой даты вывода.
Теперь точный вопрос, как я могу запустить удаление снимка после 5 дней на основе этой информации?
Спасибо
Небольшая идея:
/usr/bin/find /run/btrfs-root/sdb/__snapshot/ -mindepth 1 -maxdepth 1 -name "auto-sn-*" ! \( -name "*$(/usr/bin/date -d '1 day ago' +%Y%m%d)" -o -name "*$(/usr/bin/date -d '2 day ago' +%Y%m%d)" -o -name "*$(/usr/bin/date -d '3 day ago' +%Y%m%d)" \) -exec /usr/sbin/btrfs subvolume delete {} \;
Я не знаю, сработает ли это
Чтобы получить только дату, можно сделать следующее:
$ btrfs subvolume show / | grep -oP 'Creation time:\s*\K\d.*$'
# 2021-03-11 04:22:58 +0100
На этом этапе вы, по сути, закончили, потому что, к счастью, даты находятся в формате ISO, который можно тривиально сравнивать, используя обычные функции сравнения строк в bash:
$ old_date=$(btrfs subvolume show / | grep -oP 'Creation time:\s*\K\d.*$')
(some time passes)
$ new_date=$(btrfs subvolume show / | grep -oP 'Creation time:\s*\K\d.*$')
$ [[ "$old_date" < "$new_date" ]] && echo "newer" || echo "older"
Ответ или решение
Создание резервных копий с помощью файловой системы BTRFS и управление ими является важной задачей в работе с данными, особенно в сценариях, где необходимо сохранять данные в безопасном виде и минимизировать вероятность их потери. Если вы планируете удалять снимки через определенное время, например, через 5 дней, важно научиться определять дату создания снимков и автоматизировать процесс их удаления.
Теоретическая часть
Файловая система BTRFS (B-tree File System) представляет собой современную файловую систему, поддерживающую снимки (snapshots), которые позволяют создавать моментальные копии файловой системы или субтома. Эти снимки дают возможность сохранять состояние на определенный момент времени, что полезно для резервного копирования и восстановления данных.
BTRFS хранит метаданные о подтомах, включая время их создания, которое можно получить с помощью команды btrfs subvolume show
. Данные выводятся в формате ISO 8601, что облегчает их обработку и сравнение.
Пример
Для того чтобы получить дату создания снимка, мы можем использовать следующую команду:
btrfs subvolume show /путь/к/снимку | grep -oP 'Creation time:\s*\K\d.*$'
Этот пример возвращает строку, содержащую время создания в формате YYYY-MM-DD HH:MM:SS ±HHMM
.
Рассмотрим вывод команды btrfs subvolume show
:
__snapshot/auto-sn-data-20210803
Creation time: 2021-08-03 14:59:01 +0200
Применение
Теперь, зная, как получить дату создания, перейдём к задаче удаления снимков, старше 5 дней. В этой ситуации мы можем воспользоваться комбинацией утилит find
и btrfs
, чтобы автоматизировать процесс проверки даты создания и последующего удаления.
-
Получение списка снимков:
Сначала необходимо получить список всех снимков, которые соответствуют определенному шаблону (например, начинаются с "auto-sn-"). Это можно сделать с помощью команды
find
:/usr/bin/find /run/btrfs-root/sdb/__snapshot/ -mindepth 1 -maxdepth 1 -name "auto-sn-*"
-
Проверка даты и удаления:
После получения списка следуйте следующему алгоритму:
- Для каждого найденного снимка выполните
btrfs subvolume show
, чтобы извлечь дату создания. - Преобразуйте ее с помощью утилиты
date
в Unix timestamp, чтобы было удобно производить арифметические операции. - Сравните полученное значение с текущей датой минус 5 дней, также преобразованной в timestamp.
- Если дата снимка оказывается меньше порогового значения, удалите снимок с помощью
btrfs subvolume delete
.
- Для каждого найденного снимка выполните
Вот пример скрипта, который выполняет описанное выше:
#!/bin/bash
current_date=$(date +%s)
threshold_date=$(date -d '-5 days' +%s)
for snapshot in $(/usr/bin/find /run/btrfs-root/sdb/__snapshot/ -mindepth 1 -maxdepth 1 -name "auto-sn-*"); do
creation_time=$(/usr/sbin/btrfs subvolume show "$snapshot" | grep -oP 'Creation time:\s*\K\d.*$')
creation_timestamp=$(date -d "$creation_time" +%s)
if [ "$creation_timestamp" -lt "$threshold_date" ]; then
echo "Удаление снимка $snapshot, созданного $creation_time"
/usr/sbin/btrfs subvolume delete "$snapshot"
fi
done
Заключение
Эта автоматизация позволяет полностью контролировать жизненный цикл BTRFS-снимков, поддерживая оптимальный баланс между доступным дисковым пространством и необходимыми резервными копиями данных. Данный подход повышает надежность и эффективность работы с файлами, обеспечивая безопасность данных в длительной перспективе. Следуя этому методу, вы сможете легко управлять снимками и поддерживать свою файловую систему в порядке без чрезмерного ручного вмешательства.