Wiele osób twierdzi, że Linux nie przechowuje informacji o łączeniach bindów, więc nie ma sposobu na uzyskanie listy ich i ich źródeł. Oto kilka przykładów:
z jednego z komentarzy tutaj :
IIRC ta informacja nie jest nigdzie przechowywana: po tym
mount --bind
, dwie kopie są równoważne, nie ma jednej, która byłaby bardziej „oryginalna” niż druga. W końcu nie byłoby oryginału, gdybyś już odmontował/mnt
.-
Jedynym sposobem, aby zapamiętać, które montowania były powiązaniami, jest dziennik poleceń montowania, które pozostały
/etc/mtab
. Operacja łączenia z łączeniem jest wskazywana przez opcję łączenia z łączeniem (co powoduje ignorowanie typu systemu plików). Ale mount nie ma opcji, aby wyświetlić listę tylko systemów plików zamontowanych z określonym zestawem opcji. -
To celowe. Oba punkty montowania są w pełni równe pod każdym względem, więc jądro nie utrzymuje żadnych flag, aby je rozróżnić.
Powyższe jest jednak nonsensem. Narzędzie findmnt
jest w stanie wyświetlić listę ścieżek źródłowych montowań powiązań (w formie device[source-path]
; Próbuję też, aby wyświetlała tylko ścieżkę źródłową, a nie urządzenie). Jeśli jądro Linuksa ma utrzymywać mocowanie do wiązania, to informacje te muszą być gdzieś przechowywane , w przeciwnym razie nie wiedziałby, że /home
jest to związane /users
. Więc gdzie są te dane? Czy jest przechowywany w jakimś niejasnym regionie w pamięci RAM? Czy gdzieś findmnt
zagląda /proc
?
źródło
findmnt
i jakie masz opcje? Mój nie drukuje go w ten sposób i patrząc na kod źródłowy,_PATH_PROC_MOUNTINFO
którego używa, który/proc/self/mountinfo
nie zawiera tych informacji./proc/self/mountinfo
stosunkowo niedawno został zrestrukturyzowany. Byłem na mojej maszynie RHEL6, przed którą nie miałem informacji o ścieżce, ale moja maszyna RHEL7 ma i jak wspomniano w twoim linku, Wheezy również./dev/A
jest zamontowany w,/B
a ty robiszmount --bind /B /C
, starsze jądra pamiętają tylko/B → /dev/A
i/C → /dev/A
nie pamiętają żadnych relacji między/B
i/C
. Zatem odmontowanie w/B
naturalny sposób nie ma wpływu/C
. Nowsze jądra pamiętają, że/C
był to montaż typu bind/B
, ale w sposób, który nie przeszkadza w/C
kontynuowaniu pracy, jeśli/B
jest odmontowany, nie wiem dokładnie jak.Odpowiedzi:
Trochę źle zrozumiałeś; dwa punkty montowania są równe pod względem uprawnień, flag itp., ponieważ powiązanie skutecznie przekierowuje dostęp z jednej ścieżki do drugiej. Ale wciąż są odrębne .
Jeśli spojrzysz na
/proc/self/mountinfo
to, zobaczysz widok jądra świata montowania dla tego procesu (przestrzenie nazw komplikują sprawę; nie ma tylko jednego widoku tabeli montowania).man 5 proc
wyjaśni format tego pliku, ale możesz zobaczyć hierarchię drzewa i miejsca, w których montowania powiązań mają swoje „elementy nadrzędne”. To jest plik, któryfindmnt
analizuje.źródło
Linux nie przechowuje informacji o tym, które podłączenie było podłączeniem . Przechowuje informacje o wszystkich mocowaniach, w tym mocowaniach powiązań .
Jest dość podobny do twardych linków. Montuje łącze do systemów plików, takich jak nazwy plików, łącza do i-węzłów. Jedyne różnice polegają na tym, że podłączenia mają również flagi poszczególnych punktów podłączenia i mogą odnosić się do podkatalogu docelowego systemu plików zamiast katalogu głównego systemu plików.
Podczas tworzenia twardego łącza system plików nie zapisuje, która nazwa pliku była oryginalna, a która stała. Oba odnoszą się po prostu do tego samego i-węzła. Jeśli odłączysz oryginalny plik, sytuacja będzie nie do odróżnienia od tego, czy bezpośrednio utworzyłeś plik z drugą nazwą pliku.
Powrót do wiązania mountów: Jądro przechowuje tabelę zawierającą system plików (identyfikowany przez parę major: minor number), punkt montowania, ścieżkę względem katalogu głównego systemu plików i niektóre flagi. Możesz uzyskać dostęp do tej listy, patrząc na
/proc/self/mountinfo
. (Staje się to bardziej skomplikowane, gdy w grę wchodzą przestrzenie nazw, jak wspomniano @ stephen-harris).findmnt
analizuje tę listę.Jeśli twój katalog główny to
/dev/sda1
major: minor8:1
i uruchomiszmount --bind /a /b
/proc/self/mountinfo
będzie zawierać wiersze podobne do tego:Jeśli
/home
jest/dev/sda2
za główny: poboczny8:2
i uruchomieniumount --bind /home /users
będzie wyglądać następująco:Odpowiednie kolumny dla twojego pytania to trzecia, czwarta i piąta. Są to identyfikator systemu plików (w prawdziwych systemach plików jest taki sam jak major urządzenia: minor; dla wirtualnych systemów plików, takich jak tmpfs, jest to [0: licznik ]), ścieżka względem katalogu głównego systemu plików, który jest powiązany z punktem montowania (zwykle / dla normalnego mounts, może być cokolwiek dla mount mountów) i mountpoint.
Znaczenie pozostałych kolumn można znaleźć w dokumentacji jądra systemu Linux .
findmnt
wywołuje ścieżkę źródłową względem katalogu głównego systemu plików „FSROOT”. Możesz użyć,findmnt -o TARGET,FSROOT
aby go zdobyć. Jeśli chcesz mieć absolutną ścieżkę źródłową, prawdopodobnie musisz/proc/self/mountinfo
ją samodzielnie przeanalizować i połączyć informacje o podłączeniach dla tego samego systemu plików.Aby uzyskać więcej informacji, zobacz moją odpowiedź na „Listuj tylko wiązania mountów” .
źródło
/proc/self/mountinfo
mogą zawierać linie podoba2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro
, to Linux z pewnością robi zachować pewne informacje na temat powiązań wierzchowce.mount --bind /home/melab /mnt
otrzymanej linii może wyglądać jedną z następujących czynności w zależności od tego, która z/home
i/home/melab
JEST montowania:3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw
,3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw
,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
/
w czwartej kolumnie często wskazuje na oprawę łączenia. Ale może to być również podobjętość Btrfs./dev/sda3
ma być montowany na/home/melab
?/dev/sda1
as/
,/dev/sda2
as/home
i/dev/sda3
as/home/melab