web-dev-qa-db-ja.com

シンボリックリンクは実際にディスク使用量に違いをもたらしますか?

Linuxでは、シンボリックリンク(ソフトリンク、シンボリックリンク)が別のファイルを参照するpointersのように見えるほど多くのWebサイトを読んだことがあります。 (Windowsショートカットのように)どこにでも配置できます。ただし、シンボリックリンクがあるフォルダーのディスク使用量を確認すると、ファイルマネージャーの発言とduの発言が一致しません。ただし、du -L(manページの-L, --dereference; dereference all symbolic links)と入力すると、du -Lの出力とファイルマネージャーが報告するサイズは同じですになります。

私の質問は:たとえば、別のhomeパーティションにある大きなファイルへのソフトリンクがある場合、問題がありますか?

私の/var/tmpフォルダーは空です。ファイルを作成しましょう:

$ cat /some/file.txt > file.txt
$ du -ac
164 ./file.txt
168 .
168 total

そして、私のファイルマネージャー(この場合、Thunar)は

サイズ:1アイテム、合計163.0 kB

大丈夫。ここで、/tmpに非常に大きなファイルを作成し、そのシンボリックリンクを作成します。

$ cat /dir/really_big.txt > /tmp/heavy.txt
$ du -a | grep heavy.txt
408 ./heavy.txt
$ ln -s /tmp/heavy.txt heavy.txt
$ du -ac
164 ./file.txt
0   ./heavy.txt
168 .
168 total

今のところすべてが問題ありません。しかし、ファイルマネージャーを開いた場合:

サイズ:2アイテム、合計570.3 kB

そして最後に:

$ du -acL
164 ./file.txt
408 ./heavy.txt
576 .
576 total

/var/tmpが配置されているパーティションが1 GiB大きい場合、その中に1 GiBファイルへのリンクを作成すると、Ifハードディスクが壊れますか? duが168とThunar 1 GiBを出力することは知っていますが、どちらが正しいかわかりません。

21
astrojuanlu

もちろん、シンボリックリンクにはスペースが必要ですが、名前とターゲット、および他のメタデータ用の数バイトを格納するために必要なスペースだけです。シンボリックリンクによって使用されるスペースは、ターゲットによって使用されるスペースに依存しません(結局のところ、ターゲットは存在する必要さえありません)。

プレーンduは、ディスク上のディレクトリツリーが占める領域を報告します。 du -Lは、すべてのシンボリックリンクがターゲットによって置き換えられた場合に、ディレクトリツリーが使用する /のスペースを報告します。前者は通常、有用な情報です。たとえば、これは、ツリーを削除した場合に回復するスペースであり、(ほぼ)ツリーをバックアップするために必要なスペースです。

ディレクトリツリーのduは、(通常)ファイルサイズの合計よりも少し多く表示されます。これは2つの理由によるものです。まず、duはディレクトリもカウントします。ディレクトリには、ファイル名とメタデータを格納するための小さなスペースが必要です。次に、duはファイルが使用するディスク容量をカウントします。これはファイルサイズとは異なる場合があります。最も一般的な影響は、ファイルが整数のブロックを占めることです(通常のLinuxインストールでは4kB)。 1バイトのファイルは、du出力で4kBとして表示できます。ただし、圧縮(たとえば、ほぼすべてのUNIXファイルシステムで sparse files によって提供されるプリミティブ形式)により、ファイルサイズがディスク使用量よりも大きくなる可能性があります。

入力した数値から、Thunarはディレクトリツリー内のファイルのサイズの合計を、シンボリックリンクに従ってレポートしているようです。実際には微妙な意味でそう言っています。ディスクの使用量が570.3 kBではなく、合計サイズが570.3 kBであると主張しています。ユーザーインターフェイスやドキュメントからまったく明らかでないのは、Thunarがサイズを計算するときにシンボリックリンクをたどることです。

どちらが「正しい」かは主観的な問題です。 duはディスク使用量を報告します。 Thunarは、シンボリックリンクに続く合計サイズを報告します。シンボリックリンクを作成しても、ディスクの使用量にはほとんど影響がありませんが、定義上、Thunarが報告するtotal-size-following-symbolic-linksは変更されます。

デフォルトでは、ファイルマネージャーはソフトリンクが指しているファイルのサイズを取得しようとしていると思いますが、duはディレクトリとソフトリンク自体のサイズを示しますが、それらが指しているファイルは示しません。に。

明確にするために、

`du`    -> size of directory + size of all the softlinks  
`du -L` -> size of directory + size of all the files that the softlinks are pointing to.

これがあなたが求めていたものであるかどうかはわかりませんが、そうである場合は、これがあなたの質問の答えになると思います。

3
Jay