
Tengo una aplicación grande y compleja. Estoy intentando ejecutarlo desde un CD de arranque, que obviamente es de sólo lectura. Pero la aplicación necesita una gran área de escritura. (Un disco RAM no es suficiente). Así que logré construir un entorno chroot para que la aplicación parezca como si se estuviera ejecutando desde un entorno de escritura normal.
El problema es que una de las primeras cosas que intenta hacer la aplicación es montar algunos dispositivos que ya están montados. Esperaba que el kernel lo permitiera, pero parece que si intentas volver a montar un dispositivo condiferenteopciones de montaje, la mount(2)
llamada regresa EBUSY
. Necesito que eso deje de suceder.
La aplicación no tiene idea de que se está ejecutando en esta configuración ligeramente extraña. Realmente no quiero cambiar el código de la aplicación para que esto funcione. ¿Hay alguna forma de indicarle al kernel que pretenda montar algo de sólo lectura aunque ya esté montado en otro lugar como lectura-escritura?
Bien, entonces la gente dijo que la pregunta no está clara. Intentemos esto de nuevo:
~# 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
Por supuesto,app.jar
tieneni ideaque estoy haciendo esto, por lo que inmediatamente intenta hacer
mount --ro /dev/sdb1 /XData
que falla. Lo que busco es una manera de que no falle. Realmente no quiero alterar el archivo JAR de la aplicación, pero estoy totalmente de acuerdo con alterar los comandos previos a su inicio. Básicamente quiero app.jar
pensar que todo es normal y que no pasa nada raro. Pero tengo problemas para descubrir cómo hacerlo.
(Parece que si intentas montar algo varias vecescon las mismas opciones, el núcleo está perfectamente bien con eso. Pero tratando de montar condiferenteopciones parecen alterarlo.)
Respuesta1
Este script debería funcionar para usted. Si no es así, hágamelo saber los mount
mensajes de registro escritos en /var/log/user.log
, /var/log/syslog
o /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