Mount Bind: Unterschied zwischen den Versionen

Aus
 
(15 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
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. ;-)
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 ==
== Voraussetzungen ==


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


* "gemeinsame Ordner" anlegt
* "gemeinsame Ordner" anlegt
* sich per Telnet/SSH auf die Shell der DS einloggt
* sich per [[Die_Kommandozeile|Telnet/SSH auf die Shell]] der DS einloggt
* den Editor vi bedient
* den Editor [[Der_Editor_vi|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 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 ==
== 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.
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:
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:
Zeile 20: Zeile 20:


== Lösung - Schritt Eins - mount/bind ==
== 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.
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 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/
Zeile 34: Zeile 34:
  umount /volume1/video/weitere_videos/
  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.
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==
== 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''':
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''' ([[Mount Bind/scriptv2|erweiterte Variante]]):
 
<nowiki>
#!/bin/sh
#!/bin/sh
# S99mount.sh
# S99mount.sh
# mount/bind some folders on startup
# mount/bind some folders on startup
# and umount them on shutdown/reboot
# 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


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
</nowiki>
Natürlich kann dieses Script nach belieben um weitere Ordner ergänzt werden.
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:
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/
  /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/
        ;;


Desweiteren sollte es folgende Rechte (755) haben:
Das Script benötigt folgende Rechte (755):


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


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


  chmod 755 /usr/syno/etc.defaults/rc.d/S99mount.sh
  chmod 755 S99mount.sh


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


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

Aktuelle Version vom 30. Mai 2013, 13:41 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 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.