web-dev-qa-db-ja.com

iノードとファイルの関連付けは何ですか?

私はいくつかの情報源(例: this )から、次のことを学びました。

  • Iノードは、ファイルに関する関連情報を格納するデータ構造です。
  • Iノード番号はiノードを指します。
  • Iノード番号と対応するiノードのマッピング情報を保持する別のiノードテーブルがあります。
  • ファイルの作成時に、iノード番号とファイル名がファイルに割り当てられます。
  • ファイル名を使用してファイルにアクセスすると、内部的に、名前は最初にそのiノード番号でマップされ、対応するinodeにアクセスされます。

私が理解していないのは、ほとんど最後の行です。 iノードはiノードにアクセスしますが、iノードはファイルとは別のエンティティです。また、記載されている説明では、iノードがファイルに関連付けられているとは述べていません。iノードは、ファイルに関連するメタデータを含むデータ構造であるだけです。それでは、ファイルはどのようにアクセスされますか? iノードはファイルを呼び出しますか?

3
mathmaniage

Iノードisファイル。iノード番号によって唯一識別されます。ファイル名は、ファイルシステム内の単なるメタデータであり、参照ファイルを参照します。 1つのファイル/ iノードは、それを参照する複数のファイル名を持つことができます。

$ touch foo
$ ln foo bar
$ ls -li foo bar
28098391 -rw-r--r--  2 xxxxxxx  xxxxx  0 Jul  6 22:15 bar
28098391 -rw-r--r--  2 xxxxxxx  xxxxx  0 Jul  6 22:15 foo

最初の列はiノード番号です。両方のファイルで同じであることに注意してください。権限の後の最初の数字はリンク数です。 foobarの両方のリンク数は2です。これは、2つの名前がそれぞれ同じファイルを参照しているためです。

$ rm foo
$ ls -li bar
28098391 -rw-r--r--  1 xxxxxxx  xxxxx  0 Jul  6 22:15 bar

rm foo基になるファイルへの特定のリンクのみを削除します。 barは引き続きそれを参照します(iノード番号は変更されていませんが、リンク数は2ではなく1になっています)。また、foobarもファイルの「実際の」名前ではないことに注意してください。 fooが最初に作成されたという事実は、それを特別なものにしませんでした。 allリンクが削除されるまで(つまり、リンク数が0に減るまで)、ファイルは実際には削除されません。それでも、ファイルは実際には削除されません。そのiノードに割り当てられたブロックは、ファイルシステムで再利用できるものとしてマークされているだけです。

5
chepner

これが通常のファイルの簡単な説明です...

人間はファイル名を使用してファイルを参照します。カーネルは、iノード番号と呼ばれる番号を使用してファイルを参照します。ディレクトリは、ファイル名とiノード番号の間のマッピングです。 iノードには、ファイルに関連付けられたメタデータと、ファイルの最初のデータブロックへのポインタが含まれています。最初のデータブロックには2番目のデータブロックへのポインタが含まれ、最後のデータブロックが読み取られるまで続きます。

1
fpmurphy