Hard Link; 하드링크

개념

원본파일과 inode를 공유하는 새로운 파일(엄밀히 말하면 별개의 파일이 아님. 아래에서 설명)

i-node (index node)
파일의 종류 소유주, 권한, 데이터 블록 주소 등이 기록된 구조체.
inode마다 고유번호가 부여됨(= inode 번호).
파일시스템이 inode를 관리하기 때문에, inode 번호는 한 파일시스템 안에서만 고유함.

특징

ℹ️ 원본파일: 하드링크 생성 시의 타겟 파일명
ℹ️ 링크파일: 생성한 하드링크

  • 원본파일과 inode 번호가 같음
  • 원본파일을 삭제해도 링크파일을 통해 데이터 확인 가능
  • 링크파일을 원본파일처럼 다룰 수 있음
  • 디렉터리를 대상으로 생성할 수 없음

하드링크의 핵심

파일마다 생성되는 inode 구조체가 파일의 실체라고 한다면, 파일명은 그저 inode를 부르기 위한 별명일 뿐.

즉, 파일을 생성하면 inode가 생성되는 것이고, 파일(inode)와 파일명은 독립적인 개념인 것.

하드링크는 파일(inode)를 나타내는 또하나의 별명.
즉, 하드링크가 곧 파일명.

원본파일과 복제본파일의 개념이 아닌, 파일의 실체(inode)는 가만히 있고 inode를 부르는 별명(= 파일명 = 하드링크)만 하나 더 늘어나는 것.

디렉터리 엔트리

inode에는 파일명(inode의 별명)을 저장하지 않고, 대신 inode가 참조된 수 (reference count)를 저장함.

ls 명령에 -l 옵션을 넣어서 출력하면, 권한 다음에 오는 숫자가 참조수(=하드링크 개수 = 파일명 개수).
따라서 새 파일을 생성하면 참조수는 기본적으로 1이 됨.

파일명은 '디렉터리 엔트리'라는 이름의 구조체로 저장되는데, 이 디렉터리 엔트리는 디렉터리를 나타내는 '디렉터리 파일'에 저장됨.

ℹ️ 디렉터리 파일
리눅스에서는 일반 파일뿐만 아니라 장치, 네트워크 연결 등 모든 것이 파일로서 관리되며, 디렉터리 또한 예외가 아님.
리눅스를 사용하는 사용자 입장에서는 폴더처럼 보이지만 그 실체는 파일이라는 것.
디렉터리 파일은 한 디렉터리를 표현하는 특수한 파일.

디렉터리 엔트리는 '파일명->inode번호'가 매핑된 형태의 구조체로, 디렉터리 아래 파일이 추가되면 디렉터리 파일에 디렉터리 엔트리가 기록됨.

예를 들어, dir1 디렉터리에 a.txt 파일을 만든다면
a.txt 파일의 inode가 생성되고,
dir1의 디렉터리 파일에 'a.txt->inode번호'가 기록됨.

여기서 ln a.txt b.txt 명령으로 b.txt라는 하드링크를 생성하면

  1. inode의 reference count를 1 증가시키고
  2. dir1의 디렉터리 파일에 'b.txt->inode번호'가 추가로 기록됨.

rm 명령어 동작 원리

rm a.txt 명령으로 앞서 예시로 든 a.txt를 삭제한다면, 내부적으로 다음과 같이 동작함.

  1. dir1의 디렉터리 파일에서 'a.txt->inode번호'라는 디렉터리 엔트리를 삭제
  2. inode의 참조수(reference count)를 -1 감소
  3. 더이상 참조하지 않는 inode라면(= 참조수가 0이라면), 데이터 블록을 해제하고 inode를 삭제

이 때문에, 원본파일을 삭제해도 링크파일을 통해 데이터를 확인할 수 있는 것.

velog에 작성한 내용을 tistory로 이전
최초 작성일: 2025.01.09
원본링크

'Linux' 카테고리의 다른 글

[Linux] sudo 파헤치기  (0) 2026.01.20
안쓰는 디스크를 리눅스 NFS로 사용하기: Ubuntu 24.04  (0) 2025.10.07