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
文件
|
由票据系统使用的公钥 |
|
Ceph配置文件(注意:/etc/ceph/ceph.conf是指向这个的符号链接) |
|
Corosync集群配置文件(在{pve} 4.x之前,此文件被称为cluster.conf) |
|
{pve}数据中心范围配置(键盘布局、代理等) |
|
{pve}认证域 |
|
应用于所有节点的防火墙配置 |
|
个别节点的防火墙配置 |
|
VM和容器的防火墙配置 |
|
显示CRM当前正在执行的HA操作 |
|
关于集群上HA服务的JSON格式信息 |
|
由高可用性管理的资源及其当前状态 |
|
节点特定配置 |
|
LXC容器的VM配置数据 |
|
在{pve} 4.0之前,用于容器配置数据(已废弃,将很快移除) |
|
`pve-ssl.pem`的私有SSL密钥 |
|
网页服务器的公有SSL证书(由集群CA签名) |
|
`pveproxy-ssl.pem`的私有SSL密钥(可选) |
|
网页服务器的公有SSL证书(链)(`pve-ssl.pem`的可选覆盖) |
|
KVM VMs的VM配置数据 |
|
票据系统使用的私钥 |
|
集群成员的SSH密钥,用于认证 |
|
Ceph认证密钥及相关权限 |
|
用于验证的集群成员SSH密钥 |
|
由各种服务使用的锁文件,以确保安全的集群范围操作 |
|
集群CA的私钥 |
|
PVE Realm用户的阴影密码文件 |
|
包含存储的明文密码 |
|
Base64编码的双因素认证配置 |
|
所有令牌的API令牌秘密 |
|
集群CA的公共证书 |
|
用于生成CSRF令牌的私钥 |
|
软件定义网络(SDN)的共享配置文件 |
|
{pve}外部度量服务器配置 |
|
{pve}存储配置 |
|
{pve}访问控制配置(用户/组等) |
|
用于存储自定义CPU模型 |
|
集群范围内vzdump备份作业计划 |
符号链接
集群文件系统中的某些目录使用符号链接,以指向节点自己的配置文件。因此,下表中指向的文件在集群的每个节点上都是不同的文件。
|
|
|
|
|
|
|
|
用于调试的特殊状态文件(JSON)
|
文件版本(用于检测文件修改) |
|
关于集群成员的信息 |
|
所有虚拟机的列表 |
|
集群日志(最后50条条目) |
|
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
|
拥有本地磁盘(或其他仅在离线节点上可用的本地资源)的客户端无法通过这种方式恢复。您可以等待故障节点重新加入集群,或者从备份中恢复此类客户端。 |