デュアルブートしていたらWindows更新後にLinuxが起動できなくなった話
元の状態
Windows / Arch Linux でデュアルブートしていました.パーティションは次のように分けていました.
- /dev/sda1 ― Windows/Linux 共用のブートパーティション. Windows が入っている状態で PC を買ったので Linux インストール以前から存在したが, FAT32 だったので*1ここに Linux のブートローダもインストールしていた. Linux 起動時は /boot にマウントされる.
- /dev/sda2 ― Windows の謎の予約パーティション.
- /dev/sda3 ― Windows の C: ドライブ.
- /dev/sda4 ― Linux の / .
- /dev/sda5 ― Linux の /home .
- /dev/sda6 ― Windows と Linux の共有パーティション. FAT32 でフォーマットしていて, Linux では /share , Windows では D: ドライブ.
- /dev/sda7 ― Windows の修復用パーティション.
このため,起動時に参照される /etc/fstab には
/dev/sda4 / ext4 rw,relatime 0 1 /dev/sda6 /home ext4 rw,relatime 0 2 /dev/sda1 /boot vfat rw,(省略) 0 2 /dev/sda7 /share vfat rw,umask=000 0 2
のように書いてありました(といってもほとんど genfstab が書いてくれたものだけれど).つまり, UUID や PARTUUID 等ではなくパーティション番号によってマウントするパーティションを指定していたわけです.
何が起こったか
Windows を起動したところ,更新が始まりました.いつもより長いなと思っていたのですが,この更新の後, Linux を起動すると
You are in emergency mode. After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reboot, "systemctl default" or "exit" to boot into default mode. Give root password for maintenance (or press Control-D to continue):
というメッセージが表示されて起動が止まるようになってしまいました.調べてみたところ, Windows の更新によって新しいパーティションが作られてしまったのが原因でした.もともと Windows の C: ドライブだった /dev/sda3 が 2 つに分かれ, /dev/sda3 と /dev/sda4 になってしまった*2せいで,それ以降のパーティション番号が全て 1 つずつズレてしまったのです.
対処法
上のメッセージが表示された段階でパスワードを入力すると,不完全ながらもコマンド入力によって指示を出すことができます.ここで /etc/fstab を開き, /dev/sda4 , /dev/sda5 , /dev/sda6 をそれぞれ /dev/sda5 , /dev/sda6 , /dev/sda7 に書き換えることで,この問題は解決します.(ちなみに vim は使えました)
ちなみにですが, fstab を UUID や PARTUUID で書いておけば,このような問題は発生しません.Arch Linux のインストールにおいては, genfstab で fstab を生成するときに -U オプションを付けておくことで UUID によってパーティションが指定されるようになります.