Odpowiedzi:
Montowania powiązań nie są typem systemu plików ani parametrem podłączonego systemu plików; są parametrami operacji montowania . O ile mi wiadomo, następujące sekwencje poleceń prowadzą do zasadniczo identycznych stanów systemu, jeśli chodzi o jądro:
mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one
Jedynym sposobem, aby zapamiętać, które wierzchowce były łączeniem wierzchowców, jest dziennik pozostałych mount
poleceń /etc/mtab
. Operacja podłączenia powiązania jest wskazywana przez opcjębind
podłączenia (która powoduje, że typ systemu plików jest ignorowany). Ale nie ma opcji, aby wyświetlić listę tylko systemów plików zamontowanych z określonym zestawem opcji. Dlatego musisz wykonać własne filtrowanie.mount
mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'
Pamiętaj, że /etc/mtab
przydaje się to tylko wtedy, gdy jest to plik tekstowy obsługiwany przez mount
. Niektóre dystrybucje skonfigurowane /etc/mtab
jako dowiązanie symboliczne /proc/mounts
; /proc/mounts
jest w większości równoważny, /etc/mtab
ale ma kilka różnic, z których jedna nie śledzi montowań powiązań.
Jedną z informacji, które są zatrzymywane przez jądro, ale nie są pokazywane w /proc/mounts
, jest to, gdy punkt podłączenia pokazuje tylko część drzewa katalogów w zamontowanym systemie plików. W praktyce dzieje się tak głównie z oprawami bind:
mount --bind /mnt/one/sub /mnt/partial
W /proc/mounts
, wpisy dla /mnt/one
i /mnt/partial
mają to samo urządzenie, ten sam typ systemu plików i te same opcje. Informacje, które /mnt/partial
pokazują tylko tę część systemu plików, która jest zrootowana, /sub
są widoczne w informacjach o punkcie montowania na proces w /proc/$pid/mountinfo
(kolumna 4). Wpisy wyglądają tak:
12 34 56:78 / /mnt/one rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered
12 34 56:78 /sub /mnt/partial rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered
mount --version
wykorzystujesz te bind
informacje /etc/mtab
? Korzystam z wersji 2.20.1 i sprawdziłem najnowsze źródła i w żadnym przypadku nie widzę zapisanych informacji o powiązaniach, które pozwoliłyby na grep bind
. Z drugiej strony, to, co zasugerowałem w mojej odpowiedzi , faktycznie wyświetla listę opraw montowanych utworzonych za pomocą, --bind
jak również przy użyciu bind
opcji .
</etc/mtab awk …
jest zgodny z POSIX (nie pamiętam, czy jest obsługiwany w Bourne). Sprawdź swoje fakty. Mogę potwierdzić, że /etc/mtab
ma bind
opcję dla systemu plików zamontowanego mount --bind /source /target
na stabilnej wersji Debiana (mount z util-linux-ng 2.17.2).
mount
i /etc/mtab
. Używasz stabilnej wersji Debiana, która ma starszą wersję util-linux-ng; Używam testów Debiana, który ma nowszą wersję, która nie wydaje się mieć ten sam /etc/mtab
problem, co jest być może dlatego @rozcietrzewiacz nie widzi bind
w w /etc/mtab
razie jego dystrybucja jest również za pomocą nowszej wersji?
findmnt
jako odpowiedź. Nawiasem mówiąc, działa to tylko wtedy, gdy katalog docelowy nie jest innym punktem montowania. Spróbuj na przykładsudo mount --bind / foo && findmnt | grep foo
Może to załatwi sprawę:
findmnt | grep "\["
Przykład:
$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep "\["
│ └─/tmp/foo /dev/sda2[/media] ext4 rw,relatime,data=ordered
/
Na przykład, jeśli samo jest zamontowane na wiązaniu, dane wyjściowe nie mają wartości [...]
.
Jądro po fakcie nie obsługuje mocowań łączenia innych niż normalne . Jedyne różnią się tym, co dzieje się podczas mount
uruchamiania.
Kiedy montujesz system plików (np. Z mount -t ext4 /dev/sda1 /mnt
), jądro (nieco uproszczone) wykonuje trzy kroki:
-t
lub użyjesz -t auto
mount
zgaduje typ dla ciebie i dostarcza zgadnięty typ do jądra)nodev
na przykład jest opcją w punkcie montowania, a nie w systemie plików. Możesz mieć podłączenie montowania z nodev
jednym bez niego)Jeśli wykonasz podłączenie wiązania (np. Za pomocą mount --bind /a /b
), dzieje się tak:
(Pominę mount --move
, bo to nie dotyczy pytania).
Jest to dość podobne do sposobu tworzenia plików w systemie Linux:
Jeśli zrobisz twardy link, dzieje się tak:
Jak widać, utworzony plik i twardy link są nierozróżnialne:
$ touch first
$ ln first second
$ ls -li
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/first
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/second
Ale ponieważ można zidentyfikować wszystkie dowiązania twarde do pliku, porównując numery i-węzłów, można zidentyfikować wszystkie podłączenia do systemu plików, porównując główne: mniejsze liczby podłączeń.
Możesz to zrobić findmnt -o TARGET,MAJ:MIN
bezpośrednio lub bezpośrednio /proc/self/mountinfo
( patrz dokumentacja jądra Linux, aby uzyskać więcej informacji ).
Poniższy skrypt Pythona zawiera listę wszystkich podłączeń powiązań. Zakłada się, że najstarszym punktem podłączenia z najkrótszą ścieżką względną do katalogu głównego podłączonego systemu plików jest oryginalne podłączenie.
#!/usr/bin/python3
import os.path, re
from collections import namedtuple
MountInfo = namedtuple('MountInfo', ['mountid', 'parentid', 'devid', 'root', 'mountpoint', 'mountoptions', 'extra', 'fstype', 'source', 'fsoptions'])
mounts = {}
def unescape(string):
return re.sub(r'\\([0-7]{3})', (lambda m: chr(int(m.group(1), 8))), string)
with open('/proc/self/mountinfo', 'r') as f:
for line in f:
# Parse line
mid, pid, devid, root, mp, mopt, *tail = line.rstrip().split(' ')
extra = []
for item in tail:
if item != '-':
extra.append(item)
else:
break
fstype, src, fsopt = tail[len(extra)+1:]
# Save mount info
mount = MountInfo(int(mid), int(pid), devid, unescape(root), unescape(mp), mopt, extra, fstype, unescape(src), fsopt)
mounts.setdefault(devid, []).append(mount)
for devid, mnts in mounts.items():
# Skip single mounts
if len(mnts) <= 1:
continue
# Sort list to get the first mount of the device's root dir (if still mounted)
mnts.sort(key=lambda x: x.root)
src, *binds = mnts
# Print bind mounts
for bindmount in binds:
if src.root == bindmount.root:
srcstring = src.mountpoint
else:
srcstring = src.mountpoint+':/'+os.path.relpath(bindmount.root, src.root)
print('{0} -> {1.mountpoint} ({1.mountoptions})'.format(srcstring, bindmount))
unset DONE1FSES
FSES=$(findmnt -vUPno SOURCE,FSROOT,TARGET,MAJ:MIN)
FSES=${FSES//MAJ:MIN/MAJ_MIN}
while read SEARCH1FS
do
unset DONE2FSES
eval "$SEARCH1FS"
SEARCH1SOURCE=$SOURCE
SEARCH1FSROOT=$FSROOT
SEARCH1TARGET=$TARGET
SEARCH1MAJMIN=$MAJ_MIN
FS1WASHANDLED=0
while read DONE1FS
do
if [[ $DONE1FS == $MAJ_MIN ]]
then
FS1WASHANDLED=1
break
fi
done < <(echo "$DONE1FSES")
if [[ ($SEARCH1FSROOT == /) && ($FS1WASHANDLED == 0) ]]
then
DONE1FSES+=$MAJ_MIN$'\n'
while read SEARCH2FS
do
eval "$SEARCH2FS"
SEARCH2SOURCE=$SOURCE
SEARCH2FSROOT=$FSROOT
SEARCH2TARGET=$TARGET
SEARCH2MAJMIN=$MAJ_MIN
FS2WASHANDLED=0
while read DONE2FS
do
if [[ $DONE2FS == $SEARCH2FS ]]
then
FS2WASHANDLED=1
break
fi
done < <(echo "$DONE2FSES")
if [[ ($SEARCH1MAJMIN == $SEARCH2MAJMIN) && ($SEARCH1TARGET != $SEARCH2TARGET ) && ($FS2WASHANDLED == 0 ) ]]
then
DONE2FSES+=$SEARCH2FS$'\n'
echo "$SEARCH1TARGET$SEARCH2FSROOT --> $SEARCH2TARGET"
fi
done < <(echo "$FSES")
fi
done < <(echo "$FSES")
Jest to podobne do innej odpowiedzi findmnt, ale pozwala uniknąć problemu z formatowaniem.
Aby wyświetlić wszystkie submounty:
findmnt --kernel -n --list | grep '\['
Aby wyświetlić wszystkie podzbiory systemów plików typu ext4:
findmnt --kernel -t ext4 -n --list | grep '\['
Aby wyświetlić wszystkie wierzchowce z wyłączeniem podrzędnych:
findmnt --kernel -n --list | grep -v '\['
Aby wyświetlić wszystkie podłączenia systemów plików typu ext4 z wyłączeniem podliczeń:
findmnt --kernel -t ext4 -n --list | grep -v '\['
„-N” usuwa nagłówki, a „--list” usuwa wiersze formatu „drzewa”.
Testowane na odcinku Debian.
findmnt | fgrep [
jak wyjaśniono tutaj .