chroot + монтирование = EBUSY

chroot + монтирование = EBUSY

У меня большое, сложное приложение. Я пытаюсь запустить его с загрузочного CD, который, очевидно, доступен только для чтения. Но приложению нужна большая область для записи. (RAM-диск не подойдет.) Поэтому мне удалось создать среду chroot, чтобы приложение выглядело так, будто оно запущено из обычной среды для записи.

Проблема в том, что одно из первых действий, которое приложение пытается выполнить, это монтировать некоторые устройства, которые уже смонтированы. Я ожидал, что ядро ​​позволит это, но, похоже, если вы попытаетесь перемонтировать устройство с помощьюдругойпараметры монтирования, mount(2)вызов возвращает EBUSY. Мне нужно сделать так, чтобы это прекратилось.

Приложение не имеет ни малейшего представления о том, что оно запущено в этой немного странной конфигурации. Я не хочу менять код приложения, чтобы это работало. Есть ли способ заставить ядро ​​притвориться, что монтирует что-то только для чтения, даже если оно уже смонтировано где-то еще как для чтения и записи?


Хорошо, люди сказали, что вопрос неясен. Давайте попробуем еще раз:

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

Конечно, app.jarестьбез понятиячто я делаю это, поэтому он немедленно пытается сделать

mount --ro /dev/sdb1 /XData

который терпит неудачу. Я ищу способ сделать так, чтобы он не терпел неудачу. Я не хочу менять файл JAR приложения, но меня вполне устраивает изменение команд, ведущих к его запуску. В общем, я хочу app.jarдумать, что все нормально и ничего странного не происходит. Но мне сложно понять, как это сделать.

(Похоже, если вы попытаетесь смонтировать что-то несколько раз,с теми же опциями, ядро ​​прекрасно с этим справляется. Но попытка монтирования с помощьюдругой(Похоже, что варианты его расстраивают.)

решение1

Этот скрипт должен работать у вас. Если нет, сообщите мне, пожалуйста, mountсообщения журнала, записанные в /var/log/user.log, /var/log/syslogили /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

Связанный контент