カーネルとBusyBoxを備えた最小限のLinux:/ etc / inittabは無視され、/ initのみが実行されます


12

カーネル(デフォルトオプションでコンパイルされた)と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
  • BusyBoxがなくても正常に動作することを確認しました/etc/inittab。だから、私は両方を削除/initして/etc/inittab、何を推測-再びパニックカーネル。
  • 私が実行しようとした/sbin/init私のシェルから、付属のいくつかの推測の後exec /sbin/initsetsid /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には次の1行だけが含まれています。

::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まったく呼び出されていないという私の疑いを締めくくります。

あなたがここに来た場合は、を見てみ最小限のLinuxのライブ何欲求を行うように思われ、そしてちょうど作品:github.com/ivandavidov/minimal
チロSantilli新疆改造中心法轮功六四事件

ああ、OPはMinimal Linux Liveを書いた!あなたがロックする男。
Ciro Santilli新疆改造中心法轮功六四事件

回答:


11

わかりました、私は多くの広範な研究を行い、何が悪いのかを発見しました。1つずつ始めましょう。

  • initramfsブートスキームを使用する場合、カーネルが呼び出す最初のプロセスは/initスクリプトです。カーネルが/sbin/init直接実行することは決してありません。
  • /init プロセスID 1が割り当てられます。これは非常に重要です!
  • ここでの問題は、/sbin/init開始できるのはPID 1としてPID 1既に実行さ/initれていることだけです。
  • 解決策は、exec /sbin/init内部にいる間にコマンドラインを実行すること/initです。このようにして、新しいプロセス(つまり/sbin/init)はPIDをその親(/initPID 1から)から継承します。

初期構成で発生した問題(質問を参照)は、/initスクリプトが最後に行うことは、/bin/sh新しいPIDが割り当てられた新しいプロセスを生成することであるという事実によるものでした。この時点/sbin/initから、インタラクティブコンソールから直接実行することはできません。コマンドラインを実行する場合でもexec /sbin/init、シェルに既に割り当てられている同じPIDを割り当てることが最善であり、このPIDはPID 1ではありません。

簡単に言えば、コマンドラインをexec /sbin/init直接実行するだけ/initです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.