国家仪器(ni)需要加载内核模块但仍然出现错误

问题描述 投票:0回答:1

在 Visual Studio 代码中,在我的 Java 项目存储库中,我创建了一个包含以下内容的

Dockerfile

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

在 vscode 命令面板中,我运行了一个自动创建

.devcontainer/devcontainer.json
文件的命令。我向其中添加了代码。以下是我的
.devcontainer/devcontainer.json
文件的内容:

{
   "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"
         ]
      }
   }
}

在 vscode 命令面板中,我运行了命令

Dev Containers: Rebuild Without Cache and Reopen in Container
。在从
.devcontainer/devcontainer.json
构建的容器内,我按顺序运行了从指南中获得的以下命令 https://learn.microsoft.com/en-us/community/content/wsl-user-msft-kernel-v6
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
。然后我打开 Windows powershell 并运行命令
docker cp 90a6f4002eee8c8c2733d70cb997a0817f88471291afa35b3fa05ce6a5ca4277:/usr/src/kernels/WSL2-Linux-Kernel/arch/x86/boot/bzImage /Users/eliam.calvo
。接下来,在同一个 Windows powershell 中,我运行了命令
docker commit 90a6f4002eee8c8c2733d70cb997a0817f88471291afa35b3fa05ce6a5ca4277 rocky-9-wsl2kernel:latest
。然后,在我的 Windows 计算机上,我转到 C:\Users liam.calvo 并创建了包含以下内容的文件
.wslconfig

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

然后我关闭了与开发容器的连接,然后以管理员身份启动 Windows powershell 并运行命令

wsl --shutdown

然后我将

Dockerfile
更改为以下内容:

FROM rocky-9-wsl2kernel:latest

EXPOSE 5025

然后我在 vscode 命令面板中运行命令

Dev Containers: Reopen in Container
。然后我在 Windows powershell 中运行命令
docker cp /Users/eliam.calvo/Desktop/NILinux2024Q1DeviceDrivers/NILinux2024Q1DeviceDrivers/ni-rhel9-drivers-2024Q1.rpm e156acaa0815b2df90aa79a467f2df26775f19d7db67ec50f30f73df54ba86e7:/home
,我从 https://www.ni.com/en/support/downloads/drivers/download.ni-linux-device-drivers.html#521765 获取了 rpm 。然后,在开发容器终端内,我依次运行以下命令,基本上是从 https://www.ni.com/docs/en-US/bundle/ni-platform-on-linux-desktop/page/ 执行的安装-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
dkms autoinstall
。然后,在 Windows powershell 中,我运行命令
docker commit e156acaa0815b2df90aa79a467f2df26775f19d7db67ec50f30f73df54ba86e7 rocky-9-wsl2kernel-ni:latest
。然后我关闭了远程连接。然后我将
Dockerfile
更改为以下内容:

FROM rocky-9-wsl2kernel-ni:latest

EXPOSE 5025

然后,我通过在 vscode 命令面板中运行命令

Dev Containers: Reopen in Container
在 vscode 中打开一个开发容器。顺便说一句,
.devcontainer/devcontainer.json
一直保持不变。然后,在开发容器内的终端中,运行命令
modprobe -v nipalk
insmod /usr/lib/modules/6.1.21.2-microsoft-standard-WSL2+/extra/NiViPciK.ko
以插入所需的内核模块。在开发容器内的 Java 存储库中,我运行 Java 应用程序。当 Java 应用程序执行行
JVisaLibrary.viOpenDefaultRM(NativeLongByReference arg0)
时,我的应用程序突然关闭。这就是 docker 容器内的终端的样子:

[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]#

如您所见,在运行我的 java 应用程序之前,我检查模块是否已加载。然后在应用程序运行后,我从上面的终端输出中得到错误。我不知道还能尝试什么。

windows docker linux-kernel wsl-2 rocky-os
1个回答
0
投票

事实证明设备节点

/dev/nipalk
不是自动创建的。我所做的解决方法是首先执行
grep nikal /proc/devices
查找分配给 nikal 模块的主设备号。然后我做了一个
mknod /dev/nipalk c major_number minor_number
。将
major_number
替换为从
grep nikal /proc/devices
的输出中获得的数字,将
minor_number
替换为
0
,假设这是
nikal
驱动程序管理的第一个为
nikal
创建的设备。以下是我的终端输出作为示例。

[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]#
© www.soinside.com 2019 - 2024. All rights reserved.