57 lines
2.1 KiB
Bash
57 lines
2.1 KiB
Bash
#!/bin/bash
|
|
|
|
[[ -z "$VM_UUID" ]] || {
|
|
echo "Environment variable VM_UUID is not set."
|
|
exit 1
|
|
}
|
|
source "/etc/detee/daemon/vms/$VM_UUID"
|
|
|
|
mandatory_vars=("IF_DEVICE" "IF_NAME" "IF_TYPE" "KERNEL" \
|
|
"INITRD" "PARAMS" "CPU_TYPE" "VCPUS" "MEMORY" \
|
|
"MAX_MEMORY" "DISK" "DISK_SIZE")
|
|
for var in "${mandatory_vars[@]}"; do
|
|
if [ -z "${!var}" ]; then
|
|
echo "Environment variable $var is not set."
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [[ "$IF_TYPE" == "macvtap" || "$IF_TYPE" == "ipvtap" ]]; then
|
|
ip link add link $IF_DEVICE name $IF_NAME type $IF_TYPE mode bridge
|
|
ip link set $IF_NAME up
|
|
ip link set $IF_NAME promisc on
|
|
vtap_index="$(cat /sys/class/net/${IF_NAME}/ifindex)"
|
|
vtap_addr="$(cat /sys/class/net/${IF_NAME}/address)"
|
|
qemu_device_params="-netdev tap,id=hostnet1,fd=3 3<>/dev/tap${macvtap_index}"
|
|
qemu_device_params+=" -device virtio-net-pci,netdev=hostnet1,mac=${macvtap_addr},romfile="
|
|
fi
|
|
|
|
if [[ "$IF_TYPE" == "NAT" ]]; then
|
|
ports=""
|
|
for port_pair in "$NAT_PORT_FW"; do
|
|
host_port="$( echo $port_pair | cut -d ':' -f1 )"
|
|
guest_port="$( echo $port_pair | cut -d ':' -f2 )"
|
|
ports+=",hostfwd=tcp::${host_port}-:${guest_port}"
|
|
done
|
|
qemu_device_params="-netdev user,id=vmnic${ports}"
|
|
qemu_device_params+=" -device virtio-net-pci,netdev=vmnic,romfile="
|
|
fi
|
|
|
|
# TODO: also handle bridge device (when IPs are public, but the host is the gateway)
|
|
|
|
vm_disk="/root/dtrfs/arch-1-ghe0.qcow2"
|
|
|
|
[[ -f $DISK ]] || qemu-img create -f qcow2 ${DISK} ${DISK_SIZE}
|
|
|
|
qemu-system-x86_64 $qemu_device_params \
|
|
-enable-kvm -cpu $CPU_TYPE -vga none \
|
|
-machine q35,confidential-guest-support=sev0,memory-backend=ram1 \
|
|
-smp $VCPUS,maxcpus=255 -m $MEMORY,slots=5,maxmem=$MAX_MEMORY \
|
|
-no-reboot -bios /usr/share/edk2/ovmf/OVMF.amdsev.fd \
|
|
-drive file=${DISK},if=none,id=disk0,format=qcow2 \
|
|
-device virtio-blk-pci,drive=disk0 \
|
|
-object memory-backend-memfd,id=ram1,size=$MEMORY,share=true,prealloc=false \
|
|
-object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,kernel-hashes=on \
|
|
-kernel $KERNEL -append "$PARAMS" -initrd $INITRD \
|
|
-nographic -monitor pty -serial mon:stdio -monitor unix:monitor,server,nowait
|