カーネル(デフォルトオプションでコンパイルされた)とBusyBox(デフォルトオプション+静的でコンパイルされた、_/sbin/init
_を含むすべてのアプレットが存在する)のみを含む、小さくて機能的なライブ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
_を検出(または読み取り)しないことです。/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
_構成を試しましたが、すべて私が見つけた情報に基づいています here 。
最低限、私の/ etc/inittabには次の1行だけが含まれています。
_::sysinit:/bin/sh
_
繰り返しますが、カーネルパニックに陥り、_/etc/inittab
_が無視されたようです。
私の小さなライブディストリビューションがBusyBoxの_/etc/inittab
_で正常に動作するように強制する方法の提案は高く評価されます!
更新:
/init
_シェルスクリプトで_/etc/inittab
_がある場合とない場合の両方でカーネルパニックの問題があります。すべて正常に動作し、私の_/bin/ash
_コンソールは問題なく動作し、予期しない問題は発生しません。唯一の問題は、上で説明したように、_/etc/inittab
_が完全に無視されることです。/init
_があり、_/etc/inittab
_を持つものはありません。さらに このWiki記事 は、_/sbin/init
_がまったく呼び出されないという私の疑いを締めくくります。わかりました。私は多くの広範な調査を行い、何が問題だったのかを発見しました。 1つずつ始めましょう。
initramfs
ブートスキームを使用する場合、カーネルが呼び出す最初のプロセスは/init
スクリプトです。カーネルが/sbin/init
を直接実行することは決してありません。/init
にはプロセス識別子1が割り当てられています。これは非常に重要です!/sbin/init
はPID 1
としてのみ開始できるということですが、/init
はPID 1としてすでに実行されています。exec /sbin/init
の中にいる間にコマンドライン/init
を実行することです。このようにして、新しいプロセス(/sbin/init
)はその親(PID 1の/init
)からPIDを継承するので、これで完了です。私の初期構成で発生した問題(質問を参照)は、私の/init
スクリプトが最後に行うことは、新しいPIDが割り当てられた新しい/bin/sh
プロセスを生成することでした。この時点から、インタラクティブコンソールから/sbin/init
を直接実行することはできません。コマンドラインexec /sbin/init
を実行する場合でも、シェルにすでに割り当てられている同じPIDを割り当てることが最善の方法です。 PIDはPID 1ではありません。
要するに、コマンドラインexec /sbin/init
を/init
から直接実行すれば、それだけです。