在 VMware 中如何静默文件系统并触发 VMware Tools 脚本?
解读
国内金融、政企、运营商的 CouchDB 集群普遍跑在 VMware vSphere 私有云里。
备份、克隆、在线迁移(vMotion)之前,必须静默文件系统(quiesce),保证数据库文件、视图索引、.couch 文件与 .view 文件在同一时间点处于一致状态;否则还原后可能出现**“视图索引损坏”或“数据库头校验失败”,导致 CouchDB 启动报错。
VMware Tools 提供的“自定义冻结/解冻脚本”**机制,是官方推荐的静默手段,也是面试官考察“你能否把数据库一致性要求落到虚拟化层”的核心考点。
知识点
-
VMware 静默方式
‑ 文件系统静默(quiesce filesystem):依赖 VMware Tools 的 VSS(Windows)或 vmxnet3 驱动配合冻结脚本(Linux/Unix)。
‑ 内存快照(snapshot the virtual machine’s memory):仅保证崩溃一致性,不保证应用一致性,不满足 CouchDB 要求。 -
Linux 下静默流程
① 宿主机侧:备份软件调用 vSphere API,设置quiesce = true, memory = false;
② 客体内:open-vm-tools 收到freeze请求,依次执行
/usr/sbin/pre-freeze-script→ fsfreeze -f → 快照 → fsfreeze -u →/usr/sbin/post-thaw-script;
③ 脚本返回 0 表示成功,非 0 则 vSphere 报“Quiesce operation failed”。 -
CouchDB 一致性要点
‑ 必须落盘所有写操作(包括 _users、_replicator、_global_changes 等系统库);
‑ 视图索引(.view 文件)与主库(.couch)必须同一时间点;
‑ 多节点集群需逐台静默,禁止并发快照,否则集群元数据可能不一致。 -
国内合规要求
‑ 等保 2.0 要求“备份数据可恢复性验证”,静默脚本需输出日志到/var/log/couchdb/quiesce.log并保存 6 个月;
‑ 金融规范(JR/T 0168)要求**“备份窗口内 RPO=0”**,脚本执行时间必须 < 30 s,否则触发告警。
答案
以 CentOS 7 + open-vm-tools 11.x + CouchDB 3.2 为例,给出可直接落地的步骤:
-
创建冻结脚本
/usr/sbin/pre-freeze-script#!/bin/bash LOG=/var/log/couchdb/quiesce.log echo "$(date '+%F %T') freeze start" >>$LOG # 1. 停止外部写入:切换到维护节点(若集群) curl -XPUT http://127.0.0.1:5986/_node/_local/_config/couchdb/maintenance_mode -d '"true"' -H "Content-Type: application/json" # 2. 触发 CouchDB 检查点,确保 .couch 落盘 curl -XPOST http://127.0.0.1:5984/_ensure_full_commit -H "Content-Type: application/json" # 3. 同步文件系统缓存 sync; echo 3 > /proc/sys/vm/drop_caches echo "$(date '+%F %T') freeze ready" >>$LOG exit 0 -
创建解冻脚本
/usr/sbin/post-thaw-script#!/bin/bash LOG=/var/log/couchdb/quiesce.log echo "$(date '+%F %T') thaw start" >>$LOG # 关闭维护模式 curl -XPUT http://127.0.0.1:5986/_node/_local/_config/couchdb/maintenance_mode -d '"false"' -H "Content-Type: application/json" echo "$(date '+%F %T') thaw finish" >>$LOG exit 0 -
赋权并注册
chmod 755 /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script # 无需额外注册,open-vm-tools 会自动调用 -
验证
在 vCenter 手动生成“快照(静默)”→ 查看/var/log/couchdb/quiesce.log出现“freeze ready / thaw finish”即成功;
同时/var/log/vmware-vmsvc.log中应无“Custom quiesce script failed”字样。 -
集群场景
通过 Ansible 逐台执行快照,每台静默前先 PUT /_cluster_setup 把节点置为 maintenance,快照完再恢复,确保**“集群级一致性”**。
拓展思考
-
如果宿主机使用基于存储(H3C、华为 OceanStor)的硬件快照,仍需调用 VMware Tools 脚本吗?
‑ 需要。硬件快照只保证 LUN 级一致性,CouchDB 的视图索引与数据库文件可能跨多个 VMDK,必须依赖应用级静默脚本才能消除跨文件时间差。 -
当 CouchDB 与 Elasticsearch 共存同一虚拟机时,如何协同静默?
‑ 在pre-freeze-script里串行执行:
① 关闭 ES 写入 (/_flush/synced) → ② CouchDB 维护模式 → ③ 统一 sync → 快照;
解冻时反向操作,保证**“多应用零丢失”**。 -
国内信创环境(鲲鹏 + 麒麟 V10)open-vm-tools 版本低,不支持原生 freeze 回调,怎么办?
‑ 改用 “软静默” 方案:备份软件通过 SSH 下发脚本,手动 fsfreeze,再调用 vSphere API 创建内存快照=false 的普通快照;
‑ 需在变更流程里明确记录“软静默”操作人、时间、结果,满足等保审计。