Невозможно выполнить двоичный файл в NixOS - нет такого файла или каталога

11

Я попытался установить текущую версию oracle jre на виртуальную машину под управлением NixOS.

Теперь происходит следующее:

[michas@cc:~]$ tar xvzf jre-7u40-linux-x64.tar.gz |grep bin/java
jre1.7.0_40/bin/javaws
jre1.7.0_40/bin/java_vm
jre1.7.0_40/bin/java

[michas@cc:~]$ ls -l ./jre1.7.0_40/bin/java
-rwxr-xr-x 1 michas nogroup 7750 Aug 27 09:17 ./jre1.7.0_40/bin/java

[michas@cc:~]$ ./jre1.7.0_40/bin/java
bash: ./jre1.7.0_40/bin/java: No such file or directory

WTF? Именованный файл явно там. Что здесь происходит?

Попытка проанализировать дальше:

[michas@cc:~]$ strace ./jre1.7.0_40/bin/java
execve("./jre1.7.0_40/bin/java", ["./jre1.7.0_40/bin/java"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1)                           = ?
+++ exited with 1 +++

[michas@cc:~]$ strace ./jre1.7.0_40/bin/jav
strace: Can't stat './jre1.7.0_40/bin/jav': No such file or directory

Хорошо, вывод действительно отсутствующего файла выглядит иначе.

[michas@cc:~]$ file ./jre1.7.0_40/bin/java
./jre1.7.0_40/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, BuildID[sha1]=a558f547fe0b95fdc6a109cb7d9692d6d7969794, not stripped

[michas@cc:~]$ file ~/t
/home/michas/t: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped

Последний представляет собой крошечный само скомпилированный бинарный файл, работающий без проблем. Оба выглядят очень похожими. Следовательно, формат двоичного файла сам по себе выглядит нормально.

[michas@cc:~]$ ldd ./jre1.7.0_40/bin/java
/run/current-system/sw/bin/ldd: line 116: ./jre1.7.0_40/bin/java: No such file or directory

Похоже, есть проблема с необходимыми общими библиотеками.

Что происходит и как я могу это исправить?

Михась
источник

Ответы:

10

Обычно вы не можете запускать бинарные файлы в NixOS, им нужно будет либо установить некоторые переменные окружения, либо их нужно исправить с помощью patchElf Я предполагаю, что вы можете установить и запустить Java, используя менеджер пакетов nix. Вы также можете создать подходящую среду для запуска с помощью myEnvFun.

goibhniu
источник
2
Возможно, пример использования patchelfдля запуска двоичного файла в среде nix может быть полезен тем, кто ищет решение. Но в этом случае пользовательская «активная» среда nix в однопользовательской установке nix под CentOS, ваши потребности могут отличаться (IIC, более подходящим будет подход, заключающийся в том, чтобы ссылаться не на «активную» среду с символическими ссылками, а на конкретную версионировал, хэшировал один в магазине nix).
imz - Иван Захарящев
3

Похоже, у nixos есть пакет для oracle jre7 .

Если вы хотите создать собственное выражение nix для установки jre или jdk, то было бы неплохо взглянуть на существующее выражение nix для jdk7 / jre7 .

Davorak
источник