Skip to main content

Onboard a VM to Trident

Introduction​

For Trident to be able to update an existing installation of Azure Linux, it needs to track information such as partition and disk layout. This information is discovered by offline-initialize.

This document will outline the steps required to enable this during image creation with Image Customizer.

Prerequisites​

  1. Ensure Image Customizer container is accessible.

Instructions​

Step 1: Download the minimal base image​

Pull minimal-os as a base image from MCR by running:

mkdir -p $HOME/staging
pushd $HOME/staging
oras pull mcr.microsoft.com/azurelinux/3.0/image/minimal-os:latest --platform linux/amd64
popd

Step 2: Build Trident RPMs​

Build the Trident RPMs by running:

make bin/trident-rpms.tar.gz

After running this make command, the RPMs will be built and packaged into bin/trident-rpms.tar.gz and unpacked into bin/RPMS/x86_64:

$ ls bin/RPMS/x86_64/
trident-0.3.DATESTRING-dev.COMMITHASH.azl3.x86_64.rpm
trident-install-service-0.3.DATESTRING-dev.COMMITHASH.azl3.x86_64.rpm
trident-provisioning-0.3.DATESTRING-dev.COMMITHASH.azl3.x86_64.rpm
trident-service-0.3.DATESTRING-dev.COMMITHASH.azl3.x86_64.rpm
trident-static-pcrlock-files-0.3.DATESTRING-dev.COMMITHASH.azl3.x86_64.rpm
trident-update-poll-0.3.DATESTRING-dev.COMMITHASH.azl3.x86_64.rpm

Copy RPMs to staging folder:

cp -r bin/RPMS $HOME/staging

Step 3: Define COSI Configuration including offline-initialize​

Add the trident-service package to the Image Customizer configuration. This will add the Trident services needed for update and the trident package used for offline-initialize.

To invoke trident offline-initialize during image creation, add it in the postCustomization scripts.

These steps are shown below in a simple Image Customizer configuration (assumed as contents of $HOME/staging/ic-config.yaml):

storage:
disks:
- partitionTableType: gpt
maxSize: 10G
partitions:
- id: esp
type: esp
size: 8M
- id: root-a
size: 4G
- id: root-b
size: 4G
- id: trident
size: 1G
- id: srv
size: grow

bootType: efi

filesystems:
- deviceId: esp
type: fat32
mountPoint:
path: /boot/efi
options: umask=0077
- deviceId: root-a
type: ext4
mountPoint: /
- deviceId: trident
type: ext4
mountPoint: /var/lib/trident
- deviceId: srv
type: ext4
mountPoint: /srv

os:
bootloader:
resetType: hard-reset
hostname: update-ready-os

kernelCommandLine:
extraCommandLine:
- log_buf_len=1M

packages:
install:
- dnf
- efibootmgr
- grub2-efi-binary
- iproute
- iptables
- jq
- openssh-server
- trident-service
- vim

scripts:
postCustomization:
- content: |
# Add the necessary directories for the audit logs so that auditd can start
mkdir -p /var/log/audit
- content: |
trident offline-initialize

Step 4: Invoke Image Customizer​

Assuming the RPMs, a base image (image.vhdx) and the Image Customizer configuration file (ic-config.yaml) are found in $HOME/staging, invoke Image Customizer to create a qcow2 file:

pushd $HOME/staging
docker run --rm \
--privileged \
-v ".:/staging:z" \
-v "/dev:/dev" \
mcr.microsoft.com/azurelinux/imagecustomizer:0.18.0 \
--rpm-source /staging/RPMS/x86_64 \
--build-dir /build \
--image-file /staging/image.vhdx \
--output-image-file /staging/image.qcow2 \
--output-image-format qcow2 \
--config-file /staging/ic-config.yaml
popd

Conclusion​

Using image.qcow2 as the operating system for a virtual machine will create a machine that is ready for trident update to work!