Por que os hard links não são permitidos para diretórios?

83

Estou usando o Ubuntu 12.04. Quando tento criar um link físico para qualquer diretório, ele falha. Eu posso criar hard links para arquivos dentro do limite do sistema de arquivos. Eu sei o motivo pelo qual não podemos criar hardlinks para arquivos além do sistema de arquivos.

Eu tentei estes comandos:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Eu só quero saber o motivo por trás disso. É o mesmo para todas as distribuições GNU / Linux e tipos Unix (BSD, Solaris, HP-UX, IBM AIX) ou apenas no Ubuntu ou Linux?

    
por Nischay 01.11.2012 / 22:18

4 respostas

73

"Você geralmente não deve usar links físicos de qualquer maneira" é muito abrangente. Você precisa entender a diferença entre links físicos e links simbólicos e usar cada um deles conforme apropriado. Cada um vem com seu próprio conjunto de vantagens e desvantagens:

Links simbólicos podem:

  • Aponte para diretórios
  • Apontar para objetos inexistentes
  • Aponte para arquivos e diretórios fora do mesmo sistema de arquivos

Links físicos podem:

  • Mantenha o arquivo que eles referenciam de ser excluído

Os hard links são especialmente úteis na execução de aplicativos "copy on write". Eles permitem que você mantenha uma cópia de backup de uma estrutura de diretório, enquanto usa apenas espaço para os arquivos que mudam entre duas versões.

O comando cp -al é especialmente útil nesse sentido. Faz uma cópia completa de uma estrutura de diretórios, onde todos os arquivos são representados por hard links para os arquivos originais. Você pode então continuar a atualizar os arquivos na estrutura e somente os arquivos que você atualizar ocuparão espaço adicional. Isso é especialmente útil ao manter backups multigeracionais.

    
por user133232 18.02.2013 / 16:06
111

Hardlinks de diretório quebram o sistema de arquivos de várias maneiras

Eles permitem que você crie loops

Um link físico para um diretório pode ser vinculado a um pai de si mesmo, o que cria um loop do sistema de arquivos. Por exemplo, esses comandos podem criar um loop com o link de retorno l :

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Um sistema de arquivos com um loop de diretório tem profundidade infinita:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Qualquer comando find sem o predicado -maxdepth será executado em um loop infinito. Isso significa que você não pode mais usar find , que é um comando importante, de maneira consistente. Semelhante para o comando locate igualmente importante.

Uma árvore, por definição, não tem loops, então o sistema de arquivos não é mais uma árvore.

Eles quebram a falta de ambigüidade dos diretórios pais

Com um loop de sistema de arquivos, existem vários diretórios pai:

cd /tmp/a/b
cd /tmp/a/b/l/b

No primeiro caso, /tmp/a é o diretório pai de /tmp/a/b .
No segundo caso, /tmp/a/b/l é o diretório pai de /tmp/a/b/l/b , que é o mesmo que /tmp/a/b .
Então tem dois diretórios pai.

Eles multiplicam arquivos

Os arquivos são identificados por caminhos, após a resolução de links simbólicos. Então

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

são arquivos diferentes.
Existem infinitamente muitos outros caminhos do arquivo. Eles são os mesmos em termos de seu número de inode, é claro. Mas se você não espera explicitamente loops, não há razão para verificar isso.

Um hardlink de diretório também pode apontar para um diretório filho ou um diretório que não seja filho nem pai de qualquer profundidade. Nesse caso, um arquivo que é filho do link seria replicado em dois arquivos, identificados por dois caminhos.

Seu exemplo

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Como links virtuais para diretórios podem funcionar?

Um caminho que pode conter softlinks e até mesmo loops de diretório vinculados é usado apenas para identificar e abrir um arquivo. Pode ser usado como um caminho normal e linear.

Mas há outras situações, quando os caminhos são usados para comparar arquivos. Nesse caso, os links simbólicos no caminho podem ser resolvidos primeiro, convertendo-os em uma mínima e uma representação comumente acordada criando um caminho canônico :

Isso é possível, porque os soft links podem ser expandidos para caminhos sem o link. Depois de fazer isso com todos os links flexíveis em um caminho, o caminho restante é parte de uma árvore, onde um caminho é sempre inequívoco.

O comando readlink pode resolver um caminho para seu caminho canônico:

$ readlink -f /some/symlinked/path

Links suaves são diferentes do que o sistema de arquivos usa

Um link não pode causar todos os problemas porque é diferente dos links dentro do sistema de arquivos. Ele pode ser distinguido de links físicos e resolvido para um caminho sem links simbólicos, se necessário.
De certa forma, adicionar links simbólicos não altera a estrutura básica do sistema de arquivos - ele mantém, mas adiciona mais estrutura como uma camada de aplicação.

Em man readlink :

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]
    
por Volker Siegel 17.09.2014 / 13:06
35

FYI, você pode conseguir o mesmo que hard links para diretórios usando mount:

mount -t bind /var/www /home/user/workspace/www

Isso é muito perigoso porque a maioria das ferramentas e programas não estão cientes da ligação . Uma vez fiz algo parecido com o exemplo acima e depois passei para rm -rf /home/user . Por sorte, não havia nada relevante em /var/www .

    
por stackount 07.11.2013 / 18:39
17

A razão pela qual os diretórios de hard-linking não são permitidos é um pouco técnica. Essencialmente, eles quebram a estrutura do sistema de arquivos . Você geralmente não deve usar hard links de qualquer maneira. Os links simbólicos permitem a maioria da mesma funcionalidade sem causar problemas (por exemplo, ln -s target link ).

    
por astex 01.11.2012 / 22:25