Browsed by
Category: Kernel

[C Linux 内核] 文件系统 #2

[C Linux 内核] 文件系统 #2

上文我们已经通过一个ext2文件系统的例子详细的查看了文件系统的各种属性, 数据是如何存储的 不过很显然有一个疑问: 如果一个inode只能存15个Block的索引项, 即之恩那个指向15个Datablock每一个Datablock大小又只是1KB, 那么一个文件的maxsize不就只有15KB了么, 下面就通过这个事实 , 对Linux ext文件系统的数据块寻址进行介绍 数据块寻址 对于我们上面那个例子里的ext2文件系统来说, 只有前面 12个块是直接指向一个存放数据的Datablock, 而 Block 12, 13, 14则都是间接寻址块  所谓间接寻址块, 就是将本来用作存储文件数据的Datablock用作inode索引(即在这个Datablock中存储的是一个个Block index记录) 在上述sample filesystem中 , 总共有三个间接寻址块, Block 12 13 14  他们之间的关系如下图所示 其中 浅蓝色表示真正存储数据的Datablock, 而浅绿色, 深绿色, 橙色 的 则表示一级, 二级, 三级Block索引, 以一级索引为例, 以及Block索引指向的是一个 Datablock, 这个Datablock 存放的是Block Index,而二级Block索引则指向一个Datablock ,这个Datablock存的是一系列的一级索引, 然后每一个一级索引又指向一个存放着Block Index的Datablock,以此类推 ,通过这个方法就大大扩充了一个文件的容量 文件&目录的操作函数 以下这些函数都是通过读取inode block, datablock 里相应的信息, 返回给调用者 / 对文件 or 目录进行操作  只对inode进行操作的(取出/修改) lstat, stat, fstat(取出) access (取出) chmod, fchmod(修改 st_mode) chown, fchown, lchown(修改user, group) utime(修改 atime, mtime) 同时对inode, datablock进行操作的 truncate, ftruncate(截断文件(既可以向短截断,也可以向长截断))…

Read More Read More

[C Linux 内核] 文件系统(以ext2为例)

[C Linux 内核] 文件系统(以ext2为例)

ext2文件系统的总体结构 每一个文件系统, 由若干个块组构成, 文件系统的最前面是大小固定(大小不能由用户指定,PC标准规定启动块大小为1KB)的一个启动快(Boot Block) 然后是若干块组, 每个块组内含有的信息为: 超级块(Super Block) 块组描述符表(Group Descriptor Table GDT) 块位图(Block Bitmap) inode位图(inode Bitmap) inode表(inode Table) 数据块(Data Block) 其中, 超级块是描述该文件系统(注意,不是该块)的基本信息,如 块大小, 文件系统版本号 等信息, 可以通过 dumpe2fs 的头部信息查看到superblock信息, 在该文件系统中,每一个块组的头部, 都有一份Superblock信息的copy 块组描述符表,  存储该块组的基本信息,每一个Block group一个 块位图, 每一个bit代表该块组中的一个块, 如果这个块被使用了, 则该bit为1 否则为0 inode位图, 和楼上类似,只不过这次每一个bit代表的是该inode块中的一个块, inode位图单独占一个块 inode表: 存储文件的基本描述信息, 如 文件类型, 权限, 大小, 文件的时间戳信息等, 都存储在inode块内, 多个inode块构成inode表, 而且特殊的, 一些不占用磁盘空间的文件 ,如 /dev/tty 这种设备文件, 内存映象文件等, 都只占用inode block,而不占用Data block 数据块: 数据块内数据的存储根据不同filetype有不同的情况:   对于regular file, 文件的数据存储在数据块中 对于目录文件, 该目录下的所有文件名和目录名存在数据块中, 注意, 一个 regular file的文件名不保存在他的数据块中, 而是保存在他目录的数据块中 对于符号链接, 如果目标路径短,则存在inode中, 否则, 要分配一个数据块来保存这个符号链接名 设备文件, FIFO socket等特殊文件没有数据块,只有inode块,…

Read More Read More