Acho que você está procurando por mount -l
.
Eu montei um diretório para outro diretório usando mount --bind
para que um usuário sftp do meu servidor possa acessar esse diretório.
mount --bind /path/share /path/home/user/stuff
Eu coloquei isso em /etc/fstab
e está funcionando muito bem.
Se eu cd
no diretório montado e faço pwd
, parece que o diretório está fisicamente lá:
/path/home/user/stuff/share
Existe um comando que mostra onde o diretório 'original' está localizado
(assim como links simbólicos: quando você faz ls -fsl
você vê o caminho original)?
Sim, o diretório está lá, porque você o montou lá. mount --bind
diz ao kernel para usar uma montagem existente e anexá-la a outro ponto de montagem. Quanto ao kernel,
mount /dev/something /path/share
mount --bind /path/share /path/home/user/stuff
e
mount /dev/something /path/home/user/stuff
mount --bind /path/share /path/home/user/stuff
são a mesma coisa. Existem duas maneiras de distingui-las:
/path/share
não for um ponto de montagem (ou seja, ele faz parte de um sistema de arquivos maior montado em /path
ou /
), você poderá informar a montagem de ligação porque ela não está na raiz do sistema de arquivos. >
mount
registra suas ações em /etc/mtab
. O comando df
lê /etc/mtab
, portanto, se um diretório estiver em um sistema de arquivos montado com a opção bind
, você poderá ver qual era o caminho original com
df -P /path/to/file | awk 'NR==2 {print $1}'
(primeiro campo da segunda linha). Note que esta informação nem sempre é confiável, por exemplo, é possível que o sistema de arquivos original tenha sido desmontado e nada, ou qualquer outra coisa, esteja agora montado neste local, como em
mount /dev/something /path/share
mount --bind /path/share /path/home/user/stuff
unmount /dev/something
mount /dev/somethingelse /path/share
Eu verifiquei o código-fonte do df e fiz um script semelhante que encontrará o caminho original,
por exemplo, você vincula / tmp / a a / tmp / b,
E você inicia meu script com perl script.pl /tmp/b/what/ever/deep/inside
, você encontrará /tmp/a
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
sub findmnt
{
my $path = shift or die;
open my $fh, 'mount|' or die;
while (<$fh>)
{
return $1 if ($_ =~ qq{(.*) on $path type })
}
};
if ($#ARGV lt 0)
{
die 'Usage: ', $0, ' /path/to/dir', "\n";
}
my $mntpath = $ARGV[0];
while ($mntpath ne '/')
{
my $origpath = findmnt $mntpath;
if ($origpath ne '')
{
print 'Original path: ', $origpath, "\n";
last;
}
$mntpath = dirname ($mntpath);
}
No Linux, agora você pode usar findmnt
(de util-linux
) para isso:
~$ sudo mount --bind /usr/local mnt
~$ cd mnt/bin
~/mnt/bin$ pwd
/home/stephane/mnt/bin
~/mnt/bin$ findmnt -T .
TARGET SOURCE FSTYPE OPTIONS
/home/stephane/mnt /dev/mapper/VG-LV[/usr/local] ext4 rw,noatime,discard,errors=remount-ro,data=ordered
Com base na resposta da margarida, que tal ...
use strict;
use warnings;
use File::Basename;
my $mntpath = $ARGV[0] or die "Missing required parameter <pathname>\n";
$mntpath = dirname ($mntpath) while (! grep / on $mntpath type /, 'mount');
Tags mount bind-mount