Há alguma desvantagem de usar mount -bind como um substituto para links simbólicos?

52

Links simbólicos têm limitações em como funções como ls , mv e cp podem operar neles porque, ao contrário dos comandos iniciados por shell como cd , essas funções não têm informações sobre como o usuário acessou o diretório com em relação ao caminho lógico (ver relacionado postar ). Parece que o uso da opção mount --bind pode obter uma solução alternativa, oferecendo maior funcionalidade e compatibilidade com o samba e outros servidores de arquivos, porque o diretório montado terá dois caminhos físicos independentes, em vez de um link.

Eu gostaria de substituir todos os meus links simbólicos por referências usando a opção mount --bind , mas isso significaria montar mais de 150 pontos no fstab. Há algum problema de desempenho que possa surgir desta ou de quaisquer outras desvantagens que eu deva considerar?

    
por mrtrujiyo 02.10.2012 / 00:02

4 respostas

59

Com mount --bind , existe uma árvore de diretórios em dois (ou mais) lugares na hierarquia de diretórios. Isso pode causar vários problemas. Os backups e outras cópias de arquivo selecionam todas as cópias. Torna-se difícil especificar que você deseja copiar um sistema de arquivos: você acabará copiando os arquivos montados na ligação duas vezes. Pesquisas com find , grep -r , locate , etc., percorrerão todas as cópias e assim por diante.

Você não ganhará nenhuma “funcionalidade e compatibilidade aprimoradas” com montagens de ligação. Eles se parecem com qualquer outro diretório, que na maioria das vezes não é um comportamento desejável. Por exemplo, o Samba expõe links simbólicos como diretórios por padrão; Não há nada a ganhar com o uso de uma montagem de ligação. Por outro lado, as montagens de ligação podem ser úteis para expor as hierarquias de diretório no NFS.

Você não terá problemas de desempenho com montagens de associação. O que você tem é dores de cabeça de administração. As montagens de ligação têm seus usos, como tornar uma árvore de diretórios acessível a partir de um chroot, ou expor um diretório oculto por um ponto de montagem (isso geralmente é um uso temporário enquanto uma estrutura de diretórios está sendo remodelada). Não os use se você não tiver necessidade.

Somente o root pode manipular montagens de ligação. Eles não podem ser movidos por meios comuns; eles bloqueiam sua localização e os diretórios ancestrais.

De um modo geral, se você passar um link simbólico para um comando, o comando atuará no próprio link, se ele operar nos arquivos, e no destino do link, se ele operar no conteúdo do arquivo. Isso vale para diretórios também. Isso geralmente é a coisa certa. Alguns comandos têm opções para tratar os links simbólicos de maneira diferente, por exemplo ls -L , cp -d , rsync -l . Seja o que for que você esteja tentando fazer, é muito mais provável que os links simbólicos sejam a ferramenta certa, do que ligar as montagens como a ferramenta certa.

    
por 02.10.2012 / 02:42
13

Além de o que @Gilles escreveu anteriormente, vale a pena notar que alguns utilitários podem considere que um diretório montado por ligação seja um sistema de arquivos separado. Isso pode ter implicações de desempenho ou funcionalidade se o programa não puder mais assumir que o mesmo número de inode se refere ao mesmo arquivo (o que não acontece, se eles estiverem em sistemas de arquivos diferentes), um movimento não pode ser otimizado como link-at- target-then-unlink-source, etc.

    
por 02.10.2012 / 14:11
5

Você também deve usar montagens de ligação em vez de links simbólicos quando estiver contando com um suporte que pode nem sempre estar no lugar (por exemplo, um disco externo) e desejar ter certeza de que a estrutura de diretórios original está em vigor se o suporte falhar ou for removido.

Por exemplo, se eu quiser manter o / var / tmp em um cartão SD, eu usarei o bind mount, já que alguns programas esperarão que o / var / tmp seja um diretório válido mesmo se o cartão for removido.

    
por 09.07.2013 / 22:35
1

Eu tentei montar o bind para solucionar um problema ao instalar alguns pacotes com pacman (archlinux, mais sobre isso aqui ) em um sistema em que /var (assim como /home e /usr/local ) eram symlinks (em todos os sistemas de arquivos: SSD para SATA).

Parecia ótimo no começo, mas, como Gilles destacou, locate sempre deu vários resultados para um único arquivo, apesar da PRUNE_BIND_MOUNTS = "yes" line em /etc/updatedb.conf .

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

Cavando um pouco mais, descobri que montagens de bind mais complexas podem ser removidas corretamente:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts
$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts
$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2
0 $ locate \*/mmedia /SHARED/LOCALS/Manjaro/common/mmedia /SHARED/LOCALS/common/mmedia /usr/local/common/mmedia $ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf
0 Rebuilding bind_mount_paths: Matching bind_mount_paths: Skipping '/SHARED/LOCALS/Manjaro/common': bind mount Skipping '/usr/local/common': bind mount $ locate \*/mmedia /SHARED/LOCALS/common/mmedia

Sem a opção PRUNE_BIND_MOUNT, eu teria obtido 3 resultados:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts
$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts%pre%0
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 
0 Rebuilding bind_mount_paths: Matching bind_mount_paths: Skipping '/SHARED/LOCALS/Manjaro/common': bind mount Skipping '/usr/local/common': bind mount $ locate \*/mmedia /SHARED/LOCALS/common/mmedia

Outro problema com montagens de ligação:

É claro, é possível adicionar manualmente montagens de ligação (ponto de acesso ou destino) para PRUNEPATHS em /etc/updatedb.conf .

Além disso, mountpoint e vários comandos ou funções stat podem ser usados em ferramentas para melhorar o percurso do sistema de arquivos como proposto aqui

    
por 03.12.2015 / 02:32

Tags