superblock定义:
顾名思义超级块,主要是用来存放当前文件系统的一些全局信息,包括但不限于:inode个数,block个数,mount时间、mount节点、journal信息等
superblock数据:

图1 superblock 数据和结构体
使用dumpe2fs工具dumpsuperblock相关信息:
图2 superblock dump信息
注:该dump信息注意同上图的信息一一对照更能加深理解。
superblock 数据结构
struct ext4_super_block {
/*00*/ __le32 s_inodes_count; /* Inodes count */
__le32 s_blocks_count_lo; /* Blocks count */
__le32 s_r_blocks_count_lo; /* Reserved blocks count */
__le32 s_free_blocks_count_lo; /* Free blocks count */
/*10*/ __le32 s_free_inodes_count; /* Free inodes count */
__le32 s_first_data_block; /* First Data Block */
__le32 s_log_block_size; /* Block size */
__le32 s_log_cluster_size; /* Allocation cluster size */
/*20*/ __le32 s_blocks_per_group; /* # Blocks per group */
__le32 s_clusters_per_group; /* # Clusters per group */
__le32 s_inodes_per_group; /* # Inodes per group */
__le32 s_mtime; /* Mount time */
/*30*/ __le32 s_wtime; /* Write time */
__le16 s_mnt_count; /* Mount count */
__le16 s_max_mnt_count; /* Maximal mount count */
__le16 s_magic; /* Magic signature */
__le16 s_state; /* File system state */
__le16 s_errors; /* Behaviour when detecting errors */
__le16 s_minor_rev_level; /* minor revision level */
/*40*/ __le32 s_lastcheck; /* time of last check */
__le32 s_checkinterval; /* max. time between checks */
__le32 s_creator_os; /* OS */
__le32 s_rev_level; /* Revision level */
//.....
};
Inode /Inode table/File/Dentry:
Inode:节点,是文件(对象、实体)在文件系统中的唯一标示。可以这么来理解,Inode是底层封装给文件系统的最小操作单元。
Inode是在UNIX* 文件系统中用于描述文件系统对象(如一个文件或者目录)的一个数据结构,每个inode都存储有相关属性以及系统对象数据的存储位置。
Inode是文件(对象、实体)在文件系统中的唯一标识。独立的文件系统提供了filename和唯一inode标识符之间的转换方法。inode结构的一部分如下图五所示,同事也展示了其他的一些同inode强相关的结构。
在这里我们需要注意 inode_operations file_operations。这些结构所对应的最小操作单元是inode。例如:inode_operations定义了对inode上的目录的操作,file_operations定义了inode上文件的操作(通常叫做系统调用)
Inode table:Inode 表,描述inode的一个数组。The inode table is a linear array of struct ext4_inode
File:已打开文件在内存中的表示,主要用于加你进程和磁盘上文件的对应关系;通常有sys_open()创建。
Dentry:目录对象,代表一个目录项(包含该目录对象的索引节点,子目录链表、父目录链表对象以及与他攻击的目录对象链表使用计数等)是路径的一部分
(路径中每个组成部分都由一个索引节点对象表示),只存在与内存中。
block size:块大小,通常为4k(可变的),通常不会超过page seize。
File Descriptor:在类UNIX*操作系统中,文件描述符是一个抽象的用于访问文件或者其他输入输出资源一个指示符。file descriptor大于零,file descriptor的最大值通常由操作系统限定。
看了上面的定义是不是有点儿饶?没关系,看下下面的逻辑图:
图3 inode dentry等之间关系
从上图我们看到,有三个进程process1、process2、process3,并且有与之对应的三个文件对象file object1 、file_object2和file_object3,这都是一一对应的。file_object1 、file_object2却对应到了同一个dentry object
而两个(不一定就只是两个,可能一个、或多个)dentry object只对应一个inode object;inode object的相关信息在superblock中有存储的。
这样我们就一下子从操作系统进程级别联系到了磁盘存储级别了。其实这里有一个更好的理解方式就是,分为两层:软件层、硬件层;软件层你看得见摸不着,只是一种状态;硬件层你能通过技术手段看到,不只是状态更是一种持续。
Dentry 和 Inode
通过上图3,大致了解了Dentry、Inode、File、superblock之间的关系。但是也容易看到这之间的关系最重要的当属Dentry和Inode之间的关系了,这里着重介绍下。
假设我们有如下结构
/
|
foo
| \
bar bar2
在上面所示的结构中,可以提取到如下信息:
有4个inode,分别是foo,bar,bar2,/
有3个denry, 分别是bar–>foo、bar2–>foo、foo–>/
对于上述的关系,做一个简单的说明。对于一个d_name为bar的dentry来说,该dentry拥有一个指向底层文件名为bar的指针d_inode、一个指向父dentry的指针d_parent。对于root dentry来说,d_parent指向自己。
从dentry到inode之间由d_inode指针来维护。一个inode可以对应多个dentry,多个dentry只能对应一个inode。在同一文件系统中,一个文件可以被多个dentry引用(硬链接)。这种dentry到inode之间的映射关系有这样一种特性:
除非当前文件的所有dentry引用都被删除,否则当前file是不会被删除的。
文件和目录的操作者是进程,其实质是操作想用的数据结构。在进程所操作的数据结构中包含了指向dentry的指针。
Inode和superblock
Inode也同superblock之间保存有密切的联系。在inode的结构体中有一个指向superblock的指针i_sb。superblock是一个描述了当前文件系统状态的结构体,通常是存储在物理设备上。
mount
这里介绍下mount,之前一直搞不懂mount到底要干嘛。
将文件系统和存储设备联系起来的方法:挂载(mounting)。mount命令通常被用于将文件系统和当前文件目录级别联系起来。在mount过程中需要提供文件系统类型、文件系统、挂载点。
- 第一步:基于当前文件系统中的文件创建一个文件系统file256mb.img(file256mb.img对于当前文件系统来说是一个文件)。
dd if=/dev/zero of=file256mb.img bs=4k count=65536
- 第二步:使用mke2fs在file265mb.img上创建文件系统(从file256mb.img自身角度来说,他是一个文件系统了)
mke2fs -t ext4 -c file265mb.img
- 第三步:创建一个挂载点(从当前系统角度来说,他就是一个目录,一个文件;但是从即将要挂在文件系统的角度来说,他就是一个存储设备)
mkdir /path/to/mount/point
- 第四步:将文件系统挂载到当前文件级别(将文件系统和存储设备关联起来) mount -t ext4
file256mb.img /path/to/point
参考资料
File_descriptor
Inode
Ext4_Disk_Layout