取消引用硬链接

mus*_*usa 26 tar hard-link

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
Run Code Online (Sandbox Code Playgroud)

如何tar知道文件是硬链接?它是如何遵循的

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

cjm*_*cjm 30

默认情况下,如果您告诉tar存档带有硬链接的文件,并且要存档的文件中包含多个此类链接,则它只会存档该文件一次,并将第二个(和任何其他名称)记录为硬链接。这意味着当您提取该存档时,硬链接将被恢复。

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

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


Bru*_*ger 8

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

% 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: -
Run Code Online (Sandbox Code Playgroud)

或者

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
Run Code Online (Sandbox Code Playgroud)

“bediger”之前的那个孤独的“2”是链接数。请注意,两个文件名具有相同的 inode 编号 932815。

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

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

  • 这不是“两个相同的文件”,而是一个文件有两个名称。哪个文件 tar 不存档并不重要,因为它们是相同的。默认情况下,tar 可能只是保留某种从第二个文件名到第一个文件名的“指针”,就像文件系统一样。 (2认同)