본문 바로가기

Linux

LINUX하드링크와 심볼릭링크의 차이점 (퍼옴)

참조 원문 : Softlinks vs. Hardlinks: A Quick Explanation

  심볼릭 링크와 하드 링크에 대해 '살짝' 알아보는 글입니다. 포스트할 가치가 있나에 대해서 좀 고민했지만 이거 전에 한 포스트를 생각하면 못할 것도 없군요 -_-;


심볼릭 링크란?

  다 필요 없고 윈도우의 바로가기입니다. 단순히 다른 파일을 가리키고 있는 파일이지요. 심볼릭이든 하드든 간에 링크는 ln 명령어로 만듭니다. 심볼릭 링크를 만들 때는 -s 옵션을 사용하며 대략 아래와 같은 명령어 형식으로 만듭니다.

ln -s target_file link_file_name

  이렇게 만들어진 링크는 'ls -l' 명령어를 통해 어떤 파일을 가리키고 있는지 볼 수 있습니다.

mirashi@myservlab:/home/mirashi$ ln -s /bin/bash ./bash_link
mirashi@myservlab:/home/mirashi$ ls -l
total 0
lrwxrwxrwx 1 mirashi mirashi 9 2010-11-16 11:40 bash_link -> /bin/bash

  자, 심볼릭 링크는 이렇게 대충 넘어가고 이번에는 하드 링크를 살펴보겠습니다.


하드 링크란?

  심볼릭 링크가 이미 존재하는 파일을 가리키는 새로운 파일이라면 하드 링크는 원래 파일의 데이터에 대한 또 다른 접근 경로입니다. 아니, 복사본도 아니고 애매하게 또 다른 접근 경로라니...이게 무슨 뜻이냐면 심볼릭 링크와 비슷하게 하드 링크도 어떤 것을 가리키지만 그 가리키는 것이 이미 존재하는 파일을 가리키는 것이 아니라 파일 시스템에 있는 데이터의 위치를 가리킵니다. 아래가 심볼릭 링크에 대한 모습이라면

심볼릭 링크 -> 원래 파일 -> 파일 시스템의 데이터

아래는 하드 링크의 모습입니다.

하드 링크 -> 파일 시스템의 데이터 <- 원래 파일

  두 링크의 차이를 가장 체감할 수 있을 때는 바로 '원래 파일'을 지웠을 때입니다. 심볼릭 링크의 경우 원래 파일을 지우면 파일 시스템의 데이터에 접근할 방법이 사라집니다. 하지만 하드 링크의 경우 원래 파일을 지워도 데이터에 접근하는데 아무런 문제가 없습니다. 자신도 완전한 하나의 파일이기 때문입니다. 그러나 일반적인 복사본과는 엄연히 다릅니다. 파일 시스템에 있는 데이터를 복사한 것이 아니라 그 겉모습인 파일(정확히는 Inode 값)만 복사했기 때문입니다. 따라서 진짜 복사했을 때와 달리 파일 시스템 내의 데이터 자체는 여전히 1개만 존재합니다. 파일과 실제 파일이 가리키는 데이터를 동일하게 생각하면 이해가 되지 않겠지만 파일을 '실제 데이터에 대한 정보를 담고 있는 정보체'로 실제 데이터와 분리해서 생각한다면 이해가 되실 겁니다.

  특정 파일이 가리키는 데이터에 대한 하드 링크의 개수를 보는 첫 번째 방법은 'stat 파일명' 명령어를 사용하는 겁니다.

mirashi@myservlab:/home/mirashi$ ln /bin/bash ./bash_hard
mirashi@myservlab:/home/mirashi$ stat ./bash_hard 
  File: `./bash_hard'
  Size: 875596        Blocks: 1712       IO Block: 4096   regular file
Device: 803h/2051d    Inode: 131077      Links: 2
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2010-11-16 06:52:57.028456283 +0900
Modify: 2009-09-14 14:09:21.000000000 +0900
Change: 2010-11-16 13:12:27.671455383 +0900

  만든 하드 링크는 1개지만 원본 파일도 결국 실제 데이터를 가리키는 링크이기 때문에 생성한 하드 링크와 다를 게 없습니다. 즉, 원본 파일도 하드 링크의 개수에 포함됩니다.

  하드 링크의 개수를 보는 두 번째 방법은 'ls -l' 명령어를 사용하는 겁니다.

mirashi@myservlab:/home/mirashi$ ls -l
total 856
-rwxr-xr-x 2 root root 875596 2009-09-14 14:09 bash_hard

  2번째 열을 보면 숫자 '2'가 적혀 있는데 이것이 바로 이 파일이 가리키고 있는 데이터에 대한 하드 링크의 개수입니다.


장단점

  지금까지 심볼릭 링크와 하드 링크에 대해 간단히 알아봤는데요. 사실 하드 링크에는 아래의 2가지 제약이 있습니다.

  1. 다른 파일 시스템에 있는 데이터에 대해 하드 링크 생성 불가.
  2. 디렉토리에 대한 링크 생성 불가.

  위의 경우에는 심볼릭 링크를 사용해야 하며 위의 경우 말고도 같은 프로그램을 여러 버전 별로 가지고 있고 다른 프로그램이나 스크립트에서 그 프로그램을 실행해야 하는 경우에도 프로그램 소스나 스크립트를 변경할 필요 없이 원하는 버전을 실행하도록 심볼릭 링크를 유용하게 사용할 수 있습니다.

  반면 하드 링크에는 아래와 같은 장점이 있습니다.

  1. 성능 : 하드 링크는 데이터가 있는 위치를 직접 가리키고 있기 때문에 다른 파일을 가리키고 있는 심볼릭 링크에 비해 약간 더 빠르다.
  2. 저장 공간 : 하드 링크 파일은 마치 용량을 점유하고 있는 것처럼 보이지만 진짜로 데이터를 복사한 것이 아니라 이미 존재하는 데이터의 위치만 (Inode를 통해)가리키고 있으며 별도의 데이터를 저장하지 않기 때문에 용량을 차지하지 않는다. 반면 심볼릭 링크는 자신이 가리키고 있는 파일의 위치를 데이터로서 저장하기 때문에 약간의 용량(보통 4KB)을 차지한다.

  덤으로 원래 파일이 지워지면 쓸모없어지는 심볼릭 링크와 달리 하드 링크는 1개라도 남아 있을 경우 실제 데이터가 남는다는 장점이 있습니다.

'Linux' 카테고리의 다른 글

리눅스 사용자 및 그룹관리  (0) 2015.06.05