我正在设计一组 Java 程序,希望有一天能将它们变成基于 Java 的操作系统。在内核运行之前,我只想在 Ubuntu 上运行它们。因此,我需要将所有文件系统调用定向到我的主文件夹中的不同目录,因此/
从 Java 内部访问实际上会访问/home/<user>/Thunderbolt/
。
我看过社区文档使用chroot
,但它说要在其中设置 Ubuntu 的基本安装。这真的有必要吗?我只想在其中运行 Java 应用程序,这样应用程序就会认为它位于自己的假文件系统中。我不想要所有额外的 Ubuntu 东西。
根据上述文件:
从很多方面来看,chroot 就像在现有操作系统内安装另一个操作系统。
但我不想这样。我只想对应用程序隐藏大部分真实文件系统,以便它只能看到一个目录。
我还看到了chroot
功能。这会满足我的要求吗?
有没有什么简单的方法可以在其自己的伪文件系统中运行 Java 应用程序chroot
(无需所有额外的 Ubuntu 内容),如果有,如何操作?
答案1
我所做的是Thunderbolt
在我的主文件夹中创建一个名为的目录。然后对于我想要的可执行文件,我运行ldd
并将所需的库和实际的可执行文件复制到我的Thunderbolt
目录中,例如
$ ldd /bin/bash
linux-gate.so.1 => (0xb7781000)
libtinfo.so.5 => /lib/i386-linux-gnu/libtinfo.so.5 (0xb7743000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb773e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7593000)
/lib/ld-linux.so.2 (0xb7782000)
对于 Java 本身,除了复制所需的库之外,我还mount --bind
绑定了 Java 主目录(/usr/lib/jvm/java-7-openjdk-i386/
):
$ mount --bind -o ro /usr/lib/jvm/java-7-openjdk-i386/ sys/java/
为了运行,我创建了一个名为chroot
的脚本(它设置了环境),然后运行我的 Java 应用程序(是一个 Jar 文件,我只是更改了扩展名):thunderbolt
.profile
/sys/Thunderbolt.sys
source /.profile
/sys/java/bin/java -jar /sys/Thunderbolt.sys Files
为了运行chroot
,我使用了以下命令
sudo chroot /home/mspencer/Thunderbolt /bin/bash /thunderbolt
笔记:目前它还不能完美运行,每当我运行 Java 时都会收到此警告:OpenJDK Server VM warning: Can't detect initial thread stack location - find_vma failed