systemdによるLinuxの起動処理

LPIC

systemdとは

systemdはLinuxの起動処理や、Linuxシステムの管理を行う仕組みです。
その実態はプロセスID(PID)=1 のデーモンです。

Linuxシステムの起動順序

CentOS 6以前の方式 (SysVinit)

BIOS/UEFIブートローダkernelinit

CentOS 7以降の方式 (systemd)

BIOS/UEFIブートローダkernelsystemd

連携するプロセス

systemdでは下記のデーモンが連携して動作します。

systemdメインプロセス
systemd-journaldログ管理プロセス
systemd-logindログイン処理プロセス
systemd-udevdデバイス検知プロセス
systemd-resolved名前解決プロセス
systemd-machined仮想マシンプロセス追跡プロセス

システム起動時に systemd は Unit という単位で処理します。

システム起動時の処理とサービス管理

SysVinit では…

init ( rc.sysinit, /etc/rc.d ) のシェルスクリプトで起動処理を定義していました。

systemd の場合
  1. スクリプトではなく設定ファイル
  2. Unit間の依存と順序の関係を定義
  3. 用途別にUnitがある

1. スクリプトではなく設定ファイル

initの場合

例えば sshd に関する起動処理は /etc/rc.d/init.d/sshd にシェルスクリプトで書いていました。

# source function library
. /etc/rc.d/init.d/functions

# pull in sysconfig settings
[ -f /etc/sysconfig/sshd ] && . /etc/sysconfig/sshd
RETVAL=0
prog="sshd"
lockfile=/var/lock/subsys/$prog

Unitの場合

例えば default.target に関する起動の設定は /etc/systemd/system/default.target の設定ファイルに定義します。

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target 
        display-manager.service
AllowIsolate=yes

2. Unit間の依存と順序の関係を定義

プロセスの依存関係

プロセスが、どのtargetを必要としているか、何を同時に起動すべきかを定義します。

Requires必ず同時起動
Wants可能な限り同時起動
Conflicts同時起動しない
WantedBy何を前提とするか
(例)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target

プロセスの起動順

プロセス起動の前後関係を After, Before で定義します。

(例)
After=multi-user.target rescue.service
Before=

3. 用途別にUnitがある

.serviceサービスの起動/停止に関する設定
ファイル名は「サービス名.service」
※sshd.service, chronyd.service など
.mountファイルシステムのマウントに関する設定
ファイル名は「マウントポイント.mount」
/etc/fstab を元に systemd が自動作成
.socketソケットの監視設定
「ソケットへの接続を検出すると特定のプロセスを起動」という動作を実現
※xinet.dの代替
.deviceシステムが認識しているデバイス情報を保持する
udevデーモンによって自動作成される
.pathパスの監視設定
「監視ディレクトリにファイルが置かれたらサービス起動」という動作を実現
.target複数のUnitをグループ化してまとめたUnit

Unit設定ファイル

Unitの設定ファイルは2ヶ所あります。

/usr/lib/systemd/system/
システムのデフォルト設定
インストール済みのRPMパッケージで配布されたUnitの設定ファイル

/etc/systemd/system/
ユーザー独自設定
管理者が作成、管理するUnitの設定ファイル
同名のファイルをここに配置すると、こちらのファイルが優先される

Unit一覧表示コマンド

定義されている全てのUnitを表示する ※systemdサービスの一覧

# systemctl list-unit-files

定義されたservice Unitを表示する

# systemctl list-unit-files

稼働中のUnitを表示する

# systemctl list-unit-files

稼働中の service Unit を表示する

# systemctl list-unit-files

稼働中の target Unit を表示する

# systemctl list-unit-files

initのデメリット

  • 依存関係を適切に処理できない
  • スクリプトを順番に起動していくので、あるサービスの起動で手間取ると、それより後に実行するサービスが待たされてしまってシステム起動に時間がかかる
  • システム起動後にオンデマンドでサービスを起動・停止する仕組みがない

initdの起動プロセス

電源投入
 ▼
BIOS起動 ※POST (Power on self test)
 ▼
ブートローダ起動
 ▼
kernel起動 ※メモリ初期化、システムクロック設定、ドライバ読み込み、initプロセス実行開始
 ▼
initd起動 ※/etc/inittab を読み込み、ランレベルの確認
 ▼
ランレベルに対応した起動処理 ※rc.sysinit, /etc/rc.d のスクリプトを Sの番号が小さい順に起動
 ▼
ログイン画面

systemdのメリット

  • スクリプト実行ではなく、設定ファイルに従ってsystemdがUnit(サービス)を起動する
  • Unitの起動処理をできる限り並列化する ※起動時間短縮
  • Unitの起動をオンデマンド化する

systemdの起動プロセス

電源投入
 ▼
BIOS起動 ※POST (Power on self test)
 ▼
ブートローダ起動
 ▼
kernel起動 ※メモリ初期化、システムクロック設定、ドライバ読み込み、systemdプロセス実行開始
 ▼
systemd起動
 ▼
default.targetの処理 ※まず最初に Unit:default.targetが処理される
Unitの依存・順序関係を解析 ※default.targetに必要なUnitの洗い出し
 ▼
システムに適したtargetの処理 ※Unit間の関係性を元に最適な順序でプロセスの並列処理を実行
 ▼
ログイン画面

ランレベルとターゲット

init

/etc/inittabに定義されたランレベルでシステムを起動する
/etc/rc.d/rc [ runlevel ].d にランレベルに応じたプロセス群が定義され、ファイル名Sの小さい番号から順に起動する

つまり、あるサービスの起動で手間取ると、それより後に実行するサービスが待たされてシステム起動に時間がかかる

systemd

プロセスを「target」としてグループ化することでランレベルと同様のプロセス管理を実現します。

例えば従来のランレベル3(マルチユーザー/コンソールログイン)で必要なプロセス郡は「multi-user.target」として定義されます。

runleveltarget説明
0poweroff.targetシステム停止
1rescue.targetシングルユーザーモード
2,3,4multi-user.targetマルチユーザーモード
5graphical.targetマルチユーザーモード + GUI
6reboot.targetシステム再起動
noneemargency.target緊急シェル
rescue.targetよりも起動対象が少ない
ルートファイルシステムもマウントできない場合などに利用
ランレベルとターゲットの対比

ランレベルとターゲットの対応をコマンドで確認

[root@localhost ~]# ls  -l   /usr/lib/systemd/system/runlevel*target
→
lrwxrwxrwx. 1 root root 15   /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13   /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17   /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17   /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17   /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16   /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13   /usr/lib/systemd/system/runlevel6.target -> reboot.target
# systemctl get-default  :現在のtargetの確認
# systemctl set-default  :targetの変更

systemctlを使ったサービス管理

1. Unitの起動/停止/再起動

# systemctl Unitコマンド Unit名
Unitコマンド機能
startUnitの開始
stopUnitの停止
reloadUnitの設定ファイル再読み込み
restartUnitを再起動 (stop→start)
statusUnitの状態確認
(例)
# systemctl status sshd.service   :sshdの状態確認 
# systemctl start  sshd.service   :sshdの開始
# systemctl stop   sshd.service   :sshdの停止

※CentOS 6までは # service sshd status としていました。

systemctlとserviceの違い

systemctl

すべてのUnitタイプを扱えます。
拡張子を含めたUnit名 ( *.mount, *.socket など ) を指定します。

service

serviceタイプのUnitのみ扱えます。
自動的に「.service」が付与され、拡張子は指定できません。

2. システム起動時のサービス自動起動の設定

systemctl で行います。

# systemctl enable Unit名  :自動起動オン
# systemctl disable Unit名 :自動起動オフ

(例)
# systemctl enable sshd.service

※CentOS 6までは以下のようにしていました。

# chkconfig Unit名 on
# chkconfig Unit名 off

(例)
# chkconfig sshd on

3. 自動起動の確認

Linuxシステム起動時のサービス自動起動オンオフの設定状態は systemctl is-enabled で確認できます。

また現在稼働中かどうかは systemctl is-active で確認できます。

# systemctl is-enabled Unit名 :自動起動の確認
# systemctl is-active Unit名  :稼働中か確認

(例)
# systemctl is-enabled sshd.service  :sshdは自動起動オンか? 
# systemctl is-active  sshd.service  :sshdは現在稼働中か?

4. ランレベルの取り扱い

現在のデフォルトターゲットの表示
# systemctl get-default

デフォルトの起動ターゲット(デフォルトのランレベル)の変更
# systemctl set default multi-user.target

現在のtarget(ランレベル)の変更
# systemctl isolate rescue.target

5. Linuxシステムのシャットダウンと再起動

# systemctl poweroff  :シャットダウン
# systemctl reboot    :再起動

従来のshutdownコマンドも利用可能です。

# shutdown -h now :シャットダウン
# shutdown -r now :再起動

LPIC試験勉強の教科書・参考書

LPICの試験勉強には下記の本が役立ちます。

Linux教科書 LPICレベル1 Version5.0対応Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応徹底攻略 1週間でLPICの基礎が学べる本

Linux教科書LPICレベル1(あずき本)はLinuxのシステムやコマンドを基礎からしっかりと理解できるようになります。これ一冊だけでもなんとかなりますが、初心者にはやや難しいところもあります。
LPICレベル1 スピードマスター問題集はLPICの試験直前の仕上げにやるとほぼ合格できるようになります。ただし基礎を理解せずに問題集だけをやってもあまり意味がないので、まずはあずき本のような教科書を読んで理解しておくことは必須です。
1週間でLPICの基礎が学べる本は、Linux初めてという方や、あずき本の内容が難しく感じた人向けで、LPICの勉強のとっかかりに良いと思います。

LPICは初心者の方でもちゃんと勉強すれば必ず取得できます。
これらの教科書をしっかりと読み込み、わからない箇所を調べながら勉強すれば、独学でも十分LPICレベル1に合格することが可能です。

コメント