find -inum이 전체 파일 시스템 트리를 탐색하는 이유는 무엇입니까?

find -inum이 전체 파일 시스템 트리를 탐색하는 이유는 무엇입니까?

간단한 작업을 수행했을 때 전체 파일 시스템을 반복/탐색하는 것을 보고 놀랐습니다.

find -inum 12345

배경 정보가 없으면 이 특정 inode 12345(단지 자리 표시자임)가 있는 모든 파일을 더 쉽게 알 수 있는 방법이 있어야 할 것 같습니다.

더 좋은 방법이 있나요? 파일 시스템의 전체 디렉토리 구조를 확인하는 대신 어떤 파일 이름이 inode와 관련되어 있는지 확인하십시오.

고쳐 쓰다

이 문제를 해결할 수 있는 또 다른 질문이 있습니다. 특정 inode 번호에 속하는 파일을 빠르게 찾습니다. 하지만 목표는 더 나은(더 빠른 방법)을 찾는 것입니다.

더 직접적인 질문은 왜 그런 문제가 발생하는지 아는 것입니다. 아마도 권한 등과 관련된 타당한 이유가 있을 수 있습니다. 이는 의도적으로 사용자가 inode의 모든 파일 이름을 찾기 위해 디렉토리 구조를 탐색하는 것을 피하기 어렵게 만들려는 것입니다.

그럼에도 불구하고 모든 파일 시스템에서 inode(적어도 권한이 있는 사용자에게)에게 모든 파일 이름을 알려주는 데 문제가 있다는 root것은 이상해 보입니다.

이 질문에 가장 답하고 싶은 파일 시스템은 (중요하다면) ext4입니다.

답변1

아주 간단한 이유는 최소한 ext2/ext3/ext4 유형의 파일 시스템의 경우 파일 이름이 전달되기 때문입니다.디렉토리 항목데이터는 디렉토리형 파일에 저장됩니다.

이는 유형 디렉토리의 해당 파일이 (디렉토리 내 파일의) 파일 이름과 해당 파일로 연결되는 데이터의 inode를 저장하기 위한 다소 복잡한 시스템을 가지고 있음을 의미합니다.

약간 단순화되었습니다(ext3/4는 해시 테이블 향상을 사용하여 디렉토리 트리 탐색 속도를 높이는 등...). 다음과 같은 목록처럼 보입니다.

## filenames ##    ## inode-numbers ##
filename1            0123
filename2            01242
anotherfilename      3313
yetanotherfilename   11233

기본적으로 파일 이름디렉터리 파일과 관련된 데이터 내에서만 발생하며메타데이터 어디에도 저장되지 않음파일 시스템 스토리지/의 인덱스 노드에 대해. 따라서 inode 번호와 연관된 파일 이름을 얻는 유일한 방법은 모든 디렉터리 파일에 대한 모든 디렉터리 항목을 반복하는 것입니다.

답변2

당신은 다음과 같이 썼습니다:

간단한 find -inum 12345를 수행했을 때 find가 전체 파일 시스템을 반복/탐색한다는 사실에 놀랐습니다.

find정의에 따르면 트리가 지정된 디렉터리에서 시작하여 탐색되더라도 기본 시작 디렉터리는 입니다 ..

find -inum 12345전체 디렉토리 트리는 현재 작업 디렉토리부터 시작하여 탐색됩니다. .파일 시스템 마운트 지점이 포함되어 있지 않으면 전체 파일 시스템을 탐색할 수 없습니다 .

fsdb주어진 inode 번호 와 연결된 답변에서 debugfs모든 파일을 찾는 더 효율적인 방법이 있지만 트리 순회를 수행해야 합니다.ncheckfind기준. 찾고 있는 인덱스 노드에 링크가 하나만 있는 경우 첫 번째 일치 후 트리 순회를 종료하는 find옵션 (지원되는 경우)을 제공할 수 있습니다.-quit

다른 명령도 항상 빠른 것은 아닙니다. 부분적으로는 디렉터리 트리뿐만 아니라 전체 파일 시스템을 확인해야 하지만 데이터를 사용 가능하게 활용하기 위해 최선을 다하기 때문입니다. 기본적인 문제는 대부분의 Unix 파일 시스템의 구조입니다.

  • 파일의 inode에는 많은 정보가 있지만 "파일의 이름이나 제목"과 "파일을 포함하는 디렉터리 또는 디렉터리"는 여기에 포함되지 않습니다.
  • 대부분의 Unix 파일 시스템의 디렉토리 구조는 매우 간단합니다. 여기에는 항목 목록만 포함되어 있으며 각 항목은 (인덱스 노드 번호, 파일 이름) 쌍입니다.
  • inode 12345를 포함하는 디렉토리와 해당 디렉토리가 이를 참조하는 이름을 찾으려면 대부분의 Unix 파일 시스템에서 이 명령은 일치하는 모든 항목을 찾을 때까지 파일 시스템의 모든 디렉토리에 있는 모든 항목을 검색해야 합니다. 파일 아이노드하다이를 참조하는 디렉터리 항목 수를 포함하므로 많은 항목을 찾는 즉시 검색을 중지할 수 있습니다.
  • 대조적으로, 디렉토리 이름을 찾는 것은 각 디렉토리에 상위 디렉토리의 inode 번호가 포함되어 있으므로 ..일치하는 항목을 찾기 위해 하나의 디렉토리만 검색하면 되기 때문에 훨씬 더 효율적입니다. (한 가지 예외가 있습니다. 파일 시스템의 루트에는 ..동일한 디렉토리를 가리키는 항목이 있습니다.)

답변3

더 간단한 대답은 비유일 수 있습니다.

전화번호부에서 이름 대신 전화번호를 검색한다고 상상해 보세요.

관련 정보