runInLinuxVM: Use QEMU command line that works on other architectures

... by moving the existing definition to qemu-flags.nix and reusing
that.

Changed files
+8 -11
nixos
lib
modules
virtualisation
pkgs
build-support
+6
nixos/lib/qemu-flags.nix
···
else if pkgs.stdenv.isArm || pkgs.stdenv.isAarch64 then "ttyAMA0"
else throw "Unknown QEMU serial device for system '${pkgs.stdenv.system}'";
+
qemuBinary = qemuPkg: {
+
"i686-linux" = "${qemuPkg}/bin/qemu-kvm";
+
"x86_64-linux" = "${qemuPkg}/bin/qemu-kvm -cpu kvm64";
+
"armv7l-linux" = "${qemuPkg}/bin/qemu-system-arm -enable-kvm -machine virt -cpu host";
+
"aarch64-linux" = "${qemuPkg}/bin/qemu-system-aarch64 -enable-kvm -machine virt,gic-version=host -cpu host";
+
}.${pkgs.stdenv.system} or (throw "Unknown QEMU binary for '${pkgs.stdenv.system}'");
}
+1 -7
nixos/modules/virtualisation/qemu-vm.nix
···
let
qemu = config.system.build.qemu or pkgs.qemu_test;
-
qemuKvm = {
-
"i686-linux" = "${qemu}/bin/qemu-kvm";
-
"x86_64-linux" = "${qemu}/bin/qemu-kvm -cpu kvm64";
-
"armv7l-linux" = "${qemu}/bin/qemu-system-arm -enable-kvm -machine virt -cpu host";
-
"aarch64-linux" = "${qemu}/bin/qemu-system-aarch64 -enable-kvm -machine virt,gic-version=host -cpu host";
-
}.${pkgs.stdenv.system};
vmName =
if config.networking.hostName == ""
···
'')}
# Start QEMU.
-
exec ${qemuKvm} \
+
exec ${qemuBinary qemu} \
-name ${vmName} \
-m ${toString config.virtualisation.memorySize} \
-smp ${toString config.virtualisation.cores} \
+1 -4
pkgs/build-support/vm/default.nix
···
patches = [ ../../../nixos/modules/virtualisation/azure-qemu-220-no-etc-install.patch ];
});
-
qemuProg = "${qemu}/bin/qemu-kvm";
-
modulesClosure = makeModulesClosure {
inherit kernel rootModules;
···
qemuCommandLinux = ''
-
${qemuProg} \
-
${lib.optionalString (pkgs.stdenv.system == "x86_64-linux") "-cpu kvm64"} \
+
${qemuBinary qemu} \
-nographic -no-reboot \
-device virtio-rng-pci \
-virtfs local,path=${storeDir},security_model=none,mount_tag=store \