본문 바로가기

Linux

심볼릭 링크 (symbolic link)

POSIX 호환 운영 체제에서 심볼릭 링크는 symlink() 시스템콜을 사용하여 만든다. ln이라는 셸 명령어는 보통 하드 링크를 만드는 link()시스템콜을 사용하며, ln -s 플래그를 지정하게 되면 symlink() 시스템콜을 사용하여 링크를 만든다.

 

ln -s [대상 경로] [링크 경로]

 

대상 경로

- 심볼릭 링크가 가리키는 상대 경로나 절대 경로

- 일반적으로 대상은 존재하지만, 심볼릭 링크는 존재하지 않는 대상을 가리키는데 사용할 수도 있다.

 

링크 경로

- 심볼릭 링크의 경로

 

심볼릭 링크를 만들면 이 링크는 대상에 대한 별명(Alias)로 취급되는 것이 보통이다. cp, rm과 같은 시스템 관리 명령을 심볼링 링크에 사용할 수도 있다. 심볼릭 링크를 읽고 쓰는 명령을 사용하면 대상 파일의 내용에 접근하게 되며, rm은 대상이 아닌 링크 자신을 삭제한다.

 

예제

 $ 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

 


심볼릭 링크, 하드링크 차이

심볼릭 링크, 하드 링크의 차이점을 알기 전에 inode라는 개념을 알고 가면 좋다.

 

inode

inode란 유닉스 계열 파일 시스템에서 사용하는 자료구조이다. 파일 시스템 내에서 파일이나 디렉토리는 고유한 inode를 갖고 있으며 inode를 통해 식별 가능하다.

 

inode란 곧 파일에 대한 메타 데이터를 저장하는 자료구조이며, 아래 정보를 포함한다.

  • 파일 모드 (퍼미션)
  • 링크 수
  • 소유자명
  • 그룹명
  • 파일 크기
  • 파일 주소
  • 마지막 접근 정보
  • 마지막 수정 정보
  • 아이노드 수정 정보

따라서 사용자가 파일이나 디렉터리에 접근하게 되면, 실제 내부 동작은 파일 이름과 매핑된 inode 정보를 통해 inode에 존재하는 파일 주소를 따라 파일의 데이터 블록에 접근하게 된다.

 

심볼릭 링크 (Symbolic link)

새로운 inode를 생성한다. 어떠한 대상파일의 심볼링 링크를 생성하면, 대상 파일이 실제 가리키고 있는 데이터 블록에 대한 포인터를 포함한 새로운 inode를 생성하여 심볼릭 링크에 매핑한다.

하드 링크 (Hard link)

원본 파일의 inode를 공유한다. 새로운 inode를 생성하지 않고, 대상 파일의 inode를 공유한다.

 

차이점

이 둘의 차이점은 inode의 생성여부이다. inode 생성 여부에 따라 여러가지 차이점이 존재할 수 있겠지만 중점적으로 원본파일을 삭제할 경우 어떻게 동작하는지에 대해서만 생각해보자.

 

 먼저 심볼릭 링크의 경우 원본 파일을 삭제할 경우 링크를 통해 원본파일에 대한 액세스는 불가능하다. 그 이유는, 원본 파일이 삭제되면서 원본 파일의 inode 또한 삭제되고, 원본 파일의 inode에 존재하는 파일의 실제 데이터 블록또한 삭제되었기 때문이다. 따라서 심볼릭 링크가 갖고 있는 inode의 데이터 블록 포인터는 유효하지 않기 때문에 액세스가 불가능 하다.

 

 반면 하드 링크의 경우, 원본 파일을 삭제하더라도 링크를 통해 액세스가 가능하다. 그 이유는 원본파일이 삭제되었더라고, inode를 공유하는 하드링크가 있기 때문에 inode는 삭제되지 않고, 따라서 파일의 실제 데이터또한 삭제되지 않았기 떄문이다.

'Linux' 카테고리의 다른 글

service, systemctl 란?  (0) 2020.12.21
systemd란  (0) 2020.12.21