Was ist ein „bind mount“? Wie mache ich einen? Wozu ist es gut?
Mir wurde gesagt, ich solle ein Bindungsreittier für etwas verwenden, aber ich verstehe nicht, was es ist oder wie man es benutzt.
Akzeptierte Antwort:
Was ist ein Bindungsreittier?
Ein bindendes Reittier ist eine alternative Ansicht eines Verzeichnisbaums. Klassischerweise erstellt das Mounten eine Ansicht eines Speichergeräts als Verzeichnisbaum. Ein Bind-Mount nimmt stattdessen einen vorhandenen Verzeichnisbaum und repliziert ihn unter einem anderen Punkt. Die Verzeichnisse und Dateien im Bind-Mount sind die gleichen wie im Original. Jede Änderung auf einer Seite wird sofort auf der anderen Seite widergespiegelt, da beide Ansichten die gleichen Daten zeigen.
Beispielsweise nach Ausgabe des Linux-Befehls-
mount --bind /some/where /else/where
die Verzeichnisse /some/where
und /else/where
denselben Inhalt haben, nämlich den Inhalt von /some/where
. (Falls /else/where
war nicht leer, sein vorheriger Inhalt ist nun ausgeblendet.)
Anders als ein fester Link oder ein symbolischer Link wirkt sich ein Bind-Mount nicht darauf aus, was im Dateisystem gespeichert ist. Es ist eine Eigenschaft des Live-Systems.
Wie erstelle ich ein Bind-Mount?
bindfs
Das bindfs
filesystem ist ein FUSE-Dateisystem, das eine Ansicht eines Verzeichnisbaums erstellt. Zum Beispiel der Befehl
bindfs /some/where /else/where
macht /else/where
Ein Einhängepunkt, unter dem der Inhalt von /some/where
liegt sind sichtbar.
Da bindfs ein separates Dateisystem ist, werden die Dateien /some/where/foo
und /else/where/foo
als unterschiedliche Dateien für Anwendungen erscheinen (das bindfs-Dateisystem hat sein eigenes st_dev
Wert). Jede Änderung auf der einen Seite wird auf der anderen Seite „magisch“ widergespiegelt, aber die Tatsache, dass die Dateien gleich sind, wird nur offensichtlich, wenn man weiß, wie bindfs arbeitet.
Bindfs hat keine Kenntnis von Einhängepunkten, also wenn es einen Einhängepunkt unter /some/where
gibt , erscheint es einfach als ein weiteres Verzeichnis unter /else/where
. Mounten oder Unmounten eines Dateisystems unter /some/where
erscheint unter /else/where
als Wechsel des entsprechenden Verzeichnisses.
Bindfs kann einige der Dateimetadaten ändern:Es kann gefälschte Berechtigungen und Eigentumsrechte für Dateien anzeigen. Einzelheiten finden Sie im Handbuch und unten finden Sie Beispiele.
Ein bindfs-Dateisystem kann als Nicht-Root-Benutzer gemountet werden, Sie benötigen nur die Berechtigung zum Mounten von FUSE-Dateisystemen. Abhängig von Ihrer Distribution muss dies möglicherweise in der fuse
sein Gruppe oder für alle Benutzer zugelassen werden. Verwenden Sie zum Aushängen eines FUSE-Dateisystems fusermount -u
statt umount
, z. B.
fusermount -u /else/where
nullfs
FreeBSD stellt das nullfs
zur Verfügung Dateisystem, das eine alternative Ansicht eines Dateisystems erstellt. Die folgenden zwei Befehle sind äquivalent:
mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where
Nachdem Sie einen der beiden Befehle ausgegeben haben, /else/where
wird zu einem Einhängepunkt, an dem der Inhalt von /some/where
sind sichtbar.
Da nullfs ein separates Dateisystem ist, werden die Dateien /some/where/foo
und /else/where/foo
als unterschiedliche Dateien für Anwendungen erscheinen (das nullfs-Dateisystem hat sein eigenes st_dev
Wert). Jede Änderung auf der einen Seite wird auf der anderen Seite „magisch“ widergespiegelt, aber die Tatsache, dass die Dateien gleich sind, wird nur offensichtlich, wenn man weiß, wie nullfs arbeitet.
Im Gegensatz zu FUSE bindfs, das auf der Ebene des Verzeichnisbaums agiert, agiert FreeBSDs nullfs tiefer im Kernel, also Mountpunkte unter /else/where
sind nicht sichtbar:nur der Baum, der Teil desselben Einhängepunkts ist wie /some/where
wird unter /else/where
widergespiegelt .
Das nullfs-Dateisystem kann unter anderen BSD-Varianten (OS X, OpenBSD, NetBSD) verwendet werden, ist jedoch nicht als Teil des Standardsystems kompiliert.
Linux-Bind-Mount
Unter Linux sind Bind Mounts als Kernel-Funktion verfügbar. Sie können eine mit dem mount
erstellen Befehl, indem Sie entweder den --bind
übergeben Befehlszeilenoption oder bind
Mount-Option. Die folgenden zwei Befehle sind äquivalent:
mount --bind /some/where /else/where
mount -o bind /some/where /else/where
Hier das „Gerät“ /some/where
ist keine Festplattenpartition wie bei einem Dateisystem auf der Festplatte, sondern ein vorhandenes Verzeichnis. Der Einhängepunkt /else/where
muss wie üblich ein bestehendes Verzeichnis sein. Beachten Sie, dass in beiden Fällen kein Dateisystemtyp angegeben ist:Das Erstellen eines Bind-Mounts erfordert keinen Dateisystemtreiber, es kopiert die Kernel-Datenstrukturen vom ursprünglichen Mount.
mount --bind
unterstützt auch das Einhängen eines Nicht-Verzeichnisses in ein Nicht-Verzeichnis:/some/where
kann eine normale Datei sein (in diesem Fall /else/where
muss auch eine normale Datei sein).
Ein Linux-Bind-Mount ist meistens nicht vom Original zu unterscheiden. Der Befehl df -T /else/where
zeigt dasselbe Gerät und denselben Dateisystemtyp wie df -T /some/where
. Die Dateien /some/where/foo
und /else/where/foo
sind ununterscheidbar, als wären sie harte Links. Es ist möglich, /some/where
auszuhängen , in diesem Fall /else/where
bleibt montiert.
Bei älteren Kerneln (ich weiß nicht genau wann, ich glaube bis etwa 3.x) waren Bind-Mounts wirklich nicht vom Original zu unterscheiden. Neuere Kernel verfolgen Bind-Mounts und legen die Informationen über PID offen /mountinfo, was
findmnt
erlaubt um Bind Mount als solches anzuzeigen.
Sie können Bind-Mount-Einträge in /etc/fstab
einfügen . Fügen Sie einfach bind
hinzu (oder rbind
usw.) in den Optionen, zusammen mit allen anderen gewünschten Optionen. Das „Gerät“ ist der vorhandene Baum. Die Dateisystemspalte kann none
enthalten oder bind
(Es wird ignoriert, aber die Verwendung eines Dateisystemnamens wäre verwirrend). Zum Beispiel:
/some/where /readonly/view none bind,ro
Wenn es Einhängepunkte unter /some/where
gibt , ihr Inhalt ist unter /else/where
nicht sichtbar . Statt bind
, können Sie rbind
verwenden , replizieren Sie auch Einhängepunkte unter /some/where
. Wenn beispielsweise /some/where/mnt
ist dann ein Einhängepunkt
mount --rbind /some/where /else/where
entspricht
mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt
Außerdem erlaubt Linux, Mounts als gemeinsam zu deklarieren , Sklave , privat oder unbindable . Dies wirkt sich darauf aus, ob diese Mount-Operation unter einem Bind-Mount widergespiegelt wird, das den Mount-Punkt repliziert. Weitere Details finden Sie in der Kernel-Dokumentation.
Linux bietet auch eine Möglichkeit, Mounts zu verschieben:wobei --bind
Kopien, --move
verschiebt einen Einhängepunkt.
Es ist möglich, unterschiedliche Mount-Optionen in zwei bind-gemounteten Verzeichnissen zu haben. Es gibt jedoch eine Eigenart:Das Einhängen der Bindung und das Einstellen der Einhängeoptionen können nicht atomar erfolgen, es müssen zwei aufeinanderfolgende Vorgänge sein. (Ältere Kernel erlaubten dies nicht.) Beispielsweise erstellen die folgenden Befehle eine schreibgeschützte Ansicht, aber es gibt ein kleines Zeitfenster, in dem /else/where
ist schreibgeschützt:
mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where
Ich kann Bindungsreittiere nicht zum Laufen bringen!
Wenn Ihr System FUSE nicht unterstützt, besteht ein klassischer Trick, um denselben Effekt zu erzielen, darin, einen NFS-Server auszuführen und die Dateien, die Sie verfügbar machen möchten, zu exportieren (Zugriff auf localhost
zu ermöglichen). ) und montieren Sie sie auf demselben Computer. Dies hat einen erheblichen Mehraufwand in Bezug auf Speicher und Leistung zur Folge, daher haben Bind-Mounts einen eindeutigen Vorteil, sofern verfügbar (was dank FUSE bei den meisten Unix-Varianten der Fall ist).
Anwendungsfälle
Schreibgeschützte Ansicht
Es kann nützlich sein, eine schreibgeschützte Ansicht eines Dateisystems zu erstellen, entweder aus Sicherheitsgründen oder einfach als Sicherheitsebene, um sicherzustellen, dass Sie es nicht versehentlich ändern.
Mit bindfs:
bindfs -r /some/where /mnt/readonly
Unter Linux ganz einfach:
mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly
Dadurch bleibt ein kurzes Zeitintervall, in dem /mnt/readonly
ist schreibgeschützt. Wenn dies ein Sicherheitsproblem darstellt, erstellen Sie zuerst den Bind-Mount in einem Verzeichnis, auf das nur Root zugreifen kann, machen Sie ihn schreibgeschützt und verschieben Sie ihn dann an einen öffentlichen Mount-Punkt. Beachten Sie im folgenden Snippet, dass es wichtig ist, dass /root/private
(das Verzeichnis über dem Einhängepunkt) ist privat; die ursprünglichen Berechtigungen auf /root/private/mnt
sind irrelevant, da sie hinter dem Einhängepunkt versteckt sind.
mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly
Benutzer und Gruppen neu zuordnen
Dateisysteme zeichnen Benutzer und Gruppen anhand ihrer numerischen ID auf. Manchmal haben Sie mehrere Systeme, die derselben Person unterschiedliche Benutzer-IDs zuweisen. Dies ist kein Problem beim Netzwerkzugriff, aber es macht Benutzer-IDs bedeutungslos, wenn Sie Daten auf einer Festplatte von einem System zu einem anderen übertragen. Angenommen, Sie haben eine Festplatte, die mit einem Mehrbenutzer-Dateisystem (z. B. ext4, btrfs, zfs, UFS, …) auf einem System erstellt wurde, auf dem Alice die Benutzer-ID 1000 und Bob die Benutzer-ID 1001 hat, und Sie möchten diese Festplatte zugänglich machen ein System, in dem Alice die Benutzer-ID 1001 und Bob die Benutzer-ID 1000 hat. Wenn Sie die Festplatte direkt mounten, werden die Dateien von Alice als im Besitz von Bob erscheinen (weil die Benutzer-ID 1001 ist) und die Dateien von Bob werden als im Besitz von Alice erscheinen (weil die Benutzer-ID ist 1000).
Sie können binfs verwenden, um Benutzer-IDs neu zuzuordnen. Mounten Sie zuerst die Festplattenpartition in einem privaten Verzeichnis, wo nur root darauf zugreifen kann. Erstellen Sie dann eine bindfs-Ansicht in einem öffentlichen Bereich mit einer Neuzuordnung von Benutzer-ID und Gruppen-ID, die die Benutzer-IDs und Gruppen-IDs von Alice und Bob vertauscht.
mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk
Siehe Wie greift man zulässigerweise auf Dateien im Home-Ordner des Benutzers eines nicht gebooteten Systems zu? und mount – binde andere Benutzer als mich selbst ein weiteres Beispiel.
Montage in einem Gefängnis oder Container
Ein Chroot-Jail oder Container führt einen Prozess in einem Unterbaum des Verzeichnisbaums des Systems aus. Dies kann nützlich sein, um ein Programm mit eingeschränktem Zugriff auszuführen, z. Betreiben eines Netzwerkservers mit Zugriff nur auf seine eigenen Dateien und die Dateien, die er bedient, aber nicht auf andere Daten, die auf demselben Computer gespeichert sind). Eine Einschränkung von Chroot besteht darin, dass das Programm auf einen Unterbaum beschränkt ist:Es kann nicht auf unabhängige Unterbäume zugreifen. Bind-Mounts ermöglichen das Aufpfropfen anderer Unterbäume auf diesen Hauptbaum. Dies macht sie grundlegend für die praktischste Verwendung von Containern unter Linux.
Angenommen, eine Maschine führt den Dienst /usr/sbin/somethingd
aus die nur Zugriff auf Daten unter /var/lib/something
haben soll . Der kleinste Verzeichnisbaum, der diese beiden Dateien enthält, ist das Stammverzeichnis. Wie kann der Dienst eingeschränkt werden? Eine Möglichkeit besteht darin, feste Links zu allen Dateien zu erstellen, die der Dienst benötigt (mindestens /usr/sbin/somethingd
und mehrere gemeinsam genutzte Bibliotheken) unter /var/lib/something
. Dies ist jedoch umständlich (die festen Links müssen aktualisiert werden, wenn eine Datei aktualisiert wird) und funktioniert nicht, wenn /var/lib/something
und /usr
befinden sich auf unterschiedlichen Dateisystemen. Eine bessere Lösung besteht darin, ein Ad-hoc-Root zu erstellen und es mit mounts zu füllen:
mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &
Die Mount-Namespaces von Linux verallgemeinern Chroots. Bind-Mounts ermöglichen es, Namespaces auf flexible Weise zu füllen. Ein Beispiel finden Sie unter Einen Prozess dazu bringen, eine andere Datei mit demselben Dateinamen zu lesen.
Eine andere Distribution ausführen
Eine weitere Verwendung von Chroots besteht darin, eine andere Distribution in einem Verzeichnis zu installieren und Programme von dort aus auszuführen, selbst wenn sie Dateien in fest codierten Pfaden benötigen, die auf dem Basissystem nicht vorhanden sind oder einen anderen Inhalt haben. Dies kann beispielsweise nützlich sein, um eine 32-Bit-Distribution auf einem 64-Bit-System zu installieren, das gemischte Pakete nicht unterstützt, um ältere Versionen einer Distribution oder anderer Distributionen zu installieren, um die Kompatibilität zu testen, um eine neuere Version zum Testen zu installieren die neuesten Funktionen unter Beibehaltung eines stabilen Basissystems usw. Siehe Wie führe ich 32-Bit-Programme auf einem 64-Bit-Debian/Ubuntu aus? für ein Beispiel auf Debian/Ubuntu.
Angenommen, Sie haben eine Installation der neuesten Pakete Ihrer Distribution im Verzeichnis /f/unstable
, wo Sie Programme ausführen, indem Sie mit chroot /f/unstable
in dieses Verzeichnis wechseln . Um Home-Verzeichnisse von diesen Installationen verfügbar zu machen, binden Sie sie in die Chroot ein:
mount --bind /home /f/unstable/home
Das Programm schroot erledigt dies automatisch.
Zugriff auf Dateien, die hinter einem Einhängepunkt versteckt sind
Wenn Sie ein Dateisystem in ein Verzeichnis einhängen, verbirgt dies, was sich hinter dem Verzeichnis befindet. Auf die Dateien in diesem Verzeichnis kann erst zugegriffen werden, wenn das Verzeichnis ausgehängt wird. Da BSD-Nullfs- und Linux-Bind-Mounts auf einer niedrigeren Ebene als die Mount-Infrastruktur arbeiten, legt ein Nullfs-Mount oder ein Bind-Mount eines Dateisystems Verzeichnisse offen, die im Original hinter Submounts verborgen waren.
Verwandt:Aktualisieren Sie die Werte einer Datei mithilfe von Informationen aus einer anderen Datei?
Angenommen, Sie haben ein tmpfs-Dateisystem, das unter /tmp
gemountet ist . Wenn es Dateien unter /tmp
gab Als das tmpfs-Dateisystem erstellt wurde, können diese Dateien immer noch vorhanden sein, effektiv unzugänglich sein, aber Speicherplatz beanspruchen. Ausführen
mount --bind / /mnt
(Linux) oder
mount -t nullfs / /mnt
(FreeBSD), um eine Ansicht des Root-Dateisystems unter /mnt
zu erstellen . Das Verzeichnis /mnt/tmp
ist diejenige aus dem Root-Dateisystem.
NFS-Exporte auf verschiedenen Pfaden
Einige NFS-Server (z. B. der Linux-Kernel-NFS-Server vor NFSv4) kündigen immer den tatsächlichen Verzeichnisspeicherort an, wenn sie ein Verzeichnis exportieren. Das heißt, wenn ein Client server:/requested/location
anfordert stellt der Server den Baum am Standort /requested/location
bereit . Manchmal ist es wünschenswert, Clients zu erlauben, /request/location
anzufordern aber tatsächlich Dateien unter /actual/location
bereitstellen . Wenn Ihr NFS-Server das Bereitstellen eines alternativen Standorts nicht unterstützt, können Sie einen Bind-Mount für die erwartete Anfrage erstellen, z. B.
/requested/location *.localdomain(rw,async)
in /etc/exports
und das Folgende in /etc/fstab
:
/actual/location /requested/location bind bind
Ein Ersatz für symbolische Links
Manchmal möchten Sie einen symbolischen Link erstellen, um eine Datei /some/where/is/my/file
zu erstellen erscheinen unter /else/where
, sondern die Anwendung, die file
verwendet erweitert symbolische Links und weist /some/where/is/my/file
zurück . Ein Bind-Mount kann dies umgehen:bind-mount /some/where/is/my
zu /else/where/is/my
, und dann realpath
wird /else/where/is/my/file
melden unter /else/where
sein , nicht unter /some/where
.
Nebenwirkungen von gebundenen Reittieren
Rekursive Verzeichnisdurchläufe
Wenn Sie Bind-Mounts verwenden, müssen Sie sich um Anwendungen kümmern, die den Dateisystembaum rekursiv durchlaufen, wie z. B. Backups und Indexierung (z. B. um eine Ortungsdatenbank zu erstellen).
Normalerweise sollten Bind-Mounts von rekursiven Verzeichnisdurchläufen ausgeschlossen werden, sodass jeder Verzeichnisbaum nur einmal am ursprünglichen Speicherort durchlaufen wird. Konfigurieren Sie bei bindfs und nullfs das Traversal-Tool so, dass diese Dateisystemtypen nach Möglichkeit ignoriert werden. Linux-Bind-Mounts können nicht als solche erkannt werden:Der neue Speicherort entspricht dem Original. Bei Linux-Bind-Mounts oder bei Tools, die nur Pfade und keine Dateisystemtypen ausschließen können, müssen Sie die Mount-Punkte für die Bind-Mounts ausschließen.
Durchläufe, die an Dateisystemgrenzen enden (z. B. find -xdev
, rsync -x
, du -x
, …) werden automatisch angehalten, wenn sie auf einen bindfs- oder nullfs-Einhängepunkt stoßen, da dieser Einhängepunkt ein anderes Dateisystem ist. Bei Linux-Bind-Mounts ist die Situation etwas komplizierter:Es gibt nur dann eine Dateisystemgrenze, wenn das Bind-Mount ein anderes Dateisystem einbindet, nicht, wenn es einen anderen Teil desselben Dateisystems einpfropft.
Über Bind Mounts hinausgehen
Bind-Mounts bieten eine Ansicht eines Verzeichnisbaums an einem anderen Ort. Sie legen dieselben Dateien offen, möglicherweise mit unterschiedlichen Mount-Optionen und (mit bindfs) unterschiedlichen Eigentümern und Berechtigungen. Dateisysteme, die eine veränderte Ansicht eines Verzeichnisbaums darstellen, werden als Overlay-Dateisysteme bezeichnet oder stapelbare Dateisysteme . Es gibt viele andere Overlay-Dateisysteme, die fortgeschrittenere Transformationen durchführen. Hier sind ein paar gängige. Wenn Ihr gewünschter Anwendungsfall hier nicht behandelt wird, überprüfen Sie das Repository von FUSE-Dateisystemen.
- loggedfs – protokolliert den gesamten Dateisystemzugriff zu Debugging- oder Überwachungszwecken (Konfigurationsdateisyntax, Ist es möglich herauszufinden, welches Programm oder Skript eine bestimmte Datei erstellt hat?, Listet die Dateien auf, auf die ein Programm zugreift)
Sichtbare Dateien filtern
-
clamfs – Dateien durch einen Virenscanner laufen lassen, wenn sie gelesen werden
-
filterfs — verbirgt Teile eines Dateisystems
-
rofs – eine schreibgeschützte Ansicht. Ähnlich wie
bindfs -r
, nur etwas leichter. -
Union-Mounts – präsentiert mehrere Dateisysteme (genannt Zweige ) unter einem einzelnen Verzeichnis:if
tree1
enthältfoo
undtree2
enthältbar
dann enthält ihre Vereinigungsansicht sowohlfoo
undbar
. Neue Dateien werden in einen bestimmten Zweig geschrieben oder in einen nach komplexeren Regeln ausgewählten Zweig. Es gibt mehrere Implementierungen dieses Konzepts, darunter:- aufs — Linux-Kernel-Implementierung, aber viele Male vom Upstream abgelehnt
- funionfs – FUSE-Implementierung
- mhddfs – FUSE, schreibt Dateien basierend auf freiem Speicherplatz in einen Zweig
- Overlay – Linux-Kernel-Implementierung, zusammengeführt in Linux v3.18
- unionfs-fuse – FUSE, mit Caching- und Copy-on-Write-Funktionen
Dateinamen und Metadaten ändern
- ciopfs – Dateinamen ohne Berücksichtigung der Groß-/Kleinschreibung (kann nützlich sein, um Windows-Dateisysteme einzuhängen)
- convmvfs — konvertiert Dateinamen zwischen Zeichensätzen (Beispiel)
- posixovl — speichert Unix-Dateinamen und andere Metadaten (Berechtigungen, Eigentum, …) auf eingeschränkteren Dateisystemen wie VFAT (Beispiel)
Geänderte Dateiinhalte anzeigen
- avfs — Präsentieren Sie für jede Archivdatei ein Verzeichnis mit dem Inhalt des Archivs (Beispiel, weitere Beispiele). Es gibt auch viele FUSE-Dateisysteme, die bestimmte Archive als Verzeichnisse verfügbar machen.
- fuseflt — Dateien beim Lesen durch eine Pipeline laufen lassen, z.B. um Textdateien oder Mediendateien zu rekodieren (Beispiel)
- lzopfs — transparente Dekomprimierung komprimierter Dateien
- mp3fs – Transkodiert FLAC-Dateien in MP3, wenn sie gelesen werden (Beispiel)
- scriptfs — führt Skripte aus, um Inhalte bereitzustellen (eine Art lokales CGI) (Beispiel)
Ändern Sie die Art und Weise, wie Inhalte gespeichert werden
- chironfs – repliziert Dateien auf mehrere zugrunde liegende Speicher (RAID-1 auf Verzeichnisbaumebene)
- copyfs — behalte Kopien aller Versionen der Dateien
- encfs – Dateien verschlüsseln
- pcachefs – On-Disk-Cache-Layer für langsame entfernte Dateisysteme
- simplecowfs — speichert Änderungen über die bereitgestellte Ansicht im Speicher, wobei die Originaldateien intakt bleiben
- wayback — behalte Kopien aller Versionen der Dateien