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>
- 保存退出(
:wq
in 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
如需专业运维支持或更深入的性能调优,请联系我们的技术团队。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/14889.html