LVM Snapshot als Skript

13 Apr 2022 - Lesezeit: 3 Minuten

Backups sind nur was für Weicheier, oder?

Ich habe in den letzten Jahren - sehr spät - LVM lieben gelernt. Vorher habe ich es irgendwie nie gebraucht. Aber jetzt, wo ich in mehr und mehr flexiblen Umgebungen unterwegs bin, weiß ich es als leichtgewichtige Lösung zum Umgang mit #Speichermedien sehr zu schätzen.

Zuhause nutze ich es, damit ich Dinge wie Striped und Mirrored Volumes auch ohne viel Resourcen schnell und einfach umsetzen kann.

Aber auch hier will ich hin und wieder ein Backup machen. LVM stellt mir die Möglichkeit mit Snapshots zu arbeiten. Nicht ganz so mega wie ZFS, aber mehr als ausreichend.

Jetzt muss nur noch ein Backup-Skript her. Nichts leichter als das:

#!/bin/bash

KEEP_DAYS=7
VG="datastore" # LVM volume group we are snapshoting
LV="Verena privatestuff learningstuff" # Name of LVM-volume to take a snapshot of
BACKUP_PREFIX="backup-volume" # Prefix of snapshot volume name.
SIZE=10G # Amount of disk space to allocate for the snapshot

# Create new snapshot
TODAY="$(date +%F)" 
for i in $LV
        do
                NEW_VOLUME="$BACKUP_PREFIX-$i-$TODAY" 
                if ! lvs | grep -q -F "$NEW_VOLUME"; then
                /sbin/lvcreate --size $SIZE --permission r --snapshot "$VG/$i" --name "$NEW_VOLUME" 
#echo  "$NEW_VOLUME"
                else
                    echo "Backup already exists: $NEW_VOLUME" 
                fi
        done

# Clean old snapshots.

# We need to work around debian bug #659762
# See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=659762
# We do that by disabling udev while removing snapshots
if service udev status >/dev/null 2>&1; then
    UDEV_RUNNING=1
    service udev stop >/dev/null 2>&1
else
    UDEV_RUNNING=0
fi

for i in $LV
        do
                lvs -o lv_name --noheadings | sed -n "s@$BACKUP_PREFIX-$i-@@p" | while read DATE; do
                    TS_DATE=$(date -d "$DATE" +%s)
                    TS_NOW=$(date +%s)
                    AGE=$(( (TS_NOW - TS_DATE) / 86400))
                    if [ "$AGE" -ge "$KEEP_DAYS" ]; then
                        VOLNAME="$BACKUP_PREFIX$DATE" 
                        /sbin/lvremove -f "$VG/$VOLNAME" 
                    fi
                done
        done

if [ "$UDEV_RUNNING" = "1" ]; then
    service udev start >/dev/null 2>&1
fi

Danke!

Quellen und Links

Es wurden noch keine Kommentare verfasst, sei der erste!