GNU/Linux >> Linux の 問題 >  >> Linux

ハード リンクが元のリンクと同じスペースを占めるように見えるのはなぜですか?

ファイルはメタデータを含む inode であり、その中にデータの検索場所へのポインターのリストがあります。

ファイルにアクセスできるようにするには、リンク する必要があります それをディレクトリ (ディレクトリはフォルダーではなく、電話帳と考えてください) に追加します。つまり、name を関連付けるために、複数のディレクトリの 1 つに 1 つまたは複数のエントリを追加します。

これらのリンクはすべて、それらのファイル名は同じファイルを指しています。 1 つはオリジナルで、もう 1 つはリンクです。これらはすべて、ディレクトリ ツリー内の同じファイル (同じ inode) へのアクセス ポイントです。ファイルのサイズを取得すると (lstat システム コール)、inode に保存されている情報 (上記のメタデータ) を取得しているため、そのファイルを参照するためにどのファイル名やどのリンクを使用しているかは問題ではありません。

対照的に、シンボリック リンクは別のファイル (別の i ノード) であり、そのコンテンツは パス です。 対象ファイルに.他のファイルと同様に、これらのシンボリック リンクは、アクセスできるようにディレクトリにリンクする必要があります (名前が必要です)。また、シンボリック リンクへの複数のリンクを持つこともできます。つまり、シンボリック リンクに複数の名前を付けることができます (1 つまたは複数のディレクトリ内)。

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

ファイル番号10486707以上は通常のファイルです。現在のディレクトリ内の 2 つのエントリ (名前が a のエントリ) 、名前 b の 1 つ ) リンクします。 リンク数 が 2 の場合、現在のディレクトリまたは他のディレクトリにそのファイルの他の名前がないことがわかっています。ファイル番号 10502404 は別のファイルで、今回は現在のディレクトリに 2 回リンクされたタイプのシンボリック リンクです。その内容 (ターゲット) は相対パス "a" です。

10502404 が現在のディレクトリとは別のディレクトリにリンクされている場合、通常、アクセス方法に応じて別のファイルを指していることに注意してください。

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

ファイルには、それらをリンクするディレクトリ以外に関連付けられた名前はありません。それらの名前が占めるスペースは、それらのディレクトリのエントリであり、ディレクトリのファイル サイズ/ディスク使用量に含まれます。

ファイルを削除するためのシステム コールが unlink であることに気付くでしょう。 .つまり、ファイルを削除せず、ファイルが参照されているディレクトリからリンクを解除します。特定のファイルへのエントリがあった最後のディレクトリからリンクを解除すると、そのファイルは破棄されます (プロセスがそれを持っていない限り)


ハード リンクは、基本的に元のファイルです。したがって、報告されたサイズは、リンクされているファイルのサイズです。 柔らかい 名前のスペースしか占有しないリンク (ちょっと)。

ファイルシステムに関する限り、ハード リンクとオリジナルは同じものであり、同じ inode を指しているため、同じサイズが報告されます。


Linux
  1. Bashスクリプトがエイリアスを認識しないのはなぜですか?

  2. Stdoutに出力し、同時にGrepをファイルに出力しますか?

  3. シンボリックリンクとハードリンクの違いは?

  1. 入力ファイルと同じ名前のファイルに保存する出力?

  2. カーネルがプロセスと同じアドレス空間にマップされるのはなぜですか?

  3. 同じファイルの 2 つの tarball の md5 ハッシュが異なるのはなぜですか?

  1. デバイスの stat::st_size が 0 であるのに、同時に lseek がデバイス サイズを正しく定義するのはなぜですか?

  2. ルート ディレクトリが / 記号で示されるのはなぜですか?

  3. 同じバイトをグループ化して、ファイル内のバイト数をカウントする方法は?