Co to jest mocowanie bind?

325

Co to jest „bind mount”? Jak to zrobić? Do czego to jest dobre?

Powiedziano mi, żebym używał mocowania do czegoś, ale nie rozumiem, co to jest ani jak go używać.

Gilles
źródło
2
przydatne alternatywne wyjaśnienie między wierzchowcami a dowiązaniami symbolicznymi: quora.com/…
Charlie Parker,

Odpowiedzi:

564

Co to jest mocowanie bind?

Wiążą mocowanie jest alternatywny widok drzewa katalogów. Klasycznie, montowanie tworzy widok urządzenia pamięci jako drzewa katalogów. Zamiast tego podłączenie wiązania bierze istniejące drzewo katalogów i replikuje je w innym punkcie. Katalogi i pliki w oprawie łączenia są takie same jak oryginalne. Wszelkie modyfikacje po jednej stronie są natychmiast odzwierciedlane po drugiej stronie, ponieważ dwa widoki pokazują te same dane.

Na przykład po wydaniu polecenia Linux

mount --bind /some/where /else/where

katalogi /some/wherei /else/wheremają tę samą treść.

W przeciwieństwie do twardego łącza lub dowiązania symbolicznego, podłączenie wiązania nie wpływa na to, co jest przechowywane w systemie plików. Jest własnością systemu na żywo.

Jak utworzyć oprawę do wiązania?

bindfs

System bindfsplików to system plików FUSE, który tworzy widok drzewa katalogów. Na przykład polecenie

bindfs /some/where /else/where

tworzy /else/wherepunkt montowania, pod którym zawartość /some/wherejest widoczna.

Ponieważ bindfs jest oddzielnym systemem plików, pliki /some/where/fooi /else/where/foopojawiają się w aplikacjach jako różne pliki (system plików bindfs ma swoją st_devwartość). Każda zmiana z jednej strony jest „magicznie” odzwierciedlana z drugiej strony, ale fakt, że pliki są takie same, jest widoczny tylko wtedy, gdy wiadomo, jak działa bindfs.

Bindfs nie ma wiedzy na temat punktów montowania, więc jeśli pod punktem montowania znajduje się punkt montowania /some/where, pojawia się on jako kolejny katalog pod /else/where. Podłączanie lub odmontowywanie systemu plików poniżej jest /some/wherewyświetlane /else/wherejako zmiana odpowiedniego katalogu.

Bindfs może zmieniać niektóre metadane plików: może pokazywać fałszywe uprawnienia i prawa własności do plików. Szczegółowe informacje można znaleźć w instrukcji , a przykłady podano poniżej.

System plików bindfs może być zamontowany jako użytkownik inny niż root, wystarczy jedynie uprawnienie do montowania systemów plików FUSE. W zależności od dystrybucji może to wymagać bycia w fusegrupie lub być dozwolone dla wszystkich użytkowników. Aby odmontować system plików FUSE, użyj fusermount -uzamiast umount, np

fusermount -u /else/where

nullfs

FreeBSD zapewnia nullfssystem plików, który tworzy alternatywny widok systemu plików. Następujące dwa polecenia są równoważne:

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

Po wydaniu dowolnego polecenia /else/wherestaje się punktem montowania, w którym zawartość /some/wherejest widoczna.

Ponieważ nullfs jest oddzielnym systemem plików, pliki /some/where/fooi /else/where/foopojawiają się jako różne pliki dla aplikacji (system plików nullfs ma swoją st_devwartość). Każda zmiana z jednej strony jest „magicznie” odzwierciedlona z drugiej strony, ale fakt, że pliki są takie same, jest widoczny tylko wtedy, gdy wiadomo, jak działa nullfs.

W przeciwieństwie do plików FUSE, które działają na poziomie drzewa katalogów, wartości nullfs FreeBSD działają głębiej w jądrze, więc punkty montowania poniżej /else/wherenie są widoczne: tylko drzewo, które jest częścią tego samego punktu montowania, co /some/wherejest odzwierciedlone /else/where.

System plików nullfs może być użyteczny w innych wariantach BSD (OS X, OpenBSD, NetBSD), ale nie jest kompilowany jako część domyślnego systemu.

Podłączenie do linuksa

W Linuksie podłączenia mount są dostępne jako funkcja jądra. Możesz go utworzyć za pomocą mountpolecenia, przekazując --bindopcję wiersza polecenia lub bindopcję montowania. Następujące dwa polecenia są równoważne:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

Tutaj „urządzenie” /some/wherenie jest partycją dyskową, jak w przypadku systemu plików na dysku, ale istniejącym katalogiem. Punkt podłączenia /else/wheremusi być jak zwykle istniejącym katalogiem. Zauważ, że żaden typ systemu plików nie jest określony w żaden sposób: wykonanie podłączenia nie wiąże się ze sterownikiem systemu plików, kopiuje struktury danych jądra z oryginalnego podłączenia.

mount --bindobsługuje także montowanie katalogu innego niż katalog w katalogu innym niż katalog: /some/wheremoże to być zwykły plik (w takim przypadku /else/wheremusi to być również zwykły plik).

Podłączenie do linuksa jest w większości nie do odróżnienia od oryginału. Polecenie df -T /else/wherepokazuje to samo urządzenie i ten sam typ systemu plików co df -T /some/where. Pliki /some/where/fooi /else/where/foosą nierozróżnialne, jakby były twardymi linkami. Można odmontować /some/where, w którym to przypadku /else/wherepozostaje zamontowany.

W starszych jądrach (nie wiem dokładnie, kiedy, chyba do 3.x), montowania opraw były naprawdę nie do odróżnienia od oryginału. Najnowsze jądra śledzą podłączenia opraw i ujawniają informacje poprzez PID / mountinfo, co pozwala findmntwskazać podłączenie jako takie .

Możesz wstawić wpisy montowania wiązania /etc/fstab. Wystarczy włączyć bind(lub rbinditp.) W opcjach, wraz z dowolnymi innymi opcjami, które chcesz. „Urządzenie” to istniejące drzewo. Kolumna systemu plików może zawierać nonelub bind(jest ignorowana, ale użycie nazwy systemu plików byłoby mylące). Na przykład:

/some/where /readonly/view none bind,ro

Jeśli poniżej znajdują się punkty montowania /some/where, ich zawartość nie jest widoczna pod /else/where. Zamiast tego bindmożesz używać rbind, a także replikować punkty montowania pod spodem /some/where. Na przykład, jeśli /some/where/mntjest to punkt montowania, to

mount --rbind /some/where /else/where

jest równa

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

Ponadto Linux pozwala na zadeklarowanie montowań jako współużytkowane , podrzędne , prywatne lub nierozłączalne . Wpływa to na to, czy ta operacja montowania jest odzwierciedlana w ramach instalacji powiązania, która replikuje punkt instalacji. Aby uzyskać więcej informacji, zobacz dokumentację jądra .

Linux zapewnia również sposób przenoszenia montowań: gdzie --bindkopiuje, --moveprzenosi punkt montowania.

Możliwe są różne opcje montowania w dwóch katalogach podłączonych do wiązania. Jest jednak dziwactwo: wykonanie montowania wiązania i ustawienie opcji montowania nie może odbywać się atomowo, muszą to być dwie kolejne operacje. (Starsze jądra nie pozwalały na to.) Na przykład następujące polecenia tworzą widok tylko do odczytu, ale istnieje małe okno czasowe, w którym /else/wherejest to odczyt-zapis:

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

Nie mogę zmusić opraw do wiązania!

Jeśli twój system nie obsługuje FUSE, klasycznym sposobem na osiągnięcie tego samego efektu jest uruchomienie serwera NFS, wyeksportowanie plików, które chcesz udostępnić (umożliwienie dostępu localhost) i zamontowanie ich na tym samym komputerze. Ma to znaczny narzut pod względem pamięci i wydajności, więc montowania bindów mają wyraźną przewagę, o ile są dostępne (co dotyczy większości wariantów Uniksa dzięki FUSE).

Przypadków użycia

Widok tylko do odczytu

Przydatne może być utworzenie widoku systemu plików w trybie tylko do odczytu, zarówno ze względów bezpieczeństwa, jak i jako warstwa bezpieczeństwa, aby upewnić się, że nie zostanie przypadkowo zmodyfikowany.

Z bindfs:

bindfs -r /some/where /mnt/readonly

W systemie Linux prosty sposób:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

Pozostawia to krótki okres czasu, w trakcie którego /mnt/readonlynastępuje odczyt-zapis. Jeśli dotyczy to bezpieczeństwa, najpierw utwórz podłączenie do wiązania w katalogu, do którego dostęp ma tylko root, ustaw je jako tylko do odczytu, a następnie przenieś do publicznego punktu podłączenia. W poniższym fragmencie zauważ, że ważne jest, aby /root/private(katalog powyżej punktu podłączenia) był prywatny; pierwotne uprawnienia /root/private/mntsą nieistotne, ponieważ są ukryte za punktem montowania.

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

Ponowne mapowanie użytkowników i grup

Systemy plików rejestrują użytkowników i grupy według ich identyfikatora numerycznego. Czasami powstaje wiele systemów, które przypisują różne identyfikatory użytkowników tej samej osobie. Nie stanowi to problemu z dostępem do sieci, ale sprawia, że ​​identyfikatory użytkowników nie mają znaczenia, gdy przenosisz dane z jednego systemu do drugiego na dysku. Załóżmy, że masz dysk utworzony w systemie plików dla wielu użytkowników (np. Ext4, btrfs, zfs, UFS,…) w systemie, w którym Alice ma identyfikator użytkownika 1000, a Bob ma identyfikator użytkownika 1001, i chcesz udostępnić ten dysk na system, w którym Alice ma identyfikator użytkownika 1001, a Bob ma identyfikator użytkownika 1000. Jeśli podłączysz dysk bezpośrednio, pliki Alicji pojawią się jako własność Boba (ponieważ identyfikator użytkownika to 1001), a pliki Boba pojawią się jako własność Alicji (ponieważ ID użytkownika to 1000).

Możesz użyć bindfs do zmiany mapowania identyfikatorów użytkowników. Najpierw zamontuj partycję dyskową w katalogu prywatnym, do którego dostęp ma tylko root. Następnie utwórz widok powiązań w obszarze publicznym, z mapowaniem identyfikatora użytkownika i grupy, który zamienia identyfikatory użytkownika Alice i Boba oraz identyfikatory grup.

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

Zobacz: W jaki sposób można w dozwolony sposób uzyskiwać dostęp do plików w folderze domowym użytkownika niezaładowanego systemu? i zamontuj - jako innego użytkownika jako innego użytkownika.

Montaż w więzieniu lub pojemniku

Chroot lub pojemnik uruchamia proces w poddrzewie o drzewie katalogów systemu. Może to być przydatne do uruchamiania programu z ograniczonym dostępem, np. Do uruchamiania serwera sieciowego z dostępem tylko do własnych plików i plików, które obsługuje, ale nie do innych danych przechowywanych na tym samym komputerze). Ograniczeniem chroot jest to, że program jest ograniczony do jednego poddrzewa: nie ma dostępu do niezależnych poddrzewa. Mocowania Bind pozwalają szczepić inne poddrzewa na tym głównym drzewie. To czyni je podstawowymi dla najbardziej praktycznego wykorzystania kontenerów pod Linuxem.

Załóżmy na przykład, że komputer obsługuje usługę, /usr/sbin/somethingdktóra powinna mieć dostęp tylko do danych /var/lib/something. Najmniejszym drzewem katalogowym zawierającym oba te pliki jest katalog główny. Jak można ograniczyć usługę? Jedną z możliwości jest utworzenie twardych linków do wszystkich plików, których potrzebuje serwis (przynajmniej /usr/sbin/somethingdkilka bibliotek współdzielonych) /var/lib/something. Ale to jest kłopotliwe (twarde linki muszą być aktualizowane, gdy plik zostanie uaktualniony), a jeśli nie działa /var/lib/somethingi /usrto na różnych systemach plików. Lepszym rozwiązaniem jest utworzenie katalogu głównego ad hoc i zapełnienie go przy użyciu mountów:

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 &

Przestrzenie nazw montowania Linuksa uogólniają chrooty. Montowania powiązań umożliwiają elastyczne wypełnianie przestrzeni nazw. Zobacz Making proces odczytu inny plik o tej samej nazwie pliku na przykład.

Uruchamianie innej dystrybucji

Innym zastosowaniem chroots jest instalacja innej dystrybucji w katalogu i uruchamianie z niego programów, nawet jeśli wymagają one plików na sztywno zakodowanych ścieżkach, które nie są obecne lub mają inną zawartość w systemie podstawowym. Może to być przydatne, na przykład, do zainstalowania 32-bitowej dystrybucji w 64-bitowym systemie, który nie obsługuje pakietów mieszanych, do zainstalowania starszych wydań dystrybucji lub innych dystrybucji w celu przetestowania zgodności, do zainstalowania nowszej wersji do przetestowania najnowsze funkcje przy zachowaniu stabilnego systemu bazowego itp. Zobacz Jak uruchamiać programy 32-bitowe na 64-bitowym systemie Debian / Ubuntu? na przykład na Debian / Ubuntu.

Załóżmy, że masz instalację najnowszych pakietów dystrybucji w katalogu /f/unstable, w którym uruchamiasz programy, przełączając się do tego katalogu za pomocą chroot /f/unstable. Aby udostępnić katalogi domowe z tych instalacji, bind zamontuj je w chroot:

mount --bind /home /f/unstable/home

Program Schroot robi to automatycznie.

Dostęp do plików ukrytych za punktem montowania

Podczas montowania systemu plików w katalogu ukrywa to, co jest za katalogiem. Pliki w tym katalogu stają się niedostępne do momentu odmontowania katalogu. Ponieważ nullfs BSD i montowania powiązań Linuksa działają na niższym poziomie niż infrastruktura montowania, montowanie nullfs lub podłączanie wiązania systemu plików ujawnia katalogi, które były ukryte za podzliczeniami w oryginale.

Załóżmy na przykład, że masz zainstalowany system plików tmpfs /tmp. Jeśli w /tmpczasie tworzenia systemu plików tmpfs znajdowały się pliki, pliki te mogą nadal pozostać, skutecznie niedostępne, ale zajmują miejsce na dysku. Biegać

mount --bind / /mnt

(Linux) lub

mount -t nullfs / /mnt

(FreeBSD), aby utworzyć widok głównego systemu plików na /mnt. Katalog /mnt/tmppochodzi z głównego systemu plików.

Eksport NFS na różne ścieżki

Niektóre serwery NFS (takie jak serwer NFS jądra Linuksa przed NFSv4) zawsze reklamują faktyczną lokalizację katalogu podczas eksportowania katalogu. Oznacza to, że na żądanie klienta server:/requested/locationserwer obsługuje drzewo w tej lokalizacji /requested/location. Czasami pożądane jest, aby zezwolić klientom na żądanie, /request/locationale faktycznie serwowanie plików w ramach /actual/location. Jeśli Twój serwer NFS nie obsługuje udostępniania alternatywnej lokalizacji, możesz utworzyć podłączenie wiązania dla oczekiwanego żądania, np

/requested/location *.localdomain(rw,async)

w /etc/exportsoraz w /etc/fstab:

/actual/location /requested/location bind bind

Zamiennik dowiązań symbolicznych

Czasami chcesz utworzyć dowiązanie symboliczne, aby plik /some/where/is/my/filepojawił się pod /else/where, ale aplikacja, która używa, filerozwija dowiązania symboliczne i odrzuca /some/where/is/my/file. Łączenie z łączeniem może obejść ten problem: łączenie z łączeniem /some/where/is/mydo /else/where/is/my, a następnie realpathzgłosi, /else/where/is/my/fileże jest poniżej /else/where, a nie poniżej /some/where.

Skutki uboczne opraw mocowań

Rekurencyjne przechodzenie przez katalog

Jeśli używasz montowania powiązań, musisz zadbać o aplikacje, które rekurencyjnie przechodzą przez drzewo systemu plików, takie jak kopie zapasowe i indeksowanie (np. W celu zbudowania zlokalizowanej bazy danych).

Zwykle montowania powiązań powinny być wykluczone z rekurencyjnych przeglądów katalogów, tak aby każde drzewo katalogów było przemierzane tylko raz, w oryginalnej lokalizacji. W przypadku bindfs i nullfs skonfiguruj narzędzie do przechodzenia, aby w miarę możliwości ignorowały te typy systemów plików. Nie można rozpoznać montowań powiązań w systemie Linux jako takich: nowa lokalizacja jest równoważna oryginałowi. W przypadku montowania powiązań w systemie Linux lub narzędzi, które mogą wykluczać tylko ścieżki, a nie typy systemów plików, należy wykluczyć punkty montowania dla podłączeń.

Z przechodzenia że zatrzymują się na granicach systemu plików (np find -xdev, rsync -x, du -x, ...) zatrzyma się automatycznie, gdy napotkają bindfs lub nullfs punkt montowania, bo to punkt montowania jest inny system plików. W przypadku podłączania powiązań w Linuksie sytuacja jest nieco bardziej skomplikowana: granica systemu plików istnieje tylko wtedy, gdy podłączenie wiąże się z wszczepieniem innego systemu plików, a nie w przypadku szczepienia innej części tego samego systemu plików.

Wykraczanie poza oprawę wiązania

Mocowania wiązania zapewniają widok drzewa katalogów w innym miejscu. Udostępniają te same pliki, prawdopodobnie z różnymi opcjami montowania i (z bindfs) inną własnością i uprawnieniami. Systemy plików prezentujące zmieniony widok drzewa katalogów nazywane są nakładkowymi systemami plików lub systemami plików, które można ustawiać jeden na drugim . Istnieje wiele innych systemów plików nakładek, które wykonują bardziej zaawansowane transformacje. Oto kilka typowych. Jeśli żądany przypadek użycia nie jest tutaj objęty, sprawdź repozytorium systemów plików FUSE .

Filtruj widoczne pliki

  • clamfs - uruchamiaj pliki przez skaner antywirusowy podczas ich odczytu
  • filterfs - ukryj części systemu plików
  • rofs - widok tylko do odczytu. Podobne do bindfs -r, tylko trochę lżejsze.
  • Union mounts - prezentuj wiele systemów plików (zwanych gałęziami ) w jednym katalogu: jeśli tree1zawiera fooi tree2zawiera, barto ich widok unii zawiera zarówno fooi bar. Nowe pliki są zapisywane w określonej gałęzi lub gałęzi wybranej zgodnie z bardziej złożonymi regułami. Istnieje kilka wdrożeń tej koncepcji, w tym:

    • aufs - implementacja jądra Linux, ale wielokrotnie odrzucana
    • funionfs - implementacja FUSE
    • mhddfs - BEZPIECZNIK, zapisuj pliki do oddziału w oparciu o wolne miejsce
    • nakładka - implementacja jądra Linux, scalona w górę w Linuksie 3.18
    • unionfs-fuse - BEZPIECZNIK, z funkcjami buforowania i kopiowania przy zapisie

Zmodyfikuj nazwy plików i metadane

  • ciopfs - nazwy plików bez rozróżniania wielkości liter (może być przydatne do montowania systemów plików Windows)
  • convmvfs - konwertuj nazwy plików między zestawami znaków ( przykład )
  • posixovl - przechowuje nazwy plików Unix i inne metadane (uprawnienia, własność, ...) w bardziej ograniczonych systemach plików, takich jak VFAT ( przykład )

Wyświetl zmienioną zawartość pliku

Zmodyfikuj sposób przechowywania zawartości

Gilles
źródło
1
warto dodać przykład tego, jak to zrobić za pomocą systemd: utcc.utoronto.ca/~cks/space/blog/linux/SystemdBindMountUnits
dothebart 22.09.16
1
Co ma mount --bind /dir1 /dir1zrobić? Czym różni się od przypadku, w którym źródło i cel montażu są różne?
Mark
Nie widziałem żadnych rekordów w / proc / self / mountinfo, używając Linuksa 5.0. Jądro nie mówi mi, że jest to bind mount, czy nie. A proces może łatwo przerwać chroot, izolacja musi być wykonana przez przestrzeń nazw montowania.
炸鱼 薯条 德里克
@ 炸鱼 薯条 德里克 Myślę, że połączone pytanie unix.stackexchange.com/questions/295525/… adresy /proc/self/mountinfo. Jeśli chodzi o chroot, może być stosowany do izolacji, ale nie sam. Nie potrzebujesz jednak przestrzeni nazw montowania: chroot jest wystarczający dla części przestrzeni nazw systemu plików. Musisz upewnić się, że żaden proces w chroot nie działa jako ten sam użytkownik co proces poza nim.
Gilles
@Mark Bindowanie katalogu na sobie nie jest zbyt przydatne. Wydaje mi się, że można go użyć do ukrycia systemów plików zamontowanych w określonym katalogu, ale nie mogę wymyślić momentu, w którym chciałbym to zrobić konkretnie.
Gilles
-1

Proste, gdy używasz bind mount, plik lub katalog na hoście jest montowany w kontenerze, więc wszelkie zmiany wprowadzone w katalogu plików na hoście będą automatycznie dostępne w kontenerze w katalogu.

srinivas
źródło
Jest to jeden ze sposobów korzystania z uchwytu do wiązania, ale same uchwyty do wiązania nie mają nic wspólnego z kontenerami. Wspominam o tym w mojej odpowiedzi, ale pod nazwą „więzienie” zamiast „kontener”; dodanie „kontenera” byłoby cenną edycją (zrobię to). Jest to również zły opis: dlaczego wspomnieć, że zmiany dokonane na zewnątrz są również dostępne w środku, nie wspominając o odwrotnej kolejności?
Gilles