首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >chroot +挂载= EBUSY

chroot +挂载= EBUSY
EN

Unix & Linux用户
提问于 2018-08-29 09:30:25
回答 1查看 219关注 0票数 1

我有一个很大很复杂的应用程序。我正在尝试从引导CD上运行它,这显然是只读的。但是应用程序需要一个大的可写区域。(刻度盘是切不开的。)因此,我成功地构建了chroot环境,使其看起来像运行在正常的可写环境中一样。

问题是,应用程序首先要做的事情之一是挂载一些已经挂载的设备。我原以为内核会允许这样做,但是如果您试图重新挂载一个具有不同挂载选项的设备,mount(2)调用将返回EBUSY。我要让这一切停止发生。

应用程序不知道它是在这个稍微奇怪的配置中运行的。我真的不想改变应用程序代码来实现这个目标。是否有什么方法可以指示内核假装挂载只读的东西,即使它已经安装在其他地方作为读-写?

好吧,所以人们说这个问题还不清楚。让我们再试一次:

代码语言:javascript
复制
~# 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不知道我在做这件事,所以它立即尝试去做

代码语言:javascript
复制
mount --ro /dev/sdb1 /XData

但失败了。我要找的是一种让它不会失败的方法。我真的不想修改应用程序JAR文件,但我完全不介意在启动之前修改命令。基本上,我希望app.jar认为一切都是正常的,没有什么奇怪的事情发生。但我想不出该怎么做。

(看起来,如果您尝试使用相同的选项多次挂载,内核对此非常满意。但试图增加不同的选择似乎会让它感到不安。)

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-08-30 09:00:28

这个脚本应该适合你。如果没有,请告诉我写入/var/log/user.log/var/log/syslog/var/log/messagesD1日志消息。

代码语言:javascript
复制
#!/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
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/465461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档