Answers:
许多磁盘的扇区大小为512字节,这意味着磁盘上的任何读或写操作一次传输整个512字节的扇区。设计文件系统是很自然的,其中文件之间不会分割扇区(这会使设计复杂化并损害性能);因此,文件系统倾向于使用512字节的文件块。因此,传统的实用程序(例如ls
和)du
以512字节块为单位指示大小。
对于人类来说,512字节的单位意义不大。1kB是相同的数量级,更有意义。文件系统块(文件被划分的最小单位)实际上通常由几个扇区组成:1kB,2kB和4kB是常见的文件系统块大小。因此512字节单元在文件系统设计中没有充分的理由,除了传统上没有其他理由在磁盘驱动程序之外完全使用512字节单元。
因此,您的传统没有太多用处,并且正在采用更具可读性的约定。有点像八进制和十六进制:没有一个是正确的,另一个是错误的,它们是写相同数字的不同方式。
许多工具都有选择显示单位的选项:ls --block-size=512
对于GNU ls
,POSIXLY_CORRECT=1
在环境中为GNU df
和GNU设置du
以获取512字节单位(或传递-k
为强制1kB单位)。stat
GNU coreutils中的命令公开为“块大小”(%B
值)是内部接口的OS依赖值;根据操作系统的不同,它可能与文件系统或磁盘代码使用的大小有关,也可能与无关(通常不是—请参阅块大小和群集大小之间的差异)。在Linux上,无论任何底层驱动程序在做什么,该值均为512。%B
永不重要的价值,这根本就是一个怪癖。
在研究了源代码和POSIX标准之后,我会说@ antje-m和@Gilles的答案基本上是正确的。
值得引用POSIX.1-2008的评论作为摘要:
512字节单位的使用是历史惯例,并在此POSIX.1-2008中保持与ls和其他实用程序的兼容性。这并不要求文件系统本身必须基于512字节的块。添加了-k选项作为一种折衷措施。标准开发人员同意512字节是最佳的默认单位,因为它在系统V上具有完整的历史一致性(与BSD系统上的512/1024字节混合使用),并且使用-k选项可以切换到1024-字节单位是一个很好的折衷方案。希望使用更具逻辑性的1024字节数量的用户可以轻松地将df别名为df -k,而不必破坏许多依赖512字节单位的历史脚本。
对于块大小ls -s
:
POSIX 表示,除非-k
给出选项,否则默认的块大小是实现定义的。
中实现的默认块大小在GNU coreutils
ls
中定义GNU gnulib
:
gnulib/lib/human.c
/* The default block size used for output. This number may change in
the future as disks get larger. */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif
这来自旧的提交:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date: Mon Jun 29 15:23:04 1998 +0000
提交消息本身并没有说明数字1024。
并注意,du
和中使用的块大小df
也是1024,ls
只是选择与它们一致。虽然for,du
并且df
它与POSIX标准冲突(所以这里是环境变量POSIXLY_CORRECT
)。这似乎是GNU团队的决定,有关此争议,请参见Wikipedia页面POSIX。
对于命令stat
。
它不是POSIX标准的一部分,但是系统调用是。但是,块大小的单位尚未标准化(sys_stat.h):stat
stat结构的st_blocks成员的单位未在POSIX.1-2008中定义。
该stat
命令仅显示stat
系统调用提供的信息,并使用512块大小,几乎没有例外(它们是非Linux操作系统,例如HP-UX,IBM AIX等。请参见中定义的宏gnulib/lib/stat-size.h
)。
因此,数字512更是历史选择和Linux惯例。
的GNU coreutils
(因此ls
命令)不Linux内核(因此的一部分stat
呼叫)时,他们的目标是不同的系统方面中,GNU coreutils
则多为人类(更易于阅读),和Linux内核对硬件抽象(因此更接近于硬件)。
编辑:4096块大小是“ IO块”大小,实际物理块大小可能仍为512 Byte,如本问题所述。