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

12 小时 31 分钟前
 oferge0311

最近在做一批 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 思路。

感谢。

1391 次点击
所在节点    Linux
49 条回复
oferge0311
11 小时 15 分钟前
@dream10201 您的想法是好的,但我想了想,在自测机可以这样试一下,但我所描述的背景环境,不太适合这种方式,不如不做,做反倒都是你的错了。我只是想多学到一种方式方法。哈哈,谢谢!
Kirkcong
11 小时 13 分钟前
@oferge0311 别做,只用上面给的脚本,上面给你什么你就用什么,让你怎么做就怎么做。你们机器体量大,架构零散,极大概率出事,我说的是指,在所有人意想不到的东西上出问题,起因可能是你导致的,也可能不是,但你会非常焦虑,别人也会首先怀疑近期谁做了变更。

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1237351

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX