zoukankan      html  css  js  c++  java
  • 真正理解linux的inode?

    linux 在整个架构上可以看作是三层: 1.底层代码, (引导层strip) 跟硬件沟通的那一层的代码(可能是汇编+c), 驱动底层的; strain: n./v. 拉紧, 张力, 气质, 风格, 乐曲(这个词的意思很多): 

    1. 中间层代码, OS层,用来管理文件系统,内存,作业调度等. 里面的实现包括很多文件,或 各种各样的数据结构, 数据库等等, (数据库也是由分散的文件构成的吧), 其中inode等等就是在这里支撑用户接触层的东东

    2. 表现层代码, 就是我们所看到的, 我们所接触的那些东西, 包括目录结构, 文件等等.


    linux内核用 数字 管理文件系统, 内存, 进程等等, 是为了 方便, 简洁. 因为文件名称, 进程名称是很长很多 很占字节的东西, 让内核 去接触这些东西, 很累! 通过这些 实体的编号, id来管理它们就 撇脱 多了.

    进程 通过 pid 来管理, 进程名称是pid的别名; 文件 通过 inode来管理, 文件名称是inode的别名;


    inode的读法: i-node : [ai ' n2ud]: i: 可以认为是id, identifier , 所以读成: [ai] , node是节点, 代表着对应文件的实体.


    参考这篇关于inode的文章

    linux上的inode编号是索引节点的编号。理解inode,要从文件储存说起。

      文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 ** (如果把硬盘当作 一把称, 就是说, 它的最小刻度, 最小能够称出的重量 , 最大精度, 最多能够称出的, "只能打得起...多重?")

     这种由多个扇区组成的"块",是文件存取的最小单位。所以 即使文件内容只有1个byte

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

      文件数据都储存在"块"中,那么很显然,还必须找到一个地方储存文件的元信息(metadata, 就是文件的"属性, 描述信息"!) ,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

    每个inode都有一个号码,操作系统用inode号码来识别不同的文件。(区域叫inode, 区域的编号叫inode 编号, inode号码)!

    这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。 对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:

    首先,系统找到这个文件名对应的inode号码;(对应的文件或数据库表: 比如叫做: "文件名-inode表") 其次,通过inode号码,获取inode信息; 最后,根据inode信息,找到文件数据所在的block,读出数据。

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

    二、inode的内容 inode包含文件的元信息,具体来说有以下内容:   * 文件的字节数   * 文件拥有者的User ID   * 文件的Group ID   * 文件的读、写、执行权限   * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。   * 链接数,即有多少文件名指向这个inode   * 文件数据block的位置

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

    三、inode的大小

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

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

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

      代码如下:

      df -i

      查看每个inode节点的大小,可以用如下命令:

      代码如下:

      sudo dumpe2fs -h /dev/hda | grep “Inode size”

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

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

    ----------------------------------------- 什么叫dirent? LINUX系统下的一个头文件,在这个目录下/usr/include 为了获取某文件夹目录内容,所使用的结构体。 引用头文件#include结构体说明 编辑 struct dirent { long d_ino; /* inode number 索引节点号 / inode: 表示区域, inode number才是节点号. off_t d_off; / offset to this dirent 在目录文件中的偏移 / unsigned short d_reclen; / length of this d_name 文件名长 / unsigned char d_type; / the type of d_name 文件类型 / char d_name [NAME_MAX+1]; / file name (null-terminated) 文件名,最长256字符 */ }

    五、目录文件

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

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

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

      代码如下:

      ls /etc

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

      代码如下:

      ls -i /etc

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

      代码如下:

      ls -l /etc

    ----------------------------------- 软链接和硬链接? 目的: 都是为了使用的方便. (如同一个人, 可以有多个名字, 父母叫的乳名, 长辈叫的小名, 同事叫的书名, 下属叫的尊称等等)

    表现: 都是多个名字对应着同一个inode. inode: 文件名 = 1:N 是1对多的关系!

    语法: ln 源文件 目标文件. ln -s 源文件或目录名 目标文件或目录

        << 根据 源和目标, 就可以确定 哪个是依赖, 那个是被依赖..  "源文件" 是最开始最根本被依赖的东西!)
            源文件就是 原始 文件>>

    区别: 硬链接, 各个文件的内容都相同! 都是真正的file data! 彼此之间的地位是相同的, 没有依赖性, 删除一个, 不影响另一个! 硬链接的主要目的是: 为了防止对重要文件的"误删". 有些 : "类似" 复制备份, 但是不是复制 备份! 硬链接的限制: 只能对文件, 不能对目录 ! 创建硬链接; 只能在同一分区内创建...

        软链接,  两个文件的内容不同.  ln -s  A  B,  就是 A文件是源文件, B依赖A,  A是源, B是目标文件, 
                A是包含真正的内容, B的内容是A的路径,  对B的访问将跳转到对A的访问.    
                
                也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。      这就允许符号链接(经常简写为symlinks)指向位于其他分区、甚至是其他网络硬盘上的某个文件

    ----------------------------------------------------------软链接和硬链接? (完)

    八、inode的特殊作用

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

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

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

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

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

      九、实际问题

      在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。

      查找原因:

      /data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

      解决方案:

      1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。

      2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:

      ln -s /opt/newcache /data/cache

    ,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。

  • 相关阅读:
    C语言学习第八章
    C语言学习第七章
    C语言学习第六章
    C语言学习第五章
    ssh的bug
    Oracel 用户管理
    初识Kettle
    IDEA使用MAVEN时自动创建骨架卡的设置
    2017/6/12 JSON
    DDL,DML,DQL
  • 原文地址:https://www.cnblogs.com/fqnb001/p/8778871.html
Copyright © 2011-2022 走看看