上一篇                     
               
			  KVM虚拟机如何添加物理硬盘?
- 物理机
- 2025-06-08
- 3510
 在KVM虚拟机上添加物理硬盘需三步:首先准备并分区物理磁盘;其次编辑虚拟机XML配置文件,添加该物理盘作为存储设备;最后启动虚拟机并挂载新硬盘到指定目录即可使用,无需重启宿主机。
 
KVM虚拟机添加物理磁盘详细指南
为KVM虚拟机扩展存储容量,直接挂载物理磁盘(或分区/LVM卷)是提升性能和隔离性的高效方式,以下提供多种经过验证的可靠方案,请根据环境谨慎选择并操作。
方案一:LVM物理卷 (推荐:灵活管理)
适用于已使用或计划使用LVM的宿主机环境。
-  准备物理磁盘 - 将新物理磁盘插入服务器,或确认已连接但未使用的磁盘(如 /dev/sdb)。
- 使用 lsblk -f或fdisk -l确认磁盘设备路径和状态(无重要分区/数据)。
- (关键) 备份磁盘数据,后续操作将清空磁盘。
 
- 将新物理磁盘插入服务器,或确认已连接但未使用的磁盘(如 
-  ️ 创建LVM物理卷 (PV) - 在宿主机终端执行: sudo pvcreate /dev/sdX # 替换 /dev/sdX 为你的磁盘设备名,如 /dev/sdb 
- 验证创建:sudo pvs
 
- 在宿主机终端执行: 
-  扩展或创建卷组 (VG) - 扩展现有VG (如 vg0):sudo vgextend vg0 /dev/sdX 
- 创建新VG (如 new_vg):sudo vgcreate new_vg /dev/sdX 
- 验证:sudo vgs
 
- 扩展现有VG (如 
-  创建逻辑卷 (LV) - 在目标VG中创建LV (如 new_lv):sudo lvcreate -n new_lv -L 100G new_vg # 创建100G的LV 
- 验证:sudo lvs
 
- 在目标VG中创建LV (如 
-  将LV作为存储附加给虚拟机 - 编辑虚拟机配置文件(通常位于 /etc/libvirt/qemu/vm-name.xml):sudo virsh edit vm-name 
- 在 <devices>部分添加新磁盘设备配置:<disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <!-- 根据性能需求调整cache/io --> <source dev='/dev/new_vg/new_lv'/> <!-- 替换为你的VG/LV路径 --> <target dev='vdb' bus='virtio'/> <!-- 虚拟机内看到的设备名 (如 vdb, vdc) --> <address type='pci' domain='0x0000' bus='0x00' slot='0x0X' function='0x0'/> <!-- 通常libvirt会自动生成 --> </disk> 
- 保存退出(:wqin vi)。
 
- 编辑虚拟机配置文件(通常位于 
-  启动/重启虚拟机  - 启动虚拟机或使其配置生效: sudo virsh start vm-name # 如果未运行 sudo virsh reboot vm-name # 或重启已运行的 
 
- 启动虚拟机或使其配置生效: 
-  ️ 虚拟机内部操作 - 登录虚拟机,使用 lsblk或fdisk -l查看新磁盘(如/dev/vdb)。
- (重要) 分区、格式化并挂载: sudo fdisk /dev/vdb # 创建分区 (可选,也可用整个磁盘) sudo mkfs.ext4 /dev/vdb1 # 格式化分区 (示例ext4) sudo mkdir /mnt/newdisk sudo mount /dev/vdb1 /mnt/newdisk 
- 如需永久挂载,编辑 /etc/fstab添加条目。
 
- 登录虚拟机,使用 
方案二:裸磁盘/分区映射 (直接高效)
将物理磁盘或单个分区直接映射给虚拟机,性能最佳。
-  准备物理磁盘/分区 - 插入磁盘并确认设备路径 (如 /dev/sdb或分区/dev/sdb1)。
- (关键) 备份数据!目标磁盘/分区数据将被覆盖。
- 确保目标设备在宿主机上未被挂载 (umount /dev/sdX1)。
 
- 插入磁盘并确认设备路径 (如 
-  将设备附加给虚拟机 - 编辑虚拟机配置文件 (sudo virsh edit vm-name)。
- 在 <devices>中添加磁盘配置:<disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <source dev='/dev/sdX'/> <!-- 替换为整个磁盘设备路径 (如 /dev/sdb) --> <!-- 或使用分区 --> <!-- <source dev='/dev/sdX1'/> <!-- 替换为分区路径 (如 /dev/sdb1) --> <target dev='vdb' bus='virtio'/> <address type='pci' ... /> </disk> 
- 保存退出。
 
- 编辑虚拟机配置文件 (
-  启动/重启虚拟机 sudo virsh reboot vm-name 
-  ️ 虚拟机内部操作  - 登录虚拟机,识别新磁盘/分区 (lsblk,fdisk -l)。
- 若使用整个磁盘 (/dev/sdb): 需先分区 (fdisk /dev/vdb),然后格式化分区 (mkfs.ext4 /dev/vdb1)。
- 若使用分区 (/dev/sdb1): 虚拟机内看到的是映射后的整个块设备(如/dev/vdb),仍需分区格式化。
- 挂载使用:sudo mount /dev/vdb1 /mnt/newdisk,并更新/etc/fstab。
 
- 登录虚拟机,识别新磁盘/分区 (
方案三:基于文件的镜像 (间接映射)
适用于不方便直接暴露物理设备的场景,性能略低于前两种。
-  创建磁盘镜像文件 sudo dd if=/dev/zero of=/path/to/newdisk.img bs=1M count=102400 # 创建100GB文件 # 或使用更快但稀疏的qcow2 (支持快照、压缩): sudo qemu-img create -f qcow2 /path/to/newdisk.qcow2 100G 
-  将镜像附加给虚拟机 - 编辑配置文件 (sudo virsh edit vm-name)。
- 添加磁盘配置: <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <!-- 或 type='qcow2' 匹配镜像格式 --> <source file='/path/to/newdisk.img'/> <!-- 或 .qcow2 --> <target dev='vdb' bus='virtio'/> <address type='pci' ... /> </disk> 
- 保存退出。
 
- 编辑配置文件 (
-  启动/重启虚拟机 sudo virsh reboot vm-name 
-  ️ 虚拟机内部操作 - 登录虚拟机,识别新磁盘 (lsblk)。
- 分区、格式化、挂载使用(同方案一第7步)。
 
- 登录虚拟机,识别新磁盘 (
方案四:SCSI设备直通 (高级/高性能)
需宿主机内核支持VFIO或PCI直通,适合高性能需求或直接访问特定硬件特性。

️ 注意:此方案较复杂,涉及安全风险(如DMA攻击),建议仅在必要时由专业人员操作,以下简略步骤:
- 绑定设备到VFIO驱动:宿主机上解除原有驱动绑定,绑定到
vfio-pci。- 配置虚拟机XML:使用
<hostdev>标签将整个PCI设备(SCSI控制器或磁盘所在的HBA卡)直通给虚拟机。- 启动虚拟机:虚拟机内将直接看到物理SCSI控制器及其连接的磁盘。
具体步骤需根据硬件和内核版本调整,强烈建议查阅最新官方文档。
通用后续步骤与验证
- 虚拟机内识别:使用 lsblk,fdisk -l,ls -l /dev/disk/by-id/确认新磁盘。
- 分区与格式化:按需使用 fdisk/parted/gdisk分区,mkfs格式化。
- 挂载使用:mount临时挂载,编辑/etc/fstab永久挂载(推荐使用UUID或磁盘ID)。
- 权限管理:确保挂载点有适当用户/组权限。
️ 重要注意事项与最佳实践
- 数据备份:任何磁盘操作前,强制备份宿主机和虚拟机关键数据。
-  卸载检查:确保物理盘/分区在宿主机上未挂载 (df -h,umount若需要)。
-  方案选择: 
  - 追求灵活管理:LVM物理卷 (方案一)。
- 追求极致性能:裸磁盘/分区映射 (方案二) 或 SCSI直通 (方案四)。
- 便捷文件管理:基于文件的镜像 (方案三)。
 
-  驱动程序:bus='virtio'提供最佳性能(需虚拟机安装virtio驱动),Windows虚拟机需提前加载驱动。
-  热添加 (部分支持):较新KVM/libvirt支持运行时添加特定类型磁盘(需预先配置控制器如virtio-scsi),使用 virsh attach-disk命令尝试。
-  配置文件备份:修改虚拟机XML前,建议备份原文件 (virsh dumpxml vm-name > vm-name-backup.xml)。
-  权限与安全:确保 /dev/下设备或镜像文件的权限允许qemu/libvirt-qemu用户访问,SCSI直通需评估安全风险。
方案选择建议
| 场景 | 推荐方案 | 优势 | 注意事项 | 
|---|---|---|---|
| 宿主机使用LVM,需灵活管理 | LVM物理卷 (方案一) | 扩展性强,管理方便 | 需宿主机配置LVM | 
| 追求最高磁盘性能 | 裸磁盘/分区映射 (方案二) | 性能最优,接近原生 | 宿主机无法直接使用该磁盘 | 
| 环境限制,不适合直接暴露物理设备 | 基于文件的镜像 (方案三) | 部署简单,独立于物理设备 | 性能略低,依赖宿主文件系统 | 
| 专业需求,需要直接控制SCSI硬件 | SCSI设备直通 (方案四) | 极致性能,直接访问硬件 | 配置复杂,安全风险高 | 
通过遵循以上步骤和注意事项,您可以安全高效地为KVM虚拟机添加物理磁盘资源,满足业务增长的存储需求,操作时请务必谨慎,确认每一步的输入命令和设备路径,如遇复杂环境,建议在测试环境中验证后再进行生产操作。
引用说明:
- KVM/libvirt 官方文档: https://libvirt.org/formatdomain.html#elementsDisks
- Linux LVM 管理指南:
man lvm(系统手册页)- QEMU 磁盘镜像管理:
man qemu-img- Linux 内核 VFIO 文档: https://www.kernel.org/doc/html/latest/driver-api/vfio.html
如需专业运维支持或更深入的性能调优,请联系我们的技术团队。
 
  
			 
			 
			 
			 
			 
			 
			 
			