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

관련 정보