详细 SPDK安装指南

SPDK,一款用于NMVe协议的驱动开发工具。但是由于境内网络原因、版本问题、Python安装问题,将其`github`主页上区区几行命令的执行难度,提升了不少。
经历过两次痛苦的安装过程(第一次没有好好记录),我决定这一次要好好地记录一回。

前置条件

提醒我如下的配置只是一种方式。本人只在Ubuntu下尝试过SPDK的安装,其他的Linux发行版未做尝试。对于Ubuntu16.04系列,使用我如下的配置过程可以成功,至少我这里是经过亲测检验的。这里重要的步骤比如更换Python版本、切换SPDK版本,可能会引入不必要的依赖问题。如果使用的Ubuntu18.04及以上版本,建议就先按照SPDK官网的安装步骤来。如果是Ubuntu16.04或者是其他版本遇到了Python或者相关依赖问题,可以参考我如下的解决步骤。

Ubuntu16.04.5 Desktop LST,但是后来自动升级了Ubuntu16.04.7?
    命令行执行`python`是Python2.7.12,执行`python3` 是Python3.5.2,(python3之后还得安装高版本的,详见下文;我用的是Python3.7.5,稍低的版本没试过)
    默认有 g++ 5.4.0(更高版本可以)
    安装好了vim,方便编辑,有 VSCode 更好
    安装好 git
    安装了 make 工具
    ninja、meson,这两个依赖会在之后执行SPDK依赖安装命令时自动安装,不推荐自己安装;如果Python没有配置好,执行依赖安装的时候会报错,
    提醒你找不到ninja。
(安装 SPDK21.01 LST)  

最好在BIOS中取消主机的Security Boot,以免最后执行示例不成功。

事先声明,在该教程中我首先配置Python是因为我本机环境的Python不满足要求,无法正常下载SPDK所需要的依赖。如果你的实验环境可以正常地下载SPDK,没有pip的报错的话,就不用重新配置Python。

一.官网下载Python3.7.5,并安装之

这一步是最关键的一步了,先配好环境,解决后顾之忧
参考文献1
参考文献2
参考文献3

说明一下为什么要先配好Python的版本:
因为在执行之后的SPDK依赖安装时,使用到pip,如果python版本有问题,就会出现很多恶心的unment问题。

我试过官网所谓通过增加apt源来安装高版本Python的方法,但是在Ubuntu16.04.5上不好使

1) python3.7.5官网

在这里插入图片描述

2) 我在/home下建立了文件夹python37,放置压缩包,并解压

sudo tar -zxvf Python-3.7.5.tgz

3) 安装依赖

sudo apt-get install libffi-dev
sudo apt install zlib*

4) 修改Setup文件

cd ~/Python37/Python-3.7.5/Modules
sudo vim Setup.dist
执行查找命令:按下shift键进入vim命令模式,输入"/#zlib",定位该行
#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
去掉注释

5) 进入Python3.7.5解压后的目录,然后执行

sudo ./configure --prefix=/opt/python3.7

6) 编译

sudo make

7) 执行测试

sudo make test
假如测试未通过,先根据报错解决问题,很可能是是一些依赖问题

8) 安装

sudo make install

9) 创建软链接

sudo ln -s /opt/python3.7/bin/python3.7 /usr/bin/python3.7

10) 调整优先级(因为Ubuntu系统自带的python3版本为python3.5.2)

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2

11) 查看当前Python3版本

python3

注意

Python3 版本自由切换:

sudo update-alternatives --config python3

然后根据提示选择要使用的版本序号

在这里插入图片描述

12) 调整pip3中main函数调用方式

参考链接
python3升级后,对于python中main入口的调用方式略有不同,这里提前修改一下,避免后续安装SPDK依赖报错。
在修改pip配置文件/usr/bin/pip3。原文件内容一般为:

from pip import main
if __name__ == '__main__':
    sys.exit(main())

要修改为:

from pip import __main__
if __name__ == '__main__':
    sys.exit(__main__._main())

一定要注意在最后一行调用的方法是_main(),前面有一个短下划线。

13) 更改Ubuntu UI所依赖的python库

Ubuntu的图标和软件之间的链接,高度依赖于python。如上手动更新了本机默认的python3之后,先不要重启机器,因为此时Ubuntu还未更新所依赖的python库,直接重启会导致Ubuntu的软件图标点击后无响应,典型的如系统Setting应用。这个情况的解决方案如下:
参考文献1 的最后。

二.安装 SPDK

尝试修改Ubuntu /etc/host.conf 以加速github
安装过程参考:SPDK官网

1) git clone SPDK

git clone https://github.com/spdk/spdk
能使用网络代理是最好的,如果没有代理则下载的网络不稳定,就得多次尝试,也能最终下载完成。
这里注意,git clone的时候不要使用sudo权限,否则下载的代码文件夹会出现权限问题,影响git的执行。

2) 更换版本

git tag,查看版本

这里选择v21.01:

git checkout v21.01

在这里插入图片描述

3) 下载子模块

git submodule update --init
执行情况依赖于网络情况,多次尝试以期下载完成。

4) 安装依赖

sudo ./scripts/pkgdep.sh
这里安装的meson和ninja不一定可用,在最后一步执行测试遇到的问题中,会讲到解决方式。
如果在这一步总是出现unmet dependencies的问题,这个问题超恶心,不过倒是可以试试对症下药,少啥就下啥,详见此处

在安装的时候,可能会出现一些和pip有关的问题。

ERROR 1:这里可能会出现找不到 python main 方法的报错

因为pip版本升级了,调用main方法的方式是不一样的,解决方式

ERROR 2:subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.

这个完整的报错会非常长,详见解决方法

ERROR 3:ssl的问题,pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

其实就是安装ssl相关依赖就好了,但是要注意修改Python的配置文件,详见解决方法

ERROR 4:pip3的代理问题

如果开发环境是公司内网,则需要走公司的网络代理,并且最好指定pip3的镜像源。
理论上可以通过配置全局代理来配置pip3的代理,但是我这里配置了全局代理后,在命令行尝试单独执行pip3 install ......可以执行,然而在执行脚本时,pip3的表现是Retrying......,就是网络访问还是有问题。可以在./scripts/pkgdep.sh脚本内对应的pip3下载语句临时添加需要的代理,以及镜像2222命令。比如我在下载ninja和meson的时候就遇到上述问题,于是在脚本中找到对应的下载命令,进行修改:
原脚本:

pip3 install ninja

修改后:

pip3 --proxy=http://your_id:pwd@proxy_url:port install ninja -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

其中,pip3的下载镜像使用的是douban的镜像;--proxy使用公司的代理链接即可。

5) 编译
$ ./configure
$ sudo make

当后面的步骤出问题,(找不到文件啥的),可以尝试重新执行此命令。
后续的配置发生改动时,一定要从这一步开始重新编译一下。
特别是make出问题的时候,很可能一些依赖更新或者改动之后,需要重新执行./configure

6) 执行测试

./test/unit/unittest.sh

如果最后输出了all unit test passed,就不用往后看了。

这一步仍然可能出问题。

当然,走到这一步,spdk的基本功能(比如发现NVMe设备)已经可以用了,但是在成功执行测试之前无法执行示例程序。<br.>
执行这条命令可能会提示disabling lcov allows us to do this之类的错误,也就是单元测试不能正常执行。

我尝试了安装lcov、卸载lcov,都不顶用。以及重新编译下载的Python3.7.5(重新编译,就是执行本文中python安装步骤的5~8,不用再重建链接啦)。

这些都不好使。

仔细看看报错,它说在 spdk/mk 中有个 cc.mk 找不到,我对比了另一台服务器上成功安装的 spdk ,是有这个文件的,但是

其下载时间比其他的文件晚。我一度怀疑是不是还是测试通过之后才能有这个文件?

既然是.mk文件缺失,于是尝试重新执行make,发现报错,meson: not foundbuild-tmp not found之类的。
但是meson和ninja不是在sudo ./scripts/pkgdep.sh的时候安装了吗?
使用 sudo pip3 install mesonsudo pip3 install ninja,确实能找得到两个包,但是meson --versionninja--version找不到,

也就是系统中找不到这两个包。应该是包的链接不对。(当然可以使用非pip方式安装这两个包,但是可能会出现版本问题,所以还是想着解决pip的问题吧)

这里是一个非常好的SPDK的安装和简单使用教程,里面c、编译spdk这一步,提到了

解决meson: not found的方式。其实也就是将pip3下载的安装包的……/bin/……文件链接到/usr/bin/……

然后执行meson --versionninja --version,输出版本号就算成功了。

如果测试通过了就他妈的下好了。

在这里插入图片描述

三.绑定NVMe设备

到spdk文件夹下,执行命令

sudo scripts/setup.sh

成功绑定的时候会输出

nvme -> uio_pci_generic

四.执行示例

成功编译的spdk项目会有数个已经编译好的示例项目,这些项目的源文件在 spdk/examples 当中,编译好的可执行文件在 spdk/build/examples/之中。

想执行的话,键入文件的路径即可。比如执行hello_world就输入(使用root身份)

hello_world
sudo build/examples/hello_world
perf io test

示例官方文档。

sudo build/examples/perf -q 128 -o 4096 -w randread -r 'trtype:PCIe traddr:0000:01:00.0' -t 10

在这里插入图片描述

其中-q为队列深度;-o为模拟测试的数据大小,这里4096是4KB;-w是选择io测试模式,可以是randread, randwrite, randrw等;-r是设备的协议类型和地址;-t是测试的持续时间。

五.分配 HugePages 问题

在执行示例的时候,有可能会提示你

EAL: No available hugepages reported in hugepages-1048576kB
......
no NVMe controllers found

要注意,SPDK会涉及对主机PCI设备的直接访问。对PCI设备的直接访问操作是需要主机的许可的——需要主机关闭Security Boot

若出现以上问题,首先排查主机的Security Boot是否关闭。

关闭Security Boot就要进入BIOS模式,找到相应的选项,不同厂商的主机,不同型号的主机,方式都不一样。

详见官网这个问题,答案在最后。

当然,也可以排查一下Hugepages的分配问题,
参考1
参考2
参考3
参考4

NVMe(Non-Volatile Memory Express)是一种高性能、低延迟的存储协议,用于连接闪存存储设备(如SSD)和计算机系统。NVMe-CLI是一个用于管理NVMe设备的命令行工具,而SPDK(Storage Performance Development Kit)是一个用于构建高性能存储应用程序的开源工具包。下面是nvme-cli和SPDK的入门指南: 1. 安装NVMe-CLI和SPDK 可以从官方网站下载NVMe-CLI和SPDK并进行安装。具体安装方法可以参考官方文档。 2. 使用NVMe-CLI管理NVMe设备 使用nvme-cli可以查看NVMe设备列表、查看设备信息、查看设备的SMART属性信息、格式化设备等。以下是一些常用命令: - 列出所有NVMe设备:`nvme list` - 查看设备信息:`nvme id-ctrl /dev/nvmeX` - 查看SMART属性信息:`nvme smart-log /dev/nvmeX` - 格式化设备:`nvme format /dev/nvmeX` 其中,/dev/nvmeX表示NVMe设备的路径,X为设备号。 3. 使用SPDK开发高性能存储应用程序 SPDK提供了一系列API,可以用于开发高性能存储应用程序。以下是一个简单的SPDK应用程序示例: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <stdbool.h> #include <pthread.h> #include <spdk/stdinc.h> #include <spdk/env.h> #include <spdk/nvme.h> static void probe_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, struct spdk_nvme_ctrlr_opts *opts) { printf("Found NVMe controller at %s\n", trid->traddr); } int main(int argc, char **argv) { int rc; rc = spdk_env_init(NULL); if (rc < 0) { printf("Unable to initialize SPDK env\n"); return -1; } rc = spdk_nvme_probe(NULL, NULL, probe_cb, NULL); if (rc < 0) { printf("NVMe probe failed\n"); return -1; } spdk_env_fini(); return 0; } ``` 这个应用程序使用SPDK API来探测NVMe设备。首先,它初始化SPDK环境,然后调用spdk_nvme_probe函数来探测NVMe设备。当发现设备时,probe_cb回调函数会被调用并打印控制器地址。最后,应用程序关闭SPDK环境并退出。 以上是nvme-cli和SPDK的入门指南,希望对你有帮助。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值