I have this weird issue where my boot process hangs for exactly 2 minutes at “A start job is running for dracut innitqueue hook” before proceeding to boot normally, so the system is usable but the issue is annoying.
sudo dracut --force --regenerate-all nor sudo dracut-rebuild fixes anything.
Happens on linux 6.17.7-arch1-1 and 6.17.7-arch1-2, downgrading to linux 6.17.6 fixes the issue, is this a known issue with the 6.17.7 kernel or am I doing something wrong?
kIERO
May 31, 2026, 10:38am
2
Me too, spent the last few hours debugging. Are you using “dash” by any chance in dracut?
opened 07:44AM - 11 May 26 UTC
bug
**Describe the bug**
Two separate machines with Arch Linux, dracut-110 and LVM … + dm-crypt stuck waiting for dracut-initqueue.service after everything needed to boot seem to be activated already.
Using Alt-SysRq-E to kill stuck initramfs processes continues boot on rootfs as normal.
**Distribution used**
Arch Linux (current rolling release)
**Dracut version**
dracut-110
dash 0.5.13.2-1 (Arch package)
**Init system**
systemd
**To Reproduce**
- Create LVM + dm-crypt setup, doesn't matter in which order.
- Use rd.luks.uuid=... + rd.lvm.vg=... cmdline options to wait for expected rootfs VG/device.
- Build dracut-110, hostonly mode doesn't seem to affect this for me.
- Boot, unlock LUKS in whatever fashion, observe dracut-initqueue.service hanging.
**Expected behavior**
- Boot proceeds as normal to rootfs after unlocking LUKS device.
**Additional context**
With `rd.debug`, after using Alt-SysRq-E to kill stuck initqueue and continue booting, can observe the following in `journalctl -ab`:
```
May 09 12:15:26 systemd[1]: dev-disk-by\x2dlabel-m3.root.device: Changed dead -> plugged
May 09 12:15:26 systemd[1]: dev-disk-by\x2dlabel-m3.root.device: Job 39 dev-disk-by\x2dlabel-m3.root.device/start finished, result=done
...
May 09 12:15:26 systemd[1]: Finished systemd-cryptsetup@luks\x2db51799fd\x2df41a\x2d4eac\x2da1e2\x2dfef1d4cb4edf.service.
...
May 09 12:15:26 dracut-initqueue[949]: + local hook
May 09 12:15:26 dracut-initqueue[949]: + [ -f /var/lib/dracut/hooks/initqueue/finished/90-crypt.sh ]
May 09 12:15:26 dracut-initqueue[949]: + echo /var/lib/dracut/hooks/initqueue/finished/90-crypt.sh
May 09 12:15:26 dracut-initqueue[949]: + [ -f /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fdisk\x2fby-label\x2fm3.root.sh ]
May 09 12:15:26 dracut-initqueue[949]: + echo /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fdisk\x2fby-label\x2fm3.root.sh
May 09 12:15:26 dracut-initqueue[949]: + [ -f /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fm3.sh ]
May 09 12:15:26 dracut-initqueue[949]: + echo /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fm3.sh
May 09 12:15:26 dracut-initqueue[949]: + [ -f /etc/dracut/hooks/initqueue/finished/*.sh ]
May 09 12:15:26 dracut-initqueue[949]: + [ -f /usr/lib/dracut/hooks/initqueue/finished/*.sh ]
May 09 12:15:26 dracut-initqueue[482]: + [ -e /var/lib/dracut/hooks/initqueue/finished/90-crypt.sh ]
May 09 12:15:26 dracut-initqueue[950]: + . /var/lib/dracut/hooks/initqueue/finished/90-crypt.sh
May 09 12:15:26 dracut-initqueue[950]: + [ -e /dev/disk/by-id/dm-uuid-CRYPT-LUKS2-b51799fdf41a4eaca1e2fef1d4cb4edf-luks-b51799fd-f41a-4eac-a1e2-fef1d4cb4edf ]
May 09 12:15:26 dracut-initqueue[482]: + rm -f /var/lib/dracut/hooks/initqueue/finished/90-crypt.sh
May 09 12:15:26 dracut-initqueue[482]: + [ -e /var/lib/dracut/hooks/initqueue/finished/devexists-/dev/disk/by-label/m3.root.sh ]
May 09 12:15:26 dracut-initqueue[482]: + rc=1
May 09 12:15:26 dracut-initqueue[482]: + [ -e /var/lib/dracut/hooks/initqueue/finished/devexists-/dev/m3.sh ]
May 09 12:15:26 dracut-initqueue[482]: + rc=1
May 09 12:15:26 dracut-initqueue[482]: + return 1
...
May 09 12:15:35 dracut-initqueue[482]: + udevadm settle --exit-if-exists=/var/lib/dracut/hooks/initqueue/work
May 09 12:15:35 dracut-initqueue[482]: + check_finished
May 09 12:15:35 dracut-initqueue[482]: + local f rc=0
May 09 12:15:35 dracut-initqueue[1089]: + local hook
May 09 12:15:35 dracut-initqueue[1089]: + [ -f /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fdisk\x2fby-label\x2fm3.root.sh ]
May 09 12:15:35 dracut-initqueue[1089]: + echo /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fdisk\x2fby-label\x2fm3.root.sh
May 09 12:15:35 dracut-initqueue[1089]: + [ -f /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fm3.sh ]
May 09 12:15:35 dracut-initqueue[1089]: + echo /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fm3.sh
May 09 12:15:35 dracut-initqueue[1089]: + [ -f /etc/dracut/hooks/initqueue/finished/*.sh ]
May 09 12:15:35 dracut-initqueue[1089]: + [ -f /usr/lib/dracut/hooks/initqueue/finished/*.sh ]
May 09 12:15:35 dracut-initqueue[482]: + [ -e /var/lib/dracut/hooks/initqueue/finished/devexists-/dev/disk/by-label/m3.root.sh ]
May 09 12:15:35 dracut-initqueue[482]: + rc=1
May 09 12:15:35 dracut-initqueue[482]: + [ -e /var/lib/dracut/hooks/initqueue/finished/devexists-/dev/m3.sh ]
May 09 12:15:35 dracut-initqueue[482]: + rc=1
May 09 12:15:35 dracut-initqueue[482]: + return 1
...
```
Last block of lines is repeated in an endless loop.
Looking into initqueue process, I believe this debug-output is from check_finished() routine in dracut-lib.sh:
```
check_finished() {
local f rc=0
for f in $(list_hooks "initqueue/finished"); do
# shellcheck disable=SC1090
if [ -e "$f" ] && (. "$f"); then
rm -f "$f"
else
rc=1
fi
done
return $rc
}
```
And there I think there's an odd mismatch between:
- `echo /var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fdisk\x2fby-label\x2fm3.root.sh` line in a pid-1089 subshell of list_hooks.
- `[ -e /var/lib/dracut/hooks/initqueue/finished/devexists-/dev/disk/by-label/m3.root.sh ]` which follows for that hook.
And latter `.../initqueue/finished/devexists-/dev/disk/by-label/m3.root.sh` is likely a bogus path, as surely dracut won't be creating subdirs for each slash in the dev name needlessly like that.
So intended action, like demonstrated with `/var/lib/dracut/hooks/initqueue/finished/90-crypt.sh` in output above, is to double-check that hook still exists and run it.
But actual thing happening is that `-e` tests wrong path (with `\x2f` expanded into `/` characters), and hooks never run or get removed, causing an endless loop.
In both places where this happens, I have:
```
add_dracutmodules+=" base dash btrfs crypt dm lvm terminfo rootfs-block fs-lib udev-rules kernel-modules systemd systemd-initrd dracut-systemd "
omit_dracutmodules+=" bash ...<many-other-modules-not-relevant-on-the-system> "
```
./lsinitrd.sh also confirms that there is no "bash" binary and `usr/bin/sh -> dash` symlink, and trying this with bash vs dash I indeed get different results:
```
% bash -c 'echo "/var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fm3.sh"'
/var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fm3.sh
% dash -c 'echo "/var/lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2fm3.sh"'
/var/lib/dracut/hooks/initqueue/finished/devexists-/dev/m3.sh
```
So I think this might be change in how "dash" shell interprets C hex-escape sequences (didn't check whether intentional or not, dash release 0.5.13.2), and dracut failure caused by this, which maybe should be fixed in dracut too, by adding some kind of escaping, using `printf` instead of `echo`, or maybe dash shopt to not do this (don't know what'd work off the top of my head).
This might affect more than dm-crypt/lvm, but at least that's where these initqueue/finished hooks seem to be used on my system.
I might be wrong of course, didn't test using "bash" instead of "dash" in dracut yet (don't want to reboot atm).
Thanks.
main ← fiftydinar:patch-1
opened 07:59AM - 25 May 26 UTC
… due to `echo` translation of `\x2f` character
Without this fix, boot was de… layed around 5 minutes and a bunch of errors popped-up, like:
```
dracut-initqueue[349]: Warning: /var/lib/dracut/hooks/initqueue/finished/devexists-/dev/disk/by-uuid/734eed01-7ac0-4200-bdb7-2c91aa668d30.sh: ""
```
```
dracut-initqueue[2341]: cat: /var/lib/dracut/hooks/initqueue/finished/devexists-/dev/disk/by-uuid/734eed01-7ac0-4200-bdb7-2c91aa668d30.sh: No such file or directory
```
1. `parse-root.sh` creates a "devexis ts" hook file to wait for the root device (/dev/disk/by-uuid/...). The / in the device path is escaped to \x2f in the filename via str_replace(), producing a file named devexis ts-\x2fdev\x2fdisk\x2fby-uuid\x2f....sh.
2. list_hooks() finds this file via glob ([ -f "$hook" ] succeeds), but then outputs it with echo "$hook".
3. Dash's echo interprets \x2f as a hex escape for / (0x2f = 47 = /), corrupting the path. The caller (check_finished(), source_hook()) receives a path with literal / instead of \x2f, which doesn't point to a real file.
4. check_finished() can never find the real hook → returns "not finished" → initqueue loops for 3.5 minutes until timeout.
### Checklist
- [x] I have tested it locally
- [x] I have reviewed and updated any documentation if relevant
- [ ] I am providing new code and test(s) for it
the patch is simple: https://patch-diff.githubusercontent.com/raw/dracut-ng/dracut/pull/2453.patch