2023-10-31 07:43:40 +00:00
|
|
|
#!/hint/bash -euE
|
|
|
|
# Copyright (C) 2023 Umorpha Systems
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
2023-12-01 17:28:10 +00:00
|
|
|
packages+=(
|
|
|
|
# Normal runtime
|
|
|
|
lvm2
|
|
|
|
|
|
|
|
# Updates
|
|
|
|
arch-install-scripts
|
|
|
|
pv
|
|
|
|
)
|
2023-10-31 07:43:40 +00:00
|
|
|
|
2023-11-04 07:12:33 +00:00
|
|
|
pre_install+=(20:umorpha-disk:pre_install)
|
|
|
|
post_install+=(20:umorpha-disk:post_install)
|
2023-10-31 07:43:40 +00:00
|
|
|
|
|
|
|
umorpha-disk:pre_install() {
|
|
|
|
local arg_mountpoint=$1
|
|
|
|
|
|
|
|
mkdir -p "$arg_mountpoint/etc/pacman.d/hooks"
|
|
|
|
ln -sT /dev/null "$arg_mountpoint/etc/pacman.d/hooks/90-mkinitcpio-install.hook"
|
|
|
|
}
|
|
|
|
|
|
|
|
umorpha-disk:post_install() {
|
|
|
|
local arg_mountpoint=$1
|
|
|
|
|
|
|
|
rm "$arg_mountpoint/etc/pacman.d/hooks/90-mkinitcpio-install.hook"
|
|
|
|
rmdir "$arg_mountpoint/etc/pacman.d/hooks" || true
|
2023-10-31 08:53:18 +00:00
|
|
|
|
2023-10-31 23:18:47 +00:00
|
|
|
########################################################################
|
|
|
|
|
|
|
|
cat >"$arg_mountpoint/etc/mkinitcpio.conf.d/umorpha.conf" <<'EOF'
|
|
|
|
#!/hint/bash
|
|
|
|
# Copyright (C) 2023 Umorpha Systems
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
|
|
|
# Insert 'umorpha-overlayfs' and 'lvm2' into HOOKS.
|
|
|
|
for ((i=0; i<${#HOOKS[@]}; i++)); do
|
|
|
|
if [[ ${HOOKS[i]} == filesystems ]]; then
|
|
|
|
HOOKS=("${HOOKS[@]:0:i}" umorpha-overlayfs lvm2 "${HOOKS[@]:i}" )
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
EOF
|
|
|
|
|
2023-10-31 08:53:18 +00:00
|
|
|
cat >"$arg_mountpoint/usr/lib/initcpio/install/umorpha-overlayfs" <<-'EOF'
|
|
|
|
#!/hint/bash
|
|
|
|
# Copyright (C) 2023 Umorpha Systems
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
|
|
|
build() {
|
2023-10-31 23:18:47 +00:00
|
|
|
add_module 'overlay'
|
2023-10-31 08:53:18 +00:00
|
|
|
|
2023-10-31 23:18:47 +00:00
|
|
|
add_runscript
|
2023-10-31 08:53:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
help() {
|
2023-10-31 23:18:47 +00:00
|
|
|
cat <<HELPEOF
|
2023-10-31 08:53:18 +00:00
|
|
|
This hook mounts a read-only root filesystem with a persistent
|
|
|
|
overlayfs on top of it.
|
|
|
|
|
|
|
|
Boot parameters:
|
|
|
|
- overlay_root
|
|
|
|
- overlay_rootfstype
|
|
|
|
- overlay_rootflags
|
2023-10-31 23:18:47 +00:00
|
|
|
- boot
|
|
|
|
- bootfstype
|
|
|
|
- bootflags
|
|
|
|
HELPEOF
|
2023-10-31 08:53:18 +00:00
|
|
|
}
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >"$arg_mountpoint/usr/lib/initcpio/hooks/umorpha-overlayfs" <<-'EOF'
|
2023-11-09 22:42:46 +00:00
|
|
|
#!/hint/ash
|
2023-10-31 08:53:18 +00:00
|
|
|
# Copyright (C) 2023 Umorpha Systems
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
|
|
|
# args: errmsg
|
|
|
|
umorpha_emergency_shell() {
|
2023-10-31 23:18:47 +00:00
|
|
|
run_hookfunctions 'run_emergencyhook' 'emergency hook' $EMERGENCYHOOKS
|
|
|
|
err "$*"
|
|
|
|
echo "You are now being dropped into an emergency shell."
|
|
|
|
launch_interactive_shell
|
|
|
|
msg "Trying to continue (this will most likely fail) ..."
|
2023-10-31 08:53:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# args: /path/to/newroot
|
|
|
|
umorpha_mount_handler() {
|
2023-10-31 23:18:47 +00:00
|
|
|
local newroot="$1"
|
|
|
|
|
|
|
|
msg ":: mounting '$root'+'$overlay_root' on real root"
|
|
|
|
mkdir -p /run/umorpha-root/root /run/umorpha-root/overlay
|
|
|
|
local mnt_root=/run/umorpha-root/root
|
|
|
|
local mnt_overlay=/run/umorpha-root/overlay
|
|
|
|
if ! mount -t "${rootfstype:-auto}" -o "ro${rootflags:+,$rootflags}" "$root" "$mnt_root"; then
|
|
|
|
umorpha_emergency_shell "Failed to mount root '$root'"
|
|
|
|
fi
|
|
|
|
if ! mount -t "${overlay_rootfstype:-auto}" -o "${rwopt:-ro}${overlay_rootflags:+,$overlayrootflags}" "$overlay_root" "$mnt_overlay"; then
|
|
|
|
umorpha_emergency_shell "Failed to mount overlay root '$overlay_root'"
|
|
|
|
fi
|
|
|
|
mkdir -p -- "$mnt_overlay/upperdir" "$mnt_overlay/workdir"
|
2023-12-01 17:47:36 +00:00
|
|
|
local overlay_opts
|
|
|
|
overlay_opts="lowerdir=${mnt_root}"
|
|
|
|
overlay_opts+=",upperdir=${mnt_overlay}/upperdir"
|
|
|
|
overlay_opts+=",workdir=${mnt_overlay}/workdir"
|
|
|
|
# > Offline changes to the lower tree are only allowed if the
|
|
|
|
# > "metadata only copy up", "inode index", "xino" and
|
|
|
|
# > "redirect_dir" features have not been used.
|
|
|
|
#
|
|
|
|
# -- https://www.kernel.org/doc/html/v6.6/filesystems/overlayfs.html#changes-to-underlying-filesystems
|
|
|
|
overlay_opts+=',metacopy=off'
|
|
|
|
overlay_opts+=',index=off'
|
|
|
|
overlay_opts+=',xino=off'
|
|
|
|
overlay_opts+=',redirect_dir=off'
|
|
|
|
if ! mount -t overlay -o "$overlay_opts" umorpha-rootfs "$newroot"; then
|
2023-10-31 23:18:47 +00:00
|
|
|
umorpha_emergency_shell "Failed to mount overlayfs lowerdir='${mnt_root}' overlaydir='${mnt_overlay}'"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -n "$boot" ]; then
|
|
|
|
local bootdev
|
|
|
|
if bootdev=$(resolve_device "$boot"); then
|
|
|
|
case "$boot" in
|
|
|
|
'UUID='* | 'LABEL='* | 'PARTUUID='* | 'PARTLABEL='*) : ;;
|
|
|
|
*) boot="$bootdev" ;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
msg ":: mounting '${boot}' on /boot"
|
|
|
|
if ! mount -t "${bootfstype:-auto}" -o "${rwopt:-ro}${bootflags:+,$bootflags}" "$boot" "$newroot/boot"; then
|
|
|
|
umorpha_emergency_shell "Failed to mount boot '$boot'"
|
|
|
|
fi
|
|
|
|
fi
|
2023-10-31 08:53:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
run_hook() {
|
2023-10-31 23:18:47 +00:00
|
|
|
export mount_handler='umorpha_mount_handler'
|
2023-10-31 08:53:18 +00:00
|
|
|
}
|
|
|
|
EOF
|
2023-10-31 07:43:40 +00:00
|
|
|
}
|