Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
oferge0311
V2EX  ›  Linux

求助:有没有无影响检查 /etc/fstab 的可靠方法?

  •  
  •   oferge0311 · 23h 23m ago · 2302 views

    最近在做一批 Linux 主机的 CVE 漏洞修复,遇到一个比较实际的问题,想请教一下大家有没有成熟的处理方式。

    因为很多安全补丁,现在都是涉及到内核级别,安装完成后都需要重启才能真正生效,但是在批量重启主机之前,也遇到了 /etc/fstab 中存在异常配置而无法拉起的情况。

    因为如果 /etc/fstab 里存在错误,比如:

    UUID 或设备路径错误 文件系统类型错误 挂载参数不支持 本地设备不存在 NFS 等网络文件系统不可达 其他只有实际挂载时才会暴露的问题

    都有可能导致主机重启后进入救援,或无法拉起

    目前想要与大家探讨的是:

    希望在 reboot 之前,对 /etc/fstab 做一次尽可能接近真实挂载结果的检查,但又不能真正执行挂载操作,也不能对当前系统状态造成影响。

    我测试过:

    mount -a -v -f

    以及:

    findmnt --verify --verbose

    但实际测试下来,这两种方式的结果都无法完全和真正执行:

    mount -a

    的结果对应起来。

    问题在于,大批量生产主机又不适合在重启前直接执行 mount -a 。

    因为 mount -a 可能会把当前未挂载的文件系统真正挂载起来,也可能主动访问 NFS 、NAS 等网络存储,甚至改变当前系统状态。在复杂生产环境中,这种操作有可能产生额外影响,极端情况下甚至可能出现不可逆的问题。

    所以想请教一下大家:

    有没有一种相对可靠的方式,可以做到:

    不实际 mount / umount 不产生真实写入 不改变当前系统状态 尽量检查出设备、UUID 、文件系统类型、挂载参数、网络挂载等问题 检查结果尽可能接近真实的 mount -a 最好适合通过 Ansible 、Shell 等方式批量执行

    或者大家在做大规模 Linux 主机补丁升级、批量重启之前,通常是怎么处理 /etc/fstab 风险检查的?

    感觉单纯做语法检查还不够,但真正执行挂载又风险比较大,所以想看看有没有比较成熟的 pre-reboot check 思路。

    感谢。

    69 replies    2026-08-27 13:48:55 +08:00
    cslive
        1
    cslive  
       23h 9m ago
    命令写在/etc/rc.local 里
    oferge0311
        2
    oferge0311  
    OP
       22h 55m ago
    @cslive 是重启前的检查,避免出现因为 fstab 文件而重启失败,进行规避。写在自启文件里面的化,没这个而此操作的必要性吧? fstab 本身就会在启动时会操作一遍的阿
    cslive
        3
    cslive  
       22h 48m ago
    @oferge0311 #2 不要动 fstab 文件,"mount /dev/sdb /mnt"写在/etc/rc.local 里即可,你动 fstab 拼错了或者 nfs 挂载不上卡住了启动不起来进救援模式改文件很麻烦,写在/etc/rc.local 不会影响启动,最多目录挂不上去
    oferge0311
        4
    oferge0311  
    OP
       22h 43m ago
    @cslive 最多目录挂不上。。。。。 如果是数据盘呢,如果是 nfs 共享存储呢。。。大批量主机,你这个方法能正常拉起系统吗,要做到的是减少工作量,但后续的检查工作不比 1 台机器起不来修的工作量要小阿,难道还要在重启之后执行一遍 mount -a 吗
    Kirkcong
        5
    Kirkcong  
       22h 39m ago
    我们的方案是,分批重启,一天重启个五六台
    kenX
        6
    kenX  
       22h 38m ago
    需求都这么明确了,丢给 ai 出个脚本不行了?
    oferge0311
        7
    oferge0311  
    OP
       22h 37m ago
    @kenX 用 ai 跑了脚本了,但是主机批量蛮大的,预计的情况也不一定,我不太想使用。出问题肯定算。。。
    oferge0311
        8
    oferge0311  
    OP
       22h 35m ago
    @Kirkcong 五六台。。。。我们的机器还是蛮多的,测试灾备的主机环境是这个的千倍多,生产比测试灾备的要多几倍
    cslive
        9
    cslive  
       22h 34m ago
    @oferge0311 #4 我已经说的很清楚了,这种方法能保证重启,挂不上去那肯定你命令有问题,盘有问题,nfs 网络问题,这些是你要想办法解决的
    Kirkcong
        10
    Kirkcong  
       22h 32m ago
    @oferge0311 所以这是个长期计划,半年一年差不多了
    oferge0311
        11
    oferge0311  
    OP
       22h 32m ago
    @cslive 要做到的是重启前的检查呀,fstab 文件拿最简单的,defaults 没有 s 都会起不来进入救援。
    Kirkcong
        12
    Kirkcong  
       22h 30m ago
    @oferge0311 你们可以多分几个人,每天多重启几台。如果你说生产机器也面临这个问题,那我只能说架构整体太脆弱了,怎么会允许这种事情呢?如果是前人留下的,那就看愿意花多少成本去填坑了。
    dream10201
        13
    dream10201  
       22h 28m ago
    改成开机不自动挂载,访问挂载目录才自动挂载,这样就不会影响到开机。
    oferge0311
        14
    oferge0311  
    OP
       22h 28m ago
    @Kirkcong Linux 这个开源项目,内核漏洞不断的被发现,厂商不断的发布补丁,不断的打,太多了,压根属于上上上一个还没打完,又来新的,只能是可着优先级高的业务系统进行操作了。而且我也不想去管这个,不是该操的心,只想看看能不能学到一种方法,丰富自己的同时还能减轻工作,毕竟每次遇到机器起不来修也很麻烦,走各种流程
    oferge0311
        15
    oferge0311  
    OP
       22h 25m ago
    @Kirkcong 生产环境已经算好了的,问题少的,顶多遇到个 fstab 和网络网卡问题,其他都是配合应用解决它们的服务,测试和灾备环境才是真正属于,运行时候就是个雷,重启才发现。几台可不止,测试灾备最多一晚上 1000 台,生产目前最多是 600 多,几乎都是一个业务的。
    Kirkcong
        16
    Kirkcong  
       22h 19m ago
    @oferge0311 没办法,只能不断的打补丁。你这个场景里面最大的问题不在于怎么做到 runtime to permanent.而是说架构本身没设计好,比如我们的机器,不管是 dsr 还是 psr,所有机器都统一配置,需要持久化的东西都在 ansible playbook ,即便没有挂载上的,直接跑 mount -a 即可。甚至每个机器安装的 rpm 、pip modules 都是一样的,全都由 ansible role 管理,而 ansible 文件则放在 bitbucket 中。

    如果你不是管事的,那就直接把这问题报告上去,说清楚现状,以及风险点。怎么决策是上面的事情。你千万不要去做任何冒险的事情,因为一旦出了事,都是你的;如果弄好了,没什么收益,并且出事的概率极大。
    oferge0311
        17
    oferge0311  
    OP
       22h 14m ago   ❤️ 1
    @Kirkcong 明白您的意思,但根据这一季度做的这几万台,能正常拉起系统的,一般都甩不到我们身上。我也不去做这个问题报告,和+1 领导说一下这个问题,+1 领导是技术的,如果是他提供的脚本,肯定是比我从 ai 跑出来的脚本,从”安全与执行“要强的。我们也是用 ansible 操作,机器太多,后续要替换其他的了。我们有个镜像仓库,补丁包打到里面,yum update 去指定对应的仓库名称的特定包,都是写好的 yaml [都是+1 写的]
    june4
        18
    june4  
       22h 12m ago
    都要重启了为什么不能变化下系统状态呢?重启了不是又重置了。如果 mount -a 出问题,那就先别重启,通知人修复机器问题再重启,否则不是明知故意个留个雷在这机器吗 反正也是要解决这个问题的
    oferge0311
        19
    oferge0311  
    OP
       22h 10m ago   ❤️ 1
    @Kirkcong 目前就是重启前升级失败的问题,这种一般都是跑 playbook 时的 python 被应用改了,或者 rpm 需要 rebuilddb 重构一下,或者也就是存储满了,升级不了。现在就是有点钻牛角,想要简单且不那么冗余的预防这个重启后系统失败拉起的点。前面 6 楼老师说的直接跑 ai 脚本出来也行。我在试 13 楼老师的取消开启不自动挂载方案在我的本地机,但这种应该不适合在大批量生产环境。有种不如不做,做了反而怪你。
    oferge0311
        20
    oferge0311  
    OP
       22h 9m ago
    @june4 我有考虑过如果先执行 mount -a 是不是万事大吉,但生产环境的 mount -a 如果出现挂载点重复等操作,也不是不可能存在的,如果覆盖挂载,比重启起不来去修还要麻烦。
    oferge0311
        21
    oferge0311  
    OP
       22h 7m ago
    @dream10201 您的想法是好的,但我想了想,在自测机可以这样试一下,但我所描述的背景环境,不太适合这种方式,不如不做,做反倒都是你的错了。我只是想多学到一种方式方法。哈哈,谢谢!
    Kirkcong
        22
    Kirkcong  
       22h 6m ago
    @oferge0311 别做,只用上面给的脚本,上面给你什么你就用什么,让你怎么做就怎么做。你们机器体量大,架构零散,极大概率出事,我说的是指,在所有人意想不到的东西上出问题,起因可能是你导致的,也可能不是,但你会非常焦虑,别人也会首先怀疑近期谁做了变更。

    实验新东西不能在这种大型变更上尝试,太危险了。
    oferge0311
        23
    oferge0311  
    OP
       22h 4m ago
    @Kirkcong 是的,规避这种不必要的风险,就像是您说的,一旦出了事,都是我的;如果弄好了,没什么收益,并且出事的概率是不确定性的。所以我在几个社区发布了帖子,希望是讨论一下,如果是有效的方法,我也仅做个学习记录。
    unused
        24
    unused  
       22h 3m ago   ❤️ 1
    建个 mnt namespace 在里面挂载
    Moishine
        25
    Moishine  
       21h 33m ago
    好久没在本站看到技术讨论了😄
    zhsj
        26
    zhsj  
       21h 13m ago via Android
    没见过有实现好的,感觉只能具体场景具体检查。

    fstab 应该是 ansible 脚本直接生成的,这样至少保证 fstab 和你配置仓库里的一致。比如 uuid ,直接 ansible 获取过来的吧。nfs 地址,肯定是你配置文件里写死的,这样和你配置仓库里每个机器的网络结构也能对应起来。
    oferge0311
        27
    oferge0311  
    OP
       21h 13m ago
    @unused 没太明白您的意思,方便稍微的说一下吗,我在自测机试一下,工作环境就不去做这个实验了
    zhsj
        28
    zhsj  
       21h 10m ago via Android
    思路可以转换下,不是说检查生产环境 fstab 是不是有问题(不要让人去生产环境直接做变更),而是这个 fstab 是配置仓库生成的,确保可控。
    adoal
        29
    adoal  
       21h 1m ago
    感觉 [因为 mount -a 可能会把当前未挂载的文件系统真正挂载起来,也可能主动访问 NFS 、NAS 等网络存储,甚至改变当前系统状态。在复杂生产环境中,这种操作有可能产生额外影响,极端情况下甚至可能出现不可逆的问题] 这个现状的复杂性才是你问题的根因。可能还是得想办法把这种挂载操作的不可控给解耦隔离到一个较小的范围更合理吧。
    unused
        30
    unused  
       20h 42m ago
    @oferge0311 没有具体测试过,不知道 `unshare --mount` 后 `mount -a` 能不能满足你的需求。这样会实际挂载文件系统,但是没有特殊情况的话这些挂载和原 namespace 是隔离的。`man 7 mount_namespaces` 看一下
    huhy
        31
    huhy  
       20h 30m ago
    可以先找台同环境的服务器测试机,在上边测试完漏洞修复后再去到生产环境进行操作。
    Dlin
        32
    Dlin  
       20h 12m ago
    干什么的,你们机器咋这么多。
    oferge0311
        33
    oferge0311  
    OP
       18h 0m ago
    @adoal 问题的关键确实就是这样的,不能执行 mount -a 就是因为在复杂的生产环境中反倒会有额外的影响,甚至不如选择机器起不来去修复。
    oferge0311
        34
    oferge0311  
    OP
       17h 59m ago
    @huhy 复杂的生产环境,没办法做到找相同环境的测试机去做测试的,我只是想预防一下因为 fstab 而导致的系统启动失败进入救援模式修复
    oferge0311
        35
    oferge0311  
    OP
       17h 59m ago
    @Dlin 这个。。。机器确实很多
    oferge0311
        36
    oferge0311  
    OP
       17h 56m ago
    @zhsj 不是,和 29 楼的 adoal 老师说的一样,复杂的生产环境,每个主机的 fstab 不一定是什么样子的,目前我遇到因为 fstab 问题起不来的有。1.没有对应的 lv 和挂载点 [创建的时候就创建错了,2 年未重启过,没发现过] 2.lv 写错,导致未成功挂载 [也是一年多未重启过,从未被发现] 3.defaults 的参数少写了个 s.只有 default [这个当时光顾着拉起系统,没看上次修改是什么时间,估计也是几年]
    ota
        37
    ota  
       17h 24m ago
    有感,之前也是,我有一部分用了 sshfs ,有部分用了 nfsv4 ,挂载出现问题导致一些服务直接宕机,深有体会。还好我机器不多,我直接全部改成 nixos 跑了,尽可能环境可回滚可复现。统一管理同一份配置文档。
    zhsj
        38
    zhsj  
       16h 48m ago via Android
    你这几年没重启的机器没救了,一看就不像现代工具管理的,自己一个个检查吧
    fstab
        39
    fstab  
       16h 17m ago
    [Unit]
    Description=Mount Disk with UUID
    After=local-fs.target

    [Mount]
    What=/dev/disk/by-uuid/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Where=/home
    Type=ext4
    Options=defaults,nofail

    [Install]
    WantedBy=multi-user.target

    我是写到 systemd 挂载单元,放到/etc/systemd/system 里面的,开机挂载,就算硬盘坏了,也不影响启动。
    fstab
        40
    fstab  
       16h 17m ago
    打开论坛一看 fstab ,我还想着谁挂我呢- -
    oferge0311
        41
    oferge0311  
    OP
       16h 5m ago
    @zhsj 这个。。。这个。。。。 机器太多太多了,几年两三年没重启的不算什么。。。。至于现代化工具,不太清楚什么算现代化工具阿。。。复杂的生产环境,成千台连测试机都不满足
    oferge0311
        42
    oferge0311  
    OP
       16h 4m ago
    @ota 复杂的生产环境,当我统计数量,顺带统计了一下业务,业务都几百+,应该没办法统一的去管理同一份配置文档,一个业务一个挂载点都是有可能存在的/(ㄒoㄒ)/~~
    oferge0311
        43
    oferge0311  
    OP
       16h 3m ago
    @fstab O(∩_∩)O 求助如何挂你,哈哈
    oferge0311
        44
    oferge0311  
    OP
       16h 0m ago
    @fstab 以 system 去管理吗,那是不是要和前面第 13 楼的 dream10201 老师说的方法有点类似,需要先取消 fstab 的开机不自动挂载,然后再以 system 服务去管理磁盘挂载,这好像是个好方法诶,值得学习记录一下,不错,谢谢老师,不过在我这个复杂的生产环境,可能没办法实现,不过是个好方法。我上一次去学习 systme 还是以普通用户去绕过 root 用户,完全实现--user 用户级的开机自启
    ihciah
        45
    ihciah  
       15h 14m ago via iPhone
    用 nixos 管理,拿一台机器做实验,挂了也能回到上一个 generation 。验证通过后全量发。
    ihciah
        46
    ihciah  
       15h 12m ago via iPhone
    哦不对,你这里是想验证各种不同的 fstab 。。
    那看起来你只能尽可能 dry run fstab 同款逻辑了,然后写脚本兜底,启动挂了 revert 。
    oferge0311
        47
    oferge0311  
    OP
       15h 9m ago
    @ihciah 如标题,我是想使用一种方法来尝试检查不同的 fstab [该死的生产环境] ,目前看只能跑脚本了。
    j0ck1e
        48
    j0ck1e  
       15h 0m ago
    "mount -a 可能会把当前未挂载的文件系统真正挂载起来",生产环境就不该出现这种问题,长期挂载的设备才应该写在 fstab 里面,实际 fstab 和 mount 必须对得上,不要考虑什么 rc.local ,systemd ,虽说 systemd 也是官方建议,但写起来实在费劲,通用便捷性还是不如 fstab ,如果你只是担心 fstab 写错导致重启进入紧急救援模式,不妨在不确定的条目中加上 nofail 参数
    busier
        49
    busier  
       13h 37m ago via iPhone
    杀个乱写 fstab 的程序员祭天
    laminux29
        50
    laminux29  
       7h 3m ago
    思路完全错了,你这是在生产环境上做测试。

    正确的思路是,在测试环境上,把改动做好,形成不可变系统。正式环境上只做监控,不做测试。
    Rorysky
        51
    Rorysky  
       4h 24m ago
    nofail
    salmon5
        52
    salmon5  
       4h 8m ago
    nofail #nfs 不需要添加,nfs 无法挂载也不影响启动;
    #本地盘如果不存在,系统无法启动,可以添加/dev/vdd /mnt/vdd ext4 defaults,nofail 0 0 ,镜像了 ECS 不带数据盘,也不影响启动
    man systemd.mount 查看 nofail 帮助;属于 systemd ,不属于 nfs ;因此只能/etc/fstab 中使用,无法在 mount 命令中使用
    salmon5
        53
    salmon5  
       4h 6m ago
    重启不检查,新配置的时候检查,不要头疼医头
    yanqiyu
        54
    yanqiyu  
       3h 58m ago
    > UUID 或设备路径错误文件系统类型错误挂载参数不支持本地设备不存在 NFS 等网络文件系统不可达其他只有实际挂载时才会暴露的问题

    那现在这个机器是怎么拉起来的?按理说只要现在机器还在运行出问题的最多就是 nfs ?
    Busy
        55
    Busy  
       3h 30m ago
    生产环境做测试是为了什么,服务器可能被交接过 N 次,非重大问题,是不重启的。
    内核级补丁,那就不要将挂载写到 fstab 。
    各个服务通知到责任人,重启后通知他们解决。
    你怎么可能清楚知晓他们是如果对待挂载目录的。
    killva4624
        56
    killva4624  
       3h 29m ago
    生产环境不能进行测试,只能从配置文件静态分析是否有错误。
    既然无法用一个方式来一把验证,那你的问题应该分阶段去看,或者说,先解决能解决的部分,小规模验证、优化,再大规模推广。
    然后是增量问题:规范 fstab 配置文件写入,新增机器统一要走标准的处理方式,比如出现人工手写或者注释不全等不规范问题...如果业务不规范,那么你做为机器管理方,要提出自己的声音,进行业务规范。

    然后是存量问题:存量 fstab 配置文件,是否静态分析(语法、磁盘是否存在、权限设置)就已经能解决大部分错误了,如果是,那就没有必要纠结,先全量扫描修复一遍;然后小规模(比如 5%)重启,看是否有新的 case ,新的 case 能否用别的方法,加到扫描脚本里处理,依次类推。
    coefu
        57
    coefu  
       3h 12m ago
    一个 mount -f 的事情,搞那么多心理活动,你难道不看 man 手册?

    mount from util-linux 2.37.4 (libmount 2.37.4: selinux, btrfs, namespaces, assert, debug)

    唯一要验证的就是,你那些七里八里的机器 os 的 mount 支不支持 -f 。
    coefu
        58
    coefu  
       3h 11m ago
    @coefu 撤回,是我没仔细看 op 原帖。
    oferge0311
        59
    oferge0311  
    OP
       43 mins ago
    @j0ck1e 目前从各位老师们的意见来看,让目录不自动挂载,或取消 fstab 自动挂载是能够暴力解决问题,可不适合在我说的背景下。如前面 Kirkcong 老师在 22 楼说的,这就像个坑,只能不去做。而我的初衷就是有没有可以不执行只检查的方法
    oferge0311
        60
    oferge0311  
    OP
       42 mins ago
    @busier 乱写的人都太久远了ヽ(≧□≦)ノ 不是离场就是找不到是谁干得
    oferge0311
        61
    oferge0311  
    OP
       41 mins ago
    @laminux29 理想的想法,可复杂的生产环境下,甚至做不到全部都与测试灾备环境一致的,业务系统就好几百了。。。
    oferge0311
        62
    oferge0311  
    OP
       40 mins ago
    @Rorysky 是好方法,可以饶过他,但这一步是不好走的,特别在大批量,复杂的情况下
    oferge0311
        63
    oferge0311  
    OP
       35 mins ago
    @salmon5 是个好的思路方向,可我真正想要做到的是,不去改变当前的相关配置文件去检查,目前看只能使用脚本,去多跑命令来判断返回值了。像您楼下说的,我可能只是在钻牛角头疼自己 [为了重启以后减少工作量和学习新思路]
    oferge0311
        64
    oferge0311  
    OP
       32 mins ago
    @Busy 最开始是跑批测试,灾备环境的内核补丁升级,重启以后所谓的“负责人”压根就说没事,不需要 验证! 结果后来一周不到出问题,他们就开始”甩“ 说不认,和+2 领导沟通,那他们流程都确认也允许了,也说没问题,现在出这种”甩“,+2 领导说后续再强化一下流程,现在的生产都是确认到”负责人“安排的,实际操作人员验证没问题才算结束的。
    至于您说的不可能知晓他们怎么对待挂载点目录的。说的就是我想提前预防一下,避免进救援修机器还麻烦,不像是自己电脑,密码简单,也不会卡顿就进去开弄。
    oferge0311
        65
    oferge0311  
    OP
       30 mins ago
    @yanqiyu 这个是 chat 帮我根据我的描述写的英文求助帖 [将它发到了 linux.org] ,翻译我又修改了一下,其实问题就在本地的例 sda ,sdb ,sdc 盘总是会出现配置项错误,lv 和 vg 等错误。
    oferge0311
        66
    oferge0311  
    OP
       24 mins ago
    @killva4624
    1 )是的,就是因为生产环境不能进行测试,只能从配置文件来分析错误。
    2 )我想要的就是一种方法来进行规模验证,至于优化和推广,这是我前面楼层提到+1 领导需要做的事情了,没那个”实力与公信力“ 出问题反倒一身事。
    3 )而规范 fstab 的写入,其实已经是有标准化配置与流程了,就是运行的年份拉的较长,不知道他们做了什么。而提出业自己的声音进行业务规范,这太难了。做不到的
    4 )确实是扫描一遍全量主机,来去看哪些机器有问题,哪些机器没问题,然后去针对性的修复,这确实是正确的,该走的路线
    最后,其实您已经讲明白了我遇到的问题处境和正确的路线,但我其实就是想多了解一种方法,有没有简单化的命令可以应对这种复杂环境来排查。 [我没那个能力写出来,这太难了,感觉已经涉及到内核态了]
    oferge0311
        67
    oferge0311  
    OP
       22 mins ago
    @coefu 嗯嗯,其实我已经试过 mount -a -v -f 和 findmnt -x -verbose 了,但达不到我的预期,我用最简单的,当它挂载时,我修改 defaults 的 s 删掉改成 defauls ,它们都识别不到,只有 mount -a ,可实际执行 mount -a 更麻烦
    valord577
        68
    valord577  
       9 mins ago
    如果部署流程健壮的话 能"新机器替换现有的"吗?直接用新机器部署一遍 旧机器刷机掉 等待下一次操作
    oferge0311
        69
    oferge0311  
    OP
       7 mins ago
    @valord577 我以肯定的,准确的,不可质疑的回答您,完全不太可能,先不说应用的复杂度,这群人我打个 kernel 补丁包都认为会对他们服务造成影响,要求停止服务后再打补丁 [装个内核补丁包,重启后才会生效]
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5226 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 05:56 · PVG 13:56 · LAX 22:56 · JFK 01:56
    ♥ Do have faith in what you're doing.