Como posso deletar um hardlink para um diretório?

3

Antes de obter centenas de respostas que me dizem que é impossível vincular diretórios ao linux: sim, eu sei disso.

O arquivo em questão apareceu em lost + fount depois que eu verifiquei o sistema de arquivos com e2fsck (é um ext4) e de acordo com stat ele é / um arquivo com 2 hardlinks:

# stat --format="File \"%n\" is a %F with %h hardlinks" ./#30934353
File "./#30934353" is a directory with 2 hardlinks

Doh. Como posso seguramente excluí-los sem tocar nos arquivos incluídos? Eu tentei rm e unlink , ambos me disseram que o diretório não está vazio ...

    
por Markus 14.05.2013 / 08:20

1 resposta

3

Diretórios em sistemas de arquivos ext4 geralmente têm pelo menos 2 links. A entrada em seu diretório pai e a entrada . em si. Veja para mais detalhes.

Dito isto, se o sistema de arquivos é inconsistente, você pode muito bem ter um diretório ligado em mais de um lugar e a contagem de links para não refleti-lo.

Por exemplo, com debugfs -w (em um fs desmontado), você pode fazer link a/b c/d para forçar a criação de um link para um diretório. Você perceberá que a contagem de links não está atualizada (você precisaria de sif a/b links_count 3 para atualizá-lo):

$ ls -lid a/b c/d a/b/. c/d/.
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 a/b/
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 a/b/./
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 c/d/
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 c/d/./

A contagem de links é 2 acima, mesmo que haja 3 links (para a, para c, e o "." para si mesmo).

Observe que fsck relataria um problema com isso:

Pass 2: Checking directory structure
Entry 'd' in /c (1282) is a link to directory /a/b (12).
Clear<y>?

Portanto, é improvável que seja o seu caso aqui se o fs tiver acabado de passar por um fsck.

Para remover um desses links, você pode usar debugfs -w novamente (depois de ter desmontado o sistema de arquivos) e fazer unlink c/d nele, ou usar fsck . Se um directory tiver mais de um link, você poderá verificar a entrada .. dentro dele (com debugfs ls ) para verificar qual é o correto ( .. terá o mesmo número de inode que o correto pai).

    
por 14.05.2013 / 09:51