PR

自分LinuxのRFSを作成

 では,実際に自分Linuxのルート・ファイル・システム(RFS)を作成しながら,初期化プロセス実行の仕組みを理解していこう。

 ルート・ファイル・システムを作成する手始めとして,自分Linux構築作業用ディレクトリ( / u s r / l o c a l / s r c /origlinux)内に「boot」「dev」「etc」「tmp」「rootsys」というディレクトリを作る。

 ここで作成した5つのディレクトリは表1に示したように用いる。ぞれぞれのディレクトリに必要なファイルをコピーしておこう。

表1●作成する5つのディレクトリ
表1●作成する5つのディレクトリ
[画像のクリックで拡大表示]

 まず,/usr/local/src/origlinux/bootディレクトリと/usr/local/src/origlinux/devディレクトリには,次の手順で示したようにカーネル・イメージやinitrdファイル,デバイス・ファイルなどをコピーする。

 念のため,コピーしたら/usr/local/src/origlinux/bootディレクトリに「System.map」「mylinux」「ramdisk.img」という3つのファイルが存在することを確認しておく。

 最後に,rootsysディレクトリに,ルート・ファイル・システムに必要なライブラリ・ファイルやバイナリ・ファイルをコピーする。

 その際,/usr/local/src/origdevディレクトリ内の全ファイルをコピーすればよいが,/ u s r / l o c a l / s r c /origdev/bootディレクトリは不要なため,全体をコピーした後に/bootディレクトリだけを削除する。

 これで,自分Linuxを稼働させるためのライブラリ・ファイルやバイナリ・ファイルをすべて用意できた。

初期化プロセスの設定

 それでは初期化プロセスの実行に必要なファイルをそろえていこう。前述したように,自分LinuxではSystem Vのinitを採用する。そのため,自分Linuxの初期化プロセスの実行に関する設定は,inittabファイルに記述する。

 図2に示したinittabファイルが,自分Linux用に用意したものだ。このinittabファイルには,「rc.sysinit」「rc0」「rc1」「rc2」「rc3」「rc4」「rc5」「rc6」という8つのスクリプトが設定されている。rc.sysinitは,システム起動時に実行されるスクリプトであり,rc0からrc6は各ラン・レベルの状態になった際,最初に実行されるスクリプトだ。

図2●/usr/local/src/origlinux/rootsys/etc/inittabファイル
図2●/usr/local/src/origlinux/rootsys/etc/inittabファイル
[画像のクリックで拡大表示]

 では,これらのスクリプトを自分Linux用に作成していこう。作成した8つのスクリプトは,/usr/local/src/origlinux/rootsys/etcディレクトリ以下にすべて保存する。

(1)rc.sysinitスクリプト
 rc.sysinitスクリプトには通常,ドライバの読み込みや各種デバイスの初期化,ファイル・システムのマウント,ホスト名の設定,スワップの有効化など,Linuxを稼働させるために必要な初期設定を記述する。自分Linuxの場合,当面必要ではない初期設定はあとから追加していくことにして,フラッシュ・メモリーのアンマウントとホスト名の設定に限定した(図3)。

図3●/usr/local/src/origlinux/rootsys/etc/rc.sysinitスクリプト
図3●/usr/local/src/origlinux/rootsys/etc/rc.sysinitスクリプト
[画像のクリックで拡大表示]

(2)rcスクリプト
 前述した通り,rc1からrc6は各ラン・レベルの状態になった際,最初に実行されるスクリプトである。スクリプト名の最後の数値がラン・レベルを表している。これらのスクリプトには,各ラン・レベルで起動または終了させたいデーモン(またはサービス)の設定などを記述する。*4

 各ラン・レベルでのLinuxの動作状態は表2に示した通り。自分Linuxでは,マルチ・ユーザーによるテキスト・ログインのみを用いるため,ラン・レベルとしては「0」と「3」と「6」を準備すればよい。ただし,システム起動時に問題が発生したときに対処するためのシングル・ユーザー・モードや,将来的にはX Window Systemを用いたグラフィカル・ログインを利用することも考慮して,その他のラン・レベルも作成した。

表2●ラン・レベルとLinuxの動作状態(Red Hat系)
表2●ラン・レベルとLinuxの動作状態(Red Hat系)

● rc0スクリプト
 ラン・レベル0はシステム停止の状態である。そのため,rc0スクリプトでは「Halt Process......」というメッセージを表示させ,haltコマンドでPCを停止させた(図4)。

図4●/usr/local/src/origlinux/rootsys/etc/rc0スクリプト
図4●/usr/local/src/origlinux/rootsys/etc/rc0スクリプト

● rc3スクリプト
 ラン・レベル3は,マルチ・ユーザー環境で,テキストによるログイン・プロンプトを表示させた状態だ。自分Linuxでは,ラン・レベル3が通常の運用状態になる。そのため,rc3スクリプトには,自分Linuxの運用中に動作させておきたいデーモンの起動設定などを記述しておく。具体的には,システムとカーネルが出力するログを取得するデーモンの起動設定と,ネットワークを利用可能にする設定を記述した(図5)。

図5●/usr/local/src/origlinux/rootsys/etc/rc3スクリプト
図5●/usr/local/src/origlinux/rootsys/etc/rc3スクリプト
[画像のクリックで拡大表示]

 最初に,システム・ログを取得するデーモン(syslogd)とカーネル・メッセージを取得するデーモン(klogd)を起動している(図5の(1))。この2つの デーモンを起動したことで,自分Linuxから出力される各種ログが収集可能になる。

 そして,図5の(2)で,ネットワーク設定を実施している。まず,ismodコマンドを用いて,ネットワーク・インタフェース・カード(NIC)用のドライバを読み込んでいる*5。自分Linuxは,自分Linux開発マシンや自分Linux稼働マシンとして用意した複数のハードウエア上で動作させる必要がある。そのため,NIC用のドライバも複数読み込ませている。

 ちなみに,この設定では表3に示した6種類のドライバを読み込ませている。これは筆者の環境なので,読者の環境に合わせて適宜変更してほしい。

表3●/読み込ませたドライバ
表3●読み込ませたドライバ
[画像のクリックで拡大表示]

 ドライバを読み込ませたら,ifconfigコマンドやrouteコマンドを用いて,IPアドレスやサブネットマスクなどを設定する。まず,

により,「lo」(ローカル・ループバック)という仮想的なネットワーク・インタフェースに「127.0.0.1」(ループバック・アドレス)を設定する(図5の(3))。そして,この設定を,

によりルーティング・テーブルに追加する。最後に,

として,NICにIPアドレスやサブネットマスクを設定し,ネットワークを利用可能にする。

 NICは認識された順に,「eth0」や「eth1」という名前が割り当てられる。1枚しかNICを実装していなければ,eth0に割り当てられるため,eth0に対してIPアドレス「192.168.1.1」,サブネットマスク「255.255.255.0」,ブロードキャスト・アドレス「192.168.1.255」を設定している。IPアドレスやサブネットマスク,ブロードキャスト・アドレスも読者の環境に合わせて適宜変更していただきたい。

● rc6スクリプト
 ラン・レベル6はシステム再起動の状態である。そのため,rc6スクリプトでは「Reboot Process.....」というメッセージを表示させ,rebootコマンドでPCを再起動した(図6)。

図6●/usr/local/src/origlinux/rootsys/etc/rc6スクリプト
図6●/usr/local/src/origlinux/rootsys/etc/rc6スクリプト
[画像のクリックで拡大表示]

● rc1,rc2,rc4,rc5スクリプト
 rc1とrc2,rc4,rc5スクリプトに関しても,それぞれの状態に合わせた設定が必要になる。ただし,前述のように,自分Linuxではこれらのスクリプトを用いるラン・レベルを利用しない。そこで,これらのスクリプトはとりあえず,rc3スクリプトと同様しておく。lnコマンドを用いて,

のようにリンクさせれば,rc3スクリプトと同じ設定をいつでも保てる。