Ext2文件系统的总体布局,如下图。
1文件系统的最小存储单元是块(block),块的大小一般为512Bytes,或者是它的整数倍,块的大小是在格式化是所确定的。不能修改除非重新格式化。上图中显示了文件系统的总体布局,由一个Boot Block和对个Block Group组成,每个Block Group内部还有其他结构组成。
- Boot Block:启动块,大小为1KB,它的大小是由PC标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不可以使用启动块。
- Super Block:描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。超级块在每个块组的开头都有一份拷贝。
- 块组描述符表(GDT,Group Descriptor Table):由很多块组描述符组成,整个分区有多少个快租就对应有多少个块组描述符。每个块组描述符存储了一个块组的描述信息,包括这个块组是从哪开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。和Super Block相似,块组描述符表在每个块组的开头都有一个拷贝,这么做的原因是因为这些信息十分重要。一旦Super Block意外损坏就会丢失整个分区的数据,一旦GDT意外损坏就会丢失整个块组的数据。
- Block Bitmap:块位图的目的是为了让文件系统知道,那些块是空闲的,那些块已经存储了数据。块位图本身会占用一个块,其中的每个bit代表组中的一个块,1表示已用,0表示为空。
- inode Bitmap:它的作用和Block Bitmap相似,本身占用一个块,其中每个bit表示一个inode是否为空闲可用。
- inode Table:在Linux中,一个文件处理数据本身需要存储外,还需要存储一些描述信息,例如文件类型(常规、目录、符号链接等)、权限、文件大小,创建/修改/访问时间等。也就是我们用ls命令所看到的那些信息,这些信息存储在与文件相关联的inode中。每个文件都有一个inode,一个块组中所有的inode组成了inode Table。当然inode表占据多少个块是在格式化时所决定的,mke2fs工具的根据一个块组有多少个8KB就分配多少个inode,当然用户也可以自定义。
- Data Block:数据块对于不同的文件类型会有不同的情况:对于常规文件,文件的数据存储在数据块中;对于目录,该目录下的所有文件名和目录名都存储在数据块中,注意文件名保存在它所在目录的数据块,而文件的其它信息则保存在该文件的inode中;对于符号链接,如果目标路径名较短则直接保存在inode中以便更快查找,如果较长则分配到一个数据块中保存;设备文件、FIFO和socket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中。
现在我们通过一些示例来理解上面的内容
1在我的home目录下执行ls -l:
total 48
drwxr-xr-x 2 black black 4096 3月 4 18:49 Desktop
drwxr-xr-x 9 black black 4096 3月 8 11:56 Documents
drwxr-xr-x 12 black black 4096 3月 8 10:08 Downloads
-rw-r--r-- 1 black black 8980 12月 16 08:15 examples.desktop
drwxrwxr-x 3 black black 4096 1月 15 15:13 Microsoft
drwxr-xr-x 3 black black 4096 2月 10 15:44 Music
drwxr-xr-x 3 black black 4096 3月 8 19:39 Pictures
drwxr-xr-x 2 black black 4096 12月 16 22:50 Public
drwxr-xr-x 2 black black 4096 12月 16 22:50 Templates
drwxr-xr-x 2 black black 4096 12月 16 22:50 Videos
可以看到目录文件的大小都是4096或它的整数倍(新建的文件夹也是如此),这是因为这个分区的块大小为4096。
$ls -l /dev
crw-rw-rw- 1 root root 1, 5 3月 8 17:44 zero
文件zero的类型为c,表示它是一个字符设备文件,它代表内核中的一个设备驱动程序,也没有数据块,原本应该写文件大小的地方却写了1,5这两个数字,表示主设备号和次设备号,访问该文件时,内核根据设备号找到相应的驱动程序。
$touch file
$ln -s file files
-rw-rw-r-- 1 black black 0 3月 8 20:49 file
lrwxrwxrwx 1 black black 4 3月 8 20:49 files -> file
k可以看到文件file为新创建的所以大小问0,但是为什么file的软链接files却有4个字节呢?那是因为这个数字4表示的就是“file”这个四个字符,符号链接文件就保存着这样一个路径名。再来看看硬链接:
$ln file file2
$ls -l
lrwxrwxrwx 1 black black 4 3月 8 20:49 files -> file
-rw-rw-r-- 2 black black 0 3月 8 20:49 file
-rw-rw-r-- 2 black black 0 3月 8 20:49 file2
file和file2除了名字以外其它属性都一模一样,你会看到第二栏的数字原本是1,但是现在变成了2,那是因为file和file2是同一个文件在文件系统中的两个名字,这个数字2表示硬链接数,也就是一个文件有多少个别名。