web-dev-qa-db-ja.com

ハードリンクの逆参照

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は、ファイルがハードリンクであることをどのようにして知るのですか?どうやってフォローしますか?

このオプションを選択しないとどうなりますか?どのようにnotハード逆参照ですか?

22
musa

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

--hard-dereferenceオプションを使用する場合、tarnotを実行してハードリンクを保持します。その代わりに、たまたま同じコンテンツとメタデータを持つ独立したファイルとしてそれらを扱います。アーカイブを抽出すると、ファイルは独立します。

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

24
cjm

ハードリンクされたファイルと、「リンク数」のハードリンクされていないファイルを区別できます。これをコマンドラインから取得するには、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」がリンク数です。両方のファイル名のiノード番号が932815であることに注意してください。

これらのコマンドはどちらも、stat()システムコールによって入力されるstruct statのst_nlinkフィールドからリンクカウントを取得するはずです。

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

7
Bruce Ediger