### 什么是inode?


    理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫扇区(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块是文件存取的最小单位,块的大小,最常见的是4KB,即连续八个sector组成一个block,文件数据都储存在块中,那么很明显,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创年日期、文件的大小等等。这种储存元信息的区域叫做inode,中文译名为”索引节点”。inode (index node) 表中包含文件系统的所有文件列表。

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


### inode包含文件的信息(元数据)


       文件的字节数

      文件拥有者的User ID

      文件的Group ID

      文件的读、写、执行权限

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

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

      文件数据block的位置 

---------------------

### inode表结构

inode.png


 ### 直接块指针:

inode指针.png

            前12个直接指针,直接指向存储数据的区域。如Blocks大小为4*1024KB,前12个直接指针就可以保存48KB的文件

    

        间接块指针:

    

            设每个指针占用4个字节,则以及指针指向的Blocks可以保存(4*1024)/4KB,可指向1024个Blocks,一级指针可存储文件数据大小为1024*(4*1024)KB=4MB

    

        双重间接块指针:

    

            同样Blocks大小为4*1024,则二级指针可保存Blocks指针数量为((4*1024)/4)*((4*1024)/4),则二级指针保存文件数据大小为(1024*1024)*(4*1024)=4GB

    

        三重间接块指针:

    

            以次类推三级指针可以储存文件数据大小为(1024*4*1024*1024)*(4*1024)=4TB

---------------------

### inode的大小:


1. ```

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

       inode号并不是无限的,如果一个分区的节点数被使用完了,那么即使磁盘空间还有剩余也不能再存放任何数据。可以使用df -i或者stat命令查看节点使用情况

       [root@centos6 ~]#df -i

       Filesystem      Inodes  IUsed   IFree IUse% Mounted on

       /dev/sda3       320000 133693  186307   42% /

       tmpfs           125377      6  125371    1% /dev/shm

       /dev/sda1       128016     38  127978    1% /boot

       /dev/sda2      1281120     17 1281103    1% /data

       /dev/sr0             0      0       0     - /media/CentOS_6.10_Final

       

   

   

   ```


---------------------

### 目录文件:

```

目录inode.png

    Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件目录文件的结果非常简单,就是一系列目录项(direct)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号。


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

    [root@centos6 /data]#ls

httpd.conf  httpd.conf.bak  lost+found  my.cnf  test1.text  test2.text  test3.text

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

[root@centos6 /data]#ll -i

     total 92

     15 -rw-r--r--  1 root root 34419 Dec 15 09:39 httpd.conf

     17 -rw-r--r--  1 root root 34419 Dec 15 09:41 httpd.conf.bak

     11 drwx------. 2 root root 16384 Dec 12 11:16 lost+found

     16 -rw-r--r--  1 root root   251 Dec 15 09:39 my.cnf

     12 -rw-r--r--  1 root root     0 Dec 15 09:36 test1.text

     13 -rw-r--r--  1 root root     0 Dec 15 09:36 test2.text

     14 -rw-r--r--  1 root root     0 Dec 15 09:36 test3.text

     

     [root@centos6 /data]#stat /etc/fstab 

  File: `/etc/fstab'

  Size: 899       Blocks: 8          IO Block: 4096   regular file

     Device: 803h/2051dInode: 25          Links: 1

     Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

     Access: 2018-12-15 13:01:33.284289685 +0800

     Modify: 2018-12-12 11:21:05.675000006 +0800

     Change: 2018-12-12 11:28:55.543999998 +0800


     

     理解了上面的知识,就能理解目录的权限,文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号,所以只有读权,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。

```




### Linux中cp、rm、mv 、ln对inode的影响:


cp命令:


- [ ] ```

  分配一个空闲的inode号,在inode表中生成新条目在目录中创建一个目录项,将名称与inode编号关联

  拷贝数据生成新的文件

  [root@centos6 /data]#df -i

  /dev/sda2      1281120     13 1281107    1% /data

  

  [root@centos6 /data]#cp a.txt a.cp

  [root@centos6 /data]#ls -il a.txt a.cp 

  13 -rw-r--r-- 1 root root 7 Dec 15 18:43 a.cp

  11 -rw-r--r-- 2 root root 7 Dec 15 18:39 a.txt

  

  [root@centos6 /data]#df -i

  /dev/sda2      1281120     14 1281106    1% /data

  

  我们只对比这两个文件,发现Inode number不一样,发现inodes减少了一个,而blocks也少了,这就说明,复制文件是创建文件,并占Inode和Block的。

  

  ```


rm命令:


```

减少链接数量,如果链接数为0,释放inode(inode号也已被重新使用);

如果inode被释放,则数据块放到可用空间列表中;

删除目录中的目录项

```


 mv命令:


```

如果mv命令的目标和源在相同的文件系统,作为mv 命令

用新的文件名创建对应新的目录项

删除旧目录条目对应的旧的文件名

不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!

如果目标和源在一个不同的文件系统, mv相当于cp和rm

```


### 链接与inode


```

[root@centos6 /data]#touch a.txt

[root@centos6 /data]#mkdir a

[root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

    11 -rw-r--r-- 1 root root    0 Dec 15 18:18 a.txt

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

[root@centos6 /data]#ln a.txt a.hard

[root@centos6 /data]#ln -s a.txt a.soft

[root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.hard

    12 lrwxrwxrwx 1 root root    5 Dec 15 18:27 a.soft -> a.txt

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.txt

    再查看文件和目录的属性,我们就发现:创建一个硬链接后,a.txt的inode值增加了一个;a.txt和a.hard的inode值是一样的。这个硬链接就是重新创建了一个文件名对应到原文件的Inode。实质就是在Directory中增加了一个新的对应关系。

    

    下面再来看看这个软链接

    [root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.hard

    12 lrwxrwxrwx 1 root root    5 Dec 15 18:27 a.soft -> a.txt

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.txt

    他的Inode number和原文件不一样。而且大小也发生了变化。可见,这个软链接是重新建立了一个文件,而文件是指向到原文件,而不是指向原Inode。当然他会占用掉 inode 与 block。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。但软链接是可以跨文件系统,而且是可以链接目录。他就相当于windows系统下的快捷方式一样。通过这个特性,我们可以通过软链接解决某个分区inode conut不足的问题(软链接到另一个inode count足够多的分区)。

```


### **硬链接和软链接**


```

 硬链接:其实就是同一个文件具有多个别名,具有相同inode,而dentry不同。


              1. 文件具有相同的inode和data block

              2. 只能对已存在的文件进行创建;

              3. 不同交叉文件系统进行硬链接的创建

              4. 不能对目录进行创建,只能对文件创建硬链接

              5. 删除一个硬链接并不影响其他具有相同inode号的文件;


软链接:软链接具有自己的inode,即具有自己的文件,只是这个文件中存放的内容是另一个文件的路径名。因此软链接具有自己的inode号以及用户数据块。


              1. 软链接有自己的文件属性及权限等;

              2. 软链接可以对不存在的文件或目录创建;

              3. 软链接可以交叉文件系统;

              5. 创建软链接时,链接计数i_nlink不会增加;

              6. 删除软链接不会影响被指向的文件,但若指向的原文件被删除,