ハードリンクの参照解除

ハードリンクの参照解除

コマンドのマニュアルページにはtar、ハードリンクをたどるためのオプションが記載されています。

-h, --dereference
      follow symlinks; archive and dump the files they point to

--hard-dereference
      follow hard links; archive and dump the files they refer to

tarファイルがハードリンクであることをどうやって知るのでしょうか?フォローするそれ?

このオプションを選択しない場合はどうなるのでしょうか?ないハードデリファレンス?

答え1

デフォルトでは、ハード リンクを含むファイルをアーカイブするように指示しtar、アーカイブするファイルの中にそのようなリンクが複数含まれている場合、ファイルは 1 回だけアーカイブされ、2 番目のリンク (および追加の名前) がハード リンクとして記録されます。つまり、そのアーカイブを抽出すると、ハード リンクが復元されます。

オプションを使用すると--hard-dereferencetarないハードリンクは保持されます。代わりに、同じコンテンツとメタデータを持つ独立したファイルとして扱われます。アーカイブを解凍すると、ファイルは独立しています。

注: 最初にファイルのリンク数をチェックしてハード リンクを認識します。複数のリンクを持つ各ファイルのデバイス番号と inode を記録し、同じファイルが再度アーカイブされているかどうかを検出します ( を使用する場合は--hard-dereference、この処理は行われません)。

答え2

「リンク数」によって、ハードリンクされているファイルとハードリンクされていないファイルを区別できます。コマンド ラインからこれを取得するには、次の 2 つの方法があります。

% stat original
  File: ‘original’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 804h/2052d      Inode: 932815      Links: 2
Access: (0644/-rw-r--r--)  Uid: (  500/ bediger)   Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
 Birth: -

または

1010 % ls -li 
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary

「bediger」の前の「2」はリンク数です。両方のファイル名の inode 番号が同じ 932815 であることに注意してください。

これらのコマンドは両方とも、システム コールによって入力される struct stat の st_nlink フィールドからリンク数を取得することは確かですstat()

私の知る限り、tarを で実行する--hard-dereferenceと、2 つの異なるファイル名を持つ 1 つのファイル (上記の例のように) が取得されるのではなく、それぞれが 1 つのファイル名を持つ 2 つのファイルが取得されます。 tarはおそらく各ファイルのリンク数をチェックし、デフォルトでは、抽出時に、ハードリンクされたファイル データに対して 2 番目のファイル名にハード リンクを作成します。 アーカイブ--hard-dereference作成時に を で呼び出すと、 の抽出呼び出しが実行されたときに、2 番目のファイル名に対して完全に新しいファイルが作成されるようですtar

関連情報