Сап ЛОР, суть такова. Есть два кхм, способа загрузки init (initramfs), как с busybox, так и без него. В случае если busybox есть, то запускается mdev для создания блочных устройств, если busybox нету, тогда мы создаём эти устройства сами, руками (спасибо Nastishka).
if test "$BUSYBOX" = "yes"; then
mdev -s
if test -f "/proc/sys/kernel/hotplug"; then
echo "$(which mdev)" > /proc/sys/kernel/hotplug
fi
fi
if test "$BUSYBOX" = ""; then
for nod in "/sys/block/"*; do
dev="${nod##*/}"
block=""
major=""
minor=""
read block < "$nod/dev"
major="${block%:*}"
minor="${block#*:}"
mknod "/dev/$dev" "b" "$major" "$minor" 2>/dev/null
done
unset nod dev block major minor
fi
Мы загружаемся с USB-накопителя, и даже не смотря на то, что мы уже находимся на стадии initramfs и выполняем код из /init с самой флешки(sic!), не все блочные устройства успевают определиться ядром, в том числе сама флешка, с которой происходит загрузка.
Вот мы загрузились в initramfs, но основная система находится на флешке. Нужно из /init эту флешку найти, смонтировать, и использовать образы с системой в дальнейшем. Мы всё это делаем. За исключением того, что флешки пока ещё не видно.
Проблема в том, что ядро элементарно не успевает создавать блочные устройства /sys/block/sr0 /sys/block/sda /sys/block/sdb и так далее. В тот самый момент, когда запускается mdev или мы руками создаём mknod, этих устройств пока ещё нет, а появятся они буквально в следующие два-три мгновения (в зависимости от нагрузки, конечно же, как подсказал Difrex что sleep не панацея, хотя и вероятность такого исхода КРАЙНЕ МАЛА).
До этого я грешил на mdev, дескать он завершает работу, а устройства появляются уже потом, но скрипт продолжает выполнение и поэтому ничего не находит. sleep 5 решил эту проблему. Но как оказалось проблема в самом /sys/block, что там нечего находить. Ядро ничего не создало, пока ещё.
Таким образом именно перед этими двумя блоками кода необходимо реализовать какую-нибудь задержку, желательно без sleep, чтобы дождаться появление /sys/block/sda, а затем уже продолжить работу. Или не дождаться, потому что их вовсе может и не быть.
Чем такое можно реализовать?
Мы думаем сделать подобие диффов директории, чтобы несколько итераций циклом прогнять проверку и продолжить выполнение. Как лучше поступить? За что тут можно зацепиться?
И да, тащить целый бинарник sleep крайне не желательно.
Идеи? Предложения? :)