Help installing ceton infinitv pcie ctn91xx kernel module

I have an old Ceton Infinitv PCIe cablecard that has a linux kernel module on GitHub that I was able to get working in NixOS by manually building and installing the kernel module. I would now like to get it working “properly”.

I followed the wiki at Linux kernel - NixOS Wiki section on “Packaging out-of-tree kernel modules” and appear to have got the GitHub package downloaded and the build step initiated, however the build is currently failing to create some temporary directories. Here is my nixos-rebuild switch output:

building Nix…
building the system configuration…
these 7 derivations will be built:
/nix/store/31is297lad2rjdbxb6wla29jjgxp3chw-ctn91xx-1.0-5.15.71.drv
/nix/store/1112fh2wbr2q3glvv284az4gk8nd1nzk-linux-5.15.71-modules.drv
/nix/store/pjjgw1wq6m3nvhvmbnxfv3b4br8xmwkd-linux-5.15.71-modules-shrunk.drv
/nix/store/bin99r2150s671w5h0vp174bjdmbamqm-stage-1-init.sh.drv
/nix/store/ip6c4v3dh22862m0m09v9352h73ds1gq-kernel-modules.drv
/nix/store/v40312nbcfy3xwscl3rzkrwxy1h2rbj1-initrd-linux-5.15.71.drv
/nix/store/pycaqyijy56cba20y3q8q4xcyqpxr2hc-nixos-system-myhostname0-22.05.3475.ed9b904c5eb.drv
building ‘/nix/store/31is297lad2rjdbxb6wla29jjgxp3chw-ctn91xx-1.0-5.15.71.drv’…
unpacking sources
unpacking source archive /nix/store/lp24mn2n9gfl1nd53r2fy78446yr96b6-source
source root is source
patching sources
configuring
no configure script, doing nothing
building
build flags: SHELL=/nix/store/9zm6br2ri10a0b71dll2wrim5bnhg6b6-bash-5.1-p16/bin/bash KERNELRELEASE=5.15.71 KERNEL_DIR=/nix/store/bkhj9ilbmvhmzig8ncnnp1yv10cxkl1r-linux-5.15.71-dev/lib/modules/5.15.71/build INSTALL_MOD_PATH=$(out)
make[1]: Entering directory ‘/nix/store/bkhj9ilbmvhmzig8ncnnp1yv10cxkl1r-linux-5.15.71-dev/lib/modules/5.15.71/build’
mkdir: cannot create directory ‘.tmp_51’: Permission denied
mkdir: cannot create directory ‘.tmp_53’: Permission denied
mkdir: cannot create directory ‘.tmp_55’: Permission denied
mkdir: cannot create directory ‘.tmp_58’: Permission denied
mkdir: cannot create directory ‘.tmp_60’: Permission denied
mkdir: cannot create directory ‘.tmp_62’: Permission denied
mkdir: cannot create directory ‘.tmp_64’: Permission denied
mkdir: cannot create directory ‘.tmp_66’: Permission denied
mkdir: cannot create directory ‘.tmp_68’: Permission denied
mkdir: cannot create directory ‘.tmp_70’: Permission denied
mkdir: cannot create directory ‘.tmp_72’: Permission denied
mkdir: cannot create directory ‘.tmp_86’: Permission denied
mkdir: cannot create directory ‘.tmp_88’: Permission denied
mkdir: cannot create directory ‘.tmp_90’: Permission denied
mkdir: cannot create directory ‘.tmp_92’: Permission denied
mkdir: cannot create directory ‘.tmp_94’: Permission denied
mkdir: cannot create directory ‘.tmp_96’: Permission denied
mkdir: cannot create directory ‘.tmp_98’: Permission denied
mkdir: cannot create directory ‘.tmp_100’: Permission denied
mkdir: cannot create directory ‘.tmp_102’: Permission denied
mkdir: cannot create directory ‘.tmp_104’: Permission denied
mkdir: cannot create directory ‘.tmp_106’: Permission denied
mkdir: cannot create directory ‘.tmp_108’: Permission denied
mkdir: cannot create directory ‘.tmp_120’: Permission denied
mkdir: cannot create directory ‘.tmp_122’: Permission denied
mkdir: cannot create directory ‘.tmp_124’: Permission denied
mkdir: cannot create directory ‘.tmp_126’: Permission denied
mkdir: cannot create directory ‘.tmp_129’: Permission denied
mkdir: cannot create directory ‘.tmp_131’: Permission denied
mkdir: cannot create directory ‘.tmp_133’: Permission denied
mkdir: cannot create directory ‘.tmp_135’: Permission denied
mkdir: cannot create directory ‘.tmp_137’: Permission denied
SYNC include/config/auto.conf.cmd
mkdir: cannot create directory ‘.tmp_165’: Permission denied
mkdir: cannot create directory ‘.tmp_167’: Permission denied
mkdir: cannot create directory ‘.tmp_169’: Permission denied
mkdir: cannot create directory ‘.tmp_171’: Permission denied
mkdir: cannot create directory ‘.tmp_173’: Permission denied
mkdir: cannot create directory ‘.tmp_175’: Permission denied
mkdir: cannot create directory ‘.tmp_177’: Permission denied
mkdir: cannot create directory ‘.tmp_179’: Permission denied
ln: failed to create symbolic link ‘source’: Permission denied
make[2]: *** [/nix/store/bkhj9ilbmvhmzig8ncnnp1yv10cxkl1r-linux-5.15.71-dev/lib/modules/5.15.71/source/Makefile:574: outputmakefile] Error 1
make[1]: *** [/nix/store/bkhj9ilbmvhmzig8ncnnp1yv10cxkl1r-linux-5.15.71-dev/lib/modules/5.15.71/source/Makefile:739: include/config/auto.conf.cmd] Error 2
make[1]: *** [include/config/auto.conf.cmd] Deleting file ‘include/generated/autoconf.h’
make[1]: unlink: include/generated/autoconf.h: Permission denied
make[1]: Leaving directory ‘/nix/store/bkhj9ilbmvhmzig8ncnnp1yv10cxkl1r-linux-5.15.71-dev/lib/modules/5.15.71/build’
make: *** [Makefile:38: ctn91xx_module] Error 2
error: builder for ‘/nix/store/31is297lad2rjdbxb6wla29jjgxp3chw-ctn91xx-1.0-5.15.71.drv’ failed with exit code 2
error: 1 dependencies of derivation ‘/nix/store/ip6c4v3dh22862m0m09v9352h73ds1gq-kernel-modules.drv’ failed to build
error: 1 dependencies of derivation ‘/nix/store/1112fh2wbr2q3glvv284az4gk8nd1nzk-linux-5.15.71-modules.drv’ failed to build
error: 1 dependencies of derivation ‘/nix/store/pycaqyijy56cba20y3q8q4xcyqpxr2hc-nixos-system-geonixlab0-22.05.3475.ed9b904c5eb.drv’ failed to build

It looks like your derivation build is trying to run the actual build process in a directory from an immutable store object, rather than copying to the build directory first. I’m guessing you’re going to have to manually copy the kernel build dir into the cwd, then point KERNEL_DIR there.

Thank you so much for your reply. I probably could’ve included my actual derivation initially to be more clear, but from the wiki I started with this as my derivation:

{ stdenv, lib, fetchFromGitHub, kernel, kmod }:

stdenv.mkDerivation rec {
name = “ctn91xx-${version}-${kernel.version}”;
version = “1.0”;

src = fetchFromGitHub {
owner = “ceton”;
repo = “infinitv_pcie”;
rev = “c5464b2f6c99dc21ce4a66d9a6f66d034fbb902c”;
sha256 = “19jw2c0f94nxvm7x29am9h2pvwhb9w7246sxkabvxflr018r8bwa”;
};

dontMakeSourcesWritable = true;

postUnpack = ‘’
‘’;

hardeningDisable = [ “pic” “format” ]; # 1
nativeBuildInputs = kernel.moduleBuildDependencies; # 2

makeFlags = [
“KERNELRELEASE=${kernel.modDirVersion}” # 3
“KERNEL_DIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build” # 4
“INSTALL_MOD_PATH=$(out)” # 5
];

meta = with lib; {
description = “A kernel module to create Ceton Infinitv PCIe devices”;
homepage = “https://github.com/ceton/infinitv_pcie”;
license = licenses.gpl2;
platforms = platforms.linux;
};
}

which I assumed was the template for all basic out of tree kernel module builds. But from what you are saying I tried adding a postUnpack step:

postUnpack = ‘’
cp -R “${kernel.dev}/” /build
‘’;

and then I changed KERNEL_DIR to point to /build in makeFlags:

“KERNEL_DIR=/build/ngyindzq6cw24552xlhsdrqdf42avzgd-linux-5.15.85-dev/lib/modules/${kernel.modDirVersion}/build”

but I ended up with the same exact errors just in /build instead of in /nix/store:


KERNELRELEASE=5.15.71 KERNEL_DIR=/build/ngyindzq6cw24552xlhsdrqdf42avzgd-linux-5.15.71-dev/lib/modules/5.15.71/build INSTALL_MOD_PATH=$(out)
make[1]: Entering directory ‘/build/ngyindzq6cw24552xlhsdrqdf42avzgd-linux-5.15.71-dev/lib/modules/5.15.71/build’
mkdir: cannot create directory ‘.tmp_51’: Permission denied
mkdir: cannot create directory ‘.tmp_53’: Permission denied
mkdir: cannot create directory ‘.tmp_55’: Permission denied
mkdir: cannot create directory ‘.tmp_58’: Permission denied
mkdir: cannot create directory ‘.tmp_60’: Permission denied
mkdir: cannot create directory ‘.tmp_62’: Permission denied
mkdir: cannot create directory ‘.tmp_64’: Permission denied
mkdir: cannot create directory ‘.tmp_66’: Permission denied
mkdir: cannot create directory ‘.tmp_68’: Permission denied
mkdir: cannot create directory ‘.tmp_70’: Permission denied
mkdir: cannot create directory ‘.tmp_72’: Permission denied
mkdir: cannot create directory ‘.tmp_86’: Permission denied
mkdir: cannot create directory ‘.tmp_88’: Permission denied
mkdir: cannot create directory ‘.tmp_90’: Permission denied
mkdir: cannot create directory ‘.tmp_92’: Permission denied
mkdir: cannot create directory ‘.tmp_94’: Permission denied
mkdir: cannot create directory ‘.tmp_96’: Permission denied
mkdir: cannot create directory ‘.tmp_98’: Permission denied
mkdir: cannot create directory ‘.tmp_100’: Permission denied
mkdir: cannot create directory ‘.tmp_102’: Permission denied
mkdir: cannot create directory ‘.tmp_104’: Permission denied
mkdir: cannot create directory ‘.tmp_106’: Permission denied
mkdir: cannot create directory ‘.tmp_108’: Permission denied
mkdir: cannot create directory ‘.tmp_120’: Permission denied
mkdir: cannot create directory ‘.tmp_122’: Permission denied
mkdir: cannot create directory ‘.tmp_124’: Permission denied
mkdir: cannot create directory ‘.tmp_126’: Permission denied
mkdir: cannot create directory ‘.tmp_129’: Permission denied
mkdir: cannot create directory ‘.tmp_131’: Permission denied
mkdir: cannot create directory ‘.tmp_133’: Permission denied
mkdir: cannot create directory ‘.tmp_135’: Permission denied
mkdir: cannot create directory ‘.tmp_137’: Permission denied
SYNC include/config/auto.conf.cmd
mkdir: cannot create directory ‘.tmp_165’: Permission denied
mkdir: cannot create directory ‘.tmp_167’: Permission denied
mkdir: cannot create directory ‘.tmp_169’: Permission denied
mkdir: cannot create directory ‘.tmp_171’: Permission denied
mkdir: cannot create directory ‘.tmp_173’: Permission denied
mkdir: cannot create directory ‘.tmp_175’: Permission denied
mkdir: cannot create directory ‘.tmp_177’: Permission denied
mkdir: cannot create directory ‘.tmp_179’: Permission denied
ln: failed to create symbolic link ‘source’: Permission denied
make[2]: *** [/nix/store/ngyindzq6cw24552xlhsdrqdf42avzgd-linux-5.15.71-dev/lib/modules/5.15.71/source/Makefile:574: outputmakefile] Error 1
make[1]: *** [/nix/store/ngyindzq6cw24552xlhsdrqdf42avzgd-linux-5.15.71-dev/lib/modules/5.15.71/source/Makefile:739: include/config/auto.conf.cmd] Error 2
make[1]: *** [include/config/auto.conf.cmd] Deleting file ‘include/generated/autoconf.h’
make[1]: unlink: include/generated/autoconf.h: Permission denied
make[1]: Leaving directory ‘/nix/store/ngyindzq6cw24552xlhsdrqdf42avzgd-linux-5.15.71-dev/lib/modules/5.15.71/build’
make: *** [Makefile:38: ctn91xx_module] Error 2
error: builder for ‘/nix/store/31is297lad2rjdbxb6wla29jjgxp3chw-ctn91xx-1.0-5.15.71.drv’ failed with exit code 2
error: 1 dependencies of derivation ‘/nix/store/ip6c4v3dh22862m0m09v9352h73ds1gq-kernel-modules.drv’ failed to build
error: 1 dependencies of derivation ‘/nix/store/1112fh2wbr2q3glvv284az4gk8nd1nzk-linux-5.15.71-modules.drv’ failed to build
error: 1 dependencies of derivation ‘/nix/store/pycaqyijy56cba20y3q8q4xcyqpxr2hc-nixos-system-geonixlab0-22.05.3475.ed9b904c5eb.drv’ failed to build

One thing I noticed is even though I changed KERNEL_DIR to /build and the build seems to starting there, we still end up trying to create tmp dirs under /nix/store. I also don’t understand why this seems to be the linux kernel build itself failing and really hasn’t even got to building my actual ctn91xx kernel module yet. It seems like I am missing something more fundamental.

and just for more completeness, I am running NixOS 22.05.4656.88eaf4a29b5 (Quokka) and calling my derivation like this in my configuration.nix:

{ config, pkgs, … }:
let
ctn91xx = config.boot.kernelPackages.callPackage ./ctn91xx.nix {};
in
{

boot.extraModulePackages = [ ctn91xx ];

}

Thanks again

Can you link to the kernel module on GitHub? Curious what the makefile has. This following is what I use as a generic builder function.

Builder: kernel-module-flake/c-module.nix at 73443fdd0e6ba72c11c199f559029820bdbe13dd · jordanisaacs/kernel-module-flake · GitHub
Makefile example: kernel-module-flake/Makefile at 73443fdd0e6ba72c11c199f559029820bdbe13dd · jordanisaacs/kernel-module-flake · GitHub

The GitHub for the kernel module is at https://github.com/ceton/infinitv_pcie . Thank you for any direction can you provide. I’m trying to see what I can take from your generic builder function but I’m not sure how to use your generic builder for my case. I’m willing to trying anything at this point to further my (very limited) understanding of how this stuff works.

Ok I’m pretty sure it is because the makefile is building the module on the kernel directory. See:

ctn91xx:
	@echo "Building ctn91xx driver..."
	@(cd $(KERNEL_DIR) && make -j15 -C $(KERNEL_DIR) SUBDIRS=$(PWD))

ctn91xx_module:
	@(cd $(KERNEL_DIR) && make -j15 -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules)

Thus build artifacts are happening in the kernel nix path. You need to patch the makefile to do the build outside the kernel directory.