kvm
sudo apt install qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager
sudo apt install python3-libvirt
sudo systemctl enable libvirtd
sudo adduser $USER libvirt
sudo adduser $USER kvm
sudo usermod -aG kvm $USERsudo usermod -aG libvirt
$(whoami)# 验证用户是否加入组中
$ id $(whoami)
sudo virsh net-define /path/to/network.xml # 定义网络配置文件路径
sudo virsh net-start yournetworkname # 启动网络
sudo virsh net-autostart yournetworkname # 设置网络开机自启、
<network>
<name>yournetworkname</name>
<bridge name='virbr1'/>
<forward mode='bridge'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
kvm 硬盘直通
virsh edit kvm-name
可以看到指定虚拟机的配置 xml 文件
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source dev='/dev/sda'/>
<target dev='sdb' bus='sata'/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source dev='/dev/sdb'/>
<target dev='sdc' bus='sata'/>
<address type='drive' controller='0' bus='0' target='0' unit='2'/>
</disk>
<!-- 在虚拟机XML配置中添加 -->
<cpu mode='host-passthrough'/>
启用硬件加速
确保KVM虚拟化扩展已启用:
性能优化
启用virtio驱动提升磁盘和网络性能。
使用SPICE协议替代VNC以获得更好的图形体验
使用多队列网络
对于网络密集型应用,启用多队列网络可以提高网络吞吐量。在XML配置文件中,可以添加以下设置:
<driver name='vhost' queues='4'/>
这将启用4个队列。
virtualbox 转 KVM
列出现有的VirtualBox映像
$ VBoxManage list hdds
或
$ vboxmanage list hdds
第二步:将VDI映像转换成RAW磁盘格式
下一步是将VDI映像转换成RAW磁盘格式。为此,运行以下命令。VBoxManage clonehd –format RAW “原VDI文件路径” “目标RAW文件路径.img”
$ VBoxManage clonehd –format RAW /home/james/VirtualBoxVMs/debian/debian.vdi debian_10_Server.img
或
$ vboxmanage clonehd –format RAW /home/james/VirtualBoxVMs/debian/debian.vdi debian_10_Server.img
第三步:将RAW映像磁盘格式转换成KVM格式
最后,要迁移到KVM磁盘映像格式,请将RAW映像转换成qcow2格式,这是KVM磁盘映像格式。
$ qemu-img convert -f raw debian_10_Server.img -O qcow2 debian_10_Server.qcow2qcow2
qemu-img convert -f raw ubuntu.img -O qcow2 ubuntu.qcow2
virt-install \
–name ubuntu-kvm \
–memory 2048 \
–vcpus 2 \
–disk path=/path/to/ubuntu.qcow2 \
–os-variant ubuntu20.04 \
–network bridge=virbr0 \
–graphics vnc \
–import
IOMMU(二)-从配置说起
理解BIOS配置中的VT-D
VT-D(Virtualization Technology for Directed I/O)是Intel提供的I/O虚拟化技术,用于让虚拟机直接访问物理设备,提高虚拟化性能。在BIOS中启用VT-D,能够收集IOMMU硬件和PCI设备连接关系的信息,并上报给操作系统。
内核参数 intel_iommu=on
此配置激活Intel IOMMU驱动,实现对VT-D支持的硬件进行驱动。Intel、AMD、ARM等硬件厂商都提供了IOMMU硬件单元,其中Intel的硬件驱动被广泛使用。
iommu=pt
配置iommu=pt表示使用基于物理地址的映射方式。内核注释中提到,使用此配置时,函数iommu_no_mapping返回1,意味着i40e驱动直接返回物理地址,避免了调用domain_pfn_mapping函数,减少了映射过程,从而提高性能。
代码解析与性能影响
通过分析kvm、vfio-pci、i40e等内核组件的代码,发现它们都调用了domain_pfn_mapping函数处理物理地址映射。对于kvm和vfio而言,它们直接调用此函数;而在i40e中,额外的if判断跳过了映射过程,通过直接使用物理地址来提高性能。
总结
iommu=pt配置不会影响kvm、DPDK、SPDK等技术的性能。它们都属于用户态驱动,与IOMMU硬件的直接映射主要影响内核驱动性能。使用iommu=pt能够优化内核驱动的设备性能,实现更高的效率。
配置建议
对于kvm,确保启用intel_iommu=on以充分利用VT-D功能。对于DPDK/SPDK使用vfio-pci时,同样需要intel_iommu=on。如果绑定uio/igb_uio,就不需要intel_iommu=on。推荐使用vfio-pci,以替代kvm中的pci-assign和DPDK/SPDK使用的igb_uio。
内核参数 nointremap
nointremap参数用于控制IOMMU是否执行DMA和中断映射。在kvm中,这两种映射功能都启用,而在DPDK/SPDK使用轮询模式时,可以不使用中断映射功能。此时,nointremap参数允许禁用中断映射,避免不必要的开销。
1. 识别磁盘控制器
lspci -nn |grep SATA
67:00.0 SATA controller [0106]: ASMedia Technology Inc. ASM1166 Serial ATA Controller [:1166] (rev 02)
# 例如输出:01:00.0 SATA controller [0106]: Marvell Technology Group Ltd. 88SE9230 PCIe SATA 6Gb/s Controller [1b4b:9230]
2. 启用IOMMU
编辑GRUB配置(Intel CPU):
bash
sudo nano /etc/default/grub # 修改GRUB_CMDLINE_LINUX行,添加: GRUB_CMDLINE_LINUX="... intel_iommu=on iommu=pt"
对于AMD CPU:
bash
GRUB_CMDLINE_LINUX="... amd_iommu=on iommu=pt"
更新GRUB并重启:
bash
sudo update-grub
sudo reboot
3. 验证IOMMU分组
dmesg | grep -i iommu
sudo virt-host-validate
irt-host-validate
QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup ‘cpu’ controller support : PASS
QEMU: Checking for cgroup ‘cpuacct’ controller support : PASS
QEMU: Checking for cgroup ‘cpuset’ controller support : PASS
QEMU: Checking for cgroup ‘memory’ controller support : PASS
QEMU: Checking for cgroup ‘devices’ controller support : PASS
QEMU: Checking for cgroup ‘blkio’ controller support : PASS
QEMU: Checking for device assignment IOMMU support : PASS
QEMU: Checking if IOMMU is enabled by kernel : PASS
QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)
LXC: Checking for Linux >= 2.6.26 : PASS
LXC: Checking for namespace ipc : PASS
LXC: Checking for namespace mnt : PASS
LXC: Checking for namespace pid : PASS
LXC: Checking for namespace uts : PASS
LXC: Checking for namespace net : PASS
LXC: Checking for namespace user : PASS
LXC: Checking for cgroup ‘cpu’ controller support : PASS
LXC: Checking for cgroup ‘cpuacct’ controller support : PASS
LXC: Checking for cgroup ‘cpuset’ controller support : PASS
LXC: Checking for cgroup ‘memory’ controller support : PASS
LXC: Checking for cgroup ‘devices’ controller support : PASS
LXC: Checking for cgroup ‘freezer’ controller support : FAIL (Enable ‘freezer’ in kernel Kconfig file or mount/enable cgroup controller in your system)
LXC: Checking for cgroup ‘blkio’ controller support : PASS
LXC: Checking if device /sys/fs/fuse/connections exists : PASS
4. 将控制器传递给虚拟机
virsh edit truenas-vm
添加以下内容(替换为您的PCI设备地址):
xml
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x67' slot='0x00' function='0x0'/>
</source>
</hostdev>
方法2:直接磁盘传递(次优但简单)
1. 确保磁盘未被使用
bash
lsblk sudo umount /dev/sdX* # 如果磁盘被挂载
2. 将整个磁盘传递给虚拟机
bash
virsh edit truenas-vm
添加:
xml
<disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <source dev='/dev/sdb'/> <!-- 整个磁盘 --> <target dev='sdb' bus='scsi'/> <!-- TrueNAS推荐SCSI总线 --> <boot order='2'/> </disk>
方法3:Virtio-SCSI直通(中等性能)
xml
<controller type='scsi' index='0' model='virtio-scsi'/> <disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <source dev='/dev/disk/by-id/ata-SERIAL_NUMBER'/> <target dev='sda' bus='scsi'/> </disk>
TrueNAS侧配置建议
- 在TrueNAS Web界面中:
- 进入”Storage” → “Disks”
- 确认直通的磁盘可见
- 不要使用虚拟磁盘作为存储设备
- 性能优化:
- 禁用所有缓存选项(除非您有专门的缓存设备)
- 使用ZFS的ashift值匹配磁盘扇区大小
注意事项
- 数据安全:
- 直通后主机无法访问这些磁盘
- 确保有备份方案
- 性能监控:bash# 在主机上监控磁盘性能 sudo iostat -x 1
- 迁移限制:
- PCI直通的虚拟机难以迁移到其他主机
- 考虑使用网络存储(如iSCSI)如果需要迁移
- NVMe设备:
对于NVMe SSD,PCIe直通是唯一能获得全部性能的方式
通过PCIe控制器直通可以获得最佳性能,因为TrueNAS可以直接控制磁盘控制器,完全绕过KVM的存储虚拟化层。
开启新对话