하드 링크 vs 심볼릭 링크: 연결의 두 가지 방식
하드 링크와 심볼릭 링크의 inode 수준 차이를 이해하고, ln 명령어로 링크를 생성·관리하며 댕글링 링크 문제를 다루는 방법을 익힌다.
지난 글에서 inode 구조를 살펴봤다. 이번에는 inode 개념을 기반으로 하드 링크와 심볼릭 링크(소프트 링크)의 차이를 파헤친다. 둘 다 ln 명령으로 만들지만 동작 방식이 완전히 다르다. 잘못 사용하면 원본 삭제 후 파일이 사라지거나, 파일시스템 경계에서 동작하지 않는 문제가 생긴다.
하드 링크 — 같은 inode를 가리키는 또 다른 이름
ln original.txt hardlink.txt # 하드 링크 생성
ls -li original.txt hardlink.txt
# 42381 -rw-r--r-- 2 user user 2048 hardlink.txt
# 42381 -rw-r--r-- 2 user user 2048 original.txt
하드 링크는 동일한 inode 번호를 가진다. original.txt와 hardlink.txt는 완전히 동등한 이름이다. 어느 쪽을 수정해도 같은 데이터를 변경하며, 어느 쪽을 삭제해도 inode의 링크 수가 1 감소할 뿐 나머지 이름을 통해 데이터에 계속 접근할 수 있다.
inode의 링크 수가 0이 됐을 때만 실제 데이터가 해제된다.
심볼릭 링크 — 경로 문자열을 저장하는 별도 파일
ln -s /path/to/original.txt symlink.txt # 심볼릭 링크 생성
ls -li symlink.txt original.txt
# 99999 lrwxrwxrwx 1 user user 20 symlink.txt -> /path/to/original.txt
# 42381 -rw-r--r-- 1 user user 2048 original.txt
심볼릭 링크는 자체 inode(#99999)를 가지며, 그 데이터로 대상 경로 문자열을 저장한다. ls -l에서 l로 시작하고 → 경로가 표시된다. 원본 파일이 삭제되면 심볼릭 링크는 존재하지 않는 경로를 가리키는 댕글링 링크(dangling link)가 된다.
링크 생성 실전
# 하드 링크 — 동일 파일시스템, 파일만 가능
ln file.txt file_hard.txt
# 심볼릭 링크 — 절대 경로 권장
ln -s /etc/nginx/nginx.conf ~/nginx.conf
# 디렉터리 심볼릭 링크
ln -s /var/log/nginx ~/nginx-logs
# 심볼릭 링크 덮어쓰기 (-f)
ln -sf /new/target link.txt
# 여러 파일을 디렉터리에 한 번에 링크
ln -s /path/a /path/b /dest/dir/
비교 요약
댕글링 링크 탐지
# 깨진 심볼릭 링크 찾기
find . -type l ! -exec test -e {} \; -print
# -L: 링크가 가리키는 파일의 실제 존재 여부
ls -L symlink.txt # 오류 없으면 링크가 유효
실전 활용 패턴
# 버전 관리 — 현재 버전을 가리키는 심볼릭 링크
ln -s /opt/app-2.1.0 /opt/app-current
# 업그레이드 시: ln -sfn /opt/app-2.2.0 /opt/app-current
# 설정 파일 중앙화
ln -s /shared/config/app.conf /etc/app/app.conf
# 하드 링크로 백업 (스냅샷과 유사)
cp -al /home/user/data /backup/data-snapshot
# cp -al: 파일을 하드 링크로 복사 → 변경 전까지 추가 공간 0
cp -al은 수정하기 전까지 원본과 디스크 공간을 공유하는 증분 백업 방식으로, rsnapshot 같은 도구가 이 원리를 사용한다.
readlink — 링크 대상 확인
readlink symlink.txt # 저장된 경로 출력
readlink -f symlink.txt # 최종 절대 경로 (모든 링크 해석)
readlink -e symlink.txt # 최종 경로 + 존재 여부 확인
스크립트에서 실행 중인 파일의 실제 경로를 얻을 때도 readlink -f "$0"을 자주 쓴다.
지난 글: inode 완전 해부: 파일 시스템의 심장
다음 글: 리눅스 파일 유형 7가지: - d l c b p s
읽어주셔서 감사합니다. 😊