dotfiles/.local/scripts/other-common-scripts/start-qemu-vm.sh

74 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env nix-shell
#! nix-shell -i bash --packages bash qemu_kvm util-linux
set -xef -o pipefail
# $1: host port for SSH
# $2: disk image
# $3: ISO
if [ ! -c '/dev/kvm' ]; then
echo 'ERROR: /dev/kvm does not exist, no KVM accel'
exit 1
else
if ! groups | grep kvm > /dev/null; then
# shellcheck disable=SC2016
echo 'ERROR: sudo usermod -aG kvm $USER'
exit 1
fi
fi
if [ -z "$1" ]; then
echo "ERROR: expecting a binding port for SSH"
exit 1
fi
if [ -z "$2" ]; then
echo "ERROR: expecting a disk image"
exit 1
fi
HOST_PORT="$1"
HDA="$2"
CDR="$3"
if [ "$(uname -m)" == 'aarch64' ]; then
[[ -d "${HOME}/.vms" ]] || mkdir "${HOME}/.vms"
BIOS="${HOME}/.vms/result/u-boot.bin"
if [[ ! -f "${BIOS}" ]]; then
pushd "${HOME}/.vms"
nix build 'nixpkgs#ubootQemuAarch64'
popd
fi
QEMU_MACHINE='virt'
BIOS="-bios ${HOME}/.vms/result/u-boot.bin"
elif [ "$(uname -m)" == 'x86_64' ]; then
QEMU_MACHINE='pc'
BIOS="-drive file=${HOME}/.local/share/edk2/EDKII_CODE,if=pflash,format=raw,unit=0,readonly=on \
-drive file=${HOME}/.local/share/edk2/EDKII_VARS,if=pflash,format=raw,unit=1"
fi
QEMU_COMMON="--all-tasks --cpu-list 4-7 \
qemu-kvm \
-machine ${QEMU_MACHINE} \
-cpu host \
-smp 4,sockets=1,cores=4,threads=1 \
-accel kvm \
-m 8192 \
-nographic \
${BIOS} \
-sandbox on \
-netdev user,id=mynet0,hostfwd=tcp::${HOST_PORT}-:22 \
-device virtio-net-pci,netdev=mynet0"
if [ -z "${CDR}" ]; then
taskset \
${QEMU_COMMON} \
-hda "${HDA}"
else
taskset \
${QEMU_COMMON} \
-hda "${CDR}" \
-hdb "${HDA}"
fi