「too many levels of symbolic links」というエラーメッセージについて
はじめに
僕は出会ったことはないのですが、 「too many levels of symbolic links」 というエラーメッセージに遭遇したという話を聞いて再現方法を調べてみました。
検証環境
$ 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
を作成します。
$ ln -s hoge hoge
$ ls -l
total 0
lrwxrwxrwx 1 root root 4 Apr 7 14:33 hoge -> hoge
このシンボリックリンク hoge
をフォルダとみなして、 hoge/x
というファイルを作成してみます。
$ touch hoge/x
touch: cannot touch 'hoge/x': Too many levels of symbolic links
エラーが再現しました。
touch
コマンドでなくても同じエラーメッセージが発生します。
$ 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ではファイルです)を作成しようとした場合にエラーが発生します。
以下のような三すくみ状態のシンボリックリンクでもエラーは発生します。
$ 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
... (省略)
$ 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」 というエラーメッセージにお困りの場合に参考になれば幸いです。
ディスカッション
コメント一覧
どんなファイルシステムで40階層まで作れたことがわかったのですか。
> 鳴神裁四点一号
循環するシンボリックリンクを40個作られたということでしょうか?
他にも発生条件があるのかもしれませんね。
ご意見ありがとうございます!