systemdとは
systemdはLinuxの起動処理や、Linuxシステムの管理を行う仕組みです。
その実態はプロセスID(PID)=1 のデーモンです。
Linuxシステムの起動順序
CentOS 6以前の方式 (SysVinit)
BIOS/UEFI → ブートローダ → kernel → init
CentOS 7以降の方式 (systemd)
BIOS/UEFI → ブートローダ → kernel → systemd
連携するプロセス
systemdでは下記のデーモンが連携して動作します。
systemd | メインプロセス |
systemd-journald | ログ管理プロセス |
systemd-logind | ログイン処理プロセス |
systemd-udevd | デバイス検知プロセス |
systemd-resolved | 名前解決プロセス |
systemd-machined | 仮想マシンプロセス追跡プロセス |
システム起動時に systemd は Unit という単位で処理します。
システム起動時の処理とサービス管理
SysVinit では…
init ( rc.sysinit, /etc/rc.d ) のシェルスクリプトで起動処理を定義していました。
systemd の場合
- スクリプトではなく設定ファイル
- Unit間の依存と順序の関係を定義
- 用途別に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」として定義されます。
runlevel | target | 説明 |
0 | poweroff.target | システム停止 |
1 | rescue.target | シングルユーザーモード |
2,3,4 | multi-user.target | マルチユーザーモード |
5 | graphical.target | マルチユーザーモード + GUI |
6 | reboot.target | システム再起動 |
none | emargency.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コマンド | 機能 |
---|---|
start | Unitの開始 |
stop | Unitの停止 |
reload | Unitの設定ファイル再読み込み |
restart | Unitを再起動 (stop→start) |
status | Unitの状態確認 |
(例)
# 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(あずき本)はLinuxのシステムやコマンドを基礎からしっかりと理解できるようになります。これ一冊だけでもなんとかなりますが、初心者にはやや難しいところもあります。
LPICレベル1 スピードマスター問題集はLPICの試験直前の仕上げにやるとほぼ合格できるようになります。ただし基礎を理解せずに問題集だけをやってもあまり意味がないので、まずはあずき本のような教科書を読んで理解しておくことは必須です。
1週間でLPICの基礎が学べる本は、Linux初めてという方や、あずき本の内容が難しく感じた人向けで、LPICの勉強のとっかかりに良いと思います。
LPICは初心者の方でもちゃんと勉強すれば必ず取得できます。
これらの教科書をしっかりと読み込み、わからない箇所を調べながら勉強すれば、独学でも十分LPICレベル1に合格することが可能です。
コメント