linuxOSのコンピュータ起動処理

# コンピュータ起動処理の流れ
電源ON
↓
BIOS起動
↓
ハードウェアチェック、初期化(BIOS)
↓
boot loader起動
↓
起動デバイスからカーネルをメモリ上にロード(boot loader)
↓
メモリ初期化、ルートファイルシステムマウント、デバイスドライバ設定(カーネル)
↓
init(旧来OS)/systemd(最近のOSの主流)プロセス起動(カーネル)
↓
ログインプロンプト起動

## 起動時のログ出力
システム起動時のログ参照方法は以下。

- `dmesg`コマンド
- `var/log/messages`,`var/log/dmesg`,`var/log/boot.log`の内容を参照


## BIOSについて
- ハードウェアの制御を行う。
- 実体はマザーボード、拡張カードのフラッシュROMなどに書き込まれているプログラム。

## デバイスドライバについて
- 接続されたデバイスを制御するために必要な制御プログラム。カーネルモジュールに標準で含まれているものがシステム起動時には設定される。
- ロードされているカーネルモジュールを確認するには`lsmod`コマンドを使う。もしくは`/proc/modules`ファイルの内容を参照する。
- アプリケーションからデバイスにアクセスするにはデバイスファイルも必要。`/dev`ディレクトリに、アプリケーションから扱うデバイスを抽象化したデバイスファイルを作成する必要がある。
  - 手動でデバイスファイルを作成する必要はなく、`udev`という仕組みによりカーネルがデバイス追加を検知すると`/sys`ディレクトリにデバイス情報を作成し、それを参照して`/dev`ディレクトリにデバイスファイルを作成する。

## boot loaderについて
- 主要なboot loaderは`GRUB`
  - 設定ファイルは`/boot/grub/grub.conf`,`/boot/grub/menu.lst`
- ハードディスクなどのストレージからOSを読み込んで起動するプログラム
- 多数のファイルシステムを認識可能
- シェル機能が搭載されているため、コマンドによる管理が可能

## systemdプロセス起動処理について
systemdプロセスを起動するのが最近のOSの主流のため、その起動プロセスのみ記載。

systemdでは以下のプロセスが連携して動作する。

|プロセス |説明  |
|---|---|
|systemd |メインプロセス  |
|systemd-journald  |ログ管理プロセス  |
|systemd-logind  |ログイン処理プロセス  |
|systemd-udevd  |デバイス動的検知プロセス  |


systemdでは`Unit`という処理単位で起動処理が行われる。
以下が`Unit`の拡張子の種類。

|拡張子 |説明  |
|---|---|
|service |各種サービスを表す  |
|device  |各種デバイスを表す  |
|mount  |ファイルシステムのマウントを行う  |
|swap |swap領域を有効にする  |
|target |複数のUnitをグループ化したもの  |

- systemdはシステム起動時に`default.target`というUnitを実行する。
- `default.target`の設定ファイルは`/etc/systemd/system`ディレクトリにある。

実際に`centos`のdockerコンテナを起動して、`default.target`の実体を見てみた。

```bash
[root@7ed61ce4c547 system]# cd /etc/systemd/system
[root@7ed61ce4c547 system]# ls -la
total 24
drwxr-xr-x 6 root root 4096 Dec  5 01:37 .
drwxr-xr-x 4 root root 4096 Dec  5 01:36 ..
lrwxrwxrwx 1 root root   37 Dec  5 01:37 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x 2 root root 4096 Dec  5 01:36 default.target.wants
drwxr-xr-x 2 root root 4096 Dec  5 01:36 getty.target.wants
drwxr-xr-x 2 root root 4096 Dec  5 01:37 multi-user.target.wants
drwxr-xr-x 2 root root 4096 Dec  5 01:36 system-update.target.wants
[root@7ed61ce4c547 system]# cat /lib/systemd/system/multi-user.target
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
```

`default.target`は`/lib/systemd/system/multi-user.target`へのシンボリックリンクになっている。
`multi-user.target`を覗いてみると、また別のtargetを呼び出している。

この`multi-user.target`は`centos6(systemdではなくinitで起動処理を行う)`で言うところのランレベル3に該当する`target`。
initプロセスでは起動時処理のランレベルを設定することで起動処理を切り替えていたが、systemdプロセスでは`target`を設定することで起動処理を切り替える。

|ランレベル |target  |
|---|---|
|0 |poweroff.target  |
|1  |rescue.target  |
|2,3,4  |multi-user.target  |
|5 |graphical.target  |
|6 |reboot.target  |

現在のsystemdプロセスの`target`は何なのか確認

```bash
[root@7ed61ce4c547 system]# systemctl get-default
multi-user.target
```

これを`graphical.target`に切り替えてOS再起動すると、GUIでのログイン画面が起動されるはず。

```bash
root@7ed61ce4c547 system]# systemctl set-default graphical.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target, pointing to /usr/lib/systemd/system/graphical.target.
[root@7ed61ce4c547 system]# systemctl get-default
graphical.target
```

ただDockerコンテナだとOSの`reboot`が実行できなかったので実際にGUIログイン画面は起動できなかった。