独学でLPIC受験してみた

勉強したことをアウトプットする備忘録的ブログです

initとsystemdについて

こんにちは。今日は先日解説した起動の続きです。

initとsystemdについて学んでいきましょう。

はじめに

まずは今日解説をするinit/systemdが起動の流れの中でどの部分にあたるかを確認しましょう。

  1. システムの電源を入れる
  2. BIOS/UEFIが起動
  3. BIOS/UEFIがハードウェアのチェックや初期化を行う
  4. 起動デバイスに書き込まれたブートローダを読み込み
  5. ブートローダが起動
  6. ブートローダカーネルをメモリ上へ読み込み
  7. カーネルが起動
  8. カーネルがメモリの初期化やシステムクロックの設定などを実施
  9. カーネルが初期RAMディスクをマウント
  10. カーネルがinit/systemdプロセスを実行 ⇐今回はこの部分
  11. init/systemdが必要なサービスを起動した後にログインプロンプトを表示
  12. 起動処理の完了

init/systemdとは

「init」と「systemd」はどちらもプロセスの名前です。

どちらも一番初めに起動して、その他のプロセスを起動するという動きをします。

プロセスとは

プロセスというのはコンピュータがプログラムを動かす上で割り振っている仕事だと思っていただければと思います。

一般的な会社での仕事のやり方を想像してみてください。例えば社長が行いたい事業が関連する業務ごとに分別されて各部署に割り振られます。その割り振られた仕事がさらに細分化されて部署内で部員に割り振られることになります。こうして末端の仕事が行われると上位の業務が回り、結果として事業が成立します。

コンピュータのプロセスも同じように、その過程でプロセスが増えていきます。この場合の元となるプロセスを「親プロセス」、派生したプロセスを「子プロセス」「孫プロセス」などと呼んでいます。

起動の仕組み

initはsysVinitという起動の仕組みの中で、systemdはsystemdという起動の仕組みの中でプロセスとしての役割を果たします。

sysVinitはこれまで長い間、Unix系OSで広く使われてきました。時代の流れの中で昨日の仕組みが改良され、最近ではsystemdという起動の仕組みが主流になってきます。

SysVinit

SysVinitでは、はじめにinitプロセスを起動します

initプロセスは/etc/inittabファイルの設定に従って必要なプロセスを順に起動します

起動の流れ

①initが/etc/inittabファイルを読み込む

②initが/etc/rc.sysinitスクリプトを読み込む

③initが/etc/rcスクリプトを実行する

/etc/rcスクリプトが特定のランレベルに応じた処理を実行する

SysVinitでは、決められて順番でプロセスが起動することから、あるプロセスの起動に手間取ってしまうと、後続のプロセスが全て遅れることになってしまい、最終的な起動完了までに時間がかかっていました。

そのため現在ではこの問題を改善したsystemdが採用されることが多くなっています。

ランレベル

ランレベルは、動作モードをレベルで表したものです。

それぞれのレベルで起動されるプログラムが異なります。

ランレベル 説明
0 停止
1 シングルユーザモード
2 マルチユーザモード(ネット接続なし)
3 マルチユーザモード(ネット接続あり)
4 未使用
5 マルチユーザモード(グラフィカルログイン)
6 再起動
S or s シングルユーザモード

シングルユーザモードは、管理者のみ使用出来るモードです。主にメンテナンスなどの際に使用されます。

systemd

systemdでは、initプロセスの代わりにsystemdプロセスが起動して、各種プロセスを管理します。systemdでは、システムの起動処理はUnitとよばれる単位に分かれています。まずは主なユニットを確認しましょう。

ユニット名 説明
service 各種プロセスを起動を管理
device systemdで管理するデバイスの定義を実施
mount ファイルシステムのマウント実施
swap スワップ領域を有効化
target 複数のユニットをグループ化実施
timer 対応するserviceユニットの実行を管理

主な動作

systemdプロセスが起動すると、はじめにdefault.targetというUnitが起動されます。このファイルは/etc/systemd/system以下にあります。ここに置かれたファイルはgraphical.targetのシンボリックリンクとなっています。

このgraphical.targetは従来のランレベル5であるグラフィカルログインで起動するサービスをまとめたUnitです。つまり、このようなtargetが従来のランレベルに相当しています。ランレベルとtargetの対応は以下のようになっています。

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

systemdでは、systemctlコマンドを使ってサービスを管理します。詳しくは後日解説します。

 

それでは今日はこの辺で。