QEMU

Differences between revisions 10 and 18 (spanning 8 versions)
Revision 10 as of 2015-12-22 21:03:56
Size: 1999
Editor: dannf
Comment:
Revision 18 as of 2022-11-18 19:18:28
Size: 2758
Editor: dannf
Comment: Update to use a qemu-efi new enough to provide prebuild flash volumes
Deletions are marked like this. Additions are marked like this.
Line 5: Line 5:
'''Note: this requires Ubuntu 15.04 or greater''' '''Note: this requires Ubuntu 20.04 or greater'''
Line 7: Line 7:
 1. Install QEMU  1. Install QEMU and the EFI image for QEMU:
Line 9: Line 9:
 $ sudo apt-get install qemu-system-aarch64  $ sudo apt-get install qemu-system-arm qemu-efi
Line 11: Line 11:
 1. Get a tianocore UEFI image. Ubuntu provides one in the qemu-efi package.
 1. Now you'll need to create pflash volumes for UEFI. Two volumes are required, one static one for the UEFI firmware, and another dynamic one to store variables. Both need to be exactly 64M in size.
 1.Create a VM-specific flash volume for storing NVRAM variables:
Line 14: Line 13:
 $ dd if=/dev/zero of=flash0.img bs=1M count=64
 $ dd if=QEMU_EFI.fd of=flash0.img conv=notrunc
 $ dd if=/dev/zero of=flash1.img bs=1M count=64
 $ cp /usr/share/AAVMF/AAVMF_CODE.fd flash1.img
Line 18: Line 15:
 1. Now you should be able to boot/ into a -arm64-uefi1.img type [[http://cloud-images.ubuntu.com|cloud image]].  1. Now you should be able to boot/ into a ''-arm64.img'' type [[http://cloud-images.ubuntu.com|cloud image]].
Line 21: Line 18:
  $ sudo qemu-system-aarch64 -enable-kvm -m 1024 -cpu host -M virt -nographic -pflash flash0.img -pflash flash1.img -drive if=none,file=vivid-server-cloudimg-arm64-uefi1.img,id=hd0 -device virtio-blk-device,drive=hd0 -netdev type=tap,id=net0 -device virtio-net-device,netdev=net0,mac=$randmac   $ sudo qemu-system-aarch64 -enable-kvm -m 1024 -cpu host -M virt -nographic -pflash /usr/share/AAVMF/AAVMF_CODE.fd -pflash flash1.img -drive if=none,file=jammy-server-cloudimg-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -netdev type=tap,id=net0 -device virtio-net-device,netdev=net0,mac=$randmac
Line 23: Line 20:
  '''Note: For GICv3 systems, such as Cavium ThunderX, you must use QEMU from Ubuntu 16.04 or newer, and pass "-M virt,gic_version=3"'''.   '''Note: For GICv3 systems, such as Cavium ThunderX, you must use QEMU from Ubuntu 16.04 or newer, and pass "-M virt,gic-version=3". Additionally, you must use a 15.10 (wily) or newer cloud image for guests.'''
Line 26: Line 24:
  $ sudo qemu-system-aarch64 -m 1024 -cpu cortex-a57 -M virt -nographic -pflash flash0.img -pflash flash1.img -drive if=none,file=vivid-server-cloudimg-arm64-uefi1.img,id=hd0 -device virtio-blk-device,drive=hd0 -netdev type=tap,id=net0 -device virtio-net-device,netdev=net0,mac=$randmac   $ sudo qemu-system-aarch64 -m 1024 -cpu cortex-a57 -M virt -nographic -pflash /usr/share/AAVMF/AAVMF_CODE.fd -pflash flash1.img -drive if=none,file=jammy-server-cloudimg-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -netdev type=tap,id=net0 -device virtio-net-device,netdev=net0,mac=$randmac
Line 29: Line 27:
= Troubleshooting =
== Generate MAC Address ==
In the above command, we use ''randmac'' as a variable of mac address. You may generate it by the following command:
Line 30: Line 31:
  {{{
  #!/usr/bin/python3

  import random

  def randomMAC():
      return [ 0x00, 0x16, 0x3e,
               random.randint(0x00, 0x7f),
               random.randint(0x00, 0xff),
               random.randint(0x00, 0xff) ]

  def MACprettyprint(mac):
      return ':'.join(map(lambda x: "%02x" % x, mac))

  if __name__ == '__main__':
      print(MACprettyprint(randomMAC()))
  }}}

== No Output and No Response ==
If such thing happens to you, align your host and guest release version may help. For example, if you generated ''flash0.img'' on Focal but want to emulate Jammy with the cloud image of Jammy, the firmware is not fully compatible. Generating ''flash0.img'' on Jammy when emulating Jammy with the cloud image of Jammy may help.

Ubuntu/arm64 can run inside the QEMU emulator. You can either do this fully emulated (e.g. on an x86 host) or, accelerated w/ KVM if you have an arm64 host. This page describes how to do both.

I've chosen to describe a UEFI-based system here so I can make use of the kernel on the guest's disk image. It is possible to boot directly into Linux instead.

Note: this requires Ubuntu 20.04 or greater

Getting the bits

  1. Install QEMU and the EFI image for QEMU:
     $ sudo apt-get install qemu-system-arm qemu-efi
    1.Create a VM-specific flash volume for storing NVRAM variables:
     $ cp /usr/share/AAVMF/AAVMF_CODE.fd flash1.img
  2. Now you should be able to boot/ into a -arm64.img type cloud image.

    1. For accelerated VMs (arm64 host w/ KVM support)
        $ sudo qemu-system-aarch64 -enable-kvm -m 1024 -cpu host -M virt -nographic -pflash /usr/share/AAVMF/AAVMF_CODE.fd -pflash flash1.img -drive if=none,file=jammy-server-cloudimg-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -netdev type=tap,id=net0 -device virtio-net-device,netdev=net0,mac=$randmac

      Note: For GICv3 systems, such as Cavium ThunderX, you must use QEMU from Ubuntu 16.04 or newer, and pass "-M virt,gic-version=3". Additionally, you must use a 15.10 (wily) or newer cloud image for guests.

    2. For emulated VMs (e.g. x86 host)
        $ sudo qemu-system-aarch64 -m 1024 -cpu cortex-a57 -M virt -nographic -pflash /usr/share/AAVMF/AAVMF_CODE.fd -pflash flash1.img -drive if=none,file=jammy-server-cloudimg-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -netdev type=tap,id=net0 -device virtio-net-device,netdev=net0,mac=$randmac

Troubleshooting

Generate MAC Address

In the above command, we use randmac as a variable of mac address. You may generate it by the following command:

  •   #!/usr/bin/python3
    
      import random
    
      def randomMAC():
          return [ 0x00, 0x16, 0x3e,
                   random.randint(0x00, 0x7f),
                   random.randint(0x00, 0xff),
                   random.randint(0x00, 0xff) ]
    
      def MACprettyprint(mac):
          return ':'.join(map(lambda x: "%02x" % x, mac))
    
      if __name__ == '__main__':
          print(MACprettyprint(randomMAC()))

No Output and No Response

If such thing happens to you, align your host and guest release version may help. For example, if you generated flash0.img on Focal but want to emulate Jammy with the cloud image of Jammy, the firmware is not fully compatible. Generating flash0.img on Jammy when emulating Jammy with the cloud image of Jammy may help.

References

ARM64/QEMU (last edited 2024-04-18 09:13:56 by sally-makin)