pwd: show mountpoint

4

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)?

    
por Vincent 05.09.2012 / 11:16

5 respostas

3

Acho que você está procurando por mount -l .

    
por 05.09.2012 / 12:02
2

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:

  • Se /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. >
  • O programa mount registra suas ações em /etc/mtab .

O comando df/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
    
por 06.09.2012 / 22:49
1

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);
}
    
por 05.09.2012 / 12:13
1

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
    
por 07.11.2018 / 21:40
0

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');
    
por 07.11.2018 / 21:25