From dea20255313ed6b54d004ef3ba10a8aa04efa9b7 Mon Sep 17 00:00:00 2001 From: Francesco Giannelli Date: Fri, 7 Apr 2017 22:58:55 +0200 Subject: [PATCH] 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 Closes: #784 Approved by: cgwalters --- docs/manual/adapting-existing.md | 24 +++++++++++++++--------- src/switchroot/switchroot.sh | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 src/switchroot/switchroot.sh diff --git a/docs/manual/adapting-existing.md b/docs/manual/adapting-existing.md index 275479f0..687f501b 100644 --- a/docs/manual/adapting-existing.md +++ b/docs/manual/adapting-existing.md @@ -71,17 +71,23 @@ directory. ## Booting and initramfs technology -OSTree comes with optional dracut+systemd integration code that parses -the `ostree=` kernel command line argument in the initramfs, and then -sets up the read-only bind mount on `/usr`, a bind mount on the -deployment's `/sysroot` to the physical `/`, and then finally uses -`mount(MS_MOVE)` to make the deployment root appear to be the root -filesystem before telling systemd to switch root. +OSTree comes with optional dracut+systemd integration code which follows +this logic: + +- Parse the `ostree=` kernel command line argument in the initramfs +- Set up a read-only bind mount on `/usr` +- 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 -possible, but you will have to write the integration code. Patches to -support other initramfs technologies and init systems, if sufficiently -clean, will likely be accepted upstream. +possible, but you will have to write the integration code. See the +existing sources in [src/switchroot](/src/switchroot) as a reference, +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 recording device files such the `/dev/initctl` FIFO, but no longer diff --git a/src/switchroot/switchroot.sh b/src/switchroot/switchroot.sh new file mode 100644 index 00000000..64de80c1 --- /dev/null +++ b/src/switchroot/switchroot.sh @@ -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