Forçosamente crie link (s) rígido (s) por diretório?

3

Eu entendo o raciocínio porque quase todas as versões unix não permitem hard-linking de diretórios (na verdade, o HFS + no OS X é o único que eu conheço, mas mesmo isso não é fácil de fazer você mesmo). No entanto, todos os sistemas de arquivos, em teoria, suportam diretórios com hard-link, já que todos os diretórios contêm pelo menos um link extra para si mesmo, além de hard-links extras em subdiretórios apontando para seus pais.

Agora, percebo que a vinculação rígida pode ser perigosa se usada incorretamente, pois pode criar estruturas cíclicas que poucos programas verificarão e, assim, ficar presas em um loop infinito. No entanto, eu esperava usar hard-links para criar um backup no estilo Time Machine que funcionasse para qualquer unix. Não acredito que esse tipo de estrutura seja perigoso, pois os links simplesmente apontam para backups anteriores; não deve haver risco de ligação cíclica. No meu caso, atualmente estou usando apenas o rsync para criar hard-links para arquivos existentes, mas isso é lento e desperdiçador, especialmente com backups muito grandes e especialmente se eu já souber quais diretórios estão inalterados.

Com isso em mente, existe alguma maneira de forçar a criação de hard-links de diretório em variantes unix? ln provavelmente não é bom, pois este é o lugar que muitos sabores do Unix colocam suas restrições para evitar diretórios hard-linking, e ln versões que suportam diretórios hard-linked declaram especificamente que a operação provavelmente falhará. Mas para alguém que conhece os riscos e sabe que seu caso de uso é seguro, existe alguma maneira de realmente criar o link? Idealmente para um script de shell, mas se eu precisar compilar um pequeno programa para fazer isso, suponho que eu poderia.

    
por Haravikk 09.05.2013 / 15:01

4 respostas

3

Não faça isso. Se você quiser ter um sistema de backup usando hard links para economizar espaço, é melhor usar o rsync com --link-dest , que ligará os arquivos adequadamente para economizar espaço, sem causar os problemas que isso causa (que Isto é, a vinculação difícil entre diretórios é uma corrupção do sistema de arquivos, e fará com que ele relate contagens incorretas de inode + falha fsck + geralmente tem semântica desconhecida devido a não ser um DAG).

    
por 09.05.2013 / 15:06
2

Se você não conseguir usar debugfs interativamente, poderá canalizar para ele e usar sed para remover o comando prompt e echoed-back de sua saída.

echo 'link /foo /bar' | debugfs -w [device] | sed '$s/debugfs:  $//' | sed '1d'
    
por 09.05.2013 / 15:29
1

Você pode usar debugfs para fazer isso. Com o sistema de arquivos não montado, faça debugfs -w /dev/device_name . Em seguida, no prompt debugfs, use o comando link da mesma forma que usaria ln se os links físicos para os diretórios fossem normalmente possíveis. (por exemplo, link /original_dir /new_link ) O comando link em debugfs, diferente de ln e da chamada de sistema link , permite que links físicos para diretórios sejam criados. Assim que estiver pronto, basta digitar quit .

No entanto, como outras pessoas mencionaram, NÃO realmente faz isso. Isso causará problemas. Só estou dizendo isso porque você perguntou como forçar a criação de um link rígido de diretório, e é assim que você faz isso.

    
por 03.01.2017 / 03:49
0

Diretórios nunca devem ter links extras para eles. Claro, você pode criá-los, mas isso é uma corrupção séria do sistema de arquivos.

O motivo é que os diretórios devem sempre formar uma estrutura de árvore, caso contrário, é impossível percorrê-los adequadamente para limpar. Sim, vai funcionar bem por agora. Mas da próxima vez que você tiver que rodar o fsck (8) por algum motivo, ele provavelmente não fará o seu trabalho, ou na melhor das hipóteses apenas apagará um dos links espúrios.

Não, isso não é teoria. Um sistema Ultrix há muito tempo aqui tem alguns diretórios ligados por alguma falha. Limpar isso editando o filessytem não foi divertido.

    
por 09.05.2013 / 15:31