[projects/geninitrd] add basic wait for root device

atler atler at pld-linux.org
Thu Dec 11 01:20:20 CET 2025


commit 240c5d53e4ad19c147a1871a7ca1a3a38623b39f
Author: Jan Palus <atler at pld-linux.org>
Date:   Thu Dec 11 01:14:16 2025 +0100

    add basic wait for root device
    
    in future should be extended to lower block layers or if possible only
    to wait on physical block devices

 geninitrd           | 36 ++++++++++++++++++++++++++++++++++++
 geninitrd.sysconfig |  5 ++++-
 mod-blkid.sh        | 40 ++++++++++++++++++++++++++++++++++------
 3 files changed, 74 insertions(+), 7 deletions(-)
---
diff --git a/geninitrd b/geninitrd
index f319b84..fa62d58 100755
--- a/geninitrd
+++ b/geninitrd
@@ -1372,6 +1372,10 @@ while [ $# -gt 0 ]; do
 	--ide-only-root)
 		ide_only_root="yes"
 		;;
+	--wait-block-dev)
+		WAIT_BLOCK_DEV=$2
+		shift
+		;;
 	*)
 		if [ -z "$target" ]; then
 			target="$1"
@@ -1719,6 +1723,37 @@ else
 fi
 
 initrd_gen_uvesafb
+
+initrd_gen_blkid_functions
+busybox_applet usleep
+echo "WAIT_BLOCK_DEV=${WAIT_BLOCK_DEV:-0}" | add_linuxrc
+add_linuxrc <<-'EOF'
+	wait_blk_dev() {
+		local delay=0 dev="$1"
+		while [ $delay -lt $WAIT_BLOCK_DEV ]; do
+			if [ "${1#/dev/}" != "$1" ]; then
+				dev="$1"
+			else
+				dev=$(find_blk_dev_blkid "$1")
+
+				if [ "$?" = "2" ]; then
+					break
+				fi
+			fi
+			if [ -n "$dev" ] && [ -b "$dev" ]; then
+				return 0
+			else
+				usleep 1000000
+				delay=$((delay+1))
+			fi
+		done
+		if [ $delay -gt 0 ]; then
+			echo "Timeout reached while waiting for device '$1'"
+		fi
+		[ "${1#/dev/}" != "$1" ] && test -b "$dev"
+	}
+EOF
+
 initrd_gen_luks
 initrd_gen_dmraid
 initrd_gen_multipath
@@ -1730,6 +1765,7 @@ else
 	initrd_gen_lvm
 	initrd_gen_bcache
 	initrd_gen_luks
+	echo 'wait_blk_dev "$ROOT"' | add_linuxrc
 	initrd_gen_blkid
 	initrd_gen_setrootdev
 fi
diff --git a/geninitrd.sysconfig b/geninitrd.sysconfig
index db80009..e205e49 100644
--- a/geninitrd.sysconfig
+++ b/geninitrd.sysconfig
@@ -52,4 +52,7 @@ USE_UDEV=yes
 #MODULE_qla2xxx_FIRMWARE="ql2300_fw.bin"
 
 # wait (in seconds) for FIDO2 token insertion when decrypting LUKS device
-# FIDO2_TOKEN_TIMEOUT=30
+#FIDO2_TOKEN_TIMEOUT=30
+
+# wait (in seconds) for block device to appear
+#WAIT_BLOCK_DEV=0
diff --git a/mod-blkid.sh b/mod-blkid.sh
index 92df9ae..085ae12 100644
--- a/mod-blkid.sh
+++ b/mod-blkid.sh
@@ -14,6 +14,37 @@ setup_mod_blkid() {
 	fi
 }
 
+# generate initrd functions
+# @access	public
+initrd_gen_blkid_functions() {
+	if ! is_yes "$USE_BLKID"; then
+		add_linuxrc <<-'EOF'
+			find_blk_dev_blkid() {
+				return 2
+			}
+		EOF
+		return
+	fi
+
+	inst_exec $blkid /sbin/blkid
+	add_linuxrc <<-'EOF'
+		find_blk_dev_blkid() {
+			local blkid
+			# if built with blkid change ROOT=LABEL=something into ROOT=/dev/device parsed by blkid
+			if [ "${1##LABEL=}" != "${1}" -o "${1##UUID=}" != "${1}" ]; then
+				blkid="$(/sbin/blkid -t $1 -o device -l)"
+				if [ -n "$blkid" ]; then
+					echo $blkid
+					return 0
+				fi
+				return 1
+			else
+				return 2
+			fi
+		}
+	EOF
+}
+
 # generate initrd fragment
 # @access	public
 initrd_gen_blkid() {
@@ -25,12 +56,9 @@ initrd_gen_blkid() {
 	inst_exec $blkid /sbin/blkid
 	initrd_gen_devices
 	add_linuxrc <<-'EOF'
-		# if built with blkid change ROOT=LABEL=something into ROOT=/dev/device parsed by blkid
-		if [ "${ROOT##LABEL=}" != "${ROOT}" -o "${ROOT##UUID=}" != "${ROOT}" ]; then
-			blkid="$(/sbin/blkid -t $ROOT -o device -l)"
-			if [ -n "$blkid" ]; then
-				ROOT=$blkid
-			fi
+		blkid=$(find_blk_dev_blkid "$ROOT")
+		if [ -n "$blkid" ]; then
+			ROOT=$blkid
 		fi
 	EOF
 }
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/projects/geninitrd.git/commitdiff/240c5d53e4ad19c147a1871a7ca1a3a38623b39f



More information about the pld-cvs-commit mailing list