どうしてハードリンクはオリジナルと同じスペースを取るように見えるのですか?


14

こことこのページの周りのいくつかの良いQ&Aのおかげで、私は今リンクを理解しています。ハードリンクは同じiノードを異なる名前で参照し、コピーは異なる「ノード、異なる名前を持つ。プラスソフトリンクは元のファイル名とパスをiノードとして持っているので、ファイルが移動するとリンクが壊れます。

そこで、私はいくつかのファイル(以下の「saluton_mondo.cpp」)で学んだことをテストし、ハードリンクとソフトリンク、およびコピーを作成しました。

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

しかし、ハードリンクのサイズが元のコピーと論理的に同じであることに気づきました。ハードリンクと元のデータが同じiノードを共有し、ファイル名のみが異なる場合、ハードリンクは205バイトではなく、その名前のスペースのみを使用すべきではありませんか?または、元のファイルのサイズがls -lh返されますか?しかし、その後、ファイル名がどのスペースを取るかをどのように知ることができますか?ここでは、ハードリンクにはサイズがありません。それらのファイル名は元のファイル名と一緒に保持されていますか?ハードリンクのファイル名はどこに保存されますか?

回答:


16

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

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

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

対照的に、シンボリックリンクは、コンテンツがターゲットファイルへのパスである別のファイル(別の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つのエントリ(1つはname a、もう1つはname b)がリンクしています。リンクカウントが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。つまり、ファイルを削除せずに、参照先のディレクトリからリンクを解除します。特定のファイルへのエントリがあった最後のディレクトリからリンクを解除すると、そのファイルは破棄されます(プロセスがない限り)開いた)。


ああ...なるほど。したがって、「hi」という名前のファイルと「ajhĝjdmjefsjmksgskgjkmŝŭna」という名前の正確なコピーは、まったく同じスペースを使用します。それらの名前はlstat、サイズを取得するシステムコールにはカウントされないためです。
JMCF125

@ JMCF125、はい、それらの名前のサイズは対応するディレクトリ内のエントリであり、ディレクトリのファイルサイズに含まれます。
ステファンシャゼル

ありがとう。あなたの答えにそれを含めることができますか?待って、まず質問を明確にします。
JMCF125

5

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

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


しかし、ハードリンクの名前にはスペースが必要です。
JMCF125

以下の@stephanの回答をご覧ください。
テルドン

2
@ JMCF125はい、ただしそのスペースはディレクトリ内にあります。十分なファイルを作成すると、ディレクトリサイズが大きくなることに気付くでしょう。ファイルのサイズには、名前などのメタデータは含まれません。
ジル「SO-悪であるのをやめる」

@Gilles、ありがとう、@ Stephaneは既にその情報で回答を更新しています。また、今私はそれをよりよく考え/ていますcd ../あなたが滞在するかのように、の名前はそれ自体に保存する必要があります/
JMCF125
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.