심볼릭 링크

컴퓨팅에서 심볼릭 링크(symbolic link) 또는 기호화된 링크는 절대 경로 또는 상대 경로의 형태로 된 다른 파일이나 디렉터리에 대한 참조를 포함하고 있는 특별한 종류의 파일이다. 심볼릭 링크는 이미 1978년까지 DEC와 데이터 제너럴의 RDOS의 미니 컴퓨터 운영 체제에 존재했다. 오늘날 이들은 FreeBSD, GNU/리눅스, OS X과 같은 대부분의 유닉스 계열 운영 체제인 POSIX 운영 체제 표준과 윈도 비스타, 윈도 7, 또 바로 가기 파일의 형태로서 윈도 2000, 윈도 XP에 이르는 윈도 운영 체제를 통해 지원되고 있다.
심볼릭 링크는 대부분의 작업에 투명하게 동작한다. 심볼릭 링크로 이름이 지정된 파일에 읽고 쓰는 프로그램들은 마치 운영 체제가 직접 대상 파일에 작용하는 것처럼 수행한다. 그러나 심볼릭 링크들을 특별하게 다루어야 하는 프로그램들(이를테면 백업 유틸리티)은 이들을 직접 식별하고 조작할 수도 있다.
심볼릭 링크는 다른 파일이나 디렉터리에 대한 경로로서 운영 체제가 자동으로 해석하고 추적하는 텍스트 문자열을 포함한다. 이러한 다른 파일이나 디렉터리를 대상(target)으로 부른다. 심볼릭 링크는 대상으로부터 독립적으로 존재하는 두 번째 파일이다. 심볼릭 링크가 삭제되면 대상은 영향을 받지 않는다. 심볼릭 링크가 대상을 지시하면 나중에 대상이 이동되거나 이름이 바뀌거나 지워지더라도 심볼릭 링크는 자동으로 업데이트되거나 삭제되지는 않지만 지속적으로 오래된 대상(현재는 존재하지 않는 위치나 파일)을 가리킨 채로 존재한다. 이동되었거나 존재하지 않는 대상을 가리키는 심볼릭 링크들은 broken, orphaned, dead, dangling 등의 용어로 불리기도 한다.
심볼릭 링크는 하드 링크와는 차이가 있다. 하드 링크는 다른 볼륨이나 파일 시스템 상의 경로를 연결하지 않지만 심볼릭 링크는 링크와 대상이 존재하는 볼륨의 어느 파일이나 디렉터리라도 가리킬 수 있다. 하드 링크는 무조건 기존의 파일만을 가리키는 반면 심볼릭 링크는 어느 것을 가리키지 않는 임의의 경로를 포함할 수도 있다.
파일 시스템 계층을 재정렬하려는 노력에 따라 일부 유닉스와 리눅스 배포판들은 심볼릭 링크를 널리 사용한다. 이는 변종의 콘텍스트 의존 심볼릭 링크들과 같은 일부 매커니즘을 통해 수행할 수 있다. 또, 더 직관적이거나 응용 프로그램에 특화된 디렉터리 트리를 만들고, 핵심이 되는 시스템 명령 및 유틸리티들을 다시 설계하는 일 없이 시스템을 다시 정리하는 기회를 제공한다.

POSIX 및 유닉스 계열 운영 체제

POSIX 호환 운영 체제에서 심볼릭 링크는 symlink 시스템 호출을 사용하여 만든다. ln이라는 셸 명령은 보통 하드 링크를 만들어내는 link라는 시스템 호출을 사용한다. ln -s 플래그가 지정되면 symlink() 시스템 호출이 대신 사용되면서 심볼릭 링크를 만들어낸다. 심링크는 U.C. 버클리의 4.2BSD 유닉스에 도입되었다.
다음의 명령은 명령 줄 인터페이스 (셸)에서 심볼릭 링크를 만들어낸다:

ln -s [대상 경로] [링크 경로]
대상 경로는 심볼릭 링크가 가리키는 상대 경로나 절대 경로이다. 일반적으로 대상은 존재하지만 심볼릭 링크는 존재하지 않는 대상을 가리키는데 사용할 수도 있다. 링크 경로는 심볼릭 링크의 경로이다.
심볼릭 링크를 만들면 이 링크는 대상에 대한 별명(alias)으로 취급되는 것이 보통이다. cp, rm 따위의 시스템 관리 명령들은 심볼릭 링크에 사용할 수 있다. 읽고 쓰는 명령을 사용하면 대상 파일의 내용에 접근하게 된다. 그러나 파일을 지우는 rm 명령은 대상 파일이 아닌 링크 그 자신을 제거한다.
긴 디렉터리 보기 옵션 (-l)과 함께 POSIX의 디렉터리를 나열하는 프로그램 ls을 사용하면 심볼릭 링크가 이름 뒤의 화살표를 통해 가리키고 있음을 볼 수 있다. (아래의 예제 참고) 디렉터리를 가리키는 심볼릭 링크의 디렉터리 나열을 요청하면 링크 그 자체만 표시된다. 링크된 디레터리를 나열하려면 경로 뒤에 / 구분 문자를 추가하여야 한다.

 $ mkdir -p /tmp/one/two
 $ echo "test_a" >/tmp/one/two/a
 $ echo "test_b" >/tmp/one/two/b
 $ cd /tmp/one/two
 $ ls -l
 -rw-r--r-- 1 user group 7 Jan 01 10:01 a
 -rw-r--r-- 1 user group 7 Jan 01 10:01 b

 $ cd /tmp
 $ ln -s /tmp/one/two three
 $ ls -l /tmp/three
 lrwxrwxrwx 1 user group 12 Jul 22 10:02 /tmp/three -> /tmp/one/two
 $ ls -l /tmp/three/
 -rw-r--r-- 1 user group 7 Jan 01 10:01 a
 -rw-r--r-- 1 user group 7 Jan 01 10:01 b

 $ cd three
 $ ls -l
 -rw-r--r-- 1 user group 7 Jan 01 10:01 a
 -rw-r--r-- 1 user group 7 Jan 01 10:01 b
 $ cat a
 test_a
 $ cat /tmp/one/two/a
 test_a
 $ echo "test_c" >/tmp/one/two/a
 $ cat /tmp/one/two/a
 test_c
 $ cat /tmp/three/a
 test_c

윈도 심볼릭 링크

윈도 비스타, 윈도 7, 윈도 8 이상의 운영 체제는 명령 줄 유틸리티 mklink를 사용하여 파일과 디렉터리에 대한 심볼릭 링크를 지원한다. 정션 포인트와 달리 심볼릭 링크는 파일이나 원격 서버 메시지 블록(SMB) 네트워크 경로를 가리킬 수도 있다. 뿐만 아니라 NTFS 심볼릭 링크는 파일 시스템 간 연결을 완전히 지원한다. 그러나 호스트 간 심볼릭 링크를 활성화하는 기능을 사용하려면 이들을 지원하는 원격 시스템이 필요하며 그 지원은 윈도 비스타 이후 윈도 운영 체제로 한정된다.
심볼릭 링크는 POSIX 운영 체제와의 마이그레이션, 응용 프로그램 호환성을 보조하도록 설계되었다. 마이크로소프트는 비스타의 심볼릭 링크가 "유닉스 링크와 같은 기능"을 하도록 목표로 정했다. 그러나 이러한 구현은 여러 방면에서 유닉스 심볼릭 링크와 다르다. 이를테면 비스타 사용자들은 심볼릭 링크를 만들 때 그것이 파일인지 디렉터리인지 수동으로 지시해 주어야 한다. 비스타는 단일 경로에 31개의 심볼릭 링크로 그 수를 제한하고 있다. 기본적으로 관리자만이 소유하고 있는, 새로운 "심볼릭 링크 만들기" 권한이 있는 사용자들만 심볼릭 링크를 만들 수 있다. 이러한 권한이 마음에 들지 않으면 로컬 보안 정책 관리 콘솔에서 설정을 변경하여야 한다.
비스타, 윈도 7, 윈도 8에서 작업 디렉터리 경로가 심볼릭 링크로 끝날 때 현재의 부모 경로 참조 ..는 대상의 경로가 아닌 심볼릭 링크의 부모 경로를 가리키게 된다. 이러한 동작은 리눅스와 같은 일부 POSIX 시스템의 셸 수준에서 볼 수 있지만 운영 체제 호출을 통해 파일과 디렉터리로 접근해서는 볼 수 없다. 이를테면 bash 내장 명령 'pwd'와 'cd'는 현재의 논리 디렉터리에서 동작한다. '/bin/pwd'는 현재의 실제 작업 디렉터리를 결정하기 위해 스크립트에서 종종 사용된다. 특정 경로가 시스템 호출과 함께 사용될 때 '..'를 사용하면 '..' 가짜 디렉터리 엔트리를 포함하는 디렉터리의 실제 파일 시스템의 부모 디렉터리를 사용하게 된다. 그러므로 "cd ..; cat 특정_항목"을 입력했을 때와 "cat ../특정_항목"을 입력했을 때의 결과는 완전히 다르다.
윈도 XP에서도 심볼릭 링크 활성화를 가능하게 하는 타사 드라이버가 존재한다.