Skip to content

Instantly share code, notes, and snippets.

@EvilGrinUK
Last active August 13, 2019 08:33
Show Gist options
  • Save EvilGrinUK/7d2607038aa9e0f60bcc to your computer and use it in GitHub Desktop.
Save EvilGrinUK/7d2607038aa9e0f60bcc to your computer and use it in GitHub Desktop.
LVM Snapshot Backup - Takes a snapshot of each logical volume in a volume group and creates a compressed dd copy in a specific directory.
#!/bin/bash
VG_NAME="vg0"
SNAPSHOT_SIZE="+2G"
BACKUP_LOCATION="/backups"
DAYSTOKEEP=7
for lv in $(lvs --noheadings --nosuffix --aligned --separator , -o lv_name,lv_attr | grep -v ,s | cut -d, -f1)
do
LV_SIZE="$(lvs --units m --noheadings --nosuffix --aligned --separator , -o lv_name,lv_size | grep "$lv" | cut -d',' -f2 | cut -d. -f 1)" # LV size in MB
LV_UUID="$(lvs --units m --noheadings --nosuffix --aligned --separator , -o lv_name,lv_uuid | grep "$lv" | cut -d',' -f2)" # LV UUID
LV_SNAPNAME="SNAP_$(basename "$lv")" # LV snapshot name
echo "LVM Logical Volume: $lv"
echo "Size: $LV_SIZE MB"
echo "UUID: $LV_UUID"
echo "Snapshot name: $LV_SNAPNAME"
echo "Removing old snapshot (if any)."
lvremove -f "/dev/$VG_NAME/$LV_SNAPNAME"
echo "Creating snapshot /dev/$VG_NAME/$LV_SNAPNAME"
lvcreate -L"$SNAPSHOT_SIZE" --snapshot -n"$LV_SNAPNAME" "/dev/$VG_NAME/$lv"
sleep 4
echo "Backing up snapshot to $BACKUP_LOCATION/$LV_SNAPNAME-$(date "+%Y.%m.%d-%H.%M.%S").lv.gz"
dd if="/dev/$VG_NAME/$LV_SNAPNAME" bs=512k of=/dev/stdout | pv -pterbW -i 2 --buffer-size 512k --size "$LV_SIZE"m | /usr/bin/pigz -9 -b 256 > "$BACKUP_LOCATION/$LV_SNAPNAME-$(date "+%Y.%m.%d-%H.%M.%S").lv.gz"
echo "Removing snapshot /dev/$VG_NAME/$LV_SNAPNAME"
lvremove -f "/dev/$VG_NAME/$LV_SNAPNAME"
echo "Removing old backups"
find "$BACKUP_LOCATION/$LV_SNAPNAME-*.lv.gz" -mtime +$DAYSTOKEEP -print -delete
echo "--"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment