首页 > 代码库 > 浅析文件系统索引节点
浅析文件系统索引节点
文件有两种数据组成,数据和元数据,创建一个分区的时候,需要把分区格式化,就是创建文件系统,linux中有 ext4,xfs,ext3等文件系统,windows中有fat32 ntfs,exfat等文件系统,如果想在分区下写入存储数据,不光需要文件分区,还需要创建文件系统。现在文件系统主要分为inode和block两大部分,inode就是存储文件的元数据的部分,文件系统根据inode号识别文件,block才是真正存储数据的部分。
早期的文件的系统组成就是一个一个数据块,每个块都有自己的编号,如果一个块的大小4kb,一个文件3kb就是浪费掉了1kb,如果一个文件9kb,那么就需要占三个块,那么就占用了三个块,第三个块就是用了1\4,剩下的就是浪费了,如果a文件占用了三个数据块分别为1,2,3,b文件占用了4,5,6s三个数据块,如果删掉了a数据块,这时c文件存储进来了,它占五个数据块,占用1,2,3,7,8五个数据块,如果是在同一磁道上,它可能会知道下一个空的数据块是谁,比如1,2,3这三个数据块是连续的,它可能会知道读完1,读2,然后读3,如果不是在同一磁道上,它并不知道下一个空的数据块是哪一个,所以每个数据块它都会查看,这样就会很耽误时间,所以当文件越多就会越乱,也就造成系统卡顿的情况,所以就有磁盘碎片整理的程序。
新的文件系统就分为两大部分,一部分就是inode,一部分为数据区。inode有inode号,block有block号,用ls -i可以查看文件的inode号。
虽然inode指针有限,但是block很大,这时有些指针就可以指向block数据块 作为二级指针,那么一个block就可以存储(4k/4bytes=1024)个指针,用来专门存储指针,指向block数据区,如果一个文件4M,一个block数据区为4k,那就需要用到1024个指针,此时指针就用完了,如果文件更大呢,还是不够用的话,指针就可以指向三级指针,(1*1024*(4k/4bytes)=4G个指针),如果一个文件为4G,那么就需要4M个指针来指向block数据区这时指针等级就会越高,这就说明了一个问题,当文件越大,访问的速度就会越慢,因为指针等级越高,就会查找的速度会慢很多。
所以block大小很重要,一个数据块只能一个文件使用 ,为了避免空间浪费,block大小看文件系统的用途 ,如果存储文件的都很大,可以分8kb,16kb等,如果存储的文件都很小就可以分的小一点。删除一个文件就会释放一个inode号,每个分区文件系统(/app,/boot ,/swp,/)都有固定的inode号
inode号存储的可视化数据包含权限,uid,大小,gid,时间戳等,更多的就是指针,指针会记录所有block的位置,所有block信息都在指针中,它会指向block,给文件分配block,不需要文件自己去寻找数据存储区,所以就节省了很多时间。但是指针是有限的,例如ext2有10个直接指针,ext3有16个直接指针,如果每个指针占4beytes也就是很小。每个block4kb,如果文件过大,block数据区又分的很小避免磁盘空间浪费,所以数据块就会划分的很小),就会一个文件占用到很多个指针,这就造成了指针不够用的情况,所以该怎么办呢?
inode bitmap记录该文件系统中,哪个inode是空闲的,哪些是占用的,
block bitmap记录该文件系统中,哪block是空闲的,哪些是占用的.
如果在不同的目录下但是在同一个分区,inode号是不会有重复的,因为在同一个分区文件系统,目录也是文件,目录记录的大小是自己本身的大小,跟里面的文件无关,所以也会有自己的inode号。
作为目录来说,我们能在目录中找到文件呢?
目录的结构非常简单,就是一系列目录项的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件对应的inode号码,因为目录也是文件,目录的inode号记录的也是自己的权限,uid,时间戳,自己的大小等等,根据这些,文件系统根据目录的inode号识别是否有这个目录,目录也自己的数据区,目录的数据区存储的就是目录下的所有文件以及每个文件名所对应的inode号(也就是目录项)。人识别的是名字,文件系统识别的inode号,所以需要一个映射表。如果要找一个文件,就先要查看目录下的数据区有没有这个文件,如果有就指向这个文件的inode号,根据文件自己的inode号来指向自己的数据区。
所以可以得出以下结论:
文件通过inode号引用,人是通过文件名来引用一个文件,一个目录就是目录下的文件名和文件inode号之间的映射
在cp的命令:
复制文件,如果文件已存在就使用原有的inode号,如果文件不存在,需要分配一个空闲的inode号,在inode表中生成新条目 ,在目录中创建一个目录项,将名称与inode编号关联拷贝数据生成新的文件,所以会影响时间戳,无论是不是跨分区都一样。
在mv中的命令:
1.移动文件到其他目录下,如果mv的命令的目标和源在相同的文件系统,作为mv命令,用新的文件名创建对应新的目录项删除旧目录条目对应的旧的文件名。不影响inode表(除了时间戳)和磁盘上的数据位置,因为没有数据被移动只是目录项下目录条目的增加或者删除。
2.如果目标和源在不同的文件系统,mv相当于cp和rm。因为跨分区需要申请新的inode号,每个分区都有自己的的inode号,需要新的分区分配新的空闲的inode号给这个文件,这就相当于删除了旧的目录项和旧的inode表之间 的映射关系,创建新的目录项和inode号之间的映射关系,然后mv完成后还需要回到源目录删除掉旧的文件,此时源目录就找不到这个文件了。
硬链接:有点像是mv在同一分区,硬链接的文件不分主次关系,每个文件都是单独存在并且一模一样在目录中数据区中的目录项中,删除这个文件并不影响它的硬链接文件,它们的inode号都是一样的,所以就有文件恢复的存在,因为你删除了文件只是在释放它的inode号(删除文件一般都很快,因为不影响数据区,只是释放inode号),不影响它的链接文件,当你把它的硬链接删除完了,它的inode号就完全释放了,此时你就无法找到这个文件了,但是并不影响它的block区(数据仍然存在,只是无法通过inode号找到这个文件)所以就有数据恢复的概念,就是找到这个文件的inode号,然后进行数据恢复,前提是不能被多次覆盖,覆盖多次就相当于粉碎文件,此时就无法找到这个文件了。
所谓的粉碎文件也就是覆盖文件
如下图的疑问:
解答:目录本身不能创建硬链接,但是可以通过文件创建的方式,增加多个名字。
重点1:创建硬链接的格式:(ln 源文件 生成的链接文件),但是它们是没有区别的。不能跨分区。可以防止文件被删除。
重点2:软链接:它是一个新的文件,生成新的inode号,所以无所谓跨不跨分区,它的大小取决于指针指向的文件的字符串的长度。查看用ls -l,软连接数据区只存储路径。
今天的分享就到这了~~~~~~~
浅析文件系统索引节点