This document provides instructions to create the “arm-ubuntu” image and
points to the gem5 component that would work with the disk image. The
arm-ubuntu disk image is based on Ubuntu’s server cloud image for
arm available at (https://cloud-images.ubuntu.com/focal/current/).
The .bashrc
file would be modified in such a way that it executes
a script passed from the gem5 configuration files (using the m5 readfile
instruction).
The instructions for bringing up QEMU emulation are based on Ubuntu’s Wiki, and the instructions for creating a cloud disk image are based on this guide. More information about cloud-init can be found here.
We assume the following directory structure while following the instructions in this README file:
arm-ubuntu/
|___ gem5/ # gem5 source code (to be cloned here)
|
|___ disk-image/
| |___ aarch64-ubuntu.img # The ubuntu disk image should be downloaded and modified here
| |___ shared/ # Auxiliary files needed for disk creation
| | |___ serial-getty@.service # Auto-login script
| |___ arm-ubuntu/
| |___ cloud.txt # the cloud config, to be created
| |___ gem5_init.sh # The script to be appended to .bashrc on the disk image
| |___ post-installation.sh # The script manipulating the disk image
| |___ arm-ubuntu.json # The Packer script
|
|
|___ README.md # This README file
This requires an ARM cross compiler to be installed. The disk image is a 64-bit ARM 64 (aarch64) disk image. Therefore, we only focus on the 64-bit version of the cross compiler. It can be installed by:
sudo apt-get install g++-10-aarch64-linux-gnu gcc-10-aarch64-linux-gnu
In order to build the ARM based Ubuntu disk-image for with gem5, build the m5
utility in gem5/util/m5
using the following:
git clone https://gem5.googlesource.com/public/gem5
cd gem5/util/m5
scons build/arm64/out/m5
Troubleshooting: You may need to edit the SConscript to point to the correct cross compiler.
...
main['CXX'] = '${CROSS_COMPILE}g++-10'
...
On the host machine,
sudo apt-get install qemu-system-arm qemu-efi
On the host machine,
sudo apt-get install cloud-utils
In the arm-ubuntu/disk-image/
directory,
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-arm64.img
ssh-keygen -t rsa -b 4096
Leave all prompted fields empty and hit enter. This will generate a public and
private key pair in files ~/.ssh/id_rsa
and ~/.ssh/id_rsa.pub
. If your username
is different from what is printed by command whoami
, then add -C "<username>*<hostname>"
to the command:
ssh-keygen -t rsa -b 4096 -C "<username>*<hostname>"
First, we need a cloud config that will have the authorization information keys for logging in the machine.
In the arm-ubuntu/disk-image/arm-ubuntu
directory, create a cloud.txt
file
with the following content,
#cloud-config
users:
- name: ubuntu <- change this name to the current user (use `whoami`)
ssh-authorized-keys:
- ssh-rsa AAAAABBCCCCCCCrNJfweeeeee <- insert the rsa key here (typically `cat ~/.ssh/id_rsa.pub`)
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
shell: /bin/bash
homedir: /home/ubuntu <- change this to the home directory of `whoami`
cloud.txt
file.whoami
, then use that for parameter “name” in cloud.txtMore information about generating an ssh rsa key is available here. You can ignore the GitHub email address part.
In the arm-ubuntu/disk-image
directory,
dd if=/dev/zero of=flash0.img bs=1M count=64
dd if=/usr/share/qemu-efi/QEMU_EFI.fd of=flash0.img conv=notrunc
dd if=/dev/zero of=flash1.img bs=1M count=64
cloud-localds --disk-format qcow2 cloud.img arm-ubuntu/cloud.txt
wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd
qemu-system-aarch64 \
-smp 2 \
-m 1024 \
-M virt \
-cpu cortex-a57 \
-bios QEMU_EFI.fd \
-nographic \
-device virtio-blk-device,drive=image \
-drive if=none,id=image,file=focal-server-cloudimg-arm64.img \
-device virtio-blk-device,drive=cloud \
-drive if=none,id=cloud,file=cloud.img \
-netdev user,id=user0 -device virtio-net-device,netdev=eth0 \
-netdev user,id=eth0,hostfwd=tcp::5555-:22
When the qemu instance has fully booted, cloud-init has completed, and while it
is still running, we will use Packer to connect to the virtual machine and
manipulate the disk image. Before doing that, we need to add the private key using ssh-add
.
ssh-add ~/.ssh/id_rsa
If the image was booted in qemu on a port number other than 5555, edit the ssh_port
parameter in arm-ubuntu/arm-ubuntu.json
accordingly. The disk manipulation
process is automated. If your username is different from what is printed by
command whoami
, then edit build.sh
and change the value of USER
to "<your_username>"
.
Then in the arm-ubuntu/disk-image/
directory,
chmod +x build.sh
./build.sh
build.sh
also verifies the cloud.txt and modifies the arm-ubuntu.json
accordingly. The packer script, executed by build.sh
disables systemd. In
case you need to enable systemd stuff, remove the last two provisioners from
the arm-ubuntu.json file.
Note that after executing the packer script, you will not be able to emulate this disk image in qemu.
We need to finalize the image before we can use it with gem5. This is done by:
qemu-img convert -f qcow2 -O raw focal-server-cloudimg-arm64.img arm64-ubuntu-focal-server.img
rm focal-server-cloudimg-arm64.img