Skip to content

Commit

Permalink
Add general ignition-ostree module with rootfs replacement
Browse files Browse the repository at this point in the history
Previously the `40coreos-var` module was "special /var
handling for Ignition + OSTree".

This new module takes over that, renaming it to `ignition-ostree`,
and extends it with support for replacing the root filesystem.
  • Loading branch information
cgwalters committed Sep 26, 2019
1 parent aba5145 commit 90f3db1
Show file tree
Hide file tree
Showing 10 changed files with 141 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/bin/bash
set -euo pipefail

rootmnt=/sysroot
tmproot=/run/ignition-ostree-rootfs

case "${1:-}" in
detect)
# This is obviously crude; perhaps in the future we could change ignition's `fetch`
# stage to write out a file if the rootfs is being replaced or so. But eh, it
# works for now.
has_rootfs=$(jq '.storage?.filesystems? // [] | map(select(.label == "root")) | length' < /run/ignition.json)
if [ "${has_rootfs}" = "0" ]; then
exit 0
fi
echo "Detected rootfs replacement in fetched Ignition config: /run/ignition.json"
mkdir "${tmproot}"
;;
save)
# This one is in a private mount namespace since we're not "offically" mounting
mount /dev/disk/by-label/root $rootmnt
echo "Moving rootfs to RAM..."
# OSTree added the immutable bit on the deployment root, and
# cosa's create_disk added it to the rootfs
chattr -i ${rootmnt} ${rootmnt}/ostree/deploy/*/deploy/*.0
for x in boot ostree; do
# TODO; copy instead of mv to avoid writes, since we're just
# about to blow away the whole FS anyways?
mv -Tn ${rootmnt}/${x} ${tmproot}/${x}
done
umount ${rootmnt}
echo "Moved rootfs to RAM, pending redeployment: ${tmproot}"
;;
restore)
# This one is in a private mount namespace since we're not "offically" mounting
mount /dev/disk/by-label/root $rootmnt
echo "Restoring rootfs from RAM..."
for x in boot ostree; do
mv -Tn ${tmproot}/${x} ${rootmnt}/${x}
done
# And restore the immutable bits
chattr +i ${rootmnt}/ostree/deploy/*/deploy/*.0 ${rootmnt}
echo "...done"
umount $rootmnt
;;
*)
echo "Unsupported operation: ${1:-}"
;;
esac
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[Unit]
Description=Mount OSTree /var
Description=Ignition OSTree: Mount /var
DefaultDependencies=false
ConditionKernelCommandLine=ostree
ConditionPathExists=!/run/ostree-live

# Make sure ExecStop= runs before we switch root
Expand All @@ -21,5 +22,5 @@ Before=ignition-mount.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/coreos-mount-var mount
ExecStop=/usr/sbin/coreos-mount-var umount
ExecStart=/usr/sbin/ignition-ostree-mount-var mount
ExecStop=/usr/sbin/ignition-ostree-mount-var umount
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[Unit]
Description=Populate OSTree /var
Description=Ignition OSTree: Populate /var
ConditionKernelCommandLine=ostree
DefaultDependencies=false

# Need to do this with all mount points active
Expand All @@ -11,4 +12,4 @@ Before=ignition-files.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/coreos-populate-var
ExecStart=/usr/sbin/ignition-ostree-populate-var
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[Unit]
Description=Ignition OSTree: detect rootfs replacement
DefaultDependencies=false
After=ignition-fetch.service
Before=ignition-disks.service
Before=initrd-root-fs.target
Before=sysroot.mount
ConditionKernelCommandLine=ostree

# This stage requires udevd to detect disks
Requires=systemd-udevd.service
After=systemd-udevd.service

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/run/ignition.env
ExecStart=/usr/libexec/ignition-ostree-dracut-rootfs detect
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[Unit]
Description=Ignition OSTree: restore rootfs
DefaultDependencies=false
After=ignition-disks.service
Before=sysroot.mount

ConditionKernelCommandLine=ostree
ConditionPathIsDirectory=/run/ignition-ostree-rootfs

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/run/ignition.env
# So we can transiently mount sysroot
MountFlags=slave
ExecStart=/usr/libexec/ignition-ostree-dracut-rootfs restore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[Unit]
Description=Ignition OSTree: save rootfs
DefaultDependencies=false
After=ignition-ostree-rootfs-detect.service
Before=ignition-disks.service
ConditionKernelCommandLine=ostree
ConditionPathIsDirectory=/run/ignition-ostree-rootfs

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/run/ignition.env
# So we can transiently mount sysroot
MountFlags=slave
ExecStart=/usr/libexec/ignition-ostree-dracut-rootfs save
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

depends() {
echo ignition ostree
}

install_ignition_unit() {
unit=$1; shift
inst_simple "$moddir/$unit" "$systemdsystemunitdir/$unit"
ln_r "../$unit" "$systemdsystemunitdir/ignition-complete.target.requires/$unit"
}

install() {
inst_multiple \
systemd-sysusers \
systemd-tmpfiles \
ostree tar chattr \
jq

mkdir -p "$initdir/$systemdsystemunitdir/ignition-complete.target.requires"

install_ignition_unit ignition-ostree-mount-var.service
inst_script "$moddir/ignition-ostree-mount-var.sh" \
"/usr/sbin/ignition-ostree-mount-var"

install_ignition_unit ignition-ostree-populate-var.service
inst_script "$moddir/ignition-ostree-populate-var.sh" \
"/usr/sbin/ignition-ostree-populate-var"
inst_script "$moddir/ignition-ostree-dracut-rootfs.sh" \
"/usr/libexec/ignition-ostree-dracut-rootfs"
install_ignition_unit ignition-ostree-rootfs-detect.service
install_ignition_unit ignition-ostree-rootfs-save.service
install_ignition_unit ignition-ostree-rootfs-restore.service
}

This file was deleted.

0 comments on commit 90f3db1

Please sign in to comment.