From ccba86a0f0d07f0c82fba363c5314304ad076a5c Mon Sep 17 00:00:00 2001 From: Erik Arvstedt Date: Mon, 8 Mar 2021 15:11:15 +0100 Subject: [PATCH] examples: extract common features for running QEMU VMs Needed by commit: "examples: add deploy-krops.sh" --- examples/deploy-qemu-vm.sh | 48 +++++----------------------------- examples/qemu-vm/run-vm.sh | 48 ++++++++++++++++++++++++++++++++++ examples/qemu-vm/vm-config.nix | 7 +++++ 3 files changed, 62 insertions(+), 41 deletions(-) create mode 100644 examples/qemu-vm/run-vm.sh create mode 100644 examples/qemu-vm/vm-config.nix diff --git a/examples/deploy-qemu-vm.sh b/examples/deploy-qemu-vm.sh index 0fa009e..7e68c2f 100755 --- a/examples/deploy-qemu-vm.sh +++ b/examples/deploy-qemu-vm.sh @@ -17,61 +17,27 @@ if [[ ! -v IN_NIX_SHELL ]]; then exec nix-shell --run "./${BASH_SOURCE[0]##*/} $*" fi -cd "${BASH_SOURCE[0]%/*}" - -tmpDir=/tmp/nix-bitcoin-qemu-vm -mkdir -p $tmpDir - -# Cleanup on exit -cleanup() { - set +eu - kill -9 $qemuPID - rm -rf $tmpDir -} -trap "cleanup" EXIT - -identityFile=qemu-vm/id-vm -chmod 0600 $identityFile +source qemu-vm/run-vm.sh echo "Building VM" -nix-build --out-link $tmpDir/vm - < { configuration = { imports = [ + ]; - virtualisation.graphics = false; - services.mingetty.autologinUser = "root"; - users.users.root = { - openssh.authorizedKeys.keys = [ "$(cat $identityFile.pub)" ]; - }; }; }).vm EOF -vmMemoryMiB=2048 vmNumCPUs=4 +vmMemoryMiB=2048 sshPort=60734 +runVM $tmpDir/vm $vmNumCPUs $vmMemoryMiB $sshPort -export NIX_DISK_IMAGE=$tmpDir/img -export QEMU_NET_OPTS=hostfwd=tcp::$sshPort-:22 -/dev/null & -qemuPID=$! - -# Run command in VM -c() { - ssh -p $sshPort -i $identityFile -o ConnectTimeout=1 \ - -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR \ - -o ControlMaster=auto -o ControlPath=$tmpDir/ssh-connection -o ControlPersist=60 \ - root@127.0.0.1 "$@" -} - -echo -echo "Waiting for SSH connection..." -while ! c : 2>/dev/null; do :; done - -echo +vmWaitForSSH echo "Waiting until services are ready..." c ' attempts=300 @@ -99,4 +65,4 @@ case ${1:-} in ;; esac -# Cleanup happens at exit (see above) +# Cleanup happens at exit (defined in qemu-vm/run-vm.sh) diff --git a/examples/qemu-vm/run-vm.sh b/examples/qemu-vm/run-vm.sh new file mode 100644 index 0000000..b195635 --- /dev/null +++ b/examples/qemu-vm/run-vm.sh @@ -0,0 +1,48 @@ +qemuDir=$(cd "${BASH_SOURCE[0]%/*}" && pwd) + +tmpDir=/tmp/nix-bitcoin-qemu-vm +mkdir -p $tmpDir + +# Cleanup on exit +cleanup() { + set +eu + if [[ $qemuPID ]]; then + kill -9 $qemuPID + fi + rm -rf $tmpDir +} +trap "cleanup" EXIT + +identityFile=$qemuDir/id-vm +chmod 0600 $identityFile + +runVM() { + vm=$1 + vmNumCPUs=$2 + vmMemoryMiB=$3 + sshPort=$4 + + export NIX_DISK_IMAGE=$tmpDir/img + export QEMU_NET_OPTS=hostfwd=tcp::$sshPort-:22 + /dev/null & + qemuPID=$! +} + +vmWaitForSSH() { + echo + printf "Waiting for SSH connection..." + while ! c : 2>/dev/null; do :; done + echo +} + +# Run command in VM +c() { + ssh -p $sshPort -i $identityFile -o ConnectTimeout=1 \ + -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR \ + -o ControlMaster=auto -o ControlPath=$tmpDir/ssh-connection -o ControlPersist=60 \ + root@127.0.0.1 "$@" +} +export identityFile +export sshPort +export tmpDir +export -f c diff --git a/examples/qemu-vm/vm-config.nix b/examples/qemu-vm/vm-config.nix new file mode 100644 index 0000000..a1f8b70 --- /dev/null +++ b/examples/qemu-vm/vm-config.nix @@ -0,0 +1,7 @@ +{ + virtualisation.graphics = false; + services.mingetty.autologinUser = "root"; + users.users.root = { + openssh.authorizedKeys.keyFiles = [ ./id-vm.pub ]; + }; +}