chroot + montagem = EBUSY

chroot + montagem = EBUSY

Eu tenho um aplicativo grande e complexo. Estou tentando executá-lo a partir de um CD de inicialização, que obviamente é somente leitura. Mas o aplicativo precisa de uma grande área gravável. (Um ramdisk não vai funcionar.) Então, consegui construir um ambiente chroot para fazer com que o aplicativo pareça estar sendo executado em um ambiente gravável normal.

O problema é que uma das primeiras coisas que o aplicativo tenta fazer é montar alguns dispositivos que já estão montados. Eu esperava que o kernel permitisse isso, mas parece que se você tentar remontar um dispositivo comdiferenteopções de montagem, a mount(2)chamada retorna EBUSY. Preciso fazer com que isso pare de acontecer.

O aplicativo não tem ideia de que está sendo executado nesta configuração um pouco estranha. Eu realmente não quero alterar o código do aplicativo para que isso funcione. Existe alguma maneira de instruir o kernel a fingir montar algo somente leitura, mesmo que já esteja montado em outro lugar como leitura e gravação?


OK, então as pessoas disseram que a pergunta não está clara. Vamos tentar novamente:

~# 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

Claro, app.jartemnenhuma idéiaque estou fazendo isso, então ele imediatamente tenta fazer

mount --ro /dev/sdb1 /XData

que falha. O que procuro é uma maneira de fazer com que não falhe. Eu realmente não quero alterar o arquivo JAR do aplicativo, mas estou totalmente bem em alterar os comandos que levam ao lançamento dele. Basicamente, quero app.jarpensar que tudo está normal e que nada de estranho está acontecendo. Mas estou tendo problemas para descobrir como fazer isso.

(Parece que se você tentar montar algo várias vezescom as mesmas opções, o kernel está perfeitamente bem com isso. Mas tentando montar comdiferenteopções parece perturbá-lo.)

Responder1

Este script deve funcionar para você. Caso contrário, informe-me as mountmensagens de log gravadas em /var/log/user.log, /var/log/syslogou /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

informação relacionada