diff --git a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-root-symlink.service b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-root-symlink.service new file mode 100644 index 0000000000..8dd41c7c2e --- /dev/null +++ b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-root-symlink.service @@ -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 + diff --git a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-teardown-initramfs.sh b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-teardown-initramfs.sh index 8fea202022..34c390dc8d 100755 --- a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-teardown-initramfs.sh +++ b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-teardown-initramfs.sh @@ -208,6 +208,9 @@ 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 symlink to disk holding 'root' partition + rm -f /dev/disk/by-label/coreos-root-disk } main diff --git a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/create-root-symlink.sh b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/create-root-symlink.sh new file mode 100755 index 0000000000..48db1e39fc --- /dev/null +++ b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/create-root-symlink.sh @@ -0,0 +1,27 @@ +#!/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 + +# force kernel to update info about disks +for dev in $(lsblk -o NAME --noheadings --nodeps --list --paths); do + partx -u ${dev} +done + +udevadm trigger +udevadm settle + +LINK=/dev/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]} + echo "Creating symlink '${LINK}' to '${PKNAME}' (contains 'root' partition '${NAME}')" + mkdir -p /dev/disk/ + ln -s ${PKNAME} ${LINK} +fi diff --git a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/module-setup.sh b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/module-setup.sh index a42bcc3724..d44212d691 100755 --- a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/module-setup.sh +++ b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/module-setup.sh @@ -22,6 +22,9 @@ install() { diff \ lsblk \ sed \ + sort \ + grep \ + partx \ sgdisk inst_simple "$moddir/coreos-diskful-generator" \ @@ -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" @@ -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 }