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

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

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

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에 대한/의. 따라서 inode 번호와 관련된 파일 이름을 얻는 유일한 방법은 모든 디렉터리 파일의 모든 디렉터리 항목을 살펴보는 것입니다.

답변2

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

간단한 find -inum 12345를 수행할 때 전체 파일 시스템을 반복/탐색하는 것을 보고 놀랐습니다.

find는 정의에 따라 기본 시작 디렉터리를 사용하여 지정된 디렉터리에서 시작하여 트리 탐색을 수행합니다 ..

find -inum 12345현재 작업 디렉토리부터 시작하여 전체 디렉토리 트리를 살펴봅니다. .파일 시스템 마운트 지점이 포함되지 않는 한 전체 파일 시스템을 탐색하지는 않을 것입니다 .

fsdb주어진 inode 번호( , debugfsncheck연결한 답변) 를 가진 모든 파일을 찾는 더 효율적인 방법이 있지만 다음 find과 같은 이유로 트리 탐색을 수행해야 합니다.표준. 찾고 있는 inode에 링크가 하나만 있는 경우 지원하는 경우 첫 번째 일치 후 트리 탐색을 종료하는 옵션을 find제공 할 수 있습니다.-quit

다른 명령도 디렉토리 트리가 아닌 전체 파일 시스템을 조사해야 하기 때문에 항상 빠르지는 않지만 작업에 사용할 수 있는 데이터로 최선을 다합니다. 기본적인 문제는 대부분의 Unix 파일 시스템의 구조입니다.

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

답변3

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

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

관련 정보