JEDNODUCHÝ SKRIPT PRO AUTOMATICKÉ ZÁLOHOVÁNÍ OBRAZU PRO AKTIVNÍ VIRTUÁLNÍ STROJE LINUX KVM

Pokud používáte Linux KVM Virtual Machine Host, možná zjistíte, že budete chtít zálohovat úplné bitové kopie, aniž byste virtuální počítače přepínali do režimu offline nebo určovali virtuální počítače (takže můžete virtuální počítače přidávat a odstraňovat podle vlastního uvážení).

To by mi zachránilo prdel, když jsem omylem srovnal databázi, o které jsem zapomněl, že je na serveru, který jsem přestavěl poté, co jsem ji nedávno roztočil.

Tento skript skočí na virsh, projde každý výstupní řádek pro aktivní virtuální počítače a načte jeho celočíselné ID.

Poté najděte cestu a název souboru s obrazem, zmrazte systém souborů, vytvořte obraz, rozmrazte jej a pokračujte.

Obrazové soubory a názvy virtuálních počítačů jsou často stejné plus qcow2, ale v mém případě jsem k názvu virtuálního počítače připojil IP pro rychlou orientaci, díky čemuž se lišily. Takže to dostane skutečná jména a bude odkazovat podle ID.

Pokud nemáte nainstalovaného agenta qemu-guest-agent, nebude schopen zmrazit souborový systém a vyvolá chybu a poté pokračovat. Můžete to tedy použít jako prostředek ke kontrole, které virtuální počítače jsou a které nejsou zálohovány při nastavování samotného serveru.

Uložil jsem svůj do /root a poté jej zavolal s cronjob spuštěným jako root. Nemusíte jej spouštět jako root, ale budete muset odpovídajícím způsobem nastavit oprávnění.

Nakonec zálohuji pomocí svých vlastních prostředků, můžete použít Lsync nebo UrBackup k automatizaci obou.

SKRIPT

#!/bin/bash

###########################################################################################

#Linux KVM Active VM Image Backup Script
#Author: Daniel Chong
#Date 28 September 2021

#This finds all active VMs, loops through them freezes their file system, takes an image then thaws them.

#It logs an error if it can't freeze the file system (usually due to the QEMU-Guest-Agent not being installed,
#on Debian builds it can be installed using apt/apt-get.

#This can actually be used to your advantage, if you want a VM to be backed up, install the QEMU-Guest-Agent, if you don't, don't install it.

#Files are backed up to the backupPath variable
#Current Date is prefixed onto the back up name, in the event of a conflict it will overwrite the old file

###########################################################################################


#Backups are saved here, full path ending on a forward slash
backupPath=""; 

#currentDate will be appended to the backup name
currentDate=$(date +"%m_%d_%Y");

#fetch the VM list, for each, make the variable $line;
sudo virsh list | while read line; 
do

        #take the first column from line and output it into a variable $vmID ($() makes the variable);
        vmID=$(awk '{print $1}' <<< $line)

        #echo for testing
        #echo "VM ID: $vmID";

        #check if the variable is in the number regex;
        if [[ $vmID =~ ^[0-9]+$ ]] ; then

                #backup the VM
                #get the qcow2 file name

                #grab the whole block record and loop through each line
                sudo virsh domblklist $vmID | while read blockLine;
                do

                        #fetch first column
                        elementOne=$(awk '{print $1}' <<< $blockLine);

                        #echo for testing
                        #echo "Column One: $elementOne";

                        #if column1 of the line = 'vda'
                        if [ "$elementOne" = 'vda' ]; then
                                #then save column2 as $fileName
                                filePath=$(awk '{print $2}' <<< $blockLine);
                                fileName=$(basename "$filePath");
                                #echo for testing
                                #echo "VDA Path: $filePath";
                                #echo "VDA FileName: $fileName";

                                backupName=$currentDate$fileName;

                                #this is the snapshot name, it will be overridden each time
                                tempName='snapshot.qcow2';
                                #echo $backupName;
                                # Freeze guest filesystem so that it can't corrupt the image, this will render the VM mostly useless
                                sudo virsh domfsfreeze $vmID

                                outcome=$?;

                                #echo for testing
                                #echo "$outcome";

                                if [ "$outcome" = '0' ]; then
                                        #echo 'Frozen';
                                        # Create snapshot, this is basically instantaneous
                                        sudo qemu-img create -f qcow2 -b $filePath "$backupPath$tempName";

                                        # Create image from snapshot, this will take a while
                                        sudo qemu-img convert -O raw "$backupPath$tempName" "$backupPath$backupName.img" --force-share

                                        # Thaw guest filesystems to restore function
                                        sudo virsh domfsthaw $vmID

                                        #echo for testing
                                        #echo 'Thawed';
                                else
                                        #echo for testing
                                        echo "Error Freezing on $vmID";
                                fi;
                        fi || exit;

                done;

                #echo for testing
                #echo "VDA NAME: $fileName";
        fi

done

CRONTAB

Můj Crontab jako root pak vypadá níže, spusťte skript každou neděli ráno, přičemž spustí řádek, který odstraní všechny soubory staré 31 dní nebo starší.

Cronjobs
5 1 * * 7 /bin/bash -c "/root/backupVM.sh"
0 0 * * 7 find /[PATHTOBACKUPS]/backups/* -mtime +30 -type f -delete

Zdroj a poděkování:

Simple Automated Image Backup Script for Active Linux KVM Virtual Machines