LPIC-1 - 101試験 - 101:システムアーキテクチャ - 101.3 ランレベルの変更とシステムのシャットダウンまたはリブート

Last Update : September 18 2014 21:34:23

     

a. initプロセス

ブートローダにより Linuxカーネルが起動された後に、様々なサービスが起動しますが、このサービスの起動を行う大元のプログラムがinitといわれるものです。通常プログラムが実行され、起動されるとLinux上でプロセスという存在になります。プロセスとは、プログラムが実行によりLinuxカーネルにメモリ空間などのコンピュータリソースを割り当てられた実行状態のことをいいます。Linux上でプロセスは階層構造で管理されており、この階層構造のトップにあるのが initプロセスです。

initプロセスはカーネルが最初に実行するプロセスで、このinitプロセスが起動すると、カーネルは制御をinitプロセスに移行し、init プロセスが様々なサービスを起動する仕組みになっています。通常プログラムからさらに別のプログラムが実行される場合、起動後のプロセスに親子関係ができます。起動した側のプロセスを親プロセス、起動された側のプロセスを子プロセスと表現します。このことから、initプロセスは全てのプロセスの親プロセスと呼ばれ、常にプロセスの構造の最上位になっています。


【 SysVinit (UNIX系OSで使われてきた仕組み) 】
  1. BIOS
  2. ブートローダ
  3. カーネル
  4. init (/sbin/initのこと)
    1. init が /etc/inittab を読み込む
    2. init が /etc/rc.sysinit スクリプトを実行する
    3. init が /etc/rc スクリプトを実行する
    4. /etc/rc スクリプトが /etc/rc<ランレベル>.d/以下のスクリプト実行(root権限必要)

最近のディストリビューションでは以下のようなinitの仕組み(システム起動時における初期化の仕組み(初期化プロセス))がある

SysVinit
サービスを決められた順に起動していく
Upstart
サービスを並列起動(イベント駆動型)イベント=初期化プロセスの高速化
初期化時の依存関係を定義する必要があります。その 依存関係の連鎖によって、不要なプログラムを起動してしまう欠点がありました。
systemd
そのプログラムが必要か否かを、ソケットの利用やアプリケーション同士のやり取りを行うバス「D-Bus」上のメッセージなどで判断し、必要に応じて起動することが可能になりました。これによって、無駄なプログラムを起動せずに済むため、Upstartよりも高速になっています。

SysVinit では、SystemV 系の init デーモンが、 色々なサービスを起動していきます。 SysVinit の init デーモンは、指定されたランレベルに必要なサービスを、 決められた順番で起動あるいは停止していきます。

Upstart は、その代わりになる init デーモンです。 SysVinit との違いは、サービスを順番に起動するのではなく、 サービスが起動できる状態になったときに、起動します。

たとえば、別のサービスに依存しているサービスの場合は、 その元のサービスの起動が開始したり完了したりするタイミングで起動されます。 あるいは、ネットワークの設定が行われたときや、 ランレベルが変わったときなどのタイミングで起動されることもあります。 Upstart では、これらのタイミングを「イベント」で通知します。

Upstartは、/etc/event.dディレクトリに格納されているファイル群で定義された「イベント・ジョブ」を実行する仕組みになっています。/etc/event.dディレクトリ内の各ファイルには「start on イベント名」という設定行があり、ここで指定されたイベントが発生すると、「exec コマンド名」という設定行で指定したコマンドが実行されます。

Upstartのようなイベント駆動型initプログラムを使うことのメリットは、より柔軟なシステム管理を実現できることです。最近では、USB機器など自由に抜き挿しできるデバイスを使う機会が増えています。こうしたデバイスによってシステム構成が動的に変化する場合、OS起動時に必要な設定や起動すべきサービスなどもそれに合わせて変える必要があります。

しかし、SysVinitのようにラン・レベルに基づいた静的な起動手順通りに処理するinitプログラムは、そうした柔軟な処理に向いていません。イベント駆動型のUpstartなら、例えばOS起動時に接続されている機器をチェックし、機器が見つかった場合には、そのイベント情報に基づいて必要な設定だけを読み込んだりサービスを起動するといったことが可能になります。
SysVinit でも、起動の順番を決められますので、 依存関係にしたがってサービスを起動することができます。 ただ、起動の条件がそろっていても、順番が来るまでは、待たされます。 Upstart では、条件がそろった時点で起動されますので、無駄な待ち時間が発生せず、 OSが効率よく立ち上がります。


b. ランレベル

initプロセスは起動時に色々なプログラムを実行する仕組みを持っていますが、このinitプロセスが実行するプログラムによりLinuxの実行状態が変化します。このinitプロセスが実行する内容によるLinuxの実行状態の変化を、ランレベルといいます。ランレベルには0~6までのレベルがあり、それぞれに以下のような意味があります。

ランレベル 動作内容
ランレベル0 システムの停止
ランレベル1、s、S シングルユーザモード
ランレベル2 NFSファイル共有のないマルチユーザモード Debian:完全マルチユーザモード(GUIベース)
ランレベル3 完全マルチユーザモード(テキストベース)
ランレベル4 通常、未使用 Debian:完全マルチユーザモード(GUIベース)
ランレベル5 完全マルチユーザモード(GUIベース)
ランレベル6 システムの再起動

通常起動時のランレベルは 3 などになり、システムをシャットダウンするという行為はランレベル 0 を呼び出しているということになります

シングルユーザーモードは、root ユーザーのみが利用できる状態です。一般ユーザーはログインできません。システムの変更などユーザーが利用していては行えない作業を行う場合などでシングルユーザーモードを使用します。また、root のパスワードを忘れた場合などもシングルユーザーモードでは、ログインなしでシステムを利用できるので、パスワードの変更などが可能です。

ランレベルは結局initプロセスの動作を指定するもので、起動から停止に至る制御をinitプロセスが行っているということを示すものです。
initプロセスが実行するプログラム群は、自由に設定することができ、その起動の順番も制御することができます。
起動順を指定することは重要で、起動の順番を不正なものにすると起動できないサービスがでてきます。例えば、サーバなどを起動時に実行したい場合、起動ランレベルにサーバプログラムを登録しますが、このサーバの起動順がネットワークサービスより早く設定されてしまうと、サーバは起動できません。これはネットワーク機能が有効になっていないのにサーバは機能できないからです。

  • ※通常、基本機能は最初の方に実行されるようになっているため、このような心配をすることはあまりないと思います。

注意が必要なのは、ランレベルにはディストリビューションごとに差異があるということです。基本的にランレベルで実行されるプログラム群は特定の場所に起動スクリプトが配置されるようになっていますが、これはディストリビューションごとに配置場所が異なります。またランレベルの定義もディストリビューションごとに異なっています。実はLinuxの標準仕様で定義されているのは、ランレベル0、1、6の動作だけです。その他の2~5の動作については特に標準定義がなく、ディストリビューションによるため、ディストリビューションによっては通常起動レベルが異なる場合があります。

  • ※Redhat系のディストリビューションでは、ランレベル 3 か 5 が通常起動になっています。

c. ランレベルの操作

1.現在のランレベルの確認

現在のランレベルを確認するには、 runlevel コマンドを実行します。以下のように先頭に N が表示されている場合は、Linux インストール時から一度もランレベルを変更していない事を表しています。

$ /sbin/runlevel
N 3

以下のように 3 5 と表示されている場合は、前回のランレベルが 3 で現在のランレベルが5 であることを表しています。

$ /sbin/runlevel
3 5


2.ランレベルの変更 [ init ] [ telinit ]

ランレベルを変更するには、 init もしくは、 telinit コマンドを使用し、スーパーユーザーでなければ変更する事ができません。例えば、現在のランレベルを 3 から 5 に変更するには以下のように実行します。するとテキストログイン画面から、グラフィカルログイン画面に切り替わります。なお、シェルで init コマンドを実行する場合は、その時だけのランレベルの変更で、永続的にランレベルを変更する場合には、後述する /etc/inittab を編集する必要があります。

$ /sbin/init 5

また、init 0 と指定した場合は、システムがシャットダウンします。shutdown コマンドと異なる点は、全てのログインユーザーに対して、メッセージを表示せずにシステムをシャットダウンすることです。

$ /sbin/init 0


3./etc/inittab

init プロセスは、システムが起動して最初に開始されるプロセスで、このプロセスが行うべき処理が定義されているファイルが、 /etc/inittab です。/etc/inittab は以下のような書式で記述されています。

id:<runlevels>:<action>:<process>

id・・・エントリの識別子。ユニークな文字列(1~4文字)でなければならない。
runlevel・・・ランレベルの指定で、1から6までの数字が使える。「2345」など、複数を同時に指定できる。省略するとデフォルトランレベルとなる。
action・・・プロセスの起動あるいは終了時の動作。

●指定可能なaction
ctrlaltdel Ctrl + Alt + Del キーが押されたときに実行する
initdefault デフォルトのランレベルを指定する。プロセス項は無視される。
once 指定したランレベルへの移行時に一度だけ実行する
powerfail UPSが電源切断を検出したときに実行
respawn プロセスが終了した場合は常に再起動。通常は、getty(ログインプロンプトを出すプログラム)のために使用される。
sysinit システムの起動時に実行される。boot 及び bootwait エントリよりも先に実行される。
wait 指定したランレベルの移行時に1度だけ実行する。init はこのプロセスが終了するまで待機する。
boot システム起動中にのみ実行される。プロセス項で指定したプロセスが終了するのを待たずに残りの処理を行う。
bootwait システム起動中にのみ実行される。プロセス項で指定したプロセスが終了するのを待って残りの処理を行う。
ondemand telinit を使ってondemand ランレベルが指定された場合に、一度だけ実行される。

デフォルトのランレベルを変更するには initdefault の行を編集します。ここで編集したランレベルは、システムを再起動した後も、有効になります。

# vi /etc/inittab
id:3:initdefault: <---次回からの起動はランレベル 3 で起動する

# サーバー起動時に1度だけ実行される
si::sysinit:/etc/rc.d/rc.sysinit

# ランレベルごとに引数を変えて /etc/rc.d/rc を実行する
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

# CTRL + ALT + DEL が押されたら1度だけ実行する
ca::ctrlaltdel:/sbin/shutdown -t3 -r now


d. サービスの起動設定

各種サービス(デーモン)がシステムの起動時に起動するかどうかについては、/etc/rc.d/init.d もしくは、/etc/init.d ディレクトリに格納されている起動スクリプトによって制御することになります。

通常、これらのスクリプトは、/etc/rc.d/rcX.d (Xはランレベル)もしくは、/etc/rcX.d からシンボリックリンクされています。これらのディレクトリ内から制御スクリプト(/etc/rc.d/init.d )にリンクを張ることによって、各種のプログラムがどのランレベル時に起動、もしくは停止するかを設定する事ができます。例えば、/etc/rc.d/rc3.d ディレクトリ内を見てみると以下のようになっています。

# ls -l /etc/rc.d/rc3.d/
合計 0
lrwxrwxrwx 1 root root 15 2月 2 20:05 K03rhnsd -> ../init.d/rhnsd
lrwxrwxrwx 1 root root 13 2月 2 20:03 K05atd -> ../init.d/atd
lrwxrwxrwx 1 root root 14 2月 2 20:05 K10cups -> ../init.d/cups
中略
rwxrwxrwx 1 root root 18 2月 3 04:32 S08iptables -> ../init.d/iptables
lrwxrwxrwx 1 root root 14 2月 3 04:33 S09isdn -> ../init.d/isdn
lrwxrwxrwx 1 root root 17 2月 3 04:31 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 2月 3 04:31 S12syslog -> ../init.d/syslog
省略

ここで注目しておきたいのは、K10cups のように、K で始まるファイルと、S10network のように S で始まるファイルが存在する事です。K で始まるファイルは、Kill を意味し、ランレベル 3 において cups というプログラムは停止することを意味します。S で始まるファイル名は、Start を意味し、ランレベル 3 においては、network は起動するということを意味します。また、S や K に続く数字はスクリプトファイルを実行する優先順位を表しており、数値の小さい順に実行されます。S10network の場合は、ランレベル 3 において、10番目に起動されるということになります。但し、注意したいのは、必ずしも10番目に起動するというわけではなく、この数値は優先順位を表すだけなので、S01 から S07 までのシンボリックリンクが存在しなければ、上記の例で S10 は3番目に実行される事になります。

それでは、ランレベル 3 で停止させたい、もしくは起動させたいプログラムがある場合はどうするかというと、rm コマンドでシンボリックリンク自体を削除するか、もしくは、シンボリックリンクの先頭のアルファベットを S から K 、K から S へと変更してあげればいいだけです。あるいは、S や K の前にドット「.」などを付けてリネームしても構いません。


# cd /etc/rc.d/init.d
# mv S55sshd K55sshd

また、ランレベル 2 においてもプログラムを起動させたいというような場合は、シンボリックリンクをはっておきます。

# cd /etc/rc.d/init.d
# ln -s sshd ../rc2.d/S55sshd

サービス(デーモン)を起動させるには、以下のようにします。停止させるときはstop、再起動するときは restart とします。

# /etc/rc.d/init.d/sshd start


e. シャットダウンとリブート

1.システムの再起動/シャットダウン [ reboot ] [ shutdown ] [ halt ] [ poweroff ]

システムを再起動するには、 reboot もしくは、 shutdown -r now コマンドを使用します。なお、一般ユーザーにはシステムを再起動、もしくは、シャットダウンする権限はありません。
シャットダウンコマンドが投入されると、それ以後はユーザーがログインできなくなります。

システムをシャットダウンするには、 shutdown -h now もしくは、 halt 又は、 poweroff を使用します。

● shutdown コマンド構文
  shutdown [オプション] 時間 [メッセージ]

● shutdown オプション
 -h システムをシャットダウンする
 -r システムを再起動する
 -f fsck (ファイルシステムチェック)を行わずに、より早くリブートする
 -F 再起動時に強制的に fsck を行う
 -s シングルユーザーモードで再起動する
 -k 実際にシャットダウンはせず、警告メッセージをユーザーに通知する
 -c 現在実行中のシャットダウン処理をキャンセルする
 now 直ちに再起動/シャットダウンを行う
 HH:MM HH時MM分に実行する(shutdown -h 23:00)
 +MIN MIN分後に実行する

● すぐにシャットダウンするには
# halt
# shutdown -h now

● 午後9時にシャットダウンするには
# shutdown -h 22:00 "午後9時ちょうどにシステムは停止します。"

メッセージが設定されていると、シャットダウン時間が近づくにつれメッセージが頻繁に表示されるようになります。

● すぐに再起動するには
# reboot
# shutdown -r now


z. 出題範囲概要

●説明 システムのランレベルを制御する。これには、シングルユーザモードへの変更と、システムのシャットダウンまたはリブートも含まれる。また、ランレベルを変更する前にユーザに警告し、プロセスを適切に終了させる。これには、デフォルトのランレベルの設定も含まれる。 ●主要な知識範囲
デフォルトのランレベルを設定する
ランレベル(シングルユーザモードを含む)を変更する
コマンドラインからシャットダウンおよびリブートを行う
ランレベルの切り替えやその他の重要なシステムイベントの前にユーザに警告する
プロセスを適切に終了させる
systemdおよびUpstartの基本的機能
●重要なファイル、用語、ユーティリティ
/etc/inittab, shutdown, init, /etc/init.d, telinit


  [ 例題 ] 
  1. 101:101.3 問01  ランレベル
  2. 101:101.3 問02  シャットダウン
  3. 101:101.3 問03  ランレベルを定義しているファイル
  4. 101:101.3 問04  デフォルトランレベル
  5. 101:101.3 問05  シャットダウンコマンド
  6. 101:101.3 問06  シングルユーザーモード
  7. 101:101.3 問07  再起動を行うコマンド
  8. 101:101.3 問08  デフォルトのランレベルを変更
  9. 101:101.3 問09  シャットダウンを予告


     

www.it-shikaku.jp