Chapter 09

Linux起動シーケンス

おでん
おでん
2021.07.20に更新

Linux起動シーケンスとは

Linux起動シーケンスとは、コンピュータの電源を入れてからログインして、Linuxを使用できるようにするまでの流れ**のことです。

一般的には、Linuxの起動シーケンスは以下の通りです。

  1. 電源ON
  2. BIOS起動
  3. ブートデバイス(HDDなど)確認
  4. GPT(ブートローダ位置情報など記載の領域)読み込み
  5. ブートローダ(OS起動プログラム格納の領域)読み込み
  6. カーネル起動
  7. 初期プロセス起動
  8. 起動対象サービス確認
  9. サービス起動
  10. ログイン画面表示

カーネルとは

カーネルとはOSの中の中核です。
簡単に言うと、OSの心臓です。
カーネルは、ユーザやOSが直接やりとりできません。

シェルとは

シェルとは、OSとカーネル間を持ち、OSを操作できるソフトウェアのことです。
つまり、OSとカーネルの翻訳者のようなものです。

ここまでのOS・カーネル・シェルをまとめている図があります。
シェル

参考:note(とよももさん)

シェル(shell)は貝という意味で、カーネルを包み込んでいることがわかります。
このように、カーネルとやりとりできるのがシェルということです。

それでは、私たちユーザはどのようにシェルとやりとりするのでしょうか。
ユーザはOSやシェルと直接やりとりすることはできません。
OSやシェルとやりとりするには、アプリケーションを介して行います。
シェルとのやりとりを行う際に使用するアプリケーションが、コマンドプロンプト(Windows)またはターミナル(Mac)です。
この流れが、以下の図の通りです。

シェル流れ

参考:note(とよももさん)

シェルの種類

一般的にシェルは、UNIX系OSのシェルを指すことが多いです。
UNIX系のシェルにもいくつかの種類がありますが、ここでは代表的なものだけ紹介します。

  • sh:最も古いシェル。
  • bash:shの上位互換。最も標準的。
  • tcsh:C言語と相性が良い。
  • zsh:さまざまなシェル機能を持った万能型。

シェルの実行・確認方法

シェルの実行はシンプルに以下のコマンドで行います。

$ シェル名

実行の確認はpsコマンドを実行し、プロセスが増えているかを確認します。

$ ps

また、シェル実行環境プロセスを終了するには、exitコマンドを実行します。

$ exit

systemd

systemdはサービスを起動するための初期プロセスです。
カーネル(PPID:0)から起動され、PID(プロセス番号)は1です。

PPIDとPIDの確認は「ps -ef」コマンドで行います。

$ ps -ef

ターゲットユニットファイル

ターゲットユニットファイルとは、サービスユニットをグループ化しているファイルです。
用途ごとに様々なターゲットユニットファイルが存在します。
ターゲットユニットファイルを読み込むことで、Linuxの動作モードが決定されます。
実際のターゲットユニットファイルは、以下のディレクトリ配下に「.target」という末尾で存在するファイルです。

/usr/lib/systemd/system/(*.target)

主なターゲットユニットファイル例は以下の通りです。

ユニットファイル名 説明
poweroff.target システム停止用
rescue.target rootユーザのみ操作可能
multi-user.target 複数ユーザが操作可能
graphical.target GUIで操作(一般的にはOFF)
reboot.target 再起動用
emergency.target rootユーザのみ操作可能(rescueよりも緊急)

systemctl (オプション) (サブコマンド)

ターゲットユニットを管理する。(その他用途もあり)

主なオプションは以下。

オプション名 機能
--type=ユニットタイプ 操作対象のユニットタイプを指定する

主なサブコマンドは以下。

ユニットファイル名 説明
get-default ターゲットユニットファイルを確認する
set-default ターゲット ターゲットユニットファイルを設定する
isolate ターゲット ターゲットユニット(動作モード)を変更する(--typeオプションと併用)
list-units 現在動作しているユニット一覧を確認する

サービスユニットファイル

サービスユニットファイルとは、サービスの起動・停止などの情報が記載されているファイルです。
ターゲットユニットファイルを読み込みに応じて、サービス(プロセス)を起動します。
実際のサービスユニットファイルは、以下のディレクトリ配下に「.service」という末尾で存在するファイルです。

/usr/lib/systemd/system/(*.service)