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 gic-version = "host" 60166d4346SAndrea Bolognani 61*4477035eSThomas Huth[accel] 62*4477035eSThomas Huth accel = "kvm" 63*4477035eSThomas Huth 64166d4346SAndrea Bolognani[memory] 65166d4346SAndrea Bolognani size = "1024" 66166d4346SAndrea Bolognani 67166d4346SAndrea Bolognani 68166d4346SAndrea Bolognani# Firmware configuration 69166d4346SAndrea Bolognani# ========================================================= 70166d4346SAndrea Bolognani# 71166d4346SAndrea Bolognani# There are two parts to the firmware: a read-only image 72166d4346SAndrea Bolognani# containing the executable code, which is shared between 73166d4346SAndrea Bolognani# guests, and a read/write variable store that is owned 74166d4346SAndrea Bolognani# by one specific guest, exclusively, and is used to 75166d4346SAndrea Bolognani# record information such as the UEFI boot order. 76166d4346SAndrea Bolognani# 77166d4346SAndrea Bolognani# For any new guest, its permanent, private variable store 78166d4346SAndrea Bolognani# should initially be copied from the template file 79166d4346SAndrea Bolognani# provided along with the firmware binary. 80166d4346SAndrea Bolognani# 81166d4346SAndrea Bolognani# Depending on the OS distribution you're using on the 82166d4346SAndrea Bolognani# host, the name of the package containing the firmware 83166d4346SAndrea Bolognani# binary and variable store template, as well as the paths 84166d4346SAndrea Bolognani# to the files themselves, will be different. For example: 85166d4346SAndrea Bolognani# 86166d4346SAndrea Bolognani# Fedora 87166d4346SAndrea Bolognani# edk2-aarch64 (pkg) 88166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw (bin) 89166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/vars-template-pflash.raw (var) 90166d4346SAndrea Bolognani# 91166d4346SAndrea Bolognani# RHEL 92166d4346SAndrea Bolognani# AAVMF (pkg) 93166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 94166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 95166d4346SAndrea Bolognani# 96166d4346SAndrea Bolognani# Debian/Ubuntu 97166d4346SAndrea Bolognani# qemu-efi (pkg) 98166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 99166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 100166d4346SAndrea Bolognani 101166d4346SAndrea Bolognani[drive "uefi-binary"] 102166d4346SAndrea Bolognani file = "/usr/share/AAVMF/AAVMF_CODE.fd" # CHANGE ME 103166d4346SAndrea Bolognani format = "raw" 104166d4346SAndrea Bolognani if = "pflash" 105166d4346SAndrea Bolognani unit = "0" 106166d4346SAndrea Bolognani readonly = "on" 107166d4346SAndrea Bolognani 108166d4346SAndrea Bolognani[drive "uefi-varstore"] 109166d4346SAndrea Bolognani file = "guest_VARS.fd" # CHANGE ME 110166d4346SAndrea Bolognani format = "raw" 111166d4346SAndrea Bolognani if = "pflash" 112166d4346SAndrea Bolognani unit = "1" 113166d4346SAndrea Bolognani 114166d4346SAndrea Bolognani 115166d4346SAndrea Bolognani# PCI bridge (PCI Express Root Ports) 116166d4346SAndrea Bolognani# ========================================================= 117166d4346SAndrea Bolognani# 118166d4346SAndrea Bolognani# We create eight PCI Express Root Ports, and we plug them 119166d4346SAndrea Bolognani# all into separate functions of the same slot. Some of 120166d4346SAndrea Bolognani# them will be used by devices, the rest will remain 121166d4346SAndrea Bolognani# available for hotplug. 122166d4346SAndrea Bolognani 123166d4346SAndrea Bolognani[device "pcie.1"] 124166d4346SAndrea Bolognani driver = "pcie-root-port" 125166d4346SAndrea Bolognani bus = "pcie.0" 126166d4346SAndrea Bolognani addr = "1c.0" 127166d4346SAndrea Bolognani port = "1" 128166d4346SAndrea Bolognani chassis = "1" 129166d4346SAndrea Bolognani multifunction = "on" 130166d4346SAndrea Bolognani 131166d4346SAndrea Bolognani[device "pcie.2"] 132166d4346SAndrea Bolognani driver = "pcie-root-port" 133166d4346SAndrea Bolognani bus = "pcie.0" 134166d4346SAndrea Bolognani addr = "1c.1" 135166d4346SAndrea Bolognani port = "2" 136166d4346SAndrea Bolognani chassis = "2" 137166d4346SAndrea Bolognani 138166d4346SAndrea Bolognani[device "pcie.3"] 139166d4346SAndrea Bolognani driver = "pcie-root-port" 140166d4346SAndrea Bolognani bus = "pcie.0" 141166d4346SAndrea Bolognani addr = "1c.2" 142166d4346SAndrea Bolognani port = "3" 143166d4346SAndrea Bolognani chassis = "3" 144166d4346SAndrea Bolognani 145166d4346SAndrea Bolognani[device "pcie.4"] 146166d4346SAndrea Bolognani driver = "pcie-root-port" 147166d4346SAndrea Bolognani bus = "pcie.0" 148166d4346SAndrea Bolognani addr = "1c.3" 149166d4346SAndrea Bolognani port = "4" 150166d4346SAndrea Bolognani chassis = "4" 151166d4346SAndrea Bolognani 152166d4346SAndrea Bolognani[device "pcie.5"] 153166d4346SAndrea Bolognani driver = "pcie-root-port" 154166d4346SAndrea Bolognani bus = "pcie.0" 155166d4346SAndrea Bolognani addr = "1c.4" 156166d4346SAndrea Bolognani port = "5" 157166d4346SAndrea Bolognani chassis = "5" 158166d4346SAndrea Bolognani 159166d4346SAndrea Bolognani[device "pcie.6"] 160166d4346SAndrea Bolognani driver = "pcie-root-port" 161166d4346SAndrea Bolognani bus = "pcie.0" 162166d4346SAndrea Bolognani addr = "1c.5" 163166d4346SAndrea Bolognani port = "6" 164166d4346SAndrea Bolognani chassis = "6" 165166d4346SAndrea Bolognani 166166d4346SAndrea Bolognani[device "pcie.7"] 167166d4346SAndrea Bolognani driver = "pcie-root-port" 168166d4346SAndrea Bolognani bus = "pcie.0" 169166d4346SAndrea Bolognani addr = "1c.6" 170166d4346SAndrea Bolognani port = "7" 171166d4346SAndrea Bolognani chassis = "7" 172166d4346SAndrea Bolognani 173166d4346SAndrea Bolognani[device "pcie.8"] 174166d4346SAndrea Bolognani driver = "pcie-root-port" 175166d4346SAndrea Bolognani bus = "pcie.0" 176166d4346SAndrea Bolognani addr = "1c.7" 177166d4346SAndrea Bolognani port = "8" 178166d4346SAndrea Bolognani chassis = "8" 179166d4346SAndrea Bolognani 180166d4346SAndrea Bolognani 181166d4346SAndrea Bolognani# SCSI storage controller (and storage) 182166d4346SAndrea Bolognani# ========================================================= 183166d4346SAndrea Bolognani# 184166d4346SAndrea Bolognani# We use virtio-scsi here so that we can (hot)plug a large 185166d4346SAndrea Bolognani# number of disks without running into issues; a SCSI disk, 186166d4346SAndrea Bolognani# backed by a qcow2 disk image on the host's filesystem, is 187166d4346SAndrea Bolognani# attached to it. 188166d4346SAndrea Bolognani# 189166d4346SAndrea Bolognani# We also create an optical disk, mostly for installation 1909277d81fSVille Skyttä# purposes: once the guest OS has been successfully 191166d4346SAndrea Bolognani# installed, the guest will no longer boot from optical 192166d4346SAndrea Bolognani# media. If you don't want, or no longer want, to have an 193166d4346SAndrea Bolognani# optical disk in the guest you can safely comment out 194166d4346SAndrea Bolognani# all relevant sections below. 195166d4346SAndrea Bolognani 196166d4346SAndrea Bolognani[device "scsi"] 197166d4346SAndrea Bolognani driver = "virtio-scsi-pci" 198166d4346SAndrea Bolognani bus = "pcie.1" 199166d4346SAndrea Bolognani addr = "00.0" 200166d4346SAndrea Bolognani 201166d4346SAndrea Bolognani[device "scsi-disk"] 202166d4346SAndrea Bolognani driver = "scsi-hd" 203166d4346SAndrea Bolognani bus = "scsi.0" 204166d4346SAndrea Bolognani drive = "disk" 205166d4346SAndrea Bolognani bootindex = "1" 206166d4346SAndrea Bolognani 207166d4346SAndrea Bolognani[drive "disk"] 208166d4346SAndrea Bolognani file = "guest.qcow2" # CHANGE ME 209166d4346SAndrea Bolognani format = "qcow2" 210166d4346SAndrea Bolognani if = "none" 211166d4346SAndrea Bolognani 212166d4346SAndrea Bolognani[device "scsi-optical-disk"] 213166d4346SAndrea Bolognani driver = "scsi-cd" 214166d4346SAndrea Bolognani bus = "scsi.0" 215166d4346SAndrea Bolognani drive = "optical-disk" 216166d4346SAndrea Bolognani bootindex = "2" 217166d4346SAndrea Bolognani 218166d4346SAndrea Bolognani[drive "optical-disk"] 219166d4346SAndrea Bolognani file = "install.iso" # CHANGE ME 220166d4346SAndrea Bolognani format = "raw" 221166d4346SAndrea Bolognani if = "none" 222166d4346SAndrea Bolognani 223166d4346SAndrea Bolognani 224166d4346SAndrea Bolognani# Ethernet controller 225166d4346SAndrea Bolognani# ========================================================= 226166d4346SAndrea Bolognani# 227166d4346SAndrea Bolognani# We use virtio-net for improved performance over emulated 228166d4346SAndrea Bolognani# hardware; on the host side, we take advantage of user 229166d4346SAndrea Bolognani# networking so that the QEMU process doesn't require any 230166d4346SAndrea Bolognani# additional privileges. 231166d4346SAndrea Bolognani 232166d4346SAndrea Bolognani[netdev "hostnet"] 233166d4346SAndrea Bolognani type = "user" 234166d4346SAndrea Bolognani 235166d4346SAndrea Bolognani[device "net"] 236166d4346SAndrea Bolognani driver = "virtio-net-pci" 237166d4346SAndrea Bolognani netdev = "hostnet" 238166d4346SAndrea Bolognani bus = "pcie.2" 239166d4346SAndrea Bolognani addr = "00.0" 240166d4346SAndrea Bolognani 241166d4346SAndrea Bolognani 242166d4346SAndrea Bolognani# USB controller (and input devices) 243166d4346SAndrea Bolognani# ========================================================= 244166d4346SAndrea Bolognani# 245166d4346SAndrea Bolognani# We add a virtualization-friendly USB 3.0 controller and 246166d4346SAndrea Bolognani# a USB keyboard / USB tablet combo so that graphical 247166d4346SAndrea Bolognani# guests can be controlled appropriately. 248166d4346SAndrea Bolognani 249166d4346SAndrea Bolognani[device "usb"] 250166d4346SAndrea Bolognani driver = "nec-usb-xhci" 251166d4346SAndrea Bolognani bus = "pcie.3" 252166d4346SAndrea Bolognani addr = "00.0" 253166d4346SAndrea Bolognani 254166d4346SAndrea Bolognani[device "keyboard"] 255166d4346SAndrea Bolognani driver = "usb-kbd" 256166d4346SAndrea Bolognani bus = "usb.0" 257166d4346SAndrea Bolognani 258166d4346SAndrea Bolognani[device "tablet"] 259166d4346SAndrea Bolognani driver = "usb-tablet" 260166d4346SAndrea Bolognani bus = "usb.0" 261166d4346SAndrea Bolognani 262166d4346SAndrea Bolognani 263166d4346SAndrea Bolognani# Display controller 264166d4346SAndrea Bolognani# ========================================================= 265166d4346SAndrea Bolognani# 266166d4346SAndrea Bolognani# We use virtio-gpu because the legacy VGA framebuffer is 267166d4346SAndrea Bolognani# very troublesome on aarch64, and virtio-gpu is the only 268166d4346SAndrea Bolognani# video device that doesn't implement it. 269166d4346SAndrea Bolognani# 270166d4346SAndrea Bolognani# If you're running the guest on a remote, potentially 271166d4346SAndrea Bolognani# headless host, you will probably want to append something 272166d4346SAndrea Bolognani# like 273166d4346SAndrea Bolognani# 274166d4346SAndrea Bolognani# -display vnc=127.0.0.1:0 275166d4346SAndrea Bolognani# 276166d4346SAndrea Bolognani# to the command line in order to prevent QEMU from 277166d4346SAndrea Bolognani# creating a graphical display window on the host and 278166d4346SAndrea Bolognani# enable remote access instead. 279166d4346SAndrea Bolognani 280166d4346SAndrea Bolognani[device "video"] 281166d4346SAndrea Bolognani driver = "virtio-gpu" 282166d4346SAndrea Bolognani bus = "pcie.0" 283166d4346SAndrea Bolognani addr = "01.0" 284