Respostas:
Montagens de ligação não são do tipo sistema de arquivos nem parâmetro de um sistema de arquivos montado; eles são parâmetros de uma operação de montagem . Até onde eu sei, as seguintes seqüências de comandos levam a estados de sistema essencialmente idênticos no que diz respeito ao kernel:
mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one
Portanto, a única maneira de lembrar em que montagens eram montagens de ligação é o log de mount
comandos restantes /etc/mtab
. Uma operação de montagem de ligação é indicada pela opção debind
montagem (que faz com que o tipo de sistema de arquivos seja ignorado). Mas não tem opção para listar apenas sistemas de arquivos montados com um conjunto específico de conjuntos de opções. Portanto, você precisa fazer sua própria filtragem.mount
mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'
Observe que /etc/mtab
só é útil aqui se for um arquivo de texto mantido por mount
. Algumas distribuições são configuradas /etc/mtab
como um link simbólico /proc/mounts
; /proc/mounts
é basicamente equivalente a, /etc/mtab
mas possui algumas diferenças, uma das quais não está rastreando montagens de ligação.
Uma informação que é retida pelo kernel, mas não mostrada /proc/mounts
, é quando um ponto de montagem mostra apenas uma parte da árvore de diretórios no sistema de arquivos montado. Na prática, isso acontece principalmente com montagens de ligação:
mount --bind /mnt/one/sub /mnt/partial
Em /proc/mounts
, as entradas /mnt/one
e /mnt/partial
têm o mesmo dispositivo, o mesmo tipo de sistema de arquivos e as mesmas opções. As informações que /mnt/partial
mostram apenas a parte do sistema de arquivos enraizada /sub
são visíveis nas informações do ponto de montagem por processo em /proc/$pid/mountinfo
(coluna 4). As entradas são assim:
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
você está usando para registrar alguma bind
informação /etc/mtab
? Estou usando a versão 2.20.1 e procurei as fontes mais recentes e, em nenhum dos casos, vejo as informações de ligação registradas em qualquer lugar que permitam que você aguarde bind
. Por outro lado, o que sugeri na minha resposta , na verdade, lista montagens de ligação criadas com --bind
o uso da bind
opção .
</etc/mtab awk …
é compatível com POSIX (eu esqueço se é suportado no Bourne). Por favor, verifique seus fatos. Eu posso confirmar que /etc/mtab
tem a bind
opção para um sistema de arquivos montado mount --bind /source /target
no Debian stable (monte a partir do util-linux-ng 2.17.2).
mount
e /etc/mtab
. Você está usando o Debian stable, que possui a versão mais antiga do util-linux-ng; Eu estou usando testes Debian que tem uma versão mais recente que não parece ter o mesmo /etc/mtab
comportamento, o que é talvez por isso que @rozcietrzewiacz não viu bind
em em /etc/mtab
se sua distribuição também está usando uma versão mais recente?
findmnt
como resposta. Só funciona se o diretório de destino não for outro ponto de montagem, a propósito. Tente por exemplosudo mount --bind / foo && findmnt | grep foo
Talvez isso possa funcionar:
findmnt | grep "\["
Exemplo:
$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep "\["
│ └─/tmp/foo /dev/sda2[/media] ext4 rw,relatime,data=ordered
/
ele próprio estiver montado em ligação, por exemplo, a saída não possui a [...]
.
O kernel não suporta montagens de ligação diferentes das normais montagens após o fato. Os únicos diferem no que acontece durante a mount
execução.
Quando você monta um sistema de arquivos (por exemplo, com mount -t ext4 /dev/sda1 /mnt
), o kernel (um pouco simplificado) executa três etapas:
-t
ou usar-t auto
mount
adivinhar o tipo para você e fornecer o tipo de adivinhação ao kernel)nodev
por exemplo, é uma opção no ponto de montagem, não no sistema de arquivos. Você pode ter uma montagem de ligação com nodev
e uma sem)Se você executar uma montagem de ligação (por exemplo, com mount --bind /a /b
), acontece o seguinte:
(Eu vou pular mount --move
, porque não é relevante para a pergunta.)
Isso é semelhante à maneira como os arquivos são criados no Linux:
Se você criar um link físico, acontece o seguinte:
Como você pode ver, o arquivo criado e o link físico são indistinguíveis:
$ 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
Porém , como é possível identificar todos os hardlinks para um arquivo comparando os números de inode, você pode identificar todas as montagens em um sistema de arquivos comparando o principal: número menor de montagens.
Você pode fazer isso consultandofindmnt -o TARGET,MAJ:MIN
diretamente /proc/self/mountinfo
( consulte a documentação do kernel do Linux para obter mais informações). ).
O script Python a seguir lista todas as montagens de ligação. Ele pressupõe que o ponto de montagem mais antigo com o caminho relativo mais curto para a raiz do sistema de arquivos montado seja a montagem original.
#!/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")
Isso é semelhante à outra resposta findmnt, mas evita o problema de formatação.
Para mostrar todos os submounts:
findmnt --kernel -n --list | grep '\['
Para mostrar todos os submounts de sistemas de arquivos do tipo ext4:
findmnt --kernel -t ext4 -n --list | grep '\['
Para mostrar todas as montagens, excluindo submounts:
findmnt --kernel -n --list | grep -v '\['
Para mostrar todas as montagens de sistemas de arquivos do tipo ext4, excluindo submounts:
findmnt --kernel -t ext4 -n --list | grep -v '\['
O "-n" remove os cabeçalhos e o "--list" remove as linhas do formato "árvore".
Testado no Debian.
findmnt | fgrep [
o explicado aqui .