1. linux文件系统
文件系统的层次结构
Linux VFS(Virtual File System 又称 Virtual Filesystem Switch),即虚拟文件系统。VFS 作为一个通用的文件系统,抽象了文件系统的四个基本概念:文件、目录项 (dentry)、索引节点 (inode) 及挂载点,其在内核中为用户空间层的文件系统提供统一的API访问接口。VFS 实现了 open()、read() 等系统调并使得 cp 等用户空间程序可跨文件系统。
Linux文件系统基本概念
1扇区(sector)=512字节(byte)
1数据块(block)=8扇区=4KB(mkfs时指定,默认4KB,可设置为1KB - 64KB)
(如ext2、ext3、ext4等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。
文件存储结构大概如下:
1)、superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与是否已被挂载、挂载的时间等相关信息。
2)、inode table:记录文件的属性信息,可以使用stat命令查看inode信息。
3)、data block:实际文件的内容,如果一个文件大于一个块时候,那么将占用多个block,但是一个块只能存放一个文件。
4)、data block bitmap:记录哪些block是未使用的,哪些是已被使用,1:已使用,0:未使用。
5)、Inode bitmap:记录哪些inode节点是未使用的,哪些是已被使用,1:已使用,0:未使用。
文件系统如何存取文件的:
1)、根据文件名,通过Directory里的对应关系,找到文件对应的Inodenumber
2)、再根据Inodenumber读取到文件的Inodetable
3)、再根据Inodetable中的Pointer读取到相应的Blocks
这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inodenumber。
2.1 表空间(Tablespace)的一些基础知识
表空间是分段管理的,假如有一个表只有一个主键索引,那么这个表就有两个段,一个是内部节点段,即非叶子节点段,还有一个是叶子段,即存储数据的节点.如果一个表除了主键索引,还有一个辅助索引,那么这个这个表空间有四个段,主键内部节点段,主键叶子节点段,辅助索引内部节点段,辅助索引叶子节点段.InnoDB存储引擎有有一张图很好展示了段,区,页的关系:
2.2 Innodb page结构
一个表空间文件都是由一个一个16kb的页组成,每个页都有一个32位序号(page number),通常称为偏移量,即离表空间初始位置的偏移量.因为每个页大小为16kb,所以第0个页的偏移量为0,第一个页的偏移量为16384等等.因为32位的最大值为2^32,所以一个表空间的最大值为2^32*16kb=64TB。
ibd文件中真正构建起用户数据的结构是BTREE,在你创建一个表时,已经基于显式或隐式定义的主键构建了一个btree,其叶子节点上记录了行的全部列数据(加上事务id列及回滚段指针列);如果你在表上创建了二级索引,其叶子节点存储了键值加上聚集索引键值。
每个btree使用两个Segment来管理数据页,一个管理叶子节点,一个管理非叶子节点,每个segment在inode page中存在一个记录项,在btree的root page中记录了两个segment信息。
当我们需要打开一张表时,需要从ibdata的数据词典表中load元数据信息,其中SYS_INDEXES系统表中记录了表,索引,及索引根页对应的page no(DICT_FLD__SYS_INDEXES__PAGE_NO
),进而找到btree根page,就可以对整个用户数据btree进行操作。
上图描述了表空间、INODE页面、INODE、段、簇、页面之间的关系,也是innodb文件系统管理架构图。
ibd文件解析工具
https://github.com/sryanyuan/innoisp
参考
https://blog.51cto.com/59090939/1955122
https://blog.csdn.net/yuanrxdu/article/details/41925279
http://mysql.taobao.org/monthly/2016/02/01/
http://linux.vbird.org/linux_basic/0230filesystem.php
https://blog.csdn.net/shanshanpt/article/details/38943731
https://www.jianshu.com/p/f6bb7088b3b0