Wie kann ich die .vma als einfache Festplatte einhängen und auf den Inhalt zugreifen?

derHeiko

New Member
Feb 3, 2025
8
1
3
Hallo zusammen.

Ich stelle gerade meinen Heimserver von Hyper-V auf Proxmox um und stehe vor einem Problem, das ich nicht gelöst bekomme.

Konstellation - es läuft unter Proxmox eine virtuelle Windows 10 Maschine.
Davon mache ich ein Backup mit dem Backup Tool in Proxmox auf meine qnap.

Dort habe ich dann eine .vma.zst Datei.

Es kommt manchmal vor, dass ich einfach nur eine Datei aus einem Backup suchen und extrahieren muss.

Im rudimentärsten Fall habe ich zu Hyper-V Zeiten aus dem Backup die win10.vhdx genommen und als Laufwerk an ein anderes Windows gehängt.

Das habe ich auch unter Proxmox versucht, mit

"qm importdisk 100 '/HV-Speicher/vzdump-qemu-100-2025_02_04-09_19_12.vma' HV-Speicher --format raw"

Aber die Festplatte wird nur als unformatierter Speicher angezeigt.

Screenshot_15.jpg

Wenn ich das mit der originalen .vhdx Datei ausprobiere,

qm importdisk 100 '/mnt/pve/qnap/import/win10.vhdx' HV-Speicher --format raw

funktioniert es. Dann kann ich die als Festplatte hinzufügen und auf die Daten zugreifen.

Wie kann ich die .vma als einfache Festplatte einhängen und auf den Inhalt zugreifen?

Vielen lieben Dank vorab.

Gruß Heiko

PS: Den Backup-Server habe ich bisher nicht installiert, kommt aber bald.
 
das geht mit VMA nicht, nur mit PBS. ein restore ist natuerlich moeglich
 
  • Like
Reactions: derHeiko
Was du vorhast geht nicht, weil die VMA Dateien Sparse Dateien sind (leere Bereiche werden ausgespart). Prinzipiell vermutlich nicht unmöglich, hierfür einen Treiber zu schreiben, der die mountet. Den gibt es aber meines wissens noch nicht.

Ich hab mir mal ein Skript geschrieben, mit welchem ich zst Dateien entpacke, dann einen VMA extract mache und dann die daraus resultierenden Laufwerke im Hypervisor mounte.
Im Anschluss (hier auskommentiert) binde ich eine Windows Freigabe des Servers in den Hypervisor ein und kopiere die Dateien aus dem Hypervisor auf die gemountete Windowsfreigabe. Das Pferd also von hinten aufgezäunt.

Unbedingt auf einer tmux / screen Console machen, Prozess ist langwierig, falls deine SSH Session mal abbricht.

Drawbacks:
- Braucht viel Speicher auf dem Host, weil die Laufwerke entpackt werden
- Langwieriges Recovery, mit dem Skript nur teilautomatisiert

Code:
#!/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
# cd ######
# mount //192.168.178.254/Freigabe ${workingDir}/smb -o user=USER
# cp -rp ./* ${workingDir}/smb
 
Last edited:
  • Like
Reactions: derHeiko
Vielen lieben Dank für eure Hilfe.
Das hat mir sehr geholfen!

Ich fasse zusammen, falls noch mal jemand danach fragt/sucht:

Die .vma und vma.zst kann man nicht direkt anhängen, aber es geht mit einem einfachen Umweg.

Zuerst entpacke ich die .zst und dekompriere die .vma mit einem Befehl:

Code:
zstd --decompress --stdout vzdump-qemu-100-2025_02_04-09_19_12.vma.zst | vma extract - extract

Dann hänge ich mit

Code:
qm importdisk 100 /HV-Speicher/extract/disk-drive-sata0.raw HV-Speicher

die Festplatte an die virtuelle Maschine.

Unter Windows muss man die dann nur noch in der Datenträgerverwaltung Online nehmen.

Gruß Heiko
 
Ach witzig. Mein Skript hatte ich nach der Anleitung von Herrn Paschke geschrieben.
Mir hatte dort nicht gefallen, dass in zwei Schritten entpackt wird. Dann benötige ich ja den Speicher zweimal. Deshalb hatte ich es anders gelöst.
Darüber hinaus hatte ich mit losetup eine automatisierte Lösung für das erstellen der Mountpoints gefunden.

Aber die Anleitung war jedenfalls eine große Hilfe.
 
Last edited:
falls du PBS auch im einsatz hast (und dort z.b. mehr platz als am PVE host) kannst du ein VMA backup mit vma-to-pbs importieren und dann mittels file restore von dort einzelne files rausziehen ;)

alternativ - ein regulaerer restore auf PVE seite macht dekomprimierung und restore in einem rutsch, braucht also nicht den dreifachen speicherplatz (backup, entpackt, in VM kopiert) sondern nur den doppelten (backup und wiederhergestellte VM).