A. linux df排查inode已满及解决方法
收到监控告警,有些任务报磁盘不足的错误,通常磁盘只读一般培老慧的常见含唤原因:
判断可能是4.59和4.60两台机器跟磁盘满了
通过df查看一下:
跟磁盘并没有满,查看下inode使用率:
df命令作用是列出文件系统的整体磁盘空间使用情况。可以用来查看磁盘已被使用多少空间和还剩余多少空间。
df命令可以参考这篇 linux命令详解之df命令
df -i:
看到60的inode满了,删除4.60上的小文件即可。
df -h显示磁盘占用是没有问题;但是df -i显示磁盘inode资源占用完。
inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。
这种情况的原因通常是:尽管那个分区的磁盘占用率未满,但是inode已经用完,应该是该磁盘的某些目录下存在大量的小文件导致。尽管小文件占用的磁盘空间并不大,但是数量太多,inode用尽。
通过ls命令配合wc命令,可以查看某个文件夹下的文件数量。例如:
wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数(-b)、字数(-w)或是列数(-l)。
至配答于解决方案,可以参考文章: linux inode已满解决方法
参考:
B. Linux中的inode到底是什么
要了解 Linux 操作系统上的 inode 前,我们先来说说 Linux操作系统上的文件。对于 Linux 操作系统而言,桥备[一切皆文件]。而文件是无法独立于存储介质(这里指的是物理磁盘或内存、闪存等)存在的,一切操作系统上的文件都无时无刻不在和存储介质打交道。
例如,读取文件时需要将文件从磁盘中加载到内存中,当文件操作结束后,文件又会被存储到磁盘中。那么,既然文件要被存储到磁盘中,而磁盘是有容量限制的,那么也就是说磁盘上能存放的物理文件的数量是有限的。
如果你已经理解了这一个观点,那么恭喜你,你大体上已经知道了 inode 是干什么的。
没错, inode 是用来标识操作系统的文件的一个特征描述,而且操作系统上的 inode 并非无穷无尽,通常在你安装操作系统后,系统上的 inode 数量就已经确定了下来(不过,你可以动态修改 inode 的数量)。
你可以通过 sysctl -a 查询系统上的 inode 数量。
如上, fs.inode-nr 中的 70212 标识当前操作系统已分配的 inode 数量;21785 表示单前操作系统剩余空闲的 inode 数量
刚握耐刚说过, inode 是用来标识文件的一个特征,这是为什么呢?
Linux 系统为每一个文件都分配了一个 inode 编号,这个编号中记录了文件相关的一些元信息,通过这些元信息可以用来唯一标识一个文件。
你可以通过 ls -i 查看任意一个文件的 inode 编号
而要查看文件的元信息,你需要使用 stat {filename}
如上,即为一个文件的 inode 信息。这其中包含:
事实上,刚刚通过 stat logrotate.man 中还包括一个字段 硬链接:1 。
为什么硬链接会出现在 inode 信息中?
一般情况下,操作系统中一个文件对应一个 inode ,但是这种规则却不适用于 硬链接 文件。盖因Linux操作系统上,允许多个文件指向同一个 inode 编号。(参考自: 理解inode - 阮一峰的网络日志 (ruanyifeng.com) )
硬链接场景下,可以使用不同的文件名访问同一个文件的内容,对文件内容、属性等的修改会传递到其他文件。但删除一个链接文件,并不影响其他文件的访问。
例如,建立 logrotate.man 的硬链接文件
建立硬链接后,通过 stat 可以看到 硬链接的数量变为 2 了。
这个时候我们删除原始的链接文件,查看链接后的文件内容
删除硬链接的原始文件后,可以成功读取链接后的文件内容,此时,硬链接数量又变为了 1。
出现这种情况的原因在于,硬链接实际上是对文件增加了一个索引,这个索引指向文件的 inode 编号。当硬链接的数量大于 1 时,说明该文件除去自身外,还有多个硬链接。当硬链接的数量等于 0 时,此时操作系统已经没有任何文件指向该 inode ,也即是操作系统会回收 inode 。
事实上,每删除一个文件,是对该文件硬链接数的「减一」操作。当文件的硬链接数归 0 时,这个文件会被操作系统彻底清除掉。
最后,通常情况下,操作系统分配的 inode 数量是完全够用的段消春,但出于一些程序或人为的意外可能会导致操作系统的 inode 溢出,你可以通过 df -ih 查看系统分区下 inode 的使用情况以便及时作出应对措施。
C. Linux文件管理中VFS使用的inode是什么
在 Linux 系统中,VFS(Virtual File System)是一个抽象层,它使得 Linux 内核能够与多种文件系统进行交互。VFS 使用 inode(Index Node)来管理文件系统中的文件和目录。
inode 是一个数据结构,它存储着文件或目录的元数据信息,如文件大小、创建时间、权限等。每个文件或目录在文件系统中都对应一个 inode,而 inode 又与一个编号相关联,这个编号就是 inode 的编号。
当文件或目录被创建时,VFS 会为它分配一个 inode 编号,并且创建一个 inode 数据结构来存储元数据信息。当文件或目录被访问时,VFS 会根据 inode 编号来查找对应的 inode 数据结构,从而获取文件或目录的信息。
因此,inode 是 VFS 在 Linux 系统中管理文件和目录的一种重要方式。它能够帮助 VFS 快速查找文件或目录的信息,从而提高文件系统的性能。
D. 问:说说inode到底是什么
答: inode(即index node,索引节点)是类Unix OS中保存文件系统中的对象元数据的数据结构。 全文完,谢谢食用。
……开玩笑的,下面稍微深入地谈谈inode,以及与它相关的一些小知识。
所谓“文件系统中的对象”,是个非常广义的概念,毕竟Linux中几乎一切都是文件,包括普通文件、目录、设备、管道、察携Socket等等。inode就用来保存这些东西的元数据,不包括具体的数据,也不包含文件名。具体来讲,inode中主要存储以下这些元数据:
其中,inode编号相当于这个结构中的“主键”,也就是说操作系统用inode编号唯一标识一个文件。利用 stat 命令可以查看元数据信息,如下图所示。通过 ls -i 也可以仅查看一个或一批文件的inode编号。
inode存储的元数据也是要占用文件系统空间的,每个inode的大小一般是128B或者256B,这可以通过查询superblock信息的 mpe2fs 命令查到。
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_文件删掉,那么原先创建的两个hardlink文件就变为了两个不同的文件(其中一个文件会继承原来的inode编号),其链接数为1,并且仍然可以正常访问。相对地,softlink文件就变成了悬挂链接(dangling link),不能正常访问了。
利用inode还可以删除一些文件名中有转义字符或控制字符的文件,最典型的就是开头为减号 - 的文件。这种无法直接用rm命令来搞,就可以先查出它们的inode编号再删除:
全文完,谢谢食用。