文件块大小-stat和ls之间的差异


9

我注意到当我执行以下操作时:

ls -ls file

它提供了块计数,例如8个块。

当我做:

stat file

我注意到块数是16,是ls的两倍。

我的文件系统上的块大小为4096。我了解到ls使用的块的任意单位为1024。是否正确地说stat在报告块时使用512字节的任意单位?

如果是这样,是否有导致不一致的原因?

我在ext4文件系统上运行Ubuntu 11.10。

Answers:


9

许多磁盘的扇区大小为512字节,这意味着磁盘上的任何读或写操作一次传输整个512字节的扇区。设计文件系统是很自然的,其中文件之间不会分割扇区(这会使设计复杂化并损害性能);因此,文件系统倾向于使用512字节的文件块。因此,传统的实用程序(例如ls和)du以512字节块为单位指示大小。

对于人类来说,512字节的单位意义不大。1kB是相同的数量级,更有意义。文件系统块(文件被划分的最小单位)实际上通常由几个扇区组成:1kB,2kB和4kB是常见的文件系统块大小。因此512字节单元在文件系统设计中没有充分的理由,除了传统上没有其他理由在磁盘驱动程序之外完全使用512字节单元。

因此,您的传统没有太多用处,并且正在采用更具可读性的约定。有点像八进制和十六进制:没有一个是正确的,另一个是错误的,它们是写相同数字的不同方式。

许多工具都有选择显示单位的选项:ls --block-size=512对于GNU lsPOSIXLY_CORRECT=1在环境中为GNU df和GNU设置du以获取512字节单位(或传递-k为强制1kB单位)。statGNU coreutils中的命令公开为“块大小”(%B值)是内部接口的OS依赖值;根据操作系统的不同,它可能与文件系统或磁盘代码使用的大小有关,也可能与无关(通常不是—请参阅块大小和群集大小之间的差异)。在Linux上,无论任何底层驱动程序在做什么,该值均为512。%B永不重要的价值,这根本就是一个怪癖。


4

在研究了源代码和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 gnulibgnulib/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,如本问题所述


1

这些stat命令使用硬盘的物理块大小。自1956年问世以来,基本上所有硬盘都使用512字节块。但是,随着高级格式的到来,这种情况最近已开始改变。

我怀疑ls'1024byte-blocksize也有历史原因。曾经有一次文件系统具有1024的块大小是很常见的,或者它曾被用来提供千字节大小。但是(至少可以使用GNU coreutils)您可以使用--block-size=选项指定块大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.