linux索引inode详解

1、inode简介

  文件系统是数据在硬盘上的一种排列组织方式,linux每个分区都可以格式化为不同的文件系统,所以可以说每个分区都是一个文件系统,都有自己的目录层次结构。而在目录之下,linux已经将所有的资源处理成为文件,不论是目录还是命令,之后linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构,实现对不同分区的数据进行访问。但是通过目录层次访问磁盘上的文件,只是表面现象。要知道数据在磁盘上以块(block)存储(一个block由8个扇区组成,每个扇区0.5K,扇区是硬盘存储数据的最小单位)数据的大小不一,造成了块的数量也不尽相同,增删改查都会影响数据块的排列方式,那么如何在众多的可能不连续的数据块中,如何精准的找到数据对应的那些块,必须依附在一张索引列表之上,这就是inode。

  所以操作系统读取磁盘文件的流程是这样的

    <1>根据某个inode号,找到目录的block,其存储的各种文件和文件的inode

    <2>查询inode表,找到文件的inode节点

    <3>根据文件的inode,找到对应的block

    <4>读取文件

  大致流程图如下

        wKioL1ebPlHiHFEZAAAZJ3oM8Vw078.png




2、inode内容

    当然,inode中不仅仅存储着指针,还存储着对应资源的权限、属主、属组和大小,见图一

    wKiom1edgcKTL5MtAAGYC6T3Mss410.png-wh_50




3、inode查看

    inode也是存储在block上的一段数据,所以其也是占用磁盘空间的,每个分区都有自己的inode上限,所以有时候如果显示磁盘空间已满,inode上限也需要作为一个原因,可使用df -i查看

[root@centos6 testdir]# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      6406144 145786 6260358    3% /
tmpfs           125517      5  125512    1% /dev/shm
/dev/sda1        51200     38   51162    1% /boot
/dev/sda3      1281120     25 1281095    1% /testdir
/dev/sr0             0      0       0     - /media/CentOS_6.8_Final
/dev/sr0             0      0       0     - /media/cdrom

    查看文件的inode,使用ls -i

[root@centos6 testdir]# ls -i
11 FILE1  12 FILE2  13 FILE3
[root@centos6 testdir]#

    查看文件的inode,也可以使用命令stat

[root@centos6 testdir]# stat FILE1
  File: `FILE1'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d	Inode: 11          Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-28 20:55:59.110959913 +0800
Modify: 2016-07-28 20:55:59.110959913 +0800
Change: 2016-07-28 21:22:03.395959013 +0800




4、从软链接、硬链接理解inode

    在linux系统上,不同的分区下,都有自己的inode序列,所以A分区和B分区的inode是会相同的。但是在同一个分区之内,inode于文件一般是一一对应的,但是有时可以共享一个inode,通过多个文件指向同一个inode,实现了借助不同的方式访问到同一个文件内容,这就是硬链接。

    创建硬链接

      ln SRC_FILE DES_FILE  

    在硬链接之外,还存在一种情况,那就是虽然创建了a文件,但是通过b路径也可以访问到a的内容,尽管a和b的inode不同,但是此时b借助a的路径访问到了a的内容,b就叫做a的软链接。

    创建软链接

      ln -s SRC_FILE DES_FILE

[root@centos7 ~]# touch new
[root@centos7 ~]# ln -s new /testdir/new1
[root@centos7 ~]# ll /testdir/new1 
lrwxrwxrwx. 1 root root 3 Jul 30 14:13 /testdir/new1 -> new
[root@centos7 ~]# cat /testdir/new1 
cat: /testdir/new1: No such file or directory

    上面这种情况为什么会报错?因为虽然软链接new1是创建在/testdir之下的,但是其访问数据时,是相对与当前目录,也就是说是在/testdir之下寻找new文件的,而非原文件的路径,所以通过/testdir/new1是无法访问到new的。所以说相对于软链接的路径,而非当前目录的路径(当然,写绝对路径也就不存在这样的问题了)。正确的做法如下:

[root@centos7 ~]# ln -s ../root/new /testdir/new2
[root@centos7 ~]# ll /testdir/new2
lrwxrwxrwx. 1 root root 11 Jul 30 14:16 /testdir/new2 -> ../root/new
[root@centos7 ~]# cat /testdir/new2
hello

建议大家在实际生产生活中,尽量使用相对路径的软链接,来增强代码的可移植性




5、inode的应用

    在实际生活中,我们删除数据的时候,只不过是删除掉了指向文件的inode路径,文件依然存在于磁盘之上,这时我们是可以通过一些手段恢复数据的,其本质也不过只是添加了指向文件数据的inode。如果未及时恢复,在原来的磁盘空间上重新写入了数据后,那么数据就很难恢复了。  

    


  





    


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页