自分のinitrdをビルドするときに/ devディレクトリを作成する方法は?


9

私はinitrdについて何かを学ぼうとしています。私はこのチュートリアルに従って自分のinitrdをゼロから構築し、それにbusyboxをインストールしました。次に、isolinuxを使用して.isoを作成し、virtualboxでテストできるようにしました。それはうまくいきます!

私はbusyboxからの基本的なコマンドを持っているので、ファイルシステムをマウントしたいと思いました。しかし、チュートリアルに従って作成した一部のファイルを除いて、/ devディレクトリはほとんど空です(sdaなし)。私はudevについて学び、これが私が必要としていることだと思います。しかし、私はこれをどう進めるかわかりません。

udevから最新のソースコードを取得してコンパイルし、initrdに追加する必要がありますか?そして、私のinitスクリプトで/ bin / udevまたはそのようなものを呼び出しますか?または、/ devディレクトリにデータを追加する他の/より良い方法はありますか?

編集:追加情報と私がすでに行ったことに関する更新。

  • 私は仮想ボックスですべてをテストします。私は仮想ボックスにubuntuミニマルをインストールし、initrdから.isoを作成して、virtualboxのisoから起動しました。
  • 私はvmlinuzを使用し、/lib/modulesそれはdebian-businesscard.isoに存在し、以前にリンクしたチュートリアルに従って作成したinitrdにそれらをコピーしました。
  • カーネルは CONFIG_DEVTMPFS=y
  • /devtty0〜tty63など、一部のデバイスはに表示されますが、sda / hdaは表示されません。
  • lspci -k私の現在実行中のOSで仮想ボックスでは使用されているモジュールを確認してください。モジュールとしてSATA Controller使用すると言いahciます。
  • 私は実行するとmodprobe -v ahci、それの後に、それはのようなものを返します。それは「ata_some_stuff未知のシンボル」について多くのことを不平を言うSCSI Subsystem initializedATA-6: VBOX HARDDISKDirect-Access ATA VBOX HARDDISK。ただし、まだハードドライブデバイスが見つかりません/dev

私の現在の/init/スクリプトは次のとおりです:

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

誰かが私が間違っていることと代わりに何をすべきかについて何か考えを持っていますか?

回答:


12

ジルの答えは正しいですが、それは古い学校です:-)。もう1つの注目すべき点は(何よりも用語のひっかき目です)、リンク先のガイドは、initrdではなくinitramfsを作成する方法の説明であるということです。2つは類似しており、同じ目的を果たしますが、イメージの格納方法とロード方法が異なります。

とにかく、あなたの質問への答えは実際には本当に本当に簡単です。

  1. devtmpfsカーネルで有効にする(CONFIG_DEVTMPFS=y
  2. スクリプトのmount -t devtmpfs none /dev最初の部分として実行しますinit

それでおしまい。devtmpfsは/devudev と同じように入力されます。あなたも、事前に実装するために必要はありません/devのような基本的なこと(initramfsの画像では)nullzeroまたはconsole


ご意見ありがとうございます。私はあなたのコマンドを実行しました、そして私は今より多くのデバイスを持っていますが、まだマウントするためのsdaやhdaはありません。忘れたことがありますか?debians live systemから入手したvmlinuzカーネルを使用していますが、実際に自分でコンパイルする必要がありますか?
Carlito

@Carlitoこのカーネルではdevtmpfsが有効になっていますか(構成ファイルを確認してください)?Debianはつい最近、devtmpfsに切り替えました。
Gilles 'SO-悪をやめなさい'

@Gilles設定ファイルは提供されていませんが、debianから取得したカーネルをロードしました。設定ファイルによるとCONFIG_DEVTMPFS=y、それでもsdaデバイスを取得できません。これは、モジュールをロードしていないためだと思います(lsmodは何も返しません)。ファイルシステムデバイスを取得するには、どのモジュールをロードする必要がありますか?それとも私が忘れていたものはありますか?
Carlito

@Carlitoはい、/devドライブだけでなく、他にも表示されている場合は、devtmpfsが機能しており、ディスクコントローラーモジュールが不足している可能性があります(ご想像のとおり)。残念ながら、必要なドライバー/モジュールを知る唯一の方法は、カーネル構成でそれぞれの情報を読むかlspci -k、実行中のLinuxシステムで実行することです(システムのさまざまなコンポーネントが使用しているカーネルドライバーが表示されます)。 。
Patrick

1
@ CiroSantilli709大掴捕六四事件法轮CONFIG_DEVTMPFS_MOUNT=y機能はinitramfsに影響を与えません。カーネルのヘルプテキストから:「このオプションはinitramfsベースの起動には影響しません。ここでは、rootfsがマウントされた後、devtmpfsファイルシステムを常に手動でマウントする必要があります」
Patrick

4

Udev /devは、カーネルにロードされているドライバーとこれらのドライバーが検出したデバイスに基づいて自動的に入力されます。デバイスの名前とそのアクセス許可は、管理者が微調整できる一連のルールに基づいています。ほとんどのLinuxシステムはudevを使用する必要があります。例外は、システム(通常は組み込み)であり、システムのセットアップ時にハードウェア構成が既知であり、後で変更されません。

通常udev、起動シーケンスのかなり早い段階で呼び出します。その前に行う必要のあるいくつかのことの1つ(必須?)は、mount /proc/sysです。デーモンの起動後、を呼び出しudevadm trigger --action=add; udevadm settleてカーネルから保留中のすべてのイベントをudevに処理させ(trigger)、イベントが処理されるまで待ってから続行します(settle)。次に、ルートファイルシステムを含むデバイスを見つけることができます。

udevdバイナリのほかudevに、initrdにはの他の部分が必要です。これは、構成内のファイルが含ま/etc/udevにおける基本構成、/lib/udevなどのようなヘルパーのバイナリscsi_idも中を/lib/udev。initrdに含めるudevルールから呼び出されるすべてのプログラムが必要です。

initrdの最後に、実際のルートパーティションに制御を移す前に、initrdのudevd他のすべてのプログラムと同様に停止する必要があります。これによってからデバイスが削除されることはありません/devmount --move /dev /root/devマウント/devを実際のルートに移動するために使用します。

Gentooには、とりわけudevについて言及しているinitramfsガイドinitramfs wikiページがあります。initramfsは、ファイルシステムイメージではなくcpioアーカイブを使用し、異なるプロセスインターフェースを使用するinitrdの最新の後継です(initrdでは、/linuxrc終了する必要がありますが、initramfsでは、実際のルートからのinit で/initなければなりませんexec); 最近のほとんどのシステムでは、ファイルがまだinitrdと呼ばれている場合でも切り替えられています。


ご回答有難うございます。私は実際にinitrdではなくinitramfsを作成したという結論に達しました。しかし、私はdebiansライブシステムから取得したvmlinuzカーネルを使用します。これを行うには、実際に自分のカーネルをコンパイルする必要があります(ハードドライブをロードするためのモジュールがわかっているため)、または基本モジュールで使用できる一種の最小限のバージョンがあります。 ?私はおそらく最新のudevをダウンロードし、それをコンパイルして実行してみます。
Carlito

@Carlito自分のカーネルをコンパイルするときに必要なドライバーを忘れることはよくある間違いであるため、最初にDebianカーネルを試すことをお勧めします。
Gilles 'SO-悪をやめなさい'

しかし、どうすれば入手できますか?私はちょうどdebian-businesscard.isoで見つけたvmlinuzをコピーしました(おそらく最良のアイデアではありません)。ubuntuまたはdebianから取得した標準カーネルと、/ lib / modulesディレクトリ全体をコピーする必要がありますか?
Carlito、2012年

@Carlito少なくとも、ハードウェアに必要なすべてのモジュールが必要です。リストを閲覧して必要なものをすべて見つけるのは難しい場合があります。必要なものを見つける最善の方法はlsmod、稼働中のシステムで実行することです。したがって、それらすべてから始めて、スペースを節約する必要がある場合はインテリジェントにプルーニングします。
Gilles「SO-邪悪なことをやめよ」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.