我有一个很大很复杂的应用程序。我正在尝试从引导CD上运行它,这显然是只读的。但是应用程序需要一个大的可写区域。(刻度盘是切不开的。)因此,我成功地构建了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认为一切都是正常的,没有什么奇怪的事情发生。但我想不出该怎么做。
(看起来,如果您尝试使用相同的选项多次挂载,内核对此非常满意。但试图增加不同的选择似乎会让它感到不安。)
发布于 2018-08-30 09:00:28
这个脚本应该适合你。如果没有,请告诉我写入/var/log/user.log、/var/log/syslog或/var/log/messages的D1日志消息。
#!/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 1https://unix.stackexchange.com/questions/465461
复制相似问题