chroot + 挂载 = EBUSY

chroot + 挂载 = EBUSY

我有一个大型且复杂的应用程序。我正在尝试从引导 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

相关内容