LINUX.ORG.RU

Задержка без sleep и ожидание блочных устройств

 ,


0

1

Сап ЛОР, суть такова. Есть два кхм, способа загрузки 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 крайне не желательно.

Идеи? Предложения? :)

★★★★★

херню какую-то мутишь, есть rootwait

или можно поллить в скрипте /sys/… делая в промежутках sleep

anonymous
()

Идеи? Предложения? :)

Посмотрите, как было сделано в событийно-ориентированном dracut. Пусть ядро само вас позовёт, когда нужное устройство будет готово.

anonymous
()

Инициализация устройств может быть (да по сути и является) асинхронной, придется смириться.

Nastishka ★★★★★
()

И да, тащить целый бинарник sleep крайне не желательно.

Смешно, да. Напишите на ассемблере, будет аж целых сто байт. Вы уже не первую тему на это создаёте, помнится я вам правильный метод давал для работы без mdev. У вас уже есть initrd, то есть добавить туда ещё sleep увеличит busybox (да да, именно с ним ваш initrd получится минимальный) на пару сотен байт и без ассемблера.

vodz ★★★★★
()

выполняем код из /init с самой флешки(sic!)

Что sic, когда в память этот код грузит загрузчик с использованием биоса, а не ядро.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от gremlin_the_red

дак вот почему initrd образ размером 1гб отказывается загружаться некоторыми биосами. поняяяятненько. :)

Spoofing ★★★★★
() автор топика
17 октября 2020 г.

АФК Гейминг

Приходишь к любой средней (!) школе, смотришь где пацаны курят. Подходишь к одному и сообщаешь, что если он найдёт тебе в их школе «спеца» по нужной тебе игре, то ты дашь ему 500 рублей, а если поможет его друг, который придёт как и он завтра сюда же с геймером, то другу 100 рублей.

На следующий день, когда приведут нужного человека, то проверь его, а после расплатись с курильщиками. Геймеру выдвини предложение играть за 250 рублей (или 150, я х з сколько там платят тебе сейчас) в неделю на каких-то условиях. Обменяетесь контактами и раз в 2-3 месяца накидывай 200 рублей сверху для мотивации.

Всё. Вопрос с любой игрой закрыт. Он тебе даст результаты, которые достичь средний работающий взрослый человек за эти деньги не сможет. Будешь понтаваться с чистой совестью, ибо для совести ты учишь ребёнка искать доступ к деньгам через свой труд. Разумеется, деньги — подарок, переводи их в разные дни и разное время и тому подобное.

В качестве кошелей можно использовать яндекс-деньги.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.