みなさんこんにちは。ヒロウミです。
「プロのための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形式のディスクの場合なども合わせて調べてみようと思います。
それではまた。