#!/bin/busybox sh # Stage-1 rc: sourced by /init (still PID 1, initramfs root) when a virtio # disk is present. Emulates U-Boot's slot choice — parse warden.slot= from the # cmdline, mount that rootfs, switch_root into it. This is an EMULATION of the # A/B selection outcome, not the BCB/bootcount mechanism itself. # /dev/block/by-name/ symlinks: the contract flare-edge slotctl.rs # relies on. blkdevparts= gives every vda partition a PARTNAME in sysfs. mkdir -p /dev/block/by-name for uev in /sys/class/block/vda*/uevent; do [ -f "$uev" ] || continue partname="" devname="" while IFS='=' read -r k v; do case "$k" in PARTNAME) partname="$v" ;; DEVNAME) devname="$v" ;; esac done < "$uev" [ -n "$partname" ] && [ -n "$devname" ] \ && ln -sf "/dev/$devname" "/dev/block/by-name/$partname" done # Slot select: whole-token parse of warden.slot= (never a substring match). slot="_a" for tok in $(cat /proc/cmdline); do case "$tok" in warden.slot=*) slot="${tok#warden.slot=}" ;; esac done case "$slot" in _a|_b) ;; *) echo "rc: bad warden.slot='$slot', falling back to _a"; slot="_a" ;; esac root="/dev/block/by-name/rootfs${slot}" if [ ! -e "$root" ]; then echo "rc: $root missing — staying in initramfs" return 0 fi mkdir -p /mnt if ! mount -t ext4 "$root" /mnt; then echo "rc: mount of $root failed — staying in initramfs" return 0 fi if [ ! -x /mnt/sbin/init ]; then echo "rc: $root has no /sbin/init — staying in initramfs" umount /mnt return 0 fi echo "rc: switching root to rootfs${slot} ($root)" exec switch_root /mnt /sbin/init