在Linux上从FAT32 USB启动JRE

我有一个安装在USB上的Java应用程序,用户应该可以从任何操作系统运行。

为了这,

  1. 我正在将USB上的JRE实例与我的应用程序一起打包。
  2. 我在USB上有一个FAT32文件系统。

但是,问题是,FAT32没有执行(“+ x”)权限的概念。 虽然我可以启动一个shell脚本,如下所示:

$ sh /path/to/fat32-usb/helloWorld.sh 

,而我可以启动一个简单的ELF二进制文件,就像这样:

 $ /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/helloWorld 

,我似乎无法启动Java ELF程序。 我得到这些错误:

 Error: could not find libjava.so Error: Could not find Java SE Runtime Environment. 

启动java之前,我已经尝试设置这些环境variables如下:

 export JAVA_HOME=/path/to/fat32-usb/jre export LD_LIBRARY_PATH="$JAVA_HOME/lib/amd64:.:$LD_LIBRARY_PATH" export PATH="$JAVA_HOME/bin:.:$PATH" 

我也尝试从$JAVA_HOME/bin目录中启动java 。 最后,我还尝试将$JAVA_HOME/lib/amd64/所有libXXX.so拷贝到$JAVA_HOME/bin ,希望能从当前目录中find它们. , 不知何故。

但没有任何工作。

编辑

这里是strace输出的最后几行:

 $ strace -vfo /tmp/java.strace /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/jre ... ... readlink("/proc/self/exe", "/lib/x86_64-linux-gnu/ld-2.17.so", 4096) = 32 write(2, "Error: could not find libjava.so", 32) = 32 write(2, "\n", 1) = 1 write(2, "Error: Could not find Java SE Ru"..., 50) = 50 write(2, "\n", 1) = 1 exit_group(2) = ? 

EDIT2

这里是ltrace的输出(只有一行!):

 $ ltrace -s 120 -e '*' -ifo /tmp/java.ltrace /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/jre ... 30913 [0xffffffffffffffff] +++ exited (status 2) +++ 

编辑3

这是ltraceext4分区 (而不是FAT32分区的问题)上加载libjava.so的摘录,我可以正常加载:

 5525 [0x7f7627600763] <... snprintf resumed> "/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", 4096, "%s/lib/%s/libjava.so", "/home/aaa/bbb/jdk1.7.0_40", "amd64") = 46 5525 [0x7f762760076d] libjli.so->access("/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", 0) = -1 5525 [0x7f762760078d] libjli.so->snprintf( <unfinished ...> 5525 [0x3085246bdb] libc.so.6->(0, 0x7fffffd8, 0x7f7627607363, 39) = 0 5525 [0x3085246be3] libc.so.6->(0, 0x7fffffd8, 0x7f7627607363, 39) = 0 5525 [0x7f762760078d] <... snprintf resumed> "/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", 4096, "%s/jre/lib/%s/libjava.so", "/home/aaa/bbb/jdk1.7.0_40", "amd64") = 50 5525 [0x7f7627600797] libjli.so->access("/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", 0) = 0 

这也是健康/加载javastrace输出。

 5952 readlink("/proc/self/exe", "/home/aaa/bbb/jdk1.7.0_40/bin/ja"..., 4096) = 34 5952 access("/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", F_OK) = -1 ENOENT (No such file or directory) 5952 access("/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", F_OK) = 0 5952 open("/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/jvm.cfg", O_RDONLY) = 3