summaryrefslogtreecommitdiffstats
path: root/modules.d/98dracut-systemd/dracut-mount.sh
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/98dracut-systemd/dracut-mount.sh')
-rwxr-xr-xmodules.d/98dracut-systemd/dracut-mount.sh38
1 files changed, 38 insertions, 0 deletions
diff --git a/modules.d/98dracut-systemd/dracut-mount.sh b/modules.d/98dracut-systemd/dracut-mount.sh
new file mode 100755
index 0000000..7892941
--- /dev/null
+++ b/modules.d/98dracut-systemd/dracut-mount.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+export DRACUT_SYSTEMD=1
+if [ -f /dracut-state.sh ]; then
+ . /dracut-state.sh 2> /dev/null
+fi
+type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+source_conf /etc/conf.d
+
+make_trace_mem "hook mount" '1:shortmem' '2+:mem' '3+:slab'
+
+getarg 'rd.break=mount' -d 'rdbreak=mount' && emergency_shell -n mount "Break before mount"
+# mount scripts actually try to mount the root filesystem, and may
+# be sourced any number of times. As soon as one succeeds, no more are sourced.
+i=0
+while :; do
+ if ismounted "$NEWROOT"; then
+ usable_root "$NEWROOT" && break
+ umount "$NEWROOT"
+ fi
+ for f in "$hookdir"/mount/*.sh; do
+ # shellcheck disable=SC1090
+ [ -f "$f" ] && . "$f"
+ if ismounted "$NEWROOT"; then
+ usable_root "$NEWROOT" && break
+ warn "$NEWROOT has no proper rootfs layout, ignoring and removing offending mount hook"
+ umount "$NEWROOT"
+ rm -f -- "$f"
+ fi
+ done
+
+ i=$((i + 1))
+ [ $i -gt 20 ] && emergency_shell "Can't mount root filesystem"
+done
+
+export -p > /dracut-state.sh
+
+exit 0