第1章 初めてLinux/UNIX系OSにふれる
エンジニアのための最初の一歩(2)

カーネルとディストリビューション(2)

 

1.1カーネルとディストリビューション(その2)

ディストリビューション

 先に述べたように,Linuxには数多くのディストリビューションが存在します.各ディストリビューションごとに方針や用途が異なるので,実現の方法も異なることになります.では,具体的に何が異なるのか,ここで少し見てみます.

インストーラ

 通常は,小さなLinuxシステムをフロッピーディスクなどから起動し,ディストリビューション固有のインストーラを起動します.インストーラは,システムに必要なプログラムや設定を順次行っていきます.

 多くの場合,PCにはすでにWindows98/NTがインストールされていますが,それを考慮して,すでに動作しているOSからLinuxをインストールするようなディストリビューションも最近は増えてきています.インストーラは,デバイスの認識方法やユーザーインターフェースなど,ディストリビューションの間でもっとも違いがわかる部分です.

initプロセス

 Linuxではカーネルが起動すると,まずinitプログラムを実行します.このinitがすべてのプロセスの祖先になります.

 initは,/etc/inittab注2を読み,そこに書かれた内容に沿ってシステムの起動時の処理を行います.inittabからはプログラムやシェルスクリプトを起動して実際に初期化の処理を行いますが,このinittabの変更やシェルスクリプトを変更することで,UNIXでは自由度の高い設定が可能になっています.

 /etc/inittabは,説明したように,UNIX環境の性格付けを決定するものなので,内容はディストリビューションによって異なります.ここで,各ディストリビューションごとの/etc/inittabの違いを図4に示します.

 

(図4)各ディストリビューションにおける/etc/inittabの一部

(システムの最初の初期化とランレベル3への移行)

 

# System initialization (runs when system boots).

si:S:sysinit:/etc/rc.d/rc.S

# Script to run when going multi user.

rc:2345:wait:/etc/rc.d/rc.M

(a) Slackware 4.0
 
# System initialization.

si::sysinit:/etc/rc.d/rc.sysinit

l3:3:wait:/etc/rc.d/rc 3

(b) RedHat 6.0
 

si::sysinit:/etc/init.d/rcS

l3:3:wait:/etc/init.d/rc 3

(c) Debian 2.1

 さらに,inittabから呼び出されるシェルスクリプトの内容も異なるので,初期化に使われるディレクトリの構造やスクリプトは,それぞれのディストリビューションで異なることになります.

 ここでは,Ethernetの設定を例にとってみます.Ethernetインターフェースを設定するにはifconfigコマンドでIPアドレスを指定し,routeコマンドでスタティックなルートを設定します.これらのコマンドは,初期化の途中でスクリプトから呼ばれます.各ディストリビューションでは,図5に示すファイルでifconfigが実行されます.

(図5) 各ディストリビューションにおけるEthernetの設定
 

/etc/rc.d/rc.M -> /etc/rc.d/rc.inet1

ifconfigはrc.inet1で実行

IPアドレスなどの設定は/etc/rc.d/rc.inet1に直接書き込む

(a) Slackware 4.0
 

/etc/rc.d/rc 3 -> /etc/rc.d/rc3.d/S10network ->

/etc/sysconfig/network-scripts/ifup ifcfg-eth0

ifconfigはifupで実行

IPアドレスの設定は/etc/sysconfig/network-scripts/ifcfg-eth0に書き込むが,ゲートウェイの設定は/etc/sysconfig/networkに設定する

(b) RedHat 6.0
 

/etc/init.d/rcS -> /etc/rcS.d/S40network

ifconfigはS40networkで実行

IPアドレスなどの設定は/etc/rcS.d/S40networkに書かれている

(c) Debian 2.1

カーネルのバージョン

 これもディストリビューションごとに異なります.

 通常,ディストリビューションの開発には,その時点で最新のカーネルが使われます.しかし,カーネルには多くのデバイスドライバがあり,これらの動作確認など,多くの作業が発生するため,実際にそのディストリビューションが完成したときには次バージョンのカーネルがリリースされていることもあります.

 ここで,カーネルのバージョンよりも重要になるのがカーネルパッチです.デバイスドライバの説明でも触れたように,多くのドライバが開発されています.これらは正式にカーネルに採用されるまでは,非公式なパッチの形で配布されています.

 したがって,これらのパッチを採用するかどうかはディストリビューションによって異なります.たとえば,筆者らが携わっているLinuxMLDやLiveLinuxといったディストリビューションでは,そのデバイス(または新しい機能)に対するユーザーの必要性とドライバの安定性を考慮してカーネルにパッチをするかどうかを決めています.

パッケージング方法の違い ── rpm,deb,tarなど

 ここで言うパッケージングとは,あるプログラムをどのように配布するか,またはバージョンの変更などを管理する方法を指します.

 いままでもっとも普及していたのは,ソースコードをtarという形式で一つのファイルにまとめることでした.この方式はUNIXユーザーにとってそれほど不便なものではなく,手元のコンピュータに合わせてコンパイルし,インストールする作業を各人が行っていました.ただ,この方式は,Xやgcc,emacsといった大きなプログラムになると簡単ではありません.しかし,Linuxのシステム全体を配布するためには,当然のようにこのような大きなプログラムも含まれます.

 そこで,Linux上でビルドするために必要なパッチやライブラリの依存関係,ビルドの手順,バージョン,作成されたバイナリなどを管理するツールが開発されました.

 代表的なツールとして,rpmとdpkgがあります.RedHat社で開発されたものがrpmで,Debianプロジェクトで開発されたものがdpkgです.これらの間に互換性はありませんが,変換するためのツール(alien)はあります.

アプリケーションの選択

 それぞれのディストリビューションでは,収録するアプリケーションパッケージの選択方針も異なります.Debianのようにすべてを網羅するタイプから,GreenFrogのように必要最低限な小さなディストリビューションまで,各種さまざまです.とはいえ,収録されていないアプリケーションは,各自でソースコードからコンパイルすればよいだけのことなので,収録されているソフトウェアの数をそれほど気にする必要はありません.

日本語処理

 X Window Systemはすでに国際化されていますし,Linux(glibc)の国際化も進んでいます.しかし,日本語を表示するだけでなく,マニュアルページやかな漢字変換などを含めて考えると,欧米で開発されたディストリビューションそのままで日本語環境の整ったものはまだありません.すでに,日本では日本語環境をサポートする多くのディストリビューションが開発されているので,日本語を手軽に使う場合にはこちらを使うことになります.

 以上のように,カーネルやアプリケーションというユーザーとシステムにそれぞれもっとも近い部分は共通でありながら,その中間部分,つまりインストール方法やシステム管理で各ディストリビューションの個性が表れることになります(図6)

 

(図6)

ディストリビューションの共通/固有部分

 


注:2 UNIXのディレクトリ構造は,‘/’(ルート)を最上位とするツリー構造になっている.“/etc/inittab”と書いた場合,ルートの下にある“etc”というディレクトリに納められた“inittab”というファイルであることを示す.


Copyright 2000 
日樫 英孝/増田 佳泰/山岡 賢一/船木 陸議/ 羅 正華/森 友一朗/祐安 重夫/岩田 孝清/海老原 祐太郎/g新部 裕/ 齊藤 正伸 

新刊のご案内


Copyright 1997-2001 CQ Publishing Co.,Ltd.