✨前言:
什么是PMDK?
Intel的PMDK(Persistent Memory Development Kit)是一个库,旨在简化持久内存的应用开发并解决一些常见挑战。
PMDK,全称为Persistent Memory Development Kit,是由Intel开发的一套函数库和工具的集合,适用于所有的持久内存(厂商中立),无论这些内存来自哪个制造商。它包含了一系列函数库,如libpmem、libvmem、libpmemblk、libpmemlog、libpmemobj、libpmempool、libvmmalloc等,这些库的设计目的是为了方便非易失性内存的应用开发。通过PMDK,开发人员可以更容易地利用持久内存的优势,如高性能、低延迟以及数据的持久性,这些特性使得持久内存成为一种介于传统内存和存储之间的新技术。
具体而言,PMDK中的某些库,如libpmemobj,提供了基本的事务支持,允许应用程序用特定的语法表示事务,从而将应用程序从比较困难的底层细节中解放出来。这种支持对于需要自己实现简单数据库系统的应用程序来说尤为重要。通过PMDK,开发人员可以更加专注于应用程序的核心功能,而不是花费大量时间处理底层细节。
此外,PMDK还支持Hadoop等大数据处理框架,通过配置PMDK库的路径和包含文件的路径,可以构建支持PMDK的Hadoop本地库,从而提高大数据处理的性能和效率。
持久内存开发套件 (PMDK), 前身为NVML,是持续丰富的开发库和工具的集合。这些库在 Linux 和 Windows 上进行调整和验证后,以这些操作系统的 DAX 功能(直接访问)为基础,允许应用程序访问持久内存作为内存映射文件,如SNIA NVM 编程模型所述。
总的来说,Intel的PMDK通过提供一系列函数库和工具,简化了持久内存的应用开发过程,解决了许多常见挑战,使得开发人员能够更加高效地利用持久内存的优势,无论是对于传统的应用程序开发还是对于大数据处理等高性能计算领域,PMDK都发挥了重要作用
🌟编译需要的一些库的路径
https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/
https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/
🌟1.首先编译PMDK需要如下的packages的依赖,那就是先编译好ndctl
🌟2.编译环境需要如下包对应的版本,需要自己下载对应的包安装编译:
pkg-config:0.27.1
make:GNU Make 4.2.1
ninja :1.13.0.git
GCC:10.2.1(10.2.0也可)
meson:0.61.5
pandoc:2.0.6
asciidoctor:2.1.0
✨3.编译ndctl
🌟从GitHub上的ndctl仓库克隆代码:
git clone https://github.com/pmem/ndctl.git
cd ndctl
🌟编译
安装Meson和Ninja:
Meson依赖于Ninja构建系统来实际编译代码。请确保这两个工具都已安装(已安装忽略):
sudo yum install meson ninja-build
🌟安装lib kmod meson build的时候需要依赖这个
sudo yum search kmod-devel
sudo yum install kmod-devel
🌟 libudev是udev库的开发文件包,用于设备管理和发现。
sudo yum install systemd-devel
🌟安装libuuid-devel:
sudo yum install libuuid-devel
🌟安装json-c-devel:
sudo yum install json-c-devel
🌟安装libtraceevent 先yum search traceevent,这里X86下有对应的安装包可以直接安装,arm下要手动下载对应的源码编译
🌟安装traceevent提示以下错误,这是因为perf的版本不兼容,先rmove掉
卸载冲突的包:如果你不需要perf包,你可以尝试卸载它来解决冲突,然后再安装libtraceevent-devel。
sudo yum remove perf
sudo yum install libtraceevent-devel
🌟也可以手动安装libtraceevent
在libtraceevent项目的根目录中,创建一个名为builddir的目录来存放构建文件:
meson setup builddir
如果报如下错误
🌟先安装xmlto
yum install xmlto
这个命令会设置编译环境并生成ninja的构建文件。如果你想要有不同的设置(例如,启用调试符号或选择安装路径),可以在这一步中添加相应的meson参数。
🌟切换到builddir目录并开始构建过程:
cd builddir
ninja
🌟构建完成后,安装库:
sudo ninja install
🌟安装完毕后,更新库缓存:
sudo ldconfig
🌟 确保 pkg-config 路径:
安装的库包括.pc文件,它被安装在/usr/local/lib64/pkgconfig。这个路径应该已经包含在pkg-config的搜索路径中。如果不是,你需要设置PKG_CONFIG_PATH环境变量:
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
将上述命令添加到~/.bashrc或类似的shell启动脚本文件中,以便在新的shell会话中自动设置环境变量。
🌟检查 PKG_CONFIG_PATH:
为了确保pkg-config能够找到libtraceevent,你可以运行以下命令检查:
pkg-config --libs --cflags libtraceevent
如果这个命令返回错误,说明pkg-config不能找到libtraceevent.pc文件。你需要确保在PKG_CONFIG_PATH中设置了正确的路径。
🌟 检查软件链接:
libtraceevent提供了软件链接,这些软件链接用于导向特定的库版本。确保链接正确并且没有损坏:
ls -l /usr/local/lib64/libtraceevent*
🌟 编译libtracefs (只有上面的步骤做完之后libtraceevent才能编译这个)
meson来配置构建环境:
meson setup builddir
builddir是用于存放构建输出的目录名,您可以使用任何您喜欢的名称。
🌟进入构建目录并开始构建过程:
cd builddir
ninja
🌟 ninja命令将执行实际的编译。
sudo ninja install
这将把编译生成的文件安装到它们需要去的地方。
🌟 运行 ldconfig:
运行ldconfig确保系统的动态链接器缓存了新的库路径:
sudo ldconfig
🌟设置 PKG_CONFIG_PATH:
如果pkg-config未找到新安装的libtracefs.pc文件,则需要指定正确的路径。通常,/usr/local/lib64/pkgconfig默认是在搜索路径中,但如果它不在,你可以手动添加它:
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
如果你需要这个设置在未来登陆时也有效,那么最好把它添加到你的shell配置文件(例如/.bashrc或/.bash_profile)中。
验证 pkg-config 是否可以找到 libtracefs:
通过以下命令,检查pkg-config是否可以找到libtracefs:
pkg-config --libs --cflags libtracefs
🌟安装asciidoctor
先下载gem(编译asciidoctor需要用到)
yum install gem
克隆asciidoctor的git仓库:
git clone https://github.com/asciidoctor/asciidoctor.git
cd asciidoctor
一旦你有了源代码,你通常可以按照仓库内的安装指南来安装它。对于Ruby Gems,这通常意味着使用gem build命令来创建一个gem包,然后可以用gem install来安装它:
gem build asciidoctor.gemspec
gem install asciidoctor-*.gem
请确保你有足够的权限来安装gem(可能需要使用sudo)。
🌟最后,验证安装是否成功:
asciidoctor --version
🌟安装keyutils:
sudo yum install keyutils-libs-devel
🌟安装iniparser库:
如果你的包管理器没有提供iniparser的开发包,你可能需要从源代码手动安装。这可能包括下载iniparser的源代码,然后编译和安装它。可以从它的GitHub仓库或其他地方获取源代码。
git clone https://github.com/ndevilla/iniparser.git
cd iniparser
mkdir build
cd build
cmake ..
make
sudo make install
如果上面步骤的cmake报错 可以使用下面的步骤解决
对于基于RPM的系统:
sudo yum install doxygen
🌟编译ndctl 进入ndctl目录
执行 meson setup builddir 报这个错
问题1:
首先 find /usr -name “iniparser.h”,这里看到路径/usr/local/include/iniparser/iniparser.h 路径和meson.build的路径不一致。
以下命令来修改路径:
sudo mkdir -p /usr/include/iniparser
sudo cp /usr/local/include/iniparser/*.h /usr/include/iniparser/
🌟构建项目:
使用ninja来实际编译项目。如果meson setup命令已经在名为builddir的目录中成功完成,则执行:
ninja -C builddir
这将编译目标项目并生成可执行程序或库文件。-C 参数指定ninja应该在指定的目录中查找build.ninja文件,这个文件是由Meson自动生成的,并且包含了编译指令。
🌟测试项目(可选):
如果ndctl提供了自动测试,你可以使用以下命令运行它们:
ninja -C builddir test
这个步骤将运行所有预定义的测试来验证编译是否正确。
🌟安装项目:
构建成功之后,如果你要安装项目到系统中,使用以下命令:
sudo ninja -C builddir install
查看版本,这样daxctl工具就安装成功了
✨4 编译PMDK 工具
可以看到PMDK的md里面安装要求 如下的几个包:需要先编译安装之前的ndctl和daxctl
问题解决:如果make 提示如下路径问题的话
这个问题是在 PMDK 的 make 过程中 pkg-config 无法正确找到 ndctl 的开发文件。
🌟4.1 设置 PKG_CONFIG_PATH:
由于已经安装在 /usr/lib/pkgconfig 中,通常这个路径是默认包含在 pkg-config 的搜索路径中。但为了确保,可以运行:
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$PKG_CONFIG_PATH
```
🌟4.2 安装pandoc
sudo yum install pandoc
安装完 pandoc 后,重新尝试编译 PMDK:
cd pmdk
git checkout tags/2.0.1
make clean
make
make install
如下代表安装成功
如下路径可以看到daxio等工具都已经编译好。
如果运行提示这个错误可以将编译好之后的so放到/usr/lib64下面即可。
至此daxctl和pmdk下的工具都已经编译好。