Linux インフラ

【LPIC101】SysVinitとsystemd

2021年9月13日

こんにちは、先日LPICを受験してきたのですが、お恥ずかしながら結果は見事に不合格でした。yassanです。

突然ですが、initといえばコンピュータの起動してから最初に実行されるプロセスです。
そのinitをどのように動かすのかの仕組みに、SysVinitやsystemdがあります。

かつてはSysVinitが主流となっていましたが、現在はsystemdが主流となっています。
LPICではどちらも試験範囲に含まれています。

今回は、そんなSysVinitとsystemdについてまとめてみました。

SysVinit

概要

SysVinitでは、initは/etc/inittabの定義にしたがってサービスを順次起動します。
大まかな流れは下記の通り

  • initが/etc/inittabを読み込む
  • initが/etc/rc.sysinitを読み込む
  • initが/etc/rcを読み込む
  • /etc/rcがランレベルによって/etc/rcランレベル.d配下のスクリプトを実行する

このように、SysVinitでは定義された順番にサービスを起動します。
サービスが前後のサービスに依存するため、あるサービスの起動に時間がかかると他のサービスの起動が遅くなり、最終的な起動完了まで時間がかかります。

ランレベル

SysVinitはランレベルと言う概念?動作モードで管理しています。
ランレベルごとに、どのサービスを稼働するか・稼働しないかを決めます。

ランレベルの内容はディストリビューションによって異なりますが、大体は以下の通りです。

ランレベル
0停止
1シングルユーザーモード
2~5マルチユーザーモード
6再起動
Sまたはsシングルユーザーモード

シングルユーザーモードは、rootユーザーだけが使えるもので、システムのメンテナンスなどに使われます。

マルチユーザーモードは、中でもテキストログインやグラフィカルログインがあります。
サーバーとしてネットワークサービスを提供したり、クライアントPCとして使ったりと用途は広いです。

現在のランレベルは、runlevelコマンドで確認できます。
ランレベルを変更するには、スーパーユーザー(root)でinitコマンドかtelinitコマンドを使います。

デフォルトのランレベルは/etc/inittabに定義されています。
例えば、デフォルトのランレベルが3の時は以下の通り。

id:3:initdefault:

SysVinitでは、/etc/init.d配下にサービスの起動スクリプトがあります。
ランレベルに応じて、/etc/rcランレベル.dの中のスクリプトを実行します。
/etc/rcランレベル.d配下に、/etc/init.d配下の起動スクリプトのシンボリックリンクがあります。

systemd

概要

systemdでは、systemdプロセスが起動してサービスを管理します。
systemdでは、下記の主なデーモンプロセスが動作しています。

プロセス
systemdsystemdを統括するメインプロセス
systemd-journaldジャーナル管理、ログ管理
systemd-logindログイン処理
systemd-networkdネットワーク管理
systemd-timesyncdシステムクロック同期
systemd-resolved名前解決
systemd-udevdデバイス動的検知

systemdでは、Unitという処理単位でシステムの起動処理が行われます。
主なUnitは下記の通り。

service各種サービスの起動
device各種デバイスの表現
mountファイルシステムのマウント
swapスワップ領域の有効化
target複数のUnitのグループ化
timer指定した日時・間隔での処理実行

systemdでは、サービスの起動は並列に起動されるため、順次起動に比べて時間が短縮されます。

システム起動時のターゲット

systemdには、ランレベルの概念がありません。
代わりに、システム起動時にはdefault.targetというUnitが処理されます。

default.targetになんのtargetを指定するかによって、システムがどのように起動されるか変化します。
ランレベルで置き換えると、以下のようになります。

ランレベルターゲット
0poweroff.target
1rescue.target
2 ~ 4multi-user.target
5graphical.target (multi-user.target + )
6reboot.target

default.targetは/etc/systemd/system配下にあります。
default.targetは、上記のターゲットのシンボリックリンクを作成することで設定することができます。

サービス管理

systemdでは、systemctlコマンドを使ってサービスを管理します。
主なサブコマンドは下記の通り。

サブコマンド
start / stopサービスの起動 / 終了
restartサービスの再起動
reloadサービスの設定を再読み込み
statusサービスの稼働状況の出力
is-activeサービスが稼働しているかの出力
enable / disableシステム起動時にサービスを自動で起動 / 自動で起動しない
rebootシステムの再起動
list-units起動している全てのUnitの状態を表示
list-unit-files全てのUnitを表示
list-dependenciesUnitの依存関係の表示

systemctlコマンドで実際にやっていることは、.serviceファイルを削除したりシンボリックリンクを作成をしています。

最後に

試験範囲ではないかもしれませんが、
僕の記憶が正しければ、SysVinitの時代はserviceコマンドでserviceを管理していたと思います。

実はSysVinitとsystemdの間にUpstartと言う起動システムがありましたが、今回は割愛しました。

また、systemdはCentOS7.0から、Ubuntuでは15.04から使われるようになりました。

参考にした書籍はLinux教科書 LPICレベル1 Version5.0対応です。
落ちたお前が言うなって思うかもしれませんが、適度な情報量で読みやすくて試験対策におすすめです。

ここまで読んできただき、ありがとうございました。

-Linux, インフラ
-, ,