虚拟机硬盘映射的本质,是把物理磁盘、磁盘分区或磁盘镜像文件直接暴露给虚拟机(或反向暴露给宿主机)当作一块硬盘来读写。实现路径主要有三条:物理磁盘直通映射、镜像文件挂载、虚拟机磁盘反向挂载,选哪条取决于你的虚拟化平台和最终用途。
硬盘映射之前,先弄清映射了什么
虚拟机的硬盘并不是一块"真盘",而是一个文件VMware 用 vmdk,Hyper-V 用 vhd/vhdx,KVM 和 VirtualBox 常用 qcow2,追求性能的会用 raw 裸格式,所谓映射,就是把"文件"和"物理设备"之间的那层隔板打通,方向通常有两种:
- 正向映射:把宿主机的一块物理硬盘或分区,直接交给虚拟机当系统盘或数据盘用,虚拟机里看到的是真实扇区。
- 反向映射:把虚拟机的磁盘文件挂到宿主机上,让宿主机像插了 U 盘一样读取里面的分区,常用于数据恢复、离线取证、系统迁移。
这两种方向的操作命令完全不同,混淆了就容易出现"盘符认不出""分区表损坏"这类问题,下面按平台给具体步骤。
虚拟机硬盘映射怎么设置:三条路径的具体操作
物理磁盘直通映射(以 VirtualBox、VMware 为例)
VirtualBox 的做法是先用命令行生成一个指向物理磁盘的 vmdk 描述文件,再挂到虚拟机上,Windows 宿主机管理员权限打开 CMD:
VBoxManage internalcommands listhostdisks
VBoxManage internalcommands createrawvmdk -filename D:\raw\disk1.vmdk -rawdisk \\.\PhysicalDrive1
Linux 宿主机则是:
VBoxManage internalcommands createrawvmdk -filename ~/raw/disk1.vmdk -rawdisk /dev/sdb
生成后在虚拟机的存储设置里添加这块 vmdk 即可,VMware Workstation 走的是"虚拟机设置添加硬盘使用物理磁盘"的图形路径,本质同样是生成一个映射描述文件,真正的数据仍然落在物理盘上。
镜像文件挂载到宿主机
这是做数据恢复和故障排查时最常用的一招,Linux 下用 qemu-nbd 挂载 qcow2:
sudo modprobe nbd max_part=16
sudo qemu-nbd --connect=/dev/nbd0 /data/vm/disk.qcow2
sudo fdisk -l /dev/nbd0
sudo mount -o ro /dev/nbd0p1 /mnt/vmdisk
用完记得反顺序卸载:
sudo umount /mnt/vmdisk
sudo qemu-nbd --disconnect /dev/nbd0
如果是 raw 格式,用 losetup 更直接:sudo losetup -f -P --show disk.raw,系统会自动识别分区并生成 /dev/loopXpN 设备,Windows 侧可以用 diskpart 的 select vdisk file="D:\vm\disk.vhdx" 加 attach vdisk readonly 以只读方式挂载。
把虚拟机磁盘反向映射成宿主机可见分区
这一步和路径二其实是同一套操作,区别在于挂载后是否写入,行业共识认为,凡是对生产虚拟机的磁盘做反向挂载,都应该加只读参数,因为宿主机上的文件系统驱动和虚拟机里的驱动版本不一致时,写操作很容易把分区写坏。
VMware虚拟机硬盘映射与直接挂载区别
很多人把这两个概念混着用,实际差异不小,用一张表看清:
| 对比项 | 物理磁盘直通映射 | 镜像文件挂载 |
|---|---|---|
| 映射对象 | 整块物理盘或分区 | vmdk/qcow2/vhd 文件 |
| 宿主机能否同时访问 | 不能,需独占 | 可以,但建议只读 |
| 快照支持 | 虚拟机内快照可用,宿主机快照无效 | 可配合存储层快照 |
| 迁移便利性 | 差,绑定硬件 | 好,文件可直接拷贝 |
| 典型用途 | 数据库裸设备、性能敏感业务 | 备份校验、数据恢复、离线分析 |
简单说,直通映射图的是性能和"真盘感",镜像挂载图的是灵活和安全,做测试环境验证时用后者,跑 IO 密集型业务才考虑前者。
虚拟机磁盘映射会影响性能吗
会,而且差异主要来自三个环节,业内专家指出,虚拟化层的 IO 路径每多一层转换,延迟就会增加一点,直通映射绕过了虚拟磁盘格式的元数据寻址,理论上最接近物理盘性能;qcow2 因为有写时复制和元数据更新,随机写场景下开销更明显;raw 格式相当于裸文件,性能接近直通,但不支持快照和动态扩容。
实际感受还取决于缓存策略,把虚拟机的磁盘缓存设为"直写"(write-through)更安全但更慢,设为"回写"(write-back)快,但宿主机断电有丢数据风险,生产环境通常建议数据库盘用直写,普通文件盘用回写。
企业内网虚拟机硬盘映射配置步骤与注意事项
中小企业做老系统迁移时,最常遇到"物理服务器拆下来的盘要塞进虚拟机读数据"这种活,按下面的顺序走,能避开大部分坑:
- 确认分区表类型:GPT 盘和 MBR 盘在部分旧版虚拟化平台上识别表现不同,先在宿主机用
fdisk -l或磁盘管理看清楚。 - 只读挂载优先:用
mount -o ro或 Windows 的 attach readonly,先确认数据完整,再决定是否写入。 - 记录设备编号:物理盘直通后,虚拟机里的盘符可能和预期不一致,Linux 下用 UUID 挂载更稳妥,别写死 /dev/sdb。
- 关闭宿主机对该盘的自动挂载:否则宿主机先挂上,虚拟机启动时就会报"设备被占用"。
- 提前做快照或镜像备份:映射操作本身不改数据,但后续的误操作会改。
- 注意动态磁盘和存储池:Windows 动态磁盘、带 Storage Spaces 的盘,直通给 Linux 虚拟机基本读不出来,需要先转换或导出。
如果宿主机是 Windows Server 且开了 Hyper-V,VMware 的物理磁盘直通会受 Hyper-V 独占硬件的影响,需要先关闭 Hyper-V 相关功能再试。
云服务器虚拟机硬盘映射要额外收费吗
云上其实很少叫"映射",对应的是挂载云硬盘、挂载快照、或把对象存储挂成本地盘,计费逻辑和本地虚拟化完全不同:云硬盘按容量和性能等级计费,快照按实际占用容量计费,跨可用区挂载有的平台会额外收流量或功能费,多数情况下,云盘挂载本身不单独收费,钱花在盘和快照上;但把云盘挂到不同可用区的实例,部分厂商会限制或加价,上云前最好在计费文档里确认"挂载"和"跨区"两个词,别只看硬盘单价。
映射操作中最容易踩的几个坑
- 宿主机和虚拟机同时写同一块盘:文件系统直接损坏,恢复成本极高。
- 用可写方式挂载 NTFS 盘:Linux 的 ntfs-3g 驱动在异常断电时可能留下日志不一致。
- 忘记断开 nbd 设备:qcow2 文件被占用,虚拟机无法启动。
- 直通盘做了虚拟机快照:回滚时物理盘内容不会跟着回滚,数据状态对不上。
- 盘符漂移:Windows 虚拟机里新增映射盘后,原有数据盘盘符可能变化,依赖盘符的服务会启动失败。
关于虚拟机硬盘映射的常见问题
问:映射之后,宿主机还能正常读写这块物理盘吗?
答:物理磁盘直通模式下不建议这么做,虚拟机会独占该设备的写入通道,宿主机再挂载容易出现双写冲突,轻则分区报错,重则文件系统损坏,需要两边都能看,请改用镜像文件挂载并加只读参数。
问:虚拟机磁盘映射和快照能一起用吗?
答:镜像文件挂载可以配合存储层快照使用,直通映射则要谨慎,快照记录的是虚拟磁盘文件的状态,物理盘不在快照范围内,回滚后虚拟机和物理盘的数据会对不上,所以做直通映射的虚拟机一般不依赖快照做数据保护。
问:把 vmdk 映射到另一台机器上能直接启动吗?
答:能不能启动取决于虚拟硬件是否兼容,而不是映射本身,vmdk 文件可以拷到另一台宿主机挂载读取,但直接开机常因虚拟网卡型号、磁盘控制器类型(IDE 与 SCSI)不同而蓝屏或进不了系统,需要先调整虚拟机硬件配置或做驱动适配。
虚拟机硬盘映射说到底是一项"权限交接"操作:把一块盘的控制权从宿主机交给虚拟机,或者反过来,路径选对、只读起步、备份先行,这三条守住了,映射本身几乎不会出问题。