デュアルブートで起動不能
@MINOのノートはLinuxとWindowsのデュアルブートにしています。
そのせいでwindows10アップデートのよってLinux、windowsともに起動不能になりました。
状況の整理
当初@MINOのハードディスクは全部で7つのパーティションが存在していました。
Device Start End Sectors Size Type
/dev/sda1 2048 616447 614400 300M Windows recovery environment
/dev/sda2 616448 821247 204800 100M EFI System
/dev/sda3 821248 1083391 262144 128M Microsoft reserved
/dev/sda4 1083392 309612543 308529152 147.1G Microsoft basic data
/dev/sda5 310534144 701159423 390625280 186.3G Linux filesystem
/dev/sda6 701159424 712878079 11718656 5.6G Linux swap
/dev/sda7 712880128 1103505127 390625000 186.3G Microsoft basic data
このノートパソコンのHDDの容量は750GB。windowsプリインストール機でリカバリディスク無しでした。UEFI/GPTフォーマットです。
工場出荷時にリカバリ用のパーティションがあり、システム(windows)用のパーティーション、データのパーティーションに分かれていました。
Linux導入時にデュアルブートにするべく空き容量を更にパーティーション分けしています。パーティーションの順番がいまいち整理されていないのは、デュアルブートシステム構築時にいろいろトラブルがありつつ作業を進めた結果です。
Linuxはsda5
、windowsはsda4
に入っています。
ブートローダはgrub2を使用しています。
一応この構成でデュアルブート機として問題なく動いていたのですが、先日@MINOにもwindows10アップデートの時限タイマーが発動しやがりました。
windows10の半強制アップデートの恐怖
あんまり10のアップデートのことを気にしていなかったので、「8時間後にアップデートします」的なメッセージを見逃していました。
運が悪いことに用事があり、windowsを立ち上げたまま放置してしまったのです。
用事から返ってくると、ノートが再起動してLinuxが立ち上がっていました。@MINOのgrubの設定では再起動後10秒経つと自動的にLinuxが立ち上がるようになっています。
やべえwindows10アップデートはじまっちゃったぽい…
まだ先延ばしにするつもり(なんならアップデートしないつもり)だったのですが、始まったものはしょうがないと思い、windows10アップデートを受け入れることにしたのです。
windows10アップデートは何段階かに分かれていて数回再起動がされるようです。
無慈悲なgrub rescue
そして最初の再起動の時、事態は発生しました。
error: no such partition.
grub rescue>
あえ?grub rescue
画面になっちゃたぞ?どうしたんだ?
grub rescue
はブートローダが何らかの理由でOSを立ち上げる(準備する)ことができなかった場合に現れる無慈悲な画面です。
ブートローダ系のトラブルはそれほど体験していないので知識が浅く、どう対処していいかこの時点ではわかりませんでした。
パーティションを確認する
とりあえずggrkということでいろいろ調べたところ、まずは落ち着いてパーティション・ファイルシステムを確認しろとのことでした。
まずls
コマンドで構成を確認します。@MINOの場合トラブル直後は以下のような出力がありました。
grub rescue> ls
(hd0) (hd0, gpt8) (hd0, gpt7) (hd0, gpt6) (hd0, gpt5) (hd0, gpt4) (hd0, gpt3) (hd0, gpt2) (hd0, gpt1)
Linuxはsda5
つまり(hd0, gpt5)
に入っているはずです。とりあえずLinuxでも起動できればいいのですが…。
grub rescue> ls (hd0, gpt5)/
error : unkown filesystem
あれ?ファイルシステムがunkownになっているぞ?
ファイルシステムが壊れたのか?
もしHDDが物理的損傷を受けたりしているとどうしようもありませんが、おそらく今回はwindows10アップデートに端を発する不具合のはずで物理的な損傷ではないだろうと踏んでいました。
論理的損傷であれば復旧はできる可能性が高いかもしれない…。
ブート用USBメモリを用意して更に詳しく情報を得る
しかしこの知識不足の段階でいろいろいじり回すのはまずかろうと思い、まずは情報収集に努めてみることにしました。
HDDの中身を見たりするにはLinuxを何らかの方法で立ち上げる必要がありますので、この時点で別PCにてUSBメモリにubuntuをインストール、復旧用USBとしてノートを起動することができるようにしました。
USBからたちあげたubuntuでHDDを確認してみると、ディレクトリやファイルは普通に存在しており、アクセスも可能です。どうやらデータが失われた訳ではなさそうなので、少し安堵しました。
マウントできておりファイルも見えているとなるとファイルシステムも問題ないように思えます。
コマンドからも確認します。
sudo parted -l
この時ある異変に気が付きました。
windows10アップデートではどうやらパーティションを作るらしい
パーティーション7個だったはずなのに8個あるぞ?
Device Start End Sectors Size Type
/dev/sda1 2048 616447 614400 300M Windows recovery environment
/dev/sda2 616448 821247 204800 100M EFI System
/dev/sda3 821248 1083391 262144 128M Microsoft reserved
/dev/sda4 1083392 309612543 308529152 147.1G Microsoft basic data
/dev/sda5 309612544 310534143 921600 450M Windows recovery environment
/dev/sda6 310534144 701159423 390625280 186.3G Linux filesystem
/dev/sda7 701159424 712878079 11718656 5.6G Linux swap
/dev/sda8 712880128 1103505127 390625000 186.3G Microsoft basic data
ああ!!sda5
がWindows recovery environment
になっている!!
今まではLInuxがsda5
だったはずです…。
どうやらwindows10のアップデートではリカバリ領域を作るようです。当たり前といえば当たり前かもしれないけど。
今回の運の悪いところは、Linuxをwindowsの後ろのパーティーションに入れていたこと。
windows10のアップデートはwindowsが入っているパーティーションの直後にリカバリパーティーションをつくるようなので、windowsパーティーションより後ろのパーティーションは順番がずれることになります。
順番がずれればgrubもパーティションを探すことができなくなる道理で。
復旧作業
事前の情報収集からsda6
にlinuxが入っていることがわかったので、またgrub rescue
に戻り、sda6
の中身を見ます。
grub rescue> ls (hd0, sda6)/
コマンドの出力結果の中に/boot
があるかと思います。その中身にgrubのモジュールがあるのですが、そのモジュールを念の為確認します。
/boot
内のディレクトリ構成はシステムによって異なる可能性がありますが、.mod
という拡張子のファイルが大量に存在するディレクトリがあるかと思います。
@MINOの環境では以下のパスにモジュールが入っていました。
grub rescue> ls (hd0, sda6)/boot/grub/x86_64-efi
その中に
normal.mod
があるのを確認します。
このnormal.mod
はgrubのノーマルシェルを立ち上げるモジュールです。このモジュールを立ち上げられるとLinux、windowsを起動できる可能性が高いです。
normal.mod
を読み込みには以下のようにします。@MINOの環境での例です。各位の環境に読み替えてください。
grub rescue> set prefix=(hd0,sda6)/boot/grub
grub rescue> insmod (hd0,sda6)/boot/grub/x86_64-efi/normal.mod
grub rescue> normal
このコマンドでgrubのノーマルシェルが起動するはずです。多くの場合はOS選択画面が起動されるかと思います。
この状態で電源を切るとこのコマンドをまた打たないといけなくなります。
なので起動出来ている間にgrubを修正します。
立ち上げたLinuxで(usbブートではなく復旧した方のLinux)以下のコマンドを実行します。(デバイス名は@MINOの場合のものです)
sudo grub-install /dev/sda/
これで次回の起動からはまたgrubノーマルシェルでの起動になります。
補足・ハマったポイント
焦らない・慌てない
grub rescue> ls (目的のパーティション)/
でどうしてもunkownになる場合、ファイルシステムが壊れている可能性もあります。この場合、fsck
コマンドでファイルシステムを復旧できる可能性(ブートメディアから立ち上げたLinuxから行う)がありますが、データが飛ぶ可能性もあります。
もし存在するパーティションのすべてがunkown
になる場合は、ブートメディア等から立ち上げてストレージの状況やパーティション、ファイルシステムの調査をちゃんと行ったほうが良いかと思います。
焦って不可逆的な操作をして取り返しがつかないことになりかねません。
ストレージが物理的に逝っていない限り、データを救える可能性は高いですので焦らず対処しましょう。
grubの頼れる日本語情報
grubは@MINOのような初心者には難しい領域です。あまり日本語の情報が無いのもそれに拍車をかけている気がします。
@MINOが頼っている日本語情報の1つにArchLinuxのwikiがあります。膨大な量の情報があるwikiですがgrubについても詳しく書かれています。ちょっと理解するのはむずかしいですが…。
grubに触るならオススメです。
GRUB https://wiki.archlinuxjp.org/index.php/GRUB
まとめ
- windows10のアップデートはパーティションを新設する
- そのパーティションはwindowsシステムパーティションの真後ろにできる
- そのためその以降のパーティションはズレる
- マルチ・デュアルブートをしている場合に不具合になる可能性がある
- 復旧は落ち着いて