Antworten:
Bindungsbereitstellungen sind weder ein Dateisystemtyp noch ein Parameter eines bereitgestellten Dateisystems. Sie sind Parameter einer Mount- Operation . Soweit mir bekannt ist, führen die folgenden Befehlsfolgen zu im Wesentlichen identischen Systemzuständen für den Kernel:
mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one
Die einzige Möglichkeit, sich daran zu erinnern, welche Mounts Bind-Mounts waren, ist das Protokoll der mount
Befehle, die in verbleiben /etc/mtab
. Ein Bind-Mount-Vorgang wird durch die bind
Mount- Option angezeigt (wodurch der Dateisystemtyp ignoriert wird). Es mount
gibt jedoch keine Option, nur Dateisysteme aufzulisten, die mit einem bestimmten Optionssatz gemountet sind. Daher müssen Sie Ihre eigene Filterung durchführen.
mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'
Beachten Sie, dass dies /etc/mtab
nur sinnvoll ist, wenn es sich um eine Textdatei handelt, die von verwaltet wird mount
. Einige Distributionen wurden stattdessen /etc/mtab
als symbolische Verknüpfung zu eingerichtet /proc/mounts
. /proc/mounts
ist größtenteils äquivalent zu /etc/mtab
, weist jedoch einige Unterschiede auf, von denen einer Bindungs-Mounts nicht verfolgt.
Eine Information, die vom Kernel beibehalten, aber nicht in angezeigt wird /proc/mounts
, ist, wenn ein Mount-Punkt nur einen Teil der Verzeichnisstruktur auf dem angehängten Dateisystem anzeigt. In der Praxis passiert dies meistens mit Bindemounts:
mount --bind /mnt/one/sub /mnt/partial
In /proc/mounts
haben die Einträge für /mnt/one
und /mnt/partial
dasselbe Gerät, denselben Dateisystemtyp und dieselben Optionen. Die Informationen, die /mnt/partial
nur den Teil des Dateisystems anzeigen, auf dem sich das Stammverzeichnis /sub
befindet, werden in den prozessbezogenen Mountpunktinformationen in angezeigt/proc/$pid/mountinfo
(Spalte 4) . Einträge dort sehen so aus:
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
zeichnen Sie bind
Informationen auf /etc/mtab
? Ich verwende Version 2.20.1 und habe mir die neuesten Quellen angesehen. In keinem Fall sehe ich Bindungsinformationen, die irgendwo aufgezeichnet wurden, nach denen Sie suchen könnten bind
. Auf der anderen Seite listet das, was ich in meiner Antwort vorgeschlagen habe , Mount-Objekte auf, die sowohl mit --bind
als auch mit der bind
Option erstellt wurden .
</etc/mtab awk …
ist POSIX-kompatibel (ich vergesse, ob es in Bourne unterstützt wird). Bitte überprüfen Sie Ihre Fakten. Ich kann bestätigen, dass /etc/mtab
es die bind
Option für ein Dateisystem gibt, das mit mount --bind /source /target
Debian stable gemountet wurde (mount von util-linux-ng 2.17.2).
mount
und sehen /etc/mtab
. Sie verwenden Debian Stable mit der älteren Version von util-linux-ng. Ich verwende Debian-Tests, die eine neuere Version haben, die nicht mehr das gleiche /etc/mtab
Verhalten zu haben scheint. Vielleicht hat @rozcietrzewiacz deshalb nicht bind
in gesehen, /etc/mtab
ob seine Distribution auch eine neuere Version verwendet?
findmnt
als Antwort posten . Dies funktioniert übrigens nur, wenn das Zielverzeichnis kein anderer Mount-Punkt ist. Versuchen Sie zum Beispielsudo mount --bind / foo && findmnt | grep foo
Vielleicht könnte dies den Trick machen:
findmnt | grep "\["
Beispiel:
$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep "\["
│ └─/tmp/foo /dev/sda2[/media] ext4 rw,relatime,data=ordered
/
sich zum Beispiel um eine Bindung handelt, hat die Ausgabe kein [...]
.
Der Kernel handhabt keine Bindungs-Reittiere, die sich von normalen Reittieren unterscheiden . Die unterscheiden sich nur darin, was beim Laufen passiert mount
.
Wenn Sie ein Dateisystem mounten (zB mit mount -t ext4 /dev/sda1 /mnt
), führt der Kernel (etwas vereinfacht) drei Schritte aus:
-t
oder verwenden, wird -t auto
mount
der Typ erraten und der erratene Typ dem Kernel bereitgestellt).nodev
Dies ist beispielsweise eine Option auf dem Mountpoint und nicht auf dem Dateisystem. Sie können einen Bind-Mount mit nodev
und einen ohne haben.)Wenn Sie ein Bind-Mount durchführen (z. B. mit mount --bind /a /b
), geschieht Folgendes:
(Ich werde überspringen mount --move
, weil es für die Frage nicht relevant ist.)
Dies ähnelt der Erstellung von Dateien unter Linux:
Wenn Sie einen festen Link erstellen, geschieht Folgendes:
Wie Sie sehen können, sind die erstellte Datei und der feste Link nicht zu unterscheiden:
$ 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
Da Sie jedoch alle Hardlinks zu einer Datei durch Vergleichen der Inode-Nummern identifizieren können, können Sie alle Bereitstellungen zu einem Dateisystem durch Vergleichen der Major: Minor-Nummern von Bereitstellungen identifizieren.
Sie können dies mit findmnt -o TARGET,MAJ:MIN
oder direkt über tun /proc/self/mountinfo
( weitere Informationen finden Sie in der Dokumentation zum Linux-Kernel ).
Das folgende Python-Skript listet alle Bindungsbereitstellungen auf. Es wird davon ausgegangen, dass der älteste Einhängepunkt mit dem kürzesten relativen Pfad zum Stammverzeichnis des eingebundenen Dateisystems der ursprüngliche Einhängepunkt ist.
#!/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")
Dies ähnelt der anderen Antwort, vermeidet jedoch das Formatierungsproblem.
So zeigen Sie alle Submounts an:
findmnt --kernel -n --list | grep '\['
So zeigen Sie alle Submounts von Dateisystemen des Typs ext4 an:
findmnt --kernel -t ext4 -n --list | grep '\['
So zeigen Sie alle Reittiere ohne Submounts an:
findmnt --kernel -n --list | grep -v '\['
So zeigen Sie alle Mounts von Dateisystemen des Typs ext4 mit Ausnahme von Submounts an:
findmnt --kernel -t ext4 -n --list | grep -v '\['
Das "-n" entfernt die Überschriften und die "--list" entfernt die Zeilen des "tree" -Formats.
Auf Debian-Stretch getestet.
findmnt | fgrep [
wie hier erklärt tun .