Odpowiedzi:
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/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.
System bindfs
plików to system plików FUSE, który tworzy widok drzewa katalogów. Na przykład polecenie
bindfs /some/where /else/where
tworzy /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żyj fusermount -u
zamiast umount
, np
fusermount -u /else/where
FreeBSD zapewnia nullfs
system 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/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.
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 lub bind
opcję 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/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 co df -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
(lub rbind
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
lub 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 bind
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, 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 --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:
mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where
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).
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/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.
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
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.
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:
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.
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.
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ć
mount --bind / /mnt
(Linux) lub
mount -t nullfs / /mnt
(FreeBSD), aby utworzyć widok głównego systemu plików na /mnt
. Katalog /mnt/tmp
pochodzi z głównego systemu plików.
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, np
/requested/location *.localdomain(rw,async)
w /etc/exports
oraz w /etc/fstab
:
/actual/location /requested/location bind bind
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ępnie realpath
zgłosi, /else/where/is/my/file
że jest poniżej /else/where
, a nie poniżej /some/where
.
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.
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 .
bindfs -r
, tylko trochę lżejsze.Union mounts - prezentuj wiele systemów plików (zwanych gałęziami ) w jednym katalogu: jeśli tree1
zawiera foo
i tree2
zawiera, bar
to ich widok unii zawiera zarówno foo
i 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:
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.