Technology · PRACTICAL GUIDE
Linux says “Too many levels of symbolic links”? Trace the path chain before removing anything
Capture the exact caller and pathname, walk every component without hiding the links, then repair only the first proven loop or over-deep transition.

“Too many levels of symbolic links” is a pathname-resolution verdict, not permission to delete the named path. The kernel may have found a direct self-link, a longer cycle or a valid chain that exceeds its traversal limit.
The safe response is a path-chain audit from the exact failing caller. Preserve the stored link targets, locate the first repeated transition, make one narrow repair and require the original operation to pass again.
Freeze the exact caller and pathname
Save the full error, command, user, working directory, environment PATH and exact pathname. Record whether the caller is a host shell, service, chroot, container or another mount namespace; a successful lookup elsewhere is not equivalent evidence.
Do not begin with rm, rm -r or ln -sf. First preserve the directory entries and the stored bytes of every symbolic link. A trailing slash or command lookup through PATH can change which component the kernel resolves.
Walk every component without hiding the link
Run namei -l on the exact path and record each component type, owner and target. For suspicious components, use lstat or stat without dereferencing and readlink to capture the stored target; resolve a relative target from the directory containing that link.
Mark the first transition that returns to an earlier component or inode. That distinguishes a direct self-link such as A → A from a multi-link cycle such as A → B → C → A. Keep the parent directory and namespace in the ledger.
Classify the ELOOP branch
Linux also returns ELOOP after following more than 40 symbolic links for a pathname, so a long but acyclic chain can fail. Prove whether the chain repeats or merely exceeds the traversal cap; shortening a deep chain is different from breaking a cycle.
If many commands fail, inspect every PATH directory as a pathname of its own. A single self-referential PATH component can make unrelated executables appear broken. If only a service or container fails, compare its root, mounts and working directory with the host.
Repair only the proven transition
For a confirmed bad link, record its old target, remove or replace that directory entry only, and point it to an existing intended object using the correct relative or absolute form. Never recursively remove an ambiguous link path; prove whether the entry is a link, directory or mount boundary first.
For an over-deep but valid chain, shorten the chain while preserving the intended final object. For a PATH defect, remove or correct only the looping PATH component. For a namespace mismatch, repair the mount or deployment view rather than rewriting a valid host link.
Replay the original acceptance test
Run namei -l again and confirm the path terminates at the intended object with no repeated transition and no chain beyond the supported limit. Then replay the original command from the same user, working directory and namespace.
Acceptance requires both structural and caller evidence: the chain is correct, the original operation succeeds, and no temporary bypass, recursive deletion or unintended target remains. Preserve the before-and-after ledger for rollback and review.
