zoukankan      html  css  js  c++  java
  • [转]一天一点学习Linux之Inode详解

    在Linux文件系统中,很多人对Inode都不太明白,今天我就和大家一起来分享一下我对Inode的认识,如果有理解错误的地方,请大家多多批评指点。
    在上一篇一天一点学习Linux之认识文件系统中,在最后给出了一张EXT3文件系统结构图,里面已经涉及到了Inode的相关信息——图的左下角部分,今天,我们就专门对这一部分进行一下详解,希望通过今天的内容,能帮助大家更清楚的了解Inode。

     

    先看看Inode的结构图

     

    再来了解一下文件系统如何存取文件的

    1、根据文件名,通过Directory里的对应关系,找到文件对应的Inode number
    2、再根据Inode number读取到文件的Inode table
    3、再根据Inode table中的Pointer读取到相应的Blocks

    这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inode number。如下图

    Directory:
    A directory is a mapping between the human name for the file and the computer's inode number.
    所以说,这个Directory不是文件,我们可以看作是文件系统中的一个属性,只是用来关键文件名与Inode number。这个一定要理解好,否则后面关于硬链接的内容,就不容易理解了。

    我在一天一点学习Linux之文件与目录权限的基本概念中讲到
    第二栏表示的是有多少文件连接到inode
    如果是一个文件,此时这一字段表示这个文件所具有的硬链接数, 
    如果是一个目录,则此字段表示该目录所含子目录的个数。

    现在是不是容易理解了?如果你还不是很明白,那么下面我们就再通过实例让大家明白。

    我们以RHEL6系统为例

    在根目录下创建一个test目录,我们进入此目录,进行操作。

    [root@yufei test]# pwd
    /test
    [root@yufei test]# touch testfile
    [root@yufei test]# mkdir testdir
    

    创建实验文件和目录

    [root@yufei test]# ls -li
    total 4
    977 drwxr-xr-x. 2 root root 4096 Apr  5 16:48 testdir
    976 -rw-r--r--. 1 root root    0 Apr  5 16:47 testfile
    

    查看到文件与目录的Inode和inode count分别为

    977 <-----> 2 <-----> testdir
    976 <-----> 1 <-----> testfile
    现在目录的链接数为2,文件的链接数为1。为什么会这样呢?其实很好理解。对于目录而言,每个目录里面肯定会有两个特殊目录,那就是.和..这两个目录,我们前面的课程中也讲到,.表示当前的目录,而..则是表示上层目录。我们也知道,在Linux系统中,是从根来开始查找的,要想找到某个目录,必需要先找到他的上层目录,所以说,空目录(严格的来说,不能叫空目录)是有两个链接到相应的Inode number的。作为文件很明显,他只有一个链接到相应的Inode number。也不用多说,

    下面我们就来看看这个链接数是如何改变的。
    继续上面的操作

    [root@yufei test]# ln testfile testfile.hard
    [root@yufei test]# ln -s testfile testfile.soft
    

    对testfile建立一个硬链接和一个软链接

    [root@yufei test]# ls -il
    total 4
    977 drwxr-xr-x. 2 root root 4096 Apr  5 16:48 testdir
    976 -rw-r--r--. 2 root root    0 Apr  5 16:47 testfile
    976 -rw-r--r--. 2 root root    0 Apr  5 16:47 testfile.hard
    978 lrwxrwxrwx. 1 root root    8 Apr  5 17:03 testfile.soft -> testfile
    

    再查看文件和目录的属性,我们就发现:创建一个硬链接后,testfile的inode count增加了一个。而且testfile和testfile.hard这两个的Inode number是一样的。这个硬链接就是重新创建了一个文件名对应到原文件的Inode。实质就是在Directory中增加了一个新的对应关系。通过这个例子,你是不是更清楚了,这个Inode count的含义了。他就是指,一个Inode对应了多少个文件名。

    下面我们再来看看硬链接的其他特点

    [root@yufei ~]# watch -n 1 "df -i;df"
    Every 1.0s: df -i;df                            Tue Apr  5 21:52:53 2011
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/sda1             960992  105415  855577   11% /
    tmpfs                  63946       1   63945    1% /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/sda1             15118728   2747612  11603116  20% /
    tmpfs                   255784         0    255784   0% /dev/shm
    

    用上面的命令可以实时查看系统中所剩的block和inode的变化数量。

    建议大家不要用deumpe2fs和tune2fs这两个命令,如果使用他们来查看的话,将会很郁闷——你会发现,你无论怎么创建文件或对文件写入内容,Inode和block的值都不会变,除非你每操作一次,重新启动一次系统,而用了上面的命令,就是第秒钟监视他们的变化情况。关于df的命令使用,大家可以自行查看帮助进行学习。当然还有du这个命令,他们都和文件系统有关。

    我们再来创建一个硬链接

    [root@yufei test]# ls -li
    total 4
    977 drwxr-xr-x. 2 root root 4096 Apr  5 16:48 testdir
    976 -rw-r--r--. 2 root root    0 Apr  5 16:47 testfile
    976 -rw-r--r--. 2 root root    0 Apr  5 16:47 testfile.hard
    978 lrwxrwxrwx. 1 root root    8 Apr  5 17:03 testfile.soft -> testfile
    [root@yufei test]# ln testfile testfile.hard1
    [root@yufei test]# ls -li
    total 4
    977 drwxr-xr-x. 2 root root 4096 Apr  5 16:48 testdir
    976 -rw-r--r--. 3 root root    0 Apr  5 16:47 testfile
    976 -rw-r--r--. 3 root root    0 Apr  5 16:47 testfile.hard
    976 -rw-r--r--. 3 root root    0 Apr  5 16:47 testfile.hard1
    978 lrwxrwxrwx. 1 root root    8 Apr  5 17:03 testfile.soft -> testfile
    

    可以再观察一下Inode count和Inode number的对应关系。

    下面再看看inodes和blocks的变化

    [root@yufei ~]# watch -n 1 "df -i;df"
    Every 1.0s: df -i;df                            Tue Apr  5 21:53:38 2011
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/sda1             960992  105415  855577   11% /
    tmpfs                  63946       1   63945    1% /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/sda1             15118728   2747612  11603116  20% /
    tmpfs                   255784         0    255784   0% /dev/shm
    

    我们发现,inodes和blocks是没有减少的,所以说,硬链接是不会占用磁盘的空间的。

    如果说删除硬链接的话,就会改变Inode count的数量。硬链接还有其他的两个特性:不能跨Filesystem也不能link目录。

    下面再来看看这个软链接

    [root@yufei test]# ls -il testfile.soft testfile
    976 -rw-r--r--. 3 root root 0 Apr  5 21:50 testfile
    978 lrwxrwxrwx. 1 root root 8 Apr  5 21:52 testfile.soft -> testfile
    他的Inode number和原文件不一样。而且大小也发生了变化。可见,这个软链接是重新建立了一个文件,而文件是指向到原文件,而不是指向原Inode。当然他会占用掉 inode 与 block。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。但软链接是可以跨文件系统,而且是可以链接目录。他就相当于windows系统下的快捷方式一样。通过这个特性,我们可以通过软链接解决某个分区inode conut不足的问题(软链接到另一个inode count足够多的分区)。

    接下来,我们再来分析一下复制文件、移动文件和删除文件对inode的影响

    [root@yufei ~]# watch -n 1 "df -i;df"
    Every 1.0s: df -i;df                            Tue Apr  5 21:57:38 2011
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/sda1             960992  105415  855577   11% /
    tmpfs                  63946       1   63945    1% /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/sda1             15118728   2747612  11603116  20% /
    tmpfs                   255784         0    255784   0% /dev/shm
    [root@yufei test]# ls -li
    total 4
    977 drwxr-xr-x. 2 root root 4096 Apr  5 16:48 testdir
    976 -rw-r--r--. 3 root root    0 Apr  5 18:54 testfile
    976 -rw-r--r--. 3 root root    0 Apr  5 18:54 testfile.hard
    976 -rw-r--r--. 3 root root    0 Apr  5 18:54 testfile.hard1
    978 lrwxrwxrwx. 1 root root    8 Apr  5 17:03 testfile.soft -> testfile
    

      

    我们先记录以上的信息

    先看复制文件的情况

    [root@yufei test]# cp testfile testfile.cp
    [root@yufei test]# ls -li
    976 -rw-r--r--. 3 root root    0 Apr  5 21:50 testfile
    979 -rw-r--r--. 1 root root    0 Apr  5 21:58 testfile.cp
    

      

    我们只对比这两个文件,发现Inode number不一样,我们再来看看inodes和blocks的剩余情况

    Every 1.0s: df -i;df                            Tue Apr  5 22:02:49 2011
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/sda1             960992  105416  855576   11% /
    tmpfs                  63946       1   63945    1% /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/sda1             15118728   2747620  11603108  20% /
    tmpfs                   255784         0    255784   0% /dev/shm
    

    发现inodes减少了一个,而blocks也少了,这就说明,复制文件是创建文件,并占Inode和Block的。

    文件创建过程是:先查找一个空的Inode,写入新的Inode table,创建Directory,对应文件名,向block中写入文件内容

    关于移动文件和删除文件的实验,大家可以自己动手来实践吧。我直接给出相应的说明。
    移动文件,他分两种情况:
    在同一个文件系统中移动文件时
    创建一个新的文件名和Inode的对应关系(也就是在Directory中写入信息),然后在Directory中删除旧的信息,更新CTIME,其他的信息如Inode等等均无任何影响

    在不同文件系统移动文件时
    先查找一个空的Inode,写入新的Inode table,创建Directory中的对应关系,向block中写入文件内容,同时还会更改CTIME。

    删除文件
    他实质上就是减少link count,当link count为0时,就表示这个Inode可以使用,并把Block标记为可以写,但并没有清除Block里面数据,除非是有新的数据需要用到这个block。

    最后我们来做个总结:

    1、一个Inode对应一个文件,而一个文件根据其大小,会占用多块blocks。
    2、更为准确的来说,一个文件只对应一个Inode。因为硬链接其实不是创建新文件,只是在Directory中写入了新的对应关系而已。
    3、当我们删除文件的时候,只是把Inode标记为可用,文件在block中的内容是没有被清除的,只有在有新的文件需要占用block的时候,才会被覆盖。

    本文关键词:一天一点,学习Linux,Inode,ln,Inode详解,软链接,硬链接

     
  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/ggykx/p/10899454.html
Copyright © 2011-2022 走看看