Skip to content

Commit

Permalink
overlay.d: create udev rule for stable-root disk
Browse files Browse the repository at this point in the history
Issue: coreos/fedora-coreos-tracker#759

Signed-off-by: Nikita Dubrovskii <nikita@linux.ibm.com>
  • Loading branch information
nikita-dubrovskii committed Nov 10, 2021
1 parent f04d50e commit a8626c7
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[Unit]
Description=Create symlink to boot disk
ConditionPathExists=/etc/initrd-release
DefaultDependencies=no
Wants=systemd-udevd.service
After=systemd-udevd.service

Requires=dev-disk-by\x2dlabel-root.device
After=dev-disk-by\x2dlabel-root.device
# And since the boot device may be on multipath; optionally wait for it to
# appear via the dynamic target.
After=coreos-multipath-wait.target
After=coreos-gpt-setup.service
Before=ignition-disks.service

OnFailure=emergency.target
OnFailureJobMode=isolate

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/create-root-symlink

Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,12 @@ main() {
# clean it up so that no information from outside of the
# real root is passed on to NetworkManager in the real root
rm -rf /run/NetworkManager/

# Remove udev rule for symlink to disk holding 'root' partition
rm -f /run/udev/rules.d/99-stable-root.rules
udevadm control --reload-rules
udevadm trigger
udevadm settle
}

main
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/bin/bash
# creates a stable device path for the boot disk when there's exactly one such disk,
# and create no such symlink in other cases (e.g. rootfs RAID)
# Symlink is not propogated to the real root (removed during coreos-teardown-initramfs)

set -euo pipefail

udev_trigger() {
udevadm trigger
udevadm settle
}

# force kernel to update info about disks
for dev in $(lsblk -o NAME --noheadings --nodeps --list --paths); do
partx -u ${dev} || true
done
udev_trigger

LINK=disk/coreos-root-disk
PARTITIONS=()
# skip multipath disks (with same WWN)
mapfile -t PARTITIONS < <(lsblk -o WWN,LABEL,NAME,PKNAME --pairs --paths --noheadings | grep 'LABEL="root"' | sed 's/WWN=\"\" //' | sort -u -k1,2)

LENGTH=${#PARTITIONS[@]}
if [[ ${LENGTH} -eq 1 ]]; then
eval ${PARTITIONS[0]}
eval $(udevadm info --name ${PKNAME} --query property | grep -e SUBSYSTEM= -e ID_SERIAL=)
echo "Creating symlink '${LINK}' to '${PKNAME}' (contains 'root' partition '${NAME}')"
mkdir -p /run/udev/rules.d/
echo "SUBSYSTEM==\"${SUBSYSTEM}\", ENV{ID_SERIAL}==\"${ID_SERIAL}\", SYMLINK+=\"${LINK}\"" > /run/udev/rules.d/99-stable-root.rules
udevadm control --reload-rules
udev_trigger
fi
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ install() {
diff \
lsblk \
sed \
sort \
grep \
partx \
sgdisk

inst_simple "$moddir/coreos-diskful-generator" \
Expand All @@ -30,6 +33,9 @@ install() {
inst_script "$moddir/coreos-gpt-setup.sh" \
"/usr/sbin/coreos-gpt-setup"

inst_script "$moddir/create-root-symlink.sh" \
"/usr/sbin/create-root-symlink"

inst_script "$moddir/coreos-ignition-setup-user.sh" \
"/usr/sbin/coreos-ignition-setup-user"

Expand All @@ -56,4 +62,7 @@ install() {
"ignition-diskful.target"

install_ignition_unit coreos-ignition-setup-user.service

install_ignition_unit coreos-root-symlink.service \
ignition-diskful.target
}
10 changes: 10 additions & 0 deletions tests/kola/ignition/stable-root/config.bu
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
variant: fcos
version: 1.3.0
storage:
disks:
- device: /dev/disk/coreos-root-disk
wipe_table: false
partitions:
- number: 5
size_mib: 1024
label: toor
31 changes: 31 additions & 0 deletions tests/kola/ignition/stable-root/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/bin/bash
set -xeuo pipefail

# This test makes sure that ignition is able to use symlink to the disk with `root` fs

# We don't need to test this on every platform. If it passes in
# one place it will pass everywhere.
# kola: { "platforms": "qemu-unpriv" }

ok() {
echo "ok" "$@"
}

fatal() {
echo "$@" >&2
exit 1
}

unit="coreos-root-symlink.service"
link="/dev/disk/coreos-root-disk"

eval $(journalctl -o export MESSAGE_ID=39f53479d3a045ac8e11786248231fbf -u ${unit} | grep JOB_RESULT)
if [[ "${JOB_RESULT}" != "done" ]]; then
fatal "${unit} failed"
fi

if [[ -h ${link} ]]; then
fatal "${unit} failed: ${link} still exists"
fi

ok "${unit} is ok"

0 comments on commit a8626c7

Please sign in to comment.