使用Chroot与Java应用程序

我正在设计一组Java程序,希望有朝一日能将其转化为基于Java的操作系统。在我成功构建内核之前,我想先在Ubuntu上运行这些程序。因此,我需要将所有文件系统调用指向我的主目录中的另一个目录,这样从Java中访问/实际上会访问/home/<user>/Thunderbolt/
我查看了使用chroot的社区文档,但它说要设置一个基本的Ubuntu安装。这真的必要吗?我只想在其中运行Java应用程序,使应用程序认为它在自己的虚拟文件系统中。我不需要所有额外的Ubuntu东西。
根据上述文档:

在很多方面,chroot就像在现有操作系统中安装另一个操作系统。

但我不想要这个。我只想隐藏大部分真实的文件系统,让应用程序只看到一个目录。
我也看过chroot函数的手册。这个能实现我想要的效果吗?
有没有简单的方法可以使用chroot在自己的虚拟文件系统中运行Java应用程序(不需要额外的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,我创建了一个名为 thunderbolt 的脚本,调用了 .profile(设置环境),然后运行了我的 Java 应用程序(/sys/Thunderbolt.sys 是一个 Jar 文件,我只是改变了扩展名):

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