101.3 ランレベル/ブートターゲットの変更とシステムのシャットダウンまたは再起動
LPIC-1 | 2023/11/22

このトピックについて

このトピックでも、えるすたのLinux Essentialsオンラインテキストで学習する内容が含まれます。
Linux Essentialsテキストの、

5.3 Linuxの起動とシャットダウン
※クリックすると新しいタブで開きます。

にて学習した内容と被ります。
ただ、Linux Essentilasでは起動に関連する内容についてはあまり重要視されていなかったため、覚える内容が多くなっています。どちらかと言うと、Linux Essentialsで習得している知識を元に新しいことを覚える、というイメージです。
ここでは、そのポイントをご紹介します。

ランレベルの確認と変更

Linux にはランレベルというものがありますね。ランレベルは Linux の起動状態を表すモノですが、実際に、Linux 上でどのように設定すればランレベルを操作することができるか、を覚えましょう。

ランレベルの確認

ランレベルは、runlevel というコマンドを実行することで確認することができます。

# runlevel
N 3

実行すると 2 つの文字が表示されますが、右が現在のランレベル、左が前回のランレベルです。現在のランレベルが「3」であることがわかりますね。ちなみに、上記の実行例では前回のランレベルが存在しないので「N」が表示されています。

ランレベルの変更

Linux では、起動している状態でランレベルを変更することができます。変更を行うには、init または、telinit というコマンドを実行することで変更することができます。

# init 1
# telinit 5

init でも、telinitでも使い方は同じです。コマンドの後に、変更したいランレベルの数字を入力して実行すれば、指定したランレベルに変更できます。

上記の例の1行目は、シングルユーザモードへ移行するためのコマンド、2行目はグラフィカルログインを伴うマルチユーザモードへの移行です。ただし、グラフィカルなマルチユーザモードに移行する場合、該当の Linux に X Window Systemや、GNOMEなどのデスクトップ環境を構成するパッケージがインストールされている必要があります。

起動時のランレベルの設定(SysVinit)

Linux では、起動時にどのランレベルで起動するかを設定することができますが、現在主流の Systemd と少し前まで使われていた SysVinit では設定方法が異なりますので、両方覚えましょう。

# cat /etc/inittab
id:3:initdefault
# init q(またはQ)

SysVinit における起動時の設定は、/etc/inittab というファイルで管理されています。このファイルを cat コマンドで閲覧すると id で始まる行がでてきますが、これが設定内容です。
設定は「:(コロン)」で区切られた3つのセクションで設定されていて、2つのセクションに書かれた数字がランレベルです。この例では「3」が表示されていますので、このLinuxシステムが起動するときはランレベル「3」で起動するということになります。

このランレベルの数字部分を変更することで、別のランレベルで起動することができます。3行目に書かれている init コマンドは、再起動することなくこの設定を適用するためのコマンドです。ランレベルの数字の代わりに「q」或いは「Q」を指定することで、再起動することなくデフォルトのランレベル設定を適用させることができます。これは telinit コマンドを使っても同じことができます。

ここで指定する数字は、101.2 システムを起動する の SysVinit のところで解説したランレベルが設定されたディレクトリと連動します。

# ls ‐d /etc/rc*.d
/etc/rc0.d  /etc/rc1.d  /etc/rc2.d  /etc/rc3.d  /etc/rc4.d  /etc/rc5.d  /etc/rc6.d

/etc ディレクトリには、上記のようにそれぞれのランレベルに応じた起動スクリプトが集められているディレクトリがあり、/etc/inittab で指定したランレベルにリンクしたディレクトリの中から起動スクリプトが読み出されていきます。例えば、ランレベルが「3」なら、/etc/rc3.d の中の起動スクリプトが読み出されます。

ただし、現在ほとんどのディストリビューションでは、SysVinit ではなく Systemd が採用されています。そのため、昔の名残で一部のファイルやディレクトリが存在する場合があるものの、ほとんどの場合で上記の設定内容を実機で確認することができません。

起動時のランレベルの設定(Systemd)

Systemd でも、SysVinit と同じように起動スクリプトが用意されています。ただし、名前が全く異なるので注意してください。

ランレベルtargetファイル名
0poweroff.target
1rescure.target
2,3,4multi-user.target
5graphical.target
6reboot.target

上記のように、ランレベルに応じて対応する target ファイルが存在します。どのファイル名がどのランレベルに相当するかを覚えておきましょう。
なお、これらのファイルは /lib/systemd/system ディレクトリに格納されています。

Systemd 環境では Linux システムを起動する際に、/etc/systemd/system/default.target を確認してランレベルを実行します。default.target ファイルが格納されている場所は、「/etc/systemd/system」です。先程説明した、各種 target ファイルが格納されている「/usr/lib/systemd/system」ではないことに注意しましょう。格納されているディレクトリが異なります。

そして、この /etc/systemd/system/default.target はシンボリックリンクであり、実体ではありません。

# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 May 18  2020 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target

上記の通り、ls -l で確認して分かる通り、/etc/systemd/system/default.target はシンボリックリンクファイルです。このファイルがどの target ファイルにリンクしているかで、どのランレベルで実行されるかが決定します。
上記の例では、「/usr/lib/systemd/system/multi-user.target」にリンクしています。このファイルはランレベルはマルチユーザモード(ランレベル2~4)ですので、このシステムはランレベル 3 で起動する、ということになります。

Systemd において、デフォルトランレベルを変更するには、ln -s コマンドでシンボリックリンクを変更するか、systemctl set-default というコマンドで変更します。

# ln -sf /usr/lib/systemd/system/graphical.target /etc/systemd/system/default.target
# systemctl set-default graphical.target

上記、どちらのコマンドを使っても、デフォルトランレベルを変更することができます。上記の例はいずれも「graphical.target」つまり、ランレベル 5 を設定するコマンドです。
※ ln コマンドでは、システム上の設定を強制的に変更する関係で、-f オプションを付加しています。

なお、Systemd 環境におけるデフォルトランレベルの確認方法は、上記で実施した ls -l で確認する以外にも、以下の方法があります。

# systemctl get-default
multi-user.target

systemctl get-default コマンドを使うと、現在設定されている target ファイルを確認することができ、デフォルトランレベルが確認できます。「set-default」と「get-default」は似ているので間違わないように気をつけましょう。英単語的な意味を考えれば、わかりやすいと思います。

Systemctl コマンド

デフォルトランレベルの操作を行うにあたってご紹介した Systemctl コマンドですが、サービスにおける設定や操作を行うことができます。Systemd 環境においてはよく使うコマンドであり、LPIC-1としてももう少し詳しく学習しておく必要があります。

systemctl コマンドは、次に続くサブコマンドに何を入力するかで役割が変わるコマンドです。ランレベル操作の際に出てきたように、「set-default」と入力すればランレベルを設定するコマンドになり、「get-default」と入力すればランレベルを確認するコマンドになります。

ランレベルの変更に使用しているファイルの接尾辞には、.target と付いていますが、Systemd では、同じような役割を持つもの同士をグループ分けして、それぞれに接尾辞をつけています。
例えばデバイスを管理するファイルには .device、ファイルシステムに関するファイルは .mount、SWAP領域の操作に関するファイルには .swap、スケジュールに関するファイルには .timer といった具合です。これらのグループのことを Unit と呼びます。

サーバアプリケーション等のような Linux 上で起動し続けるプログラムも同じように Unit で管理されていて、接尾辞には .service がつきます。 systemctl は、これら Unit を操作する際によく使うコマンドで、特に、.service Unit の操作方法は LPIC-1でも出題されます。書式は下記です。

書式:

systemctl  サブコマンド Unit(service)名[.service]

実行例としては、以下のような感じです。(実際に実行しても構いません。)

# systemctl status sshd.service
# systemctl enable sshd.service
# systemctl list-unit-files

サブコマンドと Unit 名は必須のパラメータです。Unit には .service という接尾辞がついていますが、省略して実行することもできます。

サブコマンド説明
startサービスを起動する
stopサービスを停止する
restartサービスを再起動する
reloadサービスの設定を再読み込みする
statusサービスの稼働状態を表示する
is-activeサービスの稼働状態を確認する
enableシステム起動時にサービスを自動起動する
disableシステム起動時にサービスを自動起動しないようにする
list-unit-filesUnit 定義ファイルの一覧を表示する

システムのシャットダウン

システムのシャットダウンについては、Linux Essentials オンラインテキストの「5.3 Linuxの起動とシャットダウン」をおさらいしてもらえれば、基本的には問題ありませんが、wall というコマンドを覚えておきましょう。

書式:

wall “通知したいコメント”

このコマンドはログインしているユーザに、管理者からのメッセージを通知するために使用するコマンドです。wall の後に通知したい文面を入力して実行すると、その文面が他のログインユーザのコンソール上に表示されます。

# wall "shutdown at 22:00"

上記のように実行すると、ログインユーザ全員のシェル上に「shutdown at 22:00」が通知されます。
これと同じようなことが、shutdown コマンドに -k オプションを付けることで実現できます。

# shutdown -k +10 "10分後にサーバーを停止します。"

shutdown コマンドですので、システムを停止することになりますが、その後ろに入力した「10分後にサーバーを停止します。」は、wall コマンドと同じようにログインユーザのシェル上に表示されます。関連して出題されることがあるので、覚えておきましょう。

ACPI

ACPIは、Linuxにおける常駐プログラム(デーモン)の一つです。簡単に言うと、高度な電源管理を行うプログラムです。

主にノートパソコンなどで使用される、サスペンドやレジューム、スリープ、スピードステップ等、イベントに応じて電源供給状況を監視、操作をします。

とはいえ、LPIC-1では、ACPIについて深く問われることはなく、ACPIが(高度な)電源管理を行う常駐プログラムであることがわかっていれば問題ありません。

ちなみに、常駐プログラムのことを「デーモン」と言います。daemon と書き、悪魔(demon)とは違うので気をつけてくださいね。

そういえば昔、メーラーダエモンさんとメールのやり取りする、という笑い話がありましたね♪

PAGE TOP