关于vi编辑文件后,文件inode节点会发生变化的原因


在老师提到inode的那一节,说当把一个文件删除后,再创建一个新的文件。系统就会优先分配这些节点给要创建的文件或者目录。


然后我就做了如下测试:(基于centos6.4系统)


[root@Jason-6 ~]# ls -i gre      <---列出当前目录下文件gre的inode
30370 gre
[root@Jason-6 ~]# rm -f gre      <---删除文件gre
[root@Jason-6 ~]# touch abc      <---新建一个文件abc
[root@Jason-6 ~]# ls -i abc      <---列出文件abc的inode
3612 abc         <----可以看出不是刚刚删除的文件的inode
[root@Jason-6 ~]# rm -f abc      <----删除文件abc
[root@Jason-6 ~]# touch inode    <----新建一个文件inode
[root@Jason-6 ~]# ls -i inode    <----列出文件inode的inode
3612 inode       <----可以看出和刚刚删除的文件的inode一样
[root@Jason-6 ~]# mkdir gre       <---新建一个目录gre   
[root@Jason-6 ~]# ls -di gre      <----查看目录gre的inode
30370 gre        <----和第一次删除的那个文件gre的inode一样
[root@Jason-6 ~]# rmdir gre       <----删掉目录gre
[root@Jason-6 ~]# mkdir red       <----再创建一个目录red
[root@Jason-6 ~]# ls -di red      <----再查看它的inode
30370 red        <-----和删除的上个目录的inode一样
[root@Jason-6 ~]#

上面是我测试的结果。得出的结论是:新创建的文件的inode可能是之前删除的文件或目录的inode节点。


但是有时候就真的很邪门儿!看看下面的过程:(我就不解释了,想必大家能看懂。)


[root@Jason-6 ~]# ls -i awk1
5678 awk1
[root@Jason-6 ~]# rm -f awk1
[root@Jason-6 ~]# touch kwa
[root@Jason-6 ~]# ls -i kwa
5678 kwa
[root@Jason-6 ~]# rm -f kwa
[root@Jason-6 ~]# touch http
[root@Jason-6 ~]# ls -i http
5678 http
[root@Jason-6 ~]# rm -f http
[root@Jason-6 ~]# mkdir access
[root@Jason-6 ~]# ls -di access
5678 access
[root@Jason-6 ~]# rmdir access
[root@Jason-6 ~]# touch ass
[root@Jason-6 ~]# ls -i ass
5678 ass
[root@Jason-6 ~]#

综上述两种情况来看,我们确实不能保证新建的文件或者目录的inode节点就一定是以前删除的文件或者目录的节点。所以我得出的结论是,新建的文件或目录一大部分可能是以前删除的文件或者目录的节点数。 当然这也符合老师说的,系统会优先分配那些节点。


好了,进入正题。这个问题也是我在测试上述问题的过程中发现的。大家请看下面的过程:


[root@Jason-6 ~]# ls -i ass     <---查看文件ass的节点
5678 ass
[root@Jason-6 ~]# vi ass        <---vi编辑文件ass
[root@Jason-6 ~]# touch abc
[root@Jason-6 ~]# ls -i abc    <---查看文件abc的节点
5678 abc

两个文件的inode节点竟然一样!当时我测试发现这个问题以后很是惊奇,问了班长,他也表示很奇怪。为什么前后两个文件的inode节点是一样的呢?然后我就再看了一下文件ass的节点。



[root@Jason-6 ~]# ls -i ass
30377 ass

这时候发现文件assinode节点数已经变了,我就在想这个过程我就是用vi编辑了一下文件而已,难道是因为vi编辑了文件以后才发生了变化吗?


经过后来我的测试,发现确实是如此,而且你一直编辑的话,你会发现它的inode的节点就是两个数字在来回变。


[root@Jason-6 ~]# ls -i ass
30377 ass
[root@Jason-6 ~]# vi ass
[root@Jason-6 ~]# ls -i ass
30379 ass
[root@Jason-6 ~]# vi ass 
[root@Jason-6 ~]# ls -i ass
30377 ass
[root@Jason-6 ~]# vi ass 
[root@Jason-6 ~]# ls -i ass
30379 ass
[root@Jason-6 ~]# vi ass 
[root@Jason-6 ~]# ls -i ass
30377 ass
[root@Jason-6 ~]#


回到问题的本身,vi编辑后inode为什么会发生变化呢?


从三个方面入手考虑。首先,inode里面包含些什么内容?其次,vi编辑文件后对inode里面的内容产生了什么样的影响?再者,inode记录文件信息的机理是什么?


inode介绍:


inode UNIX 操作系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。


有时,人们使用了一些不同的术语,如 inode 和索引编号 (inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。inode 指的是数据结构;而索引编号实际上是 inode 的标识编号,因此也称其为inode 编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。下一个部分将介绍 inode 中的其他一些属性。


inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。


例如,使用 vi 来编辑一个文件。当您键入 vi <filename> 时,在 inode 表中找到 inode 编号之后,才允许您打开该 inode vi 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入 :wq 时,将关闭并释放该 inode 通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。


上述材料来自百度百科。


再阅读了鸟哥的书以后,发现inode里面还会记录block号码,那记录这些block肯定是要占用空间的,如果说一个很大的文件,那你岂不是要占用很多的blockinode岂不是要疯了?其实不然,了解inode结构图的人,会告诉大家这样其实一点都不难。


好了,貌似我们说的有点多,离题了。但是目的只为一个,更加清晰的帮助我们理解了inode里面的内容。

目前来说,inode里面会存放文件的属性,权限,大小,长度,还有指向block的节点号。

而目录的block里面,存放下一级的目录的文件名和文件名与inode的指向关系。


补充:

最新猜想表示inode里面会包含文件的基本属性,当然包含文件的时间戳。所以,vi在进行修改文件过后,文件的时间戳会改变。当然inode会改变了。再者还有一种就是文件在vi编辑的时候有了临时缓冲文件作为代替···