(実験)MBRとGRUBを削除する

投稿者: | 2019年3月30日

みなさんこんにちは。ヒロウミです。
「プロのためのLinuxシステム構築・運用技術 」を読んでいてLinuxのブートシーケンスについて紹介されていたので、気になったことを実験してみたいと思います。気になったこととしては、「ブートシーケンスで必要な情報がなかった場合にシステムはどうゆう風に振る舞うんだろう?」ということです。
とても面白い書籍なのでみなさんもぜひ手に取ってみることをお勧めします。




環境

  • CentOS7 on KVM
    • ディスクはMBR方式
  • ※壊れても良い環境でやっています。実際にご利用の環境での実行は行わないでください。システムが起動してこなくなります。

実験内容

  • 1. MBR(Master Boot Record)を削除する
    • 具体的にはddコマンドを使って/dev/zeroで0埋めしてしまいます
    • この状態で再起動してどうなるかを確認する
  • 2. GRUBを削除する
    • こちらもddコマンドを使って/dev/zeroで0埋めしてしまいます
    • この状態で再起動してどうなるかを確認する

これらを実行して、それぞれの削除後の起動の様子を確認していきます。
削除された箇所の違いによって、起動時の出力も異なるのかをみたいと思います。

実験の前にちょっとおさらい

実際にMBRやGRUBの削除を行う前に、Linuxのブートシーケンスをおさらいしておこうと思います。
(自分もそこまで詳しくないので簡単にしか書けません。詳しく知りたい方は書籍等で調べてください。。。)

1. BIOSがMBR(セクタ0)のを読み込む(先頭~446バイト/ブートストラップローダ残りがパーティションテーブル)
2. ブートストラップローダがブードデバイスのセクタ1~2047セクタの間に格納されているGRUBを読み込む
3. GRUBが/bootからカーネルと初期RAMを読み込む
4. システム起動

といった感じでしょうか。
今回は1と2の情報をそれぞれ削除して、システム起動時にどのような問題がおこるのかを確認してみたいと思います。
実際のシステムトラブルが発生した時に何が原因なのか探る足がかりになるかもしれません。

実験

それではMBRを削除していきます。
まずMBR削除実験用の「delete-mbr-test」というVMを起動して以下をやっていきます。

(吹き飛ばす)
[root@delete-mbr-test ~]# dd if=/dev/zero of=/dev/sda count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00407512 s, 126 kB/s

(パーティションが見えなくなった)
[root@delete-mbr-test ~]# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


(リブートして様子をみる)
[root@delete-mbr-test ~]# reboot
~~snip~~
[ 1183.014496] systemd-shutdown[1]: Returning to initrd...
[ 1183.090572] dracut Warning: Killing all remaining processes
dracut Warning: Killing all remaining processes
[ 1183.182562] XFS (dm-0): Unmounting Filesystem
[ 1183.203941] dracut Warning: Unmounted /oldroot.
[ 1183.252533] dracut: Disassembling device-mapper devices
Rebooting.
[ 1183.273802] Unregister pv shared memory for cpu 0
[ 1183.275741] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[ 1183.281860] Restarting system.
[ 1183.283429] reboot: machine restart

ここで固まった。ここでdestroyする

(起動してみる)
[root@ホストサーバ]# virsh destroy delete-mbr-test
[root@ホストサーバ]# virsh start delete-mbr-test --console
ドメイン delete-mbr-test が起動されました
ドメイン delete-mbr-test に接続しました
エスケープ文字は ^] です

ここで固まった。

virsh consoleでは出力の確認が取れませんでした。そもそもVMが正常に起動ができてないから出力できないぽい。この辺のシリアル接続の流れはよくわかってないのでそのうち調べてまとめを書こうかなと思います。
続いてVNC接続で出力を確認します。

VNC接続してみると、「No bootable device.」と表示されています。
BIOSがMBRをうまく読み込めず、このHDDからはブートできないっていってる模様。

[root@ホストサーバ ~]# virsh dumpxml delete-mbr-test | grep vnc
type='vnc' port='5900' autoport='yes' listen='127.0.0.1' keymap='ja'

続いて、GRUBを削除した場合のシステムの動作を確認していきます。GRUB削除実験用の「delete-grub-test」というVMを起動して以下をやっていきます。さっきの「delete-mbr-test」は停止させときます。

(grubを消し去る)
[root@delete-grub-test ~]# dd if=/dev/zero of=/dev/sda seek=1 count=2047
2047+0 records in
2047+0 records out
1048064 bytes (1.0 MB) copied, 0.0456633 s, 23.0 MB/s

(パーティションを確認します)
※MBRが残ってるのでその中にあるパーティションテーブルは見えてる。
[root@delete-grub-test ~]# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c8cee

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    41943039    19921920   8e  Linux LVM

(リブート)
※mbrと同じ位置で固まった
[root@delete-grub-test ~]# reboot
dracut Warning: Killing all remaining processes
[  914.846163] XFS (dm-0): Unmounting Filesystem
[  914.869616] dracut Warning: Unmounted /oldroot.
[  914.898541] dracut: Disassembling device-mapper devices
Rebooting.
[  914.916213] Unregister pv shared memory for cpu 0
[  914.917830] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[  914.923018] Restarting system.
[  914.923965] reboot: machine restart

ここで固まった。ここでdestroyする

[root@ホストサーバ]# virsh destroy delete-grub-test
[root@ホストサーバ]# virsh start delete-grub-test --console
ドメイン delete-grub-test が起動されました
ドメイン delete-grub-test に接続しました
エスケープ文字は ^] です

ここで固まった。

続いてVNC接続で出力を確認します。
先ほどと同じ手順でVNCポートを確認してください。

VNC接続してみると、先ほどとは異なるメッセージで「Booting from Hard Disk…」と表示されています。
BIOSがMBRを読み込んで、次にGRUBを読み込もうとして止まってるぽいです。または、ブートシーケンスの3のカーネル/初期RAMのいずれかが破損している場合も同様のメッセージが出力されるかもしれません。とりあえず、今回は意図的にGRUBを削除しているので2で止まっていることは確かなはずです。

以上で実験は終了です。
これで、ブートシーケンスのどこでこけてるのかを出力メッセージの違いから判定することができるかなと思います。
今回は意図的にシステムをブートさせないようにしましたが、次はこの状態からの復旧方法をまとめたいと思います。また、MBRを今回丸ごと消しましたが、パーティションテーブルのみ消した場合、GPT形式のディスクの場合なども合わせて調べてみようと思います。
それではまた。