심볼릭 링크와 하드 링크

2 minute read

서론

프로젝트를 진행하다보면, 하나의 파일을 동시에 여러 군데에서 바라봐야할 일이 생기기 마련이다. 나의 경우에, 컴파일한 grpc proto 파일을 여러 디렉토리에서 사용할 필요가 있었다. 해당 파일이 쉽게 변경되지 않는다면 여기 저기에 복사 붙여넣기를 해서 사용해도 되지만, 쉽게 변경되지 않을 것 같은 파일들도 제법 잦은 빈도로 바뀌게 된다. 이는 굉장히 귀찮은 과정으로, 하나의 파일이 바뀔때마다 디펜던시가 있는 모든 디렉토리에 찾아가 파일을 바꾸는 것은 능률을 떨어뜨리기 마련이다. 따라서 해당 작업을 줄여줄 수 있는 방법을 찾던 중 리눅스의 symbolic link를 알게 되었고 해당 내용을 공유하고자 한다. 해당 링크의 내용을 정리하고자 한다.

심볼릭 링크는 소프트링크(soft link) 혹은 심링크(symlink) 라고 불린다. 쉽게 설명하자면 윈도우에서 바로가기와 같은 역할을 한다고 생각하면 된다. 즉, 단순히 어떤 파일 혹은 디렉토리로의 바로가기 링크일 뿐이다. 또는 C언어의 목적 파일로의 포인터역할이라고 생각할 수 있겠다.

OS를 공부하신 분들이라면 한번 쯤은 들어봤을 법한 inode와 관련하여 조금 더 기술적으로 설명해보겠다. inode는 리눅스에서 파일, 디렉토리 등 파일시스템에 관한 정보를 가지고 있는 자료구조이다. 파일시스템 내의 파일들은 고유한 inode를 가지며 이를 통해 식별할 수 있다.

심볼릭 링크로 생성된 파일의 inode는 실제 파일의 inode를 가리키게 되고 이를 그림으로 표현하면 아래와 같다.

soft_link

즉, symbolic link의 inode는 실제 파일(original file)의 inode를 바라보는 것이다. 심볼릭 링크는 아래의 명령어로 생성할 수 있다.

$ ln -s

만일 ~/tmp/aaa.txt 파일을 바라보는 동일한 내용의 심볼릭 링크 bbb.txt를 만들고 싶다면,

#~/tmp/
$ ln -s aaa.txt bbb.txt

cat 명령어를 사용하면 두 파일의 내용이 완전히 동일한 것을 살펴볼 수 있다. 또한 어떤 파일의 symbolic link 인지는

$ ls -li

명령어를 통해 확인할 수 있다.

단, 주의할 점은 심볼릭 링크를 걸 때 original file의 경로를 기입해주는 것이 좋다는 것이다. 왜냐하면 심볼릭링크 파일(bbb.txt)를 현재 디렉토리 외의 다른 곳으로 옮기게 되면 심볼릭 링크가 끊겨버리기 때문이다. 따라서 Local에서 작업할 때라면 절대경로를 기입함으로써 문제를 해결할 수 있다.

$ ln -s /home/user/tmp/aaa.txt bbb.txt

하지만 위와같이 절대경로를 입력하면 안되는 경우가 있는데 바로 git repo에서 작업할 때이다. 당연히 /home/user 경로는 나에게만 존재하는 경로이기 때문에 실제 git 작업을 할 때에는 상대경로로 지정해주는 것이 좋다. 어찌 되었든 위에 기술한 것과 같이 심볼릭 링크를 잘 활용하면 하나의 파일을 변경이 있을 때마다 일일이 변경해주어야하는 불상사는 일어나지 않는다.

심볼릭링크 (혹은 소프트링크)와 다른 개념을 가진 하드링크라는 것도 존재한다. 하드링크는 심볼릭 링크와 달리 하드링크의 inode가 원본의 inode를 똑같이 가리키게 된다. 아래 그림을 보면 확실히 두 차이를 느낄 수 있다.

hard_link

하드링크로 만들게 되면 해당 inode는 count값을 가지게 되고 자신을 통한 파일들의 갯수를 세고 있다. 이 역시 ls -li 명령어로 확인해볼 수 있다. 하드링크를 만드는 방법은 심볼릭 링크에서 -s 옵션을 빼주기만 하면 된다.

#~/tmp/
$ ln aaa.txt bbb.txt

Conclusion

따라서 두 링크를 사용하는 것은 크게 다른 효과를 불러일으킨다.

  1. 심볼릭 링크의 경우 원본이 삭제되면 당연히 심볼릭 링크 역시 갈곳을 잃고 방황하는 파일이 되어버린다. 하지만 하드링크는 단순히 inode에서 count가 1이 줄어드는 효과밖에 없다. 원본이 죽어도 하드링크는 그 내용을 똑같이 보관할 수 있게 된다.
  2. 심볼릭 링크는 디렉토리에도 걸 수 있지만 하드링크는 오직 파일에만 걸 수 있다.
  3. 원본 파일이 이리저리 움직일 경우 심볼릭 링크는 경로가 깨져버리기 때문에 사용할 수 없다. 하드링크를 사용하여아한다.

Categories:

Updated:

Leave a comment