
我有一個大型且複雜的應用程式。我正在嘗試從引導 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