はじめに
僕は出会ったことはないのですが、 「too many levels of symbolic links」 というエラーメッセージに遭遇したという話を聞いて再現方法を調べてみました。
検証環境
1
2
3
4
5
| $ uname -moi
x86_64 MacBookPro11,4 Darwin
$ bash -version | head -n 1
GNU bash, バージョン 5.0.16(1)-release (x86_64-apple-darwin18.7.0)
|
エラーを再現させてみる
早速再現させてみます。
通常はこんなことは起きないとは思いますが、 自分自身を参照するシンボリックリンク hoge を作成します。
1
2
3
4
5
| $ ln -s hoge hoge
$ ls -l
total 0
lrwxrwxrwx 1 root root 4 Apr 7 14:33 hoge -> hoge
|
このシンボリックリンク hoge をフォルダとみなして、 hoge/x というファイルを作成してみます。
1
2
| $ touch hoge/x
touch: cannot touch 'hoge/x': Too many levels of symbolic links
|
エラーが再現しました。
touch コマンドでなくても同じエラーメッセージが発生します。
1
2
3
4
5
| $ echo test > hoge/y
bash: hoge/y: Too many levels of symbolic links
$ mkdir hoge/z
mkdir: cannot create directory 'hoge/z': Too many levels of symbolic links
|
原因の多くは「循環したシンボリックリンク」
こちらのエラーメッセージは、シンボリックリンクが何重にも渡って作られた場合に発生します。
多くの場合、シンボリックリンクの循環が原因です。
先の例では、 hoge シンボリックリンクは自分自身を参照している形になりますが、このようなシンボリックリンクに対してファイル(ディレクトリもLinuxではファイルです)を作成しようとした場合にエラーが発生します。
以下のような三すくみ状態のシンボリックリンクでもエラーは発生します。
1
2
3
4
5
6
7
8
| $ ln -s a b
$ ln -s b c
$ ln -s c a
$ touch a/test
touch: cannot touch 'a/test': Too many levels of symbolic links
|
シンボリックリンクは何重まで作ることができる?
シンボリックリンクは何重まで作ることができるでしょう?
実験してみます。
0/ というディレクトリを作成- このディレクトリに対して
1 というシンボリックリンクを作成 - シンボリックリンク
1 経由でファイルを作成してみる - このシンボリックリンクに対して
2 というシンボリックリンクを作成 - シンボリックリンク
2 経由でファイルを作成してみる - このシンボリックリンクに対して、
3 … (省略)
1
2
3
4
5
6
7
8
9
10
11
| $ mkdir 0
$ ls
0
$ for i in {1..45}; do ln -s $((i-1)) $i; touch $i/test.txt; done
touch: cannot touch '41/test.txt': Too many levels of symbolic links
touch: cannot touch '42/test.txt': Too many levels of symbolic links
touch: cannot touch '43/test.txt': Too many levels of symbolic links
touch: cannot touch '44/test.txt': Too many levels of symbolic links
touch: cannot touch '45/test.txt': Too many levels of symbolic links
|
このように、 41階層のシンボリックリンクからはエラーが発生するようになりました 。
シンボリックリンクの連鎖は、 40階層までにとどめましょう !
(40シンボリックリンクの数珠つなぎなんてたどりたくないですよね。。。)
ひとこと
「too many levels of symbolic links」 というエラーメッセージにお困りの場合に参考になれば幸いです。