カーネルと BusyBox を持つ最小 Linux: /etc/inittab を無視して /init のみを実行する

カーネルと BusyBox を持つ最小 Linux: /etc/inittab を無視して /init のみを実行する

/sbin/init私はカーネル(デフォルトオプションでコンパイルされています)とBusyBox(デフォルトオプション+静的コンパイル、すべてのアプレットの存在を含む)のみを含む小さく完全な機能を備えたライブLinux CDを作成しました。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。 /etc/inittab はファイルシステムに存在する場合と存在しない場合があります。setsid /sbin/initexec setsid /sbin/init

/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のように完全に無視されることです。
  • 私はSlax、Finnix、およびSysResCDの3つのライブLinuxディストリビューションを見ました。彼らは両方ともそれを持っていませ/init/etc/inittab。またこのウィキの記事私の疑いは/sbin/initまったく起こりませんでした。

答え1

さて、私はたくさんの研究をたくさんし、問題を見つけました。一つずつ始めましょう。

  • initramfsブートシナリオを使用するときにカーネルが呼び出す最初のプロセスは/initスクリプトです。カーネルは/sbin/init直接実行しようとしません。
  • /initプロセス識別子1が割り当てられる。これは非常に重要です!
  • これで問題は/sbin/initPID 1でのみ開始できますが、PID 1すでに/initPID 1で実行されていることです。
  • exec /sbin/init解決策は、私たちがまだ内部にいる間にコマンドラインを実行することです/init。このように、新しいプロセス(例えば/sbin/init)は、親プロセス(PID 1)からPIDを継承し、/initこれが私たちがしなければならないすべてです。

初期設定(質問を参照)で遭遇する問題は、/init私のスクリプトが実行する最後の操作が/bin/shまったく新しいPIDを割り当てた新しいプロセスを作成することです。この時点から、対話型コンソールで直接実行することは不可能です。/sbin/initなぜなら、コマンドラインを実行してもexec /sbin/init私たちが得ることができる最善の方法は、すでにシェルに割り当てられているのと同じPIDを割り当てることであり、このPIDは確かにPID 1ではないからです。 。

簡単に言えば、exec /sbin/initコマンドラインを直接実行すると/initそれがすべてです。

関連情報