기술 · 실용 가이드
Linux “Too many levels of symbolic links”? 삭제 전에 전체 경로를 추적하세요
원래 caller와 pathname을 고정하고 링크를 숨기지 않은 채 component별로 조사한 뒤 증명된 loop 또는 과도한 깊이만 고칩니다.

“Too many levels of symbolic links”는 pathname 해석 결과이지 표시된 path를 삭제해도 된다는 뜻이 아닙니다. 직접 self-link, 더 긴 cycle, 또는 traversal limit을 넘은 유효 chain일 수 있습니다.
안전한 대응은 원래 failing caller에서 path chain을 감사하는 것입니다. 저장 target을 보존하고 첫 repeated transition을 찾아 한 곳만 고친 뒤 원래 작업을 다시 검증합니다.
원래 caller와 전체 pathname을 고정하세요
전체 오류, 명령, 사용자, 작업 디렉터리, PATH, 정확한 pathname을 보존하고 host shell, service, chroot, container, mount namespace 중 어디인지 기록합니다. 다른 환경의 성공은 동등한 증거가 아닙니다.
rm, rm -r, ln -sf로 시작하지 마세요. directory entry와 각 symlink의 저장 target부터 보존합니다. trailing slash와 PATH lookup은 kernel이 해석하는 component를 바꿀 수 있습니다.
링크를 숨기지 말고 component별로 추적하세요
정확한 path에 namei -l을 실행해 각 component의 type, owner, target을 기록합니다. 의심 지점은 dereference하지 않는 lstat/stat와 readlink로 확인하고 relative target은 링크의 부모 directory 기준으로 풉니다.
이미 본 component 또는 inode로 돌아가는 첫 transition을 표시합니다. A→A self-loop와 A→B→C→A cycle을 구분하고 부모 directory와 namespace도 원장에 남깁니다.
ELOOP 분기를 분류하세요
Linux는 한 pathname에서 40개가 넘는 symlink를 따라가도 ELOOP를 반환하므로 cycle이 없는 긴 chain도 실패합니다. 반복인지 단순 초과인지 증명하고 깊은 chain 단축과 cycle 제거를 구분합니다.
여러 명령이 실패하면 PATH의 각 directory를 독립 pathname으로 검사합니다. service나 container만 실패하면 root, mount, working directory를 host와 비교합니다.
증명된 transition만 고치세요
잘못된 link가 확인되면 이전 target을 기록하고 그 entry만 올바른 relative 또는 absolute target으로 바꿉니다. 모호한 link path에 rm -r을 쓰지 말고 link, directory, mount boundary 중 무엇인지 먼저 증명합니다.
유효하지만 너무 깊은 chain은 최종 object를 유지하며 줄입니다. PATH는 looping component만, namespace 차이는 정상 host link가 아니라 mount/deployment view를 수정합니다.
원래 caller로 acceptance를 재현하세요
namei -l을 다시 실행해 의도한 object에서 끝나고 반복 transition과 한도 초과가 없는지 확인한 뒤 같은 user, working directory, namespace에서 원래 명령을 재실행합니다.
구조와 caller 증거가 모두 필요합니다. chain이 올바르고 원래 작업이 성공하며 임시 우회, recursive deletion, 잘못된 target이 남지 않았는지 확인하고 전후 원장을 보존합니다.
