web-dev-qa-db-ja.com

NFSv4「シンボリックリンクのレベルが多すぎます」エラー

両方のマシンでUbuntu 12.04が実行されています

リモートNFSv4クライアント

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

どうすれば修正できますか?

エラーが発生すると、lsはファイルのリストを開始しますが、PHPブレーキです。

NFSv4サーバー上

/etc/fstab

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

/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)

[〜#〜]エラー[〜#〜]

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

私はそれをPHPで見つけました。 scandirは1612577.gzと1612579.gzを返しますが、1612578.gzをスキップしますが、ファイルタイプとプロパティは同じです

これはnfsクライアントでのみ発生し、サーバーでは100%機能します

6
user1434058

問題について

2つ以上のファイルが同じreaddir Cookieを持っていると問題が発生する可能性があります。

この問題は、EXT4バックエンド上でNFSファイルシステム(v3またはv4)を使用し、同じディレクトリに多数のファイル(50000以上)がある場合により一般的です。 NFSの代わりにGlusterFSを使用するときにもこの問題が発生する可能性があります。

PS:この問題は、単一のディレクトリ内のファイルが少ない場合にも発生する可能性がありますが、この最後のケースは非常にありそうもありません。

この場合、Too many levels of symbolic linksエラーは、ディレクトリ内にシンボリックリンクがない場合でも発生します。これを証明するには、次のコマンドが出力を返さないことを確認します。

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

この特定の問題が発生しているかどうかを確認するには、上記のコマンドを実行します。

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

その後、syslog(/var/log/syslog)のようなエントリの場合:

[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.

この問題は、readdir Cookieを使用してディレクトリ内のファイルをすばやく見つけるreaddir APIのreaddir関数に関連しています。 NFSサーバーは、EXT4バックエンドとの通信中にこのAPIを使用します。

重複するCookieの問題(実際には、ハッシュの衝突の問題)に関する完全で優れた説明は、 Widening ext4のreaddir()Cookie にあります。

関連するバグレポートは NFSクライアントが破損した名前の「readdirループ」を報告する にあります。

システムを再起動できる場合、良いニュースは David Hedbergによると です。この問題は、新しいUbuntuカーネルバージョン(> = 3.2.0-60-generic)ですでに解決されています。 NFSサーバーも更新する必要がある場合があります(このソリューションは、NFSサーバーとカーネルの両方が更新されている場合にのみ機能します)。

PS:オペレーティングシステムが本当に好きな場合は、カーネル/ nfsパッチを http://comments.gmane.org- 32/64ビットllseekハッシュ

解決

カーネルとNFSカーネルサーバーを更新し、システムを再起動します。

apt-get -y dist-upgrade
reboot

システムを再起動できない場合は、readdir cookieが重複しているファイルを検出し(syslogを確認)、別のディレクトリに移動する(または名前を変更してcookie /ハッシュを変更する)こともできます。

4

どこかに、親を指すシンボリックリンクがあります。これを使用して検索します。

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

修正したら、おそらくそれを修正する方法を見つけることができます。

3
bahamat