chroot + 마운트 = EBUSY

chroot + 마운트 = EBUSY

크고 복잡한 애플리케이션이 있습니다. 분명히 읽기 전용인 부팅 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모든 것이 정상이고 이상한 일이 일어나지 않는다고 생각하고 싶습니다. 하지만 어떻게 해야 할지 모르겠어요.

(무언가를 여러 번 마운트하려고하면 그런 것 같습니다.같은 옵션으로, 커널은 완벽하게 괜찮습니다. 하지만 마운트하려고다른옵션이 당황스러운 것 같습니다.)

답변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

관련 정보