Минимальный Linux с ядром и BusyBox: / etc / inittab игнорируется, выполняется только / init


12

Мне удалось создать небольшой и полностью функциональный 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вообще не вызывается.

Если вы пришли сюда, взгляните на Minimal Linux Live, который, кажется, делает то, что хочет, и просто работает: github.com/ivandavidov/minimal
Ciro Santilli 21 改造 中心 法轮功 六四 事件

Ах, ОП написал Minimal Linux Live! Человек ты рок.
Сиро Сантилли 新疆 15 中心 法轮功 六四 事件

Ответы:


11

Хорошо, я провел много обширных исследований и выяснил, что не так. Давайте начнем один за другим:

  • Когда мы используем 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и все.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.