为什么使用 hexdump 读取文件有时会改变 find 的稀疏值 (%S)?

为什么使用 hexdump 读取文件有时会改变 find 的稀疏值 (%S)?

我使用 Lustre 文件系统。我注意到,如果我查看%S某个文件的 find 的稀疏值 ( ),然后使用 打印该文件hexdump,然后再次查看 find 的稀疏值,则有时 find 的稀疏值 ( %S) 会发生变化。为什么会改变?


查看%S文件的查找稀疏值 ( )的命令myvideo.mp4

find myvideo.mp4 -printf "%S"

myvideo.mp4使用以下命令读取文件hexdump

hexdump myvideo.mp4 

我注意到几个文件上的这种行为。 find 稀疏值变化的示例 ( %S):

  • 0.0001355590.631297
  • 0.004668080.228736

是否因为使用 读取时文件在本地部分缓存hexdump?我注意到此更改并非特定于,例如(以及可能读取该文件的任何其他程序)hexdump也会发生同样的情况:nano

dernoncourt@server:/videos$ find myvideo.mp4 -printf "%S"
0.00302331
dernoncourt@server:/videos$ nano myvideo.mp4 
dernoncourt@server:/videos$ find myvideo.mp4 -printf "%S"
0.486752

答案1

(本回答所有信息均来自 斯蒂芬·查泽拉斯评论。谢谢!)

find 的手册页(格式是我的):

%S:文件的稀疏性。其计算公式为( BLOCKSIZE*st_blocks / st_size)。对于特定长度的普通文件,您将获得的确切值取决于系统。但是,通常稀疏文件的值小于 1.0,而使用间接块的文件的值可能大于 1.0。使用的值BLOCKSIZE取决于系统,但通常为 512 字节。如果文件大小为零,则打印的值未定义。在不支持 的系统上st_blocks,文件的稀疏度假定为 1.0。

注意:

  • BLOCKSIZE*st_blocks对应于磁盘使用情况,
  • st_size对应于表观尺寸。

因此,%S== BLOCKSIZE*st_blocks / st_sizediskusage/apparentsize

此外,这回答解决了文件的表观大小有时远大于实际磁盘使用情况的原因分层存储系统,例如 Lustre即使它可能根本不稀疏。它还提到,将大文件完全恢复到前端存储是不寻常的。

hexdump由于使用或等程序读取时,文件有时会部分恢复到前端存储,因此nano它会增加该st_blocks值,从而减少,这意味着( )%S (=BLOCKSIZE*st_blocks / st_size)报告的文件稀疏度减少。find%S


由于find myvideo.mp4 -printf "%S"知道 Lustre 文件系统上的文件是否稀疏是没有用的,因此可以使用以下命令解决方案经过弗罗斯特舒茨了解文件是否稀疏:

file = "myvideo.mp4"
if [ "$((`stat -c '%b*%B-%s' -- "$file"`))" -lt 0 ]
then
    echo "$file" is sparse
else
    echo "$file" is not sparse
fi

请注意,此解决方案有一些限制,如评论区

另外,请注意光泽才不是目前直接支持SEEK_HOLE/SEEK_DATA接口,所以我们不能使用使用该解决方案了解 Lustre 上的文件是否稀疏。

相关内容