chroot + mount = EBUSY

1

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.)

    
por MathematicalOrchid 29.08.2018 / 11:30

1 resposta

1

Este script deve funcionar para você. Se isso não acontecer, informe-nos sobre as mensagens mount 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
    
por 30.08.2018 / 11:00

Tags