Estou usando o Ubuntu 12.04. Quando tento criar um link físico para qualquer diretório, ele falha. Eu posso criar links físicos para arquivos dentro dos limites do sistema de arquivos. Eu sei o motivo pelo qual não podemos criar links físicos 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 a razão por trás disso. É o mesmo para todas as distribuições GNU / Linux e tipos de Unix (BSD, Solaris, HP-UX, IBM AIX) ou apenas no Ubuntu ou Linux?
filesystem
directory
hard-link
Nischay
fonte
fonte
ln -F <src> <dst>
e pode funcionar. Certamente, costumava trabalhar para o superusuário em versões mais antigas do Unix. Alguém se lembra se isso era UCB ou System V? Sim, coisas ruins podem acontecer, mas geralmente não. Pelo que me lembro,rmdir
sabia não continuar excluindo um link físico passado. No entanto, os usuários podem ficar confusos e excluir as coisas por erro.rmdir
lidar com links físicos de uma maneira especial? Um link físico é apenas um link normal - mas é um link adicional. Não é fácil descobrir se existem links extras incomuns sem gravações extras.rmdir
podemos dizer se o diretório possui links de outros lugares. A remoção recursivarm -r
, deve ser codificada com cuidado, para garantir que funcione corretamente, mesmo que ocorram erros como "permissão negada". BTW, UCB = BSD, doh!ln -F
em diretórios e fazê-lo funcionar. Mas você não ousa excluir o diretório posteriormente por medo de corromper o sistema de arquivos.Respostas:
Os hardlinks de diretório quebram o sistema de arquivos de várias maneiras
Eles permitem criar loops
Um link físico para um diretório pode ser vinculado a um pai, criando um loop do sistema de arquivos. Por exemplo, esses comandos podem criar um loop com o link de retorno
l
:Um sistema de arquivos com um loop de diretório tem profundidade infinita:
Evitar um loop infinito ao atravessar uma estrutura de diretórios é um pouco difícil (embora, por exemplo, o POSIX exija
find
isso).Um sistema de arquivos com esse tipo de link físico não é mais uma árvore, porque uma árvore não deve, por definição, conter um loop.
Eles quebram a ambiguidade dos diretórios pai
Com um loop do sistema de arquivos, existem vários diretórios pai:
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
.Portanto, ele tem dois diretórios pai.
Eles multiplicam arquivos
Os arquivos são identificados por caminhos, após a resolução de links simbólicos. assim
são arquivos diferentes.
Existem infinitamente muitos outros caminhos do arquivo. Eles são os mesmos em termos de número de inodes, é 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 é filho nem pai de nenhuma profundidade. Nesse caso, um arquivo filho do link seria replicado para dois arquivos, identificados por dois caminhos.
Seu exemplo
Como os links flexíveis para diretórios funcionam então?
Um caminho que pode conter links flexíveis e até mesmo loops de diretório com links flexíveis geralmente é usado apenas para identificar e abrir um arquivo. Pode ser usado como um caminho linear normal.
Mas há outras situações em que os caminhos são usados para comparar arquivos. Nesse caso, os links simbólicos no caminho podem ser resolvidos primeiro, convertendo-os em uma representação mínima e comumente acordada, criando um caminho canônico :
Isso é possível porque todos os links flexíveis podem ser expandidos para caminhos sem o link. Depois de fazer isso com todos os links flexíveis em um caminho, o caminho restante faz parte de uma árvore, onde um caminho é sempre inequívoco.
O comando
readlink
pode resolver um caminho para seu caminho canônico:Links flexíveis são diferentes do que o sistema de arquivos usa
Um link flexível não pode causar todos os problemas porque é diferente dos links dentro do sistema de arquivos. Ele pode ser diferenciado dos links físicos e resolvido para um caminho sem links simbólicos, se necessário.
Em certo sentido, a adição de links simbólicos não altera a estrutura básica do sistema de arquivos - ela mantém, mas adiciona mais estrutura, como uma camada de aplicativo.
De
man readlink
:fonte
"Você geralmente não deve usar links físicos de qualquer maneira" é muito amplo. Você precisa entender a diferença entre links físicos e links simbólicos e usar cada um conforme apropriado. Cada um possui seu próprio conjunto de vantagens e desvantagens:
Os links simbólicos podem:
Os links físicos podem:
Os links físicos são especialmente úteis na execução de aplicativos "copiar na gravação". Eles permitem que você mantenha uma cópia de backup de uma estrutura de diretórios, enquanto usa apenas espaço para os arquivos que mudam entre duas versões.
O comando
cp -al
é especialmente útil nesse sentido. Ele faz uma cópia completa de uma estrutura de diretórios, na qual todos os arquivos são representados por links físicos para os arquivos originais. Você pode então atualizar os arquivos na estrutura, e somente os arquivos que você atualizar ocuparão espaço adicional. Isso é especialmente útil ao manter backups multigeracionais.fonte
ln -s "Don't use this directory" README
é legítimo. De fato, se você pensar bem, um diretório pode ser usado como um banco de dados relacional e não conter nenhum arquivo real.Para sua informação, você pode obter o mesmo que links físicos para diretórios usando mount:
Isso é muito perigoso, porque a maioria das ferramentas e programas não terá conhecimento da ligação . Certa vez, fiz algo como no exemplo acima e depois continuei
rm -rf /home/user
. Felizmente, não havia nada relevante/var/www
.fonte
mount --bind <src> <dest>
. Use com cuidado para não limpar osrc
;)mount: unknown filesystem type 'bind'
mount -o bind src dest
rm -rf
problema. superuser.com/questions/320415/…A razão pela qual os diretórios de link físico não são permitidos é um pouco técnica. Essencialmente, eles quebram a estrutura do sistema de arquivos . Geralmente, você não deve usar links físicos de qualquer maneira. Links simbólicos permitem a maioria das mesmas funcionalidades sem causar problemas (por exemplo
ln -s target link
).fonte