링크의 개념
리눅스 시스템에서 링크는 크게 두 가지로 나뉜다. 하나는 하드 링크(Hard Link)이고, 다른 하나는 소프트 링크(Soft Link) 또는 심볼릭 링크(Symbolic Link)라고 부른다. 별도 옵션 없이 ln 명령어를 실행하면 기본적으로 하드 링크가 생성된다.
하드 링크
하드 링크는 인덱스 노드(Inode)를 기반으로 파일을 연결하는 방식이다. 리눅스 파일 시스템에서는 디스크 파티션에 저장된 모든 파일에 고유 번호를 부여하는데, 이를 인덱스 노드 번호(Inode Index) 또는 줄여서 Inode라고 한다.
리눅스에서는 여러 파일 이름이 동일한 Inode를 가리키는 것이 가능하며, 이를 하드 링크라고 한다. 하드 링크의 주요 용도 중 하나는 중요한 파일에 대해 여러 개의 유효 경로명을 제공하여 실수로 원본 데이터를 삭제하는 것을 방지하는 데 있다. (NetApp 스토리지의 스냅샷 기능도 이 원리를 활용한다. 스냅샷을 생성하면 하드 링크가 하나 더 추가되는 구조다.) 왜 하드 링크를 만들면 데이터 삭제를 방지할 수 있을까?
그 이유는 파일 시스템의 동작 방식에 있다. 파일의 Inode에 하나 이상의 링크가 존재하는 한, 단순히 하나의 파일 이름(링크)만 삭제하는 것은 Inode 자체나 다른 링크에 영향을 주지 않는다. 즉, 실제 데이터 블록은 삭제되지 않는다. 마지막 링크가 삭제되어야 비로소 파일의 데이터 블록과 디렉터리 링크가 해제되고, 새로운 데이터가 저장될 때 해당 공간을 덮어쓰게 된다. 이 시점이 지나면 데이터는 복구할 수 없다. 결과적으로 리눅스에서 파일(디렉터리도 파일의 일종)을 진정으로 삭제하려면 관련된 모든 하드 링크가 제거되어야 한다. (프로세스가 파일을 사용 중인 경우도 관련되지만, 이는 차차 다루겠다.) 하드 링크는 파일에 접근하는 또 다른 출입구라고 생각하면 된다.
소프트 링크 (심볼릭 링크)
소프트 링크는 심볼릭 링크(Symbolic Link)라고도 불리며, 윈도우의 바로가기와 유사하다. 실제로는 특별한 파일로, 그 안에는 소프트 링크가 가리키는 원본 파일의 위치 정보가 텍스트 형태로 저장되어 있다. 따라서 이 "바로가기"에 접근하면 원본 파일을 빠르게 찾을 수 있다.
실습 예제
파일 링크 생성
[root@localhost ~]# mkdir /test/oldboy -p
[root@localhost ~]# cd /test/oldboy/
[root@localhost oldboy]# touch oldboyfile # 테스트 파일 생성
[root@localhost oldboy]# ln oldboyfile oldboyfile_hard_link # 하드 링크 생성
[root@localhost oldboy]# ln -s oldboyfile oldboyfile_soft_link # 소프트 링크 생성
[root@localhost oldboy]# ls -li # -i 옵션으로 inode 번호 확인
total 12
810403 -rw-r--r-- 2 root root 0 May 1 03:43 oldboyfile
810403 -rw-r--r-- 2 root root 0 May 1 03:43 oldboyfile_hard_link
810404 lrwxrwxrwx 1 root root 10 May 1 03:44 oldboyfile_soft_link -> oldboyfile
위 결과를 보면, 하드 링크 파일 oldboyfile_hard_link와 원본 oldboyfile의 inode 번호가 810403으로 동일하다. 반면 소프트 링크 oldboyfile_soft_link의 inode 번호는 810404로 원본과 다르다.
디렉터리 링크 생성
[root@localhost oldboy]# mkdir oldboydir # 디렉터리 생성
[root@localhost oldboy]# ln oldboydir oldboydir_hard_link
ln: `oldboydir': hard link not allowed for directory # 디렉터리는 하드 링크 생성 불가
[root@localhost oldboy]# ln -s oldboydir oldboydir_soft_link # 소프트 링크는 가능
[root@localhost oldboy]# ls -lirt
total 24
810403 -rw-r--r-- 2 root root 0 May 1 03:43 oldboyfile_hard_link
810403 -rw-r--r-- 2 root root 0 May 1 03:43 oldboyfile
810404 lrwxrwxrwx 1 root root 10 May 1 03:44 oldboyfile_soft_link -> oldboyfile
810405 drwxr-xr-x 2 root root 4096 May 1 03:53 oldboydir
810406 lrwxrwxrwx 1 root root 9 May 1 03:55 oldboydir_soft_link -> oldboydir
ln 명령어로 디렉터리의 하드 링크는 만들 수 없지만, 소프트 링크는 가능하다. 디렉터리 소프트 링크는 실제 운영 환경에서 자주 사용된다.
링크 삭제 시 동작
[root@localhost oldboy]# echo "this is oldboyfile" > oldboyfile
[root@localhost oldboy]# cat oldboyfile
this is oldboyfile
[root@localhost oldboy]# cat oldboyfile_hard_link
this is oldboyfile
[root@localhost oldboy]# cat oldboyfile_soft_link
this is oldboyfile
[root@localhost oldboy]# rm -f oldboyfile # 원본 파일(하나의 하드 링크) 삭제
[root@localhost oldboy]# cat oldboyfile_hard_link
this is oldboyfile # 내용이 여전히 존재함
[root@localhost oldboy]# cat oldboyfile_soft_link
cat: oldboyfile_soft_link: No such file or directory # 소프트 링크는 깨짐
원본 파일을 삭제했지만, 하드 링크가 남아있어 Inode가 해제되지 않았기 때문에 내용이 유지된다. rm 명령어는 단순히 해당 파일 이름과 Inode 간의 연결을 끊는 것일 뿐이다. 반면 소프트 링크는 원본 파일의 경로를 참조하므로, 원본이 사라지면 접근할 수 없다.
링크 요약
파일 링크 정리
- 소프트 링크를 삭제해도 원본 파일이나 하드 링크에는 아무 영향이 없다.
- 하드 링크를 삭제해도 원본 파일이나 소프트 링크에는 아무 영향이 없다.
- 원본 파일을 삭제하면 하드 링크는 그대로 유효하지만, 소프트 링크는 깨져서 사용할 수 없게 된다.
- 원본 파일과 모든 하드 링크를 함께 삭제해야만 파일이 실제로 삭제된다.
- 스토리지 장비의 스냅샷 기능은 이러한 하드 링크의 원리를 사용한다.
디렉터리 링크 정리
- 디렉터리는 하드 링크를 생성할 수 없지만, 소프트 링크는 생성할 수 있다.
- 디렉터리의 소프트 링크는 실무에서 주요하게 활용되는 기법이다.