grub (GRand Unified Bootloader)
ブートファームウエア(BIOS形式、UEFI形式)から呼び出されるブートローダ。
このブートローダーが設定ファイルに従って、OSを立ち上げる.
MBR:
パーティション管理がmsdos形式(4つのプライマリーパーティションとか)
stage1: BIOS形式なブートファームウエアだと、マシン起動時にBIOSで定義されているブート順に
各デバイス(HDD,CDROMら)のMBRを読み込み、MBR内のブートストラップローダが起動する。
次にこのブートストラップローダは、MBRに書かれた/boot/grub/stage2の先頭セクターを読む
stage2: 先頭セクターからプログラム(IPL: Initial Program Loader)を起動させる(grubが起動)
このgrubが、指定したOSをロードする
UEFI:
パーティション管理がGPT形式
電源投入後、マザーボードのUEFIファームウェアがロードされ
ファームウェアが、UEFIブートマネージャを起動する
UEFIブートマネージャは各ディスクのEFI system partitionを読み
既定でロードするブートローダ(grub2)を起動する
このgrubが、指定したOSをロードする
現状、起動に使用しているカーネル
[root@ms ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1062.9.1.el7.x86_64) 7 (Core)
[root@ms ~]#
利用可能なカーネル一覧
[root@ms ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (3.10.0-1062.9.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1127.10.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-4d8381f77a034b6ca6b7f20c28311b46) 7 (Core)
[root@ms ~]#
このうち、上から2番目の「CentOS Linux (3.10.0-1127.10.1.el7.x86_64) 7 (Core)」で次回起動させたいとする.
「grub2-set-default」で定義するが、これは最上位を0とカウントするので1で指定する.
[root@ms ~]# grub2-set-default 1
[root@ms ~]# grub2-mkconfig -o /boot/grub2/grub.cfg <--- UEFIなら「grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg」
とする.
参照先:http://d.hatena.ne.jp/adsaria/20080820
「GRUB>」のコマンドプロンプトが出ないなら、MBRが破損されている可能性がある。
再現方法
/dev/sdaの先頭部分512バイトの一部をddで/dev/zero埋めする
[root@c101 ~]# dd if=/dev/zero bs=1 count=446 of=/dev/sda
/dev/zeroで埋める前と後を下記に示す
hexdumpは指定したファイルを指定した表示にするツール
[root@c101 ~]# hexdump -C -n 512 /dev/sda [root@c101 ~]# hexdump -C -n 512 /dev/sda
00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 *
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 「00」で埋まっているので省略してます
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00
00000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70
00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc
00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 05 7c
00000090 b4 41 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75
000000a0 37 83 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89
000000b0 44 02 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66
000000c0 8b 1e 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd
000000d0 13 72 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84
000000e0 d2 0f 83 de 00 be 85 7d e9 82 00 66 0f b6 c6 88
000000f0 64 ff 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88
00000100 f4 40 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1
00000110 60 7c 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7
00000120 34 88 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1
00000130 88 c5 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00
00000140 70 8e c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e
00000150 b9 00 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f
00000160 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00
00000170 be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00
00000180 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52
00000190 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00
000001a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00
000001b0 00 00 00 00 00 00 00 00 68 d1 09 00 00 00 80 20 000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 20
000001c0 21 00 fd 86 05 41 00 08 00 00 00 08 10 00 00 86 000001c0 21 00 fd 86 05 41 00 08 00 00 00 08 10 00 00 86
000001d0 06 41 fd eb 29 82 00 10 10 00 00 08 10 00 00 eb 000001d0 06 41 fd eb 29 82 00 10 10 00 00 08 10 00 00 eb
000001e0 2a 82 fd fe ff ff 00 18 20 00 00 e8 df 01 00 00 000001e0 2a 82 fd fe ff ff 00 18 20 00 00 e8 df 01 00 00
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
00000200 00000200
[root@c101 ~]# [root@c101 ~]#
これで起動を行ってみると
となり、起動できなくなる。
復旧
ここでは「Super Grub2 Disk」(http://www.supergrubdisk.org/super-grub2-disk/)を使ってみた
このisoを取得してUSBメモリーから起動すると下記のような画面になる
この「Detect and show boot metahods」を選択して、リターンキーを押下します。
するとgrubで見られてたブータブルなカーネルが表示され、先ほどまで使っていたカーネルを選択してリターンキーを押下します。
すると正常に起動します
ログインして、MBRを復旧させます
[root@c101 ~]# grub-install /dev/sda
grubまで来たけど、
grub>
だけの画面になった場合。
あるいは先ほどのツール「Super Grub2 Disk」で、起動後に「c」ボタンを押下して
grub>
とした場合のboot方法。
ここでは「Super Grub2 Disk」の後で「c」コマンドを押下してからの起動方法を示す。
恐らく両者とも同じコマンド体系かと思うのだが
まずはデバイスの認識状況を確認。「ls」を入力します
grub> ls
(hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1) (hd1) (hd1,gpt3) (hd1,gpt2) (hd1,gpt1)
(hd2) (cd) (cd,apple4) (cd,apple3) (cd,apple2) (cd,apple1) (cd,gpt3) (cd,gpt2) (cd,gpt1) (fd0)
grub>
検証マシンは3つのHDDとcdromで起動した「Super Grub2 Disk」を持っている。
(hd0)は、HDDの1つ目(/dev/sda, msdos形式)、(hd1)は2つ目(/dev/sdb, gpt形式)、(hd2)は3つ目(/dev/sdc, raw)を表わす
(cd)はcdrom(「Super Grub2 Disk」)でapple向けとgpt向けのパーティションが存在している。
fd0は不明
grubには、OSの起動に使用するファイルの指定が必要です。grubが現在位置している場所は
grub> echo $root
hd31
grub>
これは4番目のデバイス「cd」の第一パーティション。これを変更して起動デバイス/dev/sda1にします
grub> set root=(hd0,msdos1)
grub> ls
lost+found/ grub/ efi/
System.map-2.6.32-573.el6.x86_64 config-2.6.32-573.el6.x86_64 symvers-2.6.32-573.el6.x86_64.gz
vmlinuz-2.6.32-573.el6.x86_64 initramfs-2.6.32-573.el6.x86_64.img
と無事/dev/sda1に移って、そこに存在するファイルらを確認できた。
使用したいカーネルは「vmlinuz-2.6.32-573.el6.x86_64」なので
grub> linux /vmlinuz-2.6.32-573.el6.x86_64 ro root=/dev/sda3
と定義します。引数の「root」であるが、これは起動したいOS側のroot領域を指定します
*「set root=(hd0,msdos1)」のrootはgrub側のことです
そして、
grub> initrd /initramfs-2.6.32-573.el6.x86_64.img
とinitrdの指定も行い、起動させます
grub> boot
あるいは、
grub> linux (hd0,msdos1)/vmlinuz-2.6.32-573.el6.x86_64 ro root=/dev/sda3
grub> initrd (hd0,msdos1)/initramfs-2.6.32-573.el6.x86_64.img
grub> boot
でも大丈夫です
もちろんツール「Super Grub2 Disk」の画面から起動も可
参照 https://jp.linux.com/news/linuxcom-exclusive/418274-lco20140625
そして/boot/efi以下が毀損した場合は「Super Grub2 Disk」で起動して
[root@c ~]# yum install shim-x64 grub2-efi-x64
で復旧させる