MBR環境のUBUNTUをUEFIでブートするメモ

サーバーのリプレースをすべく、QNAPのケースを改造して組み換えを行いました。

その後、いざHDDを付け替えて起動というところで、ブートデバイスとして認識してくれないことがわかりました。

嫌な予感がして前環境のBIOSの設定を確認してみると、ブートは「UEFI+レガシー」となっています。

いわゆる従来のBIOSと近年のUEFI両方でのブートに対応するモードです。

試しに「UEFIオンリー」に変更してみると、従来の環境でも起動してくれません。

つまり、私はこのサーバーをBIOS環境で構築していたということです。

しかしながらマザーボード(AsRockJ4105-ITX)はUEFIブートしかサポートしていないそう。

何も考えずに購入してしまったため、UBUNTU側を対応させる必要が出てきてしまいました。

既存の環境をBIOSブートからUEFIブートに変更しているよい例が出てこず、手探りでなんとか移行に成功したので、メモに残しておきたいと思います。

UEFIはESPパーティションにあるブートローダーを読みにいくような仕組みになっているようです。

今回の手順では、まずHDDのMBRからGPTへの変換作業を行い、ESPパーティションを作成、GRUBを書き込みます。

UBUNTUのバージョンは14.04.1LTSです。

 

まず、前準備としてefibootmgrというパッケージをインストールしておきましょう。

私の環境にはこれが入っておらず、grubinstallコマンドに失敗してしまいました。

既存の環境でブートできるうちにこれをやっておかないと、パッケージをダウンロードしてきて手動でインストールする羽目になります。

既存のmbr環境で起動した状態で

sudo apt-get install efibootmgr

 

ここからは新環境に移行するHDDを接続し、ライブCDで作業を行います。

uefiでusbライブ環境を起動し
gparted(gui)で後ろ256MBを切ってフラグboot,espにしておく

その後、作成したパーティションをvfatでフォーマットします。
sudo /sbin/mkfs.vfat -F32 /dev/sdb4

 

ターミナルを開き、gdiskでmbr→gpt変換を行います。

※データが吹き飛ぶ可能性があります。必ずバックアップを取ってから行いましょう。
sudo gdisk
/dev/sda
r(revovery and transformation options)
f(load MBR and build GPT)
y(yes)
w(write)
y(yes)

 

では、UEFI用のgrubを入れ直して行きましょう。

rootの入っているパーティションをマウントして作業します。

また、先程作成したESPパーティションを/boot/efiにマウントします。

sudo apt-get install grub-efi
sudo mount /dev/sda2 /mnt
sudo mkdir -p /mnt/boot/efi
sudo mount /dev/sda4 /mnt/boot/efi
sudo mount –bind /dev /mnt/dev
sudo mount –bind /proc /mnt/proc
sudo mount –bind /sys /mnt/sys
sudo chroot /mnt

/usr/sbin/grub-install –target=x86_64-efi –efi-directory=/boot/efi /dev/sda

再起動

 

シェルが出るorGRUBメニューが出るが起動しない状態になると思うのですが、慌てずに手動でブートしましょう。
メニューでeを押すとエディタが起動し、Ctrl+Cでシェルへ入れます。
ls
HDD一覧がでたら、片っ端からset rootして/bootがあるパーティションを探しましょう。
set root=(hd0,gpt2)
ls /
これで/bootがあったら、カーネルの場所を伝える

rootの場所も必ず明記します。
linux /boot/vmlinuz-x.xx.x-xx-generic root=/dev/sda2
initrd /boot/initrd.img-x.xx.x-xx-generic
boot

 

これでブートできるはずなので、正しい設定を行います。
sudo mount /dev/sda4 /boot/efi
/usr/sbin/grub-install –target=x86_64-efi –efi-directory=/boot/efi /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

これでUEFIからブート可能となりました。

 

おまけ

ブート後、mysqlが吹っ飛んだことが判明したのでリカバリ

設定ファイルを書き換えてリカバリモードで起動します。

1から順に数値を上げてmysqlを再起動してみてください。起動できた時点でバックアップを取り、再構築を行います。

最大5なのですが、4以上はデータが欠落する可能性があるそうです。

sudo vi /etc/mysql/my.cnf
[mysqld]
innodb_force_recovery = 3

 

起動したら全てのDBをバックアップします。

mysqldump -u root -p -x –all-databases > alldatabase.dump

mysqlを停止し、mysqlで始まるDB以外をすべて削除します。
sudo service mysql stop
su
sudo rm -rf `ls -d /var/lib/mysql/* | grep -v “/var/lib/mysql/mysql”`

リカバリ設定をもとに戻して起動し、バックアップから復元して問題なく動けば完了です。

sudo vi /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 0

sudo service mysql start
mysql -u root -p < alldatabase.dump

 

 

反省点
・efibootmgrを入れておく必要があることを知らなかったため、すでに既存のブート設定を潰してしまった。
更にchroot環境でapt-getができなかったので、パッケージを落としてdpkgしたらどうにかなった
・わけも分からず/bootを消してしまった。
当たり前だがカーネルが入っているのでuefiだろうが絶対消してはいけません。
以前取得していたバックアップイメージをマウントして対応した。
なお、gpt変換後はmbrパーティションが触れなくなった(ぶっ壊した?)ので、ルートの/bootにコピーした。
sudo mount -t ext2 -o loop,offset=65536 boot.img /mnt-boot
sudo cp -r /mnt-boot/* /mnt/boot


Tweet about this on Twitter0Share on Facebook0Share on Google+0

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)