#!/usr/bin/ash archiso_mount_handler() { local _new_root="$1" local _uuid _label _basedir _dev _img _uuid="$(getarg archisosearchuuid=)" _label="$(getarg archisolabel=)" _basedir="$(getarg archisobasedir=)" : "${_basedir:=arch}" if [ -z "${_uuid}" ] && [ -z "${_label}" ]; then echo "archiso: neither archisosearchuuid nor archisolabel set in kernel cmdline" return 1 fi local _waited=0 while [ "${_waited}" -lt 30 ]; do if [ -n "${_uuid}" ]; then _dev="$(blkid -l -o device -t UUID="${_uuid}" 2>/dev/null)" else _dev="$(blkid -l -o device -t LABEL="${_label}" 2>/dev/null)" fi [ -n "${_dev}" ] && break sleep 1 _waited=$(( _waited + 1 )) done if [ -z "${_dev}" ]; then echo "archiso: could not find boot medium (uuid=${_uuid} label=${_label})" 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; } 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 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}" } run_hook() { mount_handler="archiso_mount_handler" }