switchroot: Document a bit more, add demo shell implementation

This could help others who want to integrate with other init
systems/initramfs.

Commit-message-by: Colin Walters <walters@verbum.org>

Closes: #784
Approved by: cgwalters
This commit is contained in:
Francesco Giannelli 2017-04-07 22:58:55 +02:00 committed by Atomic Bot
parent 49a525f6a5
commit dea2025531
2 changed files with 40 additions and 9 deletions

View File

@ -71,17 +71,23 @@ directory.
## Booting and initramfs technology ## Booting and initramfs technology
OSTree comes with optional dracut+systemd integration code that parses OSTree comes with optional dracut+systemd integration code which follows
the `ostree=` kernel command line argument in the initramfs, and then this logic:
sets up the read-only bind mount on `/usr`, a bind mount on the
deployment's `/sysroot` to the physical `/`, and then finally uses - Parse the `ostree=` kernel command line argument in the initramfs
`mount(MS_MOVE)` to make the deployment root appear to be the root - Set up a read-only bind mount on `/usr`
filesystem before telling systemd to switch root. - Bind mount the deployment's `/sysroot` to the physical `/`
- Use `mount(MS_MOVE)` to make the deployment root appear to be the root filesystem
After these steps, systemd switches root.
If you are not using dracut or systemd, using OSTree should still be If you are not using dracut or systemd, using OSTree should still be
possible, but you will have to write the integration code. Patches to possible, but you will have to write the integration code. See the
support other initramfs technologies and init systems, if sufficiently existing sources in [src/switchroot](/src/switchroot) as a reference,
clean, will likely be accepted upstream. as well as [src/switchroot/switchroot.sh](/src/switchroot/switchroot.sh).
Patches to support other initramfs technologies and init systems, if
sufficiently clean, will likely be accepted upstream.
A further specific note regarding `sysvinit`: OSTree used to support A further specific note regarding `sysvinit`: OSTree used to support
recording device files such the `/dev/initctl` FIFO, but no longer recording device files such the `/dev/initctl` FIFO, but no longer

View File

@ -0,0 +1,25 @@
#!/bin/sh
# This demonstration script is an implementation in shell
# similar to ostree-prepare-root.c. For a bit more information,
# see adapting-existing.md.
## the ostree boot parameter is avaialbe during the init
env | grep ostree
# ostree=/ostree/boot.1/.../.../0
## bind mount the ostree deployment to prepare it for move
mount --bind $sysroot$ostree $sysroot$ostree
## bind mount read-only /usr
mount --bind $sysroot$ostree/usr $sysroot$ostree/usr
mount --bind -o remount,ro $sysroot$ostree/usr $sysroot$ostree/usr
## bind mount the physical root
mount --bind $sysroot $sysroot$ostree/sysroot
## bind mount the var directory which is preserved between deployments
mount --bind $sysroot/ostree/deploy/os/var $sysroot$ostree/var
## make sure target directories are present within var
cd $sysroot$ostree/var
mkdir -p roothome mnt opt home
cd -
## move the deployment to the sysroot
mount --move $sysroot$ostree $sysroot
## after these the init system should start the switch root process