创建服务单元文件
在 /etc/systemd/system/ 目录下创建名为 check-fstab.service 的文件,内容如下:
[Unit]
Description=Check and restore fstab if necessary before it loads
Before=local-fs.target
Requires=local-fs-pre.target
After=local-fs-pre.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c '
FSTAB_BAK="/etc/fstab_bak"
FSTAB_ERR="/etc/fstab_err"
FSTAB="/etc/fstab"
# 检查备份文件是否存在
if [! -f "$FSTAB_BAK" ]; then
echo "没有找到正常的 fstab 备份文件 fstab_bak,无法进行恢复操作"
exit 1
fi
# 创建临时挂载目录
TMP_MOUNT_DIR="/tmp/fstab_mount_check"
mkdir -p $TMP_MOUNT_DIR
# 执行 mount -a 并检查返回值
mount -a > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "检测到 fstab 文件存在问题,mount -a 执行失败"
cp "$FSTAB" "$FSTAB_ERR"
cp "$FSTAB_BAK" "$FSTAB"
echo "已将备份的正常 fstab_bak 恢复为 fstab"
else
echo "fstab 文件检测通过,mount -a 执行成功"
fi
# 清理临时挂载目录
umount $TMP_MOUNT_DIR/* 2>/dev/null
rmdir $TMP_MOUNT_DIR
'
StandardOutput=journal
[Install]
WantedBy=local-fs-pre.target
重新加载 systemd
配置并启用服务
systemctl daemon-reload
systemctl enable check-fstab.service
脚本说明:
指定了该服务被 local-fs-pre.target 所需要,从而在开机启动时,按照 systemd 的依赖关系与启动顺序,确保该服务能在合适阶段启动,执行 fstab 的检测与恢复操作。
Type=oneshot:意味着这个服务仅执行一次任务,执行完毕即结束,契合开机时单次检测和恢复 fstab 的需求。
ExecStart:这里定义了实际要执行的脚本内容。首先检查 fstab 的备份文件 fstab_bak 是否存在,若不存在则直接退出并报错,因为后续恢复操作依赖该备份文件;接着创建临时挂载目录 /tmp/fstab_mount_check,用于后续模拟挂载操作;然后执行 mount -a 命令,并将标准输出和标准错误输出重定向到 /dev/null,避免过多信息在终端显示,同时检查命令返回值,若不为 0,说明 mount -a 执行失败,fstab 可能存在问题,此时将当前 fstab 文件备份为 fstab_err,再把 fstab_bak 恢复成 fstab,并输出相应提示;若 mount -a 执行成功,则输出提示信息表明 fstab 检测通过。最后,清理临时挂载目录,卸载其中的所有挂载(即便挂载失败也执行卸载,避免后续潜在问题),并删除该目录。此外,通过 StandardOutput=journal 设置,将服务执行过程中的输出信息记录到系统日志,方便后续查看与排查故障。
Description:简要描述了该服务的功能,即在 fstab 加载前进行必要的检查和恢复操作。
Before:指定此服务需在 local-fs.target(该目标与本地文件系统挂载紧密相关,也就是 fstab 相关挂载操作所在阶段)之前执行,确保能赶在 fstab 正式加载前完成检测与恢复。
Requires 和 After:表明这个服务依赖于 local-fs-pre.target,并且在其之后启动,这是依据 systemd 启动流程来合理安排服务顺序的设置,保证服务在合适的时机运行。
[Unit] 部分:
[Service] 部分:
[Install] 部分:
注意事项:
不同 Linux 发行版下 systemd 的配置与行为细节可能略有差异,上述方案需要依据实际使用的系统进行适当调试与优化,确保服务能精准在 fstab 加载前完成检测与恢复,保障系统顺利开机。
在实际挂载检测环节,虽然通过 mount -a 的返回值判断 fstab 是否正常,但实际情况中,mount -a 返回错误的原因可能多种多样,如设备未就绪、文件系统损坏等。若需要进一步精确定位问题,可在脚本中适当保留错误信息输出(去除 > /dev/null 2>&1 部分),以便根据具体错误提示深入排查故障根源。
对 systemd 相关配置进行修改操作时,建议提前备份重要的系统配置文件等数据,以防出现意外致使系统无法正常启动。
fstab配置格式语法
UUID=1234-5678 /mnt/mydisk ext4 defaults,noatime 0 2
<UUID>
或 <设备文件路径>
:这是你想要挂载的设备唯一标识符(推荐)或者是设备路径(如 /dev/sda1
)。使用UUID能保证即使硬件设备顺序变化也能挂载到正确的分区。
<挂载点>
:你之前创建的挂载目录,例如 /mnt/mydisk
。
<文件系统类型>
:例如 ext4
、xfs
、ntfs
、exfat
等,取决于你的分区使用的文件系统类型。
<挂载选项>
:多个选项之间用逗号分隔,如 defaults
表示使用默认挂载选项,noatime
可以禁用访问时间戳更新以减少磁盘I/O,nofail
表示即使挂载失败也不让系统启动停止,还可以包括 rw
(读写)、ro
(只读)等选项。
<dump频率>
:一个整数值表示是否对这个文件系统进行定期备份(dump
工具)。如果是0,则不备份;如果是1或其他大于0的数字,则会在必要时备份。
<fsck检查顺序>
:同样是一个整数值,表示在系统启动时fsck磁盘检查的优先级,根分区(/)通常设为1,其它分区依次递增。