Dateien nach "/" hochladen
This commit is contained in:
@@ -5,11 +5,12 @@ set -Eeuo pipefail
|
||||
IFS=$'\n\t'
|
||||
umask 077
|
||||
|
||||
VERSION="1.0"
|
||||
VERSION="1.2"
|
||||
URI="${LIBVIRT_URI:-qemu:///system}"
|
||||
BACKUP_ROOT="${1:-}"
|
||||
RSYNC_OPTS=(-aHAX --numeric-ids --sparse --info=progress2)
|
||||
ALLOW_RUNNING=0
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
@@ -28,6 +29,7 @@ Das Skript sichert:
|
||||
- UEFI-NVRAM-Dateien
|
||||
- dateibasierte TPM-Backend-Zustände
|
||||
- qemu-img-Informationen und Prüfsummen
|
||||
- PAW-Netzwerk aus 50-paw-install.yml inklusive br-lan- und Port-MACs
|
||||
|
||||
Blockgeräte wie LVM-LVs werden nur dokumentiert und NICHT kopiert.
|
||||
EOF
|
||||
@@ -41,7 +43,7 @@ log() { printf '\n==> %s\n' "$*"; }
|
||||
[[ $EUID -eq 0 ]] || die "Bitte als root ausführen."
|
||||
[[ -n "$BACKUP_ROOT" ]] || { usage; exit 2; }
|
||||
|
||||
for cmd in virsh rsync sha256sum python3 qemu-img find sort awk sed; do
|
||||
for cmd in virsh rsync sha256sum python3 qemu-img find sort awk sed findmnt; do
|
||||
command -v "$cmd" >/dev/null || die "Benötigtes Programm fehlt: $cmd"
|
||||
done
|
||||
|
||||
@@ -51,6 +53,20 @@ mkdir -p "$BACKUP_ROOT"
|
||||
[[ -z "$(find "$BACKUP_ROOT" -mindepth 1 -maxdepth 1 -print -quit)" ]] \
|
||||
|| die "Backup-Ziel ist nicht leer: $BACKUP_ROOT"
|
||||
|
||||
# Früh erkennen, ob das Ziel beschreibbar ist und der Mount read-only ist.
|
||||
mount_target="$(findmnt -no TARGET -T "$BACKUP_ROOT" 2>/dev/null || true)"
|
||||
mount_opts="$(findmnt -no OPTIONS -T "$BACKUP_ROOT" 2>/dev/null || true)"
|
||||
[[ ",$mount_opts," != *,ro,* ]] \
|
||||
|| die "Backup-Dateisystem ist nur lesbar eingehängt: ${mount_target:-unbekannt}"
|
||||
|
||||
probe="$BACKUP_ROOT/.libvirt-backup-write-test.$$"
|
||||
printf 'libvirt backup write test\n' > "$probe" \
|
||||
|| die "Backup-Ziel ist nicht beschreibbar: $BACKUP_ROOT"
|
||||
sync "$probe" 2>/dev/null || sync
|
||||
grep -qx 'libvirt backup write test' "$probe" \
|
||||
|| die "Schreib-/Lesetest auf dem Backup-Ziel fehlgeschlagen."
|
||||
rm -f "$probe"
|
||||
|
||||
mkdir -p "$BACKUP_ROOT"/{domains,networks,pools,interfaces,files,metadata,logs}
|
||||
exec > >(tee -a "$BACKUP_ROOT/logs/backup.log") 2>&1
|
||||
|
||||
@@ -118,7 +134,10 @@ export_objects() {
|
||||
warn "$kind konnte nicht exportiert werden: $name"
|
||||
rm -f "$BACKUP_ROOT/$outdir/$safe.xml"
|
||||
fi
|
||||
done < <(virsh -c "$URI" "$list_cmd" --all --name 2>/dev/null | sed '/^[[:space:]]*$/d')
|
||||
done < <(
|
||||
virsh -c "$URI" "$list_cmd" --all --name 2>/dev/null |
|
||||
sed 's/^[[:space:]]*//; s/[[:space:]]*$//; /^[[:space:]]*$/d'
|
||||
)
|
||||
}
|
||||
|
||||
log "Exportiere Netzwerke, Storage-Pools und Host-Interfaces"
|
||||
@@ -243,6 +262,26 @@ if [[ -s "$BACKUP_ROOT/metadata/block-sources.txt" ]]; then
|
||||
warn "Diese LVM-/Block-Datenträger separat sichern, z. B. per LVM-Snapshot, dd oder Storage-Replikation."
|
||||
fi
|
||||
|
||||
log "Sichere PAW-Netzwerk und br-lan-MAC"
|
||||
if [[ -x "$SCRIPT_DIR/paw-network-backup.sh" ]]; then
|
||||
"$SCRIPT_DIR/paw-network-backup.sh" "$BACKUP_ROOT/network"
|
||||
else
|
||||
warn "paw-network-backup.sh fehlt neben dem Backup-Skript; Netzwerk wurde nicht gesichert."
|
||||
fi
|
||||
|
||||
log "Prüfe Backup-Datenträger vor der Prüfsummenphase"
|
||||
mount_opts="$(findmnt -no OPTIONS -T "$BACKUP_ROOT" 2>/dev/null || true)"
|
||||
[[ ",$mount_opts," != *,ro,* ]] \
|
||||
|| die "Backup-Dateisystem wurde während des Backups nur-lesbar. Backup ist unvollständig."
|
||||
|
||||
probe="$BACKUP_ROOT/.libvirt-backup-final-test.$$"
|
||||
printf 'final write test\n' > "$probe" \
|
||||
|| die "Abschließender Schreibtest fehlgeschlagen. Backup ist unvollständig."
|
||||
sync "$probe" 2>/dev/null || sync
|
||||
grep -qx 'final write test' "$probe" \
|
||||
|| die "Abschließender Lesetest fehlgeschlagen. Backup ist unvollständig."
|
||||
rm -f "$probe"
|
||||
|
||||
log "Erzeuge Dateiliste und SHA-256-Prüfsummen"
|
||||
(
|
||||
cd "$BACKUP_ROOT"
|
||||
|
||||
Reference in New Issue
Block a user