Newer
Older
dracut-overlayfs / 90overlay / overlay-generator.sh
#!/bin/sh

# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright 2021 Jookia <contact@jookia.org>

type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh

GENERATOR_DIR="$2"
[ -z "$GENERATOR_DIR" ] && exit 1
[ -z "$root" ] && root=$(getarg root=)
[ -z "$overlay" ] && overlay=$(getarg overlay=)
[ -z "$overlay" ] && return 0

derefed=""
deref_dev() {
case "${1}" in
    block:LABEL=*|LABEL=*)
        derefed="${1#block:}"
        derefed="$(echo "$derefed" | sed 's,/,\\x2f,g')"
        derefed="/dev/disk/by-label/${derefed#LABEL=}"
	;;
    block:UUID=*|UUID=*)
        derefed="${1#block:}"
        derefed="/dev/disk/by-uuid/${derefed#UUID=}"
	;;
    block:PARTUUID=*|PARTUUID=*)
        derefed="${1#block:}"
        derefed="/dev/disk/by-partuuid/${derefed#PARTUUID=}"
	;;
    block:PARTLABEL=*|PARTLABEL=*)
        derefed="${1#block:}"
        derefed="/dev/disk/by-partlabel/${derefed#PARTLABEL=}"
	;;
    /dev/*)
        derefed="block:${1}"
	;;
esac
}

deref_dev "${overlay}"
overlay_data="${derefed}"
deref_dev "${root}"
overlay_root="${derefed}"
fsck_data="systemd-fsck@$(systemd-escape -p "${overlay_data}").service"
fsck_root="systemd-fsck@$(systemd-escape -p "${overlay_root}").service"

{
    echo "# generated by dracut"
    echo "[Unit]"
    echo "Before=initrd-root-fs.target"
    echo "RequiresMountsFor=/run"
    echo "Wants=${fsck_data}"
    echo "After=${fsck_data}"
    echo "[Mount]"
    echo "Where=/run/overlay"
    echo "What=${overlay_data}"
    echo "Options=defaults"
} > "$GENERATOR_DIR"/run-overlay.mount
{
    echo "# generated by dracut"
    echo "[Unit]"
    echo "Before=initrd-root-fs.target"
    echo "RequiresMountsFor=/run/overlay"
    echo "Wants=${fsck_root}"
    echo "After=${fsck_root}"
    echo "[Mount]"
    echo "Where=/run/overlay/lower"
    echo "What=${overlay_root}"
    echo "Options=defaults,ro"
} > "$GENERATOR_DIR"/run-overlay-lower.mount
{
    echo "# generated by dracut"
    echo "[Unit]"
    echo "Before=initrd-root-fs.target"
    echo "RequiresMountsFor=/run/overlay /run/overlay/lower"
    echo "[Mount]"
    echo "Where=/sysroot"
    echo "What=overlay"
    echo "Type=overlay"
    echo "Options=lowerdir=/run/overlay/lower,upperdir=/run/overlay/upper,workdir=/run/overlay/work,index=off,metacopy=off"
} > "$GENERATOR_DIR"/sysroot.mount