chroot + マウント = EBUSY

chroot + マウント = EBUSY

大規模で複雑なアプリケーションがあります。ブート CD から実行しようとしていますが、これは明らかに読み取り専用です。しかし、アプリケーションには大きな書き込み可能領域が必要です (RAM ディスクでは不十分です)。そこで、アプリケーションが通常の書き込み可能環境から実行されているように見えるように、chroot 環境を構築することに成功しました。

問題は、アプリケーションが最初に行うことの1つが、すでにマウントされているデバイスをマウントすることです。カーネルがそれを許可することを期待していましたが、デバイスを再マウントしようとすると、違うマウント オプションを指定すると、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

関連情報