101.3 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
101 システムアーキテクチャ |
Objective: |
101.3 ランレベル/ブートターゲットを変更し、システムをシャットダウン/再起動する |
Lesson: |
1 of 1 |
はじめに
Unixの設計原則に従ったオペレーティングシステムに共通する機能は、システムの個々の機能を制御するために、専用のプロセスを用いることです。デーモン(一般的には サービス)と呼ばれるこれらのプロセスは、ネットワークサービス(HTTPサーバー、ファイル共有、電子メールなど)、データベース、オンデマンド構成など、オペレーティングシステムの基盤となる拡張機能を担当します。Linuxはモノリシックカーネルですが、負荷分散やファイアウォールといったオペレーティングシステムの低レベルな機能の多くは、デーモンの手助けにより成り立ちます。
どのデーモンをアクティブにするかは、システムの目的によって異なります。アクティブなデーモンのセットを変更できるように、システム全体を再起動することなく、それぞれのサービスを開始・停止できることが必要です。そのために、主要なLinuxディストリビューションは、システムを制御するための何らかのサービス管理ユーティリティーを提供しています。
サービスは、シェルスクリプトや、プログラムとその設定ファイルによって制御します。System V(訳注:旧世代のUNIXの名称)における SysVinit の実装が最初のサービスマネージャでした。続いて、Upstart と systemd が実装されました。多くのLinuxディストリビューションではSysVinitベースのサービスマネージャーが伝統的に使用されてきましたが、今日ではsystemdベースのサービスマネージャーが、ほとんどのLinuxディストリビューションで採用されるようになっています。サービスマネージャーは、ブートプロセス中にカーネルによって起動される最初のプログラムであるため、そのPID(プロセス識別番号)は常に 1
です。
SysVinit
SysVinitに基づいたサービスマネージャーは、 ランレベル (runlevel)と呼ばれるシステム状態の定義セットと、それに対応するサービススクリプトから成ります。ランレベルには 0
から 6
の番号が付けられ、通常は次の目的に割り当てられます。
- ランレベル0
-
システムのシャットダウン。
- ランレベル1、sまたは single
-
シングルユーザーモード。ネットワークおよびその他の必須ではない機能は起動しない(メンテナンスモード)。
- ランレベル2、3または4
-
マルチユーザーモード。ユーザーはコンソールまたはネットワークでログインできます。ランレベル2と4はあまり使用されません。
- ランレベル5
-
マルチユーザーモード。これは、3に加えて、グラフィカルモードのログインを有効化します。
- ランレベル6
-
システムの再起動。
ランレベルと、それに関連するデーモン/リソースの管理を担当するプログラムは /sbin/init
です。システムの初期化中に、init
プログラムは、カーネルパラメータないし /etc/inittab
ファイルからデフォルトのランレベルを調べて、そのランレベルに関連付けられたスクリプト群を実行します。それぞれのランレベルには、関連付けられた多くのサービススクリプトがあります。それらのスクリプトは通常、/etc/init.d/
ディレクトリに置かれます。SysVinitベースのディストリビューションでは、ディストリビューションによってそれぞれのランレベルの意味が異なるので、それぞれのランレベルの役割が明記されているのが普通です。
/etc/inittab
ファイルでは、次の構文を使用します。
id:runlevels:action:process
id
は、エントリを識別するための4文字までのラベルです。runlevels
フィールドは、そのエントリの action
を実行する必要があるランレベル番号のリストです。action
フィールドには、init
がそのエントリの process
を実行する方法を定義します。action
に指定できるキーワードとその意味を以下に示します:
boot
-
システムの初期化中に
process
を実行します。runlevels
フィールドは無視されます。 bootwait
-
システムの初期化中に
process
を実行し、終了するまでinit
は待機します。runlevels
フィールドは無視されます。 sysinit
-
ランレベルに関係なく、システムの初期化(boot)が完了した後に
process
を実行します。runlevels
フィールドは無視されます。 wait
-
指定されたランレベルで
process
を実行し、終了するまでinit
は待機します。 respawn
-
process
が終了すると、再度process
を実行します。 ctrlaltdel
-
キーボードで Ctrl+Alt+Delを押すと、initプロセスに
SIGINT
シグナルが送られますが、その時にprocess
を実行します。
デフォルトのランレベル(カーネルパラメータに明示されていない場合にに選択されるもの)は、 /etc/inittab
の id:x:initdefault
エントリで定義されます。x
がデフォルトのランレベル番号です。この数値を 0
または 6
にすると、ブートプロセスが終了するとすぐにシステムがシャットダウンまたは再起動してしまうので、ここに指定することはできません。典型的な /etc/inittab
ファイルを以下に示します:
# Default runlevel id:3:initdefault: # Configuration script executed during boot si::sysinit:/etc/init.d/rcS # Action taken on runlevel S (single user) ~:S:wait:/sbin/sulogin # Configuration for each execution level l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Action taken upon ctrl+alt+del keystroke ca::ctrlaltdel:/sbin/shutdown -r now # Enable consoles for runlevels 2 and 3 1:23:respawn:/sbin/getty tty1 VC linux 2:23:respawn:/sbin/getty tty2 VC linux 3:23:respawn:/sbin/getty tty3 VC linux 4:23:respawn:/sbin/getty tty4 VC linux # For runlevel 3, also enable serial # terminals ttyS0 and ttyS1 (modem) consoles S0:3:respawn:/sbin/getty -L 9600 ttyS0 vt320 S1:3:respawn:/sbin/mgetty -x0 -D ttyS1
/etc/inittab
ファイルを変更した後に、telinit q
コマンドを実行する必要があります。引数 q
(または Q
)は、initに設定ファイルをを再読み込みするように指示します。この手順は、/etc/inittab
の設定を間違えたためにシステムを起動できないことを避けるために重要です。
init
がランレベルを設定する際に使用するスクリプトは、/etc/init.d/
ディレクトリに保存されています。それぞれのランレベルには、/etc/
ディレクトリ内に、/etc/rc0.d/
、/etc/rc1.d/
、/etc/rc2.d/
などの関連付けられたディレクトリがあり、そのランレベルに入るときにスクリプトが実行されます。1つのスクリプトを複数のランレベルで使用することがあるため、これらのディレクトリ内のファイルは /etc/init.d/
にある実際のスクリプトへのシンボリックリンクです。また、それぞれのランレベルのディレクトリにあるリンク名の先頭文字が、対応するランレベルでサービスを開始するか終了するかを示します。文字 K
で始まるリンク名は、ランレベルに入るとき(別のランレベルから切り替えられたとき)に、サービスが強制終了(kill)されることを示します。文字 S
で始まるものは、ランレベルに入るときにサービスが開始 (start)されます。たとえば、ランレベル1はネットワーク接続のないシングルユーザーのためのランレベルですから、文字 K
で始まるネットワークスクリプトへのリンクが多数あります。
runlevel
コマンドは、システムの現在のランレベルを表示します。runlevel
コマンドは2つの値を表示します。1つ目は直前のランレベルで、2つ目は現在のランレベルです。
$ runlevel N 3
出力の文字 N
は、前回の起動以降にランレベルが変更されていないことを示しています。この例では、runlevel 3
がシステムの現在のランレベルです。
init
コマンドを使用して、実行中のシステムのランレベルを再起動せずに切り替えることができます。telinit
コマンド を使用してもランレベルを切り替えることができます。たとえば、コマンド telinit 1
、telinit s
、telinit S
は、システムをランレベル1に変更します。
systemd
現在では、システムリソースとサービスを管理するために systemdが最も広く使用されていて、ユニット(units)を使ってそれらを定義します。ユニットは、名前、タイプ、および対応する設定ファイルから構成されます。たとえば、 httpd サーバープロセス(Apache Webサーバーなど)のユニットは、Red Hatベースのディストリビューションでは httpd.service
になり、その構成ファイルは httpd.service
です(Debianベースのディストリビューションでは、このユニットは apache2.service
という名前です)。
systemdユニットには7つの異なるタイプがあります。
service
-
最も一般的なユニットタイプで、システムリソースの起動、停止、リロードを制御します。
socket
-
ソケットユニットタイプには、ファイルシステムソケットとネットワークソケットがあります。すべてのソケットユニットには対応するサービスユニットがあり、ソケットが要求を受信したときにサービスユニットがロードされます。
device
-
デバイスユニットは、カーネルが識別したハードウェアデバイスに関連付けられています。デバイスに対応するudevルールが存在する場合にのみ、デバイスとsystemdユニットが関連付けられます。デバイスユニットは、udevルールのプロパティをパラメータとして使用できるので、あるハードウェアが検出されたときに、依存関係から別のユニットを起動するといった目的のために使用できます。
mount
-
マウントユニットは、ファイルシステムのマウントポイントの定義であり、
/etc/fstab
のエントリに似ています。 automount
-
自動マウントユニットもファイルシステムのマウントポイント定義ですが、自動的にマウントされます。すべての自動マウントユニットには対応するマウントユニットがあり、自動マウントポイントにアクセスすると開始されます。
target
-
ターゲットユニットは、いくつかのユニットをグループ化して単一のユニットとして管理します。
snapshot
-
スナップショットユニットはsystemdマネージャーの状態を保存するものです(すべてのLinuxディストリビューションで利用できるわけではありません)。
systemdユニットを制御するための主なコマンドは systemctl
です。systemctl
コマンドで、ユニットの起動、停止、実行、中断、監視などに関するすべてのタスクを実行します。架空の unit.service
を例に取ると、次のようなアクションを systemctl
で行えます。
systemctl start unit.service
-
unit
を開始します。 systemctl stop unit.service
-
unit
を停止します。 systemctl restart unit.service
-
unit
を再起動します。 systemctl status unit.service
-
unit
の状態(実行中かどうかなど)を表示します。 systemctl is-active unit.service
-
unit
が実行中の場合は active を表示し、それ以外の場合は inactive を表示します。 systemctl enable unit.service
-
unit
を有効にします。すなわち、システムの起動時にunit
が自動起動されます。 systemctl disable unit.service
-
システム起動時に
unit
を自動起動しません。 systemctl is-enabled unit.service
-
unit
がシステム起動時に自動起動するかどうかを確認します。答えはシェル変数$?
に保存されます(以下の注意を参照)。値0
は、unit
がシステムで起動することを示し、値1
は、unit
がシステムで自動起動しないことを示します。
Note
|
systemdの新しいバージョンでは、ユニットが enableであるか disableであるかを文字で表示します。例: $ systemctl is-enabled apparmor.service enabled |
同名の(種別が異なる)ユニットがシステムに存在しない場合は、ドットの後のサフィックスを省略できます。たとえば、タイプ service
の httpd
ユニットしかない場合は、 systemctl
の引数にユニット名 httpd
のみを指定すれば十分です。
systemctl
コマンドで system targets (起動後のターゲット)を制御することもできます。たとえば、 multi-user.target
ユニットは、マルチユーザーシステム環境に必要なすべてのユニットを組み合わせたもので、SysVを利用するシステムのランレベル番号3に相当します。
コマンド systemctl isolate
は現在とは異なるターゲットに切り替えます。(訳注: isolateでターゲットを切り替えると、以前のターゲットで有効だったが切り替え後のターゲットで無効となるユニットは停止します)。したがって、手動でターゲットを multi-user
に切り替えるには:
# systemctl isolate multi-user.target
SysVinitのランレベルに対応する runlevel0.target
から runlevel6.target
までのターゲットが用意されています。ただし、systemdは /etc/inittab
ファイルを使用しません。デフォルトのシステムターゲットを変更するには、カーネルパラメータにオプション systemd.unit
を追加します。たとえば、 multi-user.target
をデフォルトのターゲットとするには、カーネルパラメータに systemd.unit=multi-user.target
を追加します。ブートローダーの構成を変更することで、すべてのカーネルパラメータを永続化できます。
デフォルトのターゲットを変更する別の方法は、シンボリックリンク /etc/systemd/system/default.target
を変更して、目的のターゲットを指すようにすることです。リンクの再定義は、 systemctl
コマンドで実行できます。
# systemctl set-default multi-user.target
同様に、次のコマンドを使用して、システム起動時のデフォルトターゲットを調べられます。
$ systemctl get-default graphical.target
デフォルトターゲットが、SysVinitを採用しているシステムにおけるランレベル0(シャットダウン)に相当する shutdown.target
になることはありません。
ユニットの構成ファイルは、すべて /lib/systemd/system/
ディレクトリにあります。コマンド systemctl list-unit-files
は、使用可能なすべてのユニットをリスト表示し、それらのユニットがシステムの起動時に有効であるかどうかを示します。オプション --type
は、 systemctl list-unit-files --type=service
や systemctl list-unit-files --type=target
のように、指定したタイプのユニットのみを選択します。
systemctl list-units
コマンドは、アクティブなユニットと現在のシステムセッション中に起動したユニットをリスト表示します。list-unit-files
オプションと同様に、 systemctl list-units --type=service
コマンドは service
ユニットのみを選択し、systemctl list-units --type=target
コマンドは target
ユニットのみを選択します。
systemdは、電源関連イベントのトリガーと応答も担当します。コマンド systemctl suspend
は、システムを低電力モードにし、現在のデータをメモリに保持します。コマンド systemctl hibernate
は、すべてのメモリデータをディスクにコピーして、システムの電源をオフにした後もシステムの現在の状態を回復できるようにします。このようなイベントに関連するアクションは、ファイル /etc/systemd/logind.conf
またはディレクトリ /etc/systemd/logind.conf.d/
内のファイルで定義します。ただし、acpid
デーモンなどの電源マネージャーがシステムで実行されている場合は、systemdのこの機能は使用できません。acpid
デーモンはLinuxのメインの電源マネージャーであり、ラップトップの蓋を閉める、バッテリー残量少、バッテリーの充電レベルなど、電源関連のイベントに応じたアクションを細かく調整できます。
Upstart
Upstartが使用する初期化スクリプトは、/etc/init/
ディレクトリにあります。システムサービスは、initctl list
コマンド で一覧表示できます。このコマンドは、サービスの現在の状態と、実行中であればそのPID番号を表示します。
# initctl list avahi-cups-reload stop/waiting avahi-daemon start/running, process 1123 mountall-net stop/waiting mountnfs-bootclean.sh start/running nmbd start/running, process 3085 passwd stop/waiting rc stop/waiting rsyslog start/running, process 1095 tty4 start/running, process 1761 udev start/running, process 1073 upstart-udev-bridge start/running, process 1066 console-setup stop/waiting irqbalance start/running, process 1842 plymouth-log stop/waiting smbd start/running, process 1457 tty5 start/running, process 1764 failsafe stop/waiting
Upstart操作ごとに、専用のコマンドがあります。たとえば、6番目の仮想端末を有効にするには、startコマンドを使います。
# start tty6
リソースの状態は、status
コマンドで確認できます。
# status tty6 tty6 start/running, process 3282
そして、サービスの停止は stop
コマンドで行います。
# stop tty6
Upstartは、ランレベルの定義に /etc/inittab
ファイルを使用しませんが、SysVinitと同様に、コマンド runlevel
と telinit
を使用して、ランレベルを確認し、切り替えることができます。
Note
|
Upstartは、Ubuntu Linuxディストリビューション用に、プロセスの並列起動を行うために開発されました。 しかし、Ubuntuは、2015年にsystemdに切り替えた後、Upstartを使用していません。 |
シャットダウンと再起動
システムをシャットダウンまたは再起動するための伝統的なコマンドは、当然のことながら shutdown
といいます。shutdown
コマンドは、電源オフの処理にいくつかの機能を追加します。ログインしているすべてのユーザーのシェルセッションに警告メッセージを送信し、新規ログインが禁止されます。コマンド shutdown
は、SysVinitまたはsystemdによる処理に対する仲介役として機能します。つまり、システムが採用しているサービスマネージャの対応するアクションを呼び出して、要求されたアクションを実行します。
shutdown
が実行されると、すべてのプロセスが SIGTERM
シグナルを、続いて SIGKILL
シグナルを受け取り、システムは停止するかランレベルを変更します。オプション -h
または -r
のどちらも使用されていない場合、デフォルトでシステムはランレベル1つまりシングルユーザーモードに切り替わります。 shutdown
のデフォルト動作を変更するには、次の書式でコマンドを実行します。
$ shutdown [option] time [message]
引数として time
のみが必須です。 time
パラメータには、次の形式でいつアクションを実行するかを指定します。
hh:mm
-
この形式では、実行時刻を時間と分で指定します。
+m
-
この形式では、実行までに待機する分数を指定します。
now
または+0
-
この形式では、即時実行を指定します。
message
パラメータには、ログインしているユーザーのすべてのターミナルセッションに送信する警告テキストを指定します。
SysVinitの実装では、Ctrl+Alt+Delを押してマシンを再起動できるユーザーを制限できます。これには、/etc/inittab
ファイルの ctrlaltdel
行にある shutdown
コマンドに、-a
オプションを指定します。そうすると、/etc/shutdown.allow
ファイルに名前が登録されているユーザーのみが、Ctrl+Alt+Delキーストロークでシステムを再起動できます。
systemdを使用しているシステムでは、systemctl
コマンドを使用してマシンの電源をオフにしたり再起動することもできます。システムを再起動するには systemctl reboot
コマンドを使用し、システムをオフにするには systemctl poweroff
コマンドを使用します。一般ユーザーはこれらの手順を実行できず、どちらのコマンドも実行するにはroot権限が必要です。
Note
|
一部のLinuxディストリビューションでは、 個別のコマンドとして $ which poweroff /usr/sbin/poweroff $ ls -l /usr/sbin/poweroff lrwxrwxrwx 1 root root 14 Aug 20 07:50 /usr/sbin/poweroff -> /bin/systemctl |
すべてのメンテナンス作業に、システムの電源を切ったり再起動したりする必要があるわけではありません。しかし、システムの状態をシングルユーザーモードに変更する場合には、ログインしているユーザーの活動が突然の終了によって損害を受けないように、警告することが重要です。
shutdown
コマンドと同様に、すべてのログイン中のユーザーのターミナルセッションにメッセージを送信するには、wall
コマンドを使います。メッセージファイルを用意するか、コマンド wall
のパラメータにメッセージを直接指定します。
演習
-
telinit
コマンドを使用してシステムを再起動するにはどうすればよいですか? -
システムがランレベル1に入ると、ファイル
/etc/rc1.d/K90network
に関連するサービスはどうなりますか? -
systemctl
コマンドを使用してsshd.service
ユニットが実行中かどうかを確認するにはどうしますか? -
systemdベースのシステムにおいて、システムの初期化中に
sshd.service
ユニットがアクティブになるようにするコマンドは何ですか?
発展演習
-
SysVinitベースのシステムにおいて、
/etc/inittab
で定義されているデフォルトのランレベルは3になっていますが、システムが常にランレベル1で起動します。考えられる原因は何ですか? -
systemdベースのシステムでは、
/sbin/init
は別の実行可能ファイルへのシンボリックリンクです。/sbin/init
が指すファイルは何ですか? -
systemdベースのシステムにおいて、デフォルトのシステムターゲットを確認するにはどうしますか?
-
shutdown
コマンドでスケジュールされたシステムの再起動をキャンセルするにはどうしますか?
まとめ
このレッスンでは、Linuxディストリビューションがサービスマネージャーとして使用するユーティリティについて説明しました。SysVinit、systemd、およびUpstartユーティリティは、それぞれ独自の方法でシステムサービスとシステム状態を制御します。レッスンでは、次のトピックについて説明しました:
-
システムサービスとは何か、また、オペレーティングシステムにおけるの役割。
-
SysVinit、systemd、Upstartコマンドの概念と基本的な使用法。
-
システムサービスとシステム自体を、適切に起動、停止、再起動する方法。
以下のコマンドと手順を取り上げました:
-
init
、/etc/inittab
、telinit
などの、SysVinitに関連するコマンドとファイル。 -
systemdの主要コマンド:
systemctl
。 -
Upstartのコマンド:
initctl
、status
、start
、stop
。 -
shutdown
などの伝統的な電源管理コマンドとwall
コマンド。
演習の解答
-
telinit
コマンドを使用してシステムを再起動するにはどうすればよいですか?telinit 6
コマンドで、ランレベル6に切り替えます。これでシステムが再起動します。 -
システムがランレベル1に入ると、ファイル
/etc/rc1.d/K90network
に関連するサービスはどうなりますか?ファイル名の先頭が
K
なので、関連するサービスが停止します。 -
systemctl
コマンドを使用してsshd.service
ユニットが実行中かどうかを確認するにはどうしますか?systemctl status sshd.service
またはsystemctl is-active sshd.service
コマンドを使用します。 -
systemdベースのシステムにおいて、システムの初期化中に
sshd.service
ユニットがアクティブになるようにするコマンドは何ですか?rootになって、
systemctl enable sshd.service
コマンドを実行します。
発展演習の解答
-
SysVinitベースのシステムにおいて、
/etc/inittab
で定義されているデフォルトのランレベルは3になっていますが、システムが常にランレベル1で起動します。考えられる原因は何ですか?カーネルのパラメータリストに、
1
ないしS
が指定されているかもしれません。 -
systemdベースのシステムでは、
/sbin/init
は別の実行可能ファイルへのシンボリックリンクです。/sbin/init
が指すファイルは何ですか?systemdのメインプログラム:
/lib/systemd/systemd
。 -
systemdベースのシステムにおいて、デフォルトのシステムターゲットを確認するにはどうしますか?
シンボリックリンク
/etc/systemd/system/default.target
は、デフォルトのターゲットを定義するユニットファイルを指します。systemctl get-default
コマンドも使用できます。 -
shutdown
コマンドでスケジュールされたシステムの再起動をキャンセルするにはどうすればよいですか?shutdown -c
コマンドを使います。