Proxmox VE 第二块硬盘管理:直通 vs 存储池,别再踩这个坑了

前言

最近给一台双 2T 硬盘的机器装了 Proxmox VE 9,折腾第二块硬盘的过程中踩了不少坑,特别是硬盘直通和挂载的问题,差点搞得虚拟机起不来。今天把整个过程和最终方案整理出来,希望能帮到有同样需求的人。

我的初始操作(错误示范)

机器配置很简单:两块 2T 硬盘。第一块装系统,安装程序自动挂载好了。

第一步:手动挂载第二块硬盘

装完系统后,我手动修改 /etc/fstab 挂载了第二块硬盘,然后在 Proxmox Web 界面的"数据中心→存储"里添加了这块硬盘。

第二步:划分 200G 建虚拟机

我在第二块硬盘上划了 200G 建了一个虚拟机,启动后发现虚拟机里只看到了 200G,剩下的 1.8T 完全没显示。

第三步:直通整块硬盘(灾难的开始)

我想让虚拟机直接管理整块硬盘,于是用了 qm set 命令:

qm set <vmid> -scsi1 /dev/disk/by-id/ata-xxx

然后在虚拟机里 fdisk -l 确实看到了整块硬盘,但我又画蛇添足地去修改虚拟机的 /etc/fstab,用 UUID 挂载了一个目录。结果——重启失败,提示不支持这样的挂载。

问题分析

这个问题的根源在于我对 Proxmox 的存储体系理解不够。核心问题是:

第二块硬盘的归属权到底给谁?

  • 如果给宿主机管理 → 应该用 LVM/ZFS 做成存储池
  • 如果给虚拟机独占 → 应该直通整块硬盘
  • 但不能两头都管,否则必然出问题

正解方案一:LVM 存储池(推荐)

这是 Proxmox 最推荐的方案,适合需要多个虚拟机共享硬盘空间的情况。

清理现场

首先,如果已经在虚拟机里直通了硬盘,先移除:

# 查看虚拟机当前配置
qm config <vmid>

# 移除直通的硬盘(根据实际总线类型调整)
qm set <vmid> --delete scsi1

然后在宿主机上清理硬盘上的旧分区表:

# 确认硬盘设备
lsblk

# 注意:这会清除硬盘上的所有数据!
wipefs -a /dev/sdb

# 也可以用 dd 清空分区表开头
dd if=/dev/zero of=/dev/sdb bs=512 count=1

创建 LVM 物理卷和卷组

# 创建物理卷(直接用整块硬盘,不用分区)
pvcreate /dev/sdb

# 创建卷组,建议命名规范
vgcreate vg_data /dev/sdb

添加 LVM-Thin 存储(推荐!)

LVM-Thin 比普通 LVM 更灵活,支持快照和超额分配:

# 创建 Thin Pool
lvcreate -L 1.9T -n thinpool vg_data -T

然后在 Web 界面添加存储:

  1. 数据中心存储添加LVM-Thin
  2. ID:例如 data-lvm
  3. 卷组:选择刚才创建的 vg_data
  4. Thin pool:thinpool
  5. 节点:选择你的节点

创建虚拟机磁盘

现在创建或编辑虚拟机时:

  1. 硬件添加硬盘
  2. 存储:选择刚才的 data-lvm
  3. 磁盘大小:想给多少给多少,比如 500G
  4. 保存即可

优势

  • 多个虚拟机可以共享这块硬盘
  • 支持快照、克隆
  • 可以随时在线扩容
  • 通过 Web 界面集中管理

正解方案二:整盘直通(适合单虚拟机独占)

如果你确定这块硬盘只给一个虚拟机用,直通性能确实更好。

正确的直通步骤

# 1. 先移除宿主机上的挂载
umount /dev/sdb
# 注释掉 /etc/fstab 中的相关行

# 2. 在 Proxmox Web 界面移除该存储(如果添加过)

# 3. 查看硬盘的 by-id 路径
ls -la /dev/disk/by-id/ | grep -v part

# 4. 直通整块硬盘给虚拟机
qm set <vmid> -scsi2 /dev/disk/by-id/ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M1KJ1234

# 建议加 backup=0 参数,因为 vzdump 无法备份直通盘
qm set <vmid> -scsi2 /dev/disk/by-id/ata-xxx,backup=0

在虚拟机内初始化

# 查看新磁盘
fdisk -l

# 分区(创建整个磁盘的一个分区)
fdisk /dev/sdb  # 虚拟机中看到的设备名
# n → p → 1 → 回车 → 回车 → w

# 格式化
mkfs.ext4 /dev/sdb1

# 获取 UUID
blkid /dev/sdb1

# 创建挂载点
mkdir /mnt/data

# 添加到 fstab(一定要用 UUID!)
echo "UUID=你的UUID /mnt/data ext4 defaults 0 2" >> /etc/fstab

# 测试挂载
mount -a

直通的重要注意事项

  • ❌ 不支持快照和克隆
  • ❌ 不支持在线迁移
  • ❌ 宿主机无法直接管理数据
  • ✅ 性能接近原生
  • ✅ 虚拟机独占控制

方案三:分区直通(多虚拟机共享的折中方案)

如果想用直通但又想分给多个虚拟机,可以分区后分别直通:

# 分区
fdisk /dev/sdb
# n → p → 1 → 回车 → +200G  (第一个分区 200G)
# n → p → 2 → 回车 → 回车     (剩余全给第二个分区)
# w

# 查看分区 ID
ls -la /dev/disk/by-id/

# 分别直通给不同虚拟机
qm set 100 -scsi2 /dev/disk/by-id/ata-xxx-part1
qm set 101 -scsi2 /dev/disk/by-id/ata-xxx-part2

缺点:分区大小固定,后期调整麻烦。一个虚拟机的误操作可能影响同盘其他分区。

三种方案对比

维度LVM-Thin 存储池整盘直通分区直通
多虚拟机共享⚠️ 可以
快照/克隆
在线迁移
性能⚠️ 略有损耗✅ 接近原生✅ 接近原生
管理便捷性✅ Web界面⚠️ 命令行❌ 较复杂
弹性扩容
宿主机监控⚠️ 仅 smartctl⚠️ 仅 smartctl

踩坑总结

坑一:fstab 写错导致虚拟机启动失败

这是最要命的。如果虚拟机的 /etc/fstab 配错了怎么办?

恢复方法

  1. 在 Proxmox Web 界面,把虚拟机的启动顺序改为光盘优先
  2. 挂载一个 Linux Live CD 镜像
  3. 从 Live CD 启动,挂载虚拟机的根分区
  4. 修改 fstab 注释掉错误行
  5. 重启

或者更简单的方法——如果只是挂载项出错,可以在 Proxmox 控制台直接进入单用户模式修复。

坑二:宿主机和虚拟机同时操作同一块硬盘

绝对不要这样干!我在宿主机上挂载了第二块硬盘,又直通给虚拟机,两边都在操作,数据随时可能损坏。

原则:一块硬盘要么归宿主机管,要么归虚拟机管,二选一。

坑三:误以为直通后还能共享

直通的本质是 IOMMU 设备隔离,让虚拟机直接控制物理硬件。这就好比把一把钥匙给了别人,自己就不能再用了。一旦直通,这块硬盘就成了那个虚拟机的专属设备。

坑四:fstab 中用了设备名而不是 UUID

/dev/sdb 这样的设备名在不同启动环境下可能变化。一定要用 blkid 获取 UUID 写入 fstab。

结语

折腾了一圈,最后我选择了 LVM-Thin 存储池方案。原因很简单:

  1. 我的两块 2T 硬盘以后肯定不止跑一个虚拟机
  2. Web 界面管理就是比命令行省心
  3. 快照功能在更新系统前太香了

如果你的场景是 单虚拟机需要独占整块硬盘的极致性能,直通没问题。但大多数情况下,LVM 存储池才是更稳妥的选择。

一句话总结:硬盘直通是"独占",LVM 存储池是"共享"——想清楚需求再下手,少走弯路。

Last modification:May 21st, 2026 at 12:23 am
如果觉得我的文章对你有用,请随意赞赏