理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫作扇区,每个扇区储存512字节,相当于0.5KB。
*** 作系统读取磁盘的时候,不会一个一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次读取一个块。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据都存储在块中,很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等。这种储存文件元信息的区域就叫作inode,中文译名为索引节点。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
接下来,小编为大家简述一下Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程:
Linux通过inode节点表将文件的逻辑结构和物理结构进行转换。
inode节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在inode节点表中最重要的内容是磁盘地址表。在磁盘地址表中有13个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应地块。
Linux文件系统通过把inode节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的inode节点号,通过该inode节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。
答: inode(即index node,索引节点)是类Unix OS中保存文件系统中的对象元数据的数据结构。 全文完,谢谢食用。
……开玩笑的,下面稍微深入地谈谈inode,以及与它相关的一些小知识。
所谓“文件系统中的对象”,是个非常广义的概念,毕竟Linux中几乎一切都是文件,包括普通文件、目录、设备、管道、Socket等等。inode就用来保存这些东西的元数据,不包括具体的数据,也不包含文件名。具体来讲,inode中主要存储以下这些元数据:
其中,inode编号相当于这个结构中的“主键”,也就是说 *** 作系统用inode编号唯一标识一个文件。利用 stat 命令可以查看元数据信息,如下图所示。通过 ls -i 也可以仅查看一个或一批文件的inode编号。
inode存储的元数据也是要占用文件系统空间的,每个inode的大小一般是128B或者256B,这可以通过查询superblock信息的 dumpe2fs 命令查到。
Linux在格式化硬盘分区(即初始化文件系统)时,就会将inode的区域(称为inode table)与文件数据的区域分开,一般每1KB或2KB数据分配一个inode编号。也就是说,每个分区的inode总数从格式化之后就固定了,因此有可能会出现存储空间没有占满,但因为小文件太多而耗尽了inode的情况。
利用 df -i 命令可以查看inode数量方面的信息,如下图所示。
下面我们来看看Linux系统中最常见的几种文件 *** 作是如何体现inode的。
当复制一个文件时,会创建一个包含新inode的新文件。
当移动一个文件时,仅仅是inode指向的位置发生变化,inode编号与实际数据存储的块的位置都不会变化。
Linux系统允许同一个inode号代表的文件有多个文件名,即可以用不同的文件名访问同一份数据,这叫做硬链接。对一个文件创建硬链接,其inode编号都相同,并且链接数会增加。
特别地,目录中默认包含的两个项 . 和 .. 实际上就是对当前目录和父目录的硬链接,inode编号也对应。
但是Linux系统不允许用户对目录创建硬链接,因为Linux的目录结构是无环图,随意创建硬链接之后会产生环。
软链接的本质也是一个文件,其存储的内容是对另一个文件的指针。所以对一个文件创建软链接,inode编号会不同,被指向文件的链接数不会增加。并且可以对目录与不存在的文件创建软链接。
当删除文件时,会先检查inode中的链接数。如果链接数大于1,就只会删掉一个硬链接,不影响数据。如果链接数等于1,那么这个inode就会被释放掉,对应的块也会被标记为空闲的。
由上图可以看出,如果把上述profile_copy文件删掉,那么原先创建的两个hardlink文件就变为了两个不同的文件(其中一个文件会继承原来的inode编号),其链接数为1,并且仍然可以正常访问。相对地,softlink文件就变成了悬挂链接(dangling link),不能正常访问了。
利用inode还可以删除一些文件名中有转义字符或控制字符的文件,最典型的就是开头为减号 - 的文件。这种无法直接用rm命令来搞,就可以先查出它们的inode编号再删除:
全文完,谢谢食用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)