[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