vmRunCommand
pkgs.vmTools.vmRunCommand
Docs pulled from | This Revision | 29 minutes ago
Contribute
Enhance the ecosystem with your expertise! Contribute to fill the gaps in documentation. Your input can make a difference.
Noogle detected
Implementation
The following is the current implementation of this function.
qemuCommand:
writeText "vm-run" ''
${coreutils}/bin/mkdir xchg
export > xchg/saved-env
if [ -f "''${NIX_ATTRS_SH_FILE-}" ]; then
${coreutils}/bin/cp $NIX_ATTRS_JSON_FILE $NIX_ATTRS_SH_FILE xchg
source "$NIX_ATTRS_SH_FILE"
fi
source $stdenv/setup
eval "$preVM"
if [ "$enableParallelBuilding" = 1 ]; then
QEMU_NR_VCPUS=0
if [ ''${NIX_BUILD_CORES:-0} = 0 ]; then
QEMU_NR_VCPUS="$(nproc)"
else
QEMU_NR_VCPUS="$NIX_BUILD_CORES"
fi
# qemu only supports 255 vCPUs (see error from `qemu-system-x86_64 -smp 256`)
if [ "$QEMU_NR_VCPUS" -gt 255 ]; then
QEMU_NR_VCPUS=255
fi
QEMU_OPTS+=" -smp cpus=$QEMU_NR_VCPUS"
fi
# Write the command to start the VM to a file so that the user can
# debug inside the VM if the build fails (when Nix is called with
# the -K option to preserve the temporary build directory).
${coreutils}/bin/cat > ./run-vm <<EOF
#! ${bash}/bin/sh
''${diskImage:+diskImage=$diskImage}
# GitHub Actions runners seems to not allow installing seccomp filter: https://github.com/rcambrj/nix-pi-loader/issues/1#issuecomment-2605497516
# Since we are running in a sandbox already, the difference between seccomp and none is minimal
${virtiofsd}/bin/virtiofsd --xattr --socket-path virtio-store.sock --sandbox none --seccomp none --shared-dir "${storeDir}" &
${virtiofsd}/bin/virtiofsd --xattr --socket-path virtio-xchg.sock --sandbox none --seccomp none --shared-dir xchg &
# Wait until virtiofsd has created these sockets to avoid race condition.
until [[ -e virtio-store.sock ]]; do ${coreutils}/bin/sleep 0.1; done
until [[ -e virtio-xchg.sock ]]; do ${coreutils}/bin/sleep 0.1; done
${qemuCommand}
EOF
${coreutils}/bin/chmod +x ./run-vm
source ./run-vm
if ! test -e xchg/in-vm-exit; then
echo "Virtual machine didn't produce an exit code."
exit 1
fi
exitCode="$(${coreutils}/bin/cat xchg/in-vm-exit)"
if [ "$exitCode" != "0" ]; then
exit "$exitCode"
fi
eval "$postVM"
''