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基準。探しているインデックスノードにリンクが1つしかない場合は、最初の一致後にツリー巡回を終了するfindオプション(サポートされている場合)を指定できます。-quit

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

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

答え3

より簡単な答えは例えかもしれません。

電話帳で名前の代わりに電話番号を検索すると想像してください。

関連情報