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をロードする

uefi


起動しない(BIOS編)

参照先: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 ~]#

これで起動を行ってみると

2017y07m24d_192736788.png

となり、起動できなくなる。

復旧
ここでは「Super Grub2 Disk」(http://www.supergrubdisk.org/super-grub2-disk/)を使ってみた
このisoを取得してUSBメモリーから起動すると下記のような画面になる
2017y07m24d_193048913.png

この「Detect and show boot metahods」を選択して、リターンキーを押下します。
するとgrubで見られてたブータブルなカーネルが表示され、先ほどまで使っていたカーネルを選択してリターンキーを押下します。
2017y07m24d_193525029.png

すると正常に起動します
2017y07m24d_193928610.png

ログインして、MBRを復旧させます

[root@c101 ~]# grub-install /dev/sda

grubコマンド(BIOS編)

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

でも大丈夫です

参照 https://jp.linux.com/news/linuxcom-exclusive/418274-lco20140625


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2017-07-26 (水) 21:04:18 (87d)