Неможливо виконати бінарне в NixOS - Немає такого файлу чи каталогу


11

Я спробував встановити поточний jrek oracle на VM, що працює з 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.


2
Можливо, приклад використання patchelfбінарного файлу в nix-середовищі може бути корисним для тих, хто шукає рішення. Але цей випадок - це "активне" nix-середовище користувача в однокористувацькій установці nix під CentOS, ваші потреби можуть бути різними (IIC, більш підхідним підходом було б посилатися не на "активне" середовище, що пов'язується з ланкою, а скоріше на конкретне переосмислив, хешив один у магазині nix).
imz - Іван Захарящев

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.