開発マシンのファイルを流用してinitrdファイルを作成する
早速,自分Linux用initrdファイルの作成を開始しよう。自分Linux用initrdファイルは,他のファイルと区別しやすいようにファイル名「ramdisk.img」とする。なお,作成手順が複雑なため,2段階に分けて作業する。前半の手順は次の通りだ。
(1)ひな形のinitrdファイルを作成
(2)initrdファイルを展開
(3)ファイル・システムとしてマウント
(4)linuxrcスクリプトの書き換え
(5)ドライバの導入
(1)のひな形になるinitrdファイルとは,自分Linux開発マシンで用いられているinitrdファイルだ。mkinitrdコマンドにより作成できる。initrdファイルを一から作成するにはディレクトリを作ったり,linuxrcスクリプトを記述したり,起動時に必要なドライバを用意したりと煩雑な作業が必要となる。ひな形になるinitrdファイルがあれば,linuxrcスクリプトを自分Linux用に書き替えて,必要なドライバを組み込むだけで済むため簡単だ。
(1)ひな形のinitrdファイルを作成
ひな型になるinitrdファイルを作成するためのコマンドは,
だ。これで/usr/local/src/origdev/bootディレクトリにinitrdファイル(ファイル名:initrd.img)が作成される。
(2)initrdファイルを展開
前述の通り,initrdファイルはgzipコマンドで圧縮されている。そのため,
のように展開しておく。これで,/usr/local/src/origdevディレクトリに展開されたファイル(ファイル名:initrd)が作成される。
(3)ファイル・システムとしてマウント
展開して作成されたファイルは,RAMディスクとしてメモリーに書き込める状態(イメージ)になっている。そのため,このままではその中にあるファイルをエディタなどで直接編集することは困難だ。Linuxでは,このようなファイルを任意のディレクトリにファイル・システムとしてマウントできる仕組み「ループバック・デバイス」が用意されている。それを用いよう。
ループバック・デバイスを利用するためのコマンドは2種類ある。losetupコマンドあるいは,「-o loop」というオプションを指定したmountコマンドだ。ここでは後者のコマンドを使用する。それでは,mountコマンドを用いて,展開して作成されたinitrdファイルをマウントしてみよう。マウントするディレクトリは本講座初回に作成したRAMディスク用ディレクトリ(/mnt/ram)である。
エラーもなくマウントできたら,念のため内容を確認しておく。
「bin」「dev」「etc」「lib」「loopfs」「proc」「sys」「sysroot」という8つのディレクトリと,「linuxrc」「sbin」という2つのファイルが存在すればよい。
(4)linuxrcスクリプトの書き替え
ファイル・システムとしてマウントしたら,いよいよ自分Linux用にカスタマイズする。まずはlinuxrcスクリプトを書き替えよう。書き替えたlinuxrcスクリプトは図5のようになる。
図5 自分Linux用のlinuxrcスクリプト 自分Linuxをコンパクト・フラッシュ内に収めた場合の例だ。 [画像のクリックで拡大表示] |
●ドライバの読み込み設定
図5の(1)が,ドライバを読み込んでいる個所だ。ドライバの読み込みにはismodコマンドを用いる。自分Linuxのカーネルでは,ほとんどのドライバをモジュール化して後から組み込むようにしている。そのため,読み込む必要のあるドライバがいくつかある。具体的には,Ext3ファイル・システムとUSBメモリーを扱うためのドライバ群だ。
Ext3ファイル・システムに関するドライバは「ext3.o」と「jbd.o」の2種類である。ext3.oがExt3ファイル・システムを認識させるドライバ,jbd.oがExt3のジャーナリングを利用するためのドライバである。ext3.oよりも先にjbd.oを読み込ませる必要がある。
USBメモリーを扱うためのドライバは,「ehci-hcd.o」「usb-ohci.o」「usb-uhci.o」「uhci.o」,「scsi_mod.o」と「usb-storage.o」の6種類だ。「usbcore.o」というUSBインタフェースの核になるドライバも読み込ませる必要があるものの,自分Linuxのカーネルではこのドライバを直接組み込んでいるため,ここでは不要だ。
scsi_mod.oは,SCSIデバイスの核(コア)になるドライバであり,usb-storage.oはUSB接続ストレージ用ドライバである。scsi_mod.oが必要な理由は,USB接続のストレージはLinuxからはSCSI接続のディスク装置と認識されるため。そこでSCSIのドライバが必要になる。
ehci-hcd.o,usb-ohci.o,usb-uhci.o,uhci.oはそれぞれUSBコントローラ(チップ)ごとに用意されているドライバだ。usb-uhci.oとuhci.oは米Intel社や台湾VIA Technologies社で採用されているUHCI(Universal Host Controller Interface)に対応したUSBコントローラ用ドライバであり,UHCIのUSB1.1(データ転送速度12Mビット/秒)による通信に必要だ*4。
usb-ohci.oは,台湾ALi社や台湾Silicon Integrated Systems社,米OPTi社などが採用しているOHCI(Open Host Controller Interface)に対応したUSBコントローラ用ドライバであり,OHCIのUSB1.1による通信に必要である。
ehci-hcd.oはUSB2.0(データ転送速度480Mビット/秒)による通信のためのドライバである。
以上,8種類のドライバを読み込ませるように設定した。しかし,自分Linuxにはehci-hcd.oが存在しない。実は,前回のカーネル・パラメータ設定時に「EXPERIMENTAL」と書かれたパラメータを無効にしたことで,カーネル・コンパイル時には作成されなかった。
ehci-hcd.oはUSB2.0による通信を利用しなければ不要だが,USB2.0による高速なインタフェースを使いたいユーザーは多いだろう。そこで,付録CD-ROMに筆者がコンパイルしたehci-hcd.oを収録したので,それを活用していただきたい*5。
なお,ehci-hcd.oを使えるようにするには,/tmpなどの任意のディレクトリにehci-hcd.oをコピーし,さらに/usr/local/src/origdev/lib/2.4.29-mylinux/kernel/drivers/usb/hostディレクトリ内に移動し,ehci-hcd.oのファイル属性を正しい属性に変更する。
●RAMディスク上にRFSを作成
図5の(2)が,実際のルート・ファイル・システムをRAMディスク上に読み込み,RAMディスク上のルート・ファイル・システムを自分Linuxのルート・ファイル・システムに設定している個所だ。本講座初回にも述べたが,自分Linuxではルート・ファイル・システムをRAMディスクに配置する。
前項のドライバの読み込みにより,IDE接続のコンパクト・フラッシュやUSBメモリー上のファイル・システムが認識される。認識には時間がかかるため,
を実行して,5秒間処理を停止している。そして,
により,/proc/partitionsファイル上の認識されたブロック・デバイス一覧を用いて,/devディレクトリ内にブロック・デバイスを作成している。
では,/proc/sys/kernel/real-root-devファイルにルート・ファイル・システムに割り当てたいデバイスのデバイス番号をechoコマンドとリダイレクト(>)を用いて書き込んでいる。こうすると,そのデバイスがルート・ファイル・システムとしてマウントされる。自分Linuxでルート・ファイル・システムに割り当てたいRAMディスクのデバイス番号は「0x0100」*6である。
さらに,
により,/FMディレクトリに自分Linuxのルート・ファイル・システムを含むパーティションを,書き込み禁止でマウントしている。そして,
のように,ファイルの同期を図るrsyncコマンドを用いて,-axオプションによりファイルやディレクトリの属性をそのままにファイル・システムの境界を横切らないように自分Linux用のルート・ディレクトリに自分Linuxのルート・ファイル・システムをコピーしている。これで,RAMディスク上に自分Linuxのルート・ファイル・システムが作成される。
linuxrcスクリプトが終了すれば,RAMディスク上のファイル・システムが自分Linuxの正式なルート・ファイル・システムとして扱われる。
(5)ドライバの導入
linuxrcスクリプトを書き替えたら,ドライバを導入しておこう。前述したehci-hcd.o以外のドライバは本講座第4回のモジュールのコンパイル時に作成されている。ドライバのファイルは,/usr/local/src/origdev/lib/2.4.29-mylinux/kernelディレクトリに存在するため,図6のように/mnt/ram/libディレクトリにある既存のドライバをすべて削除し,/usr/local/src/origdev/lib/2.4.29-mylinux/kernelディレクトリからドライバを1つずつコピーする。
図6 ドライバのコピー 自分Linux用カーネルのドライバに入れ替える。 |