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?
Réponses:
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.
la source
patchelf
pour 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).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 .
la source