Current archiso package does not install initcpio hook files (confirmed: find /usr -path */initcpio/hooks/archiso returns nothing). Write the hook and its mkinitcpio install script directly into the profile airootfs so COPY carries them into the image without any package dependency. Hook finds ISO by archisosearchuuid= kernel param, waits up to 30s for the device to appear via blkid, mounts iso9660→squashfs→overlay onto /new_root. mkinitcpio detects /new_root is already mounted and succeeds. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
56 lines
1.8 KiB
Bash
56 lines
1.8 KiB
Bash
#!/usr/bin/ash
|
|
# Live-boot hook: find ISO by UUID, mount squashfs, set up overlay on /new_root.
|
|
|
|
run_latehook() {
|
|
local _uuid _basedir _dev _img
|
|
|
|
_uuid="$(getarg archisosearchuuid=)"
|
|
_basedir="$(getarg archisobasedir=)"
|
|
: "${_basedir:=arch}"
|
|
|
|
if [ -z "${_uuid}" ]; then
|
|
echo "archiso: archisosearchuuid not set in kernel cmdline"
|
|
return 1
|
|
fi
|
|
|
|
# Wait up to 30 s for a block device with the ISO UUID to appear
|
|
local _waited=0
|
|
while [ "${_waited}" -lt 30 ]; do
|
|
_dev="$(blkid -l -o device -t UUID="${_uuid}" 2>/dev/null)"
|
|
[ -n "${_dev}" ] && break
|
|
sleep 1
|
|
_waited=$(( _waited + 1 ))
|
|
done
|
|
|
|
if [ -z "${_dev}" ]; then
|
|
echo "archiso: could not find boot medium with UUID=${_uuid}"
|
|
return 1
|
|
fi
|
|
|
|
echo "archiso: found boot medium ${_dev}"
|
|
|
|
mkdir -p /run/archiso/bootmnt
|
|
mount -r "${_dev}" /run/archiso/bootmnt || { echo "archiso: mount bootmnt failed"; return 1; }
|
|
|
|
_img="/run/archiso/bootmnt/${_basedir}/x86_64/airootfs.sfs"
|
|
if [ ! -e "${_img}" ]; then
|
|
echo "archiso: squashfs not found at ${_img}"
|
|
return 1
|
|
fi
|
|
|
|
mkdir -p /run/archiso/airootfs
|
|
mount -r -t squashfs "${_img}" /run/archiso/airootfs || { echo "archiso: squashfs mount failed"; return 1; }
|
|
|
|
# RAM-backed writable overlay layer
|
|
mkdir -p /run/archiso/overlay
|
|
mount -t tmpfs tmpfs -o mode=0755 /run/archiso/overlay
|
|
mkdir -p /run/archiso/overlay/upper /run/archiso/overlay/work
|
|
|
|
mkdir -p /new_root
|
|
mount -t overlay overlay \
|
|
-o lowerdir=/run/archiso/airootfs,upperdir=/run/archiso/overlay/upper,workdir=/run/archiso/overlay/work \
|
|
/new_root || { echo "archiso: overlay mount failed"; return 1; }
|
|
|
|
echo "archiso: live root mounted on /new_root"
|
|
}
|