読者です 読者をやめる 読者になる 読者になる

おはよう君需要なし

求不得苦な日々

EFIのパーティションが破損して起動しなくなったUbuntuを直した

プログラミング

はじめに

長らくろくにメンテナンスをしないで使用していたパソコンが急に機能不全に陥り再起動できなくなりました。今回はEFIパーティションが破損し、BIOS(UEFI)のブートディスク一覧に出てこず、ブートできない問題を解決してみましたので、その方法をメモとして残しておきます。

というわけで

症状

  • EFI Shellでハードディスクが一覧に出てこない
  • USBブートのUbuntuからではハードディスクの内容を確認できる

などの症状から、

HDDが物理的に破損して認識されなくなったのではなく、
ファイルシステムなどソフト的な破損でブートディスクとして認識されなくなった

のではないか、と考えました。じゃあ再認識されるようにするにはどうすりゃいいんじゃ?!ってなったので 手順をメモしておきます。

EFIパーティションとは

EFI システムパーティション - ArchWiki では、

EFI System Partition (ESP や EFISYS とも呼ばれます) は FAT32 でフォーマットされた物理パーティションで
ここから UEFI ファームウェアは UEFI ブートローダやアプリケーションを起動します。
OS とは独立したパーティションであり、UEFI ブートには必須のパーティションになります。

とされています。今回はこのEFI System Partition (ESP)が破損したのではないかという仮説を元に修復を試みました。

出ていたエラー

直接関係あるかはわかりませんが、fsck.vfat -V /dev/sda1とESPのベリファイを行ってみたところ、

Filesystem has XXX clusters but only space for YYY FAT entries.

というエラーが出ていました。

修復手順

というわけで備忘録的に手順を書いていきます。なお、この手順は Ubuntu 14.04のLiveUSBを使用してUEFIで起動しています。 レガシーなBIOS起動ではないので注意(BIOS起動からではEFIをいじることはできません。)

EFIパーティションの作り直し

GParted (パーティショニングツール)を使って、元々あった場所にパーティションを作ります。

ファイルシステムFAT32、フラグはbootを指定します。

以前の環境にchrootする

よくブート環境をぶち壊してしまう自分にとってはもう慣れっこなんですが、ブートローダーを再構築するために 以下の手順で以前の環境にchrootします。

$ sudo -s
# mkdir /chroot
# mount /dev/sda2 /chroot
# mount --bind /dev /chroot/dev
# mount --bind /dev/pts /chroot/dev/pts
# mount --bind /proc /chroot/proc
# mount --bind /sys /chroot/sys
# mount --bind /run /chroot/run
# chroot /chroot

で、chrootしたら先ほど作成したEFIパーティションをマウントします。

# mount /dev/sda1 /boot/efi

grubのインストール

空のEFIパーティションにブートプログラムであるところのgrubをインストール

# grub-install --efi-directory=/boot/efi
# update-grub

このコマンドをすることで/boot/efi/EFI/ubuntu/shimx64.efiなどというファイルができていると思います。

fstabの更新

ここで気持ちを逸らせて再起動すると泣きをみます。(みました。しかもブートに1分近くかかるマシンなのですごくつらかった!)

今回はパーティションを新たに作っているので、/etc/fstabに記述してある/boot/efiにマウントされるパーティションのUUIDを更新してやる必要がありました。

# vim /etc/fstab

として、以前のUUIDが書き込まれている部分に

# blkid /dev/sda1

で得られるUUIDを書いておきましょう。

ちなみに

fstabを更新せずに再起動をかけてしまうと、grubで起動OS選択画面まで出て「おおっ?!」ってなるんですが以下のような表示で停止してしまいます。

Loading initial ramdisk

カーネルか?!もしかしてカーネルが壊れたのか?!?!なんて思ってしまいましたが、蓋を開ければなんてことないミスが原因でした。

終わりに

今までGPTってよくわからなくてMBRばっかり使用していたんですが、今回はGPTなEFIをいじってみました。efibootmgrなど触ってみると案外面白そうだなという感触を得ました。

今回はパーティションを再構成することで解決しましたが、ファイルシステムが自然に破損するなんてことはあり得ない気がしますので、本来であればとっとと新しいディスクに換装すべきですね。