Skip to content

Instantly share code, notes, and snippets.

@DumpAnalysis
Forked from paranlee/arm64-on-Win10-x64.md
Created April 1, 2022 13:46
Show Gist options
  • Select an option

  • Save DumpAnalysis/884101e5d9011f2b5e6231d061349b60 to your computer and use it in GitHub Desktop.

Select an option

Save DumpAnalysis/884101e5d9011f2b5e6231d061349b60 to your computer and use it in GitHub Desktop.
ARM64 Linux on Win10 x64

Below are the steps to get an ARM64 version of Ubuntu running in the QEMU emulator on Windows 10.

Install QEMU

Install for Windows from choco package manager

choco install qemu -confirm

Check add the Window System PATH C:\Program Files\qemu applied.

Then typing the terminal with qemu-img --help.

qemu-system-aarch64 -M virt -cpu help

Copy the Firmware and OS images

Into your working directory...

Create the configuration data image

The Ubuntu server images require configuration data be provided as an image, such as setting auth credentials.

We need input password below example <WE_HAVE_PASSWORD_MUST_BE_CREDENTIAL>.

sudo apt -y install cloud-image-utils

cat >user-data <<EOF
#cloud-config
password: <WE_HAVE_PASSWORD_MUST_BE_CREDENTIAL>
chpasswd: { expire: False }
ssh_pwauth: True
EOF

cloud-localds user-data.img user-data

The tool used to convert the config text file into an image file only runs on Linux, so I've attached a user-data.img file (and the text file used to create it) in a zip file to this Gist. Extract the user-data.img file to the working directory.

In user-data text file contents.

#cloud-config
password: asdfqwer
chpasswd: { expire: False }
ssh_pwauth: True

The user-data.img file was created for password authentication as outlined in https://stackoverflow.com/a/53373376

Resize storage

Resize your image in the host what you want. :)

qemu-img resize ubuntu-20.04-server-cloudimg-arm64.img +32G

Start the vm, ssh into it and enter the following command

sudo growpart /dev/vda 1

Launch the emulator from the working directory

Run the below to boot the image, you will some some benign errors at startup. Wait until the output settles down (even after you see the login prompt, as the post-boot config may not have completed yet).

qemu-system-aarch64 -m 2048 -cpu cortex-a72 -smp 4 -M virt -nographic -bios QEMU_EFI.fd -drive if=none,file=ubuntu-16.04-server-cloudimg-arm64-uefi1.img,id=hd0 -device virtio-blk-device,drive=hd0 -drive file=user-data.img,format=raw -device virtio-net-device,netdev=net0 -netdev user,hostfwd=tcp:127.0.0.1:2222-:22,id=net0

Long command need indent, enter.

We can check below.

qemu-system-aarch64 -m 2048 -cpu cortex-a72 -smp 4 -M virt -nographic \
    -bios QEMU_EFI.fd \
    -drive if=none,file=ubuntu-16.04-server-cloudimg-arm64-uefi1.img,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -drive file=user-data.img,format=raw \
    -device virtio-net-device,netdev=net0 \
    -netdev user,hostfwd=tcp:127.0.0.1:2222-:22,id=net0

To break down these lines:

  • qemu-system-aarch64 -m 2048 -cpu cortex-a72 -smp 4 -M virt -nographic
    • run the ARM64 virtual platform emulator with 2GB RAM and 4 Cortex-A72 cores with no GUI support.
  • -bios QEMU_EFI.fd
    • use the firmware downloaded above.
  • -drive if=none,file=ubuntu-16.04-server-cloudimg-arm64-uefi1.img,id=hd0
    • use the Ubuntu image file
  • -device virtio-blk-device,drive=hd0
    • mount drive from above as a block device
  • -drive file=user-data.img,format=raw
    • use the configuration data image file
  • -device virtio-net-device,netdev=net0
    • create a virtual network device
  • -netdev user,hostfwd=tcp:127.0.0.1:2222-:22,id=net0
    • set up the networking stack and forward the SSH port

Then from a good Terminal emulator (I recommend the new Windows Terminal app with one of the Powerline fonts) you can connect over SSH with the below, and the configured password (sample file have asdfqwer):

ssh ubuntu@localhost -p 2222

If we need upload/download file to arm64 VM.

Use scp

 scp -P 2222 my-file.sh ubuntu@localhost:/home/ubuntu
 scp -P 2222 ubuntu@localhost:/home/ubuntu/my-file.sh .
qemu-img resize ubuntu-20.04-server-cloudimg-arm64.img +32G
qemu-system-aarch64 -m 2048 -cpu cortex-a72 -smp 4 -M virt -nographic -bios QEMU_EFI.fd -drive if=none,file=ubuntu-20.04-server-cloudimg-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -drive file=user-data.img,format=raw -device virtio-net-device,netdev=net0 -netdev user,hostfwd=tcp:127.0.0.1:2222-:22,id=net0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment