В коде 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. Затем я открыл PowerShell Windows и выполнил команду 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\eliam.calvo и создал файл .wslconfig со следующим содержимым:
[wsl2]
kernel=C:\\Users\\eliam.calvo\\bzImage
Затем я закрыл соединение с контейнером разработки, затем открыл Windows PowerShell от имени администратора и выполнил команду wsl --shutdown.
Затем я изменил свой Dockerfile на следующий:
FROM rocky-9-wsl2kernel:latest
EXPOSE 5025
Затем я запустил команду Dev Containers: Reopen in Container в палитре команд vscode. Затем я выполнил команду docker cp /Users/eliam.calvo/Desktop/NILinux2024Q1DeviceDrivers/NILinux2024Q1DeviceDrivers/ni-rhel9-drivers-2024Q1.rpm e156acaa0815b2df90aa79a467f2df26775f19d7db67ec50f30f73df54ba86e7:/home в Windows PowerShell, из которой получил обороты https://www.ni.com/en/support/downloads/drivers/download.ni-linux-device-drivers.html#521765 . Затем внутри контейнерного терминала разработки я последовательно выполнил следующую команду, которой я в основном следовал из 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 и 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), мое приложение резко закрывается. Вот как выглядит терминал внутри этого докер-контейнера:
[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-приложение. Затем, после запуска приложения, я получаю ошибку из вывода терминала выше. Я не уверен, что еще попробовать.
@ian-abbott Я запустил приложение с помощью strace и обнаружил, что устройство /dev/nipalk не создано. Спасибо.





Оказывается, узел устройства /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]#
Я не знаю, почему устройство не создавалось автоматически каждый раз, когда я загружал модуль в ядро. Кроме того, я не знаю, почему мне приходится загружать модули вручную. При обычной установке все, что мне нужно сделать, это следовать инструкциям https://www.ni.com/docs/en-US/bundle/ni-platform-on-linux-desktop/page/installing-ni. -products-red-hat-enterprise-linux.html .
Попробуйте использовать
straceдля отслеживания системных вызовов. Проверьте результаты системных вызовов непосредственно перед тем, как будет написано сообщение «libbipalu.so не удалось инициализировать». Возможно, он пытается открыть несуществующий файл устройства или что-то в этом роде.