CentOS6からの変更 ブートローダGrubについて

# はじめに
最近CentOS7でDockerを使うようになり、今更ですがCentOS7の特徴をまとめてみました。

# 試した環境
Biosから起動するCentOS

```shell

# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
```

# CentOS6からの変更点まとめ参考
↓に変更の要点がまとめられています。
[CentOS6とCentOS7の比較表](https://qiita.com/sion_cojp/items/115e1671fcbc8f214aee)

その中でも、**ブートローダ**、**systemd**、**firewalld**、**ネットワーク関連のコマンド変更**に着目して、今回はブートローダについてまとめてみました。

# ブートローダ
## Cent6
### バージョン
grub Lagacy

```shell

# grub-install --version
grub-install (GNU GRUB 0.97)
```

### 設定ファイル
* **/boot/grub/menu.lst**と**/boot/grub/grub.conf**　普通にこのファイルを直接編集
* /boot/grub/menu.lstは/boot/grub/grub.confへのシンボリックリンクになっている。

```sh

# ll /boot/grub/menu.lst 
lrwxrwxrwx. 1 root root 11  9月 14 23:54 2016 /boot/grub/menu.lst -> ./grub.conf
```

### ブートシーケンス
bios
↓
mbr(stage1) #biosがmbrにあるstage1(ブートローダ)を読み込む
↓
セクタ2~64(stage1.5) #stage1がセクタ2以降にあるstage1.5を読み込む
↓
/boot/grub/stage2(stage2) #(stage1.5はファイルシステムを解釈できるのでstage2を呼び出せる)
↓
/boot/grub/menu.lstを読み込む
↓
grub起動画面
↓
カーネルとinitramfsのロード


### シーケンス詳細

#### ステージ制

Stage 1ローダは直接Stage 2ローダを読み込めるが、通常はその間に入るStage 1.5ローダを読み込むためセットアップを行う

#### stage1.5はどこ
MBRの直後から最初のパーティション手前までにある先頭30KB以内に位置するローダ。何らかの理由でこの領域が利用できない場合Stage 1.5ローダのインストールに失敗する（例えば、異常なパーティションテーブルが原因でセクタアドレスが読み取れなかったり、特殊なディスクドライバを必要とするケース、またはGPTもしくはLVMなどを利用するシステムの場合など）

#### stage1.5の特徴
Stage 1.5ローダのイメージはファイルシステム固有のドライバを含んでいる。よってファイルシステム上にあるstage2を呼び出すことができる

### grubコマンド
 grub-installしかつかったことない。grub(stageを)インストール。ただ自分が実行したときうまくいかずにgrubシェル(bashライクなインタフェースでgrubに関する設定ができる)を実行してインストールした記憶がある。

```sh

# grub-
grub-crypt      grub-install    grub-md5-crypt  grub-terminfo  

# grub
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> 

```


## Cent7
### バージョン
Grub2

```shell

# grub2-install --version
grub2-install (GRUB) 2.02~beta2
```

### ブートシーケンス

bios
↓
MBR(boot.img) # biosがboot.imgを起動
↓
セクタ２～６４　# boot.imgがcore.imgを起動。ファイルシステムにある各モジ　 
                 ールを動的にリンク
↓
/boot/grub2/grub.cfgを参照
↓
grub起動画面
↓
カーネルとinitramfsのロード

#### Cent6との違い
* セクタ1(MBR)にboot.img、セクタ２ー６４にcore.imgが配置
* モジュールを動的にロード
    * stage1,stage1.5,stage2なくなる → boot.imgとcore.img、coreimgが動的に複数のモジュールをロードする。


### 設定ファイル
[詳しい説明](http://enakai00.hatenablog.com/entry/2015/11/27/152442)
[Linux 上の GRUB 2 がブートできなくなったときの対処方法](https://jp.linux.com/news/linuxcom-exclusive/418274-lco20140625)

* /boot/grub2以下に関連ファイルある
* boot/grub2/grub.cfg
  - ここは直接編集しない。コマンドで生成する
* 編集方法
  - /etc/default/grubを編集
  - /etc/grub.dにあるスクリプトも適宜編集
* grub-mkconfigコマンド > /boot/grub/grub.cfg
  - /boot/grub2/grub.cfgを生成

### grubコマンド
たくさんある！
grubシェル起動はない？？？

```sh

# grub
grub2-bios-setup           grub2-glue-efi             grub2-mkconfig             grub2-mkpasswd-pbkdf2      grub2-probe                grub2-set-default
grub2-editenv              grub2-install              grub2-mkfont               grub2-mkrelpath            grub2-reboot               grub2-setpassword
grub2-file                 grub2-kbdcomp              grub2-mkimage              grub2-mkrescue             grub2-render-label         grub2-sparc64-setup
grub2-fstest               grub2-macbless             grub2-mklayout             grub2-mkstandalone         grub2-rpm-sort             grub2-syslinux2cfg
grub2-get-kernel-settings  grub2-menulst2cfg          grub2-mknetdir             grub2-ofpathname           grub2-script-check         grubby

```
# 補足
## set root
設定ファイルに記載されているrootはルートパーティションの指定ではなく**カーネルとinitrdが置かれているディスクとパーティション**のこと。

## device.map
grubの設定ファイルに書かれているGrub形式のデバイス名(hd0) を Linuxデバイス名(/dev/sda)にマッピングする

```sh

# cat /boot/grub/device.map 
# this device map was generated by anaconda
(hd0)     /dev/sda
```

## カーネル起動せずにgrub>になってしまったら
[Linux 上の GRUB 2 がブートできなくなったときの対処方法](https://jp.linux.com/news/linuxcom-exclusive/418274-lco20140625)

なるほど👀

> GRUB 2 が正常に起動し、 モジュール (および / boot/grub/[arch]/ に格納されている他モジュール) をロードしたが、grub.cfg ファイルが見つからなかったことを意味

なるほど👀

>このようなことがなぜ起こるのでしょうか。カーネルが何らかの理由でドライブ名を変更した、ハード ディスクを移動した、パーティションを変更した、または新しいオペレーティング システムを追加して関連する何かを移動したなどです。これらの場合は、GRUB がファイルを検出できないだけで、ファイル自体はもとの場所に存在します。そこで、GRUB がプロンプトを出したら、ファイルの場所を指定し、システムをブートして、GRUB の設定を修正すればよいのです。

# まとめ
ブートローダを調べることでカーネルがどうやって起動するかを確認することができました。biosから起動される前提でしたが、UEFIなどにも興味があるのでUEFIについてもまとめてみようと思います。