Réponses:
Les montages de liaison ne sont pas un type de système de fichiers, ni un paramètre d'un système de fichiers monté; ce sont les paramètres d'une opération de montage . Pour autant que je sache, les séquences de commandes suivantes conduisent à des états système essentiellement identiques en ce qui concerne le noyau:
mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one
Donc, la seule façon de se souvenir des montures qui étaient des montures de liaison est le journal des mount
commandes restantes /etc/mtab
. Une opération de montage de liaison est indiquée par l' option debind
montage (ce qui entraîne l'ignorance du type de système de fichiers). Mais n'a pas la possibilité de répertorier uniquement les systèmes de fichiers montés avec un ensemble particulier d'ensembles d'options. Par conséquent, vous devez effectuer votre propre filtrage.mount
mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'
Notez que cela /etc/mtab
n'est utile ici que s'il s'agit d'un fichier texte géré par mount
. Certaines distributions configurées à la place /etc/mtab
comme un lien symbolique /proc/mounts
; /proc/mounts
est principalement équivalent à, /etc/mtab
mais présente quelques différences, dont l'une ne suit pas les montages de liaison.
Une information qui est conservée par le noyau, mais non représentée dans /proc/mounts
, est lorsqu'un point de montage n'affiche qu'une partie de l'arborescence de répertoires sur le système de fichiers monté. En pratique, cela se produit principalement avec les montures de liaison:
mount --bind /mnt/one/sub /mnt/partial
Dans /proc/mounts
, les entrées pour /mnt/one
et /mnt/partial
ont le même périphérique, le même type de système de fichiers et les mêmes options. Les informations qui /mnt/partial
ne montrent que la partie du système de fichiers enracinée /sub
sont visibles dans les informations de point de montage par processus dans /proc/$pid/mountinfo
(colonne 4). Les entrées ressemblent à ceci:
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
utilisez-vous pour enregistrer des bind
informations /etc/mtab
? J'utilise la version 2.20.1 et j'ai regardé les dernières sources et dans aucun cas je ne vois des informations de liaison enregistrées n'importe où qui vous permettraient de rechercher bind
. D'un autre côté, ce que j'ai suggéré dans ma réponse consiste en fait à lister les montages créés avec --bind
et en utilisant l' bind
option .
</etc/mtab awk …
est compatible POSIX (j'oublie s'il est pris en charge dans Bourne). Veuillez vérifier vos faits. Je peux confirmer qu'il /etc/mtab
a l' bind
option pour un système de fichiers monté avec mount --bind /source /target
sur Debian stable (montage depuis util-linux-ng 2.17.2).
mount
et /etc/mtab
. Vous utilisez Debian stable qui a l'ancienne version d'util-linux-ng; J'utilise Debian testing qui a une version plus récente qui ne semble plus avoir le même /etc/mtab
comportement, ce qui est peut - être pourquoi @rozcietrzewiacz n'a pas vu bind
dans dans /etc/mtab
si sa distribution utilise également une version plus récente?
findmnt
comme réponse. Cela ne fonctionne que si le répertoire cible n'est pas un autre point de montage, soit dit en passant. Essayez par exemplesudo mount --bind / foo && findmnt | grep foo
Peut-être que cela pourrait faire l'affaire:
findmnt | grep "\["
Exemple:
$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep "\["
│ └─/tmp/foo /dev/sda2[/media] ext4 rw,relatime,data=ordered
/
lui-même est monté en bind, par exemple, la sortie n'a pas de [...]
.
Le noyau ne gère pas les montages de liaison différents des montages normaux après coup. Les seuls diffèrent dans ce qui se passe pendant les mount
courses.
Lorsque vous montez un système de fichiers (par exemple avec mount -t ext4 /dev/sda1 /mnt
), le noyau (un peu simplifié) effectue trois étapes:
-t
ou utilisez -t auto
mount
devine le type pour vous et fournit le type deviné au noyau)nodev
par exemple, est une option sur le point de montage, pas sur le système de fichiers. Vous pouvez avoir un montage de liaison avec nodev
et un sans)Si vous effectuez un montage de liaison (par exemple avec mount --bind /a /b
), les événements suivants se produisent:
(Je vais sauter mount --move
, car ce n'est pas pertinent pour la question.)
Cela ressemble beaucoup à la façon dont les fichiers sont créés sous Linux:
Si vous créez un lien dur, les événements suivants se produisent:
Comme vous pouvez le voir, le fichier créé et le lien dur sont indiscernables:
$ 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
Mais , comme vous pouvez identifier tous les liens physiques vers un fichier en comparant les numéros d'inode, vous pouvez identifier tous les montages sur un système de fichiers en comparant les principaux: les nombres mineurs de montages.
Vous pouvez le faire avec findmnt -o TARGET,MAJ:MIN
ou en consultant directement /proc/self/mountinfo
( voir la documentation du noyau Linux pour plus d'informations ).
Le script Python suivant répertorie tous les montages de liaison. Il suppose que le point de montage le plus ancien avec le chemin relatif le plus court vers la racine du système de fichiers monté est le montage d'origine.
#!/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")
Ceci est similaire à l'autre réponse findmnt, mais évite le problème de formatage.
Pour afficher tous les sous-montages:
findmnt --kernel -n --list | grep '\['
Pour afficher tous les sous-systèmes de fichiers de type ext4:
findmnt --kernel -t ext4 -n --list | grep '\['
Pour afficher tous les montages à l'exception des sous-montages:
findmnt --kernel -n --list | grep -v '\['
Pour afficher tous les montages de systèmes de fichiers de type ext4 hors sous-montages:
findmnt --kernel -t ext4 -n --list | grep -v '\['
Le "-n" supprime les en-têtes et le "--list" supprime les lignes du format "arborescence".
Testé sur l'étirement Debian.
findmnt | fgrep [
comme expliqué ici .