i-node
i-node(아이노드)는 리눅스에서 파일에 빠르게 접근하기 위한 인덱스 개념입니다. i-node라는 이름도 index-node의 줄임말입니다. 아래는 i-node를 이용한 파일 시스템의 간략한 개념도라고 보시면 좋을 것 같습니다.
아이노드는 전통적인 유닉스 계열 파일 시스템에서 사용하는 자료구조이며 모든 파일과 디렉토리가 고유한 아이노드를 가지고 있습니다. 아이노드를 확인하는 방법은 ls의 -i 옵션을 사용하시면 됩니다.
제가 미리 만들어 둔 심볼릭 링크 파일(소프트 링크 파일)이 보이네요. 맨 왼쪽에 표기된 i-node가 다르다는 점 미리 알 수 있습니다.
i-node가 가리키는 정보
아이노드는 인덱스의 역할도 하고 파일에 대한 정보(메타데이터)도 포함하고 있습니다. 아이노드가 가진 정보는 다음과 같습니다.
- 파일 모드 (접근 권한: chmod로 수정하죠)
- 링크 수
- 소유자명
- 그룹명
- 파일 크기
- 파일 주소
- 마지막 접근 정보
- 마지막 수정 정보
- 아이노드 수정 정보
아이노드의 자세한 구조는 아래와 같습니다. 좀 복잡해 보이지만 우선 왼쪽에 i-node structure만 집중해서 보시면 됩니다.
inode가 인덱스의 역할을 한다고 앞서 말씀드렸습니다. 그럼 데이터에 어떻게 접근하는지 알아볼 차례네요. cat 명령어로 예시를 들어보겠습니다. cat 명령어를 수행하면 다음과 같은 순서로 데이터에 접근합니다.
- i-node에 접근
- 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언어이기 때문에 포인터를 잘 활용했다는 것이 느껴지네요. 덴트리라는 개념도 알게 되었는데 추후에 정리하겠습니다.
'리눅스' 카테고리의 다른 글
리눅스 하드웨어 용량 확인 및 swap 메모리 확보 (0) | 2022.08.19 |
---|---|
표준 입출력 변경과 2>&1 (0) | 2022.08.12 |
리눅스 파일 접근 권한 변경 방법 (0) | 2022.08.11 |
리눅스 우분투 명령어 기본 정리 (0) | 2022.08.08 |
리눅스 포트 확인 (0) | 2022.02.06 |