HQY

×

【PVE小知识】你的 PVE 集群 ID 开始乱了吗?

hqy hqy 发表于2026-07-31 00:59:56 浏览157 评论0

抢沙发发表评论

为什么聊这个

玩 PVE 一两个月后,大部分人会遇到一个尴尬场景:

给新容器填 ID 时弹窗提示 "VM 200 already exists",但你看了一圈——不对啊,全集群都没有叫 200 的 VM。去另一台节点一看,哦豁,原来 CT 200 静静躺在那里。

再往后,你会发现更多诡异的事:删了一个 VM 马上想建同 ID 的新机器,报错说被占用了;想把两台独立 PVE 合并成一个集群,加节点时提示 ID 冲突加不进去;或者配执了 HA,发现 HA 资源名居然就是那个三位数的 ID。

这就是 PVE 里 ID 机制最容易踩的各种坑。

这篇文章不扯大道理,把 PVE 虚拟机 ID(VMID)的底层逻辑、你以为你知道但实际不知道的规则、实战中的坑、以及如何从一开始就规划好——一次性说透。

一、ID 到底是什么?10 句话说清楚

先打地基。PVE 里的 ID 不是"随便填个数字"那么简单,它有明确的规则:

1. 基本规则

  • • PVE 里虚拟机叫 VM(QEMU/KVM),容器叫 CT(LXC),两者统称"guest"
  • • 每个 guest 必须有一个正整数 ID
  • • 默认范围 100-999999999(9 亿多,没人用到头)
  • • ID 1-99 系统保留,Web 界面和命令行创建 guest 时不提示

2. VM 和 CT 共享同一个 ID 池

这是最容易被新手忽略的底层规则。

很多虚拟化平台把 VM 和 CT 的 ID 池分开管理。但 PVE 不是。它只有一个集群级别的编号空间。ID 100 如果被一个 VM 占了,你再建 CT 100 就是冲突。

为什么这么设计? 因为 PVE 底层对 VM 和 CT 的配置管理用的是同一套文件系统逻辑。pmxcfs(Proxmox Cluster File System)下的 /etc/pve/nodes/<node>/qemu-server/ 存 VM 配置,/etc/pve/nodes/<node>/lxc/ 存 CT 配置,但这两者的 ID 查询走的是同一个锁机制和 .vmlist 索引。如果允许重复,pmxcfs 的锁系统会炸。

3. 集群全局唯一,不是单节点专属

这是第二个关键点。

你在 PVE节点上建了 ID 200 的 VM,这个 ID 200 的条目会出现在所有节点的 /etc/pve/.vmlist 里。你在 PVE节点上想建 ID 200 的 LXC?门都没有——它去读 .vmlist,发现 200 已经被占了,直接拒绝创建。

场景
结果
同一节点建不同 ID
✅ 正常
不同节点建不同 ID
✅ 正常
同一节点建相同 ID
❌ 冲突
不同节点建相同 ID(VM 对 VM)
❌ 冲突
不同节点建相同 ID(VM 对 CT)
❌ 冲突

4. ID 可以不是数值

严格来说,vm.conf 里的 ID 字段是正整数,这是硬性规定。但 qm create 和 pct create 也支持字符串形式的 ID 吗?答案:不支持。ID 必须是 100-999999999 的整数。

5. 创建时 ID 是必填的

Web 界面创建 VM 或 CT 时,ID 字段不是自动生成的——它给了一个默认值(当前最大 ID + 1),但你可以改。这个默认值是你填的时候它自动找的一个空闲号,但不是 100% 可靠,因为它可能没考虑到其他节点刚删掉的 guest。

6. ID 和配置文件的对应关系

每个 guest 的配置文件路径直接包含 ID:

# VM 配置文件
 /etc/pve/nodes/PVE节点/qemu-server/100.conf
 /etc/pve/nodes/PVE节点/qemu-server/101.conf

 # CT 配置文件
 /etc/pve/nodes/PVE节点/lxc/100.conf
 /etc/pve/nodes/PVE节点/lxc/101.conf

注意:VM 和 CT 同 ID 的情况下,文件名都是 100.conf,但放在不同目录下(qemu-server 和 lxc),所以不会直接冲突——但 .vmlist 的索引会。

7. .vmlist 是什么

/etc/pve/.vmlist 是一个 JSON 格式的集群索引文件,记录了全集群所有 guest 的 ID 和状态。它在 pmxcfs 里自动维护,类似于数据库的主键索引。

一个简化版 .vmlist 结构:

{
"version":6,
"ids":{
"100":{"node":"PVE节点","type":"qemu","version":10},
"101":{"node":"PVE节点","type":"lxc","version":3}
}
}

当你创建新 guest,PVE 先读 .vmlist 检查 ID 是否被占,然后写配置、更新 .vmlist。PMXCFS 将变更同步到所有节点。

这就是为什么 ID 冲突检查是在集群层面做的,不是单节点层面。

二、先讲五个实战坑,每个我都见过

坑 1:VM 和 CT 的 ID 会「抢车位」

场景:

你的集群是这个架构:

  • • PVE节点:VM 100(GitLab 服务器,一直在跑)
  • • PVE节点:没有 100 号 guest
  • • PVE节点:没有 100 号 guest

一个月后,你在 PVE节点上建一个 LXC 容器,习惯性地填了 100(因为界面默认提示 100)。点击创建,弹窗:

VMID 100 already in use on node 'PVE节点'

为什么?

100 这个 ID 在 .vmlist 里的 owner 节点是 PVE节点,类型是 qemu(VM)。它的全局标记是"已分配"——不管你建的是 VM 还是 CT,不管是哪个节点,只要 100 在索引里,全集群就不能再用。

怎么解决?

方案一:填一个更大的 ID,比如 200。
方案二:如果你非得用 100,那就先删 PVE节点上的 VM 100(前提是你确认不再需要它),pmxcfs 同步后再建。

怎么提前避免?

给 CT 预分配 1000+ 的段(后面规划章节详述)。

坑 2:ID 删了但还不能马上用

场景:

你有一个实验用的 VM 105,用完删掉了(Destroy → 勾选 Purge)。过了 30 秒,想在同节点建一个新 VM,填 105,弹窗:

VMID 105 already in use

你怎么想?

"删都删了,怎么还提示占用?PVE 没同步吧?"

原因分析:

这里面有两个原因:

原因①:pmxcfs 同步延迟

PVE 的集群文件系统 pmxcfs 是 corosync 上层构建的。当你删一个 guest,本节点的配置文件和 .vmlist 立即更新,但其他节点要等 pmxcfs 的全量同步周期。在同步周期内,如果本节点尝试建同名 ID,查 .vmlist 时发现索引还在(因为本节点的删除操作还没写入最新版本到 pmxcfs 的 master 副本),就会报冲突。

等 30-60 秒再试是变通方案,但不是根本解。

原因②:配置锁文件残留

有时候 deletion 操作被中断(Web 超时、SSH 断开),锁文件没清干净。检查:

ls -la /etc/pve/nodes/*/lock/

如果找到 .vmlist.lock 或 <vmid>.lock 之类的残留文件,手动清掉:

rm -f /etc/pve/nodes/*/lock/*.lock

怎么确认 ID 确实空闲了?

不要靠"感觉",用命令确认:

# 检查 VM
 qm status <VMID> 2>&1
 # 输出示例:VM 105 not found → 空闲

 # 检查 CT
 pct status <VMID> 2>&1
 # 输出示例:CT 105 not found → 空闲

 # 全集群资源查询
 pvesh get /cluster/resources --type vm
 # 看返回列表里有没有你要的 ID

只有 qm status 和 pct status 都返回 "not found",这个 ID 才是真空闲了。

坑 3:ID 定了就不好改了

这是 PVE 最让人抓狂的地方。

场景:

你建了一个 VM 100,发现它刚好和某个上下游系统的编号规则冲突,想改成 200。

PVE 没有提供 "rename VMID" 的功能。

Web 界面不支持。CLI 也不支持。你需要手动操作。

手动改 ID 的完整步骤:

步骤 1:关闭目标 VM

qm stop <旧ID>

步骤 2:复制/重命名配置文件

cp /etc/pve/nodes/PVE节点/qemu-server/<旧ID>.conf \
    /etc/pve/nodes/PVE节点/qemu-server/<新ID>.conf

步骤 3:修改新配置文件内容(如果有引用旧 ID 的地方,改掉)

步骤 4:删除旧配置文件

rm /etc/pve/nodes/PVE节点/qemu-server/<旧ID>.conf

步骤 5:更新 .vmlist

# 不行,.vmlist 是 pmxcfs 自动维护的,不能手动改
 # 你需要重启 pmxcfs 或等待同步

步骤 6:启动新 ID 的 VM

qm start <新ID>

但问题远没结束。

ID 不只是写在配置文件里。它还写在这里:

位置
影响
改 ID 后
网络接口名
tap100i0
 vs tap200i0
tap 名变了,防火墙规则引用旧名全废
ZFS zvol
rpool/data/vm-100-disk-0
磁盘卷名不变,但配置文件找不到
备份文件名
vzdump-qemu-100-20260728.tar.zst
备份名称不对应,恢复时无法自动匹配
快照引用
VM 快照中的磁盘引用含旧 ID
快照可能损坏
HA 配置
HA 资源的名称是 VMID
HA 失效,需重建
备份任务
定时备份任务引用旧 ID
备份任务找不到 guest
权限配置
ACL 中的 path 引用旧 ID
权限失效
标签/注释
用户自定义的备注可能含 ID
手动改

一句话:改 ID ≈ 重建。

在决定改之前先算一下:要修的引用点有多少?有时间吗?能承受出故障的风险吗?

大部分情况下,答案都是:不要改旧 ID,从现在开始用新 ID 规则建新的 guest。 旧的保持原样,让你看着难受但至少是稳定的。

坑 4:ID 1-99 去哪了

Web 界面创建 VM 时,ID 下拉框默认最小值是 100。1-99 去哪了?

系统保留段。

PVE 官方保留 1-99 给内部用途和未来扩展。具体说:

  • • ID 1-9:内部使用,可能用于 PVE 自身的特殊资源
  • • ID 10-49:QEMU/KVM 保留
  • • ID 50-99:LXC 保留

但这不是硬性锁死的。

你可以:

# 查看当前最小 ID
 pvesh get /cluster/options | grep vmid-range

 # 改小它
 pvesh set /cluster/options --vmid-range-start 50

改成 50 之后,你就可以创建 50-99 的 guest。

但官方强烈不建议这么做。 原因:

  1. 1. PMXCFS 内部的一些隐式假设可能依赖 1-99 为空
  2. 2. PVE 升级时,新版本可能用 1-99 段做新功能
  3. 3. 低 ID 有可能和系统 PID 混淆(虽然概率极低)

99.99% 的人不需要用到 1-99。你的正常需求 100 起步完全够用。

坑 5:两台独立 PVE 合并成一个集群时的 ID 冲突

场景:

你有两套独立部署的 PVE:

  • • 节点 A(单节点):有 VM 101, 102, 103
  • • 节点 B(单节点):有 VM 101, 104, 105

想合集群,执行:

pvecm add <节点A的IP>

然后弹窗:

can't add node: conflict in VMID 101
     both nodes have a guest with ID 101

为什么会冲突?

因为 PVE 合并集群时,也会检查 .vmlist——目标集群的 .vmlist 里没有 101,但来的 nodes 上配执文件里有 ID 101 的 guest。pmxcfs 要做全量合并,发现 ID 冲突,直接拒绝。

怎么解决?

方法 1(推荐):合集群之前,把冲突的 guest 的 ID 改掉
方法 2:退出其中一台节点的集群,把冲突 guest 删了再加入

根本教训: 如果计划最终要合并集群,一开始就统一 ID 规划,别自己玩自己的。

三、ID 决定了什么?比你想象的要多得多

一个三位数的编号,背后关联了一堆东西。

1. 配置文件文件名

一个 VM 的所有配置保存在:

/etc/pve/nodes/PVE节点/qemu-server/<VMID>.conf

一个 CT 的配置保存在:

/etc/pve/nodes/PVE节点/lxc/<VMID>.conf

文件名就是 ID。

2. 网络接口名

当你启动一个 VM,PVE 会在主机上创建 TAP 设备:

tap<VMID>i<序号>

例如 VM 100 的第一个网卡(net0)叫 tap100i0。第二个网卡叫 tap100i1

CT 也一样,不过用的是 veth:

veth<CTID>i<序号>

CT 200 的第一个网卡叫 veth200i0

这意味着什么?

如果你在主机上用防火墙规则、tc 限速、iptables 规则引用了这些接口名,那么改 ID 后这些规则全失效。

例子:

# 针对 VM 100 的限速规则(旧)
 tc qdisc add dev tap100i0 root handle 1: htb default 30

 # 如果 ID 改成 200,tap100i0 不存在了,规则报错

3. 存储卷名

PVE 的存储后端——无论 ZFS、LVM、LVM-thin 还是目录——在创建磁盘时都会把 ID 编入卷名。

ZFS:

rpool/data/vm-<VMID>-disk-<序号>

例如 rpool/data/vm-100-disk-0vm-100-disk-1

LVM

pve/vm-<VMID>-disk-<序号>

目录存储:

/images/<VMID>/vm-<VMID>-disk-<序号>.raw

如果你用 ZFS,快照名也是基于卷名的:

rpool/data/vm-100-disk-0@snap-20260728

改 ID 后: 卷名不变(因为卷是物理存在的),但新的配置文件引用新 ID,指向的卷名是新 ID 格式的——找不到旧卷,启动时提示磁盘未找到。

4. 备份文件名

vzdump 创建的备份文件命名规则:

vzdump-<类型>-<VMID>-<时间戳>.<格式>

类型有两种:

  • • qemu(VM 备份)
  • • lxc(CT 备份)

例如:

vzdump-qemu-100-2026_07_28-01_00_00.tar.zst
 vzdump-lxc-200-2026_07_28-02_00_00.tar.zst

恢复时的匹配规则:pct restore 和 qm restore 会从备份文件名中解析原始 ID。如果你想恢复到不同的 ID,可以指定:

pct restore <新ID> <备份文件路径> --unique true

但这个操作会全部重建磁盘,时间取决于备份大小。

5. 模板和克隆

PVE 模板(Template)的本质是一个被标记为模板的 VM/CT,其 ID 也是普通 ID。

# 从模板克隆
 qm clone <模板ID> <新VMID> --name xxx

 # 从模板创建 CT
 pct create <新CTID> <模板路径>

克隆后,新 guest 的磁盘卷名会用新 ID,但模板本身还是旧 ID。如果你误删了模板的 ID 空间,所有基于它的克隆都会丢失来源。

6. HA 资源

配置 HA(High Availability)时,HA 资源的名称就是 VMID:

pvesh create /cluster/ha/resources --sid vm:<VMID>

HA 管理器通过 VMID 来识别哪个 guest 要在集群里自动迁移。改 ID 后,HA 配置里的 sid 字段也要改——相当于重建。

7. 定时备份任务

PVE 的备份任务配置里勾选的是 guest 的 ID:

# /etc/pve/vzdump.cron
 # 定时备份 ID 100 和 101
 100 101

如果你改了 ID,备份任务里的 ID 列表也得更新。

8. 权限/ACL

PVE 的 ACL(访问控制列表)路径使用 ID:

# 给用户 buladou 赋予 VM 100 的权限
 pvesh set /access/acl \
   --path /vms/100 \
   --users buladou \
   --role PVEVMUser

改 ID 后,/vms/100 这个路径变成了不存在,权限自动失效。

9. 标签和注释

你在 Web 界面里给 VM 加的标签和注释是写在配置文件里的,不会自动改。

四、一张图看懂 ID 关联性

                      ┌─────────────┐
                       │   VMID 100  │
                       └──────┬──────┘
                              │
           ┌──────────────────┼──────────────────┐
           │                  │                   │
           ▼                  ▼                   ▼
    ┌────────────┐    ┌─────────────┐    ┌──────────────┐
    │ 配置文件   │    │ TAP 接口名  │    │ ZFS zvol     │
    │ 100.conf   │    │ tap100i0    │    │ vm-100-disk-0│
    └────────────┘    └─────────────┘    └──────────────┘
           │                  │                   │
           ▼                  ▼                   ▼
    ┌────────────┐    ┌─────────────┐    ┌──────────────┐
    │ 备份文件名 │    │ 防火墙规则  │    │ 快照名       │
    │ qemu-100   │    │ tap100i0    │    │ vm-100-disk-0│
    └────────────┘    └─────────────┘    └─────┬────────┘
                                               │
           ┌───────────────────────────────────┼───────┐
           │                   │                       │
           ▼                   ▼                       ▼
    ┌──────────────┐  ┌──────────────┐       ┌──────────────┐
    │ HA 配置      │  │ 定时备份     │       │ ACL 权限     │
    │ vm:100       │  │ 选择 100     │       │ /vms/100     │
    └──────────────┘  └──────────────┘       └──────────────┘

结论很残酷: PVE 把 ID 当做一个全局主键扩散到了系统的每个角落。所以改一个 ID 的成本不是改一个文件,是改九个不同的东西。

五、ID 的规划方案(附可直接抄的配置)

与其等 ID 乱成一锅粥再后悔,不如从一开始就规划好。下面是几种实战中验证过的方案。

方案 1:按节点分段(推荐多节点集群)

把全集群的 ID 空间按节点划分:

节点
ID 区间
用途
PVE节点
100-199
主节点跑核心服务
PVE节点
200-299
辅助节点
PVE节点
300-399
计算节点

优点:

  • • 一眼看出 guest 在哪个节点 
  • • 适合 3-5 节点集群 
  • • 排故障时特别好用——看到 ID 310,不用查就知道在 PVE节点缺点:
  • • 每个节点只有 100 个名额,大集群不够用 
  • • VM 和 CT 共享,仍有冲突风险 

变体: 如果节点数多于 10 个,用百位段映射:

  • • PVE节点:100-199
  • • PVE节点:200-299
  • • PVE节点:300-399
  • • node04:400-499
  • • ...
  • • node10:1000-1099

方案 2:按功能类型分组

把你的 guest 按功能分到不同的区间:

功能
ID 区间
例子
基础服务
100-199
DNS、DHCP、Nginx、监控、VPN
数据库
200-249
MySQL、PostgreSQL、Redis
开发测试
300-399
GitLab、Jenkins、开发环境
用户实验
500-599
给团队成员的实验 VM
临时环境
900-999
用完就删

优点:

  • • 看到 ID 就知道 guest 是干什么的
  • • 适合功能固定的生产集群

缺点:

  • • 需要预先规划好区间大小
  • • 如果某类功能膨胀,区间可能不够

方案 3:VM / CT 分段(最简单的方案)

这是解决「VM 和 CT 抢 ID」问题的最直接方法:

类型
ID 区间
VM
100-999
CT
1000-1999

优点:

  • • 一劳永逸解决 VM/CT 冲突
  • • 看到 4 位数就知道是 CT,3 位数是 VM
  • • 不需要复杂规划

缺点:

  • • 不能区分节点归属
  • • 1000 以上 ID 在 Web 界面输入时多打一位

方案 4:IP 尾号映射

适合有固定 IP 规划的集群。

把 guest 的 PVE ID 映射到它的 IP 地址尾号:

guest IP 内网IP → CT ID 148
 guest IP 内网IP → VM ID 168
 guest IP 内网IP → VM ID 178

优点:

  • • 看到 veth148i0 就知道这个容器的 IP 是 .48
  • • SSH 时不需要查映射表
  • • 排故障时网络和配执对应

缺点:

  • • IP 尾号是两位数时 OK,如果是三位数(如 .200),ID 就变成 1200,区间乱了
  • • 同一节点多个 guest 同 IP 段时冲突

方案 5:推荐组合(小集群首选)

综合方案 1 和 3,最适合 3 节点以内的小集群

节点
VM 区间
CT 区间
PVE节点
100-199
1100-1199
PVE节点
200-299
1200-1299
PVE节点
300-399
1300-1399

识别规则:

  • • 3 位数 → VM
  • • 4 位数且百位 = 节点段 → CT

看到 1305:

  1. 1. 4 位数 → 是 CT
  2. 2. 百位是 3 → 在 PVE节点上

不需要查任何文档。

变体(大集群推荐):

如果节点超过 10 个,把百位换成千位:

  • • PVE节点VM:100-199,CT:1100-1199
  • • PVE节点VM:200-299,CT:1200-1299
  • • ...(最多 9 个节点)
  • • node10 VM:1000-1099,CT:2000-2099

我的建议:

如果你是刚建集群,直接套方案 5。如果已经建了一半但 guest 还不多(少于 20 个),可以考虑在 ID 乱之前重置一下 ID 分配,按规则重建。

如果已经 50+ 个 guest 在上面跑了——别动了,从现在开始按规则建新的就行。

六、已经乱了怎么办?(高情商处理指南)

最诚实的答案:不要改旧 ID,从现在开始规划新 guest。

强行修正已经跑了很久的 VM 的 ID,收益远小于代价——改 3 台有快照、定时备份、防火墙规则的 VM 可能花一下午,而唯一的收获是"整齐了"。

但如果你实在忍不了(比如 ID 已经完全按随机数走了,配置文件里都是 100、101、102、103 完全看不出规律),可以参考这个迁移流程:

方案 A:推荐方案——冷迁移

  1. 1. 备份所有 guest
  2. 2. 删除旧 guest
  3. 3. 用新 ID 还原
# 备份
 vzdump 100 101 102 103 --mode snapshot --compress zstd

 # 删除旧 guest
 qm destroy 100
 qm destroy 101

 # 用新 ID 还原(REST 到不同 ID)
 qmrestore /var/lib/vz/dump/vzdump-qemu-100-20260728.tar.zst 1000 --unique true
 qmrestore /var/lib/vz/dump/vzdump-qemu-101-20260728.tar.zst 2000 --unique true

注意事项:

  • • --unique true 会重新生成网卡 MAC(有些场景可能需要)
  • • 还原后检查网络配置是否正确
  • • 防火墙规则需要重新应用(因为 tap 接口名变了)

方案 B:激进方案——直接改配置文件

适合没有备份需求的实验环境:

# 停 guest
 qm stop 100

 # 复制配置
 cp /etc/pve/nodes/PVE节点/qemu-server/100.conf \
    /etc/pve/nodes/PVE节点/qemu-server/1000.conf

 # 改新配置里的任何硬编码引用(一般没有)
 # 删旧配置
 rm /etc/pve/nodes/PVE节点/qemu-server/100.conf

 # 重启但是...磁盘名对不上
 # 假设卷原本是 vm-100-disk-0,配置文件里写的是 scsi0: local-zfs:vm-100-disk-0
 # 不改卷名的前提下,配置里的卷引用还是指向 vm-100-disk-0
 # 所以配置文件不需要改磁盘名
 # 但 HA 配置、备份任务就要手动改

 # 启动
 qm start 1000

注意: 这个方法只改了配置文件命名,磁盘卷名不变。因为 vm-100-disk-0 这个 ZFS zvol 还是存在的,配置里引用的也是这个卷名,所以只是配置文件名变了。但备份文件的命名、备份任务、HA 配置的引用——这些才是真正要手动改的地方。

方案 C:认怂方案

不改旧 ID,从现在开始按规则编号。

在所有节点上建一个共享文档(或者 memos 里记一下),记下当前 ID 占用情况和未来的规则:

# 示例:PVE节点的 ID 分配表
 # VM 100-149 已用
 # VM 150-199 空闲(留给新 VM)
 # CT 1100-1199 空闲

 # 当前占用
 # VM 100 - GitLab
 # VM 101 - Nginx 网关
 # CT 102 - DNS(错误的命名,但不动了)

建一个新的 guest 时,查一下这个文档,找到空闲段第一个可用 ID。坚持一个月,ID 混乱问题自然就解决了(旧的虽然乱,但新的有规则)。


选方案 C 吧。真的。

七、ID 相关命令速查

操作
命令
查看最小 ID 限制
pvesh get /cluster/options | grep vmid-range
修改最小 ID
pvesh set /cluster/options --vmid-range-start <数字>
查看全集群 guest 占用
pvesh get /cluster/resources --type vm
查看某节点 VM 列表
pvesh get /nodes/<节点名>/qemu-server
查看某节点 CT 列表
pvesh get /nodes/<节点名>/lxc
检查指定 ID 是否被 VM 占用
qm status <ID>
检查指定 ID 是否被 CT 占用
pct status <ID>
查看 .vmlist
cat /etc/pve/.vmlist
查看配置锁状态
ls -la /etc/pve/nodes/*/lock/
检查 ID 在 HA 中
pvesh get /cluster/ha/resources | grep vm:<ID>
查找备份文件中的 ID
ls -l /var/lib/vz/dump/ | grep <ID>

八、一些容易被忽略的细节

细节 1:导入 OVF/OVA 时的 ID

当你用 qm importovf 或 qm importovf 导入外部 VM 时,可以指定 ID 也可以自动分配。自动分配的策略是:找当前最大 ID + 1。

但如果你导入的 OVF 原本就包含其他 ID 信息(比如 VMware 的 BIOS UUID),PVE 不会自动保留它。PVE 只用自己的 ID 体系。

细节 2:ID 和 numa 的关联

如果你给 VM 配了 NUMA,NUMA 的拓扑节点编号也用到 VMID。比如 VM 100 的 NUMA 节点在 host-numa-node 配置里会引用。

细节 3:ID 不能用来排序

ID 的大小不代表创建顺序。你可以先建 1000 再建 100。PVE 的默认值只是找空闲 ID,不是严格递增的。

所以别看到 ID 就以为是创建顺序。

细节 4:锁住 ID 防止误删

如果你有一个金贵的 guest,可以在配置里加个注释:

# /etc/pve/nodes/PVE节点/qemu-server/100.conf
 # DO NOT DELETE - Production GitLab

也可以用 PVE 的权限系统,给 guest 加一个 tag 或者用 ACL 防止非管理员删除。

但 PVE 没有原生的 "Pin VMID" 功能。如果你删了再重建,ID 就会被释放。

细节 5:批量创建时的 ID 递增

用脚本批量创建 guest 时,很多人习惯:

for i in $(seq 100 110); do
     qm create $i ...
 done

这很简单直接。但如果你提前规划了 ID 段,直接用循环就行了,不需要每次都查空闲 ID。


一句: PVE 的 ID 规划不用太复杂,但要趁早。你不提前分好段,PVE 就帮你随机分配——到时候满屏的 100、101、102,看配置文件都不知道谁是谁。挑一个方案执行起来,5 分钟能解决后面 50 次的「占用了」提示。


打赏

本文链接:https://www.kinber.cn/post/6736.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客