1*ac06724aSPaolo Bonzini# mach-virt - VirtIO guest (serial console) 2*ac06724aSPaolo Bonzini# ========================================================= 3*ac06724aSPaolo Bonzini# 4*ac06724aSPaolo Bonzini# Usage: 5*ac06724aSPaolo Bonzini# 6*ac06724aSPaolo Bonzini# $ qemu-system-aarch64 \ 7*ac06724aSPaolo Bonzini# -nodefaults \ 8*ac06724aSPaolo Bonzini# -readconfig mach-virt-serial.cfg \ 9*ac06724aSPaolo Bonzini# -display none -serial mon:stdio \ 10*ac06724aSPaolo Bonzini# -cpu host 11*ac06724aSPaolo Bonzini# 12*ac06724aSPaolo Bonzini# You will probably need to tweak the lines marked as 13*ac06724aSPaolo Bonzini# CHANGE ME before being able to use this configuration! 14*ac06724aSPaolo Bonzini# 15*ac06724aSPaolo Bonzini# The guest will have a selection of VirtIO devices 16*ac06724aSPaolo Bonzini# tailored towards optimal performance with modern guests, 17*ac06724aSPaolo Bonzini# and will be accessed through the serial console. 18*ac06724aSPaolo Bonzini# 19*ac06724aSPaolo Bonzini# --------------------------------------------------------- 20*ac06724aSPaolo Bonzini# 21*ac06724aSPaolo Bonzini# Using -nodefaults is required to have full control over 22*ac06724aSPaolo Bonzini# the virtual hardware: when it's specified, QEMU will 23*ac06724aSPaolo Bonzini# populate the board with only the builtin peripherals, 24*ac06724aSPaolo Bonzini# such as the PL011 UART, plus a PCI Express Root Bus; the 25*ac06724aSPaolo Bonzini# user will then have to explicitly add further devices. 26*ac06724aSPaolo Bonzini# 27*ac06724aSPaolo Bonzini# The PCI Express Root Bus shows up in the guest as: 28*ac06724aSPaolo Bonzini# 29*ac06724aSPaolo Bonzini# 00:00.0 Host bridge 30*ac06724aSPaolo Bonzini# 31*ac06724aSPaolo Bonzini# This configuration file adds a number of other useful 32*ac06724aSPaolo Bonzini# devices, more specifically: 33*ac06724aSPaolo Bonzini# 34*ac06724aSPaolo Bonzini# 00.1c.* PCI bridge (PCI Express Root Ports) 35*ac06724aSPaolo Bonzini# 01:00.0 SCSI storage controller 36*ac06724aSPaolo Bonzini# 02:00.0 Ethernet controller 37*ac06724aSPaolo Bonzini# 38*ac06724aSPaolo Bonzini# More information about these devices is available below. 39*ac06724aSPaolo Bonzini# 40*ac06724aSPaolo Bonzini# We use '-display none' to prevent QEMU from creating a 41*ac06724aSPaolo Bonzini# graphical display window, which would serve no use in 42*ac06724aSPaolo Bonzini# this specific configuration, and '-serial mon:stdio' to 43*ac06724aSPaolo Bonzini# multiplex the guest's serial console and the QEMU monitor 44*ac06724aSPaolo Bonzini# to the host's stdio; use 'Ctrl+A h' to learn how to 45*ac06724aSPaolo Bonzini# switch between the two and more. 46*ac06724aSPaolo Bonzini 47*ac06724aSPaolo Bonzini 48*ac06724aSPaolo Bonzini# Machine options 49*ac06724aSPaolo Bonzini# ========================================================= 50*ac06724aSPaolo Bonzini# 51*ac06724aSPaolo Bonzini# We use the virt machine type and enable KVM acceleration 52*ac06724aSPaolo Bonzini# for better performance. 53*ac06724aSPaolo Bonzini# 54*ac06724aSPaolo Bonzini# Using less than 1 GiB of memory is probably not going to 55*ac06724aSPaolo Bonzini# yield good performance in the guest, and might even lead 56*ac06724aSPaolo Bonzini# to obscure boot issues in some cases. 57*ac06724aSPaolo Bonzini# 58*ac06724aSPaolo Bonzini# Unfortunately, there is no way to configure the CPU model 59*ac06724aSPaolo Bonzini# in this file, so it will have to be provided on the 60*ac06724aSPaolo Bonzini# command line, but we can configure the guest to use the 61*ac06724aSPaolo Bonzini# same GIC version as the host. 62*ac06724aSPaolo Bonzini 63*ac06724aSPaolo Bonzini[machine] 64*ac06724aSPaolo Bonzini type = "virt" 65*ac06724aSPaolo Bonzini accel = "kvm" 66*ac06724aSPaolo Bonzini gic-version = "host" 67*ac06724aSPaolo Bonzini 68*ac06724aSPaolo Bonzini[memory] 69*ac06724aSPaolo Bonzini size = "1024" 70*ac06724aSPaolo Bonzini 71*ac06724aSPaolo Bonzini 72*ac06724aSPaolo Bonzini# Firmware configuration 73*ac06724aSPaolo Bonzini# ========================================================= 74*ac06724aSPaolo Bonzini# 75*ac06724aSPaolo Bonzini# There are two parts to the firmware: a read-only image 76*ac06724aSPaolo Bonzini# containing the executable code, which is shared between 77*ac06724aSPaolo Bonzini# guests, and a read/write variable store that is owned 78*ac06724aSPaolo Bonzini# by one specific guest, exclusively, and is used to 79*ac06724aSPaolo Bonzini# record information such as the UEFI boot order. 80*ac06724aSPaolo Bonzini# 81*ac06724aSPaolo Bonzini# For any new guest, its permanent, private variable store 82*ac06724aSPaolo Bonzini# should initially be copied from the template file 83*ac06724aSPaolo Bonzini# provided along with the firmware binary. 84*ac06724aSPaolo Bonzini# 85*ac06724aSPaolo Bonzini# Depending on the OS distribution you're using on the 86*ac06724aSPaolo Bonzini# host, the name of the package containing the firmware 87*ac06724aSPaolo Bonzini# binary and variable store template, as well as the paths 88*ac06724aSPaolo Bonzini# to the files themselves, will be different. For example: 89*ac06724aSPaolo Bonzini# 90*ac06724aSPaolo Bonzini# Fedora 91*ac06724aSPaolo Bonzini# edk2-aarch64 (pkg) 92*ac06724aSPaolo Bonzini# /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw (bin) 93*ac06724aSPaolo Bonzini# /usr/share/edk2/aarch64/vars-template-pflash.raw (var) 94*ac06724aSPaolo Bonzini# 95*ac06724aSPaolo Bonzini# RHEL 96*ac06724aSPaolo Bonzini# AAVMF (pkg) 97*ac06724aSPaolo Bonzini# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 98*ac06724aSPaolo Bonzini# /usr/share/AAVMF/AAVMF_VARS.fd (var) 99*ac06724aSPaolo Bonzini# 100*ac06724aSPaolo Bonzini# Debian/Ubuntu 101*ac06724aSPaolo Bonzini# qemu-efi (pkg) 102*ac06724aSPaolo Bonzini# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 103*ac06724aSPaolo Bonzini# /usr/share/AAVMF/AAVMF_VARS.fd (var) 104*ac06724aSPaolo Bonzini 105*ac06724aSPaolo Bonzini[drive "uefi-binary"] 106*ac06724aSPaolo Bonzini file = "/usr/share/AAVMF/AAVMF_CODE.fd" # CHANGE ME 107*ac06724aSPaolo Bonzini format = "raw" 108*ac06724aSPaolo Bonzini if = "pflash" 109*ac06724aSPaolo Bonzini unit = "0" 110*ac06724aSPaolo Bonzini readonly = "on" 111*ac06724aSPaolo Bonzini 112*ac06724aSPaolo Bonzini[drive "uefi-varstore"] 113*ac06724aSPaolo Bonzini file = "guest_VARS.fd" # CHANGE ME 114*ac06724aSPaolo Bonzini format = "raw" 115*ac06724aSPaolo Bonzini if = "pflash" 116*ac06724aSPaolo Bonzini unit = "1" 117*ac06724aSPaolo Bonzini 118*ac06724aSPaolo Bonzini 119*ac06724aSPaolo Bonzini# PCI bridge (PCI Express Root Ports) 120*ac06724aSPaolo Bonzini# ========================================================= 121*ac06724aSPaolo Bonzini# 122*ac06724aSPaolo Bonzini# We create eight PCI Express Root Ports, and we plug them 123*ac06724aSPaolo Bonzini# all into separate functions of the same slot. Some of 124*ac06724aSPaolo Bonzini# them will be used by devices, the rest will remain 125*ac06724aSPaolo Bonzini# available for hotplug. 126*ac06724aSPaolo Bonzini 127*ac06724aSPaolo Bonzini[device "pcie.1"] 128*ac06724aSPaolo Bonzini driver = "pcie-root-port" 129*ac06724aSPaolo Bonzini bus = "pcie.0" 130*ac06724aSPaolo Bonzini addr = "1c.0" 131*ac06724aSPaolo Bonzini port = "1" 132*ac06724aSPaolo Bonzini chassis = "1" 133*ac06724aSPaolo Bonzini multifunction = "on" 134*ac06724aSPaolo Bonzini 135*ac06724aSPaolo Bonzini[device "pcie.2"] 136*ac06724aSPaolo Bonzini driver = "pcie-root-port" 137*ac06724aSPaolo Bonzini bus = "pcie.0" 138*ac06724aSPaolo Bonzini addr = "1c.1" 139*ac06724aSPaolo Bonzini port = "2" 140*ac06724aSPaolo Bonzini chassis = "2" 141*ac06724aSPaolo Bonzini 142*ac06724aSPaolo Bonzini[device "pcie.3"] 143*ac06724aSPaolo Bonzini driver = "pcie-root-port" 144*ac06724aSPaolo Bonzini bus = "pcie.0" 145*ac06724aSPaolo Bonzini addr = "1c.2" 146*ac06724aSPaolo Bonzini port = "3" 147*ac06724aSPaolo Bonzini chassis = "3" 148*ac06724aSPaolo Bonzini 149*ac06724aSPaolo Bonzini[device "pcie.4"] 150*ac06724aSPaolo Bonzini driver = "pcie-root-port" 151*ac06724aSPaolo Bonzini bus = "pcie.0" 152*ac06724aSPaolo Bonzini addr = "1c.3" 153*ac06724aSPaolo Bonzini port = "4" 154*ac06724aSPaolo Bonzini chassis = "4" 155*ac06724aSPaolo Bonzini 156*ac06724aSPaolo Bonzini[device "pcie.5"] 157*ac06724aSPaolo Bonzini driver = "pcie-root-port" 158*ac06724aSPaolo Bonzini bus = "pcie.0" 159*ac06724aSPaolo Bonzini addr = "1c.4" 160*ac06724aSPaolo Bonzini port = "5" 161*ac06724aSPaolo Bonzini chassis = "5" 162*ac06724aSPaolo Bonzini 163*ac06724aSPaolo Bonzini[device "pcie.6"] 164*ac06724aSPaolo Bonzini driver = "pcie-root-port" 165*ac06724aSPaolo Bonzini bus = "pcie.0" 166*ac06724aSPaolo Bonzini addr = "1c.5" 167*ac06724aSPaolo Bonzini port = "6" 168*ac06724aSPaolo Bonzini chassis = "6" 169*ac06724aSPaolo Bonzini 170*ac06724aSPaolo Bonzini[device "pcie.7"] 171*ac06724aSPaolo Bonzini driver = "pcie-root-port" 172*ac06724aSPaolo Bonzini bus = "pcie.0" 173*ac06724aSPaolo Bonzini addr = "1c.6" 174*ac06724aSPaolo Bonzini port = "7" 175*ac06724aSPaolo Bonzini chassis = "7" 176*ac06724aSPaolo Bonzini 177*ac06724aSPaolo Bonzini[device "pcie.8"] 178*ac06724aSPaolo Bonzini driver = "pcie-root-port" 179*ac06724aSPaolo Bonzini bus = "pcie.0" 180*ac06724aSPaolo Bonzini addr = "1c.7" 181*ac06724aSPaolo Bonzini port = "8" 182*ac06724aSPaolo Bonzini chassis = "8" 183*ac06724aSPaolo Bonzini 184*ac06724aSPaolo Bonzini 185*ac06724aSPaolo Bonzini# SCSI storage controller (and storage) 186*ac06724aSPaolo Bonzini# ========================================================= 187*ac06724aSPaolo Bonzini# 188*ac06724aSPaolo Bonzini# We use virtio-scsi here so that we can (hot)plug a large 189*ac06724aSPaolo Bonzini# number of disks without running into issues; a SCSI disk, 190*ac06724aSPaolo Bonzini# backed by a qcow2 disk image on the host's filesystem, is 191*ac06724aSPaolo Bonzini# attached to it. 192*ac06724aSPaolo Bonzini# 193*ac06724aSPaolo Bonzini# We also create an optical disk, mostly for installation 194*ac06724aSPaolo Bonzini# purposes: once the guest OS has been succesfully 195*ac06724aSPaolo Bonzini# installed, the guest will no longer boot from optical 196*ac06724aSPaolo Bonzini# media. If you don't want, or no longer want, to have an 197*ac06724aSPaolo Bonzini# optical disk in the guest you can safely comment out 198*ac06724aSPaolo Bonzini# all relevant sections below. 199*ac06724aSPaolo Bonzini 200*ac06724aSPaolo Bonzini[device "scsi"] 201*ac06724aSPaolo Bonzini driver = "virtio-scsi-pci" 202*ac06724aSPaolo Bonzini bus = "pcie.1" 203*ac06724aSPaolo Bonzini addr = "00.0" 204*ac06724aSPaolo Bonzini 205*ac06724aSPaolo Bonzini[device "scsi-disk"] 206*ac06724aSPaolo Bonzini driver = "scsi-hd" 207*ac06724aSPaolo Bonzini bus = "scsi.0" 208*ac06724aSPaolo Bonzini drive = "disk" 209*ac06724aSPaolo Bonzini bootindex = "1" 210*ac06724aSPaolo Bonzini 211*ac06724aSPaolo Bonzini[drive "disk"] 212*ac06724aSPaolo Bonzini file = "guest.qcow2" # CHANGE ME 213*ac06724aSPaolo Bonzini format = "qcow2" 214*ac06724aSPaolo Bonzini if = "none" 215*ac06724aSPaolo Bonzini 216*ac06724aSPaolo Bonzini[device "scsi-optical-disk"] 217*ac06724aSPaolo Bonzini driver = "scsi-cd" 218*ac06724aSPaolo Bonzini bus = "scsi.0" 219*ac06724aSPaolo Bonzini drive = "optical-disk" 220*ac06724aSPaolo Bonzini bootindex = "2" 221*ac06724aSPaolo Bonzini 222*ac06724aSPaolo Bonzini[drive "optical-disk"] 223*ac06724aSPaolo Bonzini file = "install.iso" # CHANGE ME 224*ac06724aSPaolo Bonzini format = "raw" 225*ac06724aSPaolo Bonzini if = "none" 226*ac06724aSPaolo Bonzini 227*ac06724aSPaolo Bonzini 228*ac06724aSPaolo Bonzini# Ethernet controller 229*ac06724aSPaolo Bonzini# ========================================================= 230*ac06724aSPaolo Bonzini# 231*ac06724aSPaolo Bonzini# We use virtio-net for improved performance over emulated 232*ac06724aSPaolo Bonzini# hardware; on the host side, we take advantage of user 233*ac06724aSPaolo Bonzini# networking so that the QEMU process doesn't require any 234*ac06724aSPaolo Bonzini# additional privileges. 235*ac06724aSPaolo Bonzini 236*ac06724aSPaolo Bonzini[netdev "hostnet"] 237*ac06724aSPaolo Bonzini type = "user" 238*ac06724aSPaolo Bonzini 239*ac06724aSPaolo Bonzini[device "net"] 240*ac06724aSPaolo Bonzini driver = "virtio-net-pci" 241*ac06724aSPaolo Bonzini netdev = "hostnet" 242*ac06724aSPaolo Bonzini bus = "pcie.2" 243*ac06724aSPaolo Bonzini addr = "00.0" 244