サブPCの CentOS が起動できなかった原因
我が家の自宅サーバーは CentOS 6 32bitを採用し運用しています。このサーバーとは別に手持ちのサブPC(自作機)にも同じバージョンの CentOSをインストールしてカーネルやプログラムパッケージのバージョンアップの際に動作確認用として使用しています。
サブPCで問題がなければサーバーの CentOSをバージョンアップするようにしています。前回は 2014年に 6.5 を 6.6 にバージョンアップしており、今回2年ぶりに 6.6 を 6.8 にバージョンアップしようと思い前回同様サブPCで動作確認することしました。
ところがいざ CentOSを起動しようとすると OS Not Found と表示され起動できなくなっていました。
サブPCには数種類の Linux ディストリビュージョンでマルチブートを構築しており、頻繁に OSをインストールしたり削除したりを繰り返しているのでそのせいで何かの拍子にブートローダーでも壊したのだろうと思い GRUBを再インストールすることにしました。
しかし GRUBを再インストールしても CentOSは起動しません。当ページではその原因を突き止め起動するまでを掲載しています(2016/12)
GRUB(Legacy)の再インストール
インストール前に確認したこと
サブPCには 4台のデバイス(HDDとSSD)を搭載しており、この内3台にそれぞれ異なる種類の LInux OSをインストールしています。まずはこれらのデバイスのどこに CentOSがインストールされているのか確認します。
その方法は同じサブPCにインストールいている Ubuntu上の GPartedを起動して CentOSをインストールしているデバイスとパーティションを確認します。
その結果 /dev/sdd1(第4HDDの第1パーティション)であることが確認出来ました。
なぜ GPartedを起動しただけで確認出来たのかというと、OSをインストールしている各パーティションにそれぞれ「centos」「ubuntu」など分かりやすいラベル名を設定しているからです。マルチブートにおいては必須です。
GRUBをインストールする場所
GRUBをインストールする場所は HDD(/dev/sdd)のマスターブートレコード(MBR)ではなく /dev/sdd1 のパーティションブートレコード(PBR)です。
これは 4台のデバイスの MBRには既にチェーンローダーとして MBM(Multiple Boot Manager)をインストールしており、マルチブートローダーにGRUBを使っていないからです。詳しくは こちらのページ を参照ください。
つまり今回の場合にあてはめてみると、BIOSが MBMに制御を渡し MBMが /dev/sdd1 の PBRにインストールしている GRUBを呼び出し、その GRUBが CentOSを起動するという流れになります。
これは OSが Ubuntuでも Windowsでも同じプロセスで起動します。ただしこれが出来るのはマザーボードのファームウェアが「Legacy BIOS」である必要があります。
その理由は MBMが UEFIをサポートしていないからです。もしも UEFIで同様のことをやろうとするならば MBMに代わるチェーンローダーが必要です。
インストールの前に用意するもの
次に、当時インストールに使用した CentOS 6.5のISOイメージで作成した2枚組のDVDを引っぱり出して1枚目をODD(光学ドライブ)にセットしパソコンを再起動します。使用するのはこの1枚だけです。
ISOイメージ|CentOS-6.5-i386-bin-DVD1.iso
BIOSのプライオリティ(起動デバイスの順位)1位がODDならば GRUBのオプションメニューが表示されます(fig7)
DVDから起動できない時はプライオリティを1位に設定しなおすか BIOS起動メニュー(F8,F12などマザーボードベンダーによって異なる)からDVDを選択する
インストールの方法
GRUBメニューが表示されたら上から3つ目の Rescue installed system を選択します(fig7)この後の言語は全て英語になります。
下の画像(全11枚組)はGRUBインストール手順のスクリーンショットです
1. Choose a Language | English [ OK ] |
---|---|
2. Keyboard Type | jp106 [ OK ] |
3. Rescue | [ Continue ] |
4. Rescue | [ OK ] |
5. Setup Networking | [ NO ] |
6. Rescue | [ OK ] |
7. shell Start shell | [ OK ] |
ここで次のコマンドを入力する(fig8)
# chroot /mnt/sysimage # grub-install /dev/sdd1
Installation finished. No errer reprted. のメッセージが表示(fig9)されればインストール成功です。
下の画像(fig7,8,9)は説明用に VirtualBox上で動作させた時のスクリーンショットです。なのでインストール先デバイスが /dev/sdaとなっていますが現実には /dev/sdd1にインストールしました。
そしてパソコンを再起動します。
# reboot
これで CentOSが起動できま...せん。おかしいですね。
CentOSが起動しなかったわけ
GRUB再インストール後パソコン再起動するとカーネルバージョンが表示されカウントダウンがはじまり、しかし OS Not Foundで起動せず。
それではとサブPCの Ubuntuを起動し、まずGPartedで CentOSのパーティションを確認(fig10)続けて menu.listの記述を確認(fig11)してみると
- GParted|/dev/sdd1・・・第4HDDの第1パーティション
- menu.list| root(hd3,0)・・・第4HDDの第1パーティション
合っているので起動するはずなのですが。困ったなと思いつつ何気なくチェーンローダに使っている MBM(Multiple Boot Manager)のOS選択画面を眺めていたら
!なんとBIOSが認識しているHDDの順番と GParted、 menu.listつまりOSが認識しているHDDの順番がズレているのに気がついた。BIOSが認識しているのは第3HDDの第1パーティション、即ち(hd2,0)であることに(fig12)
そうゆうことなら話は簡単。マザーボードに挿しているSATAケーブルを入替えてやるか menu.listの記述を(hd2,0)に書き換えればよいのです。今回は後者を選択しました。
その方法は、まず CentOSのパーティションを GNOME Files(旧名 Nautilus)で Ubuntuのファイルシステムにマウントしておきます。次にroot権限で起動したGeditで /boot/grub/menu.listを開きワード置換機能を使い一括変換、ものの数秒で完了しました。
そしてパソコン再起動し CentOSを起動することが出来ました。結果的に GRUBを再インストールする必要はなかったというわけですね。
補足|GRUBにおけるHDDとパーティションの呼称について
近年ほとんどの Linuxディストリビュージョンで使用されているブートローダーは GRUB Legacy(CentOS 6以前)と GRUB2(CentOS 7,Ubuntuなど)です。
そこで、それぞれのHDDとパーティションの呼称を表にまとめてみました。
HDD(Heard Disk Drive)
HDD | GRUB Legacy 呼称 | GRUB2 呼称 |
---|---|---|
第 1 HDD | hd0 | sda |
第 2 HDD | hd1 | sdb |
第 3 HDD | hd2 | sdc |
第 4 HDD | hd3 | sdd |
第1HDDのパーティション(Partition of the first HDD)
パーティション | GRUB Legacy 呼称 | GRUB2 呼称 |
---|---|---|
第 1 パーティション | 0 | 1 |
第 2 パーティション | 1 | 2 |
第 3 パーティション | 2 | 3 |
第 4 パーティション | 3 | 4 |
使用例(Usage examples)
HDD , パーティション | GRUB Legacy 呼称 | GRUB2 呼称 |
---|---|---|
第 1 HDD , 第 1 パーティション | hd0,0 | sda1 |
第 1 HDD , 第 2 パーティション | hd0,1 | sda2 |
第 2 HDD , 第 1 パーティション | hd1,0 | sdb1 |
第 3 HDD , 第 3 パーティション | hd2,2 | sdc3 |
こうして並べてみると GRUB Legacyは表にまとめてみてもなかなか分かりづらいですね。さらに詳しいことは「hdd命名規則」でGoogle検索などしてみてください。