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详解,软链接,硬链接

     
  • 相关阅读:
    【USACO18JAN】MooTube G
    【JSOI2008】星球大战
    【ECF#87】小结
    【NOIP2013】火柴排队
    【USACO04OPEN】MooFest G
    【NOI OL #2】T3 游戏
    【NOI OL #2】T2 子序列问题
    简单NLT
    python中的位运算
    列表和元组
  • 原文地址:https://www.cnblogs.com/ggykx/p/10899454.html
Copyright © 2011-2022 走看看