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侧配置建议

  1. 在TrueNAS Web界面中:
    • 进入”Storage” → “Disks”
    • 确认直通的磁盘可见
    • 不要使用虚拟磁盘作为存储设备
  2. 性能优化:
    • 禁用所有缓存选项(除非您有专门的缓存设备)
    • 使用ZFS的ashift值匹配磁盘扇区大小

注意事项

  1. 数据安全
    • 直通后主机无法访问这些磁盘
    • 确保有备份方案
  2. 性能监控:bash# 在主机上监控磁盘性能 sudo iostat -x 1
  3. 迁移限制
    • PCI直通的虚拟机难以迁移到其他主机
    • 考虑使用网络存储(如iSCSI)如果需要迁移
  4. NVMe设备
    对于NVMe SSD,PCIe直通是唯一能获得全部性能的方式

通过PCIe控制器直通可以获得最佳性能,因为TrueNAS可以直接控制磁盘控制器,完全绕过KVM的存储虚拟化层。

开启新对话

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注