VZdump Skript with handling of --maxfiles

ivenae

Member
Feb 11, 2022
60
14
13
40
Ich weiß, dass es einen Proxmox Backup Server gibt.
Ich weiß, dass dieses Skript nicht perfekt ist, weil es das ein oder andere noch hardkodiert nutzt.
Aber mit diesem Skript und Cron kann ich an Wunschtagen ein VZdump Export machen und dabei in Abhängigkeit des freien Speicherplatzes die Anzahl der maxfiles reduzieren lassen, ohne eingreifen zu müssen.
Dazu gibts eine Übersicht des Pool-Status und die freie Speicherkapazität.
Die E-Mails kann man sich mit einem Mailfilter filtern lassen nach den üblichen verdächtigen: "brokenpipe", falls doch mal was vollläuft, oder "ACHTUNG" (hier genutzt, um z.B. einen degraded Status anzuzeigen).

Datenträger UUIDs ('blkid') werden hardkodiert hinterlegt, damit nicht an irgend einem zufällig gesteckten USB Stick gesichert wird.

Edit: Nicht vergessen, die PATH Variable in Cron korrekt zu setzen oder folgende Zeile einzufügen:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

/usr/local/bin/SmartStore.sh
Bash:
#!/bin/bash
# Import Config File
config=/usr/local/bin/config.cfg
source $config


# Check if Already Running
for pid in $(pidof -x SmartStore.sh); do
    if [ $pid != $$ ]; then
        echo "[$(date)] : SmartStore.sh : Process is already running with PID $pid"
        exit 1
    fi
done


mkdir -p ${backupPath}
umount ${backupPath}

# Get Zpool Status
zpool status
ZP=$(zpool status | grep degraded)
if [ -n "$ZP" ]; then
   echo ACHTUNG: ${ZP}
fi

# Get Filesystem Usage-Percentage
FS=$(df -h | grep -E '([7-9][0-9]|100)%')
echo ${FS}
if [ -n "$FS" ]; then
   echo ACHTUNG: ${FS}
fi

# Get Machine Count
pctList=$(pct list | wc -l)
if [ "$pctList" -ne "0" ]; then
   pctList=$(($pctList - 1))
fi

qmList=$(qm list | wc -l)
if [ "$qmList" -ne "0" ]; then
   qmList=$(($qmList - 1))
fi
NUMBER=$(($pctList + $qmList))

# Loop over UUIDs
for uuid in "${UUIDS[@]}"
do
   mount UUID=$uuid ${backupPath}
   mountpoint -q ${backupPath} || continue
   echo Sichere UUID $uuid
   echo "Backup ausgeführt am: $(date +"%Y-%m-%d-%H:%M")" on UUID $uuid >> "${logPath}"
   #Get Size of last Backups
   if [ "$(ls ${backupPath}/*.zst | wc -l)" -eq "0" ] || [ "${NUMBER}" -eq "0" ]; then
      backupCount='0'
      backupNeed='NA'
      backupPuffer='0'
   else
      backupSize=$(du -s ${backupPath}| cut -f 1)
      backupCount=$(($(ls ${backupPath}/*.zst | wc -l) / ${NUMBER}))
      backupNeed=$(($backupSize / $backupCount))
      backupPuffer=$(($backupNeed * 11/10))
   fi
   backupAvail=$(df $backupPath | awk 'NR==2{print$4}')
   echo $backupCount Backups found
   echo $MAXFILE Backups in Backup-Retention-Policy
   echo $backupNeed Bytes estimated Backup Size
   echo $backupPuffer Bytes estimated Backup Size with Puffer
   echo $backupAvail Bytes estimated Backup availlable Backup Space
   if [ ${backupPuffer} -ge ${backupAvail} ]; then
      if [ "${MAXFILE}" -eq "1" ]; then
         echo ACHTUNG: ZU WENIG SPEICHERPLATZ: Größere Backup Festplatte benötigt. Maxfile kann nicht weiter reduziert werden!
      else
         MAXFILE=$(($MAXFILE-1))
         sed -i -e "s/^MAXFILE.*/MAXFILE=$MAXFILE/" ${config}
         echo ACHTUNG: ZU WENIG SPEICHERPLATZ: Maxfile = ${MAXFILE}
      fi
   fi
   vzdump --compress zstd --prune-backups keep-last=$MAXFILE --all --mode snapshot --dumpdir $backupPath
   umount ${backupPath}
done

config.cfg
Bash:
UUIDS=(
604099bb-9017-4cbd-a98f-9a11362c38d5
)

MAXFILE=3

backupPath=/media/SmartStore
logPath=/var/log/smartstore.log
 
Last edited:
Hi,
nur eine kurze Warnung, dass --maxfiles <N> veraltet ist und in einer zukünftigen Version vermutlich wegkommt. Stattdessen, kannst Du --prune-backups keep-last=<N> benutzen; das Resultat ist dasselbe.
 
Last edited:
  • Like
Reactions: Falk R.
Hi,
nur eine kurze Warnung, dass --maxfiles <N> veraltet ist und in einer zukünftigen Version vermutlich wegkommt. Stattdessen, kannst Du --prune-backups keep-last=<N> benutzen; das Resultat ist dasselbe.
Hatte ich witzigerweise gestern Abend auch gelesen und heute morgen korrigiert. War klar, dass das jemandem auffällt ;-)
 
Das ist der Vorteil von Open Source, viele Augen sehen mehr und am Ende läuft es besser.
 
Hier noch eins, falls mal eine vma.zstd im Proxmox Hypervisor als Partition einbinden will, um einzelne Dateien zu extrahieren.
Macht kein Sanitizing, ist für den Admin bestimmt.
Muss für non-zstd Images angepasst, werden, ebenso für Multiple-Disk-Images in einer VMA.

Bash:
#!/bin/bash
echo "vmaRecover 1.0"
if [ -z ${1} ] || [ -z ${2} ] || [ "$1" == "-h" ] ; then
   echo "vmaRecover.sh <file.vma.zst> </workingDir> [clean]" 
   echo "Working dir contains subfolder with raw_image and loop folder for mounting file Systems."
   exit 0
fi

file=$1
workingDir=$(echo "$2" | sed 's:/*$::')
recSubDir=/raw_image

if [ "${3}" == "clean" ]; then
   echo "============================================================"
   echo "Cleanup"
   echo "============================================================"
   echo Unmounting loop-Devices
   umount ${workingDir}/loop*
   losetup -D
   echo remove ${workingDir}${recSubDir}
   rm -r ${workingDir}${recSubDir}
   echo remove ${workingDir}/loop*
   rm -r ${workingDir}/loop*
   exit 0
fi


if [ ! -f "$file" ]; then
    echo "File does not exist: $file"
    exit 1
fi

if [ -d "${workingDir}${recSubDir}" ]; then
    echo "Folder must not exist: ${workingDir}${recSubDir}"
    exit 1
fi

echo "============================================================"
echo "Extracting $file to ${workingDir}${recSubDir}"
echo "============================================================"
mkdir -p ${workingDir}
zstd -q -d -c ${file} | vma extract -v - ${workingDir}${recSubDir}

echo "============================================================"
echo "Create Loop Devices"
echo "============================================================"
loop=$(shuf -i 10-50 -n1)
rawFile=$(find ${workingDir}${recSubDir} -name "*.raw")

losetup /dev/loop${loop} ${rawFile}
sleep 1
partx -v --add /dev/loop${loop}
readarray parts < <(ls -1 /dev/loop${loop}p*)

echo "============================================================"
echo "Mount Image"
echo "============================================================"
for part in "${parts[@]}"
do 
   mkdir -p ${workingDir}/${part##*/}
   mount ${part} ${workingDir}/${part##*/}
   echo "Partition mounted: ${workingDir}/${part##*/}"
done

#"mount //192.168.178.254/Freigabe ${workingDir}/smb -o user=USER"
 
Last edited:

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!