1166d4346SAndrea Bolognani# mach-virt - VirtIO guest (graphical console) 2166d4346SAndrea Bolognani# ========================================================= 3166d4346SAndrea Bolognani# 4166d4346SAndrea Bolognani# Usage: 5166d4346SAndrea Bolognani# 6166d4346SAndrea Bolognani# $ qemu-system-aarch64 \ 7166d4346SAndrea Bolognani# -nodefaults \ 8166d4346SAndrea Bolognani# -readconfig mach-virt-graphical.cfg \ 9166d4346SAndrea Bolognani# -cpu host 10166d4346SAndrea Bolognani# 11166d4346SAndrea Bolognani# You will probably need to tweak the lines marked as 12166d4346SAndrea Bolognani# CHANGE ME before being able to use this configuration! 13166d4346SAndrea Bolognani# 14166d4346SAndrea Bolognani# The guest will have a selection of VirtIO devices 15166d4346SAndrea Bolognani# tailored towards optimal performance with modern guests, 16166d4346SAndrea Bolognani# and will be accessed through a graphical console. 17166d4346SAndrea Bolognani# 18166d4346SAndrea Bolognani# --------------------------------------------------------- 19166d4346SAndrea Bolognani# 20166d4346SAndrea Bolognani# Using -nodefaults is required to have full control over 21166d4346SAndrea Bolognani# the virtual hardware: when it's specified, QEMU will 22166d4346SAndrea Bolognani# populate the board with only the builtin peripherals, 23166d4346SAndrea Bolognani# such as the PL011 UART, plus a PCI Express Root Bus; the 24166d4346SAndrea Bolognani# user will then have to explicitly add further devices. 25166d4346SAndrea Bolognani# 26166d4346SAndrea Bolognani# The PCI Express Root Bus shows up in the guest as: 27166d4346SAndrea Bolognani# 28166d4346SAndrea Bolognani# 00:00.0 Host bridge 29166d4346SAndrea Bolognani# 30166d4346SAndrea Bolognani# This configuration file adds a number of other useful 31166d4346SAndrea Bolognani# devices, more specifically: 32166d4346SAndrea Bolognani# 33166d4346SAndrea Bolognani# 00:01.0 Display controller 34166d4346SAndrea Bolognani# 00.1c.* PCI bridge (PCI Express Root Ports) 35166d4346SAndrea Bolognani# 01:00.0 SCSI storage controller 36166d4346SAndrea Bolognani# 02:00.0 Ethernet controller 37166d4346SAndrea Bolognani# 03:00.0 USB controller 38166d4346SAndrea Bolognani# 39166d4346SAndrea Bolognani# More information about these devices is available below. 40166d4346SAndrea Bolognani 41166d4346SAndrea Bolognani 42166d4346SAndrea Bolognani# Machine options 43166d4346SAndrea Bolognani# ========================================================= 44166d4346SAndrea Bolognani# 45166d4346SAndrea Bolognani# We use the virt machine type and enable KVM acceleration 46166d4346SAndrea Bolognani# for better performance. 47166d4346SAndrea Bolognani# 48166d4346SAndrea Bolognani# Using less than 1 GiB of memory is probably not going to 49166d4346SAndrea Bolognani# yield good performance in the guest, and might even lead 50166d4346SAndrea Bolognani# to obscure boot issues in some cases. 51166d4346SAndrea Bolognani# 52166d4346SAndrea Bolognani# Unfortunately, there is no way to configure the CPU model 53166d4346SAndrea Bolognani# in this file, so it will have to be provided on the 54166d4346SAndrea Bolognani# command line, but we can configure the guest to use the 55166d4346SAndrea Bolognani# same GIC version as the host. 56166d4346SAndrea Bolognani 57166d4346SAndrea Bolognani[machine] 58166d4346SAndrea Bolognani type = "virt" 59166d4346SAndrea Bolognani accel = "kvm" 60166d4346SAndrea Bolognani gic-version = "host" 61166d4346SAndrea Bolognani 62166d4346SAndrea Bolognani[memory] 63166d4346SAndrea Bolognani size = "1024" 64166d4346SAndrea Bolognani 65166d4346SAndrea Bolognani 66166d4346SAndrea Bolognani# Firmware configuration 67166d4346SAndrea Bolognani# ========================================================= 68166d4346SAndrea Bolognani# 69166d4346SAndrea Bolognani# There are two parts to the firmware: a read-only image 70166d4346SAndrea Bolognani# containing the executable code, which is shared between 71166d4346SAndrea Bolognani# guests, and a read/write variable store that is owned 72166d4346SAndrea Bolognani# by one specific guest, exclusively, and is used to 73166d4346SAndrea Bolognani# record information such as the UEFI boot order. 74166d4346SAndrea Bolognani# 75166d4346SAndrea Bolognani# For any new guest, its permanent, private variable store 76166d4346SAndrea Bolognani# should initially be copied from the template file 77166d4346SAndrea Bolognani# provided along with the firmware binary. 78166d4346SAndrea Bolognani# 79166d4346SAndrea Bolognani# Depending on the OS distribution you're using on the 80166d4346SAndrea Bolognani# host, the name of the package containing the firmware 81166d4346SAndrea Bolognani# binary and variable store template, as well as the paths 82166d4346SAndrea Bolognani# to the files themselves, will be different. For example: 83166d4346SAndrea Bolognani# 84166d4346SAndrea Bolognani# Fedora 85166d4346SAndrea Bolognani# edk2-aarch64 (pkg) 86166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw (bin) 87166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/vars-template-pflash.raw (var) 88166d4346SAndrea Bolognani# 89166d4346SAndrea Bolognani# RHEL 90166d4346SAndrea Bolognani# AAVMF (pkg) 91166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 92166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 93166d4346SAndrea Bolognani# 94166d4346SAndrea Bolognani# Debian/Ubuntu 95166d4346SAndrea Bolognani# qemu-efi (pkg) 96166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 97166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 98166d4346SAndrea Bolognani 99166d4346SAndrea Bolognani[drive "uefi-binary"] 100166d4346SAndrea Bolognani file = "/usr/share/AAVMF/AAVMF_CODE.fd" # CHANGE ME 101166d4346SAndrea Bolognani format = "raw" 102166d4346SAndrea Bolognani if = "pflash" 103166d4346SAndrea Bolognani unit = "0" 104166d4346SAndrea Bolognani readonly = "on" 105166d4346SAndrea Bolognani 106166d4346SAndrea Bolognani[drive "uefi-varstore"] 107166d4346SAndrea Bolognani file = "guest_VARS.fd" # CHANGE ME 108166d4346SAndrea Bolognani format = "raw" 109166d4346SAndrea Bolognani if = "pflash" 110166d4346SAndrea Bolognani unit = "1" 111166d4346SAndrea Bolognani 112166d4346SAndrea Bolognani 113166d4346SAndrea Bolognani# PCI bridge (PCI Express Root Ports) 114166d4346SAndrea Bolognani# ========================================================= 115166d4346SAndrea Bolognani# 116166d4346SAndrea Bolognani# We create eight PCI Express Root Ports, and we plug them 117166d4346SAndrea Bolognani# all into separate functions of the same slot. Some of 118166d4346SAndrea Bolognani# them will be used by devices, the rest will remain 119166d4346SAndrea Bolognani# available for hotplug. 120166d4346SAndrea Bolognani 121166d4346SAndrea Bolognani[device "pcie.1"] 122166d4346SAndrea Bolognani driver = "pcie-root-port" 123166d4346SAndrea Bolognani bus = "pcie.0" 124166d4346SAndrea Bolognani addr = "1c.0" 125166d4346SAndrea Bolognani port = "1" 126166d4346SAndrea Bolognani chassis = "1" 127166d4346SAndrea Bolognani multifunction = "on" 128166d4346SAndrea Bolognani 129166d4346SAndrea Bolognani[device "pcie.2"] 130166d4346SAndrea Bolognani driver = "pcie-root-port" 131166d4346SAndrea Bolognani bus = "pcie.0" 132166d4346SAndrea Bolognani addr = "1c.1" 133166d4346SAndrea Bolognani port = "2" 134166d4346SAndrea Bolognani chassis = "2" 135166d4346SAndrea Bolognani 136166d4346SAndrea Bolognani[device "pcie.3"] 137166d4346SAndrea Bolognani driver = "pcie-root-port" 138166d4346SAndrea Bolognani bus = "pcie.0" 139166d4346SAndrea Bolognani addr = "1c.2" 140166d4346SAndrea Bolognani port = "3" 141166d4346SAndrea Bolognani chassis = "3" 142166d4346SAndrea Bolognani 143166d4346SAndrea Bolognani[device "pcie.4"] 144166d4346SAndrea Bolognani driver = "pcie-root-port" 145166d4346SAndrea Bolognani bus = "pcie.0" 146166d4346SAndrea Bolognani addr = "1c.3" 147166d4346SAndrea Bolognani port = "4" 148166d4346SAndrea Bolognani chassis = "4" 149166d4346SAndrea Bolognani 150166d4346SAndrea Bolognani[device "pcie.5"] 151166d4346SAndrea Bolognani driver = "pcie-root-port" 152166d4346SAndrea Bolognani bus = "pcie.0" 153166d4346SAndrea Bolognani addr = "1c.4" 154166d4346SAndrea Bolognani port = "5" 155166d4346SAndrea Bolognani chassis = "5" 156166d4346SAndrea Bolognani 157166d4346SAndrea Bolognani[device "pcie.6"] 158166d4346SAndrea Bolognani driver = "pcie-root-port" 159166d4346SAndrea Bolognani bus = "pcie.0" 160166d4346SAndrea Bolognani addr = "1c.5" 161166d4346SAndrea Bolognani port = "6" 162166d4346SAndrea Bolognani chassis = "6" 163166d4346SAndrea Bolognani 164166d4346SAndrea Bolognani[device "pcie.7"] 165166d4346SAndrea Bolognani driver = "pcie-root-port" 166166d4346SAndrea Bolognani bus = "pcie.0" 167166d4346SAndrea Bolognani addr = "1c.6" 168166d4346SAndrea Bolognani port = "7" 169166d4346SAndrea Bolognani chassis = "7" 170166d4346SAndrea Bolognani 171166d4346SAndrea Bolognani[device "pcie.8"] 172166d4346SAndrea Bolognani driver = "pcie-root-port" 173166d4346SAndrea Bolognani bus = "pcie.0" 174166d4346SAndrea Bolognani addr = "1c.7" 175166d4346SAndrea Bolognani port = "8" 176166d4346SAndrea Bolognani chassis = "8" 177166d4346SAndrea Bolognani 178166d4346SAndrea Bolognani 179166d4346SAndrea Bolognani# SCSI storage controller (and storage) 180166d4346SAndrea Bolognani# ========================================================= 181166d4346SAndrea Bolognani# 182166d4346SAndrea Bolognani# We use virtio-scsi here so that we can (hot)plug a large 183166d4346SAndrea Bolognani# number of disks without running into issues; a SCSI disk, 184166d4346SAndrea Bolognani# backed by a qcow2 disk image on the host's filesystem, is 185166d4346SAndrea Bolognani# attached to it. 186166d4346SAndrea Bolognani# 187166d4346SAndrea Bolognani# We also create an optical disk, mostly for installation 188*9277d81fSVille Skyttä# purposes: once the guest OS has been successfully 189166d4346SAndrea Bolognani# installed, the guest will no longer boot from optical 190166d4346SAndrea Bolognani# media. If you don't want, or no longer want, to have an 191166d4346SAndrea Bolognani# optical disk in the guest you can safely comment out 192166d4346SAndrea Bolognani# all relevant sections below. 193166d4346SAndrea Bolognani 194166d4346SAndrea Bolognani[device "scsi"] 195166d4346SAndrea Bolognani driver = "virtio-scsi-pci" 196166d4346SAndrea Bolognani bus = "pcie.1" 197166d4346SAndrea Bolognani addr = "00.0" 198166d4346SAndrea Bolognani 199166d4346SAndrea Bolognani[device "scsi-disk"] 200166d4346SAndrea Bolognani driver = "scsi-hd" 201166d4346SAndrea Bolognani bus = "scsi.0" 202166d4346SAndrea Bolognani drive = "disk" 203166d4346SAndrea Bolognani bootindex = "1" 204166d4346SAndrea Bolognani 205166d4346SAndrea Bolognani[drive "disk"] 206166d4346SAndrea Bolognani file = "guest.qcow2" # CHANGE ME 207166d4346SAndrea Bolognani format = "qcow2" 208166d4346SAndrea Bolognani if = "none" 209166d4346SAndrea Bolognani 210166d4346SAndrea Bolognani[device "scsi-optical-disk"] 211166d4346SAndrea Bolognani driver = "scsi-cd" 212166d4346SAndrea Bolognani bus = "scsi.0" 213166d4346SAndrea Bolognani drive = "optical-disk" 214166d4346SAndrea Bolognani bootindex = "2" 215166d4346SAndrea Bolognani 216166d4346SAndrea Bolognani[drive "optical-disk"] 217166d4346SAndrea Bolognani file = "install.iso" # CHANGE ME 218166d4346SAndrea Bolognani format = "raw" 219166d4346SAndrea Bolognani if = "none" 220166d4346SAndrea Bolognani 221166d4346SAndrea Bolognani 222166d4346SAndrea Bolognani# Ethernet controller 223166d4346SAndrea Bolognani# ========================================================= 224166d4346SAndrea Bolognani# 225166d4346SAndrea Bolognani# We use virtio-net for improved performance over emulated 226166d4346SAndrea Bolognani# hardware; on the host side, we take advantage of user 227166d4346SAndrea Bolognani# networking so that the QEMU process doesn't require any 228166d4346SAndrea Bolognani# additional privileges. 229166d4346SAndrea Bolognani 230166d4346SAndrea Bolognani[netdev "hostnet"] 231166d4346SAndrea Bolognani type = "user" 232166d4346SAndrea Bolognani 233166d4346SAndrea Bolognani[device "net"] 234166d4346SAndrea Bolognani driver = "virtio-net-pci" 235166d4346SAndrea Bolognani netdev = "hostnet" 236166d4346SAndrea Bolognani bus = "pcie.2" 237166d4346SAndrea Bolognani addr = "00.0" 238166d4346SAndrea Bolognani 239166d4346SAndrea Bolognani 240166d4346SAndrea Bolognani# USB controller (and input devices) 241166d4346SAndrea Bolognani# ========================================================= 242166d4346SAndrea Bolognani# 243166d4346SAndrea Bolognani# We add a virtualization-friendly USB 3.0 controller and 244166d4346SAndrea Bolognani# a USB keyboard / USB tablet combo so that graphical 245166d4346SAndrea Bolognani# guests can be controlled appropriately. 246166d4346SAndrea Bolognani 247166d4346SAndrea Bolognani[device "usb"] 248166d4346SAndrea Bolognani driver = "nec-usb-xhci" 249166d4346SAndrea Bolognani bus = "pcie.3" 250166d4346SAndrea Bolognani addr = "00.0" 251166d4346SAndrea Bolognani 252166d4346SAndrea Bolognani[device "keyboard"] 253166d4346SAndrea Bolognani driver = "usb-kbd" 254166d4346SAndrea Bolognani bus = "usb.0" 255166d4346SAndrea Bolognani 256166d4346SAndrea Bolognani[device "tablet"] 257166d4346SAndrea Bolognani driver = "usb-tablet" 258166d4346SAndrea Bolognani bus = "usb.0" 259166d4346SAndrea Bolognani 260166d4346SAndrea Bolognani 261166d4346SAndrea Bolognani# Display controller 262166d4346SAndrea Bolognani# ========================================================= 263166d4346SAndrea Bolognani# 264166d4346SAndrea Bolognani# We use virtio-gpu because the legacy VGA framebuffer is 265166d4346SAndrea Bolognani# very troublesome on aarch64, and virtio-gpu is the only 266166d4346SAndrea Bolognani# video device that doesn't implement it. 267166d4346SAndrea Bolognani# 268166d4346SAndrea Bolognani# If you're running the guest on a remote, potentially 269166d4346SAndrea Bolognani# headless host, you will probably want to append something 270166d4346SAndrea Bolognani# like 271166d4346SAndrea Bolognani# 272166d4346SAndrea Bolognani# -display vnc=127.0.0.1:0 273166d4346SAndrea Bolognani# 274166d4346SAndrea Bolognani# to the command line in order to prevent QEMU from 275166d4346SAndrea Bolognani# creating a graphical display window on the host and 276166d4346SAndrea Bolognani# enable remote access instead. 277166d4346SAndrea Bolognani 278166d4346SAndrea Bolognani[device "video"] 279166d4346SAndrea Bolognani driver = "virtio-gpu" 280166d4346SAndrea Bolognani bus = "pcie.0" 281166d4346SAndrea Bolognani addr = "01.0" 282