1*bb4ee6a4SAndroid Build Coastguard Worker# Copyright 2021 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker# found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker# 5*bb4ee6a4SAndroid Build Coastguard Worker# Builds the base image for test VMs used by ./tools/x86vm and 6*bb4ee6a4SAndroid Build Coastguard Worker# ./tools/aarch64vm. 7*bb4ee6a4SAndroid Build Coastguard Worker# 8*bb4ee6a4SAndroid Build Coastguard Worker# To build and upload a new base image, uprev the version in the `version` file 9*bb4ee6a4SAndroid Build Coastguard Worker# and run: 10*bb4ee6a4SAndroid Build Coastguard Worker# 11*bb4ee6a4SAndroid Build Coastguard Worker# make ARCH=x86_64 upload 12*bb4ee6a4SAndroid Build Coastguard Worker# make ARCH=aarch64 upload 13*bb4ee6a4SAndroid Build Coastguard Worker# 14*bb4ee6a4SAndroid Build Coastguard Worker# You need write access to the crosvm-testvm storage bucket which is part of the 15*bb4ee6a4SAndroid Build Coastguard Worker# crosvm-packages cloud project. 16*bb4ee6a4SAndroid Build Coastguard Worker# 17*bb4ee6a4SAndroid Build Coastguard Worker# Note: The locally built image is stored in the same place that testvm.py 18*bb4ee6a4SAndroid Build Coastguard Worker# expects. So the image can be tested directly: 19*bb4ee6a4SAndroid Build Coastguard Worker# 20*bb4ee6a4SAndroid Build Coastguard Worker# make -C tools/impl/testvm ARCH=x86_64 21*bb4ee6a4SAndroid Build Coastguard Worker# ./tools/x86vm run 22*bb4ee6a4SAndroid Build Coastguard Worker 23*bb4ee6a4SAndroid Build Coastguard WorkerCARGO_TARGET=$(shell cargo metadata --no-deps --format-version 1 | \ 24*bb4ee6a4SAndroid Build Coastguard Worker jq -r ".target_directory") 25*bb4ee6a4SAndroid Build Coastguard WorkerTARGET=/tmp/crosvm_tools/$(ARCH) 26*bb4ee6a4SAndroid Build Coastguard Worker$(shell mkdir -p $(TARGET)) 27*bb4ee6a4SAndroid Build Coastguard Worker 28*bb4ee6a4SAndroid Build Coastguard Workerifeq ($(ARCH), x86_64) 29*bb4ee6a4SAndroid Build Coastguard Worker DEBIAN_ARCH=amd64 30*bb4ee6a4SAndroid Build Coastguard Worker QEMU_CMD=qemu-system-x86_64 \ 31*bb4ee6a4SAndroid Build Coastguard Worker -cpu host \ 32*bb4ee6a4SAndroid Build Coastguard Worker -enable-kvm 33*bb4ee6a4SAndroid Build Coastguard Workerelse ifeq ($(ARCH), aarch64) 34*bb4ee6a4SAndroid Build Coastguard Worker DEBIAN_ARCH=arm64 35*bb4ee6a4SAndroid Build Coastguard Worker QEMU_CMD=qemu-system-aarch64 \ 36*bb4ee6a4SAndroid Build Coastguard Worker -cpu cortex-a57 \ 37*bb4ee6a4SAndroid Build Coastguard Worker -M virt \ 38*bb4ee6a4SAndroid Build Coastguard Worker -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd 39*bb4ee6a4SAndroid Build Coastguard Workerelse 40*bb4ee6a4SAndroid Build Coastguard Worker $(error Only x86_64 or aarch64 are supported) 41*bb4ee6a4SAndroid Build Coastguard Workerendif 42*bb4ee6a4SAndroid Build Coastguard Worker 43*bb4ee6a4SAndroid Build Coastguard WorkerGS_PREFIX=gs://crosvm/testvm 44*bb4ee6a4SAndroid Build Coastguard WorkerDEBIAN_URL=https://cloud.debian.org/images/cloud/trixie/daily/latest/ 45*bb4ee6a4SAndroid Build Coastguard Worker 46*bb4ee6a4SAndroid Build Coastguard WorkerBASE_IMG_NAME=base-$(ARCH)-$(shell cat version).qcow2 47*bb4ee6a4SAndroid Build Coastguard WorkerGS_URL=$(GS_PREFIX)/$(BASE_IMG_NAME) 48*bb4ee6a4SAndroid Build Coastguard WorkerLOCAL_IMAGE=$(TARGET)/$(BASE_IMG_NAME) 49*bb4ee6a4SAndroid Build Coastguard Worker 50*bb4ee6a4SAndroid Build Coastguard Workerall: $(LOCAL_IMAGE) 51*bb4ee6a4SAndroid Build Coastguard Worker 52*bb4ee6a4SAndroid Build Coastguard Workerclean: 53*bb4ee6a4SAndroid Build Coastguard Worker rm -rf $(TARGET) 54*bb4ee6a4SAndroid Build Coastguard Worker 55*bb4ee6a4SAndroid Build Coastguard Worker# Upload images to cloud storage. Do not overwrite existing images, uprev 56*bb4ee6a4SAndroid Build Coastguard Worker# `image_version` instead. 57*bb4ee6a4SAndroid Build Coastguard Workerupload: $(LOCAL_IMAGE) 58*bb4ee6a4SAndroid Build Coastguard Worker gsutil cp -n $(LOCAL_IMAGE) $(GS_URL) 59*bb4ee6a4SAndroid Build Coastguard Worker 60*bb4ee6a4SAndroid Build Coastguard Worker# Download debian bullseye as base image for the testvm. 61*bb4ee6a4SAndroid Build Coastguard Worker$(TARGET)/debian.qcow2: 62*bb4ee6a4SAndroid Build Coastguard Worker wget $(DEBIAN_URL)/debian-13-generic-$(DEBIAN_ARCH)-daily.qcow2 -O $@.tmp 63*bb4ee6a4SAndroid Build Coastguard Worker qemu-img resize $@.tmp 8G 64*bb4ee6a4SAndroid Build Coastguard Worker mv $@.tmp $@ 65*bb4ee6a4SAndroid Build Coastguard Worker 66*bb4ee6a4SAndroid Build Coastguard Worker# The cloud init file contains instructions for how to set up the VM when it's 67*bb4ee6a4SAndroid Build Coastguard Worker# first booted. 68*bb4ee6a4SAndroid Build Coastguard Worker$(TARGET)/clould_init.img: cloud_init.yaml 69*bb4ee6a4SAndroid Build Coastguard Worker cloud-localds -v $@ $< 70*bb4ee6a4SAndroid Build Coastguard Worker 71*bb4ee6a4SAndroid Build Coastguard Worker# Boot image to run through clould-init process. 72*bb4ee6a4SAndroid Build Coastguard Worker# cloud-init will shut down the VM after initialization. Compress the image 73*bb4ee6a4SAndroid Build Coastguard Worker# afterwards for distribution. 74*bb4ee6a4SAndroid Build Coastguard Worker$(LOCAL_IMAGE): $(TARGET)/clould_init.img $(TARGET)/debian.qcow2 75*bb4ee6a4SAndroid Build Coastguard Worker cp -f $(TARGET)/debian.qcow2 $@ 76*bb4ee6a4SAndroid Build Coastguard Worker $(QEMU_CMD) \ 77*bb4ee6a4SAndroid Build Coastguard Worker -m 4G -smp 8 \ 78*bb4ee6a4SAndroid Build Coastguard Worker -display none \ 79*bb4ee6a4SAndroid Build Coastguard Worker -serial stdio \ 80*bb4ee6a4SAndroid Build Coastguard Worker -drive file=$@,format=qcow2,index=0,media=disk \ 81*bb4ee6a4SAndroid Build Coastguard Worker -drive file=$(TARGET)/clould_init.img,format=raw,index=1,media=disk 82*bb4ee6a4SAndroid Build Coastguard Worker qemu-img convert -O qcow2 -c $@ $@-compressed 83*bb4ee6a4SAndroid Build Coastguard Worker mv -f $@-compressed $@ 84