浅析文件系统索引节点

文件有两种数据组成,数据和元数据,创建一个分区的时候,需要把分区格式化,就是创建文件系统,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,软连接数据区只存储路径。

今天的分享就到这了~~~~~~~

时间: 2025-01-04 07:20:46

浅析文件系统索引节点的相关文章

linux文件系统索引节点浅析

索引节点,Inode是Index Node的缩写,存储于文件系统上的任何文件都可以用索引节点来表示,所以也可以说索引节点是整个linux文件系统的基础.操作系统在读取硬盘的时候不是一个块一个块的来读取信息,因为这样做的话效率太低,文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者.文件的创建日期.文件的大小等等.这种储存文件元信息的区域就叫做inode,中文译名为"索引节点". 在Linux系统中,文件系统主要分为两部分,

目录、目录项、超级块、索引节点、文件

unix中,文件系统被安装在一个特定的安装节点上,该安装点在全局层次结构中被称为命名空间,所有已安装的文件系统都作为根文件系统树的枝叶出现在系统中.本质讲,文件系统是特殊的数据分层存储结构,包含文件.目录和相关的控制信息. 目录: 1.作用:文件是通过目录组织起来的,目录相当于文件夹,用来容纳对应的文件 2.一个例子: /home/csj/1.c 什么是目录,分析一下上面的例子. 根目录 / 这个名词应该都不陌生,后面的 home表示家目录,csj也表示目录,最后的1.c表示一个程序文件 3.上

Linux文件系统与索引节点inode浅析

我们知道磁盘在分区后还需要进行格式化,之后操作系统才能使用这个分区.而需要格式化的原因正是因为每种操作系统所设置的文件属性/权限并不相同.在Linux中,传统的磁盘文件系统是EXT,下面以EXT为例浅析Linux的文件系统与索引节点. 我们知道,文件的数据除了文件实际内容之外,通常还含有非常多的属性.文件系统通常会将权限与属性等数据放置到inode(index node)中,至于实际数据则放置到data block块中:另外,还有一个超级块会记录整个文件系统的整体信息. 在文件系统中,每个ino

inode 索引节点和软硬链接

Inode 索引节点 inode(index node)表中包含文件系统所有文件列表 一个节点(索引节点)是在一个表项,包含有关文件的信息(元数据),包括: 文件类型,权限,UID,GID 链接数(指向这个文件名路径名称个数) 该文件的大小和不同的时间戳 指向磁盘上文件的数据块指针 有关文件的其他数据 inode表结构 ls -i 可以查看节点编码 Inode table 节点表 是存放元数据的,每一个分区都有一个节点表. 在一个分区里一个文件只有一个节点号,就像人的身份证号 硬链接: 命令是l

文件描述符、文件描述符表、打开文件表、目录项、索引节点之间的联系

文件描述符.文件描述符表.打开文件表.目录项.索引节点之间的联系如下图所示: 每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体. 在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos).在上图中,进程1和进程2都打开同一文件,

linux索引节点及值(弄清十分必要)

各位看官, [[email protected] aaa]# ls -l test.c -rw-r--r--. 1 root root 3 Aug  1 07:49 test.c      #看加粗1    原始test.c文件索引节点值为1,也就是每个文件第一次生成时候都是唯一的1值 [[email protected] aaa]# ln test.c test1.c     #硬链接文件test1.c [[email protected] aaa]# ls -li test* 262594

inode索引节点和硬连接软连接(草稿)

什么事inode节点? inode结点是文件系统的组成部分,inode节点表中只存放文件的属性信息,这样的设计有很多的好处, 比如,当我们要访问一个文件时,并不是在整个磁盘上搜索,而是在这个inode表中搜索索引信息,inode上存放着数据的指针信息(就是文件的地址块),也便于管理. 一个节点(索引节点)是一个表项,存放有关文件的元数据包括: 文件类型,权限,UID,GID 连接数(指向该文件名的路径的个数) 该文件的大小和时间戳 指向磁盘上文件的数据块指针 有关文件的其他数据

Linux索引节点(inode)用满导致的一次故障

一.发现问题: 在一台配置较低的Linux服务器(内存.硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题. 二.分析问题: 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件. inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份

Linux索引节点以及链接

在学习Linux中,索引节点以及链接概念都是一个既简单又重要的基础概念,一下是我学习这两个概念的总结,在此分享给大家,如有不当之处,敬请各位大神留言提醒,谢谢! 1.0  Linux索引节点 在Linux文件系统中,不管什么类型的文件,保存在磁盘分区中,系统都会给它分配一个编号,称为索引节点index node.在Linux中,存在多个文件指向同一个inode,这种情况一般称为硬链接[hard link]. 一个索引节点(inode)是在一个表项,包含有关文件的信息(元数据),包括:文件类型,权