デュアルブートしていたらWindows更新後にLinuxが起動できなくなった話

元の状態

Windows / Arch Linuxデュアルブートしていました.パーティションは次のように分けていました.

  1. /dev/sda1 ― Windows/Linux 共用のブートパーティションWindows が入っている状態で PC を買ったので Linux インストール以前から存在したが, FAT32 だったので*1ここに Linuxブートローダもインストールしていた. Linux 起動時は /boot にマウントされる.
  2. /dev/sda2 ― Windows の謎の予約パーティション
  3. /dev/sda3 ― Windows の C: ドライブ.
  4. /dev/sda4 ― Linux の / .
  5. /dev/sda5 ― Linux の /home .
  6. /dev/sda6 ― WindowsLinux の共有パーティションFAT32 でフォーマットしていて, Linux では /share , Windows では D: ドライブ.
  7. /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 によってパーティションが指定されるようになります.

*1:たしか UEFIFAT32 を要請している

*2:OEMパーティションとかいうよく分からないやつ……修復に使われるそうです