Mount Bind: Unterschied zwischen den Versionen

Aus
Zeile 9: Zeile 9:
* den Editor vi bedient
* den Editor vi bedient


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. :-)
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 ==
== Problem ==

Version vom 17. Februar 2010, 22:01 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. ;-)

Vorraussetzungen

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

  • "gemeinsame Ordner" anlegt
  • sich per Telnet/SSH auf die Shell der DS einloggt
  • den Editor vi bedient

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 sähe 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 kleine 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/

Desweiteren sollte es folgende Rechte (755) haben:

ds209> ls -al /usr/syno/etc.defaults/rc.d/S99mount.sh
-rwxr-xr-x    1 root     root          354 Jan 13 20:45 /usr/syno/etc.defaults/rc.d/S99mount.sh

Setzen kann man die Recher einfach per:

chmod 755 /usr/syno/etc.defaults/rc.d/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.