?wiki:initramfs-tools is used in Debian to build the initramfs that contains the early userspace and the needed kernel modules to be able to mount any possible root.

Boot

Boot with rootdelay=9 to shorten the time of waiting for the root device to come up. Also it adds time to scsi device to settle before calling mdadm or lvm thus excluding potential races.

Rescue shell (also known as initramfs shell)

Read man initramfs-tools to learn about the break= kernel parameter, which starts a debug shell. You can try, for example, break=premount. You can edit /boot/grub/menu.lst to add this to the end of the kernel line, or you can do it interactively from the grub boot menu: "e" to edit, and "b" to boot once you've edited the kernel line.

Ok, now you landed in the initramfs debug shell. This is a surprisingly complete environment provided by "busybox". You can use vi, for example, but not everything is fully the same as bash. For example, sleep only accepts integer arguments. You may find more complete commands in /bin (for example, /bin/sleep does accept decimal arguments, but you will need to use /bin/sleep in your scripts).

The following steps should help to narrow down the problem.

If you have a lot of interesting debug going to stderr, you may want to save it and review later. You can't save it to /tmp because the initramfs filesystem is not visible after the full boot. There is a solution, though: You can redirect output to /dev/.initramfs/mylogfile.txt. and this will be available after the full boot, in the same location. It will be erased at the next boot, so rename it if you want to keep it.

This works even if you keep the initramfs as read-only (no need to change the default ro kernel parameter).

Of course, you still need to add 2>/dev/.initramfs/mylogfile.txt to script you are interested in. You can either use the kernel break parameter and edit the script in /scripts for a one-time change, or edit the script in under /usr/share/initramfs-tools/ and do {update-initramfs -u for a permanent change.

initramfs content

It can happen that due to a bug in the initramfs creation a newer initramfs lacks important libraries or utilities. Easiest way is to compare the file list of working contra non-working initramfs.