#!/bin/bash

# Zielverzeichnis der abschließenden Konvertierung (muss mit "/" enden):
vz=/tmph/

if [ $# == 0 ];then echo "vmwz /dev/sd? (Bootlaufwerk)";exit;fi
echo "Passwort zum erstellen der zRAM-Disk:"
sudo modprobe zram && id=$(sudo cat /sys/class/zram-control/hot_add) || exit

# Für schnellere, aber schlechtere Kompression (= der effektive RAM-Bedarf), "zstd" durch "lz4" ersetzen:
# (Windows 11 22H2 wird z. B. von 9,5 GiB auf 5,3 GiB (zstd) bzw. 6,5 GiB (lz4) komprimiert)
echo -ne "\nKompression:   ";echo zstd|sudo tee /sys/block/zram$id/comp_algorithm

# die unkomprimierte Größe der zRAM-Disk (darf höher als das RAM des Hosts sein: s. o.):
echo -ne "zRAM-Disk-Größe: ";echo 40G|sudo tee /sys/block/zram$id/disksize

# Die vHD wird sparse erstellt und kann deshalb weit größer als RAM und zRAM sein:
# (relevant ist nur was tatsächlich geschrieben und wie stark es komprimiert wird)
sudo mkfs.xfs -q /dev/zram$id && mkdir /tmp/zram$id
sudo mount -o discard /dev/zram$id /tmp/zram$id/ && sudo chmod 777 /tmp/zram$id/
qemu-img create /tmp/zram$id/vHD.raw 112G


# VM booten:
echo -ne "\nWICHTIG: Gleich nach dem Start der VM [Esc] drücken und im Menü das 2. Laufwerk wählen. [Enter]";read

qemu-system-x86_64 -nodefaults -enable-kvm -cpu host -smp cores=4 -m 4G \
-vga qxl -display sdl,gl=on,window-close=off -device usb-ehci -device usb-tablet \
-drive file=/tmp/zram$id/vHD.raw,if=virtio,aio=io_uring,discard=unmap,format=raw \
-drive file=/dev/sd$1,if=virtio,aio=io_uring,snapshot=on,format=raw \
-boot menu=on \
-drive file=~/Downloads/Images/VM-XP/virtio-win.vfd,if=floppy,aio=io_uring,snapshot=on,format=raw

# Nachbereitung:
echo -e "\n\n*** WICHTIG: Die zRAM-Disk wird in beiden Fällen gelöscht. ***\n"
read -p "Name (ohne Leerzeichen) der in $vz zu übertragenden Dateien [Enter=löschen]? " n
if [ -n "$n" ]
 then qemu-img convert -pcOqcow2 -ocompression_type=zstd /tmp/zram$id/vHD.raw "$vz$n.qcow2"

fi
echo -e "\nDie zRAM-Disk wird gelöscht:\n"
sudo umount -l /tmp/zram$id/ && rm -vrf /tmp/zram$id
echo $id|sudo tee /sys/class/zram-control/hot_remove > /dev/null
