注意 本文提供的脚本是针对本人之前修改的sriov插件的哈。
sriov-cni简介
sriov-cni是hustcat/sriov-cni开发的一种容器网络插件(Container Network Interface),它使得容器可以直接使用物理机中扩展出来的VF(virtual functions)。Intel在此基础上,为其添加了dpdk功能。本人在Intel版本的基础上进行了修改,对应的版本是2017.10.12,具体commit为f45d68b638df76261170bd585fb4014b99990548
。 具体修改如下:
1、保存dpdk配置文件和开启dpdk驱动的代码顺序对调,保证在启动更新成功的情况下才会保存配置文件;
2、配置文件路径添加一级容器网络命名空间ID,从而使得容器内可以识别自身的配置文件;
3、添加netconf的配置保存;
4、类似VF,添加setupPF(),实现流程与setupVF()基本一致。
配置文件虽然都进行了保存,但是每次读取查找还是不够便捷,因此又写了个小脚本进行配置信息的查询(portName
, isDPDKmode
, pciAddress
),可以直接放到/usr/bin/
下,当个小命令用。
例如:
root@xftony:~# mv getpci.py /usr/bin/getpci
root@xftony:~# chmod a+x /usr/bin/getpci
之后就可以直接使用了。
root@xftony:~# cat getpci.py
#!/usr/bin/python2.7
import os
import json
import optparse
def getNameSpace():
nsFile = "/proc/1/ns/net"
nsLink = os.readlink(nsFile)
ns = nsLink[5:-1]
return ns
def getPci(path):
ns = getNameSpace()
confPath = os.path.join(path, ns)
if not os.path.exists(confPath) :
print "can not find the Dir: %s"%confPath
return
fileList = os.listdir(confPath)
portList={}
for file in fileList:
if os.path.splitext(file)[1] != '.json':
continue
portNew = {}
filePath = os.path.join(confPath, file)
fileTime = os.stat(filePath).st_ctime
fd = open(filePath, 'r')
line = fd.read()
try:
dic = json.loads(line)
except ValueError, e :
print filePath, "can not be loaded as json", e
portName = dic.get("if0name")
if not portName:
portName = dic.get("if0name")
print filePath,"can not find the ifname"
pciAddr = dic.get("pci_addr")
if not pciAddr:
print filePath,"can not find the pci"
continue
isDPDKMode = dic.get("DPDKMode")
portNew["portName"],portNew["pciAddr"],portNew["isDPDKMode"],portNew["ctime"]= portName,pciAddr,"false",fileTime
if isDPDKMode :
portNew["isDPDKMode"] = "true"
if portName not in portList.keys():
portList[portName] = portNew
else:
oldTime = portList.get(portName).get("ctime")
if fileTime > oldTime:
portList.pop(portName)
portList[portName] = portNew
return portList
def printPortList(portList):
for portName in portList.keys():
print ("portName:{:<10} isDPDKMode:{:<8}PCI:{:<}".format(portName,portList.get(portName).get("isDPDKMode"),portList.get(portName).get("pciAddr")))
if __name__ == "__main__":
usage = "usage: %prog [options] arg"
parser = optparse.OptionParser(usage)
parser.add_option("-p", "--path", dest="path", help="the dir to the confFile, default is \"/opt/pci\" ", default = "/opt/pci")
options, args = parser.parse_args()
portList = getPci(options.path)
if not portList:
print "can not find any PCI information in ", options.path
else:
printPortList(portList)
以上~