什麼是 VT-d ,IntelR Virtualization Technology(VT-d) 或是 AMD input/output memory management unit (IOMMU) 主要是透過內建於主機板的北橋晶片所提供的虛擬化技術.透過此一虛擬化的技術可讓虛擬機器針對週邊硬體等 I/O 等裝置做直接做存取 (Directed I/O),
不過首先必須你的硬體包括 CPU 和北橋都必須支援, BIOS 以及軟體都必須要支援, 而 RedHat 在 RHEL5.4 Xen 就開始支援的 VT-d 的功能,不過在使用前最好先詳細詢問一下你的硬體廠商是否有支援, 目前我手上的版子使用了 Nehalem + Tylersburg 的架構他剛好都有支援我所需的虛擬化技術 VT-x 以及 VT-d .
關於這幾項虛擬化可以參考先前的文章 https://benjr.tw/3383
這篇文章參考了 CentOS 5 對於 VT-d 的支援說明 http://itknowledgeexchange.techtarget.com/linux-lotus-domino/centos-5-and-pciback-aka-hiding-pci-card-from-xen-dom0/
在 Linux 核心中可以看到 Xen 對於 VT-d 的支援
[root@benjr ~]# cat /boot/config-2.6.18-194.el5xen |grep -i backend CONFIG_XEN_BACKEND=y CONFIG_XEN_BLKDEV_BACKEND=m CONFIG_XEN_NETDEV_BACKEND=m CONFIG_XEN_PCIDEV_BACKEND=m CONFIG_XEN_PCIDEV_BACKEND_VPCI=y
預設都是以模組的方式做編譯,所以我們想將系統上的裝置當成是 Direct I/O 時只需修改 initrd 參數.
[root@benjr ~]# vi /etc/modprobe.conf options pciback hide=(04:00.0)
不過在新增前我們必須先搞懂 Linux 底下裝置的號碼.透過 #lspci 可以看到裝置名稱前面有使用三個編號用來當作識別值,個別為 1. "匯流排(bus number)", 2. "裝置(device number) 以及 3. "功能(function number)"這就是要加入到核心當作可 Direct I/O 裝置的參數值.
目前我手上有一張 Chelsio 10G Ethernet 網卡,其裝置就是 04:00.0
[root@benjr ~]# lspci 04:00.0 Ethernet controller: Chelsio Communications Inc T310 10GbE Single Port Adapter
不過在核心參數之外 Linux 使用 Class ID + Vendor ID + Device ID 來代表裝置,我們還是可以透過 #lspci -n 來看裝置的 Class ID + Vendor ID + Device ID.
[root@benjr ~]# lspci -n 04:00.0 0200: 1425:0030
重新建立 initrd 並將系統重新開機後,如果沒錯誤透過 xen command 就可以得知目前哪一些裝置可以透過 Direct I/O 指派給虛擬機來使用.
[root@benjr ~]# mkinitrd -f /boot/initrd-$(uname -r).img $(uname -r) –preload=pciback
[root@benjr ~]# xm pci-list-assignable-devices 0000:04:00.0
回到 Virtual Machine Manager ( #virt-manager ) 的 Virtual Machine / Hardware / Add Hardware
在 Hardware Type 中可以看到 Physical Host Device .雖然在 Device 中會列出目前系統所有的裝置但唯有透過剛剛的設定方式的裝置才真正可以當成 Direct I/O 的裝置.
選擇剛剛我所設定出的 04:00.0 T310 10GbE Single Port Adapter 把他加入到 Virtual Machine 的硬體裝置中,回到 Virtual Machine 中使用 #lspci 可以看到目前裝置的確多了T310 10GbE Single Port Adapter.
雖然這個 Chelsio 10G 網路裝置可以指派給多台虛擬機器,不過 Direct I/O 在使用上是有限制的最多只有 1 台虛擬機器可以針對這裝置做存取,所以只要其中 一台被指派過 Chelsio 10G 網路裝置的虛擬機器是啟動的狀態時,其他也有指派這 Chelsio 10G 網路裝置的虛擬機器是不被允許啟動的.
如果你需要同時讓多台虛擬機使用同一個裝置時則必須透過另一個虛擬技術 VT-c(Virtualization Technology for Connectivity).
博主你好!我现在在Fedora16上安装了XEN(用这种方法http://blog.csdn.net/charlsecharlse/article/details/7041334),也能安装guest xp.但是如果修改成vt-d support的话,由于fedora16上没有modprobe.conf或module.conf,所以您提供的方法1还是无法实现(我有试过自己创建modprobe.conf,依然不成功。。。)而方法2由于现在没有menulist,只有/boot/grub2中的grub.conf,并不清楚如何修改,还请指点迷津,谢谢!
博主你好,网卡已经hide好了,用的这种方法:echo “8086 10b9” > /sys/bus/pci/drivers/pci-stub/new_id
echo “0000:01:00.0” > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo “0000:01:00.0” > /sys/bus/pci/drivers/pci-stub/bind
不过如果把网卡添加到HVM中的话,就不能启动guest xp了,正在try。。。
之前參考 Xen 的官方網頁說明 http://wiki.xensource.com/xenwiki/VTdHowTo 但此作法只適用於 direct I/O 編譯成核心的作法,不過 RHEL5 是將 Direct I/O 的功能編譯成模組,必須修改 inirtd 的方式來做.
下面是適用於將 Direct I/O 編譯成核心的作法:
想將系統上的裝置當成是 Direct I/O 時只需再開機核心加入參數即可.
不過在新增前我們必須先搞懂 Linux 底下裝置的號碼.透過 #lspci 可以看到裝置名稱前面有使用三個編號用來當作識別值,個別為 1. "匯流排(bus number)", 2. "裝置(device number) 以及 3. "功能(function number)"這就是要加入到核心當作可 Direct I/O 裝置的參數值.
目前我手上有一張 Chelsio 10G Ethernet 網卡,其裝置就是 04:00.0
不過在核心參數之外 Linux 使用 Class ID + Vendor ID + Device ID 來代表裝置,我們還是可以透過 #lspci -n 來看裝置的 Class ID + Vendor ID + Device ID.
不過還需要修改一下 pciback 裝置的參數
如果沒錯誤透過 xen command 就可以得知目前哪一些裝置可以透過 Direct I/O 指派給虛擬機來使用