chroot + mount = EBUSY

chroot + mount = EBUSY

Ich habe eine große, komplexe Anwendung. Ich versuche, sie von einer Boot-CD auszuführen, die offensichtlich schreibgeschützt ist. Die Anwendung benötigt jedoch einen großen beschreibbaren Bereich. (Eine Ramdisk reicht dafür nicht aus.) Daher habe ich es geschafft, eine Chroot-Umgebung zu erstellen, damit es für die Anwendung so aussieht, als würde sie von einer normalen beschreibbaren Umgebung ausgeführt.

Das Problem ist, dass die Anwendung als erstes versucht, bereits gemountete Geräte zu mounten. Ich hatte erwartet, dass der Kernel das zulässt, aber es scheint, dass, wenn Sie versuchen, ein Gerät mitandersMount-Optionen, der mount(2)Aufruf gibt zurück EBUSY. Ich muss dafür sorgen, dass das nicht mehr passiert.

Die Anwendung hat keine Ahnung, dass sie in dieser etwas seltsamen Konfiguration ausgeführt wird. Ich möchte den Anwendungscode nicht wirklich ändern, damit dies funktioniert. Gibt es eine Möglichkeit, den Kernel anzuweisen, so zu tun, als würde er etwas schreibgeschützt mounten, obwohl es bereits irgendwo anders schreibgeschützt gemountet ist?


OK, die Leute sagten also, die Frage sei unklar. Versuchen wir es noch einmal:

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

Natürlich app.jarhatkeine Ahnungdass ich das mache, also versucht es sofort,

mount --ro /dev/sdb1 /XData

was fehlschlägt. Ich suche nach einer Möglichkeit, es nicht fehlschlagen zu lassen. Ich möchte die JAR-Datei der Anwendung nicht wirklich ändern, aber ich habe kein Problem damit, die Befehle zu ändern, die zum Starten führen. Im Grunde möchte ich app.jardenken, dass alles normal ist und nichts Seltsames passiert. Aber ich habe Probleme herauszufinden, wie das geht.

(Es scheint, wenn Sie versuchen, etwas mehrmals zu montierenmit den gleichen Möglichkeiten, der Kernel ist damit vollkommen zufrieden. Aber der Versuch, mit zu mountenandersOptionen scheinen es zu stören.)

Antwort1

Dieses Skript sollte für Sie funktionieren. Wenn nicht, teilen Sie mir bitte die mountProtokollmeldungen mit /var/log/user.log, die in /var/log/syslogoder geschrieben wurden /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

verwandte Informationen