Inode는 Linux 시스템에서 중요한 데이터 구조로 파일 유형, 크기, 권한, 타임스탬프, 링크 수, 데이터 블록 위치 등과 같은 파일 메타데이터를 저장하는 데 사용됩니다. Inode는 파일 시스템의 핵심 구성 요소로 파일 생성, 삭제, 수정, 검색 및 기타 작업에 사용할 수 있습니다. 이번 글에서는 아이노드 번호 매기기, 할당, 해제, 검색, 인덱싱 등 아이노드의 원리와 특징을 소개하고, 사용법과 주의사항 등을 예시로 제시한다.
파일 이름 -> inode -> 장치 블록
inode에 대한 이해는 파일 저장부터 시작됩니다.
파일은 하드디스크에 저장됩니다. 하드디스크의 가장 작은 저장 단위를 "섹터"라고 합니다. 각 섹터는 512바이트(0.5KB에 해당)를 저장합니다.
운영 체제는 하드 디스크를 읽을 때 섹터 단위로 읽지 않으며 이는 너무 비효율적입니다. 대신 한 번에 여러 섹터를 연속해서 읽습니다. 즉, 한 번에 하나의 "블록"을 읽습니다. 여러 섹터로 구성된 이 "블록"은 파일 액세스의 가장 작은 단위입니다. "블록"의 가장 일반적인 크기는 4KB입니다. 즉, 8개의 연속 섹터가 하나의 블록을 형성합니다.
파일 데이터는 "블록"에 저장되므로 파일 작성자, 파일 생성 날짜, 파일 크기 등과 같은 파일의 메타 정보를 저장할 장소도 찾아야 합니다. . 파일 메타 정보를 저장하는 이 영역을 inode라고 하며 중국어로 번역하면 "index node"입니다.
inode에는 파일의 메타 정보, 특히 다음 내용이 포함되어 있습니다.
* 파일의 바이트 수
* 파일 소유자의 사용자 ID
* 파일의 그룹 ID
* 파일 읽기, 쓰기 및 실행 권한
* 파일에는 세 가지 타임스탬프가 있습니다. ctime은 inode가 마지막으로 변경된 시간을 나타내고, mtime은 파일 내용이 마지막으로 변경된 시간을 나타내며, atime은 파일이 마지막으로 열린 시간을 나타냅니다.
* 링크 수, 즉 이 inode를 가리키는 파일 이름의 수
* 파일 데이터 블록의 위치
stat 명령을 사용하여 특정 파일의 inode 정보를 볼 수 있습니다.
stat example.txt
간단히 말하면 파일명을 제외한 모든 파일 정보는 아이노드에 저장됩니다. 파일명이 없는 이유에 대해서는 아래에서 자세한 설명을 하도록 하겠습니다.
Inode도 하드디스크 공간을 소모하기 때문에 하드디스크를 포맷하면 운영체제가 자동으로 하드디스크를 두 영역으로 나눈다. 하나는 파일 데이터를 저장하는 데이터 영역이고, 다른 하나는 아이노드에 포함된 정보를 저장하는 아이노드 영역(아이노드 테이블)입니다.
각 inode 노드의 크기는 일반적으로 128바이트 또는 256바이트입니다. inode 노드의 총 개수는 포맷 중에 제공되며 일반적으로 1KB 또는 2KB마다 하나의 inode가 설정됩니다. 1GB 하드디스크에서 각 아이노드 노드의 크기가 128바이트이고, 1KB마다 하나의 아이노드가 설정된다고 가정하면, 아이노드 테이블의 크기는 128MB에 달해 전체 하드디스크의 12.8%를 차지하게 된다.
총 inode 수와 각 하드 디스크 파티션의 사용된 수를 보려면 df 명령을 사용할 수 있습니다.
df -i
각 inode 노드의 크기를 보려면 다음 명령을 사용할 수 있습니다.
sudo dumpe2fs -h /dev/hda | grep “Inode 크기”
각 파일마다 아이노드가 있어야 하기 때문에 아이노드를 다 써도 하드디스크가 꽉 차지 않는 경우가 발생할 수 있습니다. 현재로서는 하드 드라이브에 새 파일을 생성할 수 없습니다.
각 inode에는 번호가 있으며 운영 체제는 inode 번호를 사용하여 다른 파일을 식별합니다.
여기서 반복할 가치가 있습니다. Unix/Linux 시스템은 내부적으로 파일 이름을 사용하지 않지만 파일을 식별하기 위해 inode 번호를 사용합니다. 시스템의 경우 파일 이름은 쉽게 식별할 수 있도록 inode 번호에 대한 별칭 또는 별명입니다. 표면적으로 사용자는 파일 이름으로 파일을 엽니다. 실제로 시스템 내에서 이 프로세스는 세 단계로 나뉩니다. 먼저 시스템은 파일 이름에 해당하는 inode 번호를 찾습니다. 두 번째는 inode 번호를 통해 inode 정보를 얻습니다. 파일 데이터가 있는 블록을 찾아서 데이터를 읽어옵니다.
ls -i 명령을 사용하여 파일 이름에 해당하는 inode 번호를 확인하세요.
ls -i example.txt
Unix/Linux 시스템에서는 디렉토리도 일종의 파일입니다. 디렉토리를 여는 것은 실제로 디렉토리 파일을 여는 것을 의미합니다.
디렉토리 파일의 구조는 매우 간단하며 일련의 디렉터리 항목(dirent) 목록입니다. 각 디렉토리 항목은 포함된 파일의 파일 이름과 파일 이름에 해당하는 inode 번호의 두 부분으로 구성됩니다.
ls 명령은 디렉터리 파일의 모든 파일 이름만 나열합니다.
ls /etc
ls -i 명령은 전체 디렉토리 파일(예: 파일 이름 및 inode 번호)을 나열합니다.
ls -i /etc
파일의 자세한 정보를 보려면 inode 노드에 접속하여 inode 번호에 따라 정보를 읽어야 합니다. ls -l 명령은 파일에 대한 자세한 정보를 나열합니다.
ls -l /etc
일반적으로 파일 이름과 inode 번호는 "일대일 대응" 관계를 가지며, 각 inode 번호는 파일 이름에 해당합니다. 그러나 Unix/Linux 시스템에서는 여러 파일 이름이 동일한 inode 번호를 가리키는 것을 허용합니다. 이는 동일한 콘텐츠가 다른 파일 이름으로 액세스될 수 있음을 의미합니다. 파일 콘텐츠를 수정하면 모든 파일 이름에 영향을 주지만 하나의 파일 이름을 삭제해도 다른 파일 이름에 대한 액세스에는 영향이 없습니다. 이러한 상황을 "하드 링크"라고 합니다.
ln 명령은 하드 링크를 생성할 수 있습니다:
ln 소스 파일 대상 파일
위 명령을 실행한 후 소스 파일과 대상 파일의 inode 번호가 동일하고 동일한 inode를 가리킵니다. inode 정보에는 "링크 수"라는 항목이 있는데, 이는 해당 inode를 가리키는 파일 이름의 총 개수를 기록하며 1씩 증가합니다. 반대로, 파일 이름을 삭제하면 inode 노드의 "링크 수"가 1씩 감소합니다. 이 값이 0으로 감소하면(이 inode를 가리키는 파일 이름이 없음을 나타냄) 시스템은 inode 번호와 해당 블록 영역을 재활용합니다.
그런데, 디렉터리 파일의 "링크 수"에 대해 이야기해 보겠습니다. 디렉토리를 생성할 때 기본적으로 "."와 ".."라는 두 개의 디렉토리 항목이 생성됩니다. 전자의 inode 번호는 현재 디렉터리의 "하드 링크"와 동일한 현재 디렉터리의 inode 번호입니다. 후자의 inode 번호는 현재 디렉터리의 상위 디렉터리의 inode 번호입니다. 상위 디렉토리의 "하드 링크"와 동일합니다. 따라서 모든 디렉터리의 총 "하드 링크" 수는 항상 2에 해당 하위 디렉터리(숨겨진 디렉터리 포함)의 총 수를 더한 것과 같습니다. 여기서 2는 상위 디렉터리의 "하드 링크"와 "하드 링크"입니다. 현재 디렉토리의 ".
하드링크 외에도 특별한 경우가 있습니다. 파일 A와 파일 B의 inode 번호는 다르지만 파일 A의 내용은 파일 B의 경로입니다. 파일 A를 읽을 때 시스템은 자동으로 방문자를 파일 B로 연결합니다. 따라서 어떤 파일을 열어도 최종적으로는 B 파일을 읽게 됩니다. 이때 파일 A를 파일 B의 "소프트 링크" 또는 "심볼릭 링크"라고 합니다.
이는 파일 A가 파일 B에 의존하여 존재한다는 것을 의미합니다. 파일 B가 삭제되면 파일 A를 열 때 "해당 파일이나 디렉터리가 없습니다"라는 오류가 보고됩니다. 이것이 소프트 링크와 하드 링크의 가장 큰 차이점입니다. 파일 A는 파일 B의 inode 번호가 아니라 파일 B의 파일 이름을 가리킵니다. 결과적으로 파일 B의 inode "링크 번호"는 변경되지 않습니다.
ln -s 명령은 소프트 링크를 생성할 수 있습니다.
ln -s 소스 파일 또는 디렉터리 대상 파일 또는 디렉터리
inode 번호와 파일 이름이 분리되어 있기 때문에 이 메커니즘은 Unix/Linux 시스템에 고유한 몇 가지 현상을 발생시킵니다.
1. 파일명에 특수문자가 포함되어 정상적으로 삭제되지 않는 경우가 있습니다. 이때, inode 노드를 직접 삭제하면 파일을 삭제하는 역할을 할 수 있다.
2. 파일을 이동하거나 파일 이름을 바꾸면 파일 이름만 변경되며 inode 번호에는 영향을 주지 않습니다.
3. 파일을 연 후 시스템은 inode 번호를 기준으로 파일을 식별하고 더 이상 파일 이름을 고려하지 않습니다. 따라서 일반적으로 시스템은 inode 번호에서 파일 이름을 알 수 없습니다.
Point 3을 사용하면 소프트웨어 업데이트가 간단해지며, 소프트웨어를 닫거나 다시 시작하지 않고도 업데이트할 수 있습니다. 시스템은 파일 이름이 아닌 inode 번호를 통해 실행 중인 파일을 식별하기 때문입니다. 업데이트할 때 파일의 새 버전은 동일한 파일 이름을 가진 새 inode를 생성하며 이는 실행 중인 파일에 영향을 주지 않습니다. 다음에 이 소프트웨어를 실행할 때 파일 이름은 자동으로 파일의 새 버전을 가리키며 파일의 이전 버전의 inode는 재활용됩니다.
9가지 실용적인 질문
구성이 낮은(소형 메모리 및 하드 디스크) Linux 서버의 /data 파티션에 파일을 생성할 때 시스템에서 디스크 공간이 부족하다는 메시지를 표시하여 디스크 사용량을 확인했습니다. /data 파티션은 66%에 도달했지만 여전히 12G의 남은 공간이 있으므로 이 문제가 발생하지 않을 것입니다. 나중에 df -i를 사용하여 /data 파티션의 인덱스 노드(inode)를 확인한 결과 꽉 차서(IUsed=100%) 시스템이 새 디렉터리와 파일을 생성할 수 없게 되는 것을 발견했습니다.
이유 찾기:
/data/cache 디렉터리에는 매우 많은 수의 작은 바이트 캐시 파일이 있는데, 이는 블록을 많이 차지하지 않지만 많은 수의 inode를 차지합니다.
해결책:
1. /data/cache 디렉터리에서 일부 파일을 삭제하고 /data 파티션에서 일부 inode를 해제합니다.
2. 소프트 연결을 사용하여 자유 파티션 /opt의 newcache 디렉터리를 /data/cache에 연결하고 /opt 파티션의 inode를 사용하여 /data 파티션의 inode 부족 문제를 완화합니다.
ln -s /opt/newcache /data/cache
이 글을 통해 파일을 관리하고 운영하는데 사용할 수 있는 inode의 원리와 특징을 이해했습니다. 실제 요구 사항에 따라 적절한 파일 시스템을 선택하고 inode 소진 방지, 정기적인 inode 상태 확인, 하드 링크 또는 소프트 링크 사용 등과 같은 몇 가지 기본 원칙을 따라야 합니다. Inode는 Linux 시스템의 가장 기본적인 개념 중 하나이며 파일을 추상화하고 캡슐화할 수 있으며 파일 시스템의 성능과 안정성을 향상시킬 수도 있습니다. 이 글이 여러분에게 도움이 되고 영감을 줄 수 있기를 바랍니다.
위 내용은 Linux 시스템의 파일 메타데이터: inode 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!