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 24, 2019
1 parent e093b21 commit 54a4beb
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 1 deletion.
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-rootfs-save.service ignition-disks.service

[Service]
Type=oneshot
Expand Down
41 changes: 41 additions & 0 deletions dracut/31ignition-ostree/ignition-dracut-rootfs-manual.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/bin/bash
set -euo pipefail

rootmnt=/mnt/rootfs
mkdir -p $rootmnt
mount /dev/disk/by-label/root $rootmnt
igntmp=/run/ignition-rootfs

case "${1:-}" in
save)
for toplevel in boot ostree; do
mkdir -p ${igntmp}/${toplevel}
chcon -h --reference=${rootmnt}/${toplevel} ${igntmp}/${toplevel}
done
# We copy the repo, /var and the .origin file; if we tried to copy
# everything with e.g. `cp` we'd end up breaking hardlinks.
repo=${igntmp}/ostree/repo
ostree --repo=${repo} init --mode=bare
cp ${rootmnt}/ostree/repo/config ${repo}/config
ostree --repo=${repo} pull-local ${rootmnt}/ostree/repo
stateroot=$(ls ${rootmnt}/ostree/deploy)
statepath=ostree/deploy/${stateroot}
mkdir -p ${igntmp}/${statepath}
cp -a ${rootmnt}/${statepath}/var ${igntmp}/${statepath}/var
mkdir -p ${igntmp}/${statepath}/deploy
cp -a ${rootmnt}/${statepath}/deploy/*.origin ${igntmp}/${statepath}/deploy/
commit=$(cd ${stateroot} && ls *.0 | cut -f 1 -d '.')
echo "${commit}" > ${igntmp}/ostree-commit
;;
restore)
echo "Restoring ostree repo..."
mv -T ${igntmp}/ostree ${rootmnt}/ostree
echo "...done"
commit=$(cat ${igntmp}/ostree-commit)
echo "Redeploying OSTree commit ${commit} ..."
ostree admin --sysroot=${rootmnt} deploy ${commit}
;;
*)
echo "Unsupported operation: ${1:-}"
;;
esac
47 changes: 47 additions & 0 deletions dracut/31ignition-ostree/ignition-dracut-rootfs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#!/bin/bash
set -euo pipefail

rootmnt=/mnt/rootfs
mkdir -p $rootmnt
mount /dev/disk/by-label/root $rootmnt
tmproot=/run/ignition-rootfs

case "${1:-}" in
save)
has_rootfs=$(jq -re '.storage?.filesystems[]? | map(select(.label == "root")) | length > 0' < /run/ignition.json)
if [ "${has_rootfs}" = "false" ]; then
exit 0
fi
jq '.storage.filesystems'
echo "Moving rootfs to RAM..."
mkdir ${tmproot}
# 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?
ls -al ${rootmnt}/${x}
mv -Tn ${rootmnt}/${x} ${tmproot}/${x}
done
umount ${rootmnt}
# Just directly re-init here so we can test things as if
# ignition-disks blew away the root fs.
mkfs.xfs -f /dev/disk/by-label/root -L root -m reflink=1
echo "done!"
;;
restore)
echo "Restoring rootfs from RAM..."
ls -al ${tmproot}
for x in boot ostree; do
ls -al ${tmproot}/${x}
mv -Tn ${tmproot}/${x} ${rootmnt}/${x}
done
# And restore the immutable bits
chattr +i ${rootmnt}/ostree/deploy/*/deploy/*.0 ${rootmnt}
echo "...done"
;;
*)
echo "Unsupported operation: ${1:-}"
;;
esac
16 changes: 16 additions & 0 deletions dracut/31ignition-ostree/ignition-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=initrd-root-fs.target
Before=sysroot.mount
ConditionKernelCommandLine=ostree
ConditionPathIsDirectory=/run/ignition-rootfs

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/run/ignition.env
# So we can transiently mount sysroot
MountFlags=slave
ExecStart=/usr/libexec/ignition-dracut-rootfs restore
18 changes: 18 additions & 0 deletions dracut/31ignition-ostree/ignition-rootfs-save.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[Unit]
Description=Ignition OSTree: save rootfs
DefaultDependencies=false
After=ignition-fetch.service
Before=ignition-disks.service
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
# So we can transiently mount sysroot
MountFlags=slave
ExecStart=/usr/libexec/ignition-dracut-rootfs save
26 changes: 26 additions & 0 deletions dracut/31ignition-ostree/module-setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/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() {
local unit="$1"; shift
local target="${1:-ignition-complete.target}"; shift
local instantiated="${1:-$unit}"; shift
inst_simple "$moddir/$unit" "$systemdsystemunitdir/$unit"
mkdir -p "$initdir/$systemdsystemunitdir/$target.requires"
ln_r "../$unit" "$systemdsystemunitdir/$target.requires/$instantiated"
}

install() {
inst_multiple ostree tar chattr jq

inst_script "$moddir/ignition-dracut-rootfs.sh" \
"/usr/libexec/ignition-dracut-rootfs"

install_ignition_unit ignition-rootfs-save.service
install_ignition_unit ignition-rootfs-restore.service
}

0 comments on commit 54a4beb

Please sign in to comment.