Skip to content
This repository has been archived by the owner on Aug 25, 2021. It is now read-only.

Commit

Permalink
wip 31ignition-ostree
Browse files Browse the repository at this point in the history
For redeploying the rootfs
  • Loading branch information
cgwalters committed Sep 25, 2019
1 parent 12a492e commit 3c5da1f
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 2 deletions.
2 changes: 1 addition & 1 deletion dracut/30ignition/coreos-gpt-setup@.service
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Requires=%i.device
After=%i.device
# Run before services that use device nodes, preventing them from racing
# with udev activity generated by sgdisk
Before=ignition-setup-base.service ignition-setup-user.service ignition-disks.service
Before=ignition-setup-base.service ignition-setup-user.service ignition-ostree-rootfs-save.service ignition-disks.service

[Service]
Type=oneshot
Expand Down
49 changes: 49 additions & 0 deletions dracut/31ignition-ostree/ignition-ostree-dracut-rootfs.sh
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
18 changes: 18 additions & 0 deletions dracut/31ignition-ostree/ignition-ostree-rootfs-detect.service
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
16 changes: 16 additions & 0 deletions dracut/31ignition-ostree/ignition-ostree-rootfs-restore.service
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
15 changes: 15 additions & 0 deletions dracut/31ignition-ostree/ignition-ostree-rootfs-save.service
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
9 changes: 8 additions & 1 deletion dracut/31ignition-ostree/module-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ install_ignition_unit() {
install() {
inst_multiple \
systemd-sysusers \
systemd-tmpfiles
systemd-tmpfiles \
ostree tar chattr \
jq

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

Expand All @@ -26,4 +28,9 @@ install() {
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
}

0 comments on commit 3c5da1f

Please sign in to comment.