examples: extract common features for running QEMU VMs

Needed by commit: "examples: add deploy-krops.sh"
This commit is contained in:
Erik Arvstedt 2021-03-08 15:11:15 +01:00 committed by Jonas Nick
parent cb3d5446c8
commit ccba86a0f0
No known key found for this signature in database
GPG Key ID: 4861DBF262123605
3 changed files with 62 additions and 41 deletions

View File

@ -17,61 +17,27 @@ if [[ ! -v IN_NIX_SHELL ]]; then
exec nix-shell --run "./${BASH_SOURCE[0]##*/} $*" exec nix-shell --run "./${BASH_SOURCE[0]##*/} $*"
fi fi
cd "${BASH_SOURCE[0]%/*}" source qemu-vm/run-vm.sh
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
echo "Building VM" echo "Building VM"
nix-build --out-link $tmpDir/vm - <<EOF nix-build --out-link $tmpDir/vm - <<'EOF'
(import <nixpkgs/nixos> { (import <nixpkgs/nixos> {
configuration = { configuration = {
imports = [ imports = [
<configuration.nix> <configuration.nix>
<qemu-vm/vm-config.nix>
<nix-bitcoin/modules/secrets/generate-secrets.nix> <nix-bitcoin/modules/secrets/generate-secrets.nix>
]; ];
virtualisation.graphics = false;
services.mingetty.autologinUser = "root";
users.users.root = {
openssh.authorizedKeys.keys = [ "$(cat $identityFile.pub)" ];
};
}; };
}).vm }).vm
EOF EOF
vmMemoryMiB=2048
vmNumCPUs=4 vmNumCPUs=4
vmMemoryMiB=2048
sshPort=60734 sshPort=60734
runVM $tmpDir/vm $vmNumCPUs $vmMemoryMiB $sshPort
export NIX_DISK_IMAGE=$tmpDir/img vmWaitForSSH
export QEMU_NET_OPTS=hostfwd=tcp::$sshPort-:22
</dev/null $tmpDir/vm/bin/run-*-vm -m $vmMemoryMiB -smp $vmNumCPUs &>/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
echo "Waiting until services are ready..." echo "Waiting until services are ready..."
c ' c '
attempts=300 attempts=300
@ -99,4 +65,4 @@ case ${1:-} in
;; ;;
esac esac
# Cleanup happens at exit (see above) # Cleanup happens at exit (defined in qemu-vm/run-vm.sh)

View File

@ -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 $vm/bin/run-*-vm -m $vmMemoryMiB -smp $vmNumCPUs &>/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

View File

@ -0,0 +1,7 @@
{
virtualisation.graphics = false;
services.mingetty.autologinUser = "root";
users.users.root = {
openssh.authorizedKeys.keyFiles = [ ./id-vm.pub ];
};
}