Xen: maintenance Xen and QEMU repos for TRS

Introduction

We need to maintain the upstreaming patches for Xen and QEMU repositories for support virtio device modules (e.g. virtio GPU device mode), this page is to describe how to download the related source code and build TRS. It also gives commands for launching Android Cuttlefish images on Xen virtual machine.

Download TRS offical repository

We can refer the TRS documenation Developer setup to download TRS repository and Getting the host packages to install dependencies on the PC.

Checkout the maintenance branches

$ cd /path/to/trs-workspace/meta-ledge-secure $ git remote add trs-maintenance https://gitlab.com/Linaro/blueprints/automotive/xen-aosp/trs-fragments/meta-ledge-secure.git $ git fetch trs-maintenance $ git checkout trs-maintenance/xen_aosp_maintenance_20231211 $ cd /path/to/trs-workspace/meta-virtualization/ $ git remote add trs-maintenance https://gitlab.com/Linaro/blueprints/automotive/xen-aosp/trs-fragments/meta-virtualization.git $ git fetch trs-maintenance $ git checkout trs-maintenance/xen_aosp_maintenance_20231211 $ cd /path/to/trs-workspace/trs/ $ git remote add trs-maintenance https://gitlab.com/Linaro/blueprints/automotive/xen-aosp/trs-fragments/trs.git $ git fetch trs-maintenance $ git checkout trs-maintenance/xen_aosp_maintenance_20231211

Build TRS image for qemuarm64 target

TS_SUPPORTED_TARGETS=tsqemuarm64-secureboot make

Flash TRS images on AVA platform

We need to copy TRS wic image trs-image-trs-qemuarm64.wic on AVA with Ubuntu system, then we can execuate below shell script to flash TRS images onto a NVME block device with command ./flash_ewaol_image.sh /dev/nvmeXnY (you might need to change the nvme block device name nvmeXnY based on your local environment).

Below is the source code for flash_ewaol_image.sh. Note, the script executes commands e2fsck and resize2fs to enlarge the partition size, when you use older version’s binary for e2fsck and resize2fs, it will fail and report errors. In this case, you need to download e2fsprogs package (version 1.47.0 is verified) and build these two binaries.

#!/bin/bash DEV=$1 sudo parted ${DEV} print echo "Please confirm if the partition is right?" while : ; do read -n 1 k <&1 if [[ $k = y ]] ; then printf "\n" break else printf "\nExit\n" exit 0 fi done echo "Copy image to ${DEV}" sudo dd bs=4M if=./trs-image-trs-qemuarm64.wic of=$DEV status=progress && sync sudo growpart $DEV 2 sudo /home/leoy/Downloads/e2fsprogs-1.47.0/e2fsck/e2fsck -f "${DEV}p2" sudo /home/leoy/Downloads/e2fsprogs-1.47.0/resize/resize2fs "${DEV}p2" sudo parted ${DEV} print

Run Android image on Xen virtual machine

By following up the steps described in Xen: porting Android Cuttlefish on Xen Virtual Machine, we can get the Android Cuttlefish images, then we need to copy the U-boot binary and Cuttlefish images into Xen Dom0 (e.g. copy into the folder /home/cuttlefish/ (You need to replace the IP address in your local environment with TRS_IP_ADDRESS in below commands).

Hint: If Android Cuttlefish images are used from mounted partition or located under some other path,

then cuttlefish expects some image files under path /home/USERNAME/<path_to_cuttlefish>/cuttlefish/instances/cvd-1/ to be valid. The easiest way to do that is to create 3 symlinks to the right location:

Then we can use below Xen configuration file to launch Xen virtual machine with command xl -vvv create aaos_vm.cfg -c:

Once the system boot up, since we have added the option -c in the xl create command, we can directly access the virtual machine's console. Android prints out verbose logs and this is hard for us to interact with the virtual machine, we can mute the logs with the command:

Then we can check the virtual networking interface’s IP address:

Android Cuttlefish uses eth0 and eth1 for specific purpose for emulation WiFi and other networking devices, this is why we can see eth2 is used as normal networking interface and it acquires IP address via DHCP. We can connect eth2 with ADB on the host: