我总是假设/ ... 系统调用st_blocks
返回的字段用于获取文件的磁盘使用情况以 512 字节为单位表示。stat()
lstat()
du
检查POSIX规范,我现在看到 POSIX 对此没有做出保证。perl
其自身stat()
功能的文档还警告不要做出这种假设。
st_blksize
无论如何,正如 POSIX 所指示的,该块大小与返回的字段无关stat()
,因此必须在其他地方找到。
检查 GNUdu
或 GNUfind
源代码,我看到 HP/UX 使用 1024 字节单位的证据。 GNUfind
调整其-printf %b
输出以始终提供多个 512 字节单位,这可能是我困惑的根源。
目前是否还有其他仍在使用的类 Unix 系统不是st_blocks
以 512 字节为单位表示的?这可以依赖于文件系统吗(正如 POSIX 所建议的那样)?我想安装 HP/UX NFS 共享可以做到这一点。
答案1
st_blksize
称为“最佳 I/O 大小”,与 所使用的单位无关st_blocks
。当然,最佳 I/O 大小是特定于文件系统的。这是fast filesystem
1981/1982 年 Berlekey 开发的结果。以前,可用文件系统中没有最佳块大小
st_blocks
以 为单位表示,DEV_BSIZE
在 HP-UX 上确实是 1024。DEV_BSIZE
是特定于平台的常量。后来,当FFS
重命名为时UFS
,BSD UNIX 中出现了第二个文件系统,它具有与间接块相关的不同行为,并且需要这个新stat()
字段。之前,du
只知道文件系统中间接块的算法。
如果您运行 HP-UX NFS 文件服务器和其他 NFS 客户端,您会从 HP-UX NFS 服务器收到错误报告,除非df
HP 在过去 15 年中修复了他们的问题,而我无法访问最新版本的 HP-UX 。据我所知,没有其他 UNIX 存在类似的 NFS 相关错误。
顺便说一句:直到 NFSv3,NFS 假定块大小为 512,HP 需要在服务器中转换其 NFS 报告。 NFSv4 没有做出这种隐含的假设,但 HP-UX 仍然报告错误的数字。
据我所知,没有其他 UNIX 是基于 1024 的DEV_BSIZE
。