fstab挂载失败导致Linux无法启动

小主机突然无法启动

就在今天,我放在家的小主机突然无法访问挂载的硬盘了,可能是接口松动的原因,我没有在意,重启一下就可以了
然而这是我犯的一个大错误,硬盘之所以无法成功挂载肯定是有它的原因的,又因为我把自动挂载写进了 /etc/fstab 文件中
于是。。。
小主机就无法启动了

问题原因

Linux 在启动时会挂载 /etc/fstab 中的硬盘,如果因为写入错误或者其他什么原因导致挂载失败,那么系统启动时就会出现异常,导致启动失败
正是因为这个原因,我那个可能是线松动了的硬盘盒无法正确挂载到我的小主机上,导致了我的小主机启动失败,让我这个不在小主机身边的人与它失联了

解决方案

有两种解决方案,本打算使用方案一的,但方案二更安全,所以进而换成了方案二

解决方案一

这个方法很简单,修改 /etc/fstab 文件,正确配置需要挂载的文件系统即可
但是我本身配置就没问题,所以不是配置错误的原因
我是因为外部设备由于各种各样的原因无法被访问导致无法挂载,在正常情况下是没问题的
为了解决这种情况,我查阅了 Arch Linux 的 wiki,看到这样一句话
除非使用 nofail 选项,否则在列表中出现但实际不存在的设备会导致错误
/etc/fstab 中添加 nofail 选项就可以了

1
设备UUID    /disk   ext4    nofail,x-systemd.device-timeout=1ms 0   0
  • nofail 可以在启动时若设备不存在直接忽略它而不报错
  • x-systemd.device-timeout=1s 设置超时时间,以防止网络资源不能访问的时候浪费时间

解决方案二

使用 systemd 开机挂载硬盘
由于我的硬盘是外接设备,不是直接连在主板上的,所以连接并不稳定,这就降低了系统的容错率
而当自动挂载硬盘的工作交给 systemd的话,系统启动就不会受到干扰,提高了系统的容错率

/etc/systemd/system 创建挂载单元
注意:挂载单元必须以它控制的挂载目录命名,且以.mount结尾,比如挂载点为 /home/lennart,那么它的挂载单元必须为home-lennart.mount

编辑单元文件

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Mount disk

[Mount]
What=/dev/disk/by-uuid/设备UUID
Where=/disk
Type=ext4
Options=rw,noatime

[Install]
WantedBy=multi-user.target
  • What 设备的绝对路径,注意 /dev/disk/by-uuid 是一个实际存在的目录,不要把他删了只留个UUID在那,会启动失败的 (ఠ్ఠ ˓̭ ఠ్ఠ)
  • Where 挂载点
  • Type 文件类型
  • Options 可选项
    • rw 读写
    • noatime 完全禁用每次读取文件时将文件访问时间写入驱动器

配置完成后,运行如下命令使配置生效

1
2
systemctl daemon-reload
systemctl enable 挂载单元.mount --now

突然的无法连接,原来并不是真正的突如其来,是早就有“预谋”的
由于我的不正确的配置,导致了今天我的小主机无法应对突发情况,这都是我在家中没有配置好的我的小主机的错
以后肯定不能再犯这样的错误了 ᘳᗒ.ᗕᘰ