National instruments(ni) required kernel modules loaded but still getting error

In visual studio code, in my java project repository, I created a Dockerfile with the following content:

FROM rocky-9-wsl2kernel-ni:latest

RUN dnf install -y rpm-build gcc make vim git wget \
   openssh-server bc flex bison openssl-devel elfutils-libelf-devel \
   rsync kmod ncurses-devel pkg-config chkconfig dwarves java-17-openjdk-devel

EXPOSE 5025

In the vscode command palette, I ran a command that auto created a .devcontainer/devcontainer.json file. I added code to it. The following is the content of my .devcontainer/devcontainer.json file:

{
   "name": "Existing Dockerfile",
   "build": {
      // Sets the run context to one level up instead of the .devcontainer folder.
      "context": "..",
      // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
      "dockerfile": "../Dockerfile"
   },
   "runArgs": [
      "--net",
      "host",
      "--env",
      "DISPLAY=host.docker.internal:0",
      "--privileged",
      "--cap-add=ALL"
   ],
   "customizations": {
      "vscode": {
         "extensions": [
            "vscjava.vscode-java-pack",
            "ms-azuretools.vscode-docker"
         ]
      }
   }
}

In the vscode command palette, I ran the command Dev Containers: Rebuild Without Cache and Reopen in Container. Inside the container built from .devcontainer/devcontainer.json, I ran the following commands sequentally: cd /usr/src/kernels, git clone https://github.com/microsoft/WSL2-Linux-Kernel.git --depth=1 -b linux-msft-wsl-6.1.y, cd WSL2-Linux-Kernel, make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl, make modules_install headers_install, make defconfig. I then pulled up a windows powershell and ran the command docker cp 90a6f4002eee8c8c2733d70cb997a0817f88471291afa35b3fa05ce6a5ca4277:/usr/src/kernels/WSL2-Linux-Kernel/arch/x86/boot/bzImage /Users/eliam.calvo. In that same windows powershell I ran the command docker commit 90a6f4002eee8c8c2733d70cb997a0817f88471291afa35b3fa05ce6a5ca4277 rocky-9-wsl2kernel:latest next. On my windows machine, I then went to C:\Users\eliam.calvo and created the file .wslconfig with the following content:

[wsl2]
kernel=C:\\Users\\eliam.calvo\\bzImage

I then closed the connection to the dev container and then pulled up a windows powershell as administrator and ran the command wsl --shutdown.

I then changed my Dockerfile to the following:

FROM rocky-9-wsl2kernel:latest

EXPOSE 5025

I then ran the command Dev Containers: Reopen in Container in the vscode command palette. I then ran the command docker cp /Users/eliam.calvo/Desktop/NILinux2024Q1DeviceDrivers/NILinux2024Q1DeviceDrivers/ni-rhel9-drivers-2024Q1.rpm e156acaa0815b2df90aa79a467f2df26775f19d7db67ec50f30f73df54ba86e7:/home in a windows powershell which I got from rpm from https://www.ni.com/en/support/downloads/drivers/download.ni-linux-device-drivers.html#521765. Then, inside the dev container terminal, I ran the following command sequentially which I basically followed from https://www.ni.com/docs/en-US/bundle/ni-platform-on-linux-desktop/page/installing-ni-products-red-hat-enterprise-linux.html: dnf install -y /home/ni-rhel9-drivers-2024Q1.rpm, dnf install -y ni-visa, rm -rf /usr/src/kernels/5.14.0-362.18.1.el9_3.x86_64, dnf install -y ni-hwcfg-utility, and dkms autoinstall. Then, in a windows powershell, I ran the command docker commit e156acaa0815b2df90aa79a467f2df26775f19d7db67ec50f30f73df54ba86e7 rocky-9-wsl2kernel-ni:latest. I then closed the remote connection. I then changed my Dockerfile to the following:

FROM rocky-9-wsl2kernel-ni:latest

EXPOSE 5025

I then opened a dev container in vscode by running the command Dev Containers: Reopen in Container in the vscode command palette. By the way, the .devcontainer/devcontainer.json has remained the same this whole time. Then, in the terminal inside my dev container, I run the command modprobe -v nipalk and insmod /usr/lib/modules/6.1.21.2-microsoft-standard-WSL2+/extra/NiViPciK.ko to insert the required kernel modules in. Inside my Java repository inside the dev container, I run my Java application. When the Java application executes the line JVisaLibrary.viOpenDefaultRM(NativeLongByReference arg0), my application closes abruptly. This is what the terminal inside that docker container looks like:

[root@docker-desktop msda-test]# lsmod
Module                  Size  Used by
NiViPciK               77824  0
nipalk                897024  1 NiViPciK
nikal                 102400  1 nipalk
[root@docker-desktop msda-test]#  cd /workspaces/msda-test ; /usr/bin/env /usr/lib/jvm/java-17-openjdk-17.0.10.0.7-2.el9.x86_64/bin/java -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=localhost:34353 @/tmp/cp_aevhl9otyttw9qr0cmd0fl9ar.argfile com.bluehalo.msda.cca.tester.Tester 
libnipalu.so failed to initialize
Verify that nipalk.ko is built and loaded.
Aborted
[root@docker-desktop msda-test]#

As you can see, I check to see if the modules are loaded in yet before running my java application. Then after the application is ran, i get the error from the terminal output above. I’m not sure what else to try.

I forgot to add the website https://learn.microsoft.com/en-us/community/content/wsl-user-msft-kernel-v6 which is the site where I got the steps to build the kernel I build in this post.

Turns out that the device node /dev/nipalk wasn’t created automatically. A work around that I did was first do a grep nikal /proc/devices to find the major device number assigned to the nikal module. Then I did a mknod /dev/nipalk c major_number minor_number. Replace major_number with the number you got from the output of grep nikal /proc/devices and minor_number with 0, assuming that is the first created device for nikal that the nikal driver manages. The following is my terminal output as an example.

[root@docker-desktop msda-test]# grep nikal /proc/devices
241 nikal
[root@docker-desktop msda-test]# mknod /dev/nipalk c 241 0
[root@docker-desktop msda-test]# ls -l /dev/nipalk
crw-r--r-- 1 root root 241, 0 Feb 20 22:44 /dev/nipalk
[root@docker-desktop msda-test]#

I don’t know why the device wasn’t created automatically though whenever I loaded the module into the kernel. Also, I don’t know why I have to load in the modules manually either. In a normal installation, all I have to do is follow the steps from https://www.ni.com/docs/en-US/bundle/ni-platform-on-linux-desktop/page/installing-ni-products-red-hat-enterprise-linux.html .