🦔

LPIC101 SysVinitとSystemdの違いを調べてみた

2023/10/27に公開

はじめに

こんにちは!AWS大好き学生みゃっちーです🦔
AWSばっかり触ってオンプレの知識が乏しい…ということでLPIC試験に挑戦することにしました!
今回はSysVinitとSystemdの違いについて学びました!

検証環境

AWS EC2 Amazon linux

SysVinitとSystemd

UNIX系OSではSysVinitがメインだったが、現在はsystemdが起動の主流になってきた。

SysVinit

起動方法
1.initが/etc/inittabファイルを読み込む
※Amazon Linuxでこのファイルを表示すると下記のような記載があり、Sysvinitでこのファイルを使ってたけどsystemdに移行したからこのファイルは無効だよ!とのことでした。

内容詳細要約

/etc/inittab ファイルは使用されなくなりました。従来、このファイルは SysVinit システムでランレベルとシステムの動作を設定するために使用されていましたが、systemd に移行されたため、このファイルは無効になりました。

Ctrl-Alt-Delete キーコンビネーションによるシステムの再起動(通常はシャットダウンまたは再起動)は、/usr/lib/systemd/system/ctrl-alt-del.target によって処理されます。systemd はランレベルの代わりに "targets" を使用し、各ターゲットは特定のシステムの動作モードを表します。

デフォルトのターゲットは multi-user.target であり、これは通常、ランレベル 3 に相当します。また、graphical.target は通常、ランレベル 5 に相当します。これらのターゲットはシステムの実行モードを表します。

現在のデフォルトのターゲットを表示するには、systemctl get-default コマンドを実行できます。

デフォルトのターゲットを設定するには、systemctl set-default TARGET.target のようなコマンドを使用できます。

sysvinitを使用しているOSの場合は下記のようなデータが記述されている。

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

このデータの一行目を言葉で説明すると、下記のようになります。
「ID 1 のジョブはランレベル 2、3、4、5 で実行され、ジョブが終了した場合にrespawn(自動的に再起)し、/sbin/getty プロセスが実行されます。このプロセスは通信速度 38400 ボーレートで /dev/tty1 デバイス(端末1)に接続を提供する。」

2.initが/etc/rc.sysinitスクリプトを読み込む
rc.sysinitスクリプトには基本的なシステムの初期化タスクが記述されている。

3.initが/etc/rcスクリプトを実行する。
読み込んだ初期化タスクを実行してシステムの起動前に実行することでシステムの正常動作に必要な初期化を行う。

4./etc/rcスクリプトが/etc/rc〇.dの各ランレベルのスクリプトを実行する

/etc/rc.d/
|-- rc0.d/       # ランレベル 0(シャットダウン)用
|   |-- K10service
|   |-- K20another-service
|   |-- ...
|-- rc1.d/       # ランレベル 1(シングルユーザーモード)用
|   |-- K10service
|   |-- S20network
|   |-- ...
|-- rc2.d/       # ランレベル 2(マルチユーザーモード)用
|   |-- S10service
|   |-- S30apache
|   |-- ...
|-- rc3.d/       # ランレベル 3(マルチユーザーモード)用
|   |-- S10service
|   |-- S50mysql
|   |-- ...
|-- rc4.d/       # ランレベル 4(カスタムランレベル)用
|   |-- ...
|-- rc5.d/       # ランレベル 5(グラフィカルモード)用
|   |-- S20gdm
|   |-- ...
|-- rc6.d/       # ランレベル 6(再起動)用
|   |-- K10service
|   |-- K20another-service
|   |-- ...

ランレベル

上記でも少し出てきたがランレベルとは動作モードごとにサービスを分ける括りで使われているOSによって多少の違いがある。
https://ja.wikipedia.org/wiki/ランレベル

大まかにシングルユーザモードとマルチユーザモードが存在し、シングルユーザモードについてはrootユーザのみが使用することができる。

ランレベルの確認

ランレベルの確認にはrunlevelコマンドを使用する。
変更にはinitコマンドを使用する。注意点としては「init 1」でシングルユーザモードに移行するとほかのマルチユーザモードでアクセスしているユーザは操作ができなくなってしまう。

起動時の初期ランレベルを設定するときは/etc/inittabファイルのデフォルトランレベルを変更する。

#現在は5に設定
id:5:initdefault:

Systemd

systemdではinitプロセスの代わりにsystemdプロセスを使用し各種サービスを管理する。
systemdプロセスは複数のデーモンプロセスが連携して動作しており、主に次のようなプロセスがある。
※デーモンはメモリ上に常駐して様々なサービスに機能を提供するプロセス。
一例をあげると下記のようなものがある。
systemd-journald:ログを管理する
systemd-login:ログイン処理をアクセスする
systemd-network:ネットワークを管理する

Unit

systemdデーモンは複数の処理単位(unit)と呼ばれる個々のサービス、デバイス、マウントポイント、ターゲットなどの設定を記述したファイルに従って各サービスを動作される。
unitファイルであるhttpdをインストールして中身を確認すると下記のようなものが記述されていた。
※unitファイルの保存される場所はOSによって違うが、Amazon linuxの場合は/usr/lib/systemd/systemに保存されていた。

unitファイルの拡張子によって処理の内容が分けられてる。
systemdのユニットの種類

ユニットタイプ 説明
.service プロセスの起動/停止/再起動などを定義する
.device デバイスの情報が定義される(udevで自動的に生成される)
.target 複数のユニットをまとめるユニット
.socket ソケットの監視設定を定義する(xinetdの代替として利用できる)
.path 指定されたパスを監視して、ファイルが作成されると指定されたサービスを起動する
.mount 指定したファイルシステムをマウントする(fstabによっても自動生成される)
.automount オートマウントの処理を定義する(fstabによっても自動生成される)
.timer 時間指定で処理を実行できる(cronの代わりにもなる)
.swap 指定されたスワップ領域を有効化する(fstabによっても自動生成される)

引用
https://www.kabegiwablog.com/entry/2018/06/11/100000

先ほど見たhttpd.serviceはserrviceなのでhttpdを起動、停止、再起動するためにunitということがわかる。

Systemdの起動

システムが起動するとetc/systemd/default.targetが起動される。target拡張子は複数のunitをまとめたものである。その後デフォルトターゲットに設定されているターゲットへシンボリックリンクを作成する。
※1つのファイルまたはディレクトリを別の場所にリンクさせるための特殊な種類のファイル
※amazon linuxでは/usr/lib/systemd/systemにある。

またその他ターゲットの種類にはこのようなものがある。

引用
https://www.guri2o1667.work/entry/2020/10/17/【RHEL8】ランレベルとターゲットについて#google_vignette

サービスの起動

unitの管理はsystemctlコマンドを使用する。

操作 コマンド
サービス起動 systemctl start ${Unit}
サービス停止 systemctl stop ${Unit}
サービス再起動 systemctl restart ${Unit}
サービスリロード systemctl reload ${Unit}
サービスステータス表示 systemctl status ${Unit}
サービス自動起動有効 systemctl enable ${Unit}
サービス自動起動無効 systemctl disable ${Unit}
サービス自動起動設定確認 systemctl is-enabled ${Unit}
サービス一覧 systemctl list-unit-files --type=service
設定ファイルの再読込 systemctl daemon-reload

引用
https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9

systemdが主流になった理由

1.並列処理を行うことができる。

sysvinitは決められた順にサービスを起動するため、あるサービスの起動に時間がかかるとそれ以降のサービスの起動が遅くなってしまう。

2.依存関係の自動解決

Systemdはサービス間の依存関係を自動的に解決し、必要なサービスを適切な順序で起動する。これにより、管理者が手動で依存関係を設定する必要がなくなり、管理が容易になった。

3.セキュリティ強化と統一的な管理

Systemdはセキュリティを向上させ、プロセスの分離を意識している。また、統一的なコマンド体系でサービス管理が行え、異なるディストリビューションでの作業が簡略化された。

まとめ

今まではただ記事を読みながら手順通りにsystemctl〇〇…と打つだけでしたが改めて意味や役割を理解すると見方が少し変わりますね!これからも勉強続けていきます😊

参考

とても分かりやすくてさすが小豆本。一択ですね。
https://www.amazon.co.jp/Linux教科書-LPICレベル1-Version5-0対応-中島-能和/dp/4798160490/ref=asc_df_4798160490/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=1975416269932882331&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009366&hvtargid=pla-649269108462&psc=1&th=1&psc=1

Discussion