리눅스에서는 시스템의 일관성을 유지하기 위해 모든 것을 파일로 취급합니다. 하드웨어 장치, 프린터, 디렉터리, 프로세스까지 모두 파일로 간주됩니다. 음악, 텍스트, 영상 등 일반적인 멀티미디어 파일 역시 메타데이터라고 불리는 추가 정보를 함께 가지고 있습니다.
그렇다면 리눅스에서 아이노드(Inode)란 무엇일까요? 아이노드 항목은 리눅스 파일 시스템의 기본 토대입니다. 파일에 대한 메타데이터를 관리하며, 리눅스 내부 동작 방식에서 없어서는 안 될 핵심 요소입니다.
파일 시스템의 구조란?
파일 시스템은 크게 두 부분으로 나뉩니다. 바로 데이터 블록(data block)과 아이노드(inode)입니다. 블록의 수는 파일 시스템을 생성하는 시점에 고정되며, 이후에는 변경할 수 없습니다.
흥미로운 점은 파일의 이름, 경로, 위치, 링크 등 다양한 속성이 실제 디렉터리 안에 저장되지 않는다는 사실입니다. 디렉터리는 단지 파일 이름과 그에 대응하는 아이노드 번호를 담고 있는 하나의 테이블일 뿐입니다.
하드 링크(hard link)를 생성하면 같은 파일에 여러 개의 이름을 붙일 수 있습니다. 하드 링크를 만들면 새로운 이름 항목이 디렉터리 테이블에 추가되지만, 실제 파일이 이동하지는 않습니다.
만약 용량이 큰 파일을 이동시킨다면 상당한 시간이 걸릴 수 있습니다. 따라서 새 디렉터리에 이름 항목을 생성하고 기존 항목을 삭제하는 방식이 훨씬 효율적입니다. 파일 이름 변경도 같은 원리로 처리됩니다.
계층 구조의 최상위에는 파일 시스템 자체가 위치합니다. 그 안에 파일 이름들이 있고, 파일 이름은 아이노드와 연결되며, 아이노드는 다시 물리적인 데이터와 연결됩니다.
리눅스에서 아이노드(Inode)란 무엇인가?
아이노드는 하나의 데이터 구조입니다. 파일 시스템상의 파일이나 디렉터리를 정의하며, 디렉터리 항목에 저장됩니다. 아이노드는 파일을 구성하는 데이터 블록들을 가리키고, 파일을 읽는 데 필요한 모든 관리 정보를 포함합니다. 즉, 모든 파일의 메타데이터는 테이블 형태의 아이노드에 저장되는 것입니다.
프로그램이 파일을 이름으로 참조할 때, 시스템은 해당 파일이 존재하는 디렉터리 항목에서 대응하는 아이노드를 찾아냅니다. 이를 통해 시스템은 프로세스나 작업을 수행하는 데 필요한 파일 데이터와 정보를 얻게 됩니다.
아이노드는 보통 파티션의 시작 부분 근처에 위치합니다. 아이노드에는 파일 이름과 실제 데이터를 제외한 나머지 모든 정보가 저장됩니다. 리눅스 디렉터리 내의 모든 파일은 파일 이름과 아이노드 번호를 가지며, 사용자는 아이노드 번호를 참조해 해당 파일의 메타데이터를 조회할 수 있습니다.
파일 이름과 아이노드 번호는 별도의 인덱스에 저장되어 아이노드와 연결됩니다. 덕분에 하나의 데이터(아이노드)에 여러 개의 파일 이름이 연결될 수 있으며, 아래 이미지에서 그 예를 확인할 수 있습니다.
아이노드 번호란 무엇인가?
리눅스 구조에서 모든 아이노드는 고유한 번호를 가집니다. 이를 인덱스 번호(index number)라고도 부르며, 다음과 같은 속성들이 포함됩니다.
- 파일 크기
- 소유자
- 생성 및 수정 날짜/시간
- 권한 및 접근 제어 정보
- 디스크상의 위치
- 파일 유형
- 링크 수
- 기타 파일 관련 메타데이터
아이노드 번호 목록을 확인하려면 다음 명령어를 사용하세요.
ls -i
아래 스크린샷은 디렉터리 목록에서 가장 왼쪽 열에 아이노드 번호가 표시된 모습입니다.
아이노드는 어떻게 작동할까?
새 파일을 생성하면 해당 파일에는 파일 이름과 아이노드 번호가 할당되고, 두 정보는 디렉터리에 항목으로 저장됩니다. ls -li 명령을 실행하면 디렉터리에 저장된 파일 이름과 아이노드 번호 목록을 확인할 수 있습니다.
각 파일 시스템별 아이노드 정보를 확인하려면 아래 명령어를 사용하세요.
df -hi
내가 사용 중인 아이노드 수는 얼마나 될까?
파일 시스템의 공간이 부족해지는 원인 중 하나는 아이노드를 모두 소진하는 경우입니다. 디스크에 충분한 빈 공간이 남아 있더라도, 아이노드가 고갈되면 새 파일을 생성할 수 없습니다.
심한 경우 아이노드 고갈로 인해 시스템이 갑자기 멈출 수도 있습니다. 사용 중, 사용 가능, 사용률(%) 등 아이노드 사용 통계를 확인하려면 다음 명령어를 입력하세요.
sudo df -ih
아이노드가 활용되는 또 다른 방식들
리눅스에서 아이노드가 작동하는 방식 때문에 서로 충돌하는 아이노드 번호가 발생하는 일은 불가능합니다. 또한 서로 다른 파일 시스템 간에는 하드 링크를 생성할 수 없지만, 소프트 링크(soft link)는 파일 시스템이 달라도 사용할 수 있습니다. 한 가지 흥미로운 특징은, 원본 파일을 삭제하더라도 하드 링크를 통해 데이터에 계속 접근할 수 있다는 점입니다.
파일을 삭제한다는 것은 사실 특정 아이노드 번호를 가리키던 이름 중 하나를 제거하는 것에 불과합니다. 같은 아이노드 번호와 연결된 모든 이름이 삭제되기 전까지는 데이터가 그대로 유지됩니다. 리눅스 시스템이 재부팅 없이 업데이트를 진행할 수 있는 것도 크게 아이노드의 이러한 작동 방식 덕분입니다.
예를 들어, 한 프로세스가 라이브러리 파일을 사용하고 있는 도중에 다른 프로세스가 해당 파일을 새 버전으로 교체하여 새로운 아이노드를 생성했다고 가정해 봅시다. 이때 실행 중인 프로세스는 계속 기존 파일을 사용하며, 다음에 동일한 프로세스를 실행할 때 비로소 새 버전이 적용됩니다.
사용자가 아이노드와 직접 상호작용하는 일은 드물지만, 아이노드는 리눅스 파일 구조를 떠받치는 근본적인 핵심 요소라는 사실을 기억해 두시기 바랍니다.