심볼릭 링크
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
심볼릭 링크는 다른 파일이나 디렉토리를 가리키는 파일의 일종으로, POSIX 호환 운영 체제에서 `symlink` 시스템 호출을 통해 생성된다. 심볼릭 링크는 대상 파일에 대한 별칭 역할을 하며, `ln -s` 명령어를 통해 생성할 수 있다. 심볼릭 링크는 초기에는 대상 파일의 텍스트 참조를 저장하는 방식으로 구현되었으나, 성능 향상을 위해 대상 경로를 데이터 구조 내에 저장하는 '빠른 심볼릭 링크' 방식이 도입되었다. 윈도우는 심볼릭 링크, NTFS 정션, 바로 가기 등 다양한 링크 기능을 제공하며, Cygwin 환경에서도 POSIX 호환 심볼릭 링크를 시뮬레이션할 수 있다. 이 외에도 CTSS, Amiga, macOS, OS/2, BTRON 등 다양한 운영체제에서 심볼릭 링크와 유사한 기능을 제공하며, 심볼릭 링크는 가변적인 방식으로 구현되어 다양한 대상을 가리키도록 할 수 있다.
더 읽어볼만한 페이지
심볼릭 링크 | |
---|---|
파일 시스템 정보 | |
종류 | 파일 |
정의 | 다른 파일이나 디렉터리를 가리키는 파일 |
기능 | |
주 목적 | 파일 시스템 내에서 파일이나 디렉터리에 대한 간접적인 참조 제공 |
사용 | 원래 위치와 다른 위치에서 파일에 접근하거나, 여러 위치에서 동일한 파일을 참조하는 데 사용 |
종류 | |
유닉스 계열 | 심볼릭 링크 (soft link) |
윈도우 NT 계열 | 바로 가기 파일, 리파스 포인트를 이용한 심볼릭 링크 |
특징 | |
대상 | 다른 파일이나 디렉터리 |
동작 방식 | 링크를 열 때 대상 파일이나 디렉터리로 연결 |
삭제 | 링크 파일 자체를 삭제해도 원본 파일에는 영향 없음 |
원본 삭제 | 원본 파일이 삭제되면 링크는 깨짐 (broken link) |
장점 | |
유연성 | 파일 시스템의 물리적 구조에 독립적 |
공간 효율성 | 실제 파일 데이터를 복사하지 않으므로 디스크 공간 절약 |
관리 용이성 | 여러 위치에서 동일한 파일을 참조하고 관리 용이 |
단점 | |
깨진 링크 | 원본 파일 삭제 시 링크가 깨질 수 있음 |
성능 | 파일 접근 시 추가적인 탐색 과정 필요 |
보안 | 보안상의 취약점 발생 가능성 존재 |
예시 | |
유닉스 명령어 | ln -s [원본 파일] [링크 파일] |
윈도우 명령어 | mklink [링크 파일] [원본 파일] (관리자 권한 필요) |
2. POSIX 및 유닉스 계열 운영 체제
POSIX 호환 운영 체제에서는 `symlink`[6] 시스템 호출을 사용하여 심볼릭 링크를 만든다. ln 셸 명령어는 보통 하드 링크를 만드는 `link`[7] 시스템 호출을 사용하지만, `ln -s` 플래그를 사용하면 `symlink()` 시스템 호출을 통해 심볼릭 링크를 생성한다. 심볼릭 링크는 1982년 4.1a BSD 유닉스에서 U.C. 버클리에 의해 도입되었다.[8]
명령 줄 인터페이스(셸)에서 심볼릭 링크를 만드는 명령어는 다음과 같다.
ln -s target_path link_path
`target_path`는 심볼릭 링크가 가리킬 상대 또는 절대 경로이다. 보통 대상은 존재하지만, 존재하지 않는 대상을 가리키는 심볼릭 링크를 만들 수도 있다. `link_path`는 심볼릭 링크의 경로이다.
심볼릭 링크는 대상 파일이나 디렉터리의 별칭처럼 작동한다. `cp`, `rm` 등의 시스템 관리 명령을 심볼릭 링크에 사용할 수 있다. 읽기/쓰기 명령은 대상 파일의 내용에 접근하게 한다. 그러나 `rm` 명령은 대상 파일이 아닌 링크 자체를 제거한다.
ls에서 긴 디렉터리 보기 옵션(-l)을 사용하면 심볼릭 링크가 이름 뒤의 화살표와 함께 대상 파일을 가리키는 것을 볼 수 있다. 디렉터리를 가리키는 심볼릭 링크의 목록을 요청하면 링크 자체만 표시된다. 링크된 디렉터리 내용을 보려면 경로 뒤에 `/` 구분자를 추가해야 한다.
심볼릭 링크는 텍스트 문자열을 포함하며, 운영 체제에 의해 자동으로 해석되어 다른 파일이나 디렉터리로 가는 경로로 사용된다. 이 파일 또는 디렉터리를 "대상"이라고 한다. 심볼릭 링크는 대상과 독립적으로 존재하는 두 번째 파일이다. 심볼릭 링크가 삭제되어도 대상은 영향을 받지 않는다. 대상이 이동, 이름 변경 또는 삭제되면 심볼릭 링크는 자동으로 업데이트되지 않고, 이전 대상을 계속 가리키게 된다. 이러한 심볼릭 링크를 "끊어진", "고아", "죽은" 또는 "매달린" 심볼릭 링크라고 한다.
심볼릭 링크는 하드 링크와 다르다. 하드 링크는 다른 볼륨이나 파일 시스템의 경로를 연결할 수 없지만, 심볼릭 링크는 볼륨에 관계없이 모든 파일이나 디렉터리를 가리킬 수 있다. 하드 링크는 항상 기존 파일을 참조하지만, 심볼릭 링크는 존재하지 않는 경로를 포함할 수도 있다.
NEWS-OS(en)는 환경 변수나 커널 변수에 따라 심볼릭 링크의 대상을 자동으로 변경하는 'Conditional Symbolic Link' 기능을 가지고 있었다. 이 기능은 커널 내에 구현되었다.
2. 1. 심볼릭 링크의 저장 방식
초기 심볼릭 링크 구현 방식은 심볼릭 링크 정보를 일반 파일의 데이터로 저장했다. 이 파일은 링크 대상의 텍스트 참조를 포함하고, 파일 모드 비트를 통해 파일 유형이 심볼릭 링크임을 나타냈다.[5]이 방식은 느리고 작은 시스템에서 디스크 공간을 비효율적으로 사용했기 때문에, '''빠른 심볼릭 링크'''라는 개선된 방식이 등장했다. 빠른 심볼릭 링크는 대상 경로를 아이노드 내에 저장한다. 아이노드는 디스크에 파일 정보를 저장하는 데 사용되는 데이터 구조로, 일반적으로 파일에 할당된 디스크 블록 주소 목록을 저장한다. 따라서 대상 경로가 짧은 심볼릭 링크는 빠르게 접근할 수 있다. 빠른 심볼릭 링크를 사용하는 시스템은 대상 경로가 아이노드 공간을 초과하면 원래 방식(소급하여 '''느린 심볼릭 링크'''라고 불림)으로 되돌아가기도 한다. 원래 스타일은 다른 운영 체제 또는 이전 버전과의 디스크 호환성을 위해 사용되기도 한다.[5]
링크 값을 아이노드에 저장하면 디스크 블록과 디스크 읽기를 절약할 수 있지만, 운영 체제는 여전히 링크의 경로 이름을 구문 분석해야 한다. 이는 추가 아이노드를 읽고, 일반적으로 다른 많은 디렉터리를 읽어야 하며, 링크의 경로 구성 요소와 일치하는 것을 찾을 때까지 각 파일의 파일 목록과 아이노드를 처리해야 함을 의미한다. "빠른 심볼릭 링크"는 링크가 동일한 디렉터리에 있는 파일을 가리키는 경우에만 다른 심볼릭 링크보다 훨씬 더 나은 성능을 제공한다.[5]
대부분의 POSIX 호환 구현은 빠른 심볼릭 링크를 사용한다. 그러나 POSIX 표준은 일반 파일에 공통적인 전체 파일 상태 정보를 심볼릭 링크에 구현하도록 요구하지 않는다. 이는 구현에서 심볼릭 링크 데이터를 디렉터리 항목에 저장하는 등 다른 솔루션을 사용할 수 있도록 한다.[5]
심볼릭 링크의 파일 시스템 권한은 사용되지 않으며, 대상 파일의 접근 모드는 대상 파일 자체의 권한에 의해 제어된다. FreeBSD와 같은 일부 운영 체제는
lchmod
[12] 및 lchflags
[13] 시스템 호출을 통해 심볼릭 링크의 파일 권한 및 파일 시스템 속성을 수정할 수 있는 기능을 제공한다.[5]심볼릭 링크의 보고된 크기는 링크가 가리키는 경로의 문자 수이다.[5]
2. 2. 심볼릭 링크와 오류 처리
심볼릭 링크는 파일 시스템에 루프를 생성할 수 있기 때문에, 셸 및 백업 유틸리티와 같이 심볼릭 링크를 특별히 처리해야 하는 프로그램은 이를 직접 식별하고 조작해야 한다.[5] 전통적인 유닉스 파일 시스템은 트리 구조를 가지지만, 심볼릭 링크를 사용하면 루프를 포함할 수 있다.[5]3. 마이크로소프트 윈도우
마이크로소프트 윈도우는 심볼릭 링크, 정션 포인트, 바로 가기 등 여러 종류의 링크 기능을 제공한다.
- NTFS 심볼릭 링크: 윈도우 XP에서 도입되었으며, 윈도우 비스타 이후 사용자 모드 애플리케이션에서도 지원된다. 명령 프롬프트의 `mklink` 명령으로 생성할 수 있다. 파일뿐만 아니라 원격 서버 메시지 블록(SMB) 네트워크 경로도 가리킬 수 있으며, 교차 파일 시스템 링크도 지원한다.[15] POSIX 운영 체제와의 호환성을 위해 설계되었지만, 몇 가지 차이점이 있다. 예를 들어, 윈도우 비스타에서는 심볼릭 링크를 만들 때 파일인지 디렉터리인지 수동으로 지정해야 한다.[17]
- NTFS 정션 포인트: 윈도우 2000에서 NTFS 재분석 지점의 일부로 도입되었다. 로컬 디렉터리에만 적용되며, 원격 공유에는 사용할 수 없다.[20] 윈도우 2000 및 XP 리소스 키트에는 `linkd`라는 생성 프로그램이 포함되어 있으며, Sysinternals의 ''Junction''이라는 프로그램도 있다.
- 바로 가기: 윈도우 셸에서 지원되며, 심볼릭 링크와 유사하지만 파일 시스템에 의해 자동으로 해결되지 않는다. 윈도우 셸과 파일 브라우저와 같은 특정 프로그램에서만 참조로 처리된다. 대상이 이동되거나 이름이 변경되어도 참조를 유지하는 기능이 있다.[22]
- 셸 객체: 윈도우 레지스트리에 정의되며, 일종의 심볼릭 링크를 구현하는 데 사용될 수 있다. '내 문서', '글꼴', '관리 도구' 폴더 등이 셸 객체를 통해 파일 시스템 폴더로 리디렉션된 예시이다.
윈도우에서 심볼릭 링크와 정션은 파일 시스템 수준에서 처리되는 소프트 링크인 반면, 바로가기는 윈도우 셸에서 처리되는 기능이다. 바로가기는 대상 파일이 이동해도 추적할 수 있지만, 파일 시스템 수준에서 처리되지 않아 일부 프로그램에서 인식하지 못할 수 있다.
Windows 2000 이후 분산 링크 추적(Distributed Link Tracking) 서비스를 활성화하면, 파일에 객체 ID라는 고유 ID가 부여되어 Windows 도메인 내 NTFS 볼륨 상에서 이동하더라도 추적할 수 있다.
파일 시스템에 리파스 포인트 기능이 추가되면서 윈도우 2000에 채택된 NTFS 3.0 이후에는 정션이, Windows Vista 이후에는 심볼릭 링크를 사용할 수 있게 되었다.[36] 정션은 폴더(또는 드라이브)에 대한 소프트 링크로, 대상 경로가 적힌 파일인 바로 가기와 달리 명령줄에서 실제 폴더나 드라이브처럼 취급된다. 심볼릭 링크는 정션을 발전시켜 상대 경로 또는 네트워크 경로로 링크를 생성할 수 있다(단, 디스크 볼륨은 제외되며 파일 및 폴더에 한정). Windows Vista 이전에는 리파스 포인트를 다루는 명령어가 없었지만, Windows Vista 이후 `mklink` 명령어로 생성할 수 있게 되었다.[36]
3. 1. 윈도우 심볼릭 링크
윈도우 비스타, 윈도우 7, 윈도우 8 이상의 운영 체제는 명령 줄 유틸리티 `mklink`를 사용하여 파일과 디렉터리에 대한 심볼릭 링크를 지원한다.[39] 정션 포인트와 달리 심볼릭 링크는 파일이나 원격 서버 메시지 블록(SMB) 네트워크 경로를 가리킬 수도 있다. NTFS 심볼릭 링크는 파일 시스템 간 연결을 완전히 지원하지만, 호스트 간 심볼릭 링크를 활성화하려면 원격 시스템에서도 이를 지원해야 하며, 이는 윈도우 비스타 이후 버전으로 한정된다.심볼릭 링크는 POSIX 운영 체제와의 마이그레이션 및 애플리케이션 호환성을 돕기 위해 설계되었다. 마이크로소프트는 윈도우 비스타의 심볼릭 링크가 "유닉스 링크처럼 작동"하도록 목표했다.[16] 그러나 구현 방식은 여러 면에서 유닉스 심볼릭 링크와 다르다. 예를 들어, 윈도우 비스타 사용자는 심볼릭 링크를 만들 때 파일인지 디렉터리인지 수동으로 지정해야 한다.[17] 또한 윈도우 비스타는 단일 경로에 최대 31개의 심볼릭 링크를 허용한다.[18] 기본적으로 관리자 권한을 가진 사용자만 심볼릭 링크를 만들 수 있으며, "심볼릭 링크 만들기" 권한은 로컬 보안 정책 관리 콘솔에서 변경할 수 있다.[19]
윈도우 비스타, 윈도우 7, 윈도우 8에서 작업 디렉터리 경로가 심볼릭 링크로 끝날 때, 현재 부모 경로 참조인 '''..'''는 대상 경로가 아닌 심볼릭 링크의 부모 경로를 가리킨다. 이는 리눅스 등 일부 POSIX 시스템의 셸 수준에서는 볼 수 있지만, 운영 체제 호출을 통한 파일 및 디렉터리 접근에서는 나타나지 않는다. 예를 들어, bash 내장 명령 'pwd'와 'cd'는 현재 논리 디렉터리에서 작동하며, '/bin/pwd'는 스크립트에서 실제 작업 디렉터리를 결정하는 데 사용된다. 시스템 호출과 함께 경로를 사용할 때 '..'를 사용하면 '..' 가상 디렉터리 엔트리를 포함하는 디렉터리의 실제 파일 시스템 부모를 사용하게 된다. 따라서 "cd ..; cat 특정_항목"과 "cat ../특정_항목"을 입력했을 때 결과는 완전히 다를 수 있다.
Windows 2000 이후 분산 링크 추적(Distributed Link Tracking) 서비스를 활성화하면, 파일에 객체 ID라는 고유 ID가 부여되어 Windows 도메인 내 NTFS 볼륨 상에서 이동하더라도 추적할 수 있다.
Windows 2000에 채택된 NTFS 3.0 이후 파일 시스템에 리파스 포인트 기능이 추가되어 정션 및 Windows Vista 이후 심볼릭 링크를 사용할 수 있게 되었다.[36] 정션은 폴더(또는 드라이브)에 대한 소프트 링크로, 대상 경로가 적힌 파일인 바로 가기와 달리 명령줄에서 실제 폴더나 드라이브처럼 취급된다. 심볼릭 링크는 정션을 발전시켜 상대 경로 또는 네트워크 경로로 링크를 생성할 수 있다(단, 디스크 볼륨은 제외되며 파일 및 폴더에 한정). Windows Vista 이전에는 리파스 포인트를 다루는 명령어가 없었지만, Windows Vista 이후 `mklink` 명령어로 생성할 수 있게 되었다.[36]
3. 2. NTFS 정션 포인트
윈도우 2000 버전의 NTFS는 NTFS 재분석 지점을 도입했는데, 이는 특히 볼륨 마운트 지점과 정션 포인트의 사용을 가능하게 했다. 정션 포인트는 디렉터리에만 해당하며, 로컬 디렉터리에만 만들 수 있다. 원격 공유에 대한 정션 포인트는 지원되지 않는다.[20] 윈도우 2000 및 XP 리소스 키트에는 정션 포인트를 생성하는 ''linkd''라는 프로그램이 포함되어 있으며, Sysinternals의 마크 러시노비치가 배포한 ''Junction''이라는 더 강력한 프로그램도 있다.모든 표준 애플리케이션이 재분석 지점을 지원하는 것은 아니다. 특히, 백업은 이 문제로 인해 백업할 폴더에 재분석 지점이 포함된 경우 오류 메시지 0x80070003[21]을 표시한다.
3. 3. 바로 가기 (.lnk)
윈도우에서 널리 사용되는 바로 가기(`.lnk`)는 파일 시스템이 아닌 윈도우 셸에서 처리되는 기능이다. 심볼릭 링크와 달리 대상 파일이 이동해도 추적할 수 있다는 장점이 있지만,[22] 파일 시스템 수준에서 처리되지 않기 때문에 일부 프로그램에서는 인식하지 못할 수 있다.바로 가기는 윈도우 셸과 파일 브라우저와 같이 바로 가기를 이해하는 소프트웨어 프로그램에서만 다른 파일에 대한 참조로 처리된다. 파일 시스템과 바로가기를 인식하지 못하는 소프트웨어는 바로가기를 일반 파일처럼 취급한다.[24]
윈도우 바로 가기는 대상과 연결될 수 있는 추가 메타데이터를 포함할 수 있는 반면, POSIX 심볼릭 링크는 절대 또는 상대 경로 이름으로 해석될 문자열일 뿐이다. 또한, 윈도우 바로가기는 대상이 이동되거나 이름이 변경되어도 참조를 유지한다.[23] Windows 2000 이후의 Distributed Link Tracking 서비스를 활성화한 환경에서는 파일에 객체 ID라는 고유한 ID가 부여되어, Windows 도메인 내의 NTFS 볼륨 상에 있는 한, 어디로 이동해도 확실하게 추적할 수 있다.
바로 가기 파일의 파일 확장자는 `.lnk`이지만, MS-DOS 프로그램에 대한 바로 가기는 확장자 `.pif`의 특별한 파일 형식이 된다. 또한 Windows 98 이후에는 바로 가기를 새로 생성하는 위저드에서 경로 대신 URL을 입력하면 인터넷 바로 가기 (확장자 `.url`)가 생성된다.
3. 4. 셸 객체
셸 개체[26] 또는 셸 폴더는 윈도우 레지스트리에 정의되어 있으며 일종의 심볼릭 링크를 구현하는 데에도 사용할 수 있다. 폴더 바로가기와 마찬가지로 윈도우 셸에 투명하게 나타난다.'내 문서' 폴더가 '바탕 화면'에 있고, '글꼴' 폴더와 '관리 도구' 폴더가 '제어판'에 있는 것이 셸 개체가 파일 시스템 폴더로 리디렉션된 예시이다.
3. 5. Cygwin 심볼릭 링크
Cygwin은 마이크로소프트 윈도우에서 POSIX 호환 심볼릭 링크를 시뮬레이션한다. 유닉스와 동일한 프로그래밍 및 사용자 유틸리티 인터페이스를 사용하지만(위 참조), 심볼릭 링크를 해석할 때 Cygwin에서 사용하는 추가 정보가 포함된 윈도우 바로가기(.lnk 파일)를 생성한다. Cygwin 심볼릭 링크는 해석 방식 측면에서 POSIX 표준을 준수하며, 디스크 내 표현 방식 측면에서는 윈도우 표준을 준수한다.[27]또한 Cygwin은 제한 없이 Cygwin 외부에서 사용할 수 있는 네이티브 윈도우 심볼릭 링크를 지원하도록 설정할 수 있다.[27] 이를 위해서는 다음이 필요하다.
- CYGWIN 환경 변수를 `winsymlinks:native`을 포함하도록 변경.
- 윈도우는 심볼릭 링크 생성을 권한 있는 사용자로 제한하므로, 관리자 권한으로 Cygwin 실행.
하지만 몇 가지 차이점이 있다. Cygwin은 작업 디렉터리 또는 아이콘과 같은 바로가기 관련 정보를 지정할 방법이 없다. 이러한 매개변수를 `ln -s` 명령어에 넣을 공간이 없기 때문이다. 표준 Microsoft .lnk 파일을 생성하기 위해 Cygwin은 `mkshortcut` 및 `readshortcut` 유틸리티를 제공한다.[28]
Cygwin 사용자 가이드에서 이 주제에 대한 자세한 정보를 확인할 수 있다.[27] Cygwin을 기반으로 하는 MSYS2는 유사한 `winsymlinks` 설정을 가지고 있지만, 기본적으로 파일을 복사한다.[29]
4. POSIX와 윈도우 심볼릭 링크 비교
(관리자 권한 필요)