在 NTFS 文件系统中,ls 和 stat 报告的硬链接计数是否包括其他链接类型以及硬链接

在 NTFS 文件系统中,ls 和 stat 报告的硬链接计数是否包括其他链接类型以及硬链接

NTFS 是否使用与硬链接相同的计数器来计算其他链接类型?或者 Linux 在计算 NTFS 文件系统中的硬链接计数时是否包含其他链接类型?

我在 Windows 和 Linux (fedora) 中使用的外部硬盘上有一个 NTFS 文件系统。

某些文件的硬链接计数 = 2。“ls”和“stat”的输出示例:

$ ls -li | grep samplefile.jpg 
1002 -rwxrwxrwx. 2 charlie charlie     29496 Apr 18  2019 samplefile.jpg
$ stat samplefile.jpg 
  File: samplefile.jpg
  Size: 29496       Blocks: 64         IO Block: 4096   regular file
Device: 811h/2065d  Inode: 1002        Links: 2

但是文件系统不包含引用相同 inode 编号(NTFS 中的文件 id)或相同长度的其他目录条目,从文件系统根目录启动的“ls”和“find”即可证明:

$ ls -Rli . | grep '1002\|29496'
1002 -rwxrwxrwx. 2 charlie charlie     29496 Apr 18  2019 samplefile.jpg
$ find . -samefile  path-to-file/samplefile.jpg 
./path-to-file/samplefile.jpg

据我所知,佳能的 DPP4 软件(Digital Photo Professional)通过修改文件然后save as或生成了硬链接计数 = 2 的文件export。使用相同名称保存修改后的文件(save)不会增加硬链接计数。因此,DPP4 似乎存储了对原始文件的引用,而 NTFS(或 Linux)将该引用计算为硬链接。但我不明白这与硬链接计数有何关系;或者 DPP 使用什么 NTFS 机制;或者 Linux(fuse)在计算硬链接计数时是否包含其他链接类型;或者我是否完全找错了树。

问:当我删除samplefile.jpg时,无论是在Windows还是Linux中,该文件的数据是否会因为使用计数非零而无法删除?答:在Linux中,文件的数据被正确删除。 (我不知道 Windows 的情况。) 证据:我删除了一个目录条目(在 Linux 中rm filename),并且已用空间减少了所删除文件的大小。

参考文献:在下面的问题中,答案解释了ls -l输出中硬链接字段的含义,并指出它具有多个含义,具体取决于条目类型,但没有答案明确针对 NTFS。

ls 输出字段是什么意思

这是 Microsoft NTFS 文档。已经过时了,但基础知识应该仍然有效:

NTFS文件系统

答案1

NTFS 文件系统历史上支持8.3 文件名

启用此功能后,从 Windows 创建文件将经历以下过程:

  • 如果文件名符合 8.3 模式,则只有一个文件名;
  • 如果没有(如您的samplefile.jpg),它会获得一个额外的“隐藏”8.3 名称(如SAMPLE~1.JPG),实际上是一个硬链接。

您可以在 Windows 和 Linux 上通过这两个名称引用该文件,但 8.3 名称在列表中隐藏。因此,ls不显示SAMPLE~1.JPG,但具体ls SAMPLE~1.JPG显示。

这就是 Linux 将硬链接计数显示为 2 的原因。如果你命名它sample.jpg,它会显示 1。

有趣的是,如果您从 Linux 在此 NTFS 上创建一个长命名文件,它不会获得 8.3 名称。 Windows 仍然可以在长名称下看到它。

最后,并非所有 NTFS 系统都启用此功能,一些用户更喜欢禁用它,即使他们只使用 Windows。

相关内容