EXT3:如果块大小为4K,为什么ls -l显示低于该大小的文件?


16

如果在包含一个字母的文件上运行ls -l,它将以2B大小列出。如果您的文件系统以4k块为单位,我认为它会将文件舍入到块大小?是因为ls -l实际上是从inode读取字节计数吗?在什么情况下,您可以在Linux 2.6内核GNU utils中四舍五入来阻止答案,而不是实际字节数答案?


2
请记住,ext4引入了“小文件打包”的概念,因此,小文件将占用其inode占用的相同磁盘块(从而避免浪费磁盘块):lwn.net/Articles/469805
oakad

Answers:


20

我猜您用echo a > file或将一个字母输入到文件中vim file,这意味着您将拥有该字母和一个附加的换行符(两个字符,因此两个字节)。 ls -l显示文件大小(以字节为单位),而不是块(更具体地说:文件长度):

$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$

(请注意,将cat -A换行符显示为$字符)

与相比ls -ldu将显示磁盘上实际占用的大小:

$ du testfile
4

(实际上,du以1kiB为单位显示大小,因此这里的大小是4×1024字节= 4096字节= 4 kiB,这是此文件系统上的块大小)

ls显示此内容,您必须使用-s选项代替/ -l

$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile

第一列是分配的大小,再次以1kiB为单位。最后可以通过指定来更改--block-size,例如

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile

3
而且,很高兴拥有这两个信息。文件系统可以执行“尾部压缩”(sp?)(使用短文件之间共享的一个块),“写时复制”和“打孔” ...使文件大小<->磁盘空间关系变得复杂。
Rmano 2014年

9

我认为最深刻的答案如下:

逻辑文件长度和占用的磁盘空间实际上是不同的。

如其他答案所示,从原理上讲,使用两个字节创建的文件的长度为两个字节(以表示ls -l),并占用4 KiB(以du或表示ls -ls)。

看到:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

好的,test长度为1,大小(在磁盘上)为4 KiB。但:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(第一个命令将8191个零字节添加到test),现在测试的长度为8192,但仍在磁盘上占据4 KiB(它有一个“孔”)(1)。

某些文件系统还可以压缩短文件,以便它们通过共享块(例如参见尾部打包)来占用较少的空间,而其他文件系统(如btrfs)确实在写时进行复制,因此文件之间的关系,其逻辑长度以及它占用的空间是多少。磁盘是一个复杂的磁盘。

脚注:

(1)它实际上不是一个孔,它在末尾……但仍然可以运行到示例的末尾。


5

ls -l只是长格式。ls -ls用于显示块大小。

测试中

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

我们可以看到文件的大小列为2B。但是,如果需要检查块大小,则需要运行以下命令。

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

上面的4显示使用的块大小。我们还可以使用stat命令来验证相同的内容。

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

现在出现了一个问题,为什么ls -ls将块大小stat显示为4而将块大小显示为8。在此处的答案中已清楚说明了此行为的原因。

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

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.