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 のしたがって、inode 番号に関連するファイル名を取得する唯一の方法は、すべてのディレクトリ ファイルのすべてのディレクトリ エントリを調べることです。

答え2

あなたが書いた:

単純なfind -inum 12345を実行すると、findがファイルシステム全体を反復/ウォークするのを見て驚きました。

findは、定義により、 のデフォルトの開始ディレクトリを使用して、指定されたディレクトリまたはディレクトリ群から始まるツリーウォークを実行します.

find -inum 12345現在の作業ディレクトリから始めて、ディレクトリ ツリー全体を走査します。.ファイルシステムのマウント ポイントが含まれていない限り、ファイルシステム全体を走査することはおそらくありません。

特定のinode番号を持つすべてのファイルを検索するより効率的な方法があります -あなたがリンクした回答にある、、そして - しかし、fsdbツリーdebugfsウォークを行う必要があります。ncheckfind基準探している inode にリンクが 1 つしかない場合は、サポートされている場合は、最初の一致後にツリーのウォークを終了するオプションをfind指定できます。-quit

それらの他のコマンドも、ディレクトリ ツリーだけではなく、ファイル システム全体を調べる必要があるため、必ずしも高速であるとは限りませんが、使用可能なデータを使用して最善を尽くします。基本的な問題は、ほとんどの Unix ファイル システムの構造にあります。

  • ファイルの inode には多くの情報が含まれていますが、その中には「ファイルの名前」や「ファイルを含むディレクトリ」は含まれていません。
  • ほとんどの Unix ファイルシステム上のディレクトリの構造は非常に単純です。ディレクトリにはエントリのリストが含まれており、各エントリは (inode 番号、ファイル名) のペアです。
  • ほとんどの Unix ファイルシステムでは、inode 12345 を含むディレクトリと、それらのディレクトリが参照する名前を見つけるために、これらのコマンドは、ファイルシステム上のすべてのディレクトリのすべてのエントリを検索し、一致するエントリをすべて見つける必要があります。ファイルの inodeする参照するディレクトリ エントリの数が含まれているため、その数のエントリが見つかったらすぐに検索を終了できます。
  • 対照的に、ディレクトリ名の検索ははるかに効率的です。すべてのディレクトリにはその親ディレクトリの inode 番号が含まれているため、..一致するエントリを検索するにはそのディレクトリ 1 つだけを検索すればよいからです (例外が 1 つあります。ファイルシステムのルート ディレクトリには、..同じディレクトリを指すエントリがあります)。

答え3

もっと簡単な答えは類推によるものかもしれません。

電話帳で名前ではなく電話番号を検索することを想像してください。

関連情報