详细 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

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
SPDK(存储性能开发套件)官方文档中文版。 第一章 简介 1 1.1.什么是SPDK? 1 1.2.入门 1 1.3. Vagrant开发环境 3 1.4.更新日志(略) 6 第二章 概念 6 2.1. 用户空间驱动程序** 6 2.2. 来自用户空间的DMA** 7 2.3. 消息传递和并发** 9 2.4. NAND Flash SSD内部 13 2.5. 将I / O提交到NVMe设备** 15 2.5.1 NVMe规范 15 2.5.2 SPDK NVMe驱动程序I / O路径 15 2.6. 使用Vhost-user进行虚拟化I / O. 16 2.6.1 介绍 16 2.6.2 QEMU 17 2.6.3 设备初始化 18 2.6.4 I / O路径 19 2.6.5 SPDK优化 20 2.7. SPDK目录结构概述 20 2.8. SPDK移植指南 22 第三章 用户指南 22 3.1. 系统配置用户指南 22 3.1.1 IOMMU配置 22 3.2. SPDK应用程序概述 23 3.2.1 配置SPDK应用程序 23 3.3. iSCSI Target 26 3.3.1. iSCSI Target入门指南 26 3.3.2. 通过配置文件配置iSCSI Target 27 3.3.3. 通过RPC方法配置iSCSI Target 28 3.3.4. 配置iSCSI启动器 29 3.3.5. rpc配置示例*** 30 3.3.6. iSCSI 热插拔 32 3.4. NVMe over Fabrics Target 32 3.5. Vhost Target(略) 37 3.6 块设备用户指南 38 3.6.1 bdev介绍 38 3.6.2 通用RPC命令 38 3.6.3 Ceph RBD 39 3.6.4 压缩虚拟Bdev模块 40 3.6.5 加密虚拟Bdev模块 41 3.6.6 延迟vbdev模块 41 3.6.7 GPT(GUID分区表) 42 3.6.8 iSCSI bdev 43 3.6.9 Linux AIO bdev 43 3.6.10 OCF虚拟bdev 43 3.6.11 Malloc bdev 44 3.6.12 NULL bdev 44 3.6.13 NVMe bdev 44 3.6.14 逻辑卷Lvol 45 3.6.15 RAID 46 3.6.16 Passthru 46 3.6.17 Pmem 46 3.6.18 Virtio Block 47 3.6.19 Virtio SCSI 47 3.7 BlobFS(Blobstore文件系统) 48 3.7.1 RocksDB集成 48 3.7.2 FUSE插件 49 3.8 JSON-RPC方法(略) 49 第四章 程序员指南 49 4.1. Blobstore程序员指南 49 4.1.1 介绍 50 4.1.2 运作理论 50 4.1.3 设计注意事项 52 4.1.4 例子 54 4.1.5配置 54 4.1.6 组件细节 54 4.2. 块设备层编程指南 56 4.3 编写自定义块设备模块 58 4.3.1 介绍 58 4.3.2 创建一个新模块 59 4.3.3创建虚拟Bdev 60 4.4 NVMe over Fabrics目标编程指南 61 4.4.1 介绍 61 4.4.2 原语结构体 61 4.4.3 基础函数 62 4.4.4访问控制 62 4.4.5发现子系统 62 4.4.6 传输 63 4.4.7选择线程模型 63 4.4.8 跨CPU核心扩展 63 4.4.9 零拷贝支持 63 4.4.10 RDMA 63 4.5 Flash传输层 64 4.5.1 术语 64 4.5.2 使用方法 67 4.6 GDB宏用户指南 69 4.6.1 介绍 69 4.6.2 加载gdb宏 71 4.6.3 使用gdb数据目录 72 4.6.4 使用.gdbinit加载宏 72 4.6.5 为什么我们需要显式调用spdk_load_macros 72 4.6.6 以上可用的宏总结 73 4.6.7 添加新宏 73 4.7 SPDK “Reduce”块压缩算法 73 4.7.1 介绍 73 4.7.2 例子 74 4.8 通知库 78 第五章 基本信息 79 5.1 事件框架 79 5.1.1 事件框架设计注意事项 80 5.1.2 SPDK事件框架组件 80 5.1.3 应用框架 80 5.2 逻辑卷 81 5.2.1 术语 81 5.2.2 配置逻辑卷 84 5.3 矢量数据包处理(略) 86 第六章 杂项 86 6.1 介绍 86 6.2 NVMe的P2P API 86 6.3 确定设备支持 87 6.4 P2P问题 87 第七章 驱动程序 88 7.1 NVMe驱动程序*** 88 7.1.1 介绍 88 7.1.2 例子 88 7.1.3 公共接口 89 7.1.4 NVMe驱动程序设计 89 7.1.5 NVMe over Fabrics主机支持 91 7.1.6 NVMe多进程 91 7.1.7 NVMe Hotplug 92 7.2 I/OAT驱动程序 93 7.2.1 公共接口 93 7.2.2 关键功能 93 7.3 Virtio驱动程序 93 7.3.1 介绍 93 7.3.2 2MB大页面 93 第八章 工具 94 8.1 SPDK CLI 94 8.1.1 安装所需的依赖项 94 8.1.2 运行SPDK应用程序实例 94 8.1.3 运行SPDK CLI 94 8.1.4 可选 - 创建Python虚拟环境 94 8.2 nvme-CLI 95 8.2.1 nvme-cli with SPDK入门指南 95 8.2.2 使用场景 95 第九章 性能测试报告(略) 96 第十章NVMe-oF Target跟踪点*** 96 10.1 介绍 96 10.2 启用跟踪点 97 10.3 捕获事件的快照 97 10.4 捕获足够的跟踪事件 98 10.5 添加新的跟踪点 99
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、付费专栏及课程。

余额充值