dmsquash-live: install a sysroot.mount generator for systemd
[dracut.git] / modules.d / 98dracut-systemd / rootfs-generator.sh
blob5910ce75f56ef923aa58326652504ef74a8e1652
1 #!/bin/sh
3 type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
5 generator_wait_for_dev()
7 local _name
8 local _timeout
10 _name="$(str_replace "$1" '/' '\x2f')"
11 _timeout=$(getarg rd.timeout)
12 _timeout=${_timeout:-0}
14 if ! [ -e "$hookdir/initqueue/finished/devexists-${_name}.sh" ]; then
16 printf '[ -e "%s" ]\n' $1 \
17 >> "$hookdir/initqueue/finished/devexists-${_name}.sh"
19 printf '[ -e "%s" ] || ' $1
20 printf 'warn "\"%s\" does not exist"\n' $1
21 } >> "$hookdir/emergency/80-${_name}.sh"
24 _name=$(dev_unit_name "$1")
25 if ! [ -L "$GENERATOR_DIR"/initrd.target.wants/${_name}.device ]; then
26 [ -d "$GENERATOR_DIR"/initrd.target.wants ] || mkdir -p "$GENERATOR_DIR"/initrd.target.wants
27 ln -s ../${_name}.device "$GENERATOR_DIR"/initrd.target.wants/${_name}.device
30 if ! [ -f "$GENERATOR_DIR"/${_name}.device.d/timeout.conf ]; then
31 mkdir -p "$GENERATOR_DIR"/${_name}.device.d
33 echo "[Unit]"
34 echo "JobTimeoutSec=$_timeout"
35 } > "$GENERATOR_DIR"/${_name}.device.d/timeout.conf
39 generator_mount_rootfs()
41 local _type=$2
42 local _flags=$3
43 local _name
45 [ -z "$1" ] && return 0
47 _name=$(dev_unit_name "$1")
48 [ -d "$GENERATOR_DIR" ] || mkdir -p "$GENERATOR_DIR"
49 if ! [ -f "$GENERATOR_DIR"/sysroot.mount ]; then
51 echo "[Unit]"
52 echo "Before=initrd-root-fs.target"
53 echo "RequiresOverridable=systemd-fsck@${_name}.service"
54 echo "After=systemd-fsck@${_name}.service"
55 echo "[Mount]"
56 echo "Where=/sysroot"
57 echo "What=$1"
58 echo "Options=${_flags}"
59 echo "Type=${_type}"
60 } > "$GENERATOR_DIR"/sysroot.mount
62 if ! [ -L "$GENERATOR_DIR"/initrd-root-fs.target.requires/sysroot.mount ]; then
63 [ -d "$GENERATOR_DIR"/initrd-root-fs.target.requires ] || mkdir -p "$GENERATOR_DIR"/initrd-root-fs.target.requires
64 ln -s ../sysroot.mount "$GENERATOR_DIR"/initrd-root-fs.target.requires/sysroot.mount
68 root=$(getarg root=)
69 case "$root" in
70 block:LABEL=*|LABEL=*)
71 root="${root#block:}"
72 root="$(echo $root | sed 's,/,\\x2f,g')"
73 root="block:/dev/disk/by-label/${root#LABEL=}"
74 rootok=1 ;;
75 block:UUID=*|UUID=*)
76 root="${root#block:}"
77 root="block:/dev/disk/by-uuid/${root#UUID=}"
78 rootok=1 ;;
79 block:PARTUUID=*|PARTUUID=*)
80 root="${root#block:}"
81 root="block:/dev/disk/by-partuuid/${root#PARTUUID=}"
82 rootok=1 ;;
83 block:PARTLABEL=*|PARTLABEL=*)
84 root="${root#block:}"
85 root="block:/dev/disk/by-partlabel/${root#PARTLABEL=}"
86 rootok=1 ;;
87 /dev/nfs) # ignore legacy /dev/nfs
89 /dev/*)
90 root="block:${root}"
91 rootok=1 ;;
92 esac
94 GENERATOR_DIR="$1"
96 if [ "${root%%:*}" = "block" ]; then
97 generator_wait_for_dev "${root#block:}" "$RDRETRY"
98 strstr "$(cat /proc/cmdline)" 'root=' || generator_mount_rootfs "${root#block:}" "$(getarg rootfstype=)" "$(getarg rootflags=)"
101 exit 0