Proxmox 集群文件系统(“pmxcfs”)是一个数据库驱动的文件系统,用于存储配置文件,并使用 corosync 实时复制到所有集群节点。我们使用这个系统来存储所有与 {PVE} 相关的配置文件。

尽管文件系统将所有数据存储在磁盘上的持久性数据库中,但数据的副本存在于RAM中。这对最大尺寸施加了限制,目前是128MiB。这仍然足以存储几千台虚拟机的配置。

这个系统提供了以下优势:

  • 实时无缝地将所有配置复制到所有节点

  • 提供强一致性检查以避免虚拟机ID重复

  • 当节点丢失法定人数时为只读模式

  • 将corosync集群配置的自动更新应用到所有节点

  • 包括一个分布式锁定机制

POSIX 兼容性

文件系统基于FUSE,因此行为类似于POSIX。但是一些功能并没有被实现,因为我们不需要它们:

  • 你只能生成普通的文件和目录,但不能生成符号链接,…​

  • 你无法重命名非空目录(因为这样可以更容易地确保VMID的唯一性)。

  • 你不能更改文件权限(权限基于路径)。

  • O_EXCL` 创建操作不是原子性的(如旧版NFS)

  • O_TRUNC` 创建操作不是原子操作(FUSE限制)

文件访问权限

所有文件和目录都由用户`root`拥有,并归组`www-data`所有。只有root拥有写权限,但`www-data`组可以读取大部分文件。以下路径下的文件仅root可访问:

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

科技

我们使用[Corosync集群引擎](SQlite(FUSE(https://github.com/libfuse/libfuse)实现的。

文件系统布局

文件系统挂载在:

/etc/pve

文件

authkey.pub

由票据系统使用的公钥

ceph.conf

Ceph配置文件(注意:/etc/ceph/ceph.conf是指向这个的符号链接)

corosync.conf

Corosync集群配置文件(在{pve} 4.x之前,此文件被称为cluster.conf)

datacenter.cfg

{pve}数据中心范围配置(键盘布局、代理等)

domains.cfg

{pve}认证域

firewall/cluster.fw

应用于所有节点的防火墙配置

firewall/<NAME>.fw

个别节点的防火墙配置

firewall/<VMID>.fw

VM和容器的防火墙配置

ha/crm_commands

显示CRM当前正在执行的HA操作

ha/manager_status

关于集群上HA服务的JSON格式信息

ha/resources.cfg

由高可用性管理的资源及其当前状态

nodes/<NAME>/config

节点特定配置

nodes/<NAME>/lxc/<VMID>.conf

LXC容器的VM配置数据

nodes/<NAME>/openvz/

在{pve} 4.0之前,用于容器配置数据(已废弃,将很快移除)

nodes/<NAME>/pve-ssl.key

`pve-ssl.pem`的私有SSL密钥

nodes/<NAME>/pve-ssl.pem

网页服务器的公有SSL证书(由集群CA签名)

nodes/<NAME>/pveproxy-ssl.key

`pveproxy-ssl.pem`的私有SSL密钥(可选)

nodes/<NAME>/pveproxy-ssl.pem

网页服务器的公有SSL证书(链)(`pve-ssl.pem`的可选覆盖)

nodes/<NAME>/qemu-server/<VMID>.conf

KVM VMs的VM配置数据

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/<STORAGE-ID>.pw

包含存储的明文密码

priv/tfa.cfg

Base64编码的双因素认证配置

priv/token.cfg

所有令牌的API令牌秘密

pve-root-ca.pem

集群CA的公共证书

pve-www.key

用于生成CSRF令牌的私钥

sdn/*

软件定义网络(SDN)的共享配置文件

status.cfg

{pve}外部度量服务器配置

storage.cfg

{pve}存储配置

user.cfg

{pve}访问控制配置(用户/组等)

virtual-guest/cpu-models.conf

用于存储自定义CPU模型

vzdump.cron

集群范围内vzdump备份作业计划

符号链接

集群文件系统中的某些目录使用符号链接,以指向节点自己的配置文件。因此,下表中指向的文件在集群的每个节点上都是不同的文件。

local

nodes/<LOCAL_HOST_NAME>

lxc

nodes/<LOCAL_HOST_NAME>/lxc/

openvz

nodes/<LOCAL_HOST_NAME>/openvz/ (deprecated, removed soon)

qemu-server

nodes/<LOCAL_HOST_NAME>/qemu-server/

用于调试的特殊状态文件(JSON)

.version

文件版本(用于检测文件修改)

.members

关于集群成员的信息

.vmlist

所有虚拟机的列表

.clusterlog

集群日志(最后50条条目)

.rrd

RRD数据(最新的条目)

启用/禁用调试

您可以通过以下方式启用详细的syslog消息:

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

并通过以下方式禁用详细的syslog消息:

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

恢复

如果您的 {pve} 主机存在重大问题,例如硬件问题,复制 pmxcfs 数据库文件 /var/lib/pve-cluster/config.db 并将其移动到新的 {pve} 主机可能会有所帮助。在新主机上(没有任何东西运行时),您需要停止 pve-cluster 服务并替换 config.db 文件(需要 0600 的权限)。接着,根据丢失的 {pve} 主机调整 /etc/hostname/etc/hosts,然后重启并进行检查(并且不要忘记您的 VM/CT 数据)。

移除集群配置

推荐的方法是,在您将节点从集群中移除后重新安装该节点。这确保所有秘密的集群/ssh密钥和任何共享的配置数据都被销毁。

在某些情况下,您可能更愿意将一个节点重新置于本地模式,而无需重新安装,这在不重新安装而分离节点中有描述。

从故障节点恢复/移动客户端

对于位于`nodes/<NAME>/qemu-server/(虚拟机)和`nodes/<NAME>/lxc/(容器)中的客户配置文件,{pve}视包含节点`<NAME>`为相应客户的所有者。这一概念使得可以使用本地锁替代昂贵的集群范围锁定,以防止客户配置的并发更改。

因此,如果一个客户机的所有节点发生故障(例如,由于停电、围栏事件等),即使所有磁盘都位于共享存储上,也不可能进行常规迁移,因为无法获取(离线)所有节点上的这种本地锁。对于HA(高可用性)管理的客户机来说,这不是问题,因为{pve}的高可用性堆栈包括了必要的(集群范围内的)锁定和看门狗功能,以确保正确并自动地从被围栏的节点恢复客户机。

如果一个非HA管理的客户机只有共享磁盘(没有其他仅在失效节点上可用的本地资源),可以通过简单地将客户机配置文件从失效节点的`/etc/pve/`目录移动到在线节点的目录(这改变了客户机的逻辑所有者或位置)来手动恢复。

例如,通过在集群的任一成员节点上以root身份运行以下命令,可以从离线的`node1`节点恢复ID为`100`的虚拟机到另一个节点`node2`:

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

Warning
在这样手动恢复一个访客之前,确保失败的源节点确实已经关闭/被隔离。否则,mv 命令将会违反 {pve} 的锁定原则,这可能会导致意想不到的后果。
Warning
拥有本地磁盘(或其他仅在离线节点上可用的本地资源)的客户端无法通过这种方式恢复。您可以等待故障节点重新加入集群,或者从备份中恢复此类客户端。