(Translated by https://www.hiragana.jp/)
initrd - Wikipedia コンテンツにスキップ

initrd

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

初期しょきRAMディスク(initial ramdisk)はLinuxカーネルブートとき一時いちじてきルートファイルシステムをメモリにむための方式ほうしきしんルートファイルシステムをマウントできるようになるまえにファイルシステムを必要ひつようとする場面ばめん使用しようされる。 initrdinitramfs(Linux 2.6.13 以降いこう利用りよう可能かのう)の2種類しゅるい方式ほうしきがあるが、文脈ぶんみゃくによってはこれらを総称そうしょうしてinitrdとんでいる場合ばあいもある。 ほん記事きじでもinitrdとinitramfsの両方りょうほう記述きじゅつする。

原理げんり

[編集へんしゅう]

Linuxディストリビューションおおくは、なるべく広範囲こうはんいなハードウェアでブートできるよう、単一たんいつ汎用はんようてきカーネルイメージで出荷しゅっかされている。この汎用はんようカーネルイメージのデバイスドライバぐんローダブル・カーネル・モジュールになっており、メモリのかぎられたコンピュータやフロッピーディスクなどのてい容量ようりょう媒体ばいたいからもブートができるようカーネルイメージを巨大きょだいさせない工夫くふうをしている[1]

このような方式ほうしきでは、ルートファイルシステムをブートにマウントするには、事前じぜんに(ルートファイルシステムじょうにある)必要ひつようなモジュールを検出けんしゅつしてロードしなければならないという問題もんだいしょうじる(あるいは、ルートファイルシステムそのものがどこにあってどういう種類しゅるいかを事前じぜん必要ひつようがある)[1]

さらに問題もんだい複雑ふくざつにするのは、ルートファイルシステムがソフトウェアRAIDボリュームだったり、LVMだったり、(ディスクレス・ワークステーションの場合ばあいNFSだったり、暗号あんごうされたパーティションだったりするてんである。これらはマウントにたって特別とくべつ処理しょり必要ひつようとする[2]

もう1つ問題もんだい複雑ふくざつさせることとして、カーネルがハイバネーションをサポートしていることがある。ハイバネーションとは、システムを停止ていしさせて、その時点じてんぜんシステムイメージをスワップパーティション普通ふつうのファイルにダンプし、電源でんげん機能きのうである。次回じかいげたとき、そのイメージをメモリにロードするには、ディスクじょうのイメージにアクセスできなければならない。

これらの特殊とくしゅケースに対応たいおうしてカーネルにコードをくわえるのをふせぐため、げの初期しょき段階だんかいでは一時いちじてきなルートファイルシステムを使つかう。これを初期しょきユーザ空間くうかんなどとぶ。このルートファイルシステムにはしんのルートファイルシステムのマウントに必要ひつようとなる、ハードウェア検出けんしゅつ、モジュールローディング、デバイス発見はっけんなどのユーザー空間くうかんヘルパーが存在そんざいする[2]

実装じっそう

[編集へんしゅう]
mkinitcpio, Arch Linux および関連かんれんディストリビューションで initramfs を生成せいせいするソフトウェア

initrd のファイルシステムイメージ(およびカーネルイメージ)は、Linuxのブートローダやファームウェアがアクセスできる場所ばしょ格納かくのうしておく必要ひつようがある。これには、つぎのようなものがある。

  • ルートファイルシステム自身じしん
  • ローカルディスクじょうext2FAT でフォーマットされたちいさなパーティション(ブートパーティション)
  • Live CD場合ばあいは、CDじょうのファイルシステム
  • TFTPサーバ(イーサネットからブートする場合ばあい

ブートローダはカーネルとinitrdイメージをメモリじょうにロードし、カーネルを起動きどうするさいに initrd のメモリアドレスをわたす。ブートの最終さいしゅう段階だんかいで、カーネルはinitrdイメージの先頭せんとうすうブロックをみ、そのフォーマットを判断はんだんする。

  • そのイメージが(オプションでgzip圧縮あっしゅくされた)ファイルシステムイメージの場合ばあい特殊とくしゅブロックデバイス (/dev/ram) として利用りよう可能かのうにし、ルートファイルシステムとしてマウントする[3]。このファイルシステムようのドライバはカーネルない静的せいてきにコンパイルしておく必要ひつようがある。おおくのディストリビューションではデフォルトで圧縮あっしゅくされたext2ファイルシステムをinitrdイメージに採用さいようしている。には(Debian 3.1 など)、メモリのかぎられたシステムでもブートできるようcramfs使つかうものもある。cramfsは伸長しんちょうさい追加ついかのメモリを必要ひつようとしない。
初期しょきようルートファイルシステムが利用りよう可能かのうになると、カーネルは最初さいしょのプロセスとして /linuxrc実行じっこうする。そのプロセスが終了しゅうりょう (exit) するとカーネルはしんのルートファイルシステムのマウントが完了かんりょうしたと判断はんだんし、"/sbin/init" を実行じっこうして通常つうじょうのユーザー空間くうかん処理しょり開始かいしする[3]
  • そのイメージがgzipで圧縮あっしゅくされたcpioアーカイブの場合ばあい中間なかま段階だんかいとしてカーネルがそれを展開てんかいして initramfs (Linux 2.6.13 以降いこう利用りよう可能かのうtmpfs特殊とくしゅインスタンス)とし、それを初期しょきようルートファイルシステムとする。ext2などのファイルシステムのドライバをカーネルにんでおく必要ひつようがなくなるという利点りてんがある[4]
initramfs じょうで、カーネルは最初さいしょのプロセスとして /init実行じっこうする。/init終了しゅうりょう (exit) しない。

マウント準備じゅんび

[編集へんしゅう]

一部いちぶのLinuxディストリビューションでは、特定とくていのコンピュータでのブートに必要ひつようなものだけ(ATASCSI、ファイルシステムのカーネルモジュールなど)を格納かくのうしたカスタマイズしたinitrdイメージを生成せいせいする。その場合ばあい、ルートファイルシステムの場所ばしょ種類しゅるい実行じっこう判断はんだんするのではなく、initrdイメージないめうちでんでおくことがおおい。

のディストリビューション(FedoraやUbuntuなど)はより汎用はんようてきなinitrdイメージを生成せいせいする。その場合ばあい、ルートファイルシステムのデバイスめい(またはUUID)のみを使つかい、必要ひつよう情報じょうほうはブート発見はっけんしなければならない。したがって、ルートファイルシステムをマウントするまでに以下いかのようなタスクが実行じっこうされる。

  • ブート処理しょり依存いぞんしている任意にんいのハードウェアドライバをロードしなければならない。通常つうじょう一般いっぱんてきなストレージ機器ききようカーネルモジュールをまとめてinitrdに格納かくのうしておき、ホットプラグエージェントを起動きどうして、検出けんしゅつしたハードウェアにマッチするモジュールを取出とりだす。
  • ブートスプラッシュ表示ひょうじするシステムでは、画面がめん表示ひょうじ関連かんれんハードウェアを初期しょきし、ユーザー空間くうかんのヘルパーを使つかってブート処理しょり同期どうきしつつアニメーションを描画びょうがさせる。
  • ルートファイルシステムがNFSの場合ばあい以下いかおこなう。
    • 主要しゅようネットワークインタフェース起動きどうさせる。
    • DHCPクライアントをし、必要ひつよう情報じょうほうる。
    • その情報じょうほうからNFS共有きょうゆう名前なまえとNFSサーバのアドレスを取出とりだす。
    • NFS共有きょうゆうをマウントする。
  • ルートファイルシステムがソフトウェアRAIDデバイスの場合ばあい、RAIDボリュームがどのデバイスにまたがっているかを手段しゅだんがない。通常つうじょうMDユーティリティし、ぜんブロックデバイスをスキャンし、必要ひつようなデバイスをオンラインにする。
  • ルートファイルシステムが論理ろんりボリューム場合ばあい、LVMユーティリティをしてスキャンし、ルートファイルシステムを格納かくのうしているボリュームグループを活性かっせいさせる。
  • ルートファイルシステムが暗号あんごうされたブロックデバイスにある場合ばあい
    • ヘルパースクリプトをし、ユーザーにパスフレーズを入力にゅうりょくさせるかハードウェアトークン(ICカードやUSBセキュリティドングル)を挿入そうにゅうさせる。
    • デバイスマッパーにより復号ふくごう対象たいしょう生成せいせいする。
  • ルートファイルシステムをマウントした状態じょうたいでは安全あんぜん実施じっしできない保守ほしゅタスクがあれば、ここで実行じっこうする。
  • ルートファイルシステムを専用せんようでマウントする。
  • 動作どうさつづける必要ひつようのあるプロセス(ブートスプラッシュようヘルパーやそのコマンドFIFO)をあらたにマウントしたルートファイルシステムに移行いこうさせる。

ルートファイルシステムを普通ふつうにルート(/)にマウントすると、初期しょきようルートファイルシステムじょうのスクリプトなどを実行じっこうしていたプロセスがうまくクリーンアップして終了しゅうりょうできないため、つぎのような配慮はいりょ必要ひつようとなる。

  • initrd では、しんのルートファイルシステムは一時いちじてきなマウントポイントにマウントし、このためだけに導入どうにゅうされた pivot_root(8)使つかって両者りょうしゃえる。こうすると初期しょきようルートファイルシステムはあらたなマウントポイント(/initrd など)にのこるので、あとでこれをアンマウントし initrd に使つかっていたメモリを解放かいほうすることができる。
  • initramfs では、初期しょきようルートファイルシステムを pivot_root で移動いどうさせることができない[5]。そのため、swich_root(8)コマンドによりたんにその中身なかみそらにし、しんのルートファイルシステムを上書うわがきするようにマウントする。

初期しょきようルートファイルシステムには /linuxrc/init といったシェルスクリプトがあるため、最小限さいしょうげんのシェル(通常つうじょう/bin/ash)もふくまれているし、ほかにも基本きほんてきなユーティリティぐんBusyBoxツールキットにあるようなもの)も格納かくのうされている。容量ようりょう節約せつやくするため、それらのシェルやユーティリティやライブラリぐん容量ようりょう最適さいてきオプション(gcc の "-Os" フラグなど)きでコンパイルされ、klibcのような(このために開発かいはつされた)標準ひょうじゅんCライブラリ最小さいしょうばんとリンクされている[6]

脚注きゃくちゅう出典しゅってん

[編集へんしゅう]
  1. ^ a b Almesberger, Werner (2000), “Booting linux: the history and the future”, Proceedings of the Ottawa Linux Symposium, http://www.linuxsymposium.org/2000/booting.php 
  2. ^ a b Landley, Rob (15 March 2005), Introducing initramfs, a new model for initial RAM disks, linuxdevices.com, オリジナルの2013-01-04時点じてんにおけるアーカイブ。, https://archive.is/xoNFj 
  3. ^ a b Almesberger, Werner; Lermen, Hans (2000), http://www.kernel.org/doc/Documentation/initrd.txt 
  4. ^ Landley, Rob (2005-10-17), ramfs, rootfs, and initramfs docs, take 2, Linux kernel source tree, http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt 
  5. ^ Fish, Richard (2005-07-06), pivot_root from initramfs causes circular reference in mount tree, Linux Kernel Bug Tracker, http://bugzilla.kernel.org/show_bug.cgi?id=4857 2009ねん2がつ28にち閲覧えつらん 
  6. ^ Garzik, Jeff (2002-11-02), initramfs merge, part 1 of N, Linux kernel mailing list, http://lkml.org/lkml/2002/11/2/17 

外部がいぶリンク

[編集へんしゅう]