Я интегрировал psplash в специальный слой Yocto для NVIDIA Jetson Nano. Я хочу запустить psplash из самого первого скрипта инициализации (PID = 1). Причина в том, чтобы покрыть время, затрачиваемое systemd на загрузку файлов модулей и служебных файлов. Я добавил init=/bin/newinit.sh
в параметры ядра Linux. Вот содержание /bin/newinit.sh
, заменяющего мой /sbin/init
.
#!/bin/sh
/usr/bin/psplash &
/bin/psplashanimator.sh &
exec /sbin/init
Вот содержание /bin/psplashanimator.sh
#!/bin/sh
/bin/sleep 0.1 && /usr/bin/psplash-write "PROGRESS 50"
Я убедился, что psplash-write
не вызывается никаким другим процессом, отключив демоны systemd (psplash-start, psplash-systemd). Тем не менее, я не могу обновить индикатор выполнения с помощью этих скриптов. Psplash отображается красиво, но ничего не отображается на индикаторе выполнения. Если я переставлю /bin/sleep 0.1 && /usr/bin/psplash-write "PROGRESS 50"
в /bin/newinit.sh
до exec
, он будет работать нормально; но он блокирует основное выполнение сценария инициализации.
В общем, если я запустил psplash в специальном сценарии инициализации, psplash-write будет работать только до вызова exec. Я не могу понять, почему это так и как это исправить.
Если есть простое решение или объяснение того, почему это не сработает, я буду признателен за ваше руководство.
ПРИМЕЧАНИЕ1: Обратите внимание, что обычный способ обновления psplash с помощью служб systemd (psplash-systemd.service
) работает нормально, когда psplash запускается с использованием psplash-start.service
, я получаю обновления индикатора выполнения.
ПРИМЕЧАНИЕ2: Psplash использует драйвер фреймбуфера и FIFO.
ПРИМЕЧАНИЕ3. Связанные исходные файлы: psplash.c psplash-write.c
ПРИМЕЧАНИЕ4: текущее выполнение systemd (чтобы вы могли видеть, не упускаю ли я что-то, что должно быть готово перед запуском psplash)