Fork me on GitHub

Linux Initrdの特徴

  • Jul 21, 2010

categoryプラグインは存在しません。

概要

これのためにいくつかinitrdにパッチを当ててきたので、それぞれのディストリビューション毎のinitrdの特徴をまとめてみます。

Slackwareとかがないですが、それは標準でisoブートに対応していたので、いじる必要がなかったためです。

Debian

Debianとは言え、initrdはそれぞれまったく違います。ただUbuntu系は大体同じinitrdを使っているようで、標準でisoブートもできます。

Ubuntu

フォーマット
8.10以前はcpio+gz、9.04以降はcpio+lzma

Ubuntuは最初からISOブートをサポートしているので、基本的に手を入れる必要はありませんが、差分を保存するcasper-rw のファイル名の変更などに対応させるための簡単なパッチを提供しています。

基本的にはinitから、カーネルオプションで指定されたscripts/casperが呼び出される一般的なinitrdです。

Debian Live

フォーマット
cpio+gz

本家のLiveCDですが、標準ではisoブートには対応していません。

最初にロードされるのはinitですが、そこからscriptsフォルダ以下のliveが読み込まれて、その中のfunctionが呼び出されます。

LiveCDのマウントはscripts/liveのis_live_path()の中で行われます。

BackTrack Linux

フォーマット
cpio+gz

これは、セキュリティ関係のツールが大量に詰まったLinuxですが、ベースはDebian Liveと同じで、initからscripts以下のcasperのfunctionが呼び出されます。LiveCDのマウントはcasperの中になります。

面白いのは、ローカルブート用のscripts/localにはisoファイルなどのループバックマウントを行うコードが入っているのに、casperには入っていない点です。おかげで同じloop=オプションを使って、簡単にパッチを当てることができました。

KNOPPIX

フォーマット
cpio+gz

KNOPPIXは歴史のあるLiveCDだけあって、initスクリプトは1つで完結していますが、いろんな条件に対応できるように少々複雑になっています。

また、接続されている全てのストレージを検索する仕組みなので、最初に見つかったKNOPPIXのイメージで起動するようになっているようです。

MEPIS

フォーマット
ext2+gz

SimplyMEPISや、その派生のantiXはデフォルトでisoブート用のオプションfromiso=が用意されていますが、なぜか最近のバージョンではvfatのマウントには対応しておらず、そのままではVFAT(fat32)フォーマットのUSBメモリからはisoブートできません。

そこでマウント時に試すフォーマットにvfatを追加するだけで、isoブートできるようになりました。これは限りなくバグっぽいですが、誰も報告していないんでしょうか。

Mandriva One

フォーマット
ext2+gz
パッチ対象
/linuxrc
難易度

Mandrivaは珍しくinitrdでnashというshとは違うシェルでブートします。nashは非常に機能が限定されているので、通常shで使うような変数を使った動作の切り分けなどがしにくくなります。

実際、デフォルトのinitrdではCD-ROM限定、ラベル名限定でディスクをマウントするコードになっています。Mandrivaの場合は、用途別にinitrdを分けるほうが良いかもしれません。

Dreamlinux

フォーマット
cpio+gz
パッチ対象
init.lua

Dreamlinuxは、Luaというめずらしいシェルを使ってブートしています。ifを閉じるのにendと書くなど、若干Rubyのような感じです。ただ、コマンドを実行するのにわざわざos.executeと書かないといけないなど、普通のshに慣れた身としては非常に書きにくいです。

また、カーネルオプションの解析もややこしいので、私のパッチではfromiso=オプションは必ず最後に記述しないと動かないように簡略化しています。

Gentoo

Sabayon

フォーマット
cpio+gz

これは、基本的に全てinitが処理しますが、functionは外部のファイルで定義されていて、実際のLiveCDのマウントは/etc/initrd.scriptsが行っています。

全体的に処理の流れが追いやすく、いじりやすいinitrdです。

RedHat系

CentOS

フォーマット
cpio+gz
パッチ対象
/init

CentOSは、なんとなく全ての処理をinitスクリプトに詰め込んでいる感じで、KNOPPIXに似ています。ただ処理の流れはわかりやすく、rootディスクのマウントも一箇所で行われているだけなので、比較的パッチは当てやすいです。

Fedora

フォーマット
cpio+gz
パッチ対象
/sbin/dmsquash-live-root

Fedoraは同じRedHat系でもかなり機能毎にスクリプトが分割されていて、initから/sbin以下のスクリプトが順次呼び出されていきます。rootディスクは/sbin/dmsquash-live-root内でマウントされているので、ここにパッチを当てればisoブートできます。

その他

GoboLinux

フォーマット
cramfs
パッチ対象
/Programs/InitRDScripts/20080330/bin/mountGoboLinux

基本的にinit(の元ファイル)から、mount用のスクリプトを呼び出しているので構造は単純なんですが、Goboのポリシーで実行用のファイルは/Programs以下などと決まっているので、その実体を探して編集するのが結構大変です。

また、フォーマットがcramfsなので直接マウントしてもリードオンリーでパッチを当てられません。なので作業用フォルダーに一旦全てコピーしてから、新しいcramfsを生成するという手間が必要になります。

Puppy Linux

フォーマット
cpio+gz
パッチ対象
/init
難易度

Puppyのスクリプトは、一旦全ドライブをスキャンして、見つかったファイルやオプションから起動方法を選択して起動する方法を採用しています。

これはこれで良いんですが、ISOブートに対応させようとするとスキャン時と実際にマウントする時の2箇所にパッチを当てなければならず、少々複雑になります。本当はISOが検出された場合の新しい起動方法を追加するのがよさそうです。

OpenSolaris

フォーマット
ufs+gz
パッチ対象
/lib/svc/method/live-fs-root

OpenSolarisでは、/boot/x86.microroot がRAMディスクとして使われます。これのマウントは、OpenSolaris上で

lofiadm -a x86.microroot

とした後、表示されたデバイスを

mkdir -p /mnt/microroot
mount /dev/lofi/1 /mnt/microroot

などとしてマウントします。

Ubuntu上でzfsfuseなども試してみましたが、今のところ正しくマウントできません。

ファイルシステムのマウントは、

/lib/svc/method/live-fs-root

というスクリプトで行われます。ここでlofiadmコマンドを使ってISOファイルをループバックマウントするように修正すればISOブート可能です。

ただし、デフォルトのmicrorootにはvfatをマウントするためのpcfsモジュールが含まれていないので、LiveCDなどから

cp /usr/kernel/fs/pcfs kernel/fs
cp -r /usr/lib/fs/pcfs usr/lib/fs

などとして、関連するモジュール群をmicroroot内にコピーしておく必要があります。

openSUSE

フォーマット
cpio+gz
パッチ対象
/init, /include

oenSUSEもPuppyと同じように、一旦全ドライブをスキャンした後で再度ファイルシステムをマウントする方式を採用しています。そのため、何ヶ所か手を入れる必要があって少々複雑になります。

コメント

commentプラグインは存在しません。