Existe algum sistema de arquivos para o qual 'ln -d' é bem sucedido?

10

Na página man do ln :

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

Existem drivers de sistema de arquivos que realmente permitem isso ou são a única opção mount --bind <src> <dest> ? Ou esse tipo de comportamento é bloqueado pelo kernel antes mesmo de chegar ao driver específico do sistema de arquivos?

NOTA: Na verdade, não estou planejando fazer isso em nenhuma máquina, apenas curioso.

    
por Parthian Shot 04.03.2016 / 21:09

2 respostas

6

Primeiro, uma nota: o comando ln não tem opções como -d , -F , --directory , este é um GNUism não portátil.

O recurso que você está procurando é implementado pelo comando link(1) .

Voltar à sua pergunta original:

Em um sistema UNIX típico, a decisão, se os links físicos em diretórios são possíveis, é feita no driver do sistema de arquivos.

O driver UFS do Solaris suporta links físicos em diretórios, o driver do ZFS não.

O motivo pelo qual o UFS no Solaris suporta links físicos é que a AT & T estava interessada neste recurso - o UFS do BSD não suporta diretórios de link físico.

O motivo pelo qual o ZFS não suporta diretórios com hardlink é que Jeff Bonwick não gosta desse recurso.

Em relação ao Linux, eu diria que o Linux bloqueia tentativas de criar hard links em diretórios nas camadas superiores do kernel. A razão para essa suposição é que Linus Torvalds escreveu o código para o GIT que fragmentou os diretórios quando git clone foi chamado como root em uma plataforma que suporta diretórios de hard link.

Observe que um sistema de arquivos que suporta a criação de diretórios com link físico também precisa suportar unlink(1) para remover diretórios não vazios como raiz.

Portanto, se assumirmos que Torvalds sabe como o Linux funciona e se o Linux suportava diretórios strongmente vinculados, Torvalds deveria saber que chamar unlink(2) em um diretório sendo root, não retornará com um erro, mas destruirá esse diretório. Em outras palavras, é improvável que o Linux permita que um driver de sistema de arquivos implemente diretórios vinculados.

    
por 05.03.2016 / 13:20
3

A pergunta do OP menciona mount --bind . Uma verificação rápida mostra que ele não modifica a contagem de links para o diretório que está montado. Hardlinking sempre modifica a contagem de links, que você pode ver usando ls -ld .

Normalmente (a maioria dos sistemas semelhantes a Unix), o número de hardlinks para um diretório será o número de diretórios conectados a esse nome, por exemplo,

  • ".." (o diretório pai)
  • "." (o próprio diretório)
  • subdiretórios

Se você ler a página (em geral) mais informativa informações , poderá descobrir como outros fizeram:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

embora atualmente esteja redigido

Most systems prohibit making a hard link to a directory; on those where it is allowed, only the super-user can do so (and with caution, since creating a cycle will cause problems to many other utilities). Hard links cannot cross file system boundaries. (These restrictions are not mandated by POSIX, however.)

Criar (e remover) hardlinks para um diretório é um recurso restrito para proteger contra a perda de arquivos se um diretório estiver desvinculado. Como as operações de link / unlink na interface do sistema operacional C são simétricas , a vinculação a diretórios é normalmente feita apenas em chamadas mkdir / rmdir.

Tenha em mente que muito dos GNU Coreutils foi escrito (e documentado) 20 a 30 anos atrás, quando algumas peças reais de museu ainda estavam em uso. Conforme observado em Em relação ao Hard Link , originalmente eram nenhuma chamada mkdir / rmdir ; diretórios foram criados (como uma operação privilegiada) usando hard links. Tudo isso desapareceu quando as chamadas do sistema foram adicionadas para resolver os problemas mencionados. Mas a documentação continua a se referir a esses sistemas além da memória de seus mantenedores. A opção que foi questionada estava no predecessor fileutils (que foi combinado com textutils e shellutils em meados dos anos 90 para formar coreutils ). Alguns itens do changelog podem ajudar a esclarecer a origem do recurso:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

Assim, você pode ver, por exemplo, que uma das antiguidades para as quais esse recurso era aplicável era o SunOS. O correspondente página de manual disse isto:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

Como observado na documentação, esse recurso (e a opção correspondente não estão em POSIX (e veja o Rationale seção que explica porquê). Em vez disso, o recurso foi movido para um novo comando (fornecido também pelo GNU coreutils) chamado link . A descrição do comando em si é vaga, você tem que ler a descrição do chamada de função para obter qualquer uso do padrão.No entanto, o padrão não esclarece as condições em que o comando funcionaria, além de levar adiante o isenção de responsabilidade sobre os privilégios necessários. Para isso, você precisa acessar recursos dependentes do sistema fora do padrão:

Linking to a directory is restricted to the superuser in most historical implementations because this capability may produce loops in the file hierarchy or otherwise corrupt the file system. This volume of POSIX.1-2008 continues that philosophy by prohibiting link() and unlink() from doing this. Other functions could do it if the implementor designed such an extension.

Existem sistemas que usam hardlinks para diretórios além do número normal (mais 2 subdiretórios).

O OSX usa vários hardlinks para diretórios para arquivos comuns . Ele não suporta isso usando ln (consulte página de manual ). De acordo com o Como a Máquina do Tempo trabalha sua mágica , ela faz isso para fornecer as versões usadas para o recurso de backup do Time Machine. p>

Leitura adicional:

por 05.03.2016 / 03:16