首页 > 代码库 > 图解linux中Inode-分析Linux如何通过Inode读取磁盘

图解linux中Inode-分析Linux如何通过Inode读取磁盘

1、什么是inode?
首先要明白,linux中所有的东西都是文件,不管是目录还是命令
操作系统读硬盘的时候,为了提高效率,一次性读取一个block(常见大小4KB),一个block由8个扇区组成,每个扇区0.5K,扇区是硬盘存储数据的最小单位
而Inode就是帮助linux系统快速定位到指定文件而创建的额特殊的文件
操作系统读取磁盘文件的流程是这样的
  1. 根据dictionary的对应关系找到该文件的inode(dictionary简单理解就是一张表,存储文件到inode号的映射)
  2. 根据inode,找到inodeTable
  3. 根据inodeTable中的对应关系,找到对应的block
  4. 读取文件

大致过程如图:


查看inode大小

[root@localhost ~]# dumpe2fs -h /dev/sda1 | grep "Inode size"
dumpe2fs 1.39 (29-May-2006)
Inode size:               128

通常,一个inode128Byte对应硬盘1K的信息量,也就是说,存储空间有很大一部分分给了INode文件
查看系统的Inode
[root@localhost ~]# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda2            4905600   95401 4810199    2% /
/dev/sda1              76304      35   76269    1% /boot
tmpfs                  64413       1   64412    1% /dev/shm
可以看到,Inode的数目是有限的,所以如果系统中的inode使用完了,那么即使磁盘还有空间,也无法再向磁盘存储新的文件,因为,新文件要创建Inode

2、从软硬链接说起,理解inode
创建方式
ln file.txt file.hardlink
ln -s file.txt file.softlink
然后查看他们的inode
[root@localhost testForCsdn]# ls -il
total 20
2256709 -rw-r--r-- 2 root root 222 Oct 24 19:17 file.hardlink
2256719 lrwxrwxrwx 1 root root   8 Oct 24 20:32 file.softlink -> file.txt
2256709 -rw-r--r-- 2 root root 222 Oct 24 19:17 file.txt
可以看到,创建一个硬链接并没有创建新的Inode,只不过是在file.txt上加上了一个新的dictionary的对应关系。当我修改file.txt的时候,也就是修改了inode是2256709的那块磁盘,而硬链接读一样的磁盘,这样就不难理解为什么硬链接会同步更新。
那么添加一个硬链接,显示出来的那个file.hardlink是从哪来的呢?添加一个硬链接,会在目录文件里,添加一条信息,文件名-inode号,所以就是相当于新添加了一个dictionary的对应关系
而软连接只是创建了一个新的文件,这个新的文件内容是指向file.txt,也就是说,每次操作软链接,实际上都是操作file.txt,所以软连接不能脱离源文件而存在,因为如果源文件被删除了那么这个软链接就找不到自己应该指向的那个对象了
这里要说明的是,目录本身也是个文件,每个目录下都会存储.和..两个目录,所以即使我们创建一个空的文件夹,它的link也是2
. 表示当前目录
.. 表示上层目录
[root@localhost testForCsdn]# ls -ial
total 36
2256587 drwxr-xr-x  2 root root 4096 Oct 24 20:44 .
2256577 drwxr-x--- 17 root root 4096 Oct 24 20:31 ..
2256709 -rw-r--r--  2 root root  222 Oct 24 19:17 file.hardlink
2256719 lrwxrwxrwx  1 root root    8 Oct 24 20:32 file.softlink -> file.txt
2256709 -rw-r--r--  2 root root  222 Oct 24 19:17 file.txt

我们通过stat 来查看当前目录的inode信息
[root@localhost testForCsdn]# stat .
  File: `.'
  Size: 4096            Blocks: 16         IO Block: 4096   directory
Device: 802h/2050d      Inode: 2256587     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-10-24 20:45:35.000000000 -0700
Modify: 2014-10-24 20:44:26.000000000 -0700
Change: 2014-10-24 20:44:26.000000000 -0700
其中
blocks:表示占用的块数目
Access:后的时间表示最后一次访问的时间
Modify:后的时间表示最后一次修改的时间
Change:表示最后文件状态更改的时间

通过STAT命名可以看到,Inode中包含的一些信息

(1)文件大小

(2)占用block数目

(3)拥有者和所属组的ID

(4)文件的权限

(5)时间戳

(6)链接数,即多少个文件指向这个inode

(7)数据block的位置


3、inode的诸多优点
(1)对于有些无法删除的文件可以通过删除inode节点来删除
(2)移动或者重命名文件,只是改变了dictionary的映射,并不需要实际对硬盘操作
(3)删除文件的时候,只需要删除inode节点,不需要实际清空那块硬盘,只需要在下次写入的时候覆盖即可(这也是为什么删除了数据可以进行数据恢复的原因之一)
(4)打开一个文件后,只需要通过inode来识别文件

图解linux中Inode-分析Linux如何通过Inode读取磁盘