Chapter 06 · Proxmox Cluster File System (pmxcfs)

第 6 章 Proxmox 集群文件系统(pmxcfs)

6.Proxmox 集群文件系统(pmxcfs) Proxmox Cluster File System (pmxcfs)

Proxmox 集群文件系统(pmxcfs)是一个数据库驱动的文件系统 , 用于存放配置文件 , 并借助 corosync 实时复制到集群中所有节点。 Proxmox VE 用它来存储全部与 Proxmox VE 相关的配置文件。

尽管文件系统把所有数据保存在磁盘上的持久化数据库 , 但同时在 RAM 中维持一份副本。这限制了它的最大容量 —— 当前为 128 MiB, 对于保存数千台虚拟机的配置仍然绰绰有余。

该系统提供以下优势:

  • 所有配置无缝、实时复制到全部节点
  • 提供强一致性检查 , 避免 VM ID 重复
  • 节点失去 quorum 时进入只读
  • 自动把 corosync 集群配置更新到所有节点
  • 内置分布式锁机制

6.1.POSIX 兼容性 POSIX Compatibility

该文件系统基于 FUSE, 因此行为接近 POSIX。但出于实际需要 , 有些特性并未实现:

  • 可以正常创建文件与目录 , 但 不支持符号链接等;
  • 不能重命名非空目录(便于保证 VMID 唯一);
  • 不能修改文件权限(权限基于路径);
  • O_EXCL 创建不是原子的(与旧 NFS 类似);
  • O_TRUNC 创建不是原子的(FUSE 限制)。

6.2.文件访问权限 File Access Rights

所有文件与目录的属主都是 root, 属组为 www-data。仅 root 拥有写权限 , 但 www-data 组可读取大多数文件。以下路径下的文件只有 root 能访问:

/etc/pve/priv/
/etc/pve/nodes/${NAME}/priv/

6.3.底层技术 Technology

集群通信使用 Corosync Cluster Engine, 数据库部分使用 SQLite。文件系统在用户空间实现 , 通过 FUSE 暴露。

6.4.文件系统布局 File System Layout

文件系统挂载于:

/etc/pve

6.4.1.文件清单 Files

路径说明
authkey.pub票据系统使用的公钥
ceph.confCeph 配置文件(/etc/ceph/ceph.conf 是指向它的符号链接)
corosync.confCorosync 集群配置文件(Proxmox VE 4.x 之前称为 cluster.conf)
datacenter.cfgProxmox VE 数据中心级配置(键盘布局、代理等)
domains.cfgProxmox VE 认证域(Realm)
firewall/cluster.fw应用于所有节点的防火墙配置
firewall/<NAME>.fw单节点的防火墙配置
firewall/<VMID>.fwVM 与容器的防火墙配置
ha/crm_commands显示 CRM 当前正在执行的 HA 操作
ha/manager_status集群 HA 服务的 JSON 信息
ha/resources.cfg由 HA 管理的资源及其当前状态
ha/rules.cfg约束 HA 管理器调度 HA 资源的规则
nodes/<NAME>/config节点特定配置
nodes/<NAME>/lxc/<VMID>.confLXC 容器的配置数据
nodes/<NAME>/openvz/Proxmox VE 4.0 之前的容器配置目录(已废弃 , 即将移除)
nodes/<NAME>/pve-ssl.keypve-ssl.pem 对应的 SSL 私钥
nodes/<NAME>/pve-ssl.pemWeb 服务的公共 SSL 证书(由集群 CA 签发)
nodes/<NAME>/pveproxy-ssl.keypveproxy-ssl.pem 对应私钥(可选)
nodes/<NAME>/pveproxy-ssl.pemWeb 服务的公共 SSL 证书(链 , 可选 , 覆盖 pve-ssl.pem)
nodes/<NAME>/qemu-server/<VMID>.confKVM 虚拟机的配置数据
priv/authkey.key票据系统使用的私钥
priv/authorized_keys集群成员用于认证的 SSH 公钥
priv/ceph*Ceph 认证密钥与相关权限
priv/known_hosts集群成员用于校验的 SSH 主机密钥
priv/lock/*各服务用于确保跨集群安全操作的锁文件
priv/pve-root-ca.key集群 CA 私钥
priv/shadow.cfgPVE Realm 用户的影子密码文件
priv/storage/<NAME>.pw以明文形式保存的存储密码
priv/tfa.cfgBase64 编码的双因素认证配置
priv/token.cfg所有 API token 的 secret
pve-root-ca.pem集群 CA 的公开证书
pve-www.key用于生成 CSRF token 的私钥
sdn/*软件定义网络(SDN)的共享配置
status.cfgProxmox VE 外部指标服务器配置
storage.cfgProxmox VE 存储配置
user.cfgProxmox VE 访问控制配置(用户 / 组等)
virtual-guest/cpu-models.conf自定义 CPU 模型
vzdump.cron集群范围的 vzdump 备份作业计划

集群文件系统内的某些目录使用符号链接 , 指向当前节点自身的配置 , 因此下表中链接目标在不同节点上指向不同文件:

链接目标
localnodes/<LOCAL_HOST_NAME>
lxcnodes/<LOCAL_HOST_NAME>/lxc/
openvznodes/<LOCAL_HOST_NAME>/openvz/(已废弃 , 即将移除)
qemu-servernodes/<LOCAL_HOST_NAME>/qemu-server/

6.4.3.用于调试的特殊状态文件(JSON) Special status files for debugging (JSON)

文件说明
.version文件版本(用于检测变更)
.members集群成员信息
.vmlist所有 VM 列表
.clusterlog集群日志(最近 50 条)
.rrdRRD 数据(最新条目)

6.4.4.启用 / 关闭调试 Enable/Disable debugging

启用详细 syslog 输出:

echo "1" >/etc/pve/.debug

关闭详细 syslog 输出:

echo "0" >/etc/pve/.debug

6.5.故障恢复 Recovery

如 Proxmox VE 主机遇到严重问题(例如硬件故障), 可以复制 pmxcfs 的数据库文件 /var/lib/pve-cluster/config.db 并迁移到新的 Proxmox VE 主机。在新主机(暂不运行任何东西)上 , 停止 pve-cluster 服务并替换 config.db(需要权限 0600)。之后按故障主机实际情况调整 /etc/hostname 与 /etc/hosts , 重启并检查(别忘了 VM / CT 数据)。

6.5.1.移除集群配置 Remove Cluster Configuration

推荐做法是把节点从集群中移除后 重装, 以确保所有集群 / SSH 秘钥与共享配置数据被销毁。

某些情况下您可能希望不重装就把节点退回本地模式 , 参见 §5.5.1「不重装即分离节点」。

6.5.2.从失败节点恢复 / 迁移客户机 Recovering/Moving Guests from Failed Nodes

对于 nodes/<NAME>/qemu-server/(VM)与 nodes/<NAME>/lxc/(容器)中的客户机配置文件 , Proxmox VE 将所在节点视为该客户机的 属主。这一概念使得我们可以用本地锁来防止并发修改客户机配置 , 从而避免昂贵的集群级锁。

结果是 , 如果客户机的属主节点失败(例如断电、 fencing 等), 常规迁移将不可行(即便磁盘全部位于共享存储), 因为无法在离线节点上获取该本地锁。这对 HA 管理的客户机不成问题 : Proxmox VE 高可用栈包含必要的集群级锁与看门狗功能 , 可自动把客户机从被 fenced 的节点正确恢复。

对于未受 HA 管理的客户机 , 若其 仅使用共享磁盘(且不依赖失败节点上仅有的其他本地资源), 可通过手动把客户机配置文件从失败节点目录移到在线节点目录来恢复(这相当于改变了客户机的逻辑属主)。

例如把 VMID 100 从已离线的 node1 恢复到 node2, 在任一在线集群成员以 root 运行:

mv /etc/pve/nodes/node1/qemu-server/100.conf /etc/pve/nodes/node2/qemu-server/
WARN

这样手动恢复之前 , 必须 绝对确认 故障源节点已完全断电 / 已被 fence。否则 mv 会违反 Proxmox VE 的锁原则 , 产生意外后果。

WARN

依赖 本地磁盘(或仅在离线节点上可用的其他本地资源)的客户机不能这样恢复。要么等待失败节点重新加入集群 , 要么从备份中还原。