blob: 67e7c75d15042ff7c9dd11f0bedcf85f0113cb38 [file] [view]
# Reference VM
The Reference VM is a Debian-based VM image used for testing ChromeOS VM
integrations.
## Dependencies
Debian:
```sh
sudo apt install eatmydata fai-setup-storage lvm2 ovmf python3-jinja2 \
python3-requests python3-yaml
```
For creating the UEFI variables image:
```sh
pip3 install --user virt-firmware
```
## Build instructions
```
sudo ./build.py
```
`sudo` is required for loopback device use.
### Incremental Updates
If you only need to update configuration files (e.g., systemd units, scripts in `data/`) without rebuilding the entire OS or re-installing packages, you can use the incremental mode:
```
sudo ./build.py --update-config-only
```
This will:
- Reuse the existing `refvm.img`.
- Skip `debootstrap` and package installation.
- Skip kernel module compilation (DKMS).
- Only apply changes from the `data/` directory and refresh systemd configuration.
#### What is updated:
- Files in the `data/` directory (copied to the image).
- GRUB configuration (`update-grub`).
- systemd configuration (scripts in `data/` that refresh units).
#### What is NOT updated:
- The base OS and installed packages (skips `apt-get install`).
- Kernel and kernel modules (skips DKMS).
- The status reporter binary (skips Go build).
- User accounts and home directory files (except for `.profile` modifications if it's the first run).
This is significantly faster for quick iterations on configuration changes.
## UEFI variables preparation
```
virt-fw-vars --input /usr/share/OVMF/OVMF_VARS_4M.fd \
--output refvm_VARS.fd \
--enroll-generate "reference VM PK/KEK" \
--secure-boot \
--add-mok "$(uuidgen -r)" ./data/var/lib/dkms/mok.pub
```
### Secure Boot
The built image and firmware support UEFI Secure Boot. To load out-of-tree modules
(currently `virtio_wl` and `tpm_virtio`), a signing key is included in the built image at
`/var/lib/dkms/mok.key`. The variables image generated using the above command
includes the public key in the MOK.
## Booting in crosvm directly
A build of OVMF for crosvm (`CROSVM_CODE.fd`) is required. To run a basic VM
with a serial console:
```
crosvm run --cpus 4 --mem 4096 --disable-sandbox --bios CROSVM_CODE.fd \
--pflash refvm_VARS.fd --block path=/mnt/refvm.img \
--serial type=stdout,console,stdin,earlycon
```
To enable networking, refer to the
[crosvm guide](https://crosvm.dev/book/running_crosvm/example_usage.html#add-networking-support)
.
## Booting on ChromeOS
Refer to [go/bruschetta-installer](https://goto.google.com/bruschetta-installer) on how to boot on
ChromeOS.
## Uprev
Uprev script will update the copy of reference_vm image to the latest one built
in kokoro.
Install dependencies
```
sudo apt install brotli
```
Run the uprev script and commit the result.
```
repo start refvm-uprev-xxxx src/platform/tast-tests
cd src/platform2/vm_tools/reference_vm/
./uprev.sh
cd -
cd src/platform/tast-tests
git commit -a
cros_sdk tast run $DUT bruschetta.Basic # try running test locally.
```
## Local Experimentation
If you want to test your local changes in `reference_vm` with `tast-tests`, you can use `run_experiment.sh`. This script automates processing your local image and updating the local `tast-tests` data dependencies to use your local file directly (bypassing the need to upload to GCP).
```bash
# First, build the image (requires sudo)
sudo ./build.py
# Then, process it and update Tast tests
./run_experiment.sh [path/to/refvm.img]
```
By default, it looks for `refvm.img` in the current directory.
This script will:
1. Sparsify and convert the provided image to qcow2.
2. Compress the image using brotli (required by the Tast fixture).
3. Copy the image directly to the `src/platform/tast-tests/.../bruschetta/data/` directory.
4. Update the local SHA256 hash and remove `.external` metadata so Tast uses the local file.
After running the script, you can run Tast tests as usual:
```bash
(chroot) tast run $DUT bruschetta.Basic
```
**IMPORTANT:** Do not commit the changes made by this script to the `tast-tests` repository (e.g., the `refvm.qcow2` image or the updated `SHA256` file). These changes are for local experimentation only. Use `uprev.sh` for official image updates.
## Commit message can be something like:
```
bruschetta: uprev to refvm-xxx
BUG=b:366103608
TEST=cros_sdk tast run $DUT bruschetta.Basic
```