#!/bin/sh data_dir="${XDG_DATA_HOME:-${HOME}/.local/share}/vm" storage="${data_dir}/livevm.qcow2" # allocate half of available memory and cores to vm mem="$(($(grep MemAvailable /proc/meminfo | grep -o '[0-9]*')/2))" cores="$(($(nproc)/2))" cmd="qemu-system-x86_64 -boot menu=on -enable-kvm -device intel-hda -device hda-duplex -m ${mem}k -cpu host -smp $cores -drive file=$storage" [ ! -d "${data_dir}" ] && mkdir -p "${data_dir}" [ ! -f "$storage" ] && qemu-img create -f qcow2 "$storage" 30G if [ "$#" -eq 1 ] && [ -f "$1" ] then cmd="${cmd} -cdrom ${1}" shift fi while getopts "wehc:d:u:q:r:" f do case "$f" in w) cmd="${cmd} -device qxl -display gtk" ;; e) [ ! -f "/usr/share/edk2-ovmf/x64/OVMF_CODE.fd" ] && die "ovmf not found, install it" [ ! -f "${data_dir}/OVMF_VARS.fd" ] && cp "/usr/share/edk2-ovmf/x64/OVMF_CODE.fd" "${data_dir}/OVMF_VARS.fd" cmd="${cmd} -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2-ovmf/x64/OVMF_CODE.fd" cmd="${cmd} -drive if=pflash,format=raw,file=${data_dir}/OVMF_VARS.fd" ;; c) cmd="${cmd} -cdrom ${OPTARG}" ;; d) cmd="${cmd} -drive file=${OPTARG}" ;; u) cmd="${cmd} -device qemu-xhci,id=xhci -device usb-host,hostdevice=/dev/bus/usb/${OPTARG}" ;; q) cmd="${cmd} -drive file=${OPTARG}" ;; r) cmd="${cmd} -drive format=raw,file=${OPTARG}" ;; h) cat <<- EOF Usage: ${0##*/} command a wrapper for qemu Commands: -e use efi -w run wangblows -c [cdrom] -d [drive] -u [host_bus/host_addr] -q [img.qcow2] -r [img.raw] EOF exit ;; ?) printf "%s\n" "usage: ${0##*/} [ -weh ] [ -c cdrom ] [ -d drive ]" 1>&2 exit 1 ;; esac done # use virgl by default if wangblows is not set [ -n "${cmd##*device qxl*}" ] && cmd="${cmd} -device virtio-vga-gl -display gtk,gl=on" eval "$cmd"