windows升级导致的磁盘分区号混乱

背景

电脑装着双系统,windows+archlinux
升级windows11后,像正常windows大版本升级一样,大概要重启3次,
在第3次启动后,发现找不到引导分区了.
在解决grub问题后进入linux系统,发现无法进入桌面.
好在还能远程ssh进去,不然就要用启动盘了.

grub rescue

现象

error:unknown filesystem
并进入 grub rescue 提示符

操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 查看有哪些分区
ls
# 结果比如 (hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) 等等


## 依次查看能识别的文件系统
ls (hd0,gpt1)
# 错误信息比如 error: unknown filesystem
# 正确信息比如 ext2

## 继续查看grub.ctg配置文件位置(假设发现gpt7和gpt8都没有问题)
# 多尝试下
ls (hd0,gpt7)/boot/grub
ls (hd0,gpt8)/boot/grub
ls (hd0,gpt7)/grub
ls (hd0,gpt8)/grub
# 正确结果是文件目录,比如
# ./ ../ themes/ x84_64-efi fonts/ grubenv grub.ctg

## 选择正确的那个文件夹使用(以(hd0,gpt7)/boot/grub为例)
set root=(hd0,gpt7)/boot/grub
set prefix=(hd0,gpt7)/boot/grub
insmod normal
normal # 会重启并再次尝试引导

修复grub

此刻的系统可能是杂乱的

  1. 磁盘挂载错误
  2. 各种配置文件找不到

因此暂时以root用户执行操作,免得各处需要sudo

1
2
3
4
5
6
7
8
9
10
11
12
## 前置操作
os-prober # 检测其他系统
vim /etc/default/grub # 修改grub配置文件,要求调用os-prober发现其他系统

## 安装grub,猜测不一定要执行
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub

## 重新生成配置文件
grub-mkconfig -o /boot/grub/grub.cfg # 其他系统可能是为此建立了快捷方式: update-grub

## 重启
reboot

修复系统

  1. 查看挂载情况

    1
    df -h

    结果比如

    1
    2
    3
    4
    5
    6
    7
    8
    文件系统        容量  已用  可用 已用% 挂载点
    dev 7.8G 0 7.8G 0% /dev
    run 7.8G 1.6M 7.8G 1% /run
    /dev/nvme0n1p6 64G 48G 13G 80% /
    tmpfs 7.8G 395M 7.4G 5% /dev/shm
    tmpfs 7.8G 3.5M 7.8G 1% /tmp
    /dev/nvme0n1p2 95M 30M 66M 31% /boot/efi
    tmpfs 1.6G 76K 1.6G 1% /run/user/1000

    发现 /home 本来有对应的分区,但看不到了.
    猜测windows升级影响了磁盘分区号的识别顺序,因此而导致

    • efi分区找不到
    • linux系统上各种文件找不到

    好在linux坚强地生成了各种系统启动需要的文件,还能找到 /etc/default/grub 用来配置

  2. 查看磁盘情况

    1
    parted -l                       # 比fdisk -l显示得更好,有人性化的单位

    结果比如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    型号:Samsung SSD 970 EVO Plus 500GB (nvme)
    磁盘 /dev/nvme0n1:500GB
    扇区大小 (逻辑/物理):512B/512B
    分区表:gpt
    磁盘标志:

    编号 起始点 结束点 大小 文件系统 名称 标志
    1 1049kB 524MB 523MB ntfs Basic data partition 隐藏, 诊断
    2 524MB 628MB 104MB fat32 EFI system partition 启动, EFI 启动
    3 628MB 645MB 16.8MB Microsoft reserved partition msftres
    4 645MB 231GB 230GB ntfs Basic data partition msftdata
    5 231GB 232GB 649MB ntfs 隐藏, 诊断
    6 232GB 343GB 111GB ntfs Basic data partition msftdata
    7 343GB 413GB 69.8GB ext4
    8 413GB 500GB 87.5GB ext4

    发现编号7应该挂载到 /, 编号8应该挂载到 /home
    不确定最终的 /dev/nvme0n1p8 等名字,可以用 fdisk -l 再看一次

  3. 暂时解决
    稳妥起见,先用了解的 磁盘分区号 的方式修复 /etc/fstab

    1
    2
    /dev/nvme0n1p7       /           ext4        rw,relatime 0 1
    /dev/nvme0n1p8 /home ext4 rw,relatime 0 2

自我保护

无论是windows擅自更改了磁盘分区号,
还是windows只是影响了磁盘分区号的识别,
更重要的是不能让分区号的改变影响到Arch的挂载情况.
正好fstab支持以UUID的方式挂载.

查看uuid

1
2
3
ls -l /dev/disk/by-uuid/
# 或者在root权限下
blkid

修改fstab

1
2
3
4
- /dev/nvme0n1p7      /           ext4        rw,relatime 0 1
- /dev/nvme0n1p8 /home ext4 rw,relatime 0 1
+ UUID=xxxxxxxxxxxxxxx / ext4 rw,relatime 0 1
+ UUID=yyyyyyyyyyyyyyy /home ext4 rw,relatime 0 2

参考

  1. grub救援
  2. grub的配置
  3. fstab使用UUID的格式参考