Eu tenho um aplicativo grande e complexo. Eu estou tentando executá-lo a partir de um CD de boot, que é obviamente somente leitura. Mas o aplicativo precisa de uma grande área gravável. (Um disco não irá cortá-lo.) Então, eu consegui construir um ambiente chroot para fazer com que ele pareça para o aplicativo como se estivesse 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 com opções de montagem diferentes , a chamada mount(2)
retornará EBUSY
. Eu preciso que isso pare de acontecer.
O aplicativo não tem idéia de que está sendo executado nesta configuração um pouco estranha. Eu realmente não quero mudar o código do aplicativo para fazer isso funcionar. Existe alguma maneira que eu possa instruir o kernel a fingir que monta algo somente leitura, mesmo que ele já esteja montado em algum outro lugar como leitura-gravação?
OK, as pessoas disseram que a pergunta não está clara. Vamos tentar de novo:
~# 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 que app.jar
não tem ideia de que estou fazendo isso, então ele tenta imediatamente fazer
mount --ro /dev/sdb1 /XData
que falha. O que estou procurando é uma maneira de não falhar. Eu realmente não quero alterar o arquivo JAR do aplicativo, mas estou totalmente OK alterando os comandos que o levaram a iniciá-lo. Basicamente eu quero que app.jar
pense que tudo está normal e nada de estranho está acontecendo. Mas estou tendo problemas para descobrir como fazer isso.
(Parece que se você tentar montar algo várias vezes com as mesmas opções , o kernel está perfeitamente bem com isso. Mas tentar montar com diferentes opções parece perturbá-lo.)