
У меня большое, сложное приложение. Я пытаюсь запустить его с загрузочного 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