SPDK,一款用于NMVe协议的驱动开发工具。但是由于境内网络原因、版本问题、Python安装问题,将其`github`主页上区区几行命令的执行难度,提升了不少。
经历过两次痛苦的安装过程(第一次没有好好记录),我决定这一次要好好地记录一回。
前置条件
Ubuntu16.04.5 Desktop LST,但是后来自动升级了Ubuntu16.04.7?
默认有 Python2.7.12 与Python3.5.2,但是之后还得安装高版本的(3.5的肯定不行,至少需要3.7.5以上的,更低版本的没试过)
默认有 g++ 5.4.0
安装好了vim,方便编辑,有 VSCode 更好
安装好 git
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上不好使
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 执行查找命令:按下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
然后根据提示选择要使用的版本序号
Python 版本被更改之后,命令行快捷键、系统软件无法打开:
[参考文献1](https://blog.csdn.net/qq_38977019/article/details/107472381) 的最后。
二.安装 SPDK
尝试修改Ubuntu /etc/host.conf 以加速github 安装过程参考:SPDK 官网
1) git clone SPDK
git clone https://github.com/spdk/spdk 执行情况依赖于网络情况,多次尝试以期下载完成。
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的配置文件,详见解决方法。
5) 编译
./configure
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 found 、build-tmp not found 之类的。 但是meson和ninja不是在sudo ./scripts/pkgdep.sh 的时候安装了吗? 使用 sudo pip3 install meson 和sudo pip3 install ninja ,确实能找得到两个包,但是meson --version 和ninja--version 找不到,
也就是系统中找不到这两个包。应该是包的链接不对。(当然可以使用非pip方式安装这两个包,但是可能会出现版本问题,所以还是想着解决pip的问题吧)
这里是一个非常好的SPDK的安装和简单使用教程,里面c、编译spdk 这一步,提到了
解决meson: not found 的方式。其实也就是将pip3下载的安装包的……/bin/…… 文件链接到/usr/bin/…… 。
然后执行meson --version 和ninja --version ,输出版本号就算成功了。
如果测试通过了就他妈的下好了。
三.绑定NVMe设备
到spdk文件夹下,执行命令
sudo scripts/setup.sh
成功绑定的时候会输出
nvme -> uio_pci_generic
四.执行示例 hello_world
成功编译的spdk 项目会有数个已经编译好的示例项目,这些项目的源文件在 spdk/examples 当中,编译好的可执行文件在 spdk/build/examples/ 之中。
想执行的话,键入文件的路径即可。比如执行hello_world 就输入(使用root 身份)
sudo build/examples/hello_world
五.分配 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。
|