取消引用硬链接


22

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知道文件是硬链接?它是如何遵循的

如果我不选择此选项怎么办?它是如何硬解引用?

Answers:


24

默认情况下,如果您告诉您tar使用硬链接来存档文件,并且要存档的文件中包含多个这样的链接,则它仅存档一次文件,并将第二个(以及任何其他名称)记录为硬链接。这意味着当您提取该存档时,硬链接将被还原。

如果您使用的--hard-dereference选项,那么tar不能保存硬链接。相反,它将它们视为恰好具有相同内容和元数据的独立文件。提取存档时,文件将是独立的。

注意:它通过首先检查文件的链接数来识别硬链接。它使用多个链接记录每个文件的设备号和索引节点,并使用它们来检测何时再次存档同一文件。(当您使用时--hard-dereference,它不会这样做。)


7

您可以将具有硬链接的文件与具有“链接计数”的非硬链接文件区分开。我看到两种从命令行获取此信息的方法:

% 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意味着您将获得两个文件,每个文件具有一个文件名,而不是获得具有两个不同文件名的单个文件(如上例所示)。 tar可能会检查每个文件上的链接计数,并且在提取时默认情况下,它将在它具有的第二个文件名上为硬链接的文件数据创建一个硬链接。在--hard-dereference创建归档文件时调用它时,它似乎在提取调用tar运行时为第二个文件名创建了一个全新文件。


现在我知道,“遵循硬链接”是错误的措辞。谢谢。但是,如果两个相同文件之一未归档怎么办?在这种情况下,链接计数会产生误导。
musa 2012年

2
这不是“两个相同的文件”,而是一个带有两个名称的文件。哪个文件tar不存档并不重要,因为它们是相同的。默认情况下,就像文件系统一样,tar可能只保留从第二个文件名到第一个文件名的某种“指针”。
Bruce Ediger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.