파일 이름과 파일의 inode 사이의 관계

파일 이름과 파일의 inode 사이의 관계

파일의 경우 "파일 이름"은 해당 인덱스 노드를 가리킨다고 합니다. 이는 해당 "파일 이름"이 해당 인덱스 노드를 포함하는 데이터 구조이거나 해당 인덱스 노드를 가리키는 포인터라는 의미입니까?

다른 사람들은 "파일 이름"이 문자열이라고 말합니다. 이 문자열이 어딘가(파일에도 있을 수 있음)에 저장되어 있습니까?

이 두 진술은 모순됩니까?

하드 링크는 다른 파일 시스템의 파일에 링크할 수 없지만 소프트 링크는 가능합니다. 파일 이름 포인터는 다른 파일 시스템의 inode를 가리킬 수 없지만 inode에 저장된 포인터는 다른 파일 시스템의 파일 내용을 가리킬 수 있기 때문입니까?

답변1

파일 이름은 디렉토리의 항목입니다. 기본적으로 디렉토리는 두 개의 열로 구성된 열입니다. 여기서 첫 번째 열은 파일 이름이고 두 번째 열은 inode 번호입니다. (최신 파일 시스템에서는 더 복잡하지만 설명을 위해 괜찮습니다.) inode 번호는 inode 테이블을 가리킵니다. 테이블은 사용자 공간 프로세스에 표시되지 않지만 호출을 통해 inode를 쿼리 할 수 있습니다. stat()또는 시스템 호출 lstat(). Inode에는 소유권, 액세스 권한, 액세스, 수정 및 변경 시간 등과 같은 파일의 메타데이터가 포함되어 있습니다. 가장 중요한 점은 inode가 디스크에서 파일을 찾을 위치에 대한 정보를 포함하거나 가리킨다는 것입니다.

또 다른 중요한 항목은 링크 수입니다. inode는 여러 위치에서 가리킬 수 있기 때문입니다.하드 링크. rm를 사용하여(즉, 시스템 호출을 사용하여) 파일을 삭제 하면 unlink()디렉터리에 있는 항목만 삭제되고 inode의 링크 수가 감소합니다. 0에 도달한 경우에만 inode와 관련된 디스크 공간 및 inode 자체가 추가 재사용을 위해 해제됩니다.

따라서 파일 이름은 문자열이고 디렉터리의 데이터 구조를 통해 포인팅이 발생합니다.

하드 링크는 다른 파일 시스템의 파일에 링크할 수 없지만 소프트 링크는 가능합니다. 파일 이름 포인터는 다른 파일 시스템의 inode를 가리킬 수 없지만 inode에 저장된 포인터는 다른 파일 시스템의 파일 내용을 가리킬 수 있기 때문입니까?

각 파일 시스템에는 자체 inode 테이블이 있습니다. inode 테이블의 항목은 "자체" 파일 시스템만 엄격하게 참조할 수 있습니다. 따라서 하드 링크는 파일 시스템 경계를 넘을 수 없습니다.

소프트 링크는 매우 다릅니다. 기본적으로 파일 이름이 포함된 작은 파일입니다. 프로세스가 심볼릭 링크를 열면 시스템은 이를 따르고 해당 파일 이름이 참조하는 파일을 엽니다. 소프트 링크는 경로 이름에만 기반을 두기 때문에 파일 시스템 경계에 의해 제한되지 않습니다.

관련 정보