複数のフォルダのアーカイブを作成するときにtarを使用してハードリンクを保存する方法は?

複数のフォルダのアーカイブを作成するときにtarを使用してハードリンクを保存する方法は?

複数のサブフォルダがあり、その一部には他のサブフォルダへのハードリンクが含まれています。

# mkdir /tmp/data
# mkdir /tmp/foo
# mkdir /tmp/foo/bar
# mkdir /tmp/foo/baz
# truncate -s 10M /tmp/foo/bar/file1
# ln /tmp/foo/bar/file1 /tmp/foo/baz/file1
# truncate -s 10M /tmp/foo/baz/file2
# ls -lah /tmp/foo/bar/
total 0
drwxrwxrwx 2 root root  60 Aug 18 13:22 ./
drwxrwxrwx 4 root root  80 Aug 18 13:22 ../
-rw-rw-rw- 2 root root 10M Aug 18 13:22 file1
# ls -lah /tmp/foo/baz/
total 0
drwxrwxrwx 2 root root  80 Aug 18 13:23 ./
drwxrwxrwx 4 root root  80 Aug 18 13:22 ../
-rw-rw-rw- 2 root root 10M Aug 18 13:22 file1
-rw-rw-rw- 1 root root 10M Aug 18 13:23 file2

ルートフォルダのtarを作成すると、ハードリンクが保持されます。

# tar -cf /tmp/foo.tar /tmp/foo
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
# tar -tvf /tmp/foo.tar
drwxrwxrwx root/root         0 2021-08-18 13:22 tmp/foo/
drwxrwxrwx root/root         0 2021-08-18 13:23 tmp/foo/baz/
-rw-rw-rw- root/root  10485760 2021-08-18 13:23 tmp/foo/baz/file2
-rw-rw-rw- root/root  10485760 2021-08-18 13:22 tmp/foo/baz/file1
drwxrwxrwx root/root         0 2021-08-18 13:22 tmp/foo/bar/
hrw-rw-rw- root/root         0 2021-08-18 13:22 tmp/foo/bar/file1 link to tmp/foo/baz/file1

ただし、各サブフォルダに対して同じことを行うと、tarが最初のアーカイブにすでにファイルが含まれていることを知らないため、そのフォルダを保持できません。

# tar -cf /tmp/bar.tar /tmp/foo/bar
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
# tar -cf /tmp/baz.tar /tmp/foo/baz
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
# tar -tvf /tmp/bar.tar
drwxrwxrwx root/root         0 2021-08-18 13:22 tmp/foo/bar/
-rw-rw-rw- root/root  10485760 2021-08-18 13:22 tmp/foo/bar/file1
# tar -tvf /tmp/baz.tar
drwxrwxrwx root/root         0 2021-08-18 13:23 tmp/foo/baz/
-rw-rw-rw- root/root  10485760 2021-08-18 13:23 tmp/foo/baz/file2
-rw-rw-rw- root/root  10485760 2021-08-18 13:22 tmp/foo/baz/file1

この問題をどのように解決できますか?

答え1

アーカイブ外の他のファイルへのハードリンクを維持できません。

答え2

厳密に言えば、ハードリンクは他のファイルへのリンクではありません。各リンクは、ターゲット inode を指すディレクトリエントリです。したがって、ファイルシステムにはtmp/foo/bar/file1リンクの概念はありません。tmp/foo/baz/file1

tarこれらのファイルは、アーカイブに保存されている場合は同じinodeにリンクされ、スペースを節約するために2番目と後続のファイルを最初のファイルへのリンクとして保存します(これは次の状態tarを維持するのにも役立ちます)。アーカイブの時間は復元できます)。これは、ファイルが同時に同じアーカイブに保存されている場合にのみ発生します。

技術的には、アーカイブにないファイルへのリンクを保存するアーカイブを作成することが可能です。 2つのファイルでアーカイブを作成し、保存したファイルを削除します。ファイルとしてアーカイブから。

関連情報