Linux 강좌 / 하드 링크와 심볼릭 링크 이해하기 - 차이와 생성 실습
리눅스의 하드 링크는 기존 파일과 같은 inode를 가리키는 또 하나의 이름이고, 심볼릭 링크는 다른 경로를 적어 둔 별도 파일입니다. 두 방식 모두 다른 이름으로 파일에 접근하게 해 주지만, 원래 이름을 바꾸거나 파일 시스템 경계를 넘을 때 결과가 다릅니다. 이 강좌에서는 실습 파일을 만들어 차이를 직접 확인합니다.
링크를 이해하는 데 필요한 두 개념
디렉터리에 보이는 report.txt 같은 이름은 파일을 찾는 경로의 일부입니다. 파일 시스템은 파일의 메타데이터를 inode로 관리합니다. 하드 링크를 추가하면 같은 inode를 가리키는 이름이 하나 더 생깁니다. 따라서 두 이름 중 하나를 지워도 다른 이름이 남아 있으면 파일에 접근할 수 있습니다.
심볼릭 링크는 대상의 경로 문자열을 담는 별도 항목입니다. 대상을 열 때 그 경로를 따라갑니다. 링크가 가리키는 이름이 없어지거나 위치가 바뀌면 링크는 남아 있어도 대상에 접근하지 못할 수 있습니다. 이를 끊어진 링크라고 합니다.
| 비교 기준 | 하드 링크 | 심볼릭 링크 |
|---|---|---|
| 대상이 되는 것 | 같은 파일의 inode | 대상 경로 문자열 |
| inode | 원래 이름과 같음 | 링크 자체의 inode가 따로 있음 |
| 원래 이름 삭제·변경 | 다른 이름으로 계속 접근 가능 | 기록된 경로가 사라지면 끊어질 수 있음 |
| 다른 파일 시스템 | 경계를 넘을 수 없음 | 다른 파일 시스템의 경로를 가리킬 수 있음 |
| 디렉터리 연결 | 일반적으로 만들 수 없음 | 만들 수 있음 |
실습용 파일과 두 링크 만들기
실습은 홈 디렉터리 안의 새 폴더에서 진행합니다. ~/linux-course-09-practice가 이미 있다면 이름을 바꿔 새 폴더를 정하세요. 기존 폴더가 있으면 아래 mkdir는 실패합니다. 그 상태에서 뒤의 명령을 계속 실행하면 기존 파일을 덮어쓸 수 있으므로 반드시 중단해야 합니다.
mkdir ~/linux-course-09-practice cd ~/linux-course-09-practice pwd
pwd가 방금 만든 실습 폴더를 가리키는지 확인한 뒤에만 파일을 만드세요. 아래의 printf는 original.txt에 한 줄을 씁니다.
printf 'version 1\n' > original.txt ln original.txt hard.txt ln -s original.txt shortcut.txt
첫 번째 ln은 기본 동작인 하드 링크를, -s를 붙인 두 번째 명령은 심볼릭 링크를 만듭니다. shortcut.txt에는 original.txt라는 상대 경로가 기록됩니다. 이 경로는 현재 셸의 위치가 아니라 링크가 놓인 디렉터리를 기준으로 해석됩니다.
inode와 링크 대상 확인하기
GNU stat으로 inode 번호(%i)와 하드 링크 수(%h)를 확인해 보세요. readlink는 심볼릭 링크에 기록된 경로를 보여 줍니다.
stat -c '%i %h %n' original.txt hard.txt shortcut.txt readlink shortcut.txt
inode 숫자 자체는 시스템마다 다르지만, 아래처럼 original.txt와 hard.txt의 inode 번호는 같고 링크 수는 2로 나타납니다. shortcut.txt는 별도 inode를 사용합니다.
123456 2 original.txt 123456 2 hard.txt 789012 1 shortcut.txt original.txt
예시 숫자는 설명용입니다. 파일 시스템과 환경에 따라 실제 값이 다릅니다. readlink가 출력한 상대 경로 original.txt는 링크가 있는 폴더 안에서 해석되므로, 세 이름 모두 지금은 같은 내용을 읽을 수 있습니다.
cat original.txt cat hard.txt cat shortcut.txt
각 명령은 version 1을 출력합니다. 하지만 같은 내용을 보여 준다고 해서 세 이름의 구조가 동일한 것은 아닙니다.
원래 이름을 바꾸면 어떻게 될까요?
실습 폴더 안에서 original.txt의 이름을 바꿔 보세요. hard.txt는 같은 inode를 가리키므로 그대로 읽힙니다. 반면 shortcut.txt는 여전히 예전 경로 original.txt를 가리켜 끊어집니다.
mv original.txt renamed.txt cat hard.txt readlink shortcut.txt
cat hard.txt는 version 1을 출력하고, readlink shortcut.txt는 여전히 original.txt를 출력합니다. 이 상태에서 cat shortcut.txt를 실행하면 대상이 없다는 오류가 나는 것이 예상된 결과입니다. 같은 폴더에 새 이름을 가리키는 링크가 필요하다면 ln -s renamed.txt new-shortcut.txt처럼 새 링크를 만들 수 있습니다.
심볼릭 링크를 지울 때 rm shortcut.txt는 일반적으로 링크 자체를 지우며 대상 파일을 지우지 않습니다. 다만 경로 끝에 슬래시를 붙이거나 링크가 가리키는 디렉터리 안의 파일을 대상으로 명령을 실행하면 의미가 달라질 수 있으므로, 삭제 전에 대상 경로를 확인하세요.
어느 링크를 선택할까요?
같은 파일 시스템 안에서 기존 파일에 또 하나의 이름을 주고, 어느 한 이름이 사라져도 다른 이름으로 계속 접근하려면 하드 링크가 적합합니다. 다른 디렉터리·파일 시스템의 경로나 디렉터리를 가리키고, 링크가 어디로 향하는지 경로로 드러내고 싶다면 심볼릭 링크가 더 유연합니다. 심볼릭 링크를 이동하거나 대상을 이름 변경할 계획이 있다면 상대 경로가 링크 위치를 기준으로 해석된다는 점을 먼저 확인해야 합니다.
ln의 옵션과 링크 생성 시 목적지 해석은 ln 명령어 상세 설명, 링크의 저장된 경로와 해석 결과는 readlink 명령어 상세 설명에서 더 살펴볼 수 있습니다.
공식 문서
하드 링크와 심볼릭 링크의 동작은 GNU Coreutils의 ln 문서를, readlink의 출력 방식은 GNU readlink 문서를 참고했습니다.









