linux inode 详解 / 线上inode爆满解决方案

2023-05-16

linux inode 详解 / 线上inode爆满解决方案

本文大量参考阮一峰大神博客,整理笔记

之所以写inode文章是由于一次线上问题,引发对inode深入的思考。
磁盘的inode监控与磁盘空间的监控同等重要,线上服务器一定要做好磁盘inode与磁盘空间的监控。
由于本人对linux研究有限,目前参考大量阮一峰大神博客整理而成。

解决inode爆满问题

一般inode爆满情况就较为严重了,程序运维会有问题,会报磁盘无空间 No space left on device。所以做好监控非常重要。
线上服务器inode爆满但是磁盘空间还有很大是什么原因呢?其实就是小文件太多了,占用了所在磁盘的所有元数据空间,解决方案就是删除这么小文件或者mv 掉这些小文件
如何排查哪个目录占用inode多少了 可以用 df -i
如果删除 直接用 rm -rf xxx 基本是行不通的 会报 Argument list too long 问题,就是要删除的文件太多了。
我一般会用

find .  -ctime +7 -name "*" | xargs -i rm -rf {} 

大概解释一下这个命令,删除当前目录下 7天前所有数据,如果还有 Argument list too long问题,就把时间适当调前一些,比如30天前 -ctime +30。
inode爆满问题不好避免,再次强调磁盘的inode监控与磁盘空间的监控同等重要!
下面会介绍inode一些基础知识


一、inode是什么?

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

二、inode的内容

inode包含文件的元信息,具体来说有以下内容:

       * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置

总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
可以用stat命令,查看某个文件的inode信息:

    stat .bashrc

945048-20180908224432490-912881394.png

三、inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的1/8空间(12.5%)。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

df -i

如下图所以,磁盘容量会与inode数成正比。
945048-20180908225118361-1222535762.png
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
会报磁盘空间已满的错误 No space left on device

四、inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

  ls -i .bashrc

945048-20180908230034594-1059919776.png

五、目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

ls命令只列出目录文件中的所有文件名:

  ls /etc

ls -i命令列出整个目录文件,即文件名和inode号码:

  ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。

  ls -l /etc

理解了上面这些知识,就能理解目录的权限。目录文件的读权限(r)和写权限(w),都是针对目录文件本身(即不同用户能以什么权限访问操作对该目录文件,例如这里不同用户对tmp目录文件(d可以查出tmp是目录文件,d表示directory,即目录)分别为rwxr-xr-x,第一组的三个字符,即rwx,表示文件拥有者用户的对该文件的读写权限,第二组的三个字符,即r-x,表示文件拥有者用户所在的用户组里的其他用户对该文件的读写权限,第三组的三个字符,即r-x,表示文件拥有者用户所在的用户组以外的用户对该文件的读写权限。一个某个用户下运行的进程访问操作该目录文件只能以该用户所具有的对该目录文件的权限进行操作)。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。
例如 drwxrwxr-- 2 user_a user_a
目录权限是774 这样除了user_a 用户及user_a所在组用户可以进入到 此目录中,其他用户都不可以进入。

六、硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。

但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

ln命令可以创建硬链接:

  ln 源文件 目标文件

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2(某一目录的目录名和该目录的当前目录名)加上它的子目录总数(含隐藏目录)。(因为inode信息中有一项叫做"链接数",记录指向该inode的文件名总数)

七、软链接

除了硬链接以外,还有一种特殊情况。

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

ln -s命令可以创建软链接。

  ln -s 源文文件或目录 目标文件或目录

八、inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。


参考链接:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html

posted on 2018-09-08 22:37 姜小嫌 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/jiangxiaoxian/p/9610903.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux inode 详解 / 线上inode爆满解决方案 的相关文章

  • 远程rdp vnc连接 UBuntu 10.10

    我打算用ubuntu编译Android源码 xff0c 因为编译时间较长需要远程控制一下自己的电脑 xff0c 所以想到了安装远程桌面软件 xff0c 具体方法 xff1a Ubuntu下的操作 1 Win7远程连接上Ubuntu xff0
  • AtCoder ABC 140E Second Sum

    题目链接 xff1a https atcoder jp contests abc140 tasks abc140 e 题目大意 给定一个 1 N 的排列 P 定义 X L R 的值为 P L P L 43 1 ldots P R 中第二大的
  • Sublime MinGw实现C/C++代码编译运行

    安装配置MinGw 下载安装MinGW 去官网下载MinGw xff1a http www mingw org 或者下载我已经下载好的完整版 xff1a http pan baidu com s 1gfgluin 2017 7 5更新 如图
  • Ajax发送POST请求SpringMVC页面跳转失败

    问题描述 xff1a 因为使用的是SpringMVC框架 xff0c 所以想使用ModelAndView进行页面跳转 思路是发送POST请求 xff0c 然后controller层中直接返回相应ModelAndView xff0c 但是这种
  • Debian命令

    1 dpkg i 安装下载的软件包 2 shutdown h now 关机 3 fdisk l 查看当前盘 4 lspci 用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具 如lspci v 参数 xff1a v 使得 ls
  • 堡垒机-teleport的安装以及常见问题解决办法

    teleport是一款简单易用的堡垒机系统 xff0c 运用在企业对windows linux服务器的安全使用管理以及审计 官网网址 xff1a http teleport eomsoft net github地址 xff1a https
  • 【Luogu】P1593因子和(唯一分解定理,约数和公式)

    题目链接 首先介绍两个定理 整数唯一分解定理 xff1a 任意正整数都有且只有一种方式写出素数因子的乘积表达式 A 61 p1k1 p2k2 pnkn 求这些因子的代码如下 for int i 61 2 i i lt 61 a 43 43
  • 通用组件—SvgIcon引入和使用

    Svg Icon 创建一个专门放置图标 icon 的文件夹 xff1a src icons 添加SvgIcon组件到公共components目录下 src components SvgIcon index vue lt template g
  • [HDU3652]B-number

    题面描述 给定一个数 n 求 1 n 中所有满足以下条件的数的个数 xff1a 1 该数中不包含 34 13 34 2 该数能被13整除 输入格式 输入包含多行 xff0c 每行一个整数 n 1 leq n leq 1000000000 输
  • [GYM 101755]Restoring Numbers

    题面描述 已知两个正整数a b的和s与最大公约数g xff0c 求a b 输入格式 一共一行 xff0c 包含两个正整数 s g 输出格式 一共一行 xff0c 若有解输出 a b 否则输出 1 样例数据 样例输入 6 2 样例输出 4 2
  • 数位DP 详解

    序 天堂在左 xff0c 战士向右 引言 数位DP在竞赛中的出现几率极低 xff0c 但是如果不会数位DP xff0c 一旦考到就只能暴力骗分 以下是数位DP详解 xff0c 涉及到的例题有 xff1a HDU2089 不要62 HDU36
  • 关于485通信不稳定问题解决方案[STM32产品问题]

    485通讯不稳定的问题 xff08 具体表现为有时能通讯上 xff0c 有时通讯不上 xff09 RS485在连接设备过多 通讯距离过长 双绞线质量差 xff0c 接线不规范 等 xff0c 都会导致通讯不稳定的问题 解决方案 xff1a
  • Oracle update语句更新值来自另一张表中的数据

    task 任务表 role 角色表 两表之间必须有关联的字段 update task t set t roleName 61 select r name from role r where r id 61 t roleid 转载于 http
  • HTML个人简介

    lt doctype html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 Generator
  • 如何查看windows某个目录下所有文件/文件夹的大小?

    如何查看windows某个目录下所有文件 文件夹的大小 xff1f TreeSize Free绿色汉化版是一款硬盘空间管理工具 xff0c 用树形描述出来 xff0c 能够显示文件大小和实际占用空间数及浪费的空间等信息 xff0c 让你做出
  • Kafka服务不可用(宕机)问题踩坑记

    背景 某线上日志收集服务报警 xff0c 打开域名报502错误码 收集服务由2台netty HA服务器组成 netty服务器将客户端投递来的protobuf日志解析并发送到kafka xff0c 打开其中一个应用的日志 xff0c 发现如下
  • Sublime Text 的破解方式

    Sublime Text 破解 xff08 Mac和Windows系统 xff09 Posted on 2013 年 11 月 19 日 3 条评论 6 031 次浏览 继 续分享在 Mac OSX 和 Windows 下破解编码神器 xf
  • 洛谷P1233 木棍加工【单调栈】

    题目 xff1a https www luogu org problemnew show P1233 题意 xff1a 有n根木棍 xff0c 每根木棍有长度和宽度 现在要求按某种顺序加工木棍 xff0c 如果前一根木棍的长度和宽度都大于现
  • 高并发核心知识——ZooKeeper

    ZooKeeper 简介 ZooKeeper是一个开源的分布式协调服务 xff0c 重视高性能 高可用 严格有序的访问 Zookeeper中利用被称为znode的节点保存数据 xff0c 数据将保存在内存 ram 中 xff0c 最多存储1
  • https://gns3.com/community/discussion/gns3-doesn-t-work-on-vmware-play

    swered Question GNS3 doesn t work on VMWARE player 15 Hi guys today I try to install GNS3 on new VMWARE player 15 with V

随机推荐

  • 时间同步服务

    1 NTP时钟同步方式说明 NTP在linux下有两种时钟同步方式 xff0c 分别为直接同步和平滑同步 xff1a 直接同步 使用ntpdate命令进行同步 xff0c 直接进行时间变更 如果服务器上存在一个12点运行的任务 xff0c
  • The Windows 10 May 2020 Update无法更新问题,从1909升级到2004

    今天系统在更新的时候遇到系统提示如下信息 The Windows 10 May 2020 Update is on its way We re offering this update to compatible devices but y
  • 遇到Visual Studio "当前不会命中断点.还没有为该文档加载任何符号"的情况

    一 问题及原因 有这样一种调用逻辑 A exe调用B dll 现在想要在B的源代码中打断点 从A发起进行调试 却给出了 34 当前不会命中断点 还没有为该文档加载任何符号 34 的提示 感觉十分奇怪 各种重新生成 重启VS都没啥用 最后不得
  • Centos 7 Ntop 流量分析 安装

    Centos 6 安装 Ntop xff1a https www cnblogs com weijie0717 p 4886314 html 一 安装 1 添加EPEL 仓库 yum install epel release 2 创建 Nt
  • 三节点搭建openstack-Mitaka版本

    前言 xff1a 现在的云计算平台已经非常火 xff0c 也非常的稳定了 像阿里云平台 xff0c 百度云平台等等 xff0c 今天咱们基于openstack来搭建一个云平台 注意 xff1a 本次平台搭建为三节点搭建 xff08 没有外部
  • POJ滑动窗口

    题目描述 现在有一堆数字共N个数字 xff08 N lt 61 10 6 xff09 xff0c 以及一个大小为k的窗口 现在这个从左边开始向右滑动 xff0c 每次滑动一个单位 xff0c 求出每次滑动后窗口中的最大值和最小值 例如 xf
  • JsonSQL:用SQL语句解析JSON文件

    下午没事干 xff0c 到处闲逛发现一个好玩的东东 xff0c 发出来与大家共享 xff0c 哈哈 一个解析JSON的插件 xff0c 用SQL语法 xff0c 当然只能用简单的条件查询咯 xff0c 不过这个用起比较简单 xff0c 容易
  • windows系统cmd命令行设置、查看、更改环境变量

    问题场景 xff1a 在windows系统 xff0c 做flask项目需要配置qq邮箱的用户 密码 xff0c 为了安全性账户密码需要从OA机的环境变量中设置 获取 xff1a code import os app config 39 M
  • Python之路【第二十五篇】:数据库之pymysql模块

    数据库进阶 一 pymysql模块 pymysql是Python中操作Mysql的模块 xff0c 其使用的方法和py2的MySQLdb几乎相同 二 pymysql模块安装 pip install pymysql 三 执行sql语句 cod
  • centos7 linux中搭建MFS分布式文件系统

    MFS分布式文件系统 mooseFS xff08 moose 驼鹿 xff09 是一款网络分布式文件系统 它把数据分散在多台服务器上 xff0c 但对于用户来讲 xff0c 看到的只是一个源 MFS也像其他类unix文件系统一样 xff0c
  • MAC_BOOKPRO苹果电脑系统常用快捷键大全

    Mac 键盘快捷键 我在品多多上拼的Mac终于到货了 xff0c 安全下车 xff0c 接下来要熟练使用了 xff01 您可以按下某些组合键来实现通常需要鼠标 触控板或其他输入设备才能完成的操作 要使用键盘快捷键 xff0c 请按住一个或多
  • 微信小程序web-view(webview) 嵌套H5页面 唤起微信支付的实现方案

    场景 小程序页面有一个web view组件 xff0c 组件嵌套的H5页面 xff0c 要唤起微信支付 先讲一下我的项目 xff0c 首先我是自己开发的一个H5触屏版的商城系统 xff0c 里面含有购物车 xff0c 订单支付等功能 然后刚
  • Linux-常用命令

    基本命令 查看文件 span class token function ls span span class token comment 列出当前目录文件和文件夹名称 span F span class token comment 输出可以
  • 酒店管理系统(功能结构图、E-R图、用例图)

    功能结构图 用例图 状态图 流程图 数据字典 er图 转载于 https www cnblogs com wang jee p 10828875 html
  • C语言表达分段函数

    void main int x y scanf 34 d 34 amp x if x lt 61 1 y 61 x else if x gt 1 amp amp x lt 10 y 61 2 x 1 else if x gt 61 10 y
  • 拼音转汉字

    description Pinyin to get chinese pinyin from chinese license MIT style authors Bill Lue requires core 1 2 1 39 39 provi
  • windows下C++连接mysql

    平台 xff1a windows c c 43 43 编译器 xff1a vs2017 项目设置 xff1a 项目属性页 xff1a 1 C C 43 43 gt 常规 gt 附加包含目录 gt C Program Files x86 My
  • 制表符概念的理解(c语言角度)

    百度百科给出的答案 xff1a 制表符 xff08 也叫制表位 的功能是在不使用表格的情况下在垂直方向按列对齐文本 比较常见的应用包括名单 简单列表等 也可以应用于制作页眉页脚等同一行有几个对齐位置的行 至于制表符这一概念的由来 xff0c
  • iOS中实现多线程的技术方案

    pthread 实现多线程操作 代码实现 xff1a void run void param for NSInteger i 61 0 i lt 1000 i 43 43 NSLog 64 34 buttonclick zd 64 34 i
  • linux inode 详解 / 线上inode爆满解决方案

    linux inode 详解 线上inode爆满解决方案 本文大量参考阮一峰大神博客 xff0c 整理笔记 之所以写inode文章是由于一次线上问题 xff0c 引发对inode深入的思考 磁盘的inode监控与磁盘空间的监控同等重要 xf