#!/bin/bash

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

if [ $# == 0 ];then echo "uvmnz /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 lz4 |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
cp -va /usr/share/edk2-ovmf/x64/OVMF.4m.fd /tmp/zram$id/vHD.fd

# VM mit UEFI booten:
echo -e "\nHinweis:\n\nBeim Reboot kommt man mit [Esc] ins UEFI, um von einem anderen Laufwerk zu booten!\n"

qemu-system-x86_64 -nodefaults -enable-kvm -cpu host -smp cores=4 -m 4G \
-vga none -device virtio-vga-gl -display sdl,gl=on,window-close=off \
-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 \
-drive file=/tmp/zram$id/vHD.fd,if=pflash,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"
 mv -v /tmp/zram$id/vHD.fd $vz$n.fd
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
