|
|
@ -6,6 +6,19 @@ TMP_MNT=${TMP_MNT:-/var/tmp/btrfs-backup} |
|
|
|
vols=() |
|
|
|
vols=() |
|
|
|
del= |
|
|
|
del= |
|
|
|
dryrun=0 |
|
|
|
dryrun=0 |
|
|
|
|
|
|
|
periodity=${a%/*} |
|
|
|
|
|
|
|
periodity=${periodity##*/} |
|
|
|
|
|
|
|
if [[ $periodity =~ ^cron\... ]]; then |
|
|
|
|
|
|
|
periodity=${periodity#cron} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
periodity= |
|
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
case "$periodity" in |
|
|
|
|
|
|
|
(.hourly) del=25;; |
|
|
|
|
|
|
|
(.daily) del=8;; |
|
|
|
|
|
|
|
(.weekly) del=5;; |
|
|
|
|
|
|
|
(.monthly);; |
|
|
|
|
|
|
|
esac |
|
|
|
while test $# -gt 0; do |
|
|
|
while test $# -gt 0; do |
|
|
|
case "$1" in |
|
|
|
case "$1" in |
|
|
|
(-h|--help) cat <<EOF |
|
|
|
(-h|--help) cat <<EOF |
|
|
@ -21,7 +34,7 @@ OPTIONS |
|
|
|
|
|
|
|
|
|
|
|
not yet implemented: |
|
|
|
not yet implemented: |
|
|
|
|
|
|
|
|
|
|
|
-d, --del <days> delete snapshots older than given number of days |
|
|
|
-d, --del <number> delete oldes snapshots beginning at <numbers>-th |
|
|
|
|
|
|
|
|
|
|
|
ENVIRONMENT |
|
|
|
ENVIRONMENT |
|
|
|
|
|
|
|
|
|
|
@ -34,6 +47,19 @@ Creates a snapshot for all btrfs volumes specified. Snapshot is named |
|
|
|
from the subvol name or if there is no subvol, from the path by |
|
|
|
from the subvol name or if there is no subvol, from the path by |
|
|
|
appending -snapshot-YYYY-MM-DD-HH-mm. |
|
|
|
appending -snapshot-YYYY-MM-DD-HH-mm. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
To create regular snapshots on a daily base, just run: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sudo cp btrfs-snapshots.sh /etc/cron.daily/btrfs-snapshots |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If btrfs-snapshots is run from a cron.daily, cron.hourly, |
|
|
|
|
|
|
|
cron. monthly or cron.weekly directory, the periodity is automatically |
|
|
|
|
|
|
|
appended to the snapshot name, and the expiry is set meaningfull: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- hourly → keep only 24 hours, --del 25 |
|
|
|
|
|
|
|
- daily → keep only 7 days, --del 8 |
|
|
|
|
|
|
|
- weekly → keep only 4 weeks, --del 5 |
|
|
|
|
|
|
|
- monthly → old snapshots are not deleted |
|
|
|
|
|
|
|
|
|
|
|
EOF |
|
|
|
EOF |
|
|
|
exit;; |
|
|
|
exit;; |
|
|
|
(-n|--dry-run) dryrun=1;; |
|
|
|
(-n|--dry-run) dryrun=1;; |
|
|
@ -72,19 +98,30 @@ for fs in ${BTRFS_VOLUMES}; do |
|
|
|
name=/${name//\//-}- |
|
|
|
name=/${name//\//-}- |
|
|
|
fi |
|
|
|
fi |
|
|
|
fi |
|
|
|
fi |
|
|
|
target="${name}snapshot-$(date +%Y-%m-%d-%H-%M)" |
|
|
|
date="-$(date +%Y-%m-%d-%H-%M)" |
|
|
|
|
|
|
|
target="${name}snapshot${periodity}" |
|
|
|
if test -n "$device"; then |
|
|
|
if test -n "$device"; then |
|
|
|
if test $dryrun -eq 1; then |
|
|
|
if test $dryrun -eq 1; then |
|
|
|
echo -e "→ \e[1mbackup ${subvol:+subvol $subvol of }$fs on $device\e[0m" |
|
|
|
echo -e "→ \e[1mbackup ${subvol:+subvol $subvol of }$fs on $device\e[0m" |
|
|
|
echo " " mount "$device" "$TMP_MNT" |
|
|
|
echo " " mount "$device" "$TMP_MNT" |
|
|
|
echo " " btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}${target}" |
|
|
|
echo " " btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}${target}${date}" |
|
|
|
|
|
|
|
if test -n "$del"; then |
|
|
|
|
|
|
|
for f in $(ls -1 "${TMP_MNT}${target}${date}"-* | tail -n +"$del"); do |
|
|
|
|
|
|
|
echo " " btrfs subvolume delete "$f" |
|
|
|
|
|
|
|
done |
|
|
|
|
|
|
|
fi |
|
|
|
echo " " umount "$TMP_MNT" |
|
|
|
echo " " umount "$TMP_MNT" |
|
|
|
else |
|
|
|
else |
|
|
|
if mount | grep -q " on $TMP_MNT type "; then |
|
|
|
if mount | grep -q " on $TMP_MNT type "; then |
|
|
|
sudo umount "$TMP_MNT" |
|
|
|
sudo umount "$TMP_MNT" |
|
|
|
fi |
|
|
|
fi |
|
|
|
sudo mount "$device" "$TMP_MNT" |
|
|
|
sudo mount "$device" "$TMP_MNT" |
|
|
|
sudo btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}${target}" |
|
|
|
sudo btrfs subvolume snapshot "${TMP_MNT}${subvol}" "${TMP_MNT}${target}${date}" |
|
|
|
|
|
|
|
#if test -n "$del"; then |
|
|
|
|
|
|
|
# for f in $(ls -1 "${TMP_MNT}${target}${date}"-* | tail -n +"$del"); do |
|
|
|
|
|
|
|
# sudo btrfs subvolume delete "$f" |
|
|
|
|
|
|
|
# done |
|
|
|
|
|
|
|
#fi |
|
|
|
sudo umount "$TMP_MNT" |
|
|
|
sudo umount "$TMP_MNT" |
|
|
|
fi |
|
|
|
fi |
|
|
|
else |
|
|
|
else |
|
|
|