服务器

上次观看到

当前位置:首页> 鸡米饭>服务器>

开机先检测fstab文件状态,避免因为装载硬盘配置错误导致开机失败

2025.01.09 23:44 阅读次数: 出自:鸡米饭 作者:绝歌一首

虽然在配置fstab文件后,利用mount -a可以马上测试fstab文件是否正常,避免开机故障

但是如果遇到硬盘损坏它也会加载失败。所以还是加个开机脚本自动进行恢复吧


以下是一个基于 systemd 方式在开机 fstab 加载前检查其状态,并在异常时恢复备份的完整方案:


  1. 创建服务单元文件
    在 /etc/systemd/system/ 目录下创建名为 check-fstab.service 的文件,内容如下:


  2. [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
  3. 重新加载 systemd 配置并启用服务

  4. systemctl daemon-reload
    systemctl enable check-fstab.service
  5. 脚本说明:

  6. 指定了该服务被 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] 部分:

  7. 注意事项:

    1. 不同 Linux 发行版下 systemd 的配置与行为细节可能略有差异,上述方案需要依据实际使用的系统进行适当调试与优化,确保服务能精准在 fstab 加载前完成检测与恢复,保障系统顺利开机。

    2. 在实际挂载检测环节,虽然通过 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

    • <文件系统类型>:例如 ext4xfsntfsexfat 等,取决于你的分区使用的文件系统类型。

    • <挂载选项>:多个选项之间用逗号分隔,如 defaults 表示使用默认挂载选项,noatime 可以禁用访问时间戳更新以减少磁盘I/O,nofail 表示即使挂载失败也不让系统启动停止,还可以包括 rw(读写)、ro(只读)等选项。

    • <dump频率>:一个整数值表示是否对这个文件系统进行定期备份(dump 工具)。如果是0,则不备份;如果是1或其他大于0的数字,则会在必要时备份。

    • <fsck检查顺序>:同样是一个整数值,表示在系统启动时fsck磁盘检查的优先级,根分区(/)通常设为1,其它分区依次递增。

上一篇:解决蜗牛星际j1900主板w   下一篇: