Impossible d'exécuter le binaire dans NixOS - Aucun fichier ou répertoire de ce type

11

J'ai essayé d'installer l'oracle jre actuel sur une machine virtuelle exécutant NixOS.

Maintenant, ce qui suit se produit:

[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? Le fichier nommé est évidemment là. Que se passe-t-il?

Essayer d'analyser davantage:

[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

Ok, la sortie d'un fichier vraiment manquant est différente.

[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

Ce dernier est un minuscule binaire auto-compilé fonctionnant sans problème. Les deux se ressemblent beaucoup. Par conséquent, le formatage du binaire lui-même semble correct.

[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

Il semble qu'il y ait un problème concernant les bibliothèques partagées nécessaires.

Que se passe-t-il et comment puis-je y remédier?

michas
la source

Réponses:

10

Vous ne pouvez généralement pas exécuter de fichiers binaires dans NixOS, ils auront besoin d'un ensemble de variables d'environnement ou seront corrigés avec patchElf. Je suppose que vous pouvez installer et exécuter java à l'aide du gestionnaire de packages nix. Vous pouvez probablement également créer un environnement approprié pour l'exécuter à l'aide de myEnvFun.

goibhniu
la source
2
Peut-être qu'un exemple d'utilisation patchelfpour exécuter un binaire dans un environnement nix peut être utile à ceux qui recherchent une solution. Mais ce cas est l'environnement nix "actif" de l'utilisateur dans une installation nix à utilisateur unique sous CentOS, vos besoins peuvent être différents (IIC l'approche la plus nixy serait de se référer non pas à l'environnement lié "actif", mais plutôt à un environnement spécifique versionné, haché un dans le magasin nix).
imz - Ivan Zakharyaschev
3

Il semble que nixos ait un package pour oracle jre7 .

Si vous souhaitez créer une expression nix personnalisée pour installer jre ou jdk, il peut être judicieux de regarder l' expression nix existante pour jdk7 / jre7 .

Davorak
la source