dhh@dhh:~/test$ ls -al
total 8
drwxr-xr-x 2 dhh dhh 4096 Mar 14 13:28 .
drwxr-xr-x 22 dhh dhh 4096 Mar 14 13:28 ..
dhh@dhh:~/test$ touch hi # 创建一个空文件
dhh@dhh:~/test$ ls -l
total 0
-rw-r--r-- 1 dhh dhh 0 Mar 14 13:28 hi
dhh@dhh:~/test$ stat hi
File: hi
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 118649 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ dhh) Gid: ( 1000/ dhh)
Access: 2022-03-14 13:28:24.684984000 +0800
Modify: 2022-03-14 13:28:24.684984000 +0800
Change: 2022-03-14 13:28:24.684984000 +0800
Birth: -
如上所示,我们创建了一个空文件。我们注意到上面的 Size 是0,Blocks 是0,IO Block是 4096.
这里要说明的是 IO Block,它是文件系统 format 的时候的一个参数。
我们设想,我们有一块空间,譬如100GiB,我们要将其格式化成 ext4 来存文件。我们首先将这100GB分成4096字节一小块的空间来管理。然后我们用一个二进制字符串来标记空间有没有被占用 0b00000……(总共有 100GBx1024x1024x1024/4096个0)。如果第一个4KiB被占用了,那么就更新为 0b10000……(这里的第一个0变成了1)。
dhh@dhh:~/test$ echo 1 > hi
dhh@dhh:~/test$ xxd hi
00000000: 310a 1.
dhh@dhh:~/test$ stat hi
File: hi
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 118649 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ dhh) Gid: ( 1000/ dhh)
Access: 2022-03-14 13:28:49.074984000 +0800
Modify: 2022-03-14 13:28:46.364984000 +0800
Change: 2022-03-14 13:28:46.364984000 +0800
Birth: -
dhh@dhh:~/test$ du -sh hi
4.0K hi
dhh@dhh:~/test$
如上所示,我们往文件里面写入了2个字节,也就是 ”1\n“,即 xxd 里面显示的“310a”,那么我们可以看到文件的 Size 变成了 2。同时我们看到 du 显示文件占用了 4KiB 的空间。
另外一个,我们看到 Blocks 是8,那是因为底下磁盘是 512 字节的扇区,8个512扇区就正好是 4KiB。
以上就是一个小小的文件系统知识,你学费了吗?