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。
这是 Microsoft 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。