以小窥大看文件系统

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。

以上就是一个小小的文件系统知识,你学费了吗?

你可能感兴趣的:(以小窥大看文件系统)