![EXT3:如果块大小为 4K,为什么 ls -l 显示的文件大小低于该大小?](https://linux22.com/image/53752/EXT3%EF%BC%9A%E5%A6%82%E6%9E%9C%E5%9D%97%E5%A4%A7%E5%B0%8F%E4%B8%BA%204K%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20ls%20-l%20%E6%98%BE%E7%A4%BA%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F%E4%BD%8E%E4%BA%8E%E8%AF%A5%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
如果您对包含一个字母的文件运行 ls -l,则该文件的大小将显示为 2B。如果你的文件系统是 4k 块,我认为它会将文件四舍五入到块大小?是因为 ls -l 实际上从 inode 读取字节数吗?在什么情况下,您会在 Linux 2.6 内核 GNU utils 中将块答案与实际字节数答案进行四舍五入?
答案1
echo a > file
我猜你用or将这一个字母放入文件中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 -l
,du
将显示磁盘上实际占用的大小:
$ 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
答案2
我认为深刻的答案如下:
逻辑文件长度和占用的磁盘空间确实是不同的东西。
正如其他答案所示,原则上用两个字节创建的文件的长度为两个字节(由 表示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)这其实并不是一个洞,它在最后......但是,它仍然有效到示例的末尾。
答案3
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
将块大小列出为 4,而stat
将块大小显示为 8。答案中清楚地解释了这种行为的原因这里。
许多磁盘的扇区大小为 512 字节,这意味着磁盘上的任何读取或写入操作都会一次传输整个 512 字节扇区。设计文件系统时,扇区不会在文件之间分割(这会使设计复杂化并损害性能),这是很自然的;因此文件系统倾向于对文件使用 512 字节块。因此,传统的实用程序(例如和)
ls
以du
512 字节块为单位指示大小。