取消引用硬链接

取消引用硬链接

在命令的手册页中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归档带有硬链接的文件,并且要归档的文件中包含多个此类链接,则它仅对该文件归档一次,并将第二个(以及任何其他名称)记录为硬链接。这意味着当您提取该存档时,硬链接将被恢复。

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

注意:它通过首先检查文件的链接计数来识别硬链接。它记录具有多个链接的每个文件的设备号和索引节点,并使用它来检测同一文件何时再次归档。 (当您使用 时--hard-dereference,它不会执行此操作。)

答案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”是链接计数。请注意,两个文件名具有相同的索引节点号 932815。

我确信这两个命令都从 struct stat 的 st_nlink 字段中获取链接计数,该字段由系统调用填充stat()

据我所知,运行tarwith--hard-dereference意味着您不会获得具有两个不同文件名的单个文件(如上例所示),而是会获得两个文件,每个文件都有一个文件名。 tar可能会检查每个文件上的链接计数,默认情况下,在提取时,它会在第二个文件名上为硬链接文件数据创建硬链接。当在存档创建时调用时--hard-dereference,它似乎在运行提取调用时为第二个文件名创建一个全新的文件tar

相关内容