web-dev-qa-db-ja.com

ls -iのiノード番号はディスク上のiノードとどのように関連していますか

Iノード番号(ls -iで表示)がext4パーティションでどのように機能するかを理解しようとしています。

それらがLinuxカーネルの構造であり、ディスク上のiノードにマップされているのか、それとも実際にに格納されているのと同じ番号であるのかを理解しようとしています。ディスク。

質問:

  1. コンピュータを再起動すると、iノード番号は変わりますか?
  2. 2つのパーティションがマウントされている場合、それらが異なるパーティションにある限り、ls -iは2つの異なるファイルに対して同じiノード番号を生成できます。
  3. パーティションを再起動または再マウントせずにiノード番号をリサイクルできますか?

なぜ私が尋ねているのか...

USBハードドライブに1.5TBのデータと約2,000万のファイル(ファイル名)を含むセカンダリインデックスを作成したいと思います。ファイルの範囲は数十バイトから数百GBです。それらの多くは複数回ハードリンクされているため、1つのファイル(ディスク上のblob)には最大200のファイル名が含まれる可能性があります。

私の仕事は、重複を検出し、重複をさらに多くのハードリンクに置き換えることで、ディスク上のスペースを節約することです。

これで、1つの演習として、ディスク上のすべてのファイルのデータベースを作成できると思います。それは、shasum、アクセス許可などです。構築したら、重複の検出は簡単です。ビット正しい一意のキーを使用していることを確認する必要があります。既存のハードリンクが多数あるため、ファイル名は不適切です。 iノード番号を使用できることを願っています。

私が理解したいのは、次にマシンを再起動したときにiノード番号が変更されるかどうかです。または、それらがさらに不安定な場合(データベースの構築中に変更されますか?)

私が読んだすべてのドキュメントは、カーネルによって提示されたiノード番号とディスク上のiノード番号の違いを曖昧にしています。これらが同じものであるかどうかは、私がすでに読んだ記事に基づいて不明です。

1
Philip Couling

Iノード番号(ls -iで表示)がext4パーティションでどのように機能するかを理解しようとしています。

基本的に、iノードはファイルシステム(!)の参照であり、ディスク上の実際のデータ(ビットとバイト)とそのデータに関連付けられた名前(たとえば、/etc/passwd)の間のブリッジです。ファイル名はディレクトリに編成されます。ディレクトリエントリは、対応するiノードを持つファイル名です。

次に、iノードには実際の情報(ディスク、所有者、グループなどで占有されているブロック)が含まれます。 NIXファイルシステムにディレクトリ構造がどのように格納されているか には、ファイルとiノードが少し良くなりました:

enter image description here

また、同じiノード番号を指すファイルが別のディレクトリにある場合、ハードリンクと呼ばれるものがあります。

ここで、iノードはファイルシステムに固有の参照であることを強調したことに注意してください。 理由は次のとおりです 注意してください。

特定のファイルのiノード番号はファイルシステムに固有ですが、特定のホストにマウントされているすべてのファイルシステムに固有である必要はありません。複数のファイルシステムがある場合、ファイルシステム間で重複したiノード番号が表示されます。これは正常です。

これは、デバイスとは対照的です。 /varファイルシステムや/など、同じデバイス上に複数のファイルシステムがあり、それらが同じドライブ上にある場合があります。

さて、iノード番号は変更できますか?ある種。ファイルシステムはiノードの管理を担当するため、ファイルシステムに根本的な問題がない限り、iノード番号は変更しないでください。 vim text editor などの特定のトリッキーなケースでは、

古いファイルの名前を変更し、元のファイルの属性を再作成できると判断した場合は、元の名前で新しいファイルを書き込みます。既存のiノードを再利用する場合(したがって、データを失うリスクがある場合、またはバックアップコピーの作成により多くの時間を浪費する場合)、set backupcopyyesを.vimrcに追加します。

覚えておくべき重要な点は、データがユーザーにとって同じである可能性がある場合、内部では実際にディスク上の新しい場所に書き込まれるため、iノード番号が変更されることです。

だから、物事を短くするために:

  1. コンピュータを再起動すると、iノード番号は変わりますか?

再起動後にファイルシステムに問題がない限り、そうではありません

2. 2つのパーティションがマウントされている場合、異なるパーティションにある限り、ls-iは2つの異なるファイルに対して同じiノード番号を生成できます。

はい。2つの異なるパーティションのファイルシステムが異なるためです。 [〜#〜] lvm [〜#〜] についてはよくわかりませんが、そのタイプのストレージ管理では、2つの物理ボリュームを1つの論理ボリュームに結合できます。これは私の理論ではls -がファイルごとに1つのiノードを生成する場合を推測します

  1. パーティションを再起動または再マウントせずにiノード番号をリサイクルできますか?

ファイルシステムは、ファイルが削除されたとき(つまり、ファイルへのすべてのリンクが削除され、そのiノードを指すものがないときに)それを行います。


私の仕事は、重複を検出し、重複をさらに多くのハードリンクに置き換えることで、ディスク上のスペースを節約することです。

重複の検出は、md5sumまたはその他のチェックサムコマンドを使用して実行できます。このような場合、実際のデータを調べています。実際のデータは、ディスク上の異なるiノードの下にある場合とない場合があります。一例は heemayls answer からです:

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
5
  1. いいえ、iノード番号はコンピュータの再起動時に変更されません。少なくとも、iノードがディスクに保存されているPOSIXファイルシステム(ext4など)では変更されません。

  2. はい、異なるパーティション上の2つの異なるファイルが同じiノード番号を持つことができます。 2つの別々のファイルシステム上の2つのファイルが同じiノード番号を共有できますか? および ディレクトリ/ home、/ usr、/ varなどがすべて同じiノード番号を持つのはなぜですか(2)」を参照してください。詳細については? 。 (特定のシステム内で一意なのは、デバイス番号とiノードのペアです。)

  3. はい、ファイルを削除すると、そのiノードは再起動または再マウントせずに再利用できます。

2
Stephen Kitt