在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,它不会这样做。)
您可以通过“链接计数”将带有硬链接的文件与非硬链接的文件区分开来。我看到两种从命令行获取此信息的方法:
% 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运行提取调用时为第二个文件名创建一个全新的文件。