Centos7的KVM安裝配置詳解


KVM和虛擬化

虛擬化有幾種類型:

  • 完全虛擬化(Full virtualization), 虛機使用原始版本的操作系統, 直接與CPU通信, 是速度最快的虛擬化.
  • 半虛擬化(Paravirtualization), 虛機使用修改過的操作系統, 與hypervisor通信, hypervisor不修改請求, 直接轉發給CPU和其他接口.
  • 軟件虛擬化(Software virtualization), 使用模擬器運行原始版本的操作系統. hypervisor將虛機請求翻譯為宿主系統可以理解的格式. 比半虛擬化更慢.
  • 容器化(Containerization). 與KVM虛擬化創建一個單獨的內核實例不同, 容器化直接在現有的內核實例上創建互相隔離的容器環境. 容器在適用性上不如KVM虛擬化, 但是更加輕量與靈活.

關於KVM

  • KVM (Kernel-based Virtual Machine) 屬於完全虛擬化
    • 在內核中內置了KVM
    • 與QEMU (Quick Emulator) 集成
  • libvirt API 用於管理KVM
  • virt-manager和virsh是libvirt提供的管理工具

使用virsh edit guestname修改虛機配置而不是直接編輯虛機xml文件. 如果直接編輯虛機xml文件, 容易導致修改被覆蓋. 通過virsh edit修改完配置后, 需要保存xml文件並重啟虛機才能生效.

KVM模擬的網絡設備

  • e1000 設備模擬 Intel E1000 network adapter (Intel 82540EM, 82573L, 82544GC).
  • rtl8139 設備模擬 Realtek 8139 network adapter.

Centos KVM環境

硬件環境

  • CPU需要支持虛擬化
  • 主板需要支持VT-x, 最好支持VT-d
    • VT-x: 運行64bit Guest OS基本指令
    • VT-d: 虛擬機可以直接針對硬件設備做存取,由北橋晶片來支援及BIOS來開啟
    • VT-c: 以Network為主, 要由I/O裝置來支援, 包含Virtual Machine Direct Connect 及 Virtual Machine Device Queues兩項技術, 前者使用了SR-IOV(Single Root I/O Virtualization).

系統環境

  • 總核數 = 物理CPU個數 X 每顆物理CPU的核數
  • 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數
# 查看物理CPU個數
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每個物理CPU中core的個數(即核數)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看邏輯CPU的個數
cat /proc/cpuinfo| grep "processor"| wc -l
# 查看物理機的cpu是否支持虛擬化, 找到flags部分,如果其中輸出有VMX或SVM,即表明支持虛擬化技術。
cat /proc/cpuinfo | egrep '(vmx|svm)'

查看系統版本

cat /etc/centos-release

查看是否加載KVM

lsmod | grep kvm

如果有kvm相關輸出則表明已加載, 如果沒有加載則執行命令

modprobe kvm加載KVM

安裝KVM

# 安裝kvm
yum install qemu-kvm qemu-img libvirt libvirt-python libvirt-client virt-install virt-viewer
# 如果需要圖形界面
yum install virt-manager
# 安裝橋接工具
yum install bridge-utils
# 安裝虛機鏡像文件編輯工具
yum install libguestfs-tools

# 啟動libvirt並設置開機自啟動
systemctl start libvirtd
systemctl enable libvirtd

安裝后, 使用virt-host-validate命令查看kvm環境的可用性.

  • qemu-kvm: KVM模塊
  • libvirt: 虛擬管理模塊
  • virt-manager: 圖形界面管理虛擬機
  • virt-install: 虛擬機命令行安裝工具

配置橋接網絡

查看網口設備

# 
yum install lshw
# 這個命令可以將pci地址與網口設備對應上
lshw -c network -businfo
Bus info          Device      Class          Description
========================================================
pci@0000:02:00.0  eno1        network        NetXtreme BCM5719 Gigabit Ethernet 
pci@0000:02:00.1  eno2        network        NetXtreme BCM5719 Gigabit Ethernet 
pci@0000:02:00.2  eno3        network        NetXtreme BCM5719 Gigabit Ethernet 
pci@0000:02:00.3  eno4        network        NetXtreme BCM5719 Gigabit Ethernet 
                  virbr0-nic  network        Ethernet interface
                  virbr0      network        Ethernet interface

手工創建橋接網絡

對應本機已有的網口, 創建一個新的配置文件為/etc/sysconfig/network-scripts/ifcfg-br0, br0是橋接的名字.
本機已有的網口為em1

  • 在上面指定橋接為br0, 這個名稱可以自定義, 和后面創建的ifcfg-br0的文件名, 以及內部的DEVICE名稱一致就可以
  • 取消IP等設置.
  • 需要帶上MAC地址, 以避免網口名稱漂移, 例如從em1變成em2, 這時候這個配置就不起作用了, 會出現br0獲得IP, 這個網口也獲得IP的情況
  • 正確配置的情況下, 在ifconfig的輸出中只有br0有IP, em1這個網口是沒有IP的
$ more /etc/sysconfig/network-scripts/ifcfg-em1
TYPE=Ethernet
NAME=em1
DEVICE=em1
HWADDR=15:24:B4:63:D3:E1 # 加上, 不分大小寫, 避免網口名漂移
BRIDGE="br0"
ONBOOT=yes

創建的橋接網絡, 這里設置IP, GATEWAY和DNS

$ more /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.1.33
NETMASK=255.255.255.0 #或者 PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1
DNS2=114.114.114.114

然后systemctl restart network重啟網絡, 通過ifconfig和brctl查看網絡設置

$ brctl show
bridge name     bridge id       STP enabled   interfaces
br0             800.3837173923  no            em1
                                              vnet0

在沒有創建虛擬機時,顯示只綁定em1,運行虛機如果指定bridge=br0, 就會多一個vnet網卡

通過ip命令創建

ip link add br0 type bridge
ip link set br0 up
ip link set tap0 master br0
echo 0 > /sys/class/net/br0/bridge/stp_state
ip addr add 10.0.1.1/24 dev br0

反向操作

ip link set tap0 nomaster
ip link set br0 down
ip link delete br0 type bridge

通過brctl命令創建

創建橋接網絡也可以通過brctl

brctl  addbr  br0       # 創建網橋
brctl  addif  br0 eth0  # 把br0和eth0網卡綁定
brctl  stp   br0 on     # 開啟stp

對應的刪除操作

brctl delif br0 eth0    # 解除綁定
ifconfig br0 down       # 關閉br0, 不關閉刪不掉
brctl delbr br0         # 刪除br0

虛機創建和管理

下載預安裝的Centos鏡像

關於qcow2c格式
在下載中有一種擴展名為qcow2c格式的鏡像, 這種鏡像是壓縮版的qcow2, 和qcow2一樣可以正常使用, 但是不保證IO性能.

This is the same image, run through the qemu qcow2 internal compression setup - while this image is suiteable for development and play, it comes with non trivial i/o performance penalties and therefore not recommended for production.

在實際使用中, 只要yum update過以及稍微安裝了一些東西, qcow2c和qcow2的大小區別不大, 所以如果不是只開一下機測試一下, 那么還是建議用不帶c的qcow2格式.

圖形界面創建虛機

圖形界面安裝

virt-install --name guest1-rhel7 \
--memory 2048 \
--vcpus 2 \
--disk size=8 \
--cdrom /home/username/Downloads/rhel-workstation-7.4-x86_64-dvd.iso \
--os-variant rhel7

或者

virt-install \
--connect qemu:///system \                                   #連接默認本機hypervisor
--virt-type kvm \                                            #虛擬化類型為kvm        
--vcpus 1 \                                                  #vcpu為1
--name unbuntu16 \                                           #虛擬機名稱
--ram 512 \                                                                             #內存大小
--cdrom /var/lib/libvirt/images/ubuntu-16.04.5-server-amd64.iso \                       #指定使用cdrom光驅啟動,指定鏡像路徑
--disk path=/var/lib/libvirt/images/ubuuntu16.img,size=50,format=qcow2,bus=virtio \     #指定硬盤路徑,大小,格式為qcow2,總線類型為virtio
--network bridge=br0                                                                    #指定虛擬網絡類型為網橋br0

命令行創建虛機

如果需要用vnc連, 就需要用graphics參數, 如果想在虛機創建后console連接立即可用, 需要在 extra-args中添加 console=tty0 console=ttyS0,115200n8 參數[已驗證]

virt-install --name rhel7anaconda-guest \
-r 1024 \
--location /home/jherrman/Downloads/rhel-workstation-7.4-x86_64-dvd.iso \
--disk size=8 \
--nographics \
--extra-args "console=tty0 console=ttyS0,115200n8"

或者

virt-install --name centos7-guest --memory 1024 \
--location /data/iso/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/data/vms/centos7-guest.qcow2,size=10,format=qcow2 \
--network bridge=br0 \
--nographics \
--extra-args "console=tty0 console=ttyS0,115200n8"

或者先創建虛機鏡像文件, 再開始安裝, 前一種方式鏡像文件會直接申請10G, 如果先用qemu-img創建就不會.

# 會創建一個很小的qcow2格式鏡像文件
qemu-img create -f qcow2 centos7-guest.qcow2 10G
# 使用這個鏡像進行安裝, 文件大小會根據數據增長
virt-install --name centos7-guest --memory 1024 \
--vcpus 1 \
--location /data/iso/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/data/vms/centos7-guest.qcow2 \
--network bridge=enxbr0 \
--nographics \
--os-type linux \
--os-variant centos7.0 \
--extra-args "console=tty0 console=ttyS0,115200n8"

或者

virt-install \
--virt-type kvm \
--name test1 \
--vcpus 2 \
--memory 2048 \
--location /root/images/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/root/test1.qcow2,size=10,format=qcow2 \
--network bridge=virbr0 \
--graphics none \
--extra-args "console=ttyS0"

或者

virt-install \
--name test03 \
--ram 512 \
--vcpus 1 \
--network bridge=br0 \
-f /data/kvm_centos/centos6.7_03.qcow2 \
--location /data/soft/CentOS-6.7-x86_64-bin-DVD1.iso \
--graphics vnc,listen=0.0.0.0,port=5987, \
--extra-args "console=tty0 console=ttyS0,115200n8 serial" \
--force \
--autostart

此時在虛機上啟動serial-getty服務(虛機為Centos7)

systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service

宿主機就可以通過console訪問

virsh console [虛機名稱] ## 

導入已有的鏡像創建虛機

virt-install \
  --name demo \
  --memory 512 \
  --disk /home/user/VMs/mydisk.img \
  --import

導入Centos官方的鏡像, 並使用KVM的NAT網絡, 參數中不需要extra-args, 默認就可以通過virsh console連接

  • 將鏡像復制到vm工作目錄
  • 通過guestfish或virt-customize修改root口令
  • 執行下面的導入
virt-install \
--name c7guest1 \
--vcpus 2 \
--memory 4096 \
--disk /data/vms/c7guest1.qcow2c \
--graphics none \     # 重要,如果不加這個參數,在執行此命令時就看不到啟動過程
--import \
--os-type linux \
--os-variant centos7.0 \  # 對於centos7.x建議加上
--network bridge=br0,model=virtio  # 將虛機配置到宿主機的橋接網絡

導入Ubuntu鏡像

virt-install --name ubuntu2004-guest \
--vcpus 2 --memory 4096 \
--disk /data/vms/ubuntu2004-guest.qcow2 \
--graphics none \
--import \
--os-type linux --os-variant ubuntu20.04 \
--network bridge=enxbr0,model=virtio

修改root口令
Centos官方的鏡像, root未設置口令, 而是通過ssh key登錄, 可以通過guestfish修改, 或通過virt-customize修改.
通過guestfish:

# guestfish --rw -a <qcow2 image file name>
><fs> run
><fs> list-filesystems
><fs> mount /dev/vda1 /
><fs> vi /etc/shadow     # 這一步, 通過openssl passwd -1 changeme生成
><fs> umount /
><fs> exit    # 或者quit

通過virt-customize

# 安裝virt-customize
yum install libguestfs-tools
# 停止虛機, 然后執行修改, --uninstall cloud-init是用於disable the cloud-init service
virt-customize -a CentOS-7-x86_64-GenericCloud-2009.qcow2c --root-password password:[your password] --uninstall cloud-init

創建非X86異構虛機

ARM虛機, 需要手工指定一個啟動kernel

virt-install \
--name armtest \
--memory 1024 \
--arch armv7l --machine vexpress-a9 \
--disk /home/user/VMs/myarmdisk.img \
--boot kernel=/tmp/my-arm-kernel,initrd=/tmp/my-arm-initrd,dtb=/tmp/my-arm-dtb,kernel_args="console=ttyAMA0 rw root=/dev/mmcblk0p3" \
--graphics none

virt-install 常用參數

  • --import 跳過OS安裝過程, 使用存在的磁盤鏡像創建虛機. Skip the OS installation process, and build a guest around an existing disk image. The device used
    for booting is the first device specified via "--disk" or "--filesystem".

  • --name 或者 -n, 指虛機名稱

  • --vcpus 虛擬CPU個數

  • --memory 2048 或者 -r/--ram, 后兩者已經deprecated. 單位為MiB

  • --disk

    • size=8 指定磁盤大小, 單位為GiB
    • path=/somewhere/somefile 指定虛機文件路徑, 如果不存在則會嘗試創建(此時必須要有size參數)
    • format 磁盤鏡像格式, 可以是 'raw', 'qcow2', 'vmdk' 等等, 默認為'qcow2'.
  • --location 或者-l, 指定安裝來源, Distribution tree installation source. virt-install can recognize certain distribution trees and fetches a bootable kernel/initrd pair to launch the install

  • --cdrom 或者-c, 指定用於虛擬光驅的文件或設備 File or device used as a virtual CD-ROM device

  • --os-variant 指定虛機操作系統類型, 可以極大提升性能. 例如'fedora18', 'rhel7', 'winxp'等. 可以使用"osinfo-query os"命令查詢可用的類型

  • --arch 指定系統架構例如aarch64, 默認與宿主機相同

  • --graphics 指定顯示類型和輸出, 例如 --graphics vnc,password=foobar, 如果沒有指定, virt-install會自動檢測可用的圖形環境, 如果沒有, 則會使用 --graphics none

  • --noautoconsole 阻止自動連接虛機console, 默認會自動連接

  • --network

    • bridge=BRIDGE 連接到橋接網絡
    • network=NAME 連接到虛擬網絡NAME. 虛擬網絡可以用irsh 創建刪除和查詢. 默認會有一個default網絡. 如果宿主機的網絡是動態的則使用虛擬網絡, 虛機將使用NAT連接到LAN.
    • type=direct,source=IFACE[,source_mode=MODE] 使用macvtap直接連接到宿主機網口IFACE
  • --extra-args 或者 -x 指定額外參數

  • --accelerate 在安裝QEMU虛機時優先使用 KVM or KQEMU, 在最近的版本中已經是默認開啟, 所以此參數已經decrecated. 如果要安裝一個純QEMU虛機, 使用參數'--virt-type qemu'

virt/virsh常用命令

直接輸入virsh會進入交互式命令行, 或者直接使用 virsh + 指令 的形式執行命令

  • cd 更改當前目錄
  • connect 連接(重新連接)到 hypervisor
  • echo echo 參數
  • exit 退出這個非交互式終端
  • help 打印幫助
  • pwd 輸出當前目錄
  • quit 退出這個非交互式終端
  • list 列出正在運行的虛擬機列表 --all列出所有
  • autostart 配置虛擬機自啟,--disable表示禁用自啟動
  • dumpxml 輸出特定虛擬機XML格式的配置文件
  • create 從一個 XML 文件創建一個新虛擬機
  • define 從一個 XML 文件定義(但不開始)一個虛機
  • undefine 撤銷一個虛機, 會將/etc/libvirt/qemu/下面的虛機xml刪除, 但是不會刪除虛機鏡像文件
  • destroy 只是停止虛機, 不會刪除/etc/libvirt/qemu/下面的虛機xml, 也不會刪除虛機鏡像
  • dominfo 虛機信息
  • domid 把一個域名或 UUID 轉換為域 id
  • domstate 域狀態
  • edit 編輯某個域的 XML 配置
  • reboot 重啟一個虛機
  • shutdown 關閉一個虛機
  • start 啟動一個虛機
  • save 把一個域的狀態保存到一個文件
  • restore 從一個存在一個文件中的狀態恢復一個域
  • screenshot 提取當前域控制台截圖並保存到文件中
  • suspend 掛起一個虛機
  • resume 重新恢復一個虛機
  • setmem 改變內存的分配
  • setmaxmem 改變最大內存限制值
  • setvcpus 改變虛擬 CPU 個數
  • vcpuinfo 詳細的域 vcpu 信息
  • attach-device 從一個XML文件添加設備
  • net-create 從一個 XML 文件創建一個網絡
  • net-dumpxml 輸出XML格式的網絡信息
  • net-list 列出網絡
  • net-start 啟動一個網絡
  • iface-define 使用XML文件定義主機網絡接口
  • iface-list 物理主機接口列表
  • snapshot-create 使用 XML 生成快照
  • snapshot-delete 刪除域快照
  • snapshot-dumpxml 為域快照備份xml
  • snapshot-list 為域列出快照

設置開機啟動

virsh autostart vm_agent
# 逆操作
virsh autostart --disable vm_agent

qemu-img命令

創建鏡像qemu-img create

# 創建一個設備空間大小為10G的鏡像
qemu-img create -f qcow2 centos7-guest.qcow2 10G
# 基於backing_file創建大小為20G的鏡像, 使用-b參數, -F用於指定backing_file的格式
qemu-img create -F qcow2 -b /path/to/backing-kvm.img -f qcow2 /path/to/target.qcow2 20G
# 基於backing_file創建大小為20G的鏡像, 使用-o參數, 都在-o參數內指定
qemu-img create -f qcow2 -o backing_file=/path/to/rhel6u3.img,backing_fmt=qcow2,size=20G /path/to/target.qcow2

關於backing_file的說明
If the option backing_file is specified, then the image will record only the differences from backing_file. No size needs to be specified in this case. backing_file will never be modified unless you use the "commit" monitor command (or qemu-img commit).

查看鏡像信息 qemu-img info

qemu-img info rhel6u3.img

轉換鏡像格式 qemu-img convert

使用-f指定源文件格式, 用-O指定目標文件格式

qemu-img convert -f raw -O qcow2 centos.img centos.qcow2
qemu-img convert -f qcow2 -O raw centos.qcow2 centos.raw

virsh 管理虛機快照

快照會創建在虛機自身的qcow2文件上. virsh snapshot命令不支持raw磁盤格式, 如果需要使用快照功能, 用以下命令將raw轉換為qcow2

qemu-img convert -f raw -O qcow2 image-name.img image-name.qcow2

創建快照

# 格式
virsh snapshot-create-as –domain {vm_name} –name {snapshot_name} –description “enter description”
# 命令例子
virsh snapshot-create-as --domain vm01 --name snap001 --description "snap before patch on 4Feb2018"

列出虛機的快照, 查看快照信息

# 列出
virsh snapshot-list vm01
# 查看
virsh snapshot-info --domain vm01 --snapshotname snap001

查看快照大小, 用 qemu-img 命令

qemu-img info /data/vms/vm01.qcow2

還原快照, 執行還原時必須關閉虛機

# 格式
virsh snapshot-revert {vm_name} {snapshot_name}
# 命令例子
virsh snapshot-revert vm01 snap001

刪除快照

virsh snapshot-delete --domain vm01 --snapshotname snap001

virt-clone命令

克隆前對源虛機的處理

  1. 刪除網絡配置
# rm -f /etc/udev/rules.d/70-persistent-net.rules

如果沒刪除udev rules, 克隆后的虛機的第一個網口會變成eth1而不是eth0.

  1. 從/etc/sysconfig/network-scripts/ifcfg-eth[x]文件中刪除包含唯一ID的網絡配置信息. 例如HWADDR, 如果不刪除, 與新虛機中的MAC地址不匹配, 這個ifcfg將被忽略.
DEVICE=eth[x]
BOOTPROTO=none
ONBOOT=yes
#NETWORK=10.0.1.0       <- REMOVE
#NETMASK=255.255.255.0  <- REMOVE
#IPADDR=10.0.1.20       <- REMOVE
#HWADDR=xx:xx:xx:xx:xx  <- REMOVE
#USERCTL=no             <- REMOVE
# Remove any other *unique* or non-desired settings, such as UUID.

確保除了DHCP以外其他的全局唯一信息都被刪除

DEVICE=eth[x]
BOOTPROTO=dhcp
ONBOOT=yes
Ensure that the file includes the following lines:
DEVICE=eth[x]
ONBOOT=yes

如果存在以下的文件, 確保它們的內容一致

  • /etc/sysconfig/networking/devices/ifcfg-eth[x]
  • /etc/sysconfig/networking/profiles/default/ifcfg-eth[x]

刪除其他信息

rm /etc/sysconfig/rhn/systemid
subscription-manager unsubscribe --all
subscription-manager unregister
subscription-manager clean
subscription-manager clean

刪除sshd密鑰

# rm -rf /etc/ssh/ssh_host_*

克隆命令

virt-clone --connect qemu:///system --original demo --name newdemo --file /var/lib/libvirt/images/newdemo.img --file /var/lib/libvirt/images/newdata.img

virt-filesystems命令

查看鏡像的磁盤大小

virt-filesystems --long --parts --blkdevs -h -a c7guest1.qcow2c 
Name       Type       MBR  Size  Parent
/dev/sda1  partition  83   8.0G  /dev/sda
/dev/sda   device     -    8.0G  -

virt-resize命令

將舊鏡像中的文件系統擴充到新鏡像中, 用於調整虛機磁盤大小

# 創建一個50G容量的qcow2空白鏡像
qemu-img create -f qcow2 /data/images/win2012-50gb.qcow2 50G
# 將鏡像擴充到新鏡像中去, 通過--expand指定需要擴張的分區
virt-resize --expand /dev/sda2 /data/images/win2012.qcow2 /data/images/win2012-50gb.qcow2

此時只是將在虛機磁盤上增加了可用空間, 但是未體現到文件系統, 啟動虛機后, 在虛機中擴充分區大小

# 查看分區
df -h
# 查看分區對應的磁盤大小, 能看出來/dev/vda1已經增長, 但是未體現到df -h的輸出中
fdisk -l
# 如果/dev/vda1格式是xfs
xfs_growfs /dev/vda1
# 如果/dev/vda1格式是ext2,3,4
resize2fs /dev/vda1

網絡配置

KVM支持以下的網絡虛擬化

  • 使用NAT的虛擬網絡 virtual networks using Network Address Translation (NAT)
  • 直接使用PCI物理設備 directly allocated physical devices using PCI device assignment
  • 使用PCIe SR-IOV的虛擬化
  • 橋接網絡

查看當前qemu支持的網口模式

Centos7中, qemu-kvm這個命令並不在路徑中, 需要直接指定路徑

/usr/libexec/qemu-kvm -net nic,model=?
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

對於萬兆網口, 需要使用virtio模式才能支持

橋接網絡

這個是最常用的網絡配置方式, 在宿主機網口創建橋接網絡, 在虛機上使用此橋接網絡, 實現與宿主機共享同一內網.
參考前面的橋接網絡創建部分. 這種方式不需要設置net.ipv4.ip_forward = 1.

  • 在創建虛機時使用--network bridge=br0參數, 或者在虛機配置xml文件中修改.
  • 虛機啟動后, 在宿主機通過brctl show可以看到新創建的虛擬網口vnet[n], 這個網口在虛機停止后會自動刪除.

手動添加到橋接網絡
通過virsh edit編輯虛機, 添加下面的內容

<interface type='bridge'>
  <source bridge='br1'/>
  <model type='virtio'/> <!-- 指定使用virtion, 否則系統會自動指定rtl8139 -->
</interface>

然后保存退出, virsh會自動添加其它的部分, 這時候再用virsh edit進入查看, 可以看到變成了

<interface type='bridge'>
  <mac address='52:54:00:11:4d:11'/> <!-- 系統自動添加的 -->
  <source bridge='br1'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> <!-- 系統自動添加的 -->
</interface>

NAT虛擬網絡

如果宿主機的網口使用DHCP或動態IP, 不適合在網口上直接創建橋接, 可以使用NAT虛擬網絡讓虛機連入. 這種配置方式下, 虛機可以通過NAT上網, 但是從宿主機以外的其他機器, 不能直接訪問虛機.

查看可用的網絡, 配置文件在 /etc/libvirtd/qemu/ 下, 默認的default網絡配置文件為 /etc/libvirt/qemu/networks/default.xml

# 查看
virsh net-list --all

# Mark the default network to automatically start:
virsh net-autostart default

# Start the default network:
virsh net-start default

對應的反操作

# Mark the default network not to automatically start:
virsh net-autostart default --disable

# Shutdown the default network:
virsh net-destroy default

當default網絡啟動后, 系統中就可以看到這個橋接設備. 此設備並不包含物理網口, 它用NAT和IP轉發連接至物理網絡

# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.000000000000       yes

宿主機應當啟用ip轉發

# add the following to /etc/sysctl.conf.
net.ipv4.ip_forward = 1

虛機在創建時 使用--network network=default, 或通過下面的配置連接default網絡
/etc/libvirtd/qemu/xxx.xml

<interface type='network'>
   <source network='default'/>
</interface>

在虛機啟動后, 在宿主機上通過ifconfig可以看到新增加的網卡vnet0(在虛機中可以看到同樣mac地址的eth1), 在brctl show中也可以看到新增加的網口

# brctl show
bridge name bridge id         STP   enabled interfaces
virbr0      8000.5254008c2001 yes   virbr0-nic
                                    vnet0

virtio模式

在網口上使用virtio模式, 比rtl8139模式能提供更好的性能, 並且能支持萬兆網絡.

啟用virtio模式
對於需要開啟virtio模式的網口, 需要將虛機的網口配置, 從<model type='rtl8139'/>修改為<model type='virtio'/>.

<interface type='bridge'>
  <mac address='52:54:00:61:34:dd'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

重啟虛機后, 通過在虛機中執行lspci可以看到修改是否生效

[root@c7guest2 ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
...
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
...

如果未生效, 默認使用的是rtl8139

00:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8100/8101L/8139 PCI Fast Ethernet Adapter (rev 20)

如果使用virtio模式, 在宿主機中查看vhost-net的使用情況

[root@kvm-host ~]# more /boot/config-3.10.0-1160.21.1.el7.x86_64 |grep VHOST
CONFIG_VHOST_NET=m #這個表示已經將vhost-net編譯為module
# CONFIG_VHOST_SCSI is not set
CONFIG_VHOST_VSOCK=m
CONFIG_VHOST_RING=m
CONFIG_VHOST=m
# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
[root@kvm-host ~]# lsmod|grep vhost
vhost_net              22693  1            # 這個表示已經啟用
vhost                  48851  1 vhost_net
macvtap                22757  1 vhost_net
tun                    36164  6 vhost_net

上面的輸出, 表明宿主機內核將vhost-net編譯為module且vhost-net模塊處於使用中狀態

virtio模式下網口的速率問題
對於virtio模式的虛機網口, 是無法查看實際速率的, 通過ethtool和mii-tool都不行

# ethtool eth0
Settings for eth0:
Link detected: yes
# mii-tool eth0
SIOCGMIIPHY on 'eth0' failed: Operation not supported

關於這個問題的說明 https://serverfault.com/questions/738840/get-link-speed-of-an-virtio-net-network-adapter
Virtio是一個半虛擬化設備, 意味着宿主和虛機都知道這個不是物理設備, 這個設備只是在虛機和hypervisor之間的一個API, 所以其速度和普通的網口無關. 對於hypervisor模擬的物理設備提供的網口速率來說, virtio能提供更好的性能. 虛機僅僅從總線中獲取數據包, 由宿主負責與物理網口的交互, 虛機不需要也不關心宿主機的網口速率, 兩個虛機之間交換數據包時速度只取決於內存之間的數據移動速度, 無法用網口速率來限制. Virtio允許宿主在多個虛機之間調節帶寬, 而不需要在虛機啟動時明確指定. 如果需要知道virtio網口的速率, 可以通過一些測試工具例如iperf3獲得.

SR-IOV虛擬網絡

SR-IOV技術可以在多個虛機之間共享一個物理網口. SR-IOV Virtual Functions有近乎物理設備的性能, 並且在同一個物理設備上對不同虛機提供了數據保護.

檢查硬件是否支持

普通桌面用的CPU, i3, i5, 不帶K的i7, 以及大部分E3系列CPU, 對SR-IOV的支持是不太好的, 這點需要提前了解, 如果要使用SR-IOV, 建議使用E5及以上的CPU. SR-IOV不能使用的網卡, 直接對PF配置直通也不能成功.

在宿主機中使用SR-IOV設備

對於Intel系統, 在BIOS中啟用VT-d, 對於AMD系統, 則啟用AMD IOMMU. 使用lspci命令

# lspci
03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

檢查PCI設備是否有SR-IOV功能, 帶SR-IOV功能的設備, 會有sriov_numvfs和sriov_totalvfs這兩個文件

# 查看可用的VF數量上限
more /sys/class/net/enp14s0f0/device/sriov_totalvfs

啟用Virtual Functions

# 創建指定數量的VF, 默認為0
echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs

上面的命令可能遇到的錯誤: can't enable 8 VFs (bus 02 out of range of [bus 01])

  • 檢查BIOS是否開啟VT-d和Intr-Remap, 以及開啟PCI Subsystem 的 SR-IOV Support, 但並非所有主板都支持這些BIOS設置
  • 如果主板不支持, 則需要在grub中添加pci=assign-busses intel_iommu=on啟動參數, 前者是為了解決bus 02 out of range的錯誤, 后者是為了解決在虛機中綁定sr-iov設備后啟動報host doesn't support passthrough of host PCI devices的錯誤

BIOS不支持SR-IOV的解決方案: 在grub中添加啟動參數

  1. 編輯/etc/default/grub, 在GRUB_CMDLINE_LINUX="crashkernel=auto ..."這一行引號內的末尾, 添加pci=assign-busses intel_iommu=on, 注意前面保留空格
  2. 注意: 對於支持SR-IOV的服務器, 不要使用 pci=assign-busses 否則會導致centos無法啟動
  3. 保存后, 需要更新grub.cfg, 檢查這個文件位置是在 /boot/grub2/grub.cfg 還是在 /boot/efi/EFI/centos/grub.cfg, 對應的執行命令
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

重啟后, 使用下面的命令檢查是否帶上了剛才添加的參數

cat /proc/cmdline

如果添加成功, 此時運行上面的sriov_numvfs文件修改命令就可以正常執行, 在lspci中就能看到新添加的VF網卡

持久化為開機啟動
下面的例子中,

  • 文件名稱可以隨便, 如果以數字, 如 70- 開頭, 可以設置其執行順序
  • 一行就是一個判斷+賦值的語句, 一個文件可以有多行
  • 將 ENV{ID_NET_DRIVER} 的值替換為實際使用的驅動名稱, 具體的驅動名稱可以通過lsmod查看, 可能為igb或者ixgbe
  • 對應的sriov_numvfs可以使用設備所支持的VF數量, 本例中為2
  • 注意, 前面幾個都是==, 是用於判斷條件的, ATTR這個是=, 是用於賦值的. 條件判斷必須用ENV的參數, 如果用ATTR似乎無效(在Centos7里測試是這樣的)
vim /etc/udev/rules.d/enp14s0f0.rules
# 內容
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"
# 或者精確到具體的網口, 用endor和mac地址判斷
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx00113113b042", ATTR{device/sriov_numvfs}="3"
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx00123113b043", ATTR{device/sriov_numvfs}="2"
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="igb", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx002b21365cee", ATTR{device/sriov_numvfs}="3"
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="igb", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx002b21365cef", ATTR{device/sriov_numvfs}="2"

上面的 ID_VENDOR_ID 和 ID_NET_NAME_MAC 可以用下面的udevadm命令得到. 如果在輸出中有這個enp14s0f0.rules對應的sriov_numvfs設置, 就說明配置生效了

udevadm test /sys/class/net/enp14s0f0

使用lspci檢查新產生的VF, 使用-n參數可以看到PCI設備ID

# lspci | grep 82576
0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
...
0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
...
0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)

從上面可以看到, 物理方法(PF)對應的是0b:00.0和0b:00.1, 而VF都會在設備名稱中包含Virtual Function

在irsh中檢查設備, 使用virsh nodedev-list命令查看, 使用0b過濾上面的例子

# virsh nodedev-list | grep 0b
pci_0000_0b_00_0
pci_0000_0b_00_1
pci_0000_0b_10_0
pci_0000_0b_10_1
...
pci_0000_0b_11_7
pci_0000_0b_11_1
...
pci_0000_0b_11_5

通過irsh獲取設備詳情, 使用virsh nodedev-dumpxml

virsh nodedev-dumpxml pci_0000_0b_10_0
<device>
  <name>pci_0000_0b_10_0</name>
  <path>/sys/devices/pci0000:00/0000:00:01.0/0000:0b:10.0</path>
  <parent>pci_0000_0b_00_1</parent>
  ...
</device>

選項1:在虛機中直接添加SR-IOV設備

使用上面的參數, 創建設備xml: /tmp/new-interface.xml

   <interface type='hostdev' managed='yes'>
     <source>
       <address type='pci' domain='0x0000' bus='0x0b' slot='0x10' function='0x2'/>
     </source>
   </interface>

添加到運行中虛機(熱拔插)
通過 virsh attach-device 命令

virsh attach-device MyGuest /tmp/new-interface.xml --live --config
  • 參數 --live 用於添加到運行中的虛機, 如果虛機是關閉狀態的可以不加這個參數
  • 參數 --config 用於確保寫入配置, 在重啟后依然有效.

從運行中的虛機中移除(熱拔插)
通過 virsh detach-device 命令

virsh detach-device <domain_name> <add_pci_vf.xml> –-live

從宿主機上解綁(和恢復綁定)
對於managed="yes"的設備, 在attach-device 時會自動從宿主機上dettach, 在宿主機上運行ifconfig可以看到此網卡不在列表中了; 在detach-device時會自動在宿主機上attach, 不需要額外的解綁和綁定操作, 但是對於managed="no"的節點, 需要額外的操作:

使用nodedev-detach命令, 將設備從宿主機上解除, 這樣就可以在虛機上通過 安全使用.

# 
virsh nodedev-detach <pci_device_name>
# 
virsh nodedev-dettach pci_0000_06_10_0

通過nodedev-reattach命令可以取消解除, 讓宿主機可以使用此設備

#
virsh nodedev-reattach <pci-device-name>
#
virsh nodedev-reattach pci_0000_06_10_0

手動添加到已關機的虛機上
編輯虛擬機的 XML 文件

virsh edit MyGuest
# 添加下述內容, mac可以自己定
<interface type='hostdev' managed='yes'>
  <mac address='52:54:00:fe:72:11'/>
  <source>
    <address type='pci' domain='0x0000' bus='0x06' slot='0x10' function='0x0'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</interface>

檢查直通網卡是否配置成功
虛機重啟后, 通過ifconfig查看系統自動生成的網口名稱, 對應的在/etc/sysconfig/network-scripts/下創建對應的ifcfg配置文件, 可以通過復制現有的配置文件創建, 但是要注意修改文件名以及內部的NAME和DEVICE, 添加上HWADDR避免名稱漂移.
為了測試直通是否成功, 可以將此網口IP設置為不同網段的IP(或接入到單獨的交換機上), 測試是否可以通過此IP連接到虛機.
如果在同一交換機上使用相同網段的IP, 可能會導致此IP的ARP指向原宿主機橋接網口MAC地址, 導致測試失敗.

選項2:使用KVM設備池給虛機添加SR-IOV設備

直接給虛機添加SR-IOV設備會存在一些問題

  1. 物理網卡的PCI地址在重啟后是可能發生變化的, 一旦發生變化, 配置在虛機xml里的interface對應的pci地址就無效了, 會導致虛機無法啟動
  2. 無法手動批量去給每一個虛機添加具體的SR-IOV設備

所以在生產中, 最好使用SR-IOV virtual functions pool給虛機添加設備, 具體的步驟是

將SR-IOV設備池添加到KVM網絡
創建一個文件, 名為sriov-ge0.xml, 內容為

<network>
  <name>sriov-ge0</name>
  <forward mode="hostdev" managed="yes">
    <pf dev="enp4s0f0" />
  </forward>
</network>

其中 是此網絡設備池在net-list中顯示的名稱, dev的enp4s0f0是SR-IOV的PF設備的名稱(即網口名稱), 對這個文件執行命令添加到KVM網絡列表, 在執行這個命令之前, 需要確認使用了此SR-IOV設備的虛機都已經關閉

# 添加到kvm網絡
virsh net-define sriov-ge0.xml 
# 查看是否添加成功
virsh net-list --all
# 設為自動啟動
virsh net-autostart sriov-ge0
# 啟動
virsh net-start sriov-ge0
# 檢查是否已啟動
virsh net-list --all

對應的反操作是

# 強制停止
virsh net-destroy sriov-10ge0
# 移除
virsh net-undefine sriov-10ge0

將設備添加到虛機
在運行中的虛機上添加, 創建一個文件, 名為new-interface2.xml, 內容為

<interface type='network'>
   <source network='sriov-ge0'/>
</interface>

其中network的值, 就是上一步創建的網絡名稱.
執行下面的命令, 對運行中的虛機添加設備

virsh attach-device MyGuest new-interface2.xml --live --config

顯示成功后, 在虛機中通過dmesg查看新硬件信息, 然后再手動配置對應的ifcfg-xxx文件.
此時查看虛機xml, 會發現增加了對應的interface配置, 里面設置的model type為rtl8139, 但是在虛機系統里看到的硬件是對的, 是intel.

<interface type='network'>
  <mac address='52:54:00:a9:xx:xx'/> <!-- 自動生成的 -->
  <source network='sriov-ge0'/>
  <model type='rtl8139'/> <!-- 自動生成的 -->
  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> <!-- 自動生成的 -->
</interface>

如果手工添加, 通過virsh edit添加上面的內容, 也會默認分配設備類型為rt8139.

問題

需要選擇正確的CPU和主板, 以及內核版本

存在問題的場景:

  • HP DL388 gen9服務器自帶的4口千兆網卡331i, 不帶SR-IOV支持
    在Centos7.9下實測, 用lspci -s 0000.03:xx.x -vv查看, 沒有對應的capabilities.
  • 所有非XEON E5, E7的系統, 包括E3以及i3, i5, 絕大部分i7, 主板第一個PCIE插槽無法使用SR-IOV
  • 對於以上的主板如果有內核補丁支持, 主板的第二個及以后的PCIE插槽, 在部分內核版本中支持SR-IOV, 需要實際測試
    例如Centos7的3.10.x內核, 對於在第二個PCIE插槽的82576可以正常使用SR-IOV, 但是同樣情況的82599會導致虛機啟動閃退, 提示vfio_dma_map -14 Bad address, 在5.11.x內核就可以正常使用

B85M主板, 將82599 X520 DA2網卡插在第一個PCIE插槽. 此時無論是直接使用PCI地址, 還是通過pool, 如果向運行中的虛機添加SR-IOV設備, 都會出現"group 1 is not viable... Device initialization failed"錯誤; 如果是向關閉中的虛機添加, 則在啟動時會報"group 1 is not viable Please ensure all devices within the iommu_group are bound to their vfio bus driver."的錯誤.
使用virsh nodedev-dumpxml查看82599的VF和PF設備, 這些設備都出現在了同一個iommuGroup下面, 就像這樣

[root@localhost ~]# virsh nodedev-dumpxml pci_0000_02_10_0
<device>
  <name>pci_0000_02_10_0</name>
  <path>/sys/devices/pci0000:00/0000:00:01.0/0000:02:10.0</path>
  <parent>pci_0000_00_01_0</parent>
  <driver>
    <name>ixgbevf</name>
  </driver>
  <capability type='pci'>
    <domain>0</domain>
    <bus>2</bus>
    <slot>16</slot>
    <function>0</function>
    <product id='0x10ed'>82599 Ethernet Controller Virtual Function</product>
    <vendor id='0x8086'>Intel Corporation</vendor>
    <capability type='phys_function'>
      <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </capability>
    <iommuGroup number='1'>
      <address domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
      <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
      <address domain='0x0000' bus='0x02' slot='0x10' function='0x0'/>
      <address domain='0x0000' bus='0x02' slot='0x10' function='0x2'/>
      <address domain='0x0000' bus='0x02' slot='0x10' function='0x4'/>
      <address domain='0x0000' bus='0x02' slot='0x10' function='0x6'/>
      <address domain='0x0000' bus='0x02' slot='0x11' function='0x0'/>
      <address domain='0x0000' bus='0x02' slot='0x11' function='0x2'/>
      <address domain='0x0000' bus='0x02' slot='0x11' function='0x4'/>
      <address domain='0x0000' bus='0x02' slot='0x11' function='0x6'/>
      <address domain='0x0000' bus='0x02' slot='0x12' function='0x0'/>
      <address domain='0x0000' bus='0x02' slot='0x12' function='0x2'/>
      <address domain='0x0000' bus='0x02' slot='0x12' function='0x4'/>
      <address domain='0x0000' bus='0x02' slot='0x12' function='0x6'/>
      <address domain='0x0000' bus='0x02' slot='0x13' function='0x0'/>
      <address domain='0x0000' bus='0x02' slot='0x13' function='0x2'/>
      <address domain='0x0000' bus='0x02' slot='0x13' function='0x4'/>
      <address domain='0x0000' bus='0x02' slot='0x13' function='0x6'/>
    </iommuGroup>
    <pci-express>
      <link validity='cap' port='0' width='0'/>
      <link validity='sta' width='0'/>
    </pci-express>
  </capability>
</device>

上面的列表中, 第一個是PCIex16控制器, 第二第三個是PF, 后面的都是VF

  • 0000.00.01.0 PCI bridge: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller (rev 06)
  • 0000.01:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
  • 0000.01:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
  • 0000.02:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
  • ...
  • 0000.02:13.6 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)

即使關閉這個網口的SR-IOV(向sriov_numvfs中寫入0), 通過virsh nodedev-dumpxml查看物理網口的信息, 依然是

<iommuGroup number='1'>
  <address domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
  <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
</iommuGroup>

因此即使是不開啟SR-IOV, 要將此網卡配置至虛機也是不行的. 只有將此網卡移至第二個PCIE插槽, PF和VF才會出現在各自的iommuGroup中. 在選擇硬件時, 應該避免選擇家用的i3, i5, 以及低端的E3, 盡量選擇E5及更高規格的CPU, 在選擇主板時, 應當選擇有2條或更多PCIEx4以上插槽的主板

相關的資料

This occurs when the PF is installed behind components in the system that do not support PCIe Access Control Services (ACS). The IOMMU group contains both the PF and the VF because upstream transactions can be re-routed downstream by these non-ACS components before being translated
by the IOMMU. Please provide 'sudo lspci -vvv', 'lspci -n', and kernel version and we might be able to give you some advise on how to work around the problem.
It does not and that's exactly the problem. We must assume that the root port can redirect a transaction from a subordinate device back to another subordinate device without IOMMU translation when ACS support is not present. If you had a device plugged in below 00:01.0, we'd also
need to assume that non-IOMMU translated peer-to-peer between devices behind either function, 00:01.0 or 00:01.1, is possible.
Intel has indicated that processor root ports for all Xeon class processors should support ACS and have verified isolation for PCH based root ports allowing us to support quirks in place of ACS support. I'm not aware of any efforts at Intel to verify isolation capabilities of root ports on client processors. They are however aware that lack of ACS is a limiting factor for usability of VT-d, and I hope that we'll see future products with ACS support.
Chances are good that the PCH root port at 00:1c.0 is supported by an ACS quirk, but it seems that your system has a PCIe switch below the root port. If the PCIe switch downstream ports support ACS, then you may be able to move the 82599 to the empty slot at bus 07 to separate the VFs into different IOMMU groups.

Intel Xeon E3-1200 v3/4th Gen Core Processor lacks necessary features to support SR-IOV use case. Intel Xeon E5 Processors are recommended for SR-IOV use case.

Move the card to a slot hosted by a PCH root port, otherwise no, ACS is not supported on your processor root ports.

On Xeon class processors (except E3-1200 series), the processor-based PCIe root ports typically support ACS. Client processors, such as the i5/i7 Core processor do not support ACS, but we can hope future products from Intel will update this support.

插在PCIex4的82599網卡, 作為SR-IOV設備添加到虛機導致虛機崩潰

宿主機和虛機都是Centos7.9, 添加成功, 但是會出現vfio_dma_map錯誤導致虛機關閉

vfio_dma_map(0x145ef2bf0fc0, 0x98400000, 0x7c000, 0x145efae47000) = -14 (Bad address)
qemu: hardware error: vfio: DMA mapping failed, unable to continue

這個問題在升級宿主內核到5.11.x后消失

相關issue

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM