zoukankan      html  css  js  c++  java
  • Linux的inode的理解

    来源:Linux社区  作者:pvbutler

    一、问题:
      在一台Linux服务器的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间。
    二、分析问题:
      用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。

    Linux的inode的理解

          inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。
      而这台服务器的Block虽然还有剩余,但inode已经用满,因此在创建新目录或文件时,系统提示磁盘空间不足。

    三、原因:
      /data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
    四、解决方案:
      1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
      2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
      ln -s /opt/newcache /data/cache
      3、增加空间

    一、inode

    硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性读取一个"块"(block),每个"块"(block)由八个连续的sector组成。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,文件数据都储存在"块"中,那么还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

    二、inode的内容

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

      * 文件的字节数

      * 文件拥有者的User ID

      * 文件的Group ID

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

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

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

      * 文件数据block的位置 

    可以用stat命令查看某个文件的inode信息:

    [root@Zabbix_server home]# stat zabbix/
      File: `zabbix/'
      Size: 4096       Blocks: 8          IO Block: 4096  directory
    Device: 803h/2051d Inode: 130647      Links: 4
    Access: (0700/drwx------)  Uid: (  500/  zabbix)  Gid: (  500/  zabbix)
    Access: 2014-08-12 10:46:02.810999643 +0800
    Modify: 2014-07-23 07:19:01.146989703 +0800
    Change: 2014-07-23 07:19:01.146989703 +0800
    [root@Zabbix_server home]#

    除了文件名以外的所有文件信息,都存在inode之中。(为什么没有文件名,继续看下文)

    三、inode的大小

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

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

    使用df -i可以查看每个硬盘分区的inode总数和已经使用的数量
    [root@Zabbix_server ~]# df -i
    Filesystem      Inodes  IUsed  IFree IUse% Mounted on
    /dev/sda3      1166880 103467 1063413    9% /
    tmpfs          128806      4  128802    1% /dev/shm
    /dev/sda1        51200    38  51162    1% /boot
    /dev/sr0            0      0      0    - /media/RHEL_6.5 i386 Disc 1
    [root@Zabbix_server ~]#

    查看每个inode节点的大小
    [root@Zabbix_server ~]# dumpe2fs -h /dev/sda3 | grep -i "inode size"
    dumpe2fs 1.41.12 (17-May-2010)
    Inode size:          256
    [root@Zabbix_server ~]#

    dumpe2fs默认未加入PATH中,需要手动加入
    [root@Zabbix_server ~]# export PATH=/sbin/dumpe2fs:$PATH
    [root@Zabbix_server ~]# echo $PATH
    /sbin/dumpe2fs:/home/script:/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/bin:/usr/sbin:/usr/bin:/home:/root/bin
    [root@Zabbix_server ~]#

    由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件,出现上面的实例情形。

    四、inode号码

    每个inode都有一个号码,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

    使用ls -i命令,可以看到文件名对应的inode号码:
    [root@Zabbix_server zabbix]# ls -i indoe.txt 
    130698 indoe.txt
    [root@Zabbix_server zabbix]#

  • 相关阅读:
    docker 安装mysql
    Java web项目搭建系列之二 Jetty下运行项目
    Java web项目搭建系列之一 Eclipse中新建Maven项目
    Maven 添加其他Maven组件配置问题
    C# 中定义扩展方法
    Oracle 函数
    【Webservice】2 counts of IllegalAnnotationExceptions Two classes have the same XML type name
    Linux精简版系统安装网络配置问题解决
    Rsync 故障排查整理
    Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.
  • 原文地址:https://www.cnblogs.com/chenxuf/p/9029912.html
Copyright © 2011-2022 走看看