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.conf | Ceph 配置文件(/etc/ceph/ceph.conf 是指向它的符号链接) |
corosync.conf | Corosync 集群配置文件(Proxmox VE 4.x 之前称为 cluster.conf) |
datacenter.cfg | Proxmox VE 数据中心级配置(键盘布局、代理等) |
domains.cfg | Proxmox VE 认证域(Realm) |
firewall/cluster.fw | 应用于所有节点的防火墙配置 |
firewall/<NAME>.fw | 单节点的防火墙配置 |
firewall/<VMID>.fw | VM 与容器的防火墙配置 |
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>.conf | LXC 容器的配置数据 |
nodes/<NAME>/openvz/ | Proxmox VE 4.0 之前的容器配置目录(已废弃 , 即将移除) |
nodes/<NAME>/pve-ssl.key | pve-ssl.pem 对应的 SSL 私钥 |
nodes/<NAME>/pve-ssl.pem | Web 服务的公共 SSL 证书(由集群 CA 签发) |
nodes/<NAME>/pveproxy-ssl.key | pveproxy-ssl.pem 对应私钥(可选) |
nodes/<NAME>/pveproxy-ssl.pem | Web 服务的公共 SSL 证书(链 , 可选 , 覆盖 pve-ssl.pem) |
nodes/<NAME>/qemu-server/<VMID>.conf | KVM 虚拟机的配置数据 |
priv/authkey.key | 票据系统使用的私钥 |
priv/authorized_keys | 集群成员用于认证的 SSH 公钥 |
priv/ceph* | Ceph 认证密钥与相关权限 |
priv/known_hosts | 集群成员用于校验的 SSH 主机密钥 |
priv/lock/* | 各服务用于确保跨集群安全操作的锁文件 |
priv/pve-root-ca.key | 集群 CA 私钥 |
priv/shadow.cfg | PVE Realm 用户的影子密码文件 |
priv/storage/<NAME>.pw | 以明文形式保存的存储密码 |
priv/tfa.cfg | Base64 编码的双因素认证配置 |
priv/token.cfg | 所有 API token 的 secret |
pve-root-ca.pem | 集群 CA 的公开证书 |
pve-www.key | 用于生成 CSRF token 的私钥 |
sdn/* | 软件定义网络(SDN)的共享配置 |
status.cfg | Proxmox VE 外部指标服务器配置 |
storage.cfg | Proxmox VE 存储配置 |
user.cfg | Proxmox VE 访问控制配置(用户 / 组等) |
virtual-guest/cpu-models.conf | 自定义 CPU 模型 |
vzdump.cron | 集群范围的 vzdump 备份作业计划 |
6.4.2.符号链接 Symbolic Links
集群文件系统内的某些目录使用符号链接 , 指向当前节点自身的配置 , 因此下表中链接目标在不同节点上指向不同文件:
| 链接 | 目标 |
|---|---|
local | nodes/<LOCAL_HOST_NAME> |
lxc | nodes/<LOCAL_HOST_NAME>/lxc/ |
openvz | nodes/<LOCAL_HOST_NAME>/openvz/(已废弃 , 即将移除) |
qemu-server | nodes/<LOCAL_HOST_NAME>/qemu-server/ |
6.4.3.用于调试的特殊状态文件(JSON) Special status files for debugging (JSON)
| 文件 | 说明 |
|---|---|
.version | 文件版本(用于检测变更) |
.members | 集群成员信息 |
.vmlist | 所有 VM 列表 |
.clusterlog | 集群日志(最近 50 条) |
.rrd | RRD 数据(最新条目) |
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/
这样手动恢复之前 , 必须 绝对确认 故障源节点已完全断电 / 已被 fence。否则 mv 会违反 Proxmox VE 的锁原则 , 产生意外后果。
依赖 本地磁盘(或仅在离线节点上可用的其他本地资源)的客户机不能这样恢复。要么等待失败节点重新加入集群 , 要么从备份中还原。