科技 · 實用指南
出現「符號連結層級過多」?改路徑前先找出循環元件
區分真正循環與超過 40 次解析的過深鏈,逐元件追蹤、確認連結管理者,只替換已證明錯誤的入口。

Linux 在一次路徑解析超過符號連結上限時回傳 ELOOP,也就是「Too many levels of symbolic links」。直接或間接循環是一種原因;沒有循環但需要超過 40 次解析的鏈也是一種原因。錯誤不會指出第一個錯誤元件。
保留真實呼叫者、工作目錄與未解析路徑。不要刪除目標,先逐項記錄連結文字,判斷第一個重複或過深位置,確認誰產生連結,再以回復與退出測試只修改一個入口。
固定真實呼叫者與失敗路徑
原樣保存失敗命令、錯誤、目前工作目錄、有效使用者、主機或容器、根或 chroot,以及程式實際傳入的路徑。相對與絕對形式分開,不用人工展開值取代。
記錄錯誤來自 shell、Web 伺服器、服務、套件鉤子或部署流程。相同拼法可能從不同目錄或掛載命名空間開始,管理員測試成功仍未必重現應用查找。
不盲目跟隨地追蹤每個元件
在相同視圖使用 namei -l -- "$path" 等追蹤,依序保存目錄、連結與儲存目標。對個別連結使用 lstat、ls -ld 和 readlink --,檢視連結本身。
不要只把 readlink -f 當第一份證據:正規化失敗不一定指出元件。相對目標從連結所在目錄解讀,與操作員執行 ln 的目錄不同。
證明是循環、過深或其他邊界
標出追蹤中第一個重複入口。自指或回到早先連結的鏈是循環;沒有重複時要計數,無循環鏈超過 40 次解析也會回傳 ELOOP。
分開 ELOOP、ENOENT、ENOTDIR 與 EACCES。缺少元件、中間不是目錄或沒有搜尋權限需要不同修復,即使應用把它們包成同一訊息。
替換前確認連結管理者
確認錯誤入口由套件、組態管理、框架命令、容器映像、版本切換或人工管理。修改前保存 inode、時間、目標文字與部署證據;不修來源,連結會再出現。
確認建議目標在失敗呼叫者相同的根與掛載命名空間內存在且類型正確。不要 chmod 整棵樹、刪除目標目錄或一次把所有相對連結改成絕對連結。
只替換一個入口並完成退出測試
在同目錄以新名稱建立正確連結,核對目標,再用管理該路徑的部署方法重新命名到位。保留舊連結文字與回復命令;部署仍在寫入就停止。
用相同使用者、工作目錄、根與命名空間重跑 namei 和原操作。追蹤到預期物件、應用成功,且來源在下次部署仍保留修復,才算完成。
