QEMU: Difference between revisions
Emulate different architectures |
→Emulate different architecture: Adjusted the build to not rely on reaily set up binfmt/remote builders anymore. Fixed some other problems I had during experiments. Still I was unable to actually see the started VM in virt-man or similar or connect to it, additional info needed! |
||
| (7 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
[https://www.qemu.org/ QEMU] is a generic and open source machine emulator and virtualizer. | [https://www.qemu.org/ QEMU] is a generic and open source machine emulator and virtualizer. | ||
For running virtual machines as a services see [[Libvirt]]. | |||
== 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 22: | Line 25: | ||
== Configuration == | == Configuration == | ||
=== | === UEFI firmware support === | ||
To | To enable UEFI firmware support in Virt-Manager, Libvirt, Gnome-Boxes etc. add following snippet to your system configuration and apply it<syntaxhighlight lang="nix"> | ||
systemd.tmpfiles.rules = [ "L+ /var/lib/qemu/firmware - - - - ${pkgs.qemu}/share/qemu/firmware" ]; | |||
</syntaxhighlight> | |||
=== 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"> | |||
<syntaxhighlight lang=nix> | boot.binfmt.emulatedSystems = [ | ||
"aarch64-linux" | |||
"riscv64-linux" | |||
]; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Tips and tricks == | == Tips and tricks == | ||
| Line 56: | Line 53: | ||
outputs = { self, nixpkgs }: | outputs = { self, nixpkgs }: | ||
let | let | ||
# Put your actual system of your machine here. In VM terms it is the "HOST" | |||
buildPlatform = "x86_64-linux"; | |||
# Put the system you want to emulate here. In VM terms it is the "GUEST" | |||
hostPlatform = "aarch64-linux"; | |||
pkgs = import nixpkgs { system = buildPlatform; }; | |||
vmConfig = (pkgs.nixos { | |||
imports = [ "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-base.nix" ]; | imports = [ "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-base.nix" ]; | ||
}).config.system.build.isoImage; | nixpkgs = { inherit buildPlatform hostPlatform; }; | ||
}); | |||
vmIso = vmConfig.config.system.build.isoImage; | |||
vmPkgs = vmConfig.pkgs; | |||
vmScript = pkgs. | vmScript = pkgs.writeShellScriptBin "run-nixos-vm" '' | ||
${pkgs.qemu}/bin/qemu-system-aarch64 \ | ${pkgs.qemu}/bin/qemu-system-aarch64 \ | ||
-machine virt,gic-version=max \ | -machine virt,gic-version=max \ | ||
| Line 70: | Line 74: | ||
-m 2G \ | -m 2G \ | ||
-smp 4 \ | -smp 4 \ | ||
-drive file=$(echo ${ | -drive file=$(echo ${vmIso}/iso/*.iso),format=raw,readonly=on \ | ||
-nographic \ | -nographic \ | ||
-bios ${ | -bios ${vmPkgs.OVMF.fd}/FV/OVMF.fd | ||
''; | ''; | ||
in { | in { | ||
packages.x86_64-linux.default = vmScript; | |||
}; | }; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Alternatively a different iso file can be specified in the drive-parameter, for example for Ubuntu Server ARM64. | |||
Make sure to adjust the 2 toplevel variables to set up the cross compilation correctly. If your target is not AARCH64, you have to use the correct qemu binay in the start script. | |||
[[Category:Virtualization]] | [[Category:Virtualization]] | ||