QEMU: Difference between revisions
Emulate different architectures |
→Setup: : Cleanup odd wording and add the Evaluate template. |
||
(2 intermediate revisions by one other user not shown) | |||
Line 2: | Line 2: | ||
== Setup == | == Setup == | ||
To install the main QEMU program system-wide, add the following to your <code>configuration.nix</code>:<syntaxhighlight lang=nix> | |||
<syntaxhighlight lang=nix> | |||
environment = { | environment = { | ||
systemPackages = [ pkgs.qemu ]; | systemPackages = [ pkgs.qemu ]; | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Evaluate}} | |||
=== Quick EMU === | === Quick EMU === | ||
Line 40: | Line 41: | ||
qcow-efi images generated from [https://github.com/nix-community/nixos-generators nixos-generators] require more RAM than the default 128MB. Failing to provide enough RAM results in grub reporting "error: start_image() returned 0x800000000000009." or systemd-boot reporting "Failed to execute NixOS: Out of resources". | qcow-efi images generated from [https://github.com/nix-community/nixos-generators nixos-generators] require more RAM than the default 128MB. Failing to provide enough RAM results in grub reporting "error: start_image() returned 0x800000000000009." or systemd-boot reporting "Failed to execute NixOS: Out of resources". | ||
=== Run binaries of different architecture === | |||
Following configuration will enable the emulation of different architectures. For example to run aarch64 and riscv64 binaries on an native x86_64 host, add following part to your system configuration, apply it and reboot your system.<syntaxhighlight lang="nix"> | |||
boot.binfmt.emulatedSystems = [ | |||
"aarch64-linux" | |||
"riscv64-linux" | |||
]; | |||
</syntaxhighlight> | |||
== Tips and tricks == | == Tips and tricks == | ||
Line 80: | Line 89: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>Alternatively a different iso file can be specified in the drive-parameter, for example for Ubuntu Server ARM64. | ||
[[Category:Virtualization]] | [[Category:Virtualization]] |
Latest revision as of 19:59, 27 October 2024
QEMU is a generic and open source machine emulator and virtualizer.
Setup
To install the main QEMU program system-wide, add the following to your configuration.nix
:
environment = {
systemPackages = [ pkgs.qemu ];
};
Quick EMU
Quickly create and run highly optimised desktop virtual machines for Linux, macOS and Windows; with just two commands.
https://github.com/quickemu-project/quickemu
quickget windows 11
quickemu --vm windows-11.conf
Configuration
Booting UEFI
To boot UEFI systems using QEMU, the UEFI firmware replacing the BIOS implementation needs to be provided while starting QEMU.
The following installs a script, that always starts QEMU with OVMF firmware implementing UEFI support.
environment = {
systemPackages = [
(pkgs.writeShellScriptBin "qemu-system-x86_64-uefi" ''
qemu-system-x86_64 \
-bios ${pkgs.OVMF.fd}/FV/OVMF.fd \
"$@"
'')
];
};
qcow-efi images generated from nixos-generators require more RAM than the default 128MB. Failing to provide enough RAM results in grub reporting "error: start_image() returned 0x800000000000009." or systemd-boot reporting "Failed to execute NixOS: Out of resources".
Run binaries of different architecture
Following configuration will enable the emulation of different architectures. For example to run aarch64 and riscv64 binaries on an native x86_64 host, add following part to your system configuration, apply it and reboot your system.
boot.binfmt.emulatedSystems = [
"aarch64-linux"
"riscv64-linux"
];
Tips and tricks
Emulate different architecture
The following Flake file constructs and executes a NixOS virtual machine with an architecture distinct from that of the host system; in this example, it utilizes aarch64.
Save the snippet as flake.nix
and run nix run
in the same directory to bootup the VM.
{
description = "Nix flake to build and run a NixOS VM for aarch64";
inputs = {
nixpkgs.url = "nixpkgs/nixos-24.05";
};
outputs = { self, nixpkgs }:
let
pkgs = import nixpkgs { system = "x86_64-linux"; };
pkgsAarch64 = import nixpkgs { system = "aarch64-linux"; };
iso = (pkgsAarch64.nixos {
imports = [ "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-base.nix" ];
}).config.system.build.isoImage;
vmScript = pkgs.writeScriptBin "run-nixos-vm" ''
#!${pkgs.runtimeShell}
${pkgs.qemu}/bin/qemu-system-aarch64 \
-machine virt,gic-version=max \
-cpu max \
-m 2G \
-smp 4 \
-drive file=$(echo ${iso}/iso/*.iso),format=raw,readonly=on \
-nographic \
-bios ${pkgsAarch64.OVMF.fd}/FV/QEMU_EFI.fd
'';
in {
defaultPackage.x86_64-linux = vmScript;
};
}
Alternatively a different iso file can be specified in the drive-parameter, for example for Ubuntu Server ARM64.