Мне удалось создать небольшой и полностью функциональный live CD с Linux, который содержит только ядро (скомпилировано с параметрами по умолчанию) и BusyBox (скомпилировано с параметрами по умолчанию + static, все апплеты присутствуют, в том числе /sbin/init
). У меня не было проблем с созданием initrd
и заполнением /dev
, /proc
а /sys
также у меня не было проблем с моим /init
сценарием оболочки.
Недавно я прочитал, что BusyBox поддерживает /etc/inittab
конфигурации (по крайней мере, до некоторого уровня), и я очень хотел бы сделать одно из следующего:
- Забудьте о моем
/init
сценарии оболочки и полностью полагайтесь на/etc/inittab
конфигурацию. - Используйте как
/init
сценарий оболочки, так и/etc/inittab
конфигурацию.
Теперь актуальная проблема - кажется, что /etc/inittab
полностью игнорируется, когда загружается мой дистрибутив. Симптомы:
- Когда я удаляю
/init
и оставляю только/etc/inittab
я в конечном итоге с паникой ядра. Я предполагаю, что ядро вообще не выполняется/sbin/init
или/sbin/init
не находит (или не читает)/etc/inittab
. - Я читал, что BusyBox должен нормально работать даже без
/etc/inittab
. Итак, я удалил и то/init
и другое, и/etc/inittab
угадайте, что снова - паника ядра. - Я попытался выполнить
/sbin/init
из своей оболочки и после нескольких догадок, которые я включилexec /sbin/init
,setsid /sbin/init
и в результатеexec setsid /sbin/init
я получил панику ядра. Как с / etc / inittab, так и без него, присутствующего в файловой системе.
Вот содержимое моего /init
сценария оболочки:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
На данный момент мне все равно, каким будет содержимое /etc/inittab
, если у меня есть способ узнать, что конфигурация там действительно работает. Я попробовал несколько /etc/inittab
конфигураций, все на основе информации, которую я нашел здесь .
Как минимум, мой / etc / inittab содержал только одну строку:
::sysinit:/bin/sh
Опять же - я закончил с паникой ядра, и кажется, что /etc/inittab
был проигнорирован.
Любые предложения, как заставить мой маленький живой дистрибутив нормально работать с BusyBox, /etc/inittab
очень ценятся!
Обновить:
- Просто чтобы прояснить - у меня нет проблем с паникой ядра с моим текущим
/init
сценарием оболочки как с, так и без/etc/inittab
. Все работает нормально, моя/bin/ash
консоль работает отлично, и я не испытываю неожиданных проблем. Единственная проблема заключается в том, что/etc/inittab
полностью игнорируется, как я описал выше. - Я изучил 3 разных дистрибутива Linux: Slax, Finnix и SysResCD. Все они есть,
/init
и никто из них не имеет/etc/inittab
. Кроме того, эта статья Wiki завершает мое подозрение, которое/sbin/init
вообще не вызывается.
Ответы:
Хорошо, я провел много обширных исследований и выяснил, что не так. Давайте начнем один за другим:
initramfs
схему загрузки, первым процессом, который вызывает ядро, является/init
скрипт. Ядро никогда не будет пытаться выполнить/sbin/init
напрямую./init
назначен идентификатор процесса 1. Это очень важно!/sbin/init
можно запустить только как,PID 1
но мы уже работаем/init
как PID 1.exec /sbin/init
пока мы все еще внутри/init
. Таким образом, новый процесс (то есть/sbin/init
) унаследует PID от своего родителя (/init
с PID 1), и это все, что нам нужно сделать.Проблема, с которой я столкнулся при начальной настройке (см. Вопрос), была связана с тем, что последнее, что
/init
делает мой скрипт, - это создание нового/bin/sh
процесса, которому назначен новый PID. С этого момента невозможно запускать/sbin/init
напрямую из интерактивной консоли, потому что даже когда мы выполняем командную строкуexec /sbin/init
, лучшее, чего мы добиваемся, это назначить тот же PID, который уже был назначен оболочке, и этот PID определенно не является PID 1.Короче говоря - запускайте командную строку
exec /sbin/init
прямо из/init
и все.источник