日常搬磚打雜所用在孝,記錄于此,以便日后查閱怠硼。
預(yù)備知識(shí):DPDK配置及使用鬼贱,SR-IOV相關(guān)概念(PF,VF)香璃,網(wǎng)卡passthrough給VM
目錄
<h4 id="1">配置過(guò)程(Ubuntu 14.04):</h4>
- 給VM所在的Host打開(kāi)iommu 以及 sriov这难,以Intel CPU為例(AMD CPU iommu打開(kāi)方式略有不同)
# Step 1 修改/etc/default/grub
# 表示對(duì)于每個(gè)物理interface,打開(kāi)4個(gè)virtual functions
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on ixgbe.max_vfs=4"
# Step 2 更新grub配置并重啟物理機(jī)
>> update-grub && reboot
重啟之后可以查看到所有的PF和VF增显,表示配置成功>> lspci | grep -i ether
雁佳,結(jié)果如下:
>> ip link show
也能夠看到每個(gè)物理interface下對(duì)應(yīng)的VFs- VF能夠收發(fā)包的前提是相應(yīng)的PF必須處于UP的狀態(tài),通過(guò)
ifconfig
來(lái)UP所有的PF - 默認(rèn)所有VF的mac地址都是全0同云,所以需要為VF配置mac地址糖权,通過(guò)
ip link set
來(lái)進(jìn)行設(shè)置
>> ip link set <ethX> vf <vf-id> mac <addr>
其余配置可選,同樣使用ip link set
來(lái)進(jìn)行設(shè)置炸站,可以通過(guò)ip link help
來(lái)查看其余可配置項(xiàng)星澳。
注:spoof checking開(kāi)啟后,會(huì)進(jìn)行mac地址檢查旱易,如果發(fā)現(xiàn)VF要發(fā)送的數(shù)據(jù)包mac地址不是本身的mac地址禁偎,則會(huì)被丟棄。
到這一步阀坏,已經(jīng)可以在物理機(jī)上使用VF了如暖,用ifconfig
把VF對(duì)應(yīng)的interface UP起來(lái)即可收發(fā)數(shù)據(jù)包。接下來(lái)是配置DPDK + SR-IOV忌堂。
- 在Host上將VF從內(nèi)核態(tài)驅(qū)動(dòng)
ixgbevf
解綁盒至,重新綁定到vfio-pci
驅(qū)動(dòng),這里可以利用DPDK提供的腳本dpdk_bind_nic.py
來(lái)設(shè)置
# 加載vfio-pci驅(qū)動(dòng)內(nèi)核模塊
>> modprobe vfio-pci
# 重新綁定VF驅(qū)動(dòng)
>> ./dpdk_bind_nic.py --bind=<vf pci bus addr> vfio-pci
到這里士修,就能夠在Host上通過(guò)DPDK在VF上收發(fā)數(shù)據(jù)包了枷遂。再接下來(lái)是,如何在VM中使用DPDK在VF上收發(fā)數(shù)據(jù)包棋嘲。
- 本文中使用的虛擬化軟件是qemu-kvm酒唉,首先在啟動(dòng)VM時(shí),需要設(shè)置qemu-kvm的啟動(dòng)參數(shù)沸移,將VF passthrough到VM痪伦。
>> qemu-system-x86_64 -enable-kvm -drive file=<vm img>,if=virtio -cpu host -smp 16 -m 16G \
-name <vm name> -device vfio-pci,host=<vf pci bus addr> -device vfio-pci,host=<vf pci bus addr> -vnc :1 -net none
重點(diǎn)在于通過(guò)-device vfio-pci,host=<vf pci bus addr>
將VF passthrough到虛擬機(jī),這樣VM就可以直接使用VF了阔籽。
- VM啟動(dòng)后流妻,
ifconfig -a
可以看到passthrough的VFs,將對(duì)應(yīng)VF的interface綁定到DPDK提供的igb_uio
驅(qū)動(dòng)就可以在虛擬機(jī)中通過(guò)DPDK使用VF收發(fā)包了笆制。
<h4 id="2">SR-IOV數(shù)據(jù)包分發(fā)機(jī)制</h4>
知道如何配置SR-IOV后绅这,還需要了解數(shù)據(jù)包是如何從外部進(jìn)入VF,以及從VF發(fā)出的數(shù)據(jù)包是如何流向的在辆,才能夠正確使用SR-IOV進(jìn)行收發(fā)包证薇。
其實(shí),從邏輯上可以認(rèn)為開(kāi)啟SR-IOV后的物理網(wǎng)卡內(nèi)置了一個(gè)定制的Switch將所有的PF和VF口連接起來(lái)匆篓,通過(guò)VF和PF的mac地址以及vlanid來(lái)進(jìn)行數(shù)據(jù)包分發(fā)浑度。
那么在入方向(從外部進(jìn)入網(wǎng)卡)上,數(shù)據(jù)包分發(fā)機(jī)制是:如果數(shù)據(jù)包的目的mac地址和vlanid都匹配某一個(gè)VF鸦概,那么數(shù)據(jù)包會(huì)分發(fā)到該VF箩张,否則數(shù)據(jù)包會(huì)進(jìn)入PF;如果數(shù)據(jù)包的目的mac地址是廣播地址,那么數(shù)據(jù)包會(huì)在同一個(gè)vlan內(nèi)廣播(即所有vlanid=數(shù)據(jù)包vlanid的VF先慷,都會(huì)收到該數(shù)據(jù)包)饮笛。
在出方向(從PF或者VF發(fā)出)上:如果數(shù)據(jù)包的mac地址不匹配同一vlan內(nèi)的任何端口(VF或PF),那么數(shù)據(jù)包會(huì)向網(wǎng)卡外部轉(zhuǎn)發(fā)论熙,否則會(huì)直接轉(zhuǎn)發(fā)給對(duì)應(yīng)的端口福青;如果數(shù)據(jù)包的mac地址為廣播地址,那么數(shù)據(jù)包會(huì)在同一個(gè)vlan內(nèi)以及向網(wǎng)卡外部廣播脓诡。
注:所有未設(shè)置vlanid的VF和PF无午,可以認(rèn)為是在同一個(gè)“vlan”中,不帶vlan的數(shù)據(jù)包在該“vlan”中按照上述規(guī)則進(jìn)行處理
此外祝谚,設(shè)置了vlan的VF宪迟,發(fā)出數(shù)據(jù)包時(shí),會(huì)自動(dòng)給數(shù)據(jù)包加上vlan交惯,在接收到數(shù)據(jù)包時(shí)踩验,可以設(shè)置是否由硬件剝離vlan頭部。(在DPDK中商玫,配置網(wǎng)卡時(shí)箕憾,可以選擇打開(kāi)strip vlan標(biāo)識(shí))