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


"A cloud guru" Kurse downloaden

12 Apr 2022 Lesezeit: ~1 Minute

Wer wie ich gern offline ist (verrückt, oder?) der kommt an einem gewissen Punkt an seine Grenzen. Meiner ist, dass ich die Kurse von a cloud guru ziemlich nett finde, wenn ich mich mal aufschlauen muss und mitreden können möchte.

Problem: geht nicht gut im Wald. Lösung: https://github.com/r0oth3x49/acloud-dl

Funktioniert super und ich kann endlich in einer motivierenden Umgebung machen, was ich gern mache - lernen, leben und genießen


Dateisystem überwachen mit inotifywait

20 Sep 2021 Lesezeit: 2 Minuten

Manchmal kommt es vor, dass man eine Datei oder einen Ordner auf seinem Server beobachten möchte, um im Fale eines Zugriffs, oder einer Aktion darauf reagieren zu können.

In meinem Fall geht es darum, dass die von mir gesetzte SGID ignoriert wird, weil ein Prozess explizit die Benutzer- und Gruppenzugehörigkeit beim schreiben einer Datei angibt.

Daher habe ich mir einen Service gebaut, welcher die Zugriffe auf einen Ordner überwacht und entsprechende Anpassungen (chmod und chown) ausführt, wenn es notwendig ist.

Dazu nutze ich inotifywait.

Zuerst erstelle ich ein Skript, das diese aufgabe für sich erledigen kann. Es kann auch händisch ausgeführt werden, damit man ordentlich testen kann.

nano /usr/bin/lookup_folder.sh

#!/bin/bash
while true; do

inotifywait -e modify,create,move -r -m --format '%w%f /PATH/TO/FOLDER |
   while read -r fname
   do
       chmod -v -R 775 "$fname"
       chown -v -R $USER:$GROUP "$fname"
   done
done

Anschließend - wenn alle Tests erfolgreich sind - wird ein systemd service erstellt, der eben dieses langlaufende Skript "startet"

nano /lib/systemd/system/lookup_folder.service

[Unit]
Description=Change file permissions

[Service]
ExecStart=/usr/bin/lookup_folder.sh

[Install]
WantedBy=multi-user.target

Anschließend muss man das alles noch enablen

systemctl daemon-reload
systemctl enable lookup-folder-service.service 
systemctl start lookup-folder-service.service 

und wenn man alles richtig gemacht hat, dann sieht man die Ausgabe der Befehle im Journal

journalctl -f -u lookup-folder-service.service