良いQ&Aをありがとうございます。このページ、今リンクを理解しました。同じインデックスノードを異なる名前で参照するハードリンクが表示され、コピーは異なる名前を持つ別の「ノード」です。また、ソフトリンクは元のファイル名とパスをインデックスノードとして持つため、ファイルが移動するとリンクが切断されます。
そこで、いくつかのファイル(以下「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
しかし、ハードリンクが元のリンクと同じサイズであり、論理的にコピーと同じサイズであることは恥ずかしいです。ハードリンクとソースファイルが同じinodeを共有し、データを持ち、ファイル名だけが異なる場合、ハードリンクは205バイトではなく名前と同じスペースしか占有しませんか?それとも返される元のファイルのサイズですかls -lh
?しかし、ファイル名がどのくらいのスペースを占めるのか、どうすればわかりますか?ここハードリンクにはサイズがないと出てきます。ファイル名は元のファイル名で保存されますか?ハードリンクのファイル名はどこに保存されますか?
答え1
ファイルは、データが見つかる場所へのポインターのリストを含むメタデータを含むinodeです。
ファイルにアクセスするには、次のことが必要です。協会ディレクトリ(ディレクトリをフォルダではなく電話ディレクトリと見なす)に保存します。つまり、複数のディレクトリの 1 つに 1 つ以上のエントリを追加して、名前このファイルで。
これらすべてのリンク、ファイル名は同じファイルを指します。そのうちのオリジナルはなく、残りはリンクだけです。どちらもディレクトリツリー内の同じファイル(同じinode)へのアクセスポイントです。ファイルサイズ(lstat
システムコール)を取得するときにinodeに保存されている情報(上記のメタデータ)を検索しており、ファイル名とファイルを参照するために使用するリンクは重要ではありません。
対照的に、シンボリックリンクは、コンテンツが次のような別のファイル(別のinode)です。道ターゲットファイルに。他のファイルと同様に、これらのシンボリックリンクは、ユーザーがアクセスできるようにディレクトリ(名前が必要)に接続する必要があります。また、シンボリックリンクへのリンクが複数ある場合があります。つまり、シンボリックリンクに複数の名前を付けることができます(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
。つまり、ファイルを削除するのではなく、そのファイルが参照するディレクトリからリンクを解除することです。ファイルは、そのファイルのエントリがある最後のディレクトリから接続が解除されるとすぐに削除されます(開いているプロセスがない限り)。
答え2
ハードリンクは基本的に元のファイルです。したがって、表示されるレポートサイズはリンクファイルのサイズです。これは柔らかい名前空間(一種の)だけを占めるリンクです。
ファイルシステムに関する限り、ハードリンクとネイティブリンクは同じであり、同じinodeを指すので、報告されたサイズも同じです。