我有一个大型且复杂的应用程序。我正在尝试从引导 CD 运行它,这显然是只读的。但应用程序需要很大的可写区域。 (ramdisk 不会削减它。)因此,我设法构建了一个 chroot 环境,使其看起来就像是在正常的可写环境中运行一样。
问题是,应用程序尝试做的第一件事就是安装一些已经安装的设备。我希望内核允许这样做,但似乎如果您尝试使用以下命令重新挂载设备不同的安装选项,mount(2)
调用返回EBUSY
.我需要阻止这种情况发生。
该应用程序不知道它正在这种稍微奇怪的配置中运行。我真的不想更改应用程序代码来完成这项工作。有什么方法可以指示内核假装以只读方式安装某些内容,即使它已经以读写方式安装在其他地方?
好吧,所以人们说这个问题不清楚。让我们再试一次:
~# mount /dev/sdb1 /XData
~# mkdir /tmp/CD
~# mount --bind / /tmp/CD
~# mount -t overlayfs -o lowerdir=/tmp/CD,upperdir=/XData/Root,workdir=/XData/Work none /NewRoot
~# chroot /NewRoot
~# java /home/user7/app.jar
当然app.jar
有不知道我正在这样做,所以它立即尝试这样做
mount --ro /dev/sdb1 /XData
这失败了。我正在寻找的是一种让它不会失败的方法。我真的不想更改应用程序 JAR 文件,但我完全同意更改启动它之前的命令。基本上我想app.jar
认为一切都很正常,没有什么奇怪的事情发生。但我很难弄清楚如何做到这一点。
(似乎如果你尝试多次安装某些东西具有相同的选项,内核对此完全没问题。但试图安装不同的选项似乎令人不安。)
答案1
这个脚本应该适合你。如果没有,请让我知道mount
写入/var/log/user.log
、/var/log/syslog
或 的日志消息/var/log/messages
。
#!/bin/bash
#
# Mount should be a no-op if called as "mount --ro /dev/sdb1 /XData"
#
# Move the real /usr/bin/mount to /usr/bin/mount.bin, and install this
# script as /usr/bin/mount
########################################################################
#
if [[ "$*" == '--ro /dev/sdb1 /XData' ]]
then
logger -t mount "NO-OP: $0 $*"
exit 0
fi
logger -t mount "Action: $0 $*"
exec "$0.bin" "$@"
exit 1