리눅스에서 심볼릭 링크는 매우 유용한 기능이지만, 때로는 대상 파일이나 디렉터리가 사라져서 무용지물이 될 수 있습니다. 이러한 손상된 심볼릭 링크를 찾아내고, 필요에 따라 시스템에서 제거하는 방법을 알아보겠습니다.
심볼릭 링크의 기본 개념
심볼릭 링크는 ‘소프트 링크’라고도 불리며, 파일이나 디렉터리를 가리키는 일종의 바로가기입니다. 파일 탐색기나 터미널에서 일반적인 파일 또는 디렉터리처럼 보이지만, 실제로는 다른 위치에 있는 파일이나 디렉터리를 참조하는 링크입니다. 심볼릭 링크가 가리키는 대상은 파일 시스템 트리의 어디에든 존재할 수 있습니다.
예를 들어, “dave-link”라는 심볼릭 링크가 사용자의 홈 디렉토리에 있고, 이것이 파일 시스템 다른 곳에 있는 “text-file.txt”라는 파일을 가리킨다고 가정해 봅시다. 심볼릭 링크를 통해 실행하는 모든 명령은 실제 대상 파일에 적용됩니다. 즉, “dave-link”에서 ‘cat’ 명령을 실행하면 “text-file.txt” 파일의 내용이 출력됩니다.
리눅스 시스템에는 기본적으로 많은 심볼릭 링크가 존재합니다. 운영체제 자체가 필요로 하기도 하고, 사용자가 직접 생성하지 않아도 소프트웨어 설치 과정에서 자동으로 생성되기도 합니다. 소프트웨어가 업데이트될 때, 실행 파일이 새로운 버전으로 교체되더라도 심볼릭 링크는 이전처럼 계속 작동합니다. 이는 새 파일이 이전 파일과 같은 이름을 가지기 때문입니다.
루트 디렉토리에서 ‘ls’ 명령을 사용하면 몇 가지 심볼릭 링크를 쉽게 확인할 수 있습니다. 링크는 다른 색상으로 표시되며, 예를 들어 Ubuntu 20.10에서는 밝은 파란색으로 나타납니다.
다음 명령을 입력하여 확인해 볼 수 있습니다:
ls /
‘ls -l’ 명령을 사용하면 더 자세한 정보를 확인할 수 있습니다. 다음 명령을 통해 모든 “lib” 항목과 “bin” 항목을 볼 수 있습니다:
ls -l /lib* /bin
각 줄의 시작 부분에 ‘l’은 해당 항목이 심볼릭 링크임을 나타냅니다. ‘->’ 뒤의 텍스트는 심볼릭 링크가 가리키는 위치를 보여줍니다. 위 예시에서는 대상들이 모두 디렉터리입니다.
권한은 소유자, 그룹, 기타 사용자에 대해 읽기, 쓰기, 실행 권한으로 나열되어 있습니다. 이 권한은 심볼릭 링크 자체에 대한 것이 아니라, 링크가 가리키는 실제 파일 또는 디렉터리의 권한을 반영합니다.
손상된 심볼릭 링크
심볼릭 링크가 가리키는 파일이 삭제되거나 다른 곳으로 옮겨지면 심볼릭 링크는 손상됩니다. 응용 프로그램 제거 과정에서 제대로 처리되지 않거나, 제거 작업이 중단되면 손상된 심볼릭 링크가 남을 수 있습니다.
또한, 사용자가 심볼릭 링크를 모른 채 대상 파일을 삭제하면 해당 링크는 더 이상 작동하지 않게 됩니다. 이는 마치 도시가 사라졌는데도 여전히 도로 표지판이 서 있는 것과 같습니다.
현재 디렉토리에 “hello”라는 심볼릭 링크를 만들어 이러한 동작을 쉽게 확인할 수 있습니다. 다음 명령을 입력합니다:
ls -l
이 링크가 “bin” 디렉터리에 있는 “htg”라는 프로그램을 가리킨다고 가정해 봅시다. 이제 심볼릭 링크를 “실행”하면 프로그램이 실행됩니다:
./hello
프로그램을 직접 실행하여 동일한 결과가 나오는지 확인할 수 있습니다:
../bin/htg
예상대로 동일한 결과를 얻을 수 있습니다. 이제 프로그램 파일을 삭제해 보겠습니다:
rm ../bin/htg
이제 심볼릭 링크를 확인하면, 리눅스 시스템에서 손상되었다는 의미로 빨간색으로 표시됩니다. 또한, 링크가 무엇을 가리켰는지 알려주므로, 파일을 다시 복구하거나 프로그램을 재컴파일하거나 링크를 수정하는 데 도움이 됩니다.
손상된 심볼릭 링크를 실행하려고 하면, 실제 프로그램 이름 대신 심볼릭 링크 이름을 참조하는 오류 메시지가 나타납니다.
다음 명령을 입력합니다:
./hello
손상된 심볼릭 링크 찾기
최신 버전의 find 명령에는 ‘xtype'(확장된 유형) 옵션이 있습니다. 이 옵션을 사용하면 손상된 심볼릭 링크를 쉽게 찾을 수 있습니다. 링크를 검색하려면 ‘xtype’과 함께 ‘l’ 플래그를 사용합니다. 다음 명령은 손상된 링크만 반환합니다.
find . -xtype l
테스트 환경에서 이 명령을 실행하면 여러 개의 손상된 심볼릭 링크가 발견됩니다. ‘find’ 명령은 재귀적으로 동작하므로 모든 하위 디렉터리를 자동으로 검색합니다.
의도적으로 손상시킨 “hello” 심볼릭 링크가 목록에 나타나는 것을 확인할 수 있습니다. 다른 심볼릭 링크 중 일부는 파이어폭스 브라우저와 관련되어 있고, 나머지는 snap과 관련된 것들입니다.
출력을 ‘wc’ 명령으로 파이프하고 ‘-l’ (lines) 옵션을 사용하면 손상된 심볼릭 링크의 개수를 쉽게 셀 수 있습니다:
find . -xtype l | wc -l
위의 예시에서는 24개의 손상된 심볼릭 링크가 있다는 것을 알 수 있습니다.
검토 및 제거
손상된 심볼릭 링크를 모두 삭제하기 전에 ‘find’ 명령의 결과를 먼저 검토해야 합니다. 혹시라도 손상된 심볼릭 링크에 타당한 이유가 있는지 확인해야 합니다.
때로는 대상 파일이 아니라 심볼릭 링크 자체가 문제일 수도 있습니다. 심볼릭 링크가 잘못 생성되어 대상을 가리키지 않지만, 실제 대상 파일은 존재할 수도 있습니다. 이 경우에는 심볼릭 링크를 다시 만드는 것이 해결 방법입니다.
또한, 파일 잠금 표시기와 같이 손상된 심볼릭 링크가 다른 용도로 사용될 수도 있습니다. 예를 들어, 파이어폭스는 이러한 방식을 사용합니다. 따라서, 손상된 링크를 무작정 삭제하기보다는, 먼저 검토하는 것이 중요합니다.
대상이 주기적으로만 존재하는 경우도 있으며, 이는 해당 소프트웨어의 의도된 동작일 수 있습니다. 대상 파일이 다른 시스템이나 클라우드에서 복사되어 기능을 수행한 후 다시 삭제되고, 다음 주기에서 다른 프로그램으로 대체될 수 있습니다.
손상된 심볼릭 링크는 실패한 소프트웨어 설치의 결과일 수도 있습니다. 이 경우에는 심볼릭 링크를 삭제하는 대신, 수동으로 수정하거나 재설치를 해야 합니다.
유지해야 할 손상된 링크를 수정했으면, 다시 검색 명령을 실행하여 수정된 링크가 결과에 나타나지 않는지 확인합니다.
안전을 위해, 심볼릭 링크 삭제는 사용자 디렉토리로 제한하는 것이 좋습니다. 루트 권한으로 명령을 실행하거나 시스템 디렉토리에서 실행할 때는 매우 주의해야 합니다.
손상된 심볼릭 링크 제거
‘find’ 명령의 ‘-exec’ 옵션을 사용하면 검색 결과에 대해 명령을 실행할 수 있습니다. ‘rm’ 명령을 사용하여 손상된 각 심볼릭 링크를 삭제할 수 있습니다. ‘{}’ 문자열은 ‘find’ 명령에서 발견된 각 링크 이름으로 대체됩니다.
‘-exec’가 실행할 명령 목록이 끝났음을 표시하려면 세미콜론 (;)을 사용해야 합니다. 세미콜론 앞에 백슬래시(\)를 사용하여 “이스케이프”합니다. 이렇게 하면 Bash가 이 기호를 처리하지 않고, find 명령의 일부로 처리합니다.
다음 명령을 입력합니다:
find . -xtype l -exec rm {} \;
명령이 성공적으로 실행되면 아무런 표시 없이 명령 프롬프트로 돌아갑니다. 이제 손상된 링크가 제거되었는지 확인하기 위해 검색 명령을 다시 실행합니다:
find . -xtype l
일치하는 결과가 없다면 손상된 심볼릭 링크가 성공적으로 제거되었음을 의미합니다.
삭제 전 검토의 중요성
다시 강조하지만, 삭제 명령을 실행하기 전에 항상 심볼릭 링크 목록을 검토해야 합니다. 명령 실행 범위를 적절한 디렉터리로 제한하여, 확실하지 않은 항목이 삭제되지 않도록 주의해야 합니다.
예를 들어, 위의 경우 “.snap” 디렉토리에서 명령을 실행하고, 그 후 “hello” 심볼릭 링크만 수동으로 삭제할 수 있습니다. 이렇게 하면 파이어폭스 잠금 심볼릭 링크는 그대로 유지할 수 있습니다.