问:说说inode到底是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问:说说inode到底是啥?相关的知识,希望对你有一定的参考价值。

参考技术A

答: 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编号再删除:

全文完,谢谢食用。

Linux中的双点(..)和单点(.)是啥?

【中文标题】Linux中的双点(..)和单点(.)是啥?【英文标题】:What is double dot(..) and single dot(.) in Linux?Linux中的双点(..)和单点(.)是什么? 【发布时间】:2014-06-08 03:37:08 【问题描述】:

ls -ai 命令显示... 的inode 分别与当前目录和父目录相同。

... 到底是什么?

它们是真实文件还是硬链接?但据我所知,不允许创建指向目录的硬链接。

【问题讨论】:

三点在哪里!?不小心被mv...一起使用了,相关目录就不见了! 找到了。它在同一个目录中,名为...,因此被隐藏,因为它以点开头:) 这就是为什么很多命令你可以通过. 例如git add .,将暂存当前目录(及其子目录)中的所有内容,而 git add .. 将暂存父目录(及其子目录)中的所有内容 对于在此处重定向的 Windows 问题,请注意“.”和“..”条目(仅存在于非根目录中)在 Windows 中是虚拟的。内核对象管理器、I/O 管理器和文件系统驱动程序不实现它们(除了在相对符号链接的目标路径中)。在规范化路径中,“.”和“..”组件由用户模式运行时库使用基于规则的路径操作解析。如果它们在逐字“\\?\”路径中直接传递给内核模式,文件系统会按字面意思处理它们,无论是作为保留名称 (NTFS) 还是作为功能失调的名称 (FAT32)。 【参考方案1】:

. 表示您正在使用的当前目录,并且 ..代表父目录。

例子:

假设您在目录/etc/mysql 中,并且您想移动到父目录,即/etc/。然后使用cd..:

/etc/mysql> cd ..

如果你想设置当前目录bash文件中的一个文件的路径,使用.,文件名如下:./filename

【讨论】:

你说的“在当前目录bash文件中”是什么意思?你能详细说明一下吗? @PeterMortensen 这意味着,如果你想设置当前目录中的文件的路径。 @Deva 当您说“设置路径”时,会执行文件还是将包含文件的目录的绝对路径添加到 PATH 环境变量中? @DaCruzR,在 bash 文件中说设置路径,如果我们需要访问另一个文件,那么我们正在设置路径。甚至 ./filename 也用于执行文件。【参考方案2】:

它们不是硬链接。您可以将其更多地视为此目录 (.) 和此目录的父目录 (..) 的简写。

尝试删除或重命名...。然后你就明白为什么它不是硬链接了。

【讨论】:

在大多数 UNIX 文件系统中,它们硬链接,但是,由于它们内置在文件系统中,因此您无法删除它们。【参考方案3】:

它们是特殊的 name-inode 映射,虽然它们不是真正的硬链接,但它们确实算作硬链接(它们确实增加了链接数),因为正如你所说,目录不能有硬链接.在这里阅读更多:Hard links and Unix file system nodes (inodes)

【讨论】:

【参考方案4】:

.代表你所在的目录,..代表父目录。

来自dot definition:

这是一个短字符串(即字符序列),添加到 文件的基本名称(即名称的主要部分)的结尾 或目录以指示文件或目录的类型。

在类 Unix 操作系统上,每个目录至少包含 一个对象用一个点表示,另一个用两个点表示 连续的点。 前者是指目录本身和 后者指的是其父目录(即, 包含它)。这些项目是自动创建在每个 目录,可以通过使用带有 -a 选项的 ls 命令看到 (指示它显示其所有内容,包括隐藏的 项目)。

【讨论】:

它们是作为目录硬链接的真实文件吗? @Cubarco:- 这些不是硬链接! 我不知道为什么这个答案有这么多的赞成票。这些问题专门询问“究竟. 和.. 是什么?”不是“他们代表什么”或“他们做了什么”

以上是关于问:说说inode到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章

磁盘扇区、IO块、inode、文件、目录、硬链接与软链接到底是啥?

inode是啥

用于存储 inode 的数据结构是啥?

linux上的inode编号是啥

Inode是啥意思

inode 列 (proc/net/tcp(6)) 中的值是啥意思?