
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.jar
temnenhuma 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.jar
pensar 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 mount
mensagens de log gravadas em /var/log/user.log
, /var/log/syslog
ou /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