리눅스에서 파일을 실제로 어떻게 관리하느냐
리눅스에서 파일을 하나 만든다고 생각해보자. 사용자는 test.txt 같은 이름으로 파일을 보지만, 리눅스 내부에서는 이 이름을 거의 중요하게 보지 않는다. 파일이 만들어지는 순간, 리눅스는 그 파일에 inode 번호라는 고유한 숫자를 하나 붙인다. 이 숫자가 그 파일의 진짜 신분증이다. 커널과 파일 시스템은 파일 이름이 아니라 이 inode 번호를 기준으로 파일을 찾고, 읽고, 수정하고, 삭제한다. 그래서 같은 이름의 파일은 같은 디렉터리에 두 개 존재할 수 없지만, inode 번호는 파일마다 항상 유일하다.
inode 자체에는 파일의 실제 내용이 들어 있지는 않다. 대신 파일과 관련된 모든 “설명서”가 들어 있다. 예를 들면 파일 크기, 소유자, 권한, 마지막 수정 시간, 이 파일의 실제 데이터가 디스크의 어디에 저장되어 있는지에 대한 위치 정보가 inode에 들어 있다. 즉, inode는 “이 파일이 무엇인지, 어디에 있는지”를 알려주는 구조체라고 이해하면 된다.
inode가 파일의 데이터를 관리하는 방식은 파일이 커질수록 효율적으로 처리하기 위해 단계적으로 구성되어 있다. 작은 파일은 단일 블록만으로 관리하고, 파일이 커지면 간접 블록을 통해 여러 블록을 연결한다. 단일 간접 블록, 이중 간접 블록, 삼중 간접 블록이라는 말은 “파일 크기가 커질수록 한 단계, 두 단계, 세 단계로 연결 구조를 확장한다”는 의미다. 이 덕분에 아주 작은 파일부터 매우 큰 파일까지 같은 구조로 관리할 수 있다.
inode가 중요한 또 하나의 이유는 링크(link) 때문이다. 리눅스에서 링크란 “같은 파일을 다른 이름이나 다른 경로로 접근하게 해주는 방법”이다. 링크에는 심볼릭 링크와 하드 링크가 있다.
심볼릭 링크는 윈도우의 바로가기와 거의 같다. 실제 파일을 가리키는 “경로 정보”만을 담은 파일이라고 보면 된다. 그래서 심볼릭 링크는 원본 파일과는 다른 inode를 가진다. 심볼릭 링크 파일 안에는 “이 파일은 어디에 있는 어떤 파일을 가리킨다”라는 정보만 들어 있다. 따라서 원본 파일을 삭제하면, 심볼릭 링크는 가리킬 대상이 없어져서 깨진 링크가 된다. 길고 복잡한 경로를 짧은 이름으로 쓰고 싶을 때 주로 사용된다.
하드 링크는 성격이 완전히 다르다. 하드 링크는 새로운 파일을 만드는 것처럼 보이지만, 실제로는 같은 inode를 공유하는 또 하나의 이름을 만드는 것이다. 즉, 원본 파일과 하드 링크는 이름만 다를 뿐, 내부적으로는 완전히 같은 파일이다. 그래서 원본 파일을 삭제해도 inode는 남아 있고, 하드 링크를 통해 파일에 계속 접근할 수 있다. 모든 하드 링크가 삭제되어 inode를 가리키는 참조가 하나도 없어질 때, 그제서야 파일 데이터가 디스크에서 사라진다.
정리하면, inode는 리눅스에서 파일의 실체를 대표하는 핵심 구조이고, 파일 이름은 그 inode를 가리키는 하나의 표식일 뿐이다. 심볼릭 링크는 “다른 파일을 가리키는 바로가기”이고, 하드 링크는 “같은 파일에 붙인 또 다른 이름”이다. 이 구조를 이해하면, 리눅스에서 파일 삭제, 복사, 링크 동작이 왜 그렇게 동작하는지 자연스럽게 이해할 수 있다.