记一次Linux因硬盘设备编号错位挂载失败引起启动失败的解决过程

问题描述

周末办公楼电力系统维护停电3小时,服务器关机,电力恢复后服务器启动失败,现象是启动报错,提示让输入密码进入紧急模式。
看到主要的错误描述是:
CIFS VFS: ioctl error in smb2_get_dfs_refer rc=-5
怀疑和mount有关。
输入密码进入紧急模式,输入命令

1
mount -a

即根据配置文件/etc/fstab进行挂载(正常启动时也是根据此文件进行挂载)
其中/etc/fstab的内容如下

1
2
3
4
……省略若干
/dev/md126p1 /data ext4 defaults 0 0
/dev/sdd1 /data2 ext4 defaults 0 0
……省略若干

执行后看到了具体的挂载错误条目是找不到设备 /dev/sdd1
使用命令

1
fdisk -l

可以看到存在/dev/sdd和/dev/sdd1

1
2
3
4
5
6
7
8
9
Disk /dev/sdd: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 737D5D12-456A-414A-86DC-0F8279EDA29B

Device Start End Sectors Size Type
/dev/sdd1 2048 4294969343 4294967296 2T Linux filesystem

使用命令

1
lsblk

列出块设备信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop0 7:0 0 99.4M 1 loop /snap/core/11993
loop1 7:1 0 99.5M 1 loop /snap/core/11798
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 512M 0 part
└─sda2 8:2 0 931G 0 part
sdb 8:16 0 1.8T 0 disk
├─sdb1 8:17 0 512M 0 part /boot/efi
└─sdb2 8:18 0 1.8T 0 part /
sdc 8:32 0 1.8T 0 disk
└─sdc1 8:33 0 1.8T 0 part /data2
sdd 8:48 0 3.7T 0 disk
└─md126 9:126 0 3.7T 0 raid0
└─md126p1 259:0 0 2T 0 md /data
sr0 11:0 1 1024M 0 rom

发现sdd下面是md126 md126p1,想起来有一块盘做成了raid0,挂载时不能按照sda、sdb、sdc的命名方式挂载,需要用/dev/md126p1,但这不是问题,因为fstab文件中确实使用了/dev/md126p1,但不应该挂载/dev/sdd1了啊,其实是这次重启之后原来的sdd1变成了现在的sdc1,可能因为上次的磁盘是热插入的,重启之后根据插入口的顺序重新分配了设备名,把fstab文件中的sdd1改成sdc1,重新mount -a成功,进入/data2查看文件,确实是之前sdd1上的。

重启会重新分配设备名导致挂载失败的问题,根据linux下磁盘sda,Linux下磁盘设备文件(sda,sdb,sdc….)变化问题_林声飘扬的博客-CSDN博客这篇博文的说法,目前没有办法直接解决,但是可以通过指定id和uuid的方式挂载而不使用sda、sdb这种名称来绕过这个问题

使用

1
2
ls -la /dev/disk/by-id
ls -la /dev/disk/by-uuid

可以看到这些id和uuid就是指向sda、sdb之类的软连接,而id和uuid每次启动是固定的,那么这些软连接应该是在启动过程中生成的。
最后保险起见,我将fstab文件中的挂载设备改成了id表示

1
2
# /dev/sdc1       /data2        ext4    defaults 0      0
/dev/disk/by-id/ata-ST2000NM0055-1V4104_ZC20W9TN-part1 /data2 ext4 defaults 0 0