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ć.
filesystems
mount
bind-mount
Gilles
źródło
źródło
Odpowiedzi:
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
katalogi
/some/where
i/else/where
mają 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
bindfs
plików to system plików FUSE, który tworzy widok drzewa katalogów. Na przykład polecenietworzy
/else/where
punkt montowania, pod którym zawartość/some/where
jest widoczna.Ponieważ bindfs jest oddzielnym systemem plików, pliki
/some/where/foo
i/else/where/foo
pojawiają się w aplikacjach jako różne pliki (system plików bindfs ma swojąst_dev
wartość). 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/where
wyświetlane/else/where
jako 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
fuse
grupie lub być dozwolone dla wszystkich użytkowników. Aby odmontować system plików FUSE, użyjfusermount -u
zamiastumount
, npnullfs
FreeBSD zapewnia
nullfs
system plików, który tworzy alternatywny widok systemu plików. Następujące dwa polecenia są równoważne:Po wydaniu dowolnego polecenia
/else/where
staje się punktem montowania, w którym zawartość/some/where
jest widoczna.Ponieważ nullfs jest oddzielnym systemem plików, pliki
/some/where/foo
i/else/where/foo
pojawiają się jako różne pliki dla aplikacji (system plików nullfs ma swojąst_dev
wartość). 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/where
nie są widoczne: tylko drzewo, które jest częścią tego samego punktu montowania, co/some/where
jest 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ą
mount
polecenia, przekazując--bind
opcję wiersza polecenia lubbind
opcję montowania. Następujące dwa polecenia są równoważne:Tutaj „urządzenie”
/some/where
nie jest partycją dyskową, jak w przypadku systemu plików na dysku, ale istniejącym katalogiem. Punkt podłączenia/else/where
musi 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 --bind
obsługuje także montowanie katalogu innego niż katalog w katalogu innym niż katalog:/some/where
może to być zwykły plik (w takim przypadku/else/where
musi 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/where
pokazuje to samo urządzenie i ten sam typ systemu plików codf -T /some/where
. Pliki/some/where/foo
i/else/where/foo
są nierozróżnialne, jakby były twardymi linkami. Można odmontować/some/where
, w którym to przypadku/else/where
pozostaje 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
findmnt
wskazać podłączenie jako takie .Możesz wstawić wpisy montowania wiązania
/etc/fstab
. Wystarczy włączyćbind
(lubrbind
itp.) W opcjach, wraz z dowolnymi innymi opcjami, które chcesz. „Urządzenie” to istniejące drzewo. Kolumna systemu plików może zawieraćnone
lubbind
(jest ignorowana, ale użycie nazwy systemu plików byłoby mylące). Na przykład:Jeśli poniżej znajdują się punkty montowania
/some/where
, ich zawartość nie jest widoczna pod/else/where
. Zamiast tegobind
możesz używaćrbind
, a także replikować punkty montowania pod spodem/some/where
. Na przykład, jeśli/some/where/mnt
jest to punkt montowania, tojest równa
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
--bind
kopiuje,--move
przenosi 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/where
jest to odczyt-zapis: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:
W systemie Linux prosty sposób:
Pozostawia to krótki okres czasu, w trakcie którego
/mnt/readonly
nastę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/mnt
są nieistotne, ponieważ są ukryte za punktem montowania.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.
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/somethingd
któ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/somethingd
kilka 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/something
i/usr
to 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: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: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/tmp
czasie tworzenia systemu plików tmpfs znajdowały się pliki, pliki te mogą nadal pozostać, skutecznie niedostępne, ale zajmują miejsce na dysku. Biegać(Linux) lub
(FreeBSD), aby utworzyć widok głównego systemu plików na
/mnt
. Katalog/mnt/tmp
pochodzi 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/location
serwer obsługuje drzewo w tej lokalizacji/requested/location
. Czasami pożądane jest, aby zezwolić klientom na żądanie,/request/location
ale 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, npw
/etc/exports
oraz w/etc/fstab
:Zamiennik dowiązań symbolicznych
Czasami chcesz utworzyć dowiązanie symboliczne, aby plik
/some/where/is/my/file
pojawił się pod/else/where
, ale aplikacja, która używa,file
rozwija dowiązania symboliczne i odrzuca/some/where/is/my/file
. Łączenie z łączeniem może obejść ten problem: łączenie z łączeniem/some/where/is/my
do/else/where/is/my
, a następnierealpath
zgł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
bindfs -r
, tylko trochę lżejsze.Union mounts - prezentuj wiele systemów plików (zwanych gałęziami ) w jednym katalogu: jeśli
tree1
zawierafoo
itree2
zawiera,bar
to ich widok unii zawiera zarównofoo
ibar
. 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:Zmodyfikuj nazwy plików i metadane
Wyświetl zmienioną zawartość pliku
Zmodyfikuj sposób przechowywania zawartości
źródło
mount --bind /dir1 /dir1
zrobić? Czym różni się od przypadku, w którym źródło i cel montażu są różne?/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.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.
źródło