Mount Bind

Aus Synology Wiki
Wechseln zu: Navigation, Suche

In diesem Artikel geht es um die Möglichkeit, einen Ordner in einen anderen Ordner zu mounten. Wie? Weshalb? Warum? Wer nicht fragt... genau, der liest im Wiki. ;-)

Voraussetzungen

Ich gehe in diesem Artikel davon aus, dass der geneigte Leser weiß wie man:

Es sei außerdem darauf hingewiesen, dass es sich hierbei um einen Hack handelt, der so im Prinzip eigentlich nicht vorgesehen ist. Auch können Nebenwirkungen auftreten - z.B. file/quota checks beim Neustart - wenn man nicht entsprechende Vorkehrungen in Form eines start/stop scripts trifft (dazu später mehr). Ich muss nicht extra erwähnen, dass man vorher schaut, wie aktuell das Backup der DS ist und natürlich handelt jeder auf eigene Gefahr. :-) Ich erkläre diese Thematik hier anhand des eingebauten Mediaservers. Natürlich lässt sich diese Technik aber auch für andere Zwecke verwenden.

Problem

Angenommen wir haben ein 2-Bay NAS - z.B. eine DS209. Eingebaut sind zwei 500GB Festplatten. Modus ist Basic. Wir haben also zwei Volumes, /volume1/ und /volume2/ mit diversen "gemeinsamen Ordnern". Der eingebaute Mediaserver nutzt für Videos std. mässig den Systemordner /volume1/video/. Soweit, sogut. Nun fangen wir an, den Video Ordner mit unseren Urlaubsvideos zu befüllen. Da wir viel verreisen, sind die 500GB auf /volume1/ schnell voll. Ooops.

Es kommt also der Wunsch auf, auch /volume2/ für Videos zu nutzen sie aber trotzdem gleichzeitig auch im eingebauten Mediaserver zu haben. Leider geht das nicht, da der eingebaute Mediaserver nur aus dem einen Ordner /volume1/video/ die Videos verteilt... es muss also ein Weg her, dem eingebauten Mediaserver vorzugaukeln es lägen alle Videos in /volume1/video/, obwohl sie in Wirklichkeit auf beide Volumes verteilt sind. Zusammengefasst haben wir also folgende Ausgangssituation:

/volume1/video/                 #Der erste Teil unserer Urlaubsvideos
/volume2/mehr_urlaubsvideos/    #Der zweite Teil unserer Urlaubsvideos

Lösung - Schritt Eins - mount/bind

Hier kommt also nun endlich mount -o bind ins Spiel. Damit ist es nämlich möglich einen Ordner, auch wenn der auf einem ganz anderen Volume liegt, in einen anderen Ordner "einzublenden" - zu mounten. Einzige Voraussetzung ist, dass der Zielordner leer ist. Sind dort schon Dateien vorhanden, so werden diese verdeckt bis man den mount wieder löst. Das geht zwar, ist aber unschön.

Wir erstellen daher also in unserem schon gut gefüllten "gemeinsamen Ordner" /volume1/video/ einen neuen leeren Ordner, der uns in Kürze dazu dient die Videos, die eigentlich auf /volume2/mehr_urlaubsvideos/ liegen anzuzeigen. Wie nennen den Ordner beispielhaft weitere_videos. Das können wir bequem z.B. über SAMBA von unserem Windows PC erledigen. Das sähe auf der DS danach dann so aus:

/volume1/video/weitere_videos/

Nun loggen wir uns per Telnet/SSH als root auf der DS ein und geben folgendes Kommando ein:

mount -o bind /volume2/mehr_urlaubsvideos/ /volume1/video/weitere_videos/

Damit haben wir den Inhalt von /volume2/mehr_urlaubsvideos/ in /volume1/video/weitere_videos/ eingeblendet. Beide Ordner sind abolut gleichwertig. Was wir in den einen rein kopieren, taucht auch im anderen auf und umgekehrt. Defakto sind beide Ordner identisch - sie sind also nun ein und der selbe Ordner. Wenn wir diese Einblendug (man spricht vom mount) wieder lösen wollen, geben wir folgendes Kommando ein:

umount /volume1/video/weitere_videos/

Und schon ist der Spuk wieder vorbei. Wie Eingangs schon erwähnt, kann es zu Nebenwirkungen kommen wenn man den mount nicht löst bevor man die DS ausschaltet. Beim nächsten starten macht die DS dann einen file/quota check, weil sie das /volume1/ nicht sauber unmounten konnte. Außerdem wäre es ja wünschenswert, wenn wir bei jedem Start der DS automatisch die Verbindung zwischen den beiden Video Ordnern herstellen könnten. Kommen wir also zum zweiten Schritt.

Neu Indexieren

Damit der Mediaserver die Videos in dem gemounteten Ordner auch findet, müssen wir einmalig alle Videos neu indexieren lassen. Das geht am besten auf der Konsole. Wir loggen uns also per Telnet/SSH als root auf der DS ein und geben folgendes Kommando ein:

synoindex -R video

Es werden nur alle Videos neu indexiert. Was natürlich, abhängig davon wieviele Videos vorhanden sind, etwas dauern kann. Damit der Mediaserver in Zukunft alle neuen Videos automatisch indexiert, ist es wichtig in welchen gemeinsamen Ordner man die Dateien kopiert. In unserem Beispiel ist dies /volume1/video/ bzw. der darin enthaltene Unterordner /weitere_videos/! Über /volume2/mehr_urlaubsvideos/ werden die Dateien nicht erkannt! Obwohl sie virtuell im gleichen Ordner landen.

Lösung - Schritt Zwei - start/stop script

Um das mounten beim starten und das unmouten beim herrunterfahren der DS zu automatisieren, habe ich folgendes kleines Script erstellt welches genau diese Aufgabe erfüllt. Ich nenne es S99mount.sh (erweiterte Variante):

#!/bin/sh
# S99mount.sh
# mount/bind some folders on startup
# and umount them on shutdown/reboot

case $1 in
start)
        /bin/mount -o bind /volume2/mehr_urlaubsvideos/ /volume1/video/weitere_videos/
        ;;
stop)
        /bin/umount /volume1/video/weitere_videos/
        ;;
*)
        echo "Usage: $0 [start|stop]"
        ;;
esac

Natürlich kann dieses Script nach belieben um weitere Ordner ergänzt werden.

Damit die DS das Script beim hoch- und runterfahren auch ausführt legt man es in folgendem Ordner ab:

/usr/local/etc/rc.d/

Möchte man auf diese Weise USB Devices beim Start mounten, kann es nötig sein, das Script etwas zu verzögern, da es manchmal bei bestimmten USB-Geräten etwas dauern kann, bis sie gemounted sind. Das kann man erreichen, indem man in den "start"-Abschnitt ein sleep einbaut. Die Dauer kann variieren. Als Startwert zum experimentieren bieten sich 10 Sekunden an. Das sähe dann für das Beispiel oben so aus (Auszug):

start)
        sleep 10
        /bin/mount -o bind /volume2/mehr_urlaubsvideos/ /volume1/video/weitere_videos/
        ;;

Das Script benötigt folgende Rechte (755):

ds209> ls -al S99mount.sh
-rwxr-xr-x    1 root     root          354 Jan 13 20:45 S99mount.sh

Setzen kann man die Rechte einfach per (vorher natürlich in den richtigen Ordner wechseln!):

chmod 755 S99mount.sh

Von nun an, wird beim Einschalten automatisch gemounted und beim Ausschalten automatisch ungemounted.

The End

Ich hoffe dieser Artikel ist verständlich und hilfreich. Wer Verbesserungen hat, ist gerne eingeladen diese hier einzupflegen.