Sys V initに基づくLinux Boot Sequence

Understanding systemd, systemctl 3/N

公開日: 2023-07-15
更新日: 2023-08-16

  Table of Contents

Linuxのシステム起動の流れ

Def: ブートシーケンス

  • システムを立ち上げるまでの処理をブートという
  • ブートシーケンスとは, 電源を入れてからログインまでに行われる, カーネル初期設定, ファイルシステムのマウント, デーモンの起動, ネットワーク設定というOSが稼働するまでの必要な設定の一連の流れのこと指す

以下はLinuxのシステムが起動するまでの大まかな流れです:

flowchart TD
    A[ 電源投入 ] --> B[BIOS/UEFIの起動]
    B --> C[Bootloader, GRUB/GRUB2など]
    C -->D[カーネル & initramfsの読み込み]
    D -->E[カーネルの実行]
    E -->F[initramfsの実行]
    F -->G[init/systemdの起動 & ルートファイルシステムのマウント]
    G -->H[init/systemdの実行]
    H -->I[各種サービスの起動]
    I -->|デスクトップ環境あり| J[ログイン画面]
    I -->|デスクトップ環境なし| K[ログインプロンプト]

なお最新のシステムでは

  • PCファームウェアはUEFI
  • bootloaderはGRUB2
  • 最初のユーザープロセスはsystemd

という構成が一般的です.

initプロセスの起動

SysVinitに基づくブートシークエンスを用いたシステムでは, カーネルが起動するとinitプロセス(/sbin/init)というシステム環境を設定するプログラムがprocess id 1として起動します. initは, /etc/inittabファイルに従いシステムランレベルの設定と初期化設定など逐次処理的に実行していきます.

initが行うこと

initが行うことの代表的なタスクとして以下のものが例としてあります:

  • ランレベルの設定
  • /etc/rc.sysinitスクリプトの実行
  • /etc/rcスクリプトの実行

/etc/rc.sysinitスクリプトはシステムを初期化するためのシェルスクリプトです. ネットワークの設定, ホストネームの設定, カーネルの設定, クロックの設定, システムフォントの設定, ファイルシステムの設定などを行います.

ランレベル

ランレベルとは, Linuxが動作状態を表す数字のことで, 0~6までの7種類があります.

ランレベル 意味
0 シャットダウン(システムの停止)
1 シングルユーザーモード(rootのみ)
2 ネットワークなしのマルチユーザーモード
3 通常のマルチユーザーモード(テキストログイン)
4 未使用
5 グラフィカルログインによるマルチユーザーモード
6 システムの再起動

定義されたランレベルに応じてLinuxは起動するプログラムを区別/管理しています. ランレベル別のディレクトリは /etc/rc.d/rc[0-6].dで, その中のファイルで各ランレベルで実行するプログラムを指定しています.

ランレベルを変更するためには, rootユーザでinitコマンド, or telinitコマンドを使用します.

1
~# init 6

と入力するとランレベルが6に移行 = システムの再起動となります.

Column: デフォルトのランレベルの設定

Linux起動時には, 最初のプロセスとしてinitが実行され, defaultとして指定されたランレベルで起動します. Sys V initでは, defaultのランレベルは /etc/inittab に記述されています. ランレベルのdefault値を0や6に設定すると, システム起動ができなくなるので注意が必要です.

systemd

現在の主要なディストリビューションでは, サービス管理は SysVinit に代わって systemd が採用されています. systemdの中核となるデーモン /usr/lib/systemd/systemdは以下に見るように/sbin/initにシンボリックされたプログラムで,

  • カーネルが起動するとinitプロセス(/sbin/init)というシステム環境を設定するプログラムがprocess id 1として起動します

というルールは変わりません.

1
2
3
4
5
6
% ps -e | head -2    
    PID TTY          TIME CMD
      1 ?        00:00:01 systemd

% ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Aug 22 06:11 /sbin/init -> /lib/systemd/systemd*

systemdの特徴

systemdの特徴として代表的なものは以下が挙げられます:

  • 依存関係の定義によるサービス起動の並列処理
  • UnixソケットとD-busを使用したプロセス間通信
  • cgroupsによるプロセス管理
  • ユニット単位での管理

依存関係の定義によるサービス起動の並列処理

  • SysV init後くじ処理によるサービス起動とは異なり, 依存関係の定義によるサービス起動の並列処理を行うことでシステムの起動時間を短縮している
  • SysV initがサービス起動をシェルスクリプトを使用していているのに対して, systemdでは設定ファイルの参照によりサービスを起動することでシェルへのオーバーヘッドをなくし, 処理の高速化を実現

UnixソケットとD-busを使用したプロセス間通信

  • D-busはlibdbusライブラリとdbus-daemonによって提供されるメッセージバス
  • D-busを利用することで複数のプロセス間通信を並列処理することができる
  • systemdはUnixソケットを介してD-busを利用している

cgroupsによるプロセス管理

  • プロセスをPIDではなく, Linuxカーネルのcgroups機能を利用してプロセスを管理
  • プロセスは生成時に親プロセスと同じcgroupsに所属

ユニット単位での管理

  • ユニットにはハードウェア, mount, service, targetなどの12のタイプがある
  • ユニットの設定ファイルは /usr/lib/systemd/system//etc/systemd/system/に置かれている

systemdが最初に実行するターゲット: sysinit.target

systemdは設定ファイルを参照して以下のような起動シーケンスを介してシステムを立ち上げます

flowchart TD
    A[ systemd ] --> B[sysinit.target]
    B --> C1[basic.target]
    B --> C2[rescue.target]
    C2 --> D2[ログインプロンプト]
    C1 --> D1[multi-user.target]
    D1 --> E1[graphical.target]
    D1 --> E2[ログインプロンプト]
    E1 --> F[ログイン画面]

Def: ターゲット

ターゲットは, どのようなサービスを提供するかなどのシステムの状態を定義するもの. SysV initのランレベルに相当する. 主なターゲットは以下の通り:

ターゲット SysVランレベル 説明
default.target - システム起動時のデフォルトのターゲット
システムはこのターゲットまで立ち上がる. 通常はgraphical.targetmulti-user.targetへのシンボリックリンク
sysinit.target - システム起動時の初期段階のセットアップを行うターゲット
rescue.target 1 障害発生時やメンテナンス時に利用するターゲット
multi-user.target 3 テキストベースでのマルチユーザーのセットアップを行うターゲット
graphical.target 5 グラフィカルログインをセットアップするターゲット

なお, ターゲットの取得と変更はsystemctlコマンドで実現できます:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## デフォルトターゲットの表示
% systemctl get-default
graphical.target

## デフォルトターゲットの変更
% systemctl set-default multi-user.target
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.

## デフォルトターゲットを元に戻す
% systemctl set-default graphical.target 
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/graphical.target.

## システム稼働状態のままターゲットを変更する場合
% systemctl isolate multi-user

Appendix: BIOS vs UEFI

BIOSとbootloader

ハードウェアに近いところでのプログラムの動作環境にBIOS(Basic Input/Output System)があります. BIOSはハードウェアに組み込まれている不揮発性メモリ(NVRAM, Non Volatile RAM)に格納された ファームウェアです. BIOSが持っていう機能の代表的なものは2つあります:

  • キーボード, ディスク, グラボなどの基本制御プログラム
  • bootloaderを起動する機能

bootloaderは簡単に言うとOSを起動するプログラムのことです. アプリケーションを起動するのはOSの役割ですが, OS自身の起動はOSの仕事ではなくbootloaderの仕事です.

PCの電源を投入すると, BIOSは設定されたデバイスの優先順位に従ってディスクの先頭部分にあるMBR(Master Boot Record)内のbootloaderを検索し, 最初に検知したデバイスのローダーを起動します. なお, bootloaderの優先順位はBIOS設定画面で変更可能です.

UEFI

BIOSに変わるファームウェア企画としてUEFIがあります, BIOSと異なり

  • GUID Partition Tableといった大容量ディスクへの対応
  • Secure boot
  • ネットワークを介したリモート診断
  • NVRAMに設定された優先順位に従って, ディスクのEFIパーティションに格納されているbootloaderを起動

LinuxカーネルのBios/UEFI起動経由の確認

root userでloginした後,

  • /sys/firmware/efiが存在 → UEFI経由
  • /etc/grub2.cfgが存在 → BIOS経由

で判定することができます.

1
2
3
4
5
6
7
8
9
10
11
## UEFI経由の場合
hostname# ls -ld /sys/firmware/efi
drwxr-xr-x 6 root root 0 Aug 21 11:10 /sys/firmware/efi
hostname# ls -lrt /etc/grub2.cfg
ls: cannot access '/etc/grub2.cfg': No such file or directory

## BIOS経由の場合
hostname# ls -ld /sys/firmware/efi
ls: cannot access /sys/firmware/efi: No such file or directory
hostname# ls -lrt /etc/grub2.cfg
lrwxrwxrwx. 1 root root 22 May  5 05:06 /etc/grub2.cfg -> ../boot/grub2/grub.cfg

References



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)