问:说说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到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章