web-dev-qa-db-ja.com

2つの別々のファイルシステム上の2つのファイルが同じiノード番号を共有できますか?

このようなコマンドを実行すると:

find / -inum 12582925

これにより、たまたま同じ番号が割り当てられた別々のマウントされたファイルシステム(別々のパーティションから)上の2つのファイルがリストされる可能性はありますか? iノード番号は、単一のファイルシステム上で、またはマウントされたすべてのファイルシステム間で一意ですか?

17
Flimm

Iノード番号は、単一のファイルシステムでのみ一意です。すぐに遭遇する1つの例は、ext2/3/4ファイルシステムのルートiノード、つまり2です。

$ ls -id / /home
2 /    2 /home

実行した場合(GNU findと仮定)

find / -printf "%i %p\n" | sort -n | less

複数のファイルシステムを備えたシステムでは、多数の重複したiノード番号が表示されます(ただし、ハードリンクも含まれるため、少しピントを付けて出力を取得する必要があります)。

Iノード番号でファイルを検索する場合、find-xdevオプションを使用して、単一の開始パスがある場合に、検索を開始パスを含むファイルシステムに制限できます。

find / -xdev -inum 12582925

ルートファイルシステムでiノード番号12582925のファイルのみを検索します。 (-xdevは複数の開始パスでも機能しますが、この特定のケースではその有用性が低下します。)

これは、iノード番号とデバイス番号の組み合わせです(stat構造のst_devst_ino%D %iのGNU find-printf)。2つのディレクトリエントリが同じiノードと開発番号を持つ場合、それらは同じファイルを参照します(ただし、同じファイルの2つの異なるマウントを通じて)バインドマウント用のシステム)。

一部のfind実装には、同じデバイスとiノード番号のファイルを検索する-samefile述語もあります。ほとんどの[/test実装には、2つのファイルパスが同じファイルを参照していることを確認する-ef演算子もあります(ただし、シンボリックリンクの解決後)。

39
Stephen Kitt

はい、同じiノード番号が別のファイルシステムに表示される場合があります。正確に指定する場合は、iノード番号(st_ino)だけでなく、iノードが存在するデバイス(st_dev、それ自体がdev_major(デバイスの一般的なクラス)およびdev_minor(特定のインスタンス)によって形成される)も必要です。

カップル(st_dev、st_ino)willは、特定のファイルを識別します(少なくとも、このiノードが存在するファイルシステムをアンマウントしない場合)。

inode(7) で述べたように:

iノードが存在するデバイス

各iノード(および関連ファイル)は、デバイスでホストされているファイルシステムに存在します。そのデバイスは、メジャーID(デバイスの一般的なクラスを識別する)とマイナーID(一般的なクラスの特定のインスタンスを識別する)の組み合わせによって識別されます。

iノード番号

ファイルシステム内の各ファイルには、一意のiノード番号があります。 iノード番号はファイルシステム内でのみ一意であることが保証されています(つまり、-同じiノード番号は異なるファイルシステムで使用される可能性があります、これはハードリンクがファイルシステムをクロスできない理由です境界)。

4
Ángel