SYMLINK(7)

명칭
symlink - 기호 연결의 취급

기호 연결의 취급
기호 연결은, 다른 파일에의 포인터로서 일하는 파일입니다. 동작을 이해하기 위해서는, 하드 링크의 동작을 이해할 필요가 있습니다. 파일에의 하드 링크는 원래의 파일과는 구별할 수 없습니다. 왜냐하면, 하드 링크는 원래의 파일명의 깔개가 되는 오브젝트를 참조하기 때문입니다. 파일에 대한 변경은, 파일을 참조하기 위해서 사용하는 이름에는 의존하지 않습니다. 하드 링크는, 디렉토리를 참조하고는 되지않고, 다른 파일 시스템상의 파일을 참조해도 되지 않습니다. 기호 연결은, 링크 된 파일의 이름을 격납합니다. 즉, 다른 이름에의 포인터입니다. 깔개가 되는 오브젝트를 참조하는 것은 아닙니다. 이 때문에, 기호 연결은, 디렉토리를 참조할 수가 있고, 파일 시스템을 걸치는 것이 가능합니다.

기호 연결과 이것이 참조하는 오브젝트는 파일 시스템의 이름 공간에 있어 공존하기 때문에, 링크 자신과 참조되는 오브젝트의 구별에 관해서 혼란이 생기는 일이 있습니다. 역사적으로는, 명령 및 시스템 콜은, 임기응변적으로 각각 독자적인 링크 추적 규칙을 채용해 왔습니다. 이 시스템에 실장되고 있는, 통일적인 접근의 규칙을 여기에 나타냅니다. 유저 인터페이스를 할 수 있는 한 일관성 있는 것과 하기 위해서, 로컬 어플리케이션도 또 이 규칙을 지키는 것이 중요합니다.

기호 연결의 조작은, 링크 자신에게로의 조작, 혹은 링크에 의해 참조되는 오브젝트에의 조작에 의해 실현됩니다. 후자의 경우, 어플리케이션 또는 시스템 콜이 링크를 “추적 (follow)” 했다고 합니다. 기호 연결은 다른 기호 연결을 참조할 수가 있습니다. 이 경우, 기호 연결이 아닌 오브젝트가 발견되는지, 존재하지 않는 파일을 참조하는 기호 연결이 발견되는지, 루프가 검출될 때까지, 링크가 끌어당겨집니다. (루프 검출은, 추적 가능한 링크수의 상한을 설정하는 것으로써 실현됩니다. 이 제한을 초과하는 경우에는 에러가 됩니다. )

논의해야 할 area로 다른 것이 3 개 있습니다. 그것들은 다음과 같습니다:

1.  시스템 콜의 파일명 인수로서 사용되는 기호 연결.
2.  파일 트리를 더듬지 않는 유틸리티의 명령행 인수로서 지정되는 기호 연결.
3.  파일 트리를 더듬는 (traverse) 유틸리티가 취급하는 기호 연결 (명령행으로 지정되는 것, 및 파일 계층을 더듬을 때 만나는 것의 양쪽 모두입니다).

  시스템 콜
최초의 area는, 시스템 콜의 파일명 인수로서 사용되는 기호 연결입니다.

다음의 예외를 제외해, 전시스템 콜은 기호 연결을 추적합니다. 예를 들면, “afile” (이)라는 이름의 파일을 가리키는 기호 연결 “slink” 하지만 존재하는 경우, 시스템 콜 “open("slink" ...)” (은)는 파일 “afile” 의 파일 기술자를 돌려줍니다.

링크를 추적하지 않고 , 기호 연결 자신을 조작하는 시스템 콜이 6 개 있습니다. 그것들은 다음과 같습니다: lchown(2), lstat(2), readlink(2), rename(2), rmdir(2), unlink(2) remove(3) 하 unlink(2) 의 별명이기 때문에, 이것도 또 기호 연결을 추적하지 않습니다. rmdir(2) (은)는, 기호 연결에 대해서 적용되면(자), 에러 ENOTDIR 그리고 실패합니다.

기존의 기호 연결의 소유자 및 그룹의 변경은, lchown(2) 시스템 콜에서 가능합니다. 다른 파일 속성, 예를 들면 수정 시각이나 액세스 퍼미션은, 시스템이 사용하지않고, 변경 불능입니다.

4.4BSD 시스템은 역사적인 4BSD 시스템과는 달라, 시스템 콜 chown(2) 하지만 기호 연결을 추적하도록(듯이) 변경되었습니다. 나중이 되어, 새롭다 chown(2) 의 제한이 밝혀지면(자), lchown(2) 시스템 콜이 추가되었습니다.

  파일 트리를 더듬지 않는 명령
제 2 의 area는, 파일 트리를 더듬지 않는 명령에 대한다 명령행의 파일명 인수로서 지정되는 기호 연결입니다.

아래에 말하는 예외를 제외해, 명령은, 명령행 인수로서 지정되는 기호 연결을 추적합니다. 예를 들면, “afile” (이)라는 이름의 파일을 가리키는 기호 연결 “slink” 하지만 존재하는 경우, 명령 “cat slink” (은)는 파일 “afile” 의 내용을 표시합니다.

이 규칙은, 파일 트리를 더듬을 수도 있는 명령도 포함합니다. 이것을 인식하는 것이 중요합니다. 예를 들면, 명령 “chown file” (은)는 이 규칙에 포함됩니다만, 명령 “chown -R file” (은)는 포함되지 않습니다. (후자는 제 3 의 area로 후술 합니다. )

명령이 기호 연결을 추적하는 것이 아니라 기호 연결 자신을 조작한다 일이 명시적으로 의도되고 있는 경우, 예를 들면 “chown slink” 하지만, 기호 연결인지 아닌지에 관계없이, “slink” 자신의 소유자를 변경하고 싶은 경우, -h 옵션을 사용합니다. 앞의 예에서는, “chown root slink” 하 “slink” 하지만 참조하는 파일의 소유자를 변경합니다만, “chown -h root slink” 하 “slink” 자신의 소유자를 변경합니다.

이 규칙에는 4 개의 예외가 있습니다. mv(1) 및 rm(1) 의 명령은, 인수로서 지정되는 기호 연결을 추적하지 않고 , 각각 기호 연결 자신을 개명하거나 삭제하려고 합니다. (기호 연결이 파일을 상대 패스로 지정하는 경우, 기호 연결을 다른 디렉토리로 이동해 버리면(자), 패스가 올바르지 않게 되어 버리기 때문에, 추적할 수 없게 됩니다. )

ls(1) 명령도 또 이 규칙의 예외입니다. 역사적인 시스템과의 호환성을 위해서(때문에) ( ls 하지만 트리를 더듬지 않는 경우, 즉 -R 옵션이 지정되지 않는 경우), -H, -L 옵션이 지정될까 -F, -d, -l 옵션이 지정되지 않는 경우, ls 명령은 인수로서 지정된 기호 연결을 추적합니다. ( 파일 트리를 더듬지 않는 경우에도, -H, -L 옵션이 동작에 영향을 주는 명령은 ls 뿐입니다. )

file(1) 명령도 또 이 규칙의 예외입니다. file(1) 명령은, 인수로서 지정되는 기호 연결을, 디폴트에서는 추적하지 않습니다. -L 옵션이 지정되면(자), file(1) 명령은 인수로서 지정되는 기호 연결을 추적합니다.

4.4BSD 시스템은 역사적인 4BSD 시스템과는 달라, chown, chgrp 의 명령이 커멘드 라인으로 지정된 기호 연결을 추적합니다.

  파일 트리를 더듬는 명령
다음의 명령은, 옵션으로 해 또는 항상 파일 트리를 더듬습니다: chflags(1), chgrp(1), chmod(1), cp(1), du(1), find(1), ls(1), pax(1), rm(1), tar(1), chown(8)

파일 시스템을 더듬을 때 만나는 기호 연결 및 명령행 인수로서 지정되는 기호 연결에 대해, 다음의 규칙이 동일하게 적용되는 것을 인식하는 것이 중요합니다.

최초의 규칙은, 디렉토리형은 아니다 파일을 참조하는 기호 연결에 대해서 적용됩니다. 기호 연결에 대해서 적용되는 조작은, 링크 자신에 대해서 됩니다만, 그렇지 않은 경우에는 링크는 무시됩니다.

예를 들면, 명령 “chown -R user slink directory” 하 “slink” (을)를 무시합니다. 왜냐하면 본시스템에 있어서의 기호 연결은 소유자를 가지지 않기 때문입니다. 트리를 더듬을 때 만나는 기호 연결도 또 무시됩니다. 명령 “rm -r slink directory” 하 “slink” (을)를 삭제해, “directory” 의 트리를 더듬을 때 만나는 기호 연결도 또 삭제합니다. 왜냐하면, 기호 연결은 삭제 가능하기 때문에입니다. 어떠한 경우도, “slink” 하지만 참조하는 파일에 chown 및 rm 하지만 영향을 줄 것은 없습니다.

제 2 의 규칙은, 타입이 디렉토리인 파일을 참조하는 기호 연결에 적용됩니다. 디폴트에서는, 타입이 디렉토리인 파일을 참조하는 기호 연결은 “추적” 되지 않습니다. 이것은 자주 “물리” 탐색으로 불려 “논리” 탐색 (디렉토리를 참조하는 기호 연결이 추적되는 경우입니다) 의 반대극에 위치합니다.

가능한 한 일관성을 갖게하기 (위해)때문에, 기호 연결이 참조하는 파일의 타입에 의존하지 않고 , 파일 트리를 더듬는 명령에 명령행으로 지정되는 기호 연결을 추적시키기 위해서(때문에)는, -H (“반논리”) 플래그를 지정합니다. 이 플래그는, 명령행의 이름 공간을 논리적인 이름 공간으로 하는 것을 의도하고 있습니다. (주: 항상 파일 트리를 더듬는 것은 아닌 명령에 대해서는, -R 플래그도 지정되어 있지 않은 경우에는, -H 플래그는 무시됩니다. )

예를 들면, 명령 “chown -HR user slink” (은)는, “slink” 그리고 가리켜지는 파일을 뿌리로 하는 파일 계층을 더듬습니다. 주: -H (은)는, 이전 논의했다 -h 플래그와는 같은이 아닙니다. -H 플래그는, 실행되는 조작 및 파일 트리를 더듬을 때의 양쪽 모두에 대해, 명령행으로 지정되는 기호 연결을 끌어당기도록(듯이) 합니다. 이것에 의해, 기호 연결이 가리키는 파일의 이름을, 유저가 지정했는지와 같이 됩니다.

가능한 한 일관성을 갖게하기 (위해)때문에, 기호 연결이 참조하는 파일의 타입에 의존하지 않고 , 파일 트리를 더듬는 명령에 명령행으로 지정되는 기호 연결 뿐만이 아니라 파일 트리를 더듬고 있을 때 만나는 기호 연결도 추적시키기 위해서(때문에)는, -L (“논리”) 플래그를 지정합니다. 이 플래그는, 모든 이름 공간을 논리적인 이름 공간으로 하는 것을 의도하고 있습니다. (주: 항상 파일 트리를 더듬는 것은 아닌 명령에 대해서는, -R 플래그도 지정되어 있지 않은 경우에는, -L 플래그는 무시됩니다. )

예를 들면, 명령 “chown -LR user slink” (은)는, “slink” 그리고 가리켜지는 파일의 소유자를 변경합니다. “slink” 하지만 디렉토리를 참조하는 경우, chown 하 “slink” 그리고 가리켜지는 디렉토리를 뿌리로 하는 파일 계층을 더듬습니다. 게다가 chown 하지만 더듬는 파일 트리 중(안)에서 기호 연결을 만나면(자), 그 기호 연결은 “slink” (와)과 같은 방법으로 다루어집니다.

가능한 한 일관성을 갖게하기 (위해)때문에, 디폴트의 동작을 지정하려면 , -P (“물리”) 플래그를 지정합니다. 이 플래그는, 이름 공간 전체를 물리적인 이름 공간과 같이 보이기 위한 것입니다.

디폴트로 파일 트리를 더듬지 않는 명령에 대해서는, -R 도 또한 지정하지 않는 경우에는, -H, -L, -P 플래그는 무시됩니다. 또, -H, -L, -P 옵션은 여러 차례 지정 가능합니다. 이 경우, 마지막에 지정한 것이 명령의 동작을 지정합니다. 어느 동작을 실시하도록(듯이) 명령을 앨리어스(alias) 해, 그것을 명령행으로 덧쓰기할 수 있도록(듯이) 하는 것을 의도하고 있습니다.

ls(1) (와)과 rm(1) 의 명령은, 이러한 규칙에 대해 예외를 가집니다. rm 명령은 기호 연결을 조작해, 기호 연결이 참조하는 파일을 조작하지 않습니다. 또, 기호 연결을 추적하지 않습니다. rm 명령은 -H, -L, -P 의 옵션을 서포트하지 않습니다.

역사적인 시스템과의 호환성을 유지하기 위해서, ls 명령은 조금 다른 거동을 나타냅니다. -F, -d, -l 옵션의 모두 지정하지 않는 경우, ls 명령은, 커멘드행으로 지정한 기호 연결을 추적합니다. -L 플래그가 지정되면(자), 기호 연결의 타입에 관계없이, 또 명령행으로 지정되었는지 파일 트리를 더듬는 도중에 만났는데일지도 관계없이, ls (은)는 전기호 연결을 추적합니다.

관련 항목
chflags(1), chgrp(1), chmod(1), cp(1), du(1), find(1), ln(1), ls(1), mv(1), pax(1), rm(1), tar(1), lchown(2), lstat(2), readlink(2), rename(2), symlink(2), unlink(2), fts(3), remove(3), chown(8)