在 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 应用程序之前,我检查模块是否已加载。然后在应用程序运行后,我从上面的终端输出中得到错误。我不知道还能尝试什么。
事实证明设备节点
/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]#