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