blob: 50b243010c1599db764fe50bcf8556acc0fcefff [file] [log] [blame] [view]
# COS Customizer Design
The design can be thought of as steps that aren't the `finish-image-build` step
and the step that is.
## Steps that aren't `finish-image-build`
The start-image and all optional steps are involved in creating and modifying a pair of configs
called the `prov.config` and `build.config`. Both these configs live on the Cloud Build VM (the builder VM),
The `build.config` instructs
[Daisy](https://github.com/GoogleCloudPlatform/compute-image-tools/tree/master/daisy)
on which resources (disks, vm's) to create and which project to create them in.
The `prov.config` file is used to instruct the provisioner, a binary that is executed
on the "preload VM", a VM whose bootdisk is exported as the customized image.
The provisioner is the binary that executes all optional steps that a user will have
specified. For example, run-script, install-gpu, seal-oem, and anthos-install are all
steps that the provisioner has implemented.
## The `finish-image-build` step
This step is implemented in two phases:
1. The preloading phase
2. The provisioner phase
The *preloading phase* calls a command line tool called
[daisy](https://github.com/GoogleCloudPlatform/compute-daisy)
and is implemented here
[preloader](https://cos.googlesource.com/cos/tools/+/refs/heads/master/src/pkg/preloader).
The preloader generates a daisy config file based on the buildspec and calls daisy which
creates all the GCP resources necessary for creating a custom COS image. A few disks
and a VM are created, and the disks are mounted to the VM. One of these disks is the boot
disk which is what will eventually be exported as the customized COS image. Another disk is called "cidata"
which packages the provisioner and the provisioner's configs which will be used in the next step.
The *provisioner phase* calls a command line tool called the
[provisioner](https://cos.googlesource.com/cos/tools/+/refs/heads/master/src/cmd/provisioner)
that gets pulled into the preload VM from the previously mentioned "cidata" disk.
The provisioner is what executes the optional
steps that you have specified in your `cloudbuild.yaml` file. It will run any scripts
install any artifacts, or seal any partitions that were specified prior to this
step. Once it finishes executing, the preloading phase will proceed to cleanup any left over resources
and exit the build.