NFSv4 Erro “Muitos níveis de links simbólicos”

6

Ambas as máquinas estão executando o Ubuntu 12.04

Cliente NFSv4 remoto

$ ls /mnt/storage/aaaaaaa_aaa/bbbb/cccc_ccccc gives this error:
ls: reading directory .: Too many levels of symbolic links

Como posso corrigir isso?

Quando ocorre um erro, ls começam a listar os arquivos, porém o PHP freia.

No servidor NFSv4

Em /etc/fstab :

/mnt/storage    /srv/storage    none    bind    0 0

Em /etc/exports

/srv         192.168.1.0/24(rw,async,insecure,no_subtree_check,crossmnt,fsid=0,no_root_squash)
/srv/storage   192.168.1.0/24(rw,async,nohide,insecure,no_subtree_check,no_root_squash)

ERRO

root@ds:root@ds:/mnt/storage/foreign_dbs/imdb/imdb_htmls# ls -l | head
ls: reading directory .: Too many levels of symbolic links
total 10302840
-rw-r--r-- 1 root root  10484 Jul  5 13:56 0019038.gz
-rw-r--r-- 1 root root  16264 Mar 30 00:31 0259701.gz
-rw-r--r-- 1 root root  13784 Mar 30 14:20 1000000.gz
-rw-r--r-- 1 root root  12741 Mar 30 13:04 1000003.gz
-rw-r--r-- 1 root root  12794 Mar 30 12:40 1000004.gz
-rw-r--r-- 1 root root  13123 Mar 30 12:07 1000005.gz
-rw-r--r-- 1 root root  13183 Mar 30 12:04 1000006.gz
-rw-r--r-- 1 root root  13443 Jul  4 01:16 1000007.gz
-rw-r--r-- 1 root root  12968 Mar 30 11:05 1000008.gz

Eu me deparei com isso em PHP. o scandir retornaria 1612577.gz & 1612579.gz, mas ignora 1612578.gz e, no entanto, os tipos de arquivos e propriedades são idênticos neles

e isso só acontece no cliente nfs, funciona 100% no servidor

    
por user1434058 07.07.2012 / 00:51

2 respostas

4

Sobre o problema

Você pode ter um problema em que dois ou mais arquivos tenham o mesmo cookie readdir.

Esse problema é mais comum quando se usa um sistema de arquivos NFS (v3 ou v4) em um backend EXT4 e com muitos arquivos no mesmo diretório (mais de 50000). O problema também pode ocorrer ao usar o GlusterFS em vez do NFS.

PS: Esse problema pode ocorrer também com poucos arquivos dentro de um único diretório, mas este último caso é muito improvável.

Nesse caso, você verá Too many levels of symbolic links erros, mesmo que não tenha nenhum link simbólico em seu diretório. Você pode provar isso verificando que o seguinte comando não retorna nenhuma saída:

find /mnt/storage/aaaaaaa_aaa/bbbb/cccc_ccccc -type l

Para verificar se você está enfrentando esse problema específico, execute o comando acima:

$ ls /mnt/storage/aaaaaaa_aaa/bbbb/cccc_ccccc >/dev/null
ls: reading directory .: Too many levels of symbolic links

Depois, verifique seu syslog ( /var/log/syslog ) para entradas como:

[400000.200000] NFS: directory /mnt/storage/aaaaaaa_aaa/bbbb/cccc_ccccc
contains a readdir loop. Please contact your server vendor.
The file: DDDDDDDDDD has duplicate cookie COOKIE_NUMBER.

O problema está relacionado à função readdir da API readdir, que usa o cookie readdir para localizar rapidamente um arquivo dentro de um diretório. O servidor NFS usa essa API durante a comunicação com back-ends do EXT4.

Uma explicação completa e excelente sobre o problema de cookie duplicado (na verdade, um problema de colisão de hash) pode ser encontrada em Ampliando o cookie readdir () do ext4 .

Um relatório de bug relacionado pode ser encontrado em cliente NFS reporta um 'loop readdir' com um corrompido nome .

Se você puder reinicializar seu sistema, a boa notícia é que, de acordo com David Hedberg , este problema já está resolvido em versões mais recentes do kernel do Ubuntu (> = 3.2.0-60-generic). Você pode precisar atualizar seu servidor NFS também (a solução só funciona se o servidor NFS e o Kernel forem atualizados).

PS: Se você realmente adora sistemas operacionais, pode verificar os patches do kernel / nfs em link .

Solução

Atualize seu kernel e servidor de kernel NFS e reinicie o sistema:

apt-get -y dist-upgrade
reboot

Se você não puder reinicializar o sistema, também poderá detectar o arquivo com o cookie readdir duplicado (verifique seu syslog) e mova-o para outro diretório (ou renomeie-o para alterar seu cookie / hash).

    
por 11.06.2015 / 00:29
2

Em algum lugar você tem um link simbólico que aponta de volta para seu pai. Use isso para encontrá-lo:

find /mnt/storage -type l -exec ls -l {} \;

Depois disso, talvez você possa descobrir como corrigi-lo.

    
por 07.07.2012 / 01:16