记一次Linux因硬盘设备编号错位挂载失败引起启动失败的解决过程
问题描述
周末办公楼电力系统维护停电3小时,服务器关机,电力恢复后服务器启动失败,现象是启动报错,提示让输入密码进入紧急模式。
看到主要的错误描述是:
CIFS VFS: ioctl error in smb2_get_dfs_refer rc=-5
怀疑和mount有关。
输入密码进入紧急模式,输入命令
1 | mount -a |
即根据配置文件/etc/fstab进行挂载(正常启动时也是根据此文件进行挂载)
其中/etc/fstab的内容如下
1 | ……省略若干 |
执行后看到了具体的挂载错误条目是找不到设备 /dev/sdd1
使用命令
1 | fdisk -l |
可以看到存在/dev/sdd和/dev/sdd1
1 | Disk /dev/sdd: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors |
使用命令
1 | lsblk |
列出块设备信息
1 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT |
发现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 | ls -la /dev/disk/by-id |
可以看到这些id和uuid就是指向sda、sdb之类的软连接,而id和uuid每次启动是固定的,那么这些软连接应该是在启动过程中生成的。
最后保险起见,我将fstab文件中的挂载设备改成了id表示
1 | # /dev/sdc1 /data2 ext4 defaults 0 0 |