在创建多个文件夹的存档时,如何使用 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注意到这些文件链接到同一个索引节点,如果它将它们存储在存档中,并且作为节省空间的优化,将遇到的第二个和后面的文件存储为第一个文件的链接(这也很有用,以便tar可以恢复存档时的状态)。仅当文件同时存储在同一存档中时才会发生这种情况。

从技术上讲,可以创建一个存档,存储指向不在存档中的文件的链接:使用两个文件创建存档,然后删除存储的文件作为文件从档案中。

相关内容