こんにちは、先日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では、下記の主なデーモンプロセスが動作しています。
| プロセス | |
| systemd | systemdを統括するメインプロセス | 
| 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を指定するかによって、システムがどのように起動されるか変化します。
ランレベルで置き換えると、以下のようになります。
| ランレベル | ターゲット | 
| 0 | poweroff.target | 
| 1 | rescue.target | 
| 2 ~ 4 | multi-user.target | 
| 5 | graphical.target (multi-user.target + ) | 
| 6 | reboot.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-dependencies | Unitの依存関係の表示 | 
systemctlコマンドで実際にやっていることは、.serviceファイルを削除したりシンボリックリンクを作成をしています。
最後に
試験範囲ではないかもしれませんが、
僕の記憶が正しければ、SysVinitの時代はserviceコマンドでserviceを管理していたと思います。
実はSysVinitとsystemdの間にUpstartと言う起動システムがありましたが、今回は割愛しました。
また、systemdはCentOS7.0から、Ubuntuでは15.04から使われるようになりました。
参考にした書籍はLinux教科書 LPICレベル1 Version5.0対応です。
落ちたお前が言うなって思うかもしれませんが、適度な情報量で読みやすくて試験対策におすすめです。
ここまで読んできただき、ありがとうございました。