/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/init
exec 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/init
PID 1でのみ開始できますが、PID 1
すでに/init
PID 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
それがすべてです。