ln -s와 ln, 둘 다 "링크를 만든다"고 하는데 동작이 다릅니다. 이 차이가 헷갈리는 건 inode라는 한 단계를 건너뛰기 때문입니다. inode만 잡으면 나머지는 저절로 풀립니다.
inode부터: 파일 이름과 실체는 다르다
리눅스에서 파일의 실체(데이터·권한·크기)는 inode라는 번호표가 가리키고, 우리가 보는 파일 "이름"은 그 inode를 가리키는 라벨일 뿐입니다.
- 하드 링크는 같은 inode를 가리키는 또 다른 이름입니다. 원본과 완전히 동등한 출입구라, 둘 중 무엇을 지워도 데이터는 다른 이름이 남아 있는 한 살아 있습니다.
- 심볼릭 링크는 "저 경로로 가보라"는 경로 문자열을 담은 별도 파일입니다. 원본을 지우면 가리킬 곳이 없어져 깨진 링크(dangling)가 됩니다.
| 구분 | 하드 링크 | 심볼릭 링크 |
|---|---|---|
| 가리키는 것 | 같은 inode | 경로(이름) |
| 원본 삭제 시 | 데이터 유지 | 깨짐 |
| 다른 파일시스템 | 불가 (같은 inode 영역) | 가능 |
| 디렉터리 대상 | 보통 불가 | 가능 |
| 생성 명령 | ln 원본 링크 | ln -s 원본 링크 |
직접 확인하기
ls -li의 맨 앞 숫자가 inode 번호입니다.
로컬 터미널
echo data > original.txt
ln original.txt hard.txt # 하드 링크
ln -s original.txt soft.txt # 심볼릭 링크
ls -li
OUTPUT
131072 -rw-r--r-- 2 user user 5 original.txt
131072 -rw-r--r-- 2 user user 5 hard.txt
131099 lrwxrwxrwx 1 user user 12 soft.txt -> original.txt
original.txt와 hard.txt는 inode가 131072로 같고 링크 수가 2입니다(같은 실체를 가리키는 이름 2개). soft.txt는 inode가 다르고 타입이 l, 화살표로 원본 경로를 보여줍니다. 이제 원본을 지워보면:
로컬 터미널
rm original.txt
cat hard.txt # 정상 출력 (data)
cat soft.txt # No such file or directory (깨짐)
언제 무엇을 쓰나
- 심볼릭 링크: 일상 대부분의 선택. 다른 디스크·디렉터리를 가리키거나, 버전 디렉터리를
current ->로 바꿔치기하는 배포 패턴에 적합. - 하드 링크: 같은 파일시스템 안에서 데이터 복제 없이 같은 실체를 여러 이름으로 두고 싶을 때(백업 스냅샷, 중복 제거).
요점 정리
- 핵심은 하드=같은 inode, 심볼릭=경로를 담은 파일.
- 원본 삭제 시: 하드는 살아남고, 심볼릭은 깨진다.
- 파일시스템을 넘거나 디렉터리를 가리켜야 하면 심볼릭만 가능.
ls -li의 inode 번호와 링크 수로 둘을 즉시 구분하세요.
inode·링크·파일시스템 구조를 직접 만들어보며 익히는 실습은 리눅스 트랙에서 회원가입 없이 무료로 할 수 있습니다.