linux起動までを再度確認してみる

## 勉強前イメージ

いろいろ忘れてしまってる・・・

## 調査

### 起動順序

ざっくりの順序としては以下になります。

1. 電源を投入
2. BIOSの起動
3. ブートローダーの起動
4. カーネルの起動
5. initプロセスの起動

以下から細かく見ていきます。

#### 1. 電源を投入

これはそのままで、サーバの電源を入れます。

#### 2. BIOSの起動

BIOSと書いていますが、実際現在はUEFIがほとんどです。
UEFIもBIOSも総称してBIOSと呼ばれることが多いです。

BIOSとは低レイヤーの制御プログラムとして組み込まれているものになります。
電源投入後、最初に実行されるベクターがメモリのプログラムを実行し、デバイスの初期化を行いブートローダーを起動します。
旧来のBIOSは2TBの容量の制限や最初に読み込まれるコードが16bitだったためOSが移り変わる際に使いづらくなりました。
そのためBIOSの後継機の [UEFI](https://qiita.com/miyuki_samitani/items/7b75f0f535b0c2c9ae1d) が登場しBIOSの欠点を解消しました。

#### 3. ブートローダーの起動

linuxでは [GRUB(またはGRUB2)](https://qiita.com/miyuki_samitani/items/ac0f73a8859b4eb51d82) がブートローダに該当しています。
ブートローダは以下の2段階に分かれています。(BIOSだと)

- MBRに格納されている以下の情報をロード
- MBR情報から呼び出される情報

2段階になってる理由としては、
MBRに格納されているブートローダーのサイズが制限されているので全体を格納できず分割して置いています。

#### 4. カーネルの起動

カーネルが起動すると最初のプロセスのinitプロセスが実行される。
メモリの初期化やシステムクロックの設定、パーティションのマウントが実施される。
カーネルが起動時にどのようなことを処理したかは `dmesgコマンド` で確認が出来ます。
例としては以下のようなログになります。

```
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.10.0-1160.24.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Thu Apr 8 19:51:47 UTC 2021
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.24.1.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=ja_JP.UTF-8
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data
```

#### 5. initプロセスの起動

カーネルが最初に起動するプロセスがinitプロセスで、/etc/inittabに基づいて実施されます。
が、CentOS7では全部コメントアウトされていて実質使われていません。
/etc/inittabはSysVinitのときに使われており、
今はsystemdが主流なので、/etc/systemd/system配下のdefault.target に基づいて処理が行われます。

```
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#
```


## 勉強後イメージ

dmesgがカーネルのログだって知らなかった・・・・
バッファを超えたら先頭から上書きされるらしい
いろんな歴史があって古いのもあるから難しいね。

## 参考

- [Linux - system boot](https://www.infraeye.com/study/linuxz2.html)
- [【Linux】ブートローダーからカーネルまでの起動プロセス](https://kimamani89.com/2020/05/01/%E3%80%90linux%E3%80%91%E3%83%96%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%8B%E3%82%89%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%BE%E3%81%A7%E3%81%AE%E8%B5%B7%E5%8B%95%E3%83%97/)
- [【 dmesg 】コマンド――カーネルが出力したメッセージを表示する](https://atmarkit.itmedia.co.jp/ait/articles/1612/20/news023.html)