赞
踩
再探SPDK----使用方法及基础机制概览
一直以来SPDK作为用户态的存储应用框架,受到了广泛的关注和跟进。本文在之前《初识SPDK》(点击斜体文字,阅读往期文章)的基础上,更进一步从使用、代码目录结构、基础机制和初始化流程的角度对SPDK做了简要的介绍,希望能给大家提供参考。
编译
依赖的子模块
当使用git clone命令从github代码仓库中下载SPDK版本时,可以看到在下载的代码目录下会有一些名如“dpdk”、“isa-l”、“ocf”等的空白目录。无须奇怪,这些目录是SPDK工程所依赖的用以支持某些特性的子模块。这些子模块的描述信息存在于代码工程目录下的“.gitmodules”文件中。有了这些信息当执行“git submodule update --init”命令时,这些被依赖的子模块的代码便会被下载到对应的目录中。 .gitmodules 文件中的内容可如图1所示。
图1. SPDK代码目录中.gitmodules文件内容举例
编译前的配置
在使用“git submodule update --init” 命令更新了依赖的submodule代码后,可以在执行其他的操作前先运行“./spdk/scripts/pkgdep.sh”脚本。这个脚本会根据当前运行的OS类型和指定的参数尝试下从网络上下载安装所需要的依赖包和编译工具。这个脚本也支持指定参数,如果需要指定特性相关的依赖,则可以根据帮助提示信息设置命令参数。运行脚本时建议确保环境可以访问外部网络。
SPDK目前仍然使用的是基于Makefile的编译方式,因而在编译前需要生成完整的Makefile文件。并且通过使用*.mk类型文件将各个相对独立且能被复用的逻辑独立存放也使得 SPDK的配置显得有条理且简练。如果感兴趣,可以在代码目录的mk子目录中看到承载各个基本逻辑的*.mk类型文件。
如果未执行必要的configure操作直接使用make编译时,Makefile的执行过程会因为未检测到相关.mk文件而退出。如同代码目录下的README.md文件所述,在编译前首先需要运行configure相关的配置命令。
1)具体的命令形式如“./configure xxx”, 其中xxx是具体的配置参数,可以使用“--help”参数查看具体的帮助信息。当然也可以不加参数运行,如果不带参数执行,则会使用代码目录下CONFIG文件中的默认配置参数。
2)通过configure命令的参数,可以选择编译或者不编译的模块,指定是否开启debug以及使用指定使用不同版本的依赖模块。例如,通过参数设置可以指定使用个人倾向的另外的DPDK版本或者使用非DPDK子模块目录中的代码。具体的命令如“./configure --with-dpdk=/path/of/dpdk/build”,命令中跟在“--with-dpdk”后的路径下存放的是已经编译生成的DPDK库文件、头文件等。如果使用默认自带子模块中的版本,则SPDK编译的过程中会使用代码目录dpdkbuild子目录中的Makefile来编译子模块目录中的DPDK,并且生成的文件会放在“./spdk/dpdk/build” 路径下。
3)在configure命令执行的过程中会生成“./spdk/mk/cc.mk”、“./spdk/mk/config.mk” 这两个文件。其中cc.mk文件指定了SPDK编译所需要使用的编译和连接的工具链,例如使用交叉编译时的相关配置,即可以在此文件中指定。编译过程中对各个特性或编译过程进行控制的参数则主要存在于config.mk文件中。
4)前已提及的.mk类型文件实际就是一个个的GUN Makefile的逻辑片段。使用它们主要的目的之一就是为了能够方便重用。在SPDK代码目录的mk子目录下有很多的.mk类型文件,它们可以轻松地被其他的Makefile包含使用。以编译nvmf_tgt为例,在 “./spdk/app/nvmf_tgt” 目录下的Makefile中指定了最终要生成的目标文件和所依赖的库文件,但实际如何生成目标文件以及如何连接依赖的库文件都是由“./spdk/mk/spdk.app.mk”中的逻辑进行控制。特别提醒一下:spdk.app.mk文件中的逻辑会让编译生成的文件最终被放到“./spdk/build/bin”目录中。
图2. spdk.app.mk文件的片段示意
编译操作
在执行了上述的相关配置操作后,就可以在代码根目录下执行make命令进行编译。对编译的过程,有如下信息需要留意。
1)SPDK代码根目录下Makefile的默认目标是 “all” 并且其依赖于 “mk/cc.mk” 和 “$(DIR-y)” 。鉴于Makefile前向解析依赖反向执行命令的逻辑特性,所以当 “mk/cc.mk” 没有生成时,make命令就会被中断,并提示 “Please run configure prior to make” 。
2)“DIR-y”是“./mk/spdk.subdirs.mk”文件中的定义。得益于这个中间目标的逻辑,make命令可以根据“DIR-y”的值来控制进入各个子目录执行具体的编译操作。因此可以通过它的值来控制编译或者不编译的目录。如果使用默认自带的dpdk子模块的代码,那“DIRS-y”中就会加上“./dpdkbuild”的值,并且由于这个值是最后添加的,所以make命令执行时,会首先编译dpdk模块。如果开启了isa-l的配置时,由于DPDK对isa-l存在依赖,则会在之前先编译isa-l子模块。
3)“./spdk/dpdkbuild”目录下的Makefile是用来控制dpdk编译的,其中的逻辑会创建“./spdk/dpdk/build-temp”的子目录用于编译,并将编译后的文件放到新创建的“./spdk/dpdk/build”子目录中。
4)DPDK的代码从2020年的版本开始已经切换为meson的编译方式,主要使用meson和ninja来加快编译的速度。为了能够正常完成编译过程,需要先安装meson和ninja的工具包。前已提及的pkgdep.sh脚本执行时会尝试安装。
5)如果需要使用非自带的DPDK的源码,那编译DPDK时可以参考如下的步骤来进行。
A. 进入DPDK 源码根目录;
B. 执行命令meson --prefix=”/path/build” build_temp,其中build_temp 是根目录下创建的用于执行编译的子目录;
C. 执行命令ninja -C build_temp进行编译
D. 执行命令meson install -C /src-path/build_temp –only-changed安装编译生成的文件。
注意: 可以通过--profix参数来指定安装的目的路径,如果没有指定,则执行安装操作时,生成的文件会被默认安装到/usr目录下。
运行app
SPDK的应用程序启动前需要有一些必要的配置如分配大页内存等,也有一些可选的配置如通过json文件来指定要执行的私有化操作。
大页内存分配和绑定设备到用户态驱动
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。