利用SPDK配合QLogic HBA创建FC-NVMe target系统
SPDK是最近比较热门的存储软件平台,用户态和轮询机制可以最大限度的保证驱动的性能。
前面的文章已经介绍了如何利用SPDK 构建FCP的target,本文介绍一下,利用SPDK 来构建FC-NVMe的target系统。
软件准备
- SPDK 20.01.1
- DPDK 19.11
- QFC 4.5.4d
1. 安装准备
首先解压qfc 压缩包,解开后有3个目录,分别为qfc-spdk, qfc 和 umq 。暂时不动它们,稍后进行操作。
解压SPDK的压缩包,进入其中的spdk-20.01.1/app目录。将刚才的解出的 qfc-spdk 目录拷贝至此。 进入spdk-20.01.1/lib目录,将刚才解出的qfc,ump目录拷贝至此。
1 | cd spdk-20.01.1/ |
然后回到spdk-20.01.1目录,将DPDK压缩包解压。
1 | tar zxvf /home/dpdk-19.11.tar.gz |
2. 编译DPDK代码
打补丁
1 | #cd spdk-20.01.1 |
这段代码补丁的主要作用是:
- 把qfc-spdk 驱动加入spdk 平台
- 把QLogic HBA卡的PCI IDs 加入到uio_pci_generic 驱动
然后修改 spdk-20.01.1/CONFIG 文件
1 | Set CONFIG_NVMEFC=y |
编译DPDK,假设是使用x86_64平台:
1 | # cd dpdk-19.11 |
3. 编译SPDK代码
先设定qfc-spdk的工作模式,编辑 app/qfc-spdk/Makefile,将模式改为qfc_tgt:
APP = qfc_tgt
#APP = qfc_app
然后编译代码
1 | # cd spdk-20.01.1 |
这个步骤里面,如果Linux OS系统是最小化安装的,会提示缺少一些库文件,比如uuid, numactl 之类的。通过yum 或者apt-get 补上就好了。不过在CentOS 系统当中,有CUnit-devel 这个库是官方yum源没有提供,可以从 pkgs.org 上面直接下载。
4.设置QFC SPDK 参数
上面编译工作都完成之后,就可以启动SPDK了。启动SPDK之前,首先编辑修改一下 qfc.conf.in 这个配置文件,文件位于 app/qfc-spdk 目录。
里面的注释已经比较清楚了,如果是简单测试,其实修改下面几个部分即可:
1 | [QFC] |
其他不需要的部分可以直接注释掉。
5. 启动SPDK
首先运行脚本,注册HBA卡:
1 | # cd spdk-20.01.1 |
这个动作每次设备重启之后,都需要重新注册一下。
然后设置系统Huge page,可以通过DPDK 当中 usertools 目录里面的 dpdp-setup.sh 脚本来进行,需要预留至少6GB的内存huge page.
最后通过命令行启动SPDK,这里注意一下,qfc4.5.4 之后采用了一个新的 -g参数:
1 | ./app/qfc-spdk/qfc_tgt -c ./app/qfc-spdk/qfc.conf.in -g |
如果在运行中看到如下报错:
1 | umq: 0: umq_load_file_fw:6260: filestat error /lib/firmware/ql2700_fw.bin |
则说明在系统的 /lib/firmware 目录当中缺少firmware 文件,请把ql2700_fw.bin 文件拷贝到这个目录中。
我在第一次运行SPDK 之后,会看到这行信息:
1 | umq: 3: umq_handle_aen:149: Target port Link Up: nn-0x20000024ff7799ab:pn-0x21000024ff7799ab |
因此就知道我目前的HBA卡使用的端口,它的WWPN和WWNN号码,把WWPN 替换刚才 qfc.conf.in 文件当中 [Subsystem] 模块的内容,把信息改为:
1 | [Subsystem2] |
然后重启spdk,即可正常启动FCP Target。 如果想测试FC-NVME,还是修改qfc.conf.in 对应模块即可。
6. 服务器host端设置
从10.02.xx qla2xxx驱动开始,我们在编译驱动的时候,可以增加一个参数来进行FC NVMe discovery 服务。但是前提条件是,必须安装nvme-cli 工具。
所以首先yum 安装nvme-cli:
1 | # yum install nvme-cli |
然后从QLogic驱动下载网站,下载最新的10.x 的Linux驱动。目前官网最新Linux 版本是10.02.06.xx
下载源码之后,首先进行编译安装。编译安装需要系统首先安装kernel源码:
1 | # yum install kernel-devel |
然后解压驱动包:
1 | # tar -xzvf qla2xxx-src-10.02.xx.yy.zz-k.tar.gz |
编译安装新驱动
1 | ./extras/build.sh initrd |
这里需要介绍一下,编译安装的时候,有多种参数,可以直接使用 -h参数查看
1 | ./extras/build.sh -h |
其中 install 参数是单纯编译,但是并不集成到启动镜像initrd image里面,这样你重启服务器之后,系统自动加载的qla2xxx 驱动版本,仍然是初始的inbox驱动版本; 而initrd 参数则是编译安装之后,把新驱动合并到initrd image当中,这样你重启服务器之后,系统加载的也是新的qla2xxx驱动版本了。
在安装完驱动之后,仍然使用脚本工具,执行命令参数 install_fcnvme_scripts:
1 |
|
这个参数的作用就是配合nvme-cli 工具,自动发现FC-NVMe target目标。
如果是采用FC-NVMe,则是看到2个nvme设备,可以通过nvme list 命令或者lsblk,或者/dev目录查看。
在ESXi 7.0 当中测试PVRDMA
RDMA 的全称是 Remote Direct Memory Access (远程内存直接访问),它是一种性能加速技术,通过网卡来直接访问另一台服务器上的内存,而不需要 CPU 的介入。而虚拟化环境当中,虚机使用 HCA 提供的 RDMA 有两种方式,一种就是直通方式,虚机独占使用 HCA,这就是我们第2种测试场景中的网络配置;另一种是虚拟化方式 PVRDMA (Paravirtual RDMA),是 VMware 对于 RDMA 技术的半虚拟化实现,vSphere 会在虚机中提供 PVRDMA 虚拟网卡,再通过 VMkernel 中的 PVRDMA 堆栈来访问 HCA,这种方式可以让多个虚机共享 HCA 设备,并且虚机之间可以利用HCA 来提高网络性能。
我们今天介绍一下,在ESXi 7.0 环境当中,使用Marvell Fastlinq QL41000 系列网卡,实现 PVRDMA 通讯。两台ESXi 主机上,分别创建1个VM 虚机,然后这两个VM 之间可以通过PVRDMA 进行数据交互。
环境准备
- 2台服务器
- 2片QL41262 网卡
- VMware ESXi 7.0
- vCenter
拓扑比较简单,两台服务器,每台服务器上,一张千兆网卡,一张QL41262 双口25G网卡。连接1G 千兆端口到管理网络,连接1个25G 端口到25G交换机,作为PVRDMA的测试网络。vCenter 服务器也连接在管理网络当中。
Marvell Fastlinq 网卡驱动版本
请访问下面 VMware 的官方网站, 然后点击展开 “Driver CD”,会根据时间最新的顺序,列出各个硬件厂商的VMware 驱动。
https://my.vmware.com/en/web/vmware/downloads/info/slug/datacenter_cloud_infrastructure/vmware_vsphere/7_0#drivers_tools
我们这里选择 “VMware ESXi7.0 NIC/iSCSI/FCoE Drivers for Marvell FastLinQ Ethernet 45000 & 41000 Series Controller” 的相关驱动即可。发布这篇文章的时候,最新的Fastlinq 驱动是 2021-02-23 发布的,点击“转至下载”会列出详细驱动版本信息。其中驱动模块版本信息如下:
qedentv-3.40.30.0
qedrntv-3.40.28.0
更新驱动
首先下载 MRVL-E4-CNA-Driver-Bundle_5.0.248.1-1OEM.700.1.0.15843807_17595680-package.zip 驱动包,然后上传到ESXi 主机的 /tmp 目录。解压zip包,得到驱动文件(也是一个.zip文件)和驱动的介绍文档目录,然后使用esxcli software 命令来安装驱动文件即可。这里注意一下,在使用esxcli 命令安装指定驱动文件时,必须使用完整地址路径,如果省略了完整路径,系统会报错。
1 |
|
安装完驱动,先不要着急重启生效,我们要先修改一下驱动参数配置,来开启网卡驱动的RDMA 功能。否则在ESXi 主机配置当中,你会只能看到普通的物理网卡,在RDMA网卡项目当中,系统会看不到对应项目。这里使用esxcfg-module 命令,将QL41000/QL45000 系列网卡的RoCE 功能打开:
1 | [root@localhost:/tmp] esxcfg-module -s 'enable_roce=1' qedentv |
好了,到了这里,直接重启 ESXi 服务器即可。服务器重启之后,可以看到RDMA网卡这里,已经可以看到25G 端口是active 的状态。
ESXi 主机设置
以下设置均采用vCenter 的GUI 界面配置。
基本网络设置
因为每台服务器是双网卡,1张千兆网卡作为管理网口,25G网卡作为业务网卡。所有先为25G网卡创建新的vswitch:
依次选择 VMKernel Network Adapter -> New standards switch -> Assigned adapters:
在第3步,选择25G网卡的端口,点击“绿色加号”图标,然后在下面列表当中选择25G端口。
在第4步,填写VMkernel 名称:
然后在第5步的时候,设置一个IP:
一路确认完毕之后,在设置当中可以看到生效了,设备名称是vmk1:
创建 vDS 交换机
在datacenter 图标上面右键,选择“distributed switch” 下面的”New Distributed Switch”
起个名字: DSwitch_PVRDMA
第2步选择版本,我这里是7.0;
第3步选择端口数量,默认是4,然后给Port Group起名:
然后一路Next结束,此时在datacenter当中的networking选项当中已经可以看到它了。
添加主机到 vDS
直接在vDS的图标上右键,选择 “Add and Manager Host”:
第1步选择添加:
第2步选择host 主机;
第3步选择主机上的网卡端口,本次测试选择25G网卡端口,如果网卡端口较多,可以通过上面的“View Settings” 来看一下网卡端口详细信息,避免错选。
确认网卡之后,点击“Assign Uplink”,把刚才选择的25G端口设为Uplink1 .
然后界面会更新,你刚刚选择的端口后面会出现(Assigned)标识。
第4步,将刚才在2.4步骤当中的vmk1, 加入到vDS的port group
完成后可看到会在vmk1 后面显示(Reassigned),这是因为把它从一个port group 指定到了新的group。
然后一路Next,结束配置。
ESXi 主机的高级系统配置
刚才设置完成了vDS,我们需要在ESXi 主机配置当中继续完成相关设定。
在Configure 菜单中,左侧选择System 下面的Advanced System Settings . 这里列出了ESXi 系统的详细设置。
我们直接点击右面蓝色的Edit 按钮,然后在文本过滤框中输入net.pv ,它会筛选出唯一的设置项目: Net.PVRDMAVmknic
在Value 框中,直接输入刚才的25G 网卡 vmk1,然后OK保存。
ESXi 主机的防火墙配置
还是在Configure->System 栏目下,选择Firewall. 和上面一样,选择Edit,然后在过滤搜索当中输入pv,会看到pvrdma的端口值,勾选前面的框,然后OK 保存。
创建VM虚拟机,并分配网卡
此时在ESXi 主机当中创建新的VM,一路按照默认,我这里的Guest OS 是CentOS 7.7.
创建完成之后,先进行配置。在VM上面右键,选择“Edit Settings”
首先将内存设置展开,然后勾选“Reserve all guest memory” 。
然后添加一块网卡,并展开新网卡的设置。点开网卡类型“VM Network”,选择Browse
选择之前创建的vDS 网络
然后再把类型选为PVRDMA
完成设置,OK 保存。
虚机安装Linux CentOS 7.7
给虚机安装Linux 系统,过程略。
虚机 CentOS 设置
加载PVRDMA驱动模块
首先通过yum安装相关的依赖包
1 | yum install rdma-core |
此时可以通过ibv_devinfo 命令查看RDMA端口状态:
1 | [root@localhost ~]# ibv_devinfo |
如果状态不是上面的情况,端口状态不是PORT_ACTIVE,则运行下面命令,重新加载相关模块。
1 | modprobe -r vmw_pvrdma //卸载pvrdma 驱动模块 |
关闭防火墙
在开始PVRDMA测试前,设置CentOS 的防火墙等系统服务:
首先关闭防火墙和网络配置服务
1 | service firewalld stop |
然后配置网卡IP。可以看到VM当中有两个网卡,一个是千兆网卡,我这里的IP端是10.x.x.x,另外为25G网卡设置IP 地址为 192.168.0.20/24 (VM20) 192.168.0.30/24 (VM30)
pvrdma 测试
在192.168.0.20 和192.168.0.30 可以互相ping 通,且ibv_devinfo 状态也都是正常后,我们可以开始PVRDMA 测试了:
在VM20 虚机上:
启动ib_write_bw 命令进行带宽测试
1 | ib_write_bw -x 1 -d vmw_pvrdma0 --report_gbits |
在VM30 虚机上:
前面设置与VM20 相同,25G网卡设置IP 为 192.168.0.30/24
启动ib_write_bw 测试命令:
1 | ib_send_bw -x 1 -d vmw_pvrdma0 --report_gbits 192.168.0.20 |
可以看到结果
同理可以进行延迟测试:
在VM20 虚机上:
启动ib_write_lat 命令
1 | ib_write_lat -x 1 -d vmw_pvrdma0 -a -F |
在VM30 虚机上:
1 | ib_write_lat -x 1 -d vmw_pvrdma0 -a -F 192.168.0.20 |
利用nvmet配合 QLogic 41000/45000系列 RNIC创建 NVME over Fabric target系统
NVME 现在正在慢慢替代传统的SCSI 成为主流的存储协议。在网络传输层面,也有了NVME over Fabric 协议规范。NVMe over Fabric支持把NVMe映射到多个Fabrics传输选项,主要包括FC、InfiniBand、RoCE v2、iWARP和TCP。
但在这众多的传输协议选择当中,谁是最适合的呢?非常有意思的是,在NVME组织的白皮书当中,直接有这样的一段话:
For instance, inorder to transmit NVMe protocol over a distance, the ideal underlying network or fabric technology will have the following characteristics:
·Reliable, credit-based flow control and delivery mechanisms.This type of flow control allows the network or fabric to be self-throttling, providing a reliable connectionthat can guarantee delivery at the hardware level without the need to drop frames or packets due to congestion. Credit-based flow control is native to Fibre Channel, InfiniBand and PCI Express®transports.
也就是并没有把支持RDMA 技术的以太网放在NVME over Fabric的理想网络协议当中,虽然以太网这边也是借用了InfiniBand 网络的RDMA, 技术但是对于以太网来讲,流控真的是一个难点,需要交换机和网卡双方面的配合以及大量的复杂的配置过程。虽然在大规模的部署当中,还是存在一些问题,但是简单的小规模的验证测试,则是非常方便。
网卡硬件
Marvell 的以太网网卡目前有E3 和E4 两个系列。 E3主要源自当年QLogic 收购的Broadcom的10G 网卡芯片,即57810, 57840系列。 E4则是QLogic后面发布的基于45000(100G能力)和41000(50G能力)两个系列。 QLogic后面被Marvell最终收购,成为Marvell产品线的一员。目前常见的有QL41132 (2x10G),QL41212(2x25G),QL45611(1x100G) 等网卡。 这里所有的E4 系列都可以使用下面的方法进行nvmet的设置。
软件准备
CentOS 7.7 (Kernel 3.10.0-1062)
Kernel Inbox OFED module
Kernel Inbox Fastlinq driver (8.37.0.20)
Target 端配置
1. 安装准备
首先确认本地的块设备:
1 | [root@localhost ~]# lsblk |
然后看一下,目前加载了哪些模块与qedr(网卡RDMA 处理模块)相关。
1 | [root@localhost ~]# lsmod |grep qedr |
然后加载nvmet 和nvmet-rdma 模块。
1 | [root@localhost ~]# modprobe nvmet |
利用SPDK配合QLogic HBA创建FC target系统
SPDK是最近比较热门的存储软件平台,用户态和轮询机制可以最大限度的保证驱动的性能。QLogic的HBA卡是目前市场上主流的FC控制器,服务器端的市场份额多年超过50%,而它在存储侧的市场份额则压倒性的领先。
对于最新的SPDK平台,QLogic也在2018年放出了它的代码,而且最大的特点是同时支持传统的FCP和最新的FC-NVMe协议。 本文介绍了使用SPDK 配合QLE26xx 16G HBA 和QLE27xx 32G HBA, 搭建存储系统的方法。
软件准备
- SPDK 20.01.1
- DPDK 19.11
- QFC 4.5.3a
1. 安装准备
首先解压qfc 压缩包,解开后有3个目录,分别为qfc-spdk, qfc 和 umq 。暂时不动它们,稍后进行操作。
解压SPDK的压缩包,进入其中的spdk-20.01.1/app目录。将刚才的解出的 qfc-spdk 目录拷贝至此。 进入spdk-20.01.1/lib目录,将刚才解出的qfc,umq目录拷贝至此。
1 | cd spdk-20.01.1/ |
然后回到spdk-20.01.1目录,将DPDK压缩包解压。
1 | tar zxvf /home/dpdk-19.11.tar.gz |
ASA5505 uses Let's Encrypt SSL certification
ASA5505 上应用Let’s encrypt 的证书
公司有一台Cisco的ASA5505,一直被自己用来进行lab网络的VPN Gateway 接入。但是以前一直是使用ASA自身的自签名证书,并没有申请正式的域名证书。看到Let’s encrypt的免费证书真的很好用,就打算把这个ASA的自签名证书变成正式的域名证书。
说起来容易,但是做起来发现不是那么容易。首先ASA5505 是比较老款的机器,并不支持Cisco REST API, 也就没有办法使用 Cisco ASA plugin for Let’s Encrypt client, 这个非常好用而且简单的插件。
既然没法使用certbot,那就只能采用手动方式来安装证书。搜索了一下,只有这个哥们儿的应用场景和我一样Implementación de Certificados Gratuitos Let’s Encrypt en Cisco ASA para Accesos VPN,可他的blog是用西班牙文写的。本想找google翻译一下,忽然发现他引用的命令都是可以直接理解的,于是拿出当年玩日文版游戏瞎猜语句的懒劲儿,开始了我的安装步骤。
1.申请域名证书
假设你打算应用在VPN网关上的域名是:asa.yourdomain.com 。那么首先使用一台服务器,安装nginx和letsencrypt certbot。因为国内的IPv4网络环境往往都封闭80和443端口,除非你去做了备案,才能保证可用,所以我选择了IPv6。首先设置web服务器网络接口ip是一个全球可路由的IPv6地址,然后在he.net 上面的FreeDNS 把这个IPv6地址指向 asa.yourdomain.com 。
接着配置安装nginx,默认安装即可,我们只是使用它获取https在目标服务器的80/443端口自动验证。
我的服务器是FreeBSD 11.2,所以命令是:
1 | pkg install nginx |
如何获取证书,这里就不在赘述,网上有很多的教程,在FreeBSD里面的命令是,然后按照提示操作即可:
1 | certbot certonly --standalone |