기술 · 실용 가이드
“Too many levels of symbolic links”? 경로를 바꾸기 전에 반복 지점을 찾으세요
실제 순환과 40회를 넘는 깊은 체인을 구분하고 각 구성요소와 소유자를 확인해 잘못된 링크 하나만 교체합니다.

Linux는 한 번의 경로 해석에서 심볼릭 링크 한도를 넘으면 ELOOP, 즉 “Too many levels of symbolic links”를 반환합니다. 직접·간접 순환뿐 아니라 순환 없이 40회를 넘는 체인도 원인입니다. 오류만으로 첫 잘못된 구성요소를 알 수 없습니다.
실제 호출자, 작업 디렉터리와 해석 전 경로를 보존합니다. 대상을 삭제하지 말고 각 링크 문자열, 첫 반복 또는 과도한 깊이, 생성 소유자를 확인한 뒤 rollback과 exit test를 포함해 한 항목만 바꿉니다.
정확한 호출자와 실패 경로를 고정합니다
실패 명령, 오류, cwd, effective user, host/container, root/chroot, 전달된 경로를 그대로 저장합니다. 상대·절대 형태를 나누고 사람이 확장한 값으로 대체하지 않습니다.
shell, web server, service, package hook, deploy 중 어디서 실패했는지 기록합니다. 같은 문자열도 시작 디렉터리와 mount namespace가 다르면 결과가 달라집니다.
맹목적으로 따르지 말고 구성요소를 추적합니다
같은 view에서 namei -l -- "$path" 등으로 directory, link, 저장 target을 순서대로 기록합니다. 개별 링크에는 lstat, ls -ld, readlink --를 사용해 링크 자체를 봅니다.
readlink -f 하나만 첫 증거로 쓰지 않습니다. 실패 구성요소가 보이지 않을 수 있습니다. 상대 target은 링크가 있는 디렉터리 기준입니다.
순환, 깊이 또는 다른 경계를 증명합니다
trace에서 처음 반복되는 링크를 표시합니다. 자기 자신 또는 이전 링크로 돌아가면 순환입니다. 반복이 없으면 횟수를 세어 40회를 넘는 비순환 체인인지 확인합니다.
ELOOP와 ENOENT, ENOTDIR, EACCES를 구분합니다. 누락, 중간의 비디렉터리, 검색 권한 부족은 앱이 같은 메시지로 포장해도 다른 수리입니다.
교체 전에 링크 소유자를 찾습니다
package, configuration manager, framework command, container image, release switch, 수동 작업 중 누가 관리하는지 확인하고 inode, 시각, target, deploy 증거를 보존합니다. 원본을 고치지 않으면 링크가 재생성됩니다.
후보 target이 실패 호출자와 같은 root 및 mount namespace에서 존재하고 형식이 맞는지 확인합니다. 전체 tree chmod, target 삭제, 모든 상대 링크 절대화는 금지합니다.
한 항목을 교체하고 exit test를 요구합니다
같은 디렉터리에 새 이름으로 링크를 만들고 raw target을 확인한 뒤 경로 소유 deploy 방식으로 rename합니다. 이전 target과 rollback을 보존하고 release가 쓰는 중이면 중단합니다.
같은 user, cwd, root, namespace에서 namei와 원 작업을 반복합니다. 의도한 object에 도달하고 작업이 성공하며 다음 deploy에도 수정이 유지되어야 종료합니다.
