目次


FireWireのデバイスからLinuxをブート

リムーバブル・ドライブにLinuxをインストール

Comments

「デュアルブート構成でLinuxを使用したいが、コンピューターのHDDに空き容量が無い。」と想定します。CDから直接実行可能なKnoppixのようなLinuxディストリビューションに委ねるのも、一つの解決法です。これは場合によっては実用的な方法ですが、幾つかの致命的な欠陥をともないます。

  • 永続的なデータ・ファイル保管場所が必要なことには変わりはありません。極端に小さなファイルと関わるのであればフロッピー・ディスクが適していると言えますし、中型のファイルならばUSB接続のフラッシュ・メモリー装置でも十分ですが、どちらも理想的とは言えません。
  • CDを使用中の場合、アプリケーションをインストールしたり現存のアプリケーションをカスタマイズするのは、運が良くても難しく最悪の場合不可能です。
  • 全部(のファイル)がHDDよりも遥かに遅いCDからロードしなければならないので、CDから運転中の配布プログラムの使用にはパフォーマンス上の代償が伴います。実行時はもちろんですが、起動時には全てのデバイスが検出されますので、その分パフォーマンス低下の現象は起動時に最も顕著に露呈されます。

確実な方法をお求めでしたら、他にも方法があります。例えば、もう1台内蔵ドライブを購入しそれにLinuxをインストールできます。しかし、多くの場合、(ハードウェアの)ケースに空いているドライブ用のベイが無いかも知れません。(これは特に(一般的に1つの内蔵HDDしか入れられない)ラップトップに当てはまります。)

または、現在使用中のドライブの代わりにより大きなドライブを入れ、それにより得られる空き容量にLinuxをインストールするのも手です。しかし、現行中のOSの新たなドライブへの再インストール、全てのアプリケーションの再インストールと再構成、そして全データのリストアを必要としますので、この方法は多くの時間を消費します。

これよりも遥かに優れた解決法は、外部ドライブを購入しその中にLinuxをインストールすることです。こうすれば現存のハードウェアとソフトウェアに干渉せずに済み、Linuxを使用したいときにその外部ドライブを接続すればよいだけです。

リムーバブル・ドライブの選択肢

Linuxのインストール先としての装置には、フロッピー・ディスク、USBフラッシュ・メモリー装置、USB/FireWire接続外部HDD、そしてその他多数、様々あります。

1.44MBのフロッピー・ディスクや32MB USB メモリー・キー等の小容量装置にLinuxをインストールすることは十分に可能ですが、それらは一般的に(必要性に応じて)特殊化され、(例えば)破壊されたインストール済みのアプリケーションやO.S.等の救済を目的とした縮小化されたプログラムです。

しかしながら、外部ドライブは配布された汎用Linuxに高度の柔軟性を手頃な価格で提供します。

外部ドライブは多数のメーカー(Maxtor、Western Digital、そしてその他)から多種類のサイズに渡り発売されています。これらのドライブは標準の3.5インチ/2.5インチIDE接続ドライブを収容可能なケースからなることが多いです。一般的にはこれらのドライブはUSBまたはIEEE1394(FireWire)を介して接続されます。

USBには主に2種類のバージョン(1.1と2.0)があります。バージョン1.1の最大データー転送速度は12Mbit/s(12Mbps、1秒間にあたり12メガビット)ですが、バージョン2.0は最大480Mbit/sをサポートします。大半のUSB 2.0用ドライブはUSBバージョン1.1に対して後方互換性を抱きます。選択の余地が無い場合を除き一般的には(データ転送速度の遅い)バージョン1.1の使用を避けることをおすすめいたします。

FireWireの標準も数種類もの可能な転送速度を定義しますが、実際には一般的に「FireWire」といえば最大400Mbits/sをサポートする「FireWire400」を意味します。

転送速度に関して言えば、USB 2.0 と FireWire のどちらを選んでも特に問題はありません。USB 2.0 の方が数字の上では高いデータ転送速度を誇りますが、実際にはプロトコルの相違により両方とも同等になりがちです。もしもマシンに両方とも接続可能であれば、(後に説明する理由から)FireWireよりもUSB 2.0を選択する方が賢いと言えます。FireWireしか無ければ、当然他に選択の余地がありません。最高の柔軟性を求めるために、USB 2.0 とFireWireの両方をサポートする(この記事で後に取り上げられるような)ドライブのラインナップから1台を選ぶのも手です。

必須のポートの無いマシンには、FireWireまたはUSB 2.0用の(デスクトップにはPCI、ラップトップにはPCMCIA)カードが廉価で入手可能です。例えば、この記事で使用したPCMCIA FireWireカードは、だいたい10 GBP(U.S. $20以下)で購入しました。

この記事の目的のために、5-1/4 インチの外部ドライブ用エンクロージャーを購入しました。CD-RW/DVD-RWドライブのような5-1/4インチのIDE装置そして3.5インチHDD を含む標準のIDE装置を入れられ、ドライブが購入時に付属しませんので、それは柔軟性の高いエンクロージャーと言えます。そのエンクロージャーにはUSB 2.0とFireWire両方の接続が可能です。

(内蔵されたUSBポートはUSB 1.1のみをサポートしますので)IBM Thinkpad T30ラップトップにそのエンクロージャーを接続するために、PCMCIA FireWireカードも購入しました。

エンクロージャー(約50GBP)とFireWireカード(約10GBP)は両方とも比較的廉価でした。

テストの趣旨のために、そこら辺に転がっていて遊んでいた13GB 3.5インチIDE HDDをエンクロージャーの中に入れました。実社会での用途には、より容量の大きい(最近では1GBあたり約50GBPと安くなった)HDDを購入すべきでしょう。

Linux サポート

予想通り、この類のエンクロージャーへのLinuxサポートは確かに質が高いです。大容量記憶装置用のSBP(Serial Bus Protocol)標準を支持するデバイスを簡単にLinuxで使用可能です。

一般的に、これらのデバイスへのサポートを可能にするには、カーネルにてサポートされるもの(モジュール内にてコンパイルされるか、モジュールを介するか)がいくつか必要です。

USBそしてFireWireへのSBPデバイスのサポートは、SCSIエミュレーションを介して行なわれます。つまり、Linux上ではデバイスはSCSIディスクとして捉えられます。それはLinuxの世界にて記憶装置を抽象化する一般的な方法です。例として、IDEのCD/DVDドライブも一般的にSCSIエミュレーションで接続されています。この理由から、次に述べられるカーネル・サポートは必須です。

  • SCSIサポート
  • SCSIエミュレーション
  • SCSIディスク・サポート

さらに、接続の方法には以下のサポートは必要となります。

  • FireWire用:
  • IEEE1394サポート
  • OHCI1394サポート
  • RAW1394サポート
  • SBP-2サポート
  • USB用:
  • (ホスト側)USBサポート
  • OHCIサポート
  • UHCIサポート
  • USB大容量記憶サポート

当然ですが、他のハードウェア(グラフィック・カード等)への通常のサポートは必要であり、ハードウェアによっては追加的なモジュールを必要とする場合もあります。

例えば、PCMCIA(CardBus)FireWireカードを使用する場合、以下の項目を追加します。

  • PCMCIAサポート
  • CardBusサポート

インストール

この時点で役に立ちそうな外部ドライブの準備ができていますので、Linuxを早速インストールしてみましょう。

(これは私の個人的な意見ですが)ここ最近で最も簡単なLinuxインストールの方法は、全てのハードウェアを接続し(この場合、PCMCIA FireWireカードのはめ込み、PCMCIAカード/ドライブ間のFireWireケーブル接続、そしてドライブのパワー・スイッチを入れることを意味します。)、お気に入りの配布インストールCDでマシンを起動することです。

ここで選ばれたディストリビューションはGentoo (参考文献にリンクがあります)ですので、最新の"Universal" x86 Live CD (2004.1)を使用しました。他の配布物で必要とされるステップもここで述べられる概略と多かれ少なかれ似たようなものです。

インストールCDでブートをした後、運がよければドライブの存在が認識されます。ドライブは/dev/sdX(Xは「a」から始まる小文字)のもとで表示されます。この記事で使われるシステムでは、外部ドライブは/dev/sdaとして検出されましたが、他のSCSI(ハード)ディスク(またはSCSIとしてエミュレートされた(ハード)ディスク)が既にあれば別の結果を得ることとなります。その場合、それは/dev/sdbかも知れませんし、最後の部分がまた別の文字になる可能性もあり得ます。仮にドライブが自動的に検出されなければ、次のステップが必要となります。例えば、FireWireやPCMCIAを使用可能にするためにブートのオプションを省くべきかも知れませんし、カーネル・モジュールの一部を手動でロードし、その類のことをすべきかも知れません。(トラブルシューティングのガイドでしたら、参考文献をどうぞ。)

一度ドライブが認識されれば、その後に続くインストールの過程の間に関して言えば、それは内蔵ドライブのごとく振る舞うはずです。必要とされるとおりにパーティションを掛け、通常どおりにLinuxをインストールできます。

ここで一つ忠告を入れておきます。ブート・ローダー(通常GRUBかLILO)をインストールする場所を判断するときに注意が必要です。通常デフォルトとして設定されるMBR(Master Boot Record)にはインストールしないことを推奨します。それよりも、外部ドライブのルート・パーティション(または、分離型を使用しているのであればブート・パーティション)にインストールすべきです。

Linuxがデバイスにインストールされたので、ブートに入ります。ここで事は少しややこしくなります。

ブート

新規ドライブのブートの論議に入る前に、ブート・ローダーに関する理論が必要です。

通常、ブート・ローダーはマシン内の最初のHDDのMBRにインストールされています。ブート・ローダーが呼び出されれば(BIOSはMBR内のコードを自動的に実行します)、普通それは選択可能なブートに使うOSのメニューを表示します。与えられたOSを選択すれば、それはブートされます。

この筋書では2つの項目が考慮されるべきです。

  • 選択可能なOSのメニューは(通常)ディスクからロードされます。
  • 関連性のあるOSをブートするには、ブート・ローダーはディスクから関連性のあるカーネルを読み込む必要があります。

OSがロードされる前に上記のステップが行なわれますが、全てのディスク読み込みはBIOS呼び出しを介して行なわれます。これは深刻な問題をはらみます。つまり、ディスクを直接ブートするためには、BIOSはFireWireまたはUSBを介して接続されたディスクをサポートしなくてはなりません。これらの種類のディスクからブートしようとする場合に、この事態とよく遭遇します。FireWireをサポートするBIOSは現時点ではかなり希少ですが、USBをサポートするBIOSはほどよく普及しています。それゆえに、USBを比較的新しいマシンにて使用しているのであれば、ドライブをLinuxに直接ブートできるはずです。

外部ドライブのMBRの中にGRUBをインストールした後、USBを介して接続すれば直接ブートできました。単純に、ディスクが接続される状態でブートしているときにBIOSセットアップ・ユーティリティーに入るだけです。外部HDDは通常のHDDとして表示されます(ブートの順番で内蔵ドライブよりも先に来るように動かしてください)。

内蔵ドライブのMBRの中にブート・ローダーをインストールし、それを使ってUSB HDD(GRUBではhd1と表示)をブートすることもできました。もしもFireWireを使用しているのでしたら、多分BIOSはドライブを直接ブートできないので、もう少し『ひねり』を加える必要があります。

幸運なことに、Linuxの柔軟性のおかげで、(この記事の例で直面したPCMCIA FireWireカードが関与する状況でそうであったように)直接ブートができなくても結構簡単な解決法があります。フロッピー・ドライブ、CD、USB メモリー・キーやメインのHDDの小さなパーティションなどのサポートされたデバイスから予備的なブートの段階を踏まえてから、その後のプロセスを外部ドライブで実行するのも手です。

ブート・イメージを構築

ブートの方法には2種類あります。

  • 1フェーズ・ブート
    初期化スクリプト(通常は/sbin/init)を呼び出すことにより、カーネルはブートし、ルート・ファイルシステムをマウントし、そして初期化を続行します。
  • 2フェーズ・ブート(initrd)
    カーネルのブートは、初期のRAMディスク(initrd)をマウントし、より深く入り込んだカスタム化可能な初期化を実行し、そしてルート・ファイルシステム をマウントして初期化を続行(ここでも通常は/sbin/initを呼び出します)します。

それぞれの方法にはそれぞれの長所と短所があります。

1フェーズ・ブート

1フェーズ・ブートを使用するには、標準装備のルート・ファイルシステムを装着するうえで必要なドライバーの全てを含むカーネルを構築します。(通常の初期化にてルート・パーティションからロードされるモジュールにて他のドライバーは構築されます。)

フロッピー・ディスクのように容量の小さいデバイスからブートしようとしているのであれば、(ルートの外部ファイルシステムをマウント可能にするために)ドライバーを十分な量だけ搭載したカーネルを構築し、そしてその他の全てをモジュールとして構築するのが最良の手段です。例えばこの記事の例では、SCSIサポート、PCMCIAサポート、IEEE1394サポート、SBP、そしてそれに類似する項目のサポートが組み込まれていますが、その他の項目の全て(グラフィック・カードのサポート、ネットワーク・デバイスのサポート、そしてその他のサポートを含む)はフロッピーと言うよりも外部HDDのルート・パーティションに保管されたモジュールとして構築されています。

単純な(1フェーズ)ブートのプロシージャーで、必要なサポート付きのカーネルを構築し、フロッピー・ドライブにそれを入れ、フロッピーにブート・ローダーをインストールし(ここではGRUBを使用しましたが、他にもLILOのような選択肢もあります。)、下記に類似するものでブートします(GRUB用)。

root (fd0)
kernel (fd0)/boot/bzImage root=/dev/sda1

これはほとんど完全に機能しますが、2点の問題に直面します。

  1. SBPサポートはSCSIエミュレーションに頼るので、エミュレートされたSCSIバスはディスクを検出し/dev/sda1を装着するために『再スキャン』される必要があります。このスキャンを、いくつかの簡単なコマンドで実行します。しかし、残念ながら、1フェーズ・ブート実行時には、カーネルがブートを終了するまではどのコマンドをも実行できません。それに、ルート・ファイルシステムがマウントされるまではカーネルはブートを終了できません(昔からよくあるCatch-22(行き詰まり)の状況です)。ありがたいことに、起動時にSCSIバスをスキャンするようにする2.4カーネルのためのパッチがあります(詳細については参考文献を参照のこと)。このパッチを応用することにより、再スキャンのコマンドを必要とせずにブートアップ中にカーネルにより自動的に外部ドライブを検出できました。(しかし、「一難去ってまた一難」とはよく言ったものです。)
  2. カーネルには『タイミングの窓』と言えるものがあり、正確に検出または初期化される機会にめぐり合う前にルート・デバイスを装着するようにカーネルは実行します。ここでも、単に起動時に短時間カーネルに待機させて外部ドライブに認識される時間を与え、ルート・ファイルシステムの装着に失敗した場合に再試行させるパッチがあります(参考文献にリンクがあります)。

この記事では、これら2つのパッチを応用することにより、外部のFireWireドライブをブートしてからルートとして使用するカーネルをブート可能フロッピー・ディスク上にて構築することに成功しました。

このアプローチでの主な問題点は、カーネル・ソースにパッチを適用する必要があることです。これは最善の事態(カーネルの新バージョンが公開されている)でも面倒くさく、最悪の場合(カーネル内の他の変更にパッチの整備が追い付いていない)には洒落にならないほどに深刻な問題に発展します。

BIOSがUSBまたはFireWireをサポートし、直接ブートを実行すれば、これら2点の問題を回避できると思われたのではないでしょうか?残念ながら、そうは問屋が卸しません。この方法ではブート中にディスクにアクセスするためにBIOS呼び出しを活用しますが、一度カーネルが初期化され始めれば、BIOSの使用はなくなり、カーネル・ドライバーでディスクをアクセスします。つまり、前述と同じ問題に直面するわけなのです。

2フェーズ・ブート

バージョン2.0.Xのカーネルにおいては、Linuxカーネルに興味深い能力が追加されました。それは『初期RAMディスク』(またはinitrd)を活用し、2フェーズ・ブートのプロセスを提供します。

要するに、カーネルは通常どおりにブートされます。しかし、『本物』のルート・ファイルシステムを装着する代わりに、RAM内にてルート・ファイルシステムの縮小版が作成されてから装着されます。実際のルートが装着される前に初期の環境にていくつかの任意のステップが実行され、実際のルートの使用に切り換えると同時に最初のRAMディスクを破壊します。

これは様々な状況で使えますが、ここでの趣旨のために、ここではSCSIバスを再スキャンするために縮小化された環境を使用し、外部ディスクが認識されるのを待ち、そしてそれを実際のルートとして使用するように切り換えてブートを続行します。

この方法を実行するには、カーネルとinitrdイメージの2つを作成する必要があります。

カーネルとは、Initrdサポートが組み込まれたカーネルを指します。initrdイメージは、ループバックのファイルシステムのイメージで、それは縮小化されたルート・ファイルシステムを含みます。選択肢の一つとして、そのサイズを縮小するためにこのイメージをgzipで圧縮できます。

独自のinitrdイメージを作成またはカスタムするうえで役立つ情報をより多く入手するのでしたら、参考文献をチェックしてみてください。

initrdイメージの中には、linuxrcと呼ばれるファイルがあります。initrdがロードされるときにlinuxrcファイルが実行されますので、execute (実行)の許可が入っていることを確認してください。ここでの趣旨のために、linuxrc は簡単になっております。

リスト1. initrd linuxrc
#!/bin/sh
REAL_ROOT=/dev/sda1
# mount the /proc filesystem
mount -t proc none /proc
#for scsi-emulation
# modprobe sd_mod
#for pcmcia
# modprobe pcmcia_core
#for FireWire
# modprobe ieee1394
# modprobe ohci1394
# modprobe raw1394
# modprobe sbp2
#for USB
# modprobe usbcore
# modprobe ohci-hcd
# modprobe uhci-hcd
# modprobe usb-storage
# loop rescanning the scsi bus + rerunning devfsd
retries=5
i=1
until [ -e $REAL_ROOT ]
do
  if [ $i -gt $retries ]
  then
     echo "Unable to mount real root ($REAL_ROOT) - Giving up!"
     /bin/ash
     exit
  fi
  echo "Real root ($REAL_ROOT) not found, retrying ($i)"
  sleep 1
  echo "scsi add-single-device 0 0 0" > /proc/scsi/scsi
  echo "scsi add-single-device 1 0 0" > /proc/scsi/scsi
  echo "scsi add-single-device 2 0 0" > /proc/scsi/scsi
  /bin/devfsd /dev -np
  i=$((i+1))
done
#umount /proc as it will be remounted by the normal init process
umount /proc
#now we simply exit, and the normal boot process should continue
exit 0

ここでは単に外部ドライブをサポートするために適切なモジュールをロードしているだけにしか過ぎません。要望に応じてコメントを解除します。(必要とされるサポートをカーネル内に構築しましたので、必要とされるモジュールはありません。)そこで、ルート・デバイス(ここでは/dev/sda1)が現われるまでループをして(疑似ファイルシステム /proc 内の特殊なファイルシステムへコマンドをエコーしdevfsdを呼び出すことにより)SCSIバスを再スキャンします。このケースでは、エミュレートされた(ここで取り上げられている)FireWire SCSIバスは1 0 0であり、ついでに他のパターンを試すのも手です。どれを使うかを知ってさえいれば、スクリプトを仕立てられます。それから、他にもSCSIデバイス(またはエミュレートされたSCSIデバイス)があれば、ドライブは別の文字を抱くかも知れません(例:/dev/sdb1)。もしも外部ドライブの最初のパーティションを使用していないのであれば、別の数字を使用する必要があるかも知れません(例:/dev/sda2)。

ここで必要なのは、実際的なファイルをinitrdイメージにコピーすることのみです(mount -o loop コマンドを使用して非圧縮イメージを装着できます)。特に、linuxrcファイル、そこで使われる全てのコマンド、そしてそれらのコマンドが信頼を寄せるライブラリーがあることを確証すべきです。(装着されていない)イメージの圧縮を選択することも可能です。

そこで、カーネル(bzImage)そしてinitrdイメージ(initrd.gz)は、フロッピー(ブート可能、ext3)にコピーされます。

最後のステップでは、フロッピーにブート・ローダーをインストールし、そしてカーネルを下記のオプションでブートします。 kernel bzImage root=/dev/sda1 initrd=initrd.gz.

ここでフロッピーを使用してのブートが可能になります。それはフロッピーからカーネルをロードし、RAMにinitrdイメージをロードし、ルート・デバイスが認識されるまで待機し、そしてそこから通常どおりにブートを続行します。ここから後でしたら、フロッピーをいつ取り出しても大丈夫です。

仮にフロッピーがふさわしくなければ(例えば、マシンにフロッピー・ドライブが無い状態であれば)、BIOSによりブートされるデバイスならば何でも利用可能です。自分でしたら、この用途のために小型の32MB USBキーを使用します。別の方法として、もしも内蔵HDDを変更することをいとわないのであれば、より便利なブートのためにHDD内部にて小さなパーティションを作成することも可能です。


ダウンロード可能なリソース


関連トピック

  • Gentoo Linuxは、著者が選んだディストリビューションです。
  • USB大容量記憶装置をLinuxにインストールする際のトラブルシューティングの秘訣でしたら、Adding USB mass storage devices in Fedora Coreをお読みください。
  • 予約申し込みを通して IEEE 1394 for Linux は、Linux上のFireWireの情報とリンクを提供します。
  • 無料の百科事典であるWikipediaでは、FireWireブート・ローダーに関連する記事が掲載されています。Linux用の最も一般的なブート・ローダーは、LILOとGNUGNU GRUBです。
  • sbp2 hotplug patchSPB-Linuxのパッチは、1フェーズ・ブートの操作に役立ちます。
  • ご自身のカスタムinitrdイメージをゼロから作成したいのであれば、The Linux Bootdisk HOWTOをお読みください。
  • Knoppixがディスク1枚でブート可能なLinuxを実現」(developerWorks、2003年2月)は、CD1枚でブート可能なLinux distroを紹介します。
  • JavaアプリケーションからUSBデバイスにアクセスする」(developerWorks、2003年9月)は、APIを提供する2つのプロジェクトを検査し、Javaアプリケーションはそれらを介してUSBデバイスを役立てます。
  • コマンド行の能力を最大限に活用することにより、どのようにして自分の.isoイメージを作成するかを、「LinuxでCDを焼く」(developerWorks、2003年)が示します。
  • 過去に著者(Martyn Honeyford)は「Connecting KDE applications using DCOP」(developerWorks、2004年02月)、「Postmortem memory profiling with PERL」(developerWorks、2003年12月)、そしてSignificant traceシリーズの記事(developerWorks、2003年04月)をdeveloperWorksにて提供してきました。
  • より多くのLinux開発者用のリソースをお探しでしたら、developerWorks Linux zoneをご覧ください。
  • Developer BookstoreのLinux部門にて、Linux関連書物を割引価格でお買い求めください。
  • developerWorks Subscriptionの予約申し込みを通して最新のIBMツールとミドルウェアを活用し、Linuxアプリケーションを開発そしてテストしましょう。developerWorks Subscriptionへの予約申し込みをすれば、WebSphere、DB2、Lotus、Rational、そしてTivoliからのIBMソフトウェア、そのソフトウェアを12ヶ月間使用できるライセンスを、予想よりもお値打ちな価格で入手できます。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=228452
ArticleTitle=FireWireのデバイスからLinuxをブート
publish-date=07152004