Impossibile eseguire il file binario in NixOS - Nessun file o directory


11

Ho provato a installare l'oracle jre corrente su una VM che esegue NixOS.

Ora succede quanto segue:

[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? Il file denominato è ovviamente lì. Cosa sta succedendo?

Prova di analizzare ulteriormente:

[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, l'output di un file veramente mancante sembra diverso.

[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

Quest'ultimo è un piccolo binario autocompilato che funziona senza problemi. Entrambi sembrano molto simili. Quindi formattare il binario stesso sembra andare bene.

[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

Sembra che ci sia un problema relativo alle librerie condivise necessarie.

Cosa sta succedendo e come posso ripararlo?


Risposte:


10

Di solito non è possibile eseguire file binari in NixOS, avranno bisogno di alcune variabili d'ambiente impostate o essere patchati con patchElf. Presumo che tu possa installare ed eseguire java usando il gestore pacchetti nix. Probabilmente puoi anche creare un ambiente adatto per eseguirlo usando myEnvFun.


2
Forse, un esempio dell'uso patchelfdi eseguire un binario in un ambiente nix può essere di qualche utilità per chi cerca una soluzione. Ma quel caso è l'ambiente nix "attivo" dell'utente in un'installazione nix per utente singolo in CentOS, le tue esigenze potrebbero essere diverse (IIC, più l'approccio nixy sarebbe fare riferimento non all'ambiente "attivo" collegato simbolicamente, ma piuttosto a uno specifico versione, con hash uno nell'archivio nix).
imz - Ivan Zakharyaschev,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.