「too many levels of symbolic links」というエラーメッセージについて

2023-02-15Bash,CentOS,Linux,Ubuntu

はじめに

僕は出会ったことはないのですが、 「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

シンボリックリンクは何重まで作ることができる?

シンボリックリンクは何重まで作ることができるでしょう?

実験してみます。

  1. 0/ というディレクトリを作成
  2. このディレクトリに対して 1 というシンボリックリンクを作成
  3. シンボリックリンク 1 経由でファイルを作成してみる
  4. このシンボリックリンクに対して 2 というシンボリックリンクを作成
  5. シンボリックリンク 2 経由でファイルを作成してみる
  6. このシンボリックリンクに対して、 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」 というエラーメッセージにお困りの場合に参考になれば幸いです。

2023-02-15Bash,CentOS,Linux,Ubuntu