리눅스

i-node 그리고 하드 링크 파일 vs 소프트 링크 파일(심볼릭 링크 파일)

@xftg77g 2022. 8. 11. 23:29

i-node

i-node(아이노드)는 리눅스에서 파일에 빠르게 접근하기 위한 인덱스 개념입니다. i-node라는 이름도 index-node의 줄임말입니다. 아래는 i-node를 이용한 파일 시스템의 간략한 개념도라고 보시면 좋을 것 같습니다.

아이노드는 전통적인 유닉스 계열 파일 시스템에서 사용하는 자료구조이며 모든 파일과 디렉토리가 고유한 아이노드를 가지고 있습니다. 아이노드를 확인하는 방법은 ls의 -i 옵션을 사용하시면 됩니다.

제가 미리 만들어 둔 심볼릭 링크 파일(소프트 링크 파일)이 보이네요. 맨 왼쪽에 표기된 i-node가 다르다는 점 미리 알 수 있습니다.

i-node가 가리키는 정보

아이노드는 인덱스의 역할도 하고 파일에 대한 정보(메타데이터)도 포함하고 있습니다. 아이노드가 가진 정보는 다음과 같습니다.

  • 파일 모드 (접근 권한: chmod로 수정하죠)
  • 링크 수
  • 소유자명
  • 그룹명
  • 파일 크기
  • 파일 주소
  • 마지막 접근 정보
  • 마지막 수정 정보
  • 아이노드 수정 정보

아이노드의 자세한 구조는 아래와 같습니다. 좀 복잡해 보이지만 우선 왼쪽에 i-node structure만 집중해서 보시면 됩니다.

inode structure

inode가 인덱스의 역할을 한다고 앞서 말씀드렸습니다. 그럼 데이터에 어떻게 접근하는지 알아볼 차례네요. cat 명령어로 예시를 들어보겠습니다. cat 명령어를 수행하면 다음과 같은 순서로 데이터에 접근합니다.

  1. i-node에 접근
  2. Direct Blocks에 접근하여 데이터를 출력한다
참고로 Direct Blocks는 12개의 Block 주소를 가지고 있습니다. 각 Block은 데이터를 저장하며 최대 4KB의 크기를 가집니다.

Direct Blocks는 12개의 Block 주소만을 가질 수 있기 때문에 Direct Blocks만 이용하면 i-node는 최대 48KB의 데이터밖에 가리키질 못하네요. 그렇다고 Direct Block의 크기를 동적으로 늘리는 건 굉장히 비효율적일 겁니다. (동적 할당은 많은 측면에서 관리가 필요하죠)

i-node가 큰 데이터를 가리키는 방법

Direct Blocks로는 큰 데이터를 가리키기에는 부족함이 있습니다. 그래서 이를 Indirect Blocks, Double Indirect, Triple Indirect로 극복합니다. 

  • Indirect Blocks(Single Indirect)는 4KB 공간 안에 1024 개의 Block 주소를 가지고 있고 총 4Byte의 데이터를 가리킬 수 있습니다.
  • 그리고 Double Indirect는 4KB 공간 안에 1024 개의 Indirect Blocks 주소를 가지고 있고 총 4GB의 데이터를 가리킬 수 있죠.
  • 눈치채셨겠지만 Triple Indirect는 4KB 공간 안에 1024개의 Double Indirect 주소를 가지고 있고 매우 큰 데이터를 가리킬 수 있습니다. ㅎㅎ
몇 개의 주소를 가지냐 보다는 어떤 식으로 데이터를 가리키는지 아는 것이 중요한 것 같습니다.

심볼릭 링크 파일

심볼릭 링크 파일은 바로가기 파일이라고 생각하는 게 가장 직관적입니다. 원본 파일에 대한 정보를 포함하지 않으며 원본 파일을 가리키는 역할만 하는 파일이죠. 파일 자체는 원본과 다른 파일이기 때문에 i-node도 다른 것이 당연합니다. 또한 심볼릭 링크 파일은 바로가기 파일이기 때문에 원본 파일이 사라지면 더 이상 데이터를 참조할 수 없습니다.

심볼릭 링크 파일은 ln 명령어의 -s 옵션을 이용하여 생성할 수 있습니다.
ln -s [원본 파일] [링크 파일]

하드 링크 파일

하드 링크 파일은 원본 파일이 가리키는 i-node에 대한 또 다른 포인터라고 보시면 좋을 것 같습니다. 즉 하나의 i-node를 가리키는 또 다른 파일인 셈이죠. 따라서 같은 i-node를 가리키고 같은 데이터를 참조하기 때문에 데이터에 변경이 발생하면 하드 링크 파일에서도 이를 감지할 수 있습니다. 또한 원본 파일이 삭제되어도 하드 링크 파일이 있기 때문에 데이터가 유실될 문제가 없죠. 그래서 백업 용도로 사용됩니다.

하드 링크 파일은 ln 명령어로 생성할 수 있습니다.
ln [원본 파일] [링크 파일]

결론

심볼릭 링크 파일과 하드 링크 파일은 i-node의 개념을 알고 난 뒤에 살펴보면 굉장히 쉬운 개념입니다. i-node는 포인터 개념을 굉장히 잘 활용한 파일 시스템 구조의 핵심 개념이라고 보이고, 결국 근본이 C언어이기 때문에 포인터를 잘 활용했다는 것이 느껴지네요. 덴트리라는 개념도 알게 되었는데 추후에 정리하겠습니다.