Mount Bind: Unterschied zwischen den Versionen

Aus
Zeile 22: Zeile 22:
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 Vorraussetzung 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.
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 Vorraussetzung 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 sähe dann so aus:
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/
  /volume1/video/weitere_videos/

Version vom 27. Juli 2010, 22:20 Uhr

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 ausserdem 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 Ulaubsvideos 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 Vorraussetzung 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. Ausserdem 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.

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:

#!/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/syno/etc.defaults/rc.d/

Wichtig: Möchte man auf diese weise USB Devices beim start mounten, muss das Script in einem anderen Ordner liegen da die USB Devices erst recht spät im Bootvorgang der DS eingebunden werden. Dieser lautet:

/usr/local/etc/rc.d/

Da es bei bestimmten USB Geräten manchmal etwas dauert bis sie gemounted sind, kann es nötig sein das Script etwas zu verzögern. Das kann man erreichen indem man in die "Start" Funktion 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.