blob: 9a6c136d28c1585a7399457f29ff2c0d3572ecc3 [file] [log] [blame] [view] [edit]
# os_install_service
This directory contains the OS install D-Bus service. The service is
used to install the OS to disk.
The service exposes a single method, `StartOsInstall`. This method
takes no parameters; the service chooses an appropriate disk to
install to without any user input. Updates are provided with the
`OsInstallStatusChanged` signal. Currently there is no
percentage-complete report, the signal just indicates if the install
succeeded or failed. The signal also includes the install log so that
error details can be presented.
This service (when included in the OS image) only runs when the OS is
live booted from an installer image. This is checked in the [upstart
script](conf/os_install_service.conf) by running
`is_running_from_installer`, which compares the sizes of the root-A
and root-B partitions. If they are the same size, then the OS is
considered installed, whereas if the sizes are different then the OS
is running from an installer image with a stub root-B partition. Note
that this check would break if the USB layout is ever changed to
include a full-size root-B partition.
## Automatic install
To support the creation of mass deployable images install can be
started without human intervention. If a specific UEFI variable,
ChromiumOSAutoInstall-2a6f93c9-29ea-46bf-b618-271b63baacf3, is
present, the service will begin installing when it starts, and request
that the OS shut down when install succeeds.
## Testing
To test the service manually:
dbus-monitor --system sender=org.chromium.OsInstallService
sudo -u chronos dbus-send --print-reply --system \
--dest=org.chromium.OsInstallService \
/org/chromium/OsInstallService \
org.chromium.OsInstallService.StartOsInstall
To test autoinstall in a VM:
Use [virt-firmware] to create an OVMF_VARS.fd with the right UEFI variable:
cp /usr/share/OVMF/OVMF_VARS.fd .
echo '{
"variables": [
{
"name": "ChromiumOSAutoInstall",
"guid": "8be4df61-93ca-11d2-aa0d-00e098032b8c",
"attr": 7,
"data": "00"
}
]
}' > var.json
virt-fw-vars -i OVMF_VARS.fd -o OVMF_VARS.fd --set-json var.json
Then run qemu with that OVMF_FARS.fd:
runvm --uefi --ovmf-vars OVMF_VARS.fd <...>
> qemu-system-x86_64 \
> ...
> -drive if=pflash,format=raw,readonly=on,file=/.../OVMF_CODE.fd \
> -drive if=pflash,format=raw,readonly=on,file=OVMF_VARS.fd
Installation should start immediately.
## Security
This service is run as root due to all the privileged operations needed
for OS installation. The [Upstart service] runs `os_install_service` in
minijail to restrict some syscalls, and there's an [SELinux policy] to
further restrict what the service can do.
[Upstart service]: conf/os_install_service.conf
[SELinux policy]: ../sepolicy/policy/chromeos/cros_os_install_service.te
[virt-firmware]: https://pypi.org/project/virt-firmware/