Installing NDCTL, DAXCTL, and CXL-CLI from Source on Linux
These instructions provide a step-by-step guide for installing the ndctl ,daxctl , and cxl-cliutilities from the GitHub project master branch.

1. Install the Prerequisites

There are a number of packages required for the build steps that may not be installed by default. For information about the required packages, see the "BuildRequires:" lines in ndctl.spec.in.
To successfully compile ndctl and daxctl from source with documentation, the following packages are required
  • autoconf
  • automake
  • asciidoc (asciidoctor)
  • bash-completion
  • bc
  • doxygen
  • gcc
  • gcc-c++ (g++)
  • git
  • glib2
  • glib2-devel
  • graphviz
  • iniparser
  • iniparser-dev[el]
  • json-c-devel
  • keyutils-libs-devel (libkeyutils-dev[el])
  • kmod
  • kmod-devel
  • libfabric
  • libfabric-devel
  • libtool
  • libudev-devel
  • libuuid-devel
  • meson
  • ncurses
  • pandoc
  • pkg-config
  • rubygem-asciidoctor (asciidoctor)
  • xmlto
To install these prerequisites, use:
Fedora
RHEL & CentOS
Ubuntu & Debian
SLES & OpenSUSE
Fedora 34 or later
1
sudo dnf install git gcc gcc-c++ autoconf automake asciidoc asciidoctor xmlto libtool pkg-config glib2 glib2-devel libfabric libfabric-devel doxygen graphviz pandoc ncurses kmod kmod-devel libudev-devel libuuid-devel json-c-devel keyutils-libs-devel iniparser iniparser-devel bash-completion bc meson
Copied!
These instructions apply to RHEL, CentOS, and RHEL for SAP HANA v7.6 or later.
Some of the required packages can be found in the EPEL (Extra Packages for Enterprise Linux) and PowerTools repositories. The PowerTools repository is available for CentOS 8.x or later. Instructions for CentOS 7.x and 8.x are described below.

CentOS 7.x

Verify the EPEL repository is available and active:
1
yum repolist
Copied!
Example:
1
$ yum repolist
2
repo id repo name status
3
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 13,217
Copied!
If the EPEL repository is not listed, install and activate it using:
1
sudo yum install epel-release
Copied!
Install the required packages
1
sudo yum install git gcc gcc-c++ autoconf automake asciidoc bash-completion xmlto libtool pkgconfig glib2 glib2-devel libfabric libfabric-devel doxygen graphviz pandoc ncurses kmod kmod-devel libudev-devel libuuid-devel json-c-devel rubygem-asciidoctor keyutils-libs-devel make iniparser iniparser-devel bc meson
Copied!

CentOS 8.x/CentOS Stream

Note: CentOS 8.x/CentOS Stream uses the yum or dnf package manager commands. Both are interchangeable, with dnf being the preferred tool.
Verify the EPEL repository is available and active:
1
dnf repolist
Copied!
Example:
1
$ dnf repolist
2
repo id repo name
3
appstream CentOS Linux 8 - AppStream
4
baseos CentOS Linux 8 - BaseOS
5
extras CentOS Linux 8 - Extras
Copied!
If the EPEL repository is not listed, install and activate it using:
1
sudo dnf install epel-release
Copied!
If the PowerTools repository is not listed, install and activate it using:
1
$ sudo dnf config-manager --set-enabled powertools
Copied!
Install the required packages
1
$ sudo dnf install git gcc gcc-c++ autoconf automake asciidoc bash-completion xmlto libtool pkgconfig glib2 glib2-devel libfabric libfabric-devel doxygen graphviz pandoc ncurses kmod kmod-devel libudev-devel libuuid-devel json-c-devel keyutils-libs-devel gem make bc meson
2
$ sudo gem install asciidoctor
Copied!
For Ununtu 18.04 (Bionic) and Debian 9 (Stretch) or later:
1
sudo apt install -y git gcc g++ autoconf automake asciidoc asciidoctor bash-completion xmlto libtool pkg-config libglib2.0-0 libglib2.0-dev libfabric1 libfabric-dev doxygen graphviz pandoc libncurses5 libkmod2 libkmod-dev libudev-dev uuid-dev libjson-c-dev libkeyutils-dev libiniparser libiniparser-dev bc meson
Copied!
These instructions were tested on SLES 12sp5, 15sp2, and OpenSUSE Leap15.2
1
sudo zypper install git gcc gcc-c++ autoconf automake asciidoc bash-completion xmlto libtool pkg-config glib2 glib2-devel libfabric libfabric-devel doxygen graphviz pandoc ncurses kmod libkmod-devel libudev-devel libuuid-devel libjson-c-devel keyutils-devel iniparser iniparser-devel bc meson
Copied!
Install asciiddoctor using the gem utility
1
sudo gem install asciidoctor
Copied!

2. Clone the GitHub Repository

2.1) If you're behind a company proxy, configure git to work with your proxy server first. The following configures a HTTP and HTTPS proxy for all users. Refer to the git-config documentation for more options and information.
1
git config --global http.proxy http://proxyUsername:[email protected]:port
2
git config --global https.proxy https://proxyUsername:[email protected]:port
Copied!
2.2) Create a working directory to clone the ndctl GitHub repository to, eg: 'downloads'
1
mkdir ~/downloads
Copied!
2.3) Clone the repository:
1
cd ~/downloads
2
git clone https://github.com/pmem/ndctl
3
cd ndctl
Copied!

3. Build

The following configures ndctl to be installed into the /usr/bin directory.
1
meson setup build
2
meson compile -C build
Copied!
For a full list of build options use:
1
meson build --help
Copied!

4. Install

Once ndctl has successfully been compiled, it can be installed using the following:
1
sudo meson install -C build
Copied!
The ndctl, daxctl, and cxl binaries should be available in /usr/bin/
1
$ which ndctl daxctl cxl
2
/usr/local/bin/ndctl
3
/usr/local/bin/daxctl
4
/usr/local/bin/cxl
Copied!

5. Build and Run Unit Tests (Optional)

The unit tests run by make check require the nfit_test.ko module to be loaded. To build and install nfit_test.ko:
  1. 1.
    Obtain the kernel source. For example, git clone -b libnvdimm-for-next git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm.git
  2. 2.
    Skip to step 3 if the kernel version is >= v4.8. Otherwise, for kernel versions < v4.8, configure the kernel to make some memory available to CMA (contiguous memory allocator). This will be used to emulate DAX. CONFIG_DMA_CMA=y CONFIG_CMA_SIZE_MBYTES=200 or cma=200M on the kernel command line.
  3. 3.
    Compile the libnvdimm sub-system as a module, make sure "zone device" memory is enabled, and enable the btt, pfn, and dax features of the sub-system: CONFIG_X86_PMEM_LEGACY=m CONFIG_ZONE_DEVICE=y CONFIG_LIBNVDIMM=m CONFIG_BLK_DEV_PMEM=m CONFIG_ND_BLK=m CONFIG_BTT=y CONFIG_NVDIMM_PFN=y CONFIG_NVDIMM_DAX=y CONFIG_DEV_DAX_PMEM=m
  4. 4.
    Build and install the unit test enabled libnvdimm modules in the following order. The unit test modules need to be in place prior to the depmod that runs during the final modules_install make M=tools/testing/nvdimm sudo make M=tools/testing/nvdimm modules_install sudo make modules_install
  5. 5.
    Now run make check in the ndctl source directory, or ndctl test, if ndctl was built with --enable-test.

Troubleshooting

The unit tests will validate that the environment is set up correctly before they try to run. If the platform is misconfigured, i.e. the unit test modules are not available, or the test versions of the modules are superseded by the "in-tree/production" version of the modules make check will skip tests and report a message like the following in test/test-suite.log:
1
SKIP: libndctl
2
==============
3
test/init: nfit_test_init: nfit.ko: appears to be production version: /lib/modules/4.8.8-200.fc24.x86_64/kernel/drivers/acpi/nfit/nfit.ko.xz
4
__ndctl_test_skip: explicit skip test_libndctl:2684
5
nfit_test unavailable skipping tests
Copied!
If the unit test modules are indeed available in the modules 'extra' directory the default depmod policy can be overridden by adding a file to /etc/depmod.d with the following contents:
1
override nfit * extra
2
override device_dax * extra
3
override dax_pmem * extra
4
override libnvdimm * extra
5
override nd_blk * extra
6
override nd_btt * extra
7
override nd_e820 * extra
8
override nd_pmem * extra
Copied!
The nfit_test module emulates pmem with memory allocated via vmalloc(). One of the side effects is that this breaks 'physically contiguous' assumptions in the driver. Use the --align=4K option to ndctl create-namespace to avoid these corner case scenarios.