ファイルは (大まかに) 3 つの別個のものです:
- ファイルの所有者、パーミッション、および実際にデータを含むディスク上のブロックのリストを追跡するメタデータ構造である「inode」。
- その i ノードを指す 1 つ以上のディレクトリ エントリ (ファイル名)
- データ自体の実際のブロック
空のファイルを作成すると、i ノードとその i ノードを指すディレクトリ エントリだけが作成されます。スパースファイルも同様 (dd if=/dev/null of=sparse_file bs=10M seek=1
).
既存のファイルへのハードリンクを作成すると、同じ inode を指す追加のディレクトリ エントリが作成されるだけです。
ここでは単純化していますが、お分かりいただけたでしょうか。
touch
inode を作成します 、および ls -i
または stat
inode に関する情報が表示されます:
$ touch test
$ ls -i test
28971114 test
$ stat test
File: ‘test’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fc01h/64513d Inode: 28971114 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/1000) Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
Birth: -
test
に注意してください 0 ブロックを使用します。表示されたデータを格納するために、inode は数バイトを使用します。これらのバイトは inode テーブルに格納されます。 inode 構造の例については、ext2 ページを参照してください。
ls
(または、stat(2)
システム コール) は、コンテンツのサイズを示します ファイルの。簿記のためにファイルシステムが必要とするスペースの量はその一部ではなく、実装の詳細として、一般的なプログラムがすべきものではありません 気にするか、知っていることさえあります。実装の詳細を可視化すると、ファイルシステムの抽象化の有用性が低下します。