chroot + mount = EBUSY

chroot + mount = EBUSY

大きくて複雑なアプリケーションがあります。明らかに読み取り専用のブートCDから実行しようとしています。ただし、アプリケーションには書き込み可能な大きな領域が必要です。 (RAMディスクではありません。)それで、私は正常に書き込み可能な環境で実行されているように見える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

おすすめ記事