Java 的 binfmt misc
来自 Wikipedia
binfmt_misc是 Linux 内核的一项功能,它允许识别任意可执行文件格式,并将它们传递给某些用户空间应用程序,例如模拟器和虚拟机。
通俗地说,这允许您获取一个文件,例如通常通过类似以下命令运行的 Java jar 或 Mono exe:
$ java -jar /path/to/MyProgram.jar $ mono /path/to/MyProgram.exe
而可以简单地通过以下方式运行它:
$ MyProgram.jar $ MyProgram.exe
只要这些可执行文件位于 $PATH 中。
本文档中的信息几乎完全摘自 Linux 内核源代码树的 Documentation 子目录中的 binfmt_misc.txt 和 java.txt 文件。
设置
挂载 binfmt_misc
临时挂载
# mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
通过 fstab 持久挂载,添加以下行:
none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0
使用 binfmt_misc 注册文件类型
Arch 上的文件类型注册由 systemd-binfmt.service 处理(由 systemd 提供)。
binfmt 注册行可以放在 /etc/binfmt.d 中的文件中。
该行的内容在内核源代码树的 Documentation/admin-guide/binfmt-misc.rst 文件中有解释。
以下行将创建用于运行 Java 二进制文件的注册文件,而无需显式调用 java 命令(您仍然需要安装它)。前两个通过将 Java 类文件和 jar 文件重定向到下一节中描述的一组“包装器”脚本来工作。最后一个条目以常规方式运行 Java applet。
# binfmt_misc support for Java applications: echo ':Java:M::\xca\xfe\xba\xbe::/usr/local/bin/javawrapper:' > /etc/binfmt.d/Java.conf # binfmt_misc support for executable Jar files: echo ':ExecutableJAR:E::jar::/usr/local/bin/jarwrapper:' > /etc/binfmt.d/ExecutableJAR.conf # binfmt_misc support for Java Applets: echo ':Applet:E::html::/opt/java/bin/appletviewer:' > /etc/binfmt.d/Applet.conf
重启 systemd-binfmt.service 以注册新的处理程序。已注册的 binfmt 处理程序会显示为 /proc/sys/fs/binfmt_misc 中的文件。查看此文件应显示已注册的包装器脚本的名称以及用于识别该文件类型的魔术字节或文件扩展名。
包装器脚本
请参阅 /Wrapper_examples 以获取 *jarwrapper* 和 *javawrapper* 脚本以及相关程序。
简单的解决方案
这个简单的解决方案适用于大多数情况,在执行过程中没有发现任何错误。创建文件 /etc/binfmt.d/java.conf
:Java:E::class::/usr/local/bin/javawrapper:
创建文件 /usr/local/bin/javawrapper
#!/bin/sh
file=${1%%.class}
file=${file/.\//}
java $file
别忘了将其设置为可执行文件
重启 systemd-binfmt.service。现在您可以进行测试了!
测试
创建一个简单的 HelloWorld.java 程序,如下所示:
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
像往常一样编译它,并将 .class 文件设置为可执行文件。
然后您应该能够通过简单地输入以下命令来运行它:
$ ./HelloWorld.class
备注
- binfmt_misc 的一些材料称其为一个模块,但 Arch 将其内置到标准内核中。
- 此处提供的设置适用于 Sun JRE 和 openjdk6。
- binfmt_misc 也可用于其他文件类型。例如,要能够运行 DOS/Windows 文件而无需显式指定 wine 程序,请添加以下注册条目:
# binfmt_misc support for DOS / Windows applications via Wine echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register