いちばん近道なLinuxマスター術
![]() |
![]() |
![]() |
いちばん近道なLinuxマスター術 |
Linuxの運用はWindowsに比べ「難しい」といわれることが多い。理由として挙げられるのは,Linuxが主な用途をサーバとしていることを始め,システム環境の設定手段がWindowsのようにすべてGUI化されていない点だろう。しかし,Linux(PC UNIX)は個人だけでなく企業でこそ重要視したいコストパフォーマンスに優れたOSだ。うまく使いこなせば,堅牢なシステムとして威力を発揮してくれるだろう。この連載では,今までLinuxでサーバ構築したことのない人でも理解できるよう手取り足取り解説していく。 |
![]() ![]() |
起動スクリプトを知って基礎を理解しよう |
インターネットの利用形態は変化してきている。常時接続が可能なサービスが低価格化し,従来のように必要なときだけインターネットに接続するという時間制限がなくなりつつあるのだ。比較的低価格なOCNエコノミーやCATVインターネット,xDSL,IP接続サービスなどの常時接続であれば24時間好きなときにアクセスできる。
アクセスコストが下がりつつあることで,今までのように常時接続は企業のものという状況も変わるだろう。ある程度インターネットに慣れ親しんできている人であれば,24時間いつでもインターネットが利用できる価値を理解できるはずだ。
常時接続が一般化しつつあると,Webホスティングサービスを利用するだけでなく,自らサーバ構築を行ってみたいという要望も高くなるだろう。大容量のファイルでも時間を気にすることなくやり取りできるようになる。しかし,官庁でのクラッキング事件に代表されるように,日本のサーバ事情はアメリカのUG界などでウワサされるほど標的にされやすい。浅はかに初期設定のままインターネットサーバを公開することは避けなければならない。
Linuxを運営する上で最初のハードルとなるのは,前述のようにGUIでなくコマンドベースで操作することが多い点だ。最近の日本語ディストリビューションでは,linuxconfなどによってネットワーク設定が容易になってきたものの,いざというときは直接設定ファイルを変更する必要がある。
次なるステップは,インターネットサーバの構築手順だろう。Windows 2000などに比べサーバ設定特有の言葉を理解したり,設定ファイルを編集するといった多岐にわたる知識を要求されるのも壁となる要因の1つだ。稼動後してからもトラブルが起きた場合は,すみやかに解決できるような情報ソースも確保しておかなければならない。
「うちのサーバにはたいしたデータを置いていないし,不正侵入されても被害はない」と考える人がいるかもしれない。しかし,クラッカーの多くは不正侵入したからといって直ちにそのサーバのデータの破壊や改竄を行うケースは少ない。むしろ,ほかのサーバへ不正侵入するための踏み台とする場合がほとんどだ。クラッカーにとってはいかに身元を隠すかが重要であり,万が一アクセスログを調査されたとしても管理がずさんなサーバであれば満足なログさえ記録されていないことも多い。
また,自分のサーバを中継されてほかのサーバへ侵入されたとなれば,管理責任を問われることになる。インターネットに常時接続をするということは,その利便を得るだけではなく,インターネットを構成する一員として責任を負うことになるのだ。
この連載では,これからインターネットサーバの構築にチャレンジしてみようと思っている人や,構築手順とはどのようなものなのかを知りたい人に向けたものだ。インターネットで各種のサービスを提供したい場合,各サーバの設定をどのように行えばよいのかを,詳細かつ実践的に解説していく。取り上げるOSは,「Linux」,「FreeBSD」,「Solaris」である。Linuxについては,主要なディストリビューション(配布形態)といえる「Red Hat Linux」と「TurboLinux」を取り上げていく。
取り上げるPC UNIXなど「起動スクリプト」とは,別の名を「initスクリプト」と呼ぶ。プログラムの起動条件が記述されているファイルのことだ。OSの起動時に自動的に呼ばれるスクリプト(群)を指し,初期化作業や必要なサーバソフトの起動など,自動化する処理が記述されている。MS-DOSを理解している人であれば,CONFIG.SYSやAUTOEXEC.BATに相当するものだと考えればよい。
インターネットサーバのマシンであれば,起動時にサーバソフトが自動起動してほしいだろう。またサーバソフトだけでなく,毎回の起動時に行いたいものも多いはずだ。たとえば,Apacheのようなバージョンアップが頻繁なソフトは,自分でコンパイルしてインストールすることが多い。このような際は,自分で起動スクリプトを編集しなければならない場合がある。
UNIXの起動スクリプトは,MS-DOSと比較するとかなり複雑な動作をしている。これは,UNIXの柔軟性を表わしているともいえるが,十分に理解をしていなければまったく手を出せないということだ。自分の管理するサーバがどのように起動して,何が実行されているのかを把握するのは,管理者としての第一歩といえる。
そこでマシンが起動してからどのようにスクリプト群が実行されるのかを解説していこう。最初に起動後の流れを解説すると共に,個別のサーバソフトを起動させているスクリプト内容に着目しよう。また,自らスクリプトを作る場合,どのように組込めばよいのかを実例を交え解説していく。
まず最初にRed HatベースのLinuxディストリビューション(Red Hat Linux,Turbo Linux,LASER5 Linuxなど)を例に挙げて起動プロセスを紹介していこう。
起動スクリプトを理解するには,Linuxの起動がどのように行われているのかを知る必要がある。起動の仕組みは次の通りだ。
1.initの動作
Linuxの起動プロセスを知る場合,「init」と呼ばれるプログラムがポイントになる。initは,Linuxカーネルの最後に起動されるもので,以後起動されるすべてのプログラムにかかわるからだ。
すでにLinuxマシンが起動している場合,ps コマンドを使ってプロセスを表示するとプロセス番号(PID)が「1」になっているプロセスが見つかる(リスト1)。これが「init」の実体プログラムである。
initは,さまざまなプログラムやスクリプトを実行することによって,起動時や終了時の処理を担っている。
リスト1■psコマンドで見る実行プロセス
別ウィンドウで見る or list01.txt
initは,後述する「ランレベル(run level)」に応じて動作を切り換えることができるようになっている。起動時やシャットダウン時には,ランレベル(動作状態)を切り換えることによって,各種の処理を行っている。
ランレベルがどのように設定されるのかを見ていこう。まず最初に/etc/inittabファイルを見てほしい。inittabファイルは,initの動作を制御するための設定ファイルで,起動する際に最初に参照される設定ファイルなのだ。管理者といえこのファイルを編集するようなことはあまりないが,起動過程を理解するには避けられない。ここでは,起動の仕組みや起動時のスクリプトと併せて解説してみよう。
リスト2■/etc/inittab
別ウィンドウで見る or list02.txt
■ランレベル内容
Red Hat Linuxでは,7種類のランレベルを以下のように使い分けている。
レベル番号 | 内容 |
0 | システムを停止 |
1 | シングルユーザーモード |
2 | NFSをしないマルチユーザーモード |
3 | マルチユーザーモード |
4 | 未使用 |
5 | X11モード(GUIログイン) |
6 | 再起動 |
初めて知った人は,ランレベルという仕組みがなぜあるかという疑問も当然だ。Linux(UNIX)では,場合に応じて必要な処理を切り換える必要性がある。シングルユーザーのOSと異なり,さまざまなユーザーがログインしている可能性があるマルチユーザーOSは,rootだからといって好き勝手にシステムを再起動したりできないのだ。
リスト2の記述内容を順番に解説していこう。
id:3:initdefault: |
この行は,起動時のランレベルを「3」に設定しているという意味だ。ここで設定できる値には,ほかにも1,2,5があるが,一般的には「3」か「5」になっているはずだ。X Window Systemなどを利用して,グラフィカルなログイン画面にしている場合は,「5」になっている。もしもグラフィックチップの認識に誤りがあって,グラフィカルログイン表示が正常に行われない場合は,一時的に5から3に変更するといった配慮が必要だ。
initdefaultの次に,次の記述があるだろう。
# System initialization. si::sysinit:/etc/rc.d/rc.sysinit |
これは,システム初期化のための設定であり,init が起動された直後に実行される。
記述されている/etc/rc.d/rc.sysinitというファイルは,キーボードの配列を設定したり,スワップパーティションを有効にする共通処理を行う。ただし,ほかのスクリプトを呼び出している場合もあるため注意が必要だ。
ここでsysinitで設定されたスクリプトが実行されると,前述した「id:3:initdefault:」で設定されたランレベル3の処理に移る。
ランレベル3が選択されると,次の記述の中からランレベルが選択されて実行に移る。
l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 |
ここでは,ランレベル3が指定されているため,次のコマンドが実行される。
/etc/rc.d/rc 3 |
ランレベル5で起動時からグラフィカルログイン画面に設定している場合は,次の通りだ。
/etc/rc.d/rc 5 |
inittabファイル内の書式は,次のような順番で指定されている。
<id>:<runlevels>:<action>:<process> |
<id>には,ユニークな1〜4文字の文字列(古いライブラリの場合2文字まで)。<runlevels>は,次の<action>に該当するランレベル番号指定であり複数の指定が可能だ。<action>には,ランレベルでの動作指定が記述される。最後の<process>項目は無視される。
id | 1〜4の文字列(古いライブラリの場合では2文字まで) | |
runlevels | 次の<action>に該当するランレベル設定。複数指定することも可能 | |
process | 実行されるプロセス名。「+」で始まる文字列では,utmp/wtmp記録をしない | |
action | initdefault | システム起動後に選択されるランレベルを指定する。次の<process>項目は無視 |
sysinit | システム起動中,boot や bootwait の前に実行される。<runlevels>の項目は無視 | |
wait | いちどだけ実行されて終了を待つ | |
respawn | プロセスを実行し,終了すると再度実行する | |
once | 一度だけ実行される | |
boot | sysinitの実行後,システム起動時に実行。<runlevels>項目は無視される | |
bootwait | sysinitの実行後,システム起動時に実行されて終了するのを待つ。<runlevels>の項目は無視される |
■inittabの処理手順
ここまでで,ランレベルに移行までの流れが理解できただろう。次は,ランレベルへ移行した後の動作を追っていこう。
/etc/rc.d/rcファイルのスクリプトは,指定されたランレベルで実行されると,サービスやサーバを次々と起動する役目を持っている。まず,/etc/rc.d/rc3.dディレクトリの中を見てほしい。
リスト3■/etc/rc.d/rc3.d/ディレクトリ下の内容例
別ウィンドウで見る or list03.txt
このディレクトリには,ランレベル3の場合に実行されるスクリプトが格納されている。実際には,このディレクトリにあるのはリンクファイルであり,スクリプトの本体(実体)は,/etc/rc.d/init.dディレクトリ内にある。
リスト4■実体は/etc/rc.d/init.dディレクトリ下にある
別ウィンドウで見る or list04.txt
リスト4に見られるリンクは,名前を見て分かる通り,各サービスを実行するスクリプトへのリンクになっている。これらのスクリプトは,実行時に「start」「stop」「restart」といった引数(オプション)を取るようになっている。次のような引数を付けて実行することで,サービスをコントロールするのだ。
# /etc/rc.d/init.d/sendmail start # /etc/rc.d/init.d/sendmail stop |
スクリプトファイルの中を見てみよう。
リスト5■/etc/rc.d/init.d/sendmailファイル内
別ウィンドウで見る or list05.txt
リスト5内に記述されている引数「$1」は,コマンドラインで実行する際の1つ目に当たる。この起動スクリプトでは,$1の内容を調べて挙動を決定するのだ。Sendmailの起動用のスクリプトでは,「start」,「stop」,「restart」,「status」の4種類の引数を取ることができるようになっており,例えば「start」だった場合には, リスト5の中で以下の部分が実行される。
リスト6■リスト5の中で実行される部分
別ウィンドウで見る or list06.txt
リスト6はSendmailを起動するためのスクリプトだ。これらのスクリプトは,すべてのランレベルで共通に利用される。このため各ランレベルのスクリプトのディレクトリに格納するのではなく,/etc/rc.d/init.dディレクトリの中に本体を置き,ランレベルのスクリプト用ディレクトリに本体へのリンクファイルが存在する。
ランレベルのスクリプトディレクトリからのリンクは,以下のルールに従って名前が付けられている。
1文字目 | 開始:S/停止:K |
2〜3文字目 | 実行する順番(2桁の数字) |
4文字以降 | 実行するサービス名 |
例えば,/etc/rc.d/rc3.dディレクトリ内に「S80sendmail」と指定されている場合,「ランレベル3」で「Sendmail」を「80」番目に「開始」させるという設定になる。これらの「開始/停止」の判断や,実行する順番は/etc/rc.d/rcファイルのスクリプトが受け持っている。
/etc/rc.d/rcスクリプトは,ランレベルのスクリプトディレクトリの中を検索し,まず「K」で始まるスクリプトを「stop」引数(オプション)と共に実行して各種のサービスを停止する。さらに「S」で始まるスクリプトを「start」引数と共に実行してサービスを開始する。ランレベル3の場合は,次のような手順になる。
順番 | スクリプト | 動作 |
1 | K00linuxconf | 停止 |
2 | K20rstatd | 停止 |
3 | K20rwhod | 停止 |
4 | K55routed | 停止 |
5 | K95kudzu | 停止 |
6 | K96pcmcia | 停止 |
7 | S05apmd | 開始 |
8 | S10network | 開始 |
9 | S11portmap | 開始 |
10 | S15netfs | 開始 |
11 | S20random | 開始 |
12 | S30syslog | 開始 |
13 | S40atd | 開始 |
順番 | スクリプト | 動作 |
14 | S40crond | 開始 |
15 | S50inet | 開始 |
16 | S50snmpd | 開始 |
17 | S55sshd | 開始 |
18 | S60lpd | 開始 |
19 | S60rusersd | 開始 |
20 | S75keytable | 開始 |
21 | S80sendmail | 開始 |
22 | S85gpm | 開始 |
23 | S85sound | 開始 |
24 | S91skkserv | 開始 |
25 | S92canna | 開始 |
26 | S99local | 開始 |
これらの処理が終わると,initは次の手順に沿ってログインプロンプト表示まで移行する。次のように記述されている手順に従い,/sbin/mingettyを実行するのだ(ランレベル 2,3,4,5で実行)。
# Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 |
ランレベルが5の場合には,次の記述にしたがって/etc/X11/prefdmを実行する(これが X Window Systemを利用したGUIのログイン画面となる)。
# Run xdm in runlevel 5 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm -nodaemon |
ここまでの解説をまとめると,ログインまでの流れは次のようになる。
このような動作を理解していれば,起動時のメッセージの意味が分かってくるだろう。特定項目の設定を変更したい場合にも必須なのだ。
最初は分からなくても,トラブル時にどの処理でおかしな動きをしているかもしれないといった目安をつけることもできるようになるだろう。
Linuxを始めとするUNIX系OSでは,多くの場合「/etc/」ディレクトリ下の設定ファイルを編集し,システムの動作設定を行う。
前述したように,ディストリビューションに最初から含まれていないソフトをインストールした場合,ソフトの自動起動を制御するには「/etc/rc.d」ディレクトリ内のファイルを変更する必要がある。/etc/rc.dディレクトリの中は,通常は次のようになっている。
ファイル名 | ファイルの役目 |
/etc/rc | アプリケーション起動用スクリプト本体 |
/etc/rc0.d/ | ランレベル0の際の起動スクリプト |
/etc/rc1.d/ | ランレベル1の際の起動スクリプト |
/etc/rc2.d/ | ランレベル2の際の起動スクリプト |
/etc/rc3.d/ | ランレベル3の際の起動スクリプト |
/etc/rc4.d/ | ランレベル4の際の起動スクリプト |
/etc/rc5.d/ | ランレベル5の際の起動スクリプト |
/etc/rc6.d/ | ランレベル6の際の起動スクリプト |
/etc/rc.local | 独自設定用スクリプト |
先に説明したように,サーバソフトウェアなどの起動は,/etc/init.d ディレクトリにあるスクリプト本体を/etc/rc?.d ディレクトリ下に作ったリンクファイルから呼びだして実行する。独自にアプリケーションを追加した場合には,/etc/init.dディレクトリに起動スクリプトを作成し,/etc/rc.?ディレクトリからリンクを張ることになる。実例を追ってみよう。
ここで,Apache(Webサーバ)を自分でコンパイルして/usr/local/apache/ディレクトリ下にインストールしたとしよう。マシンの起動と共に自動的に動作させる設定を解説する。もちろん,ディストリビューションに含まれているApacheがインストールされていないことが前提になるので注意しよう。
コンパイル後にまず最初に行うことは,/etc/rc.d/init.dディレクトリ下の起動スクリプトの作成だ。これは,すでに存在するファイルを編集するのもよいし,いちから作成する方法でもよい。ここでは,簡単なスケルトン(骨組み)スクリプトを変更し,独自の起動スクリプトを作成する例を挙げよう。
リスト7■Apache自動起動スクリプトのドラフト
別ウィンドウで見る or list07.txt
ここで挙げたスクリプト(リスト7)は,すでに「start/stop/restart/status」を処理する手順が組み込まれている。このため実際に起動するプログラム名に変更するだけで利用することができる。このファイルを/etc/rc.d/init.d ディレクトリに「skel」というファイル名で保存しておくと,今後必要な場合にすぐに利用可能だ。実際に自動起動設定を行うには,このファイルを「httpd」というファイル名でコピーしよう。次の通りだ。
root@noname:/etc/rc.d/init.d# cp skel httpd |
作成したら,「start)」の条件の中にある次の記述内容を変更する。
■変更前
daemon skelton touch /var/lock/subsys/skelton |
daemon /usr/local/apache/bin/httpd touch /var/lock/subsys/httpd |
もちろんApacheのインストール先ディレクトリが異なる場合は反映する必要がある。
また,同じように「stop)」の中にある。
■変更前killproc skelton rm -f /var/lock/subsys/skelton |
killproc httpd rm -f /var/lock/subsys/httpd |
以上の変更によって「httpd」スクリプトが「start/stop」の引数を受け付けることができる。実際に動作させてみよう。まずstartしてみてから,起動されたのを確認しstopする。表示結果は次のようになるはずだ。
リスト8■httpdサービスの起動・終了テスト表示例
別ウィンドウで見る or list08.txt
確認できたら,次にスクリプト内の「status)」に見られる行を次のように変更しよう。
■変更前status skelton |
status httpd |
このように変更をすると,startした後にstatusを引き数に実行した場合,現在実行しているプロセスIDが表示されるようになる。
リスト9■プロセスID表示
別ウィンドウで見る or list09.txt
以上の手順でひと通りのスクリプトの機能が揃ったことになる。あとはコマンドの実行時に表示される「Starting skelton:」などの文字を,すべて「Starting httpd:」と変更して完了である。最終的に完成したApacheの自動起動スクリプトは以下のようになる。
リスト10■Apache自動起動スクリプト
別ウィンドウで見る or list10.txt
実際に起動時に自動的に実行されるように設定してみよう。ランレベルの項目で解説したように,起動する際にはランレベル 3 か 5 が選択されるので,そのランレベルで自動的に実行されるように設定する。
ランレベルごとに実行されるスクリプトは,ランレベル別に「/etc/rc.d/rc?.d」というディレクトリにある(ランレベル 3 の場合は rc3.d ディレクトリ)。そのディレクトリの中から,init.dディレクトリに作成したスクリプトへのリンクを作成する。
リスト11
別ウィンドウで見る or list11.txt
「S48httpd」というリンク名は,「48番目に start する httpd のためのスクリプト」という意味だ。詳しくは前述したランレベルの説明を参照してほしい。この番号は,相互に依存関係があるような場合には重要な意味を持つ(PCMCIA がスタートしていないのに PC カードのネットワークの設定はできないなど,システムにより密着したサービスの順に起動する傾向がある)。
また,X を利用したグラフィカルなログイン画面を利用している場合には,ランレベル5についても同じことを行う。これで起動時にApacheが自動起動するようになっているはずだ。
Red Hat Linuxには,起動時のスクリプトを制御するためのツールが用意されている。「control-panel」の中にある「Runlevel Editor」というツールだ。起動するには「control-panel」コマンド,もしくはプロンプト上で「tksysv」コマンドを実行する。
このツールでは,各ランレベルにおいて「start するスクリプト」,「stop するスクリプト」を設定でき,その順番も設定することができる。GUIを利用した直感的なインターフェイスにより,より簡単に設定を行うことができるようになっている。
ここまでで起動時に実行してシャットダウン時に終了するサーバーソフトの設定が理解できたと思う。それでは,各種設定など,起動時に1回だけ実行したいものはどこに記述すればいいのだろうか。
前述した「rc.sysinit」や「rc.local」などのファイルがその答えである。これらは起動時に実行する処理を記述したスクリプトファイルであり,いちどだけ実行する設定などは,これらのファイルに記述することが望ましい。以下の例は,ハードディスク設定のためにrc.sysinitに記述した設定である。
リスト12■c.sysinitファイルでの設定例
別ウィンドウで見る or list12.txt
rc.sysinitファイルはinitと共にすぐに実行されるのに対し,rc.localは各ランレベルのスクリプトが実行されてから動作する点が違う。しかしどちらのケースも起動時に1回だけ実行する処理に向いている。また,外部のスクリプトファイルを呼び出すこともあるため,起動時の処理に手を加える場合は内容を理解しておく必要がある。