DPDK+OVS+QEMU搭建vhost-user實(shí)驗(yàn)環(huán)境

目前在virtio后端驅(qū)動(dòng)方面性能最好的是用戶態(tài)的vhost-user,而DPDK又是用戶態(tài)vhost實(shí)現(xiàn)里使用最廣泛的。下面介紹一下怎么搭建這樣一個(gè)vhost-user實(shí)驗(yàn)環(huán)境。我們這里使用的全部是最新的版本(ovs2.8+DPDK17.05+qemu2.9.93).

1.由于涉及到虛擬化,先檢查計(jì)算機(jī)是否開(kāi)啟了虛擬化

先確保計(jì)算機(jī)bios打開(kāi)了Intel-VT,然后檢查grub選項(xiàng)是否開(kāi)啟了IOMMU,vim打開(kāi)/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT后的引號(hào)里面加上一句:

iommu=pt intel_iommu=on default_hugepagesz=1G hugepagesz=1G hugepages=8

如圖所示:

grub設(shè)置.png

這里直接添加了大頁(yè)的配置,DPDK的大頁(yè)配置支持2MB大頁(yè)和1GB大頁(yè),使用的時(shí)候根據(jù)具體情況而定,這里我們分配了8個(gè)1GB的大頁(yè)。

2.然后編譯DPDK

DPDK默認(rèn)編譯成.a的靜態(tài)鏈接庫(kù),但也可以修改DPDK文件夾下的config/common_base文件里的CONFIG_RTE_BUILD_SHARED_LIB=y (但有一點(diǎn)要注意的就是,common_base是生成所有平臺(tái)下編譯選項(xiàng)的基礎(chǔ),直接修改也會(huì)影響其他target下的編譯,也可以僅僅修改生成的本平臺(tái)下的config文件,或者lib庫(kù)編譯里面的build/.config)來(lái)編譯成動(dòng)態(tài)鏈接庫(kù)。該文件是所有架構(gòu)下最基礎(chǔ)引用的配置文件,在文件中可以設(shè)置某些庫(kù)不編譯,以及是否編譯允許debug等。但是不建議編譯成動(dòng)態(tài)庫(kù),后續(xù)鏈接麻煩

之后就和官網(wǎng)教程一樣,設(shè)置編譯目標(biāo)環(huán)境,config等

make config T=x86_64-native-linuxapp-gcc

sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config

make

make install

make完成之后,如果選擇的是編譯成靜態(tài)鏈接庫(kù),這段無(wú)視。如果編譯成動(dòng)態(tài)鏈接庫(kù),去build/lib文件夾下把整個(gè)文件夾里面的.so動(dòng)態(tài)鏈接庫(kù)文件全部復(fù)制到/usr/lib/dpdk/文件夾下,沒(méi)有文件夾就建一個(gè)。然后在/etc/ld.so.conf.d/文件夾下建一個(gè)dpdk.conf文件,編輯dpdk.conf,寫一句話:/usr/lib/dpdk。保存退出,命令行輸入ldconfig,使系統(tǒng)自動(dòng)加載的動(dòng)態(tài)鏈接庫(kù)生效。

3.編譯OVS

先安裝OVS編譯過(guò)程中會(huì)缺的庫(kù):

sudo apt-get install autoconf automake libtools python-pip
pip install six

在OVS文件夾內(nèi)configure時(shí)加上--with-dpdk選項(xiàng),即可與DPDK關(guān)聯(lián)。

./configure --with-dpdk=$DPDK_BUILD

DPDK_BUILD就是之前編譯dpdk之后產(chǎn)生的build文件夾路徑。
然后

make

sudo make install

安裝完成之后,就可以啟動(dòng)ovs了,需要DPDK實(shí)現(xiàn)綁定大頁(yè)和網(wǎng)卡,以后每次啟動(dòng)ovs只需要最下面兩個(gè)命令啟動(dòng)ovs最重要兩個(gè)進(jìn)程即可:

modprobe vfio-pci

chmod a+x /dev/vfio

chmod 0666 /dev/vfio/*

dpdk-stable-17.05.1/usertools/dpdk-devbind.py --bind=vfio-pci eth4

mount -t hugetlbfs -o pagesize=1G none /dev/hugepages

mkdir -p /usr/local/etc/openvswitch
mkdir -p /usr/local/var/log/openvswitch
mkdir -p /usr/local/var/run/openvswitch
#剛裝完OVS需要新創(chuàng)建這幾個(gè)目錄,不然會(huì)提示找不到文件,以后用的時(shí)候不用

ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema  #利用ovsdb-tool創(chuàng)建ovsdb數(shù)據(jù)庫(kù),第一次需要

ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach  #啟動(dòng)ovsdb進(jìn)程

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true #設(shè)置OVS里的一些配置

ovs-vswitchd --pidfile --detach   #啟動(dòng)ovs-vswitch進(jìn)程

其中的網(wǎng)卡綁定結(jié)合實(shí)際選擇網(wǎng)卡,這樣ovsdb和ovs-switchd進(jìn)程都啟動(dòng)了,就可以執(zhí)行ovs命令了。
建立一個(gè)虛擬網(wǎng)橋用于和qemu前端進(jìn)行socket通信。

ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev

ovs-vsctl add-port br0 vhost-user-1 -- set Interface vhost-user-1 type=dpdkvhostuserclient options:vhost-server-path="/tmp/sock0"

這步可能有各種錯(cuò)誤,耐心找下都是什么原因,大多數(shù)都是和內(nèi)存有關(guān),比如第一次有可能因?yàn)槲磥?lái)得及分配內(nèi)存建立端口時(shí)候不成功,刪除了這個(gè)端口再建一次

建立網(wǎng)橋和端口有沒(méi)有成功,可以用ovs-vsctl show命令查看,正確的狀態(tài)如下:

d9fd8d79-b6c0-4f13-8369-4755085471ba

   Bridge "br0"

       Port "br0"

           Interface "br0"

               type: internal

       Port "vhost-user-1"

           Interface "vhost-user-1"

               type: dpdkvhostuserclient

               options: {vhost-server-path="/tmp/sock0"}

至此,后端驅(qū)動(dòng)vhost以及它之上的交換機(jī)已經(jīng)啟動(dòng)了,處于等待狀態(tài)。(但是qemu 2.7以上才支持重連功能)

4.再來(lái)安裝qemu

先安裝依賴項(xiàng):

sudo apt-get install zlib1g-dev
sudo apt-get install libglib2.0-dev
sudo apt-get install libncurses5-dev
sudo apt-get install libpixman-1-dev

qemu安裝比較簡(jiǎn)單,直接configure、make、make install即可。
創(chuàng)建鏡像,必須要qcow2格式:

qemu-img create -f qcow2 virtual.img 20G

安裝虛擬機(jī),設(shè)置了端口50,可以用VNC遠(yuǎn)處連接虛擬機(jī):

qemu-system-x86_64 -m 2048 --enable-kvm -boot d -hda /var/iso/virtual.img -cdrom /var/iso/ubuntu-16.04.2-desktop-amd64.iso -vnc 0.0.0.0:50

下載一個(gè)VNC軟件,像tightVNC,就可以輸入"主機(jī)ip:50"來(lái)連接該虛擬機(jī),然后進(jìn)入安裝流程,安裝完畢后退出。

使用vhost-user作為網(wǎng)絡(luò)接口,啟動(dòng)虛擬機(jī):

qemu-system-x86_64 -machine accel=kvm -cpu host -smp sockets=2,cores=2,threads=2 -m 2048M -object memory-backend-file,id=mem,size=2048M,mem-path=/dev/hugepages,share=on -drive file=/var/iso/virtual.img -drive file=/opt/share.img,if=virtio -mem-prealloc -numa node,memdev=mem -vnc 0.0.0.0:50 --enable-kvm -chardev socket,id=char1,path=/tmp/sock0,server -netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce -device virtio-net-pci,netdev=mynet1,id=net1,mac=00:00:00:00:00:01

虛擬機(jī)啟動(dòng),vhost的前后端驅(qū)動(dòng)也已連接。此時(shí)在/var/log/syslog中也能看到DPDK輸出的日志信息,讀取了前端qemu的內(nèi)存布局。這樣一個(gè)vhost-user環(huán)境就已經(jīng)搭起來(lái)了,可以用TightVNC遠(yuǎn)程連接這個(gè)虛擬機(jī)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容