ハードリンク逆参照

ハードリンク逆参照

コマンドのマニュアルページには、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複数含まれている場合は、ファイルを一度だけアーカイブし、2番目(および別の名前)をハードリンクとして記録します。これは、アーカイブを抽出するとハードリンクが復元されることを意味します。

--hard-dereferenceこのオプションを使用tarすると、いいえハードリンクを維持してください。代わりに、同じコンテンツとメタデータを持つ別々のファイルとして扱います。アーカイブを抽出すると、ファイルは独立しています。

注:まず、ファイル内のリンク数を確認してハードリンクを識別します。複数のリンクを持つ各ファイルのデバイス番号と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()

私が知っている限り、tarwithを実行する--hard-dereferenceことは、上記の例のように、2つの異なるファイル名を持つ単一のファイルを取得できませんが、それぞれファイル名を持つ2つのファイルを取得することを意味します. tar各ファイルのリンク数を確認できます。デフォルトでは、抽出すると、2番目のファイル名にハードリンクされたファイルデータへのハードリンクが作成されます。アーカイブの作成時に呼び出されると、抽出呼び出し--hard-dereferenceが実行されたときに2番目のファイル名に対してまったく新しいファイルを生成するように見えますtar

関連情報