本篇文章转自以下作者,后加入我自己对原文章的理解
理解inode
作者:阮一峰
http://www.ruanyifeng.com/home.html 作者主页
http://www.ruanyifeng.com/blog/2011/12/inode.html 原文
PS:这个作者的主页里有很多不错的文章,可以去瞧一瞧
一、inode是什么?
硬盘上最小的存储单位是扇区(Sector),每个扇区512字节,每8个扇区为一个块(block),块是文件存取的最小单位。
数据存在硬盘上,需要有一块空间来存储某一个文件对应到硬盘的哪一"块"上,这个存文件信息的区域就叫inode,中文"索引节点"。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
二、inode的内容
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
可以用stat命令,查看某个文件的inode信息:
stat debug.txt
3.inode大小
- 操作系统给硬盘分区时分成两个区,一个是数据区,一个是inode区,存放inode所包含的信息。
- 每个inode节点的大小一般为128/256,格式化时一般每1KB/2KB就设置一个inode。
- 假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode
table的大小就会达到128MB,占整块硬盘的12.8%。 - 查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令:df -i
- 由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
4.inode号码
每个inode都有一个号码,操作系统用inode码来识别不同的文件。
系统打开一个文件的过程:
1.通过文件名找到对应的inode号
2.通过inode号获得inode信息
3.根据inode信息里文件所在的位置,读出数据
5.目录也是文件
- 目录也是一个文件,打开一个目录,实际上是打开一个目录文件
- 目录文件的结构很简单,就是一系列的目录项(dirent 在我另一篇博文里有介绍:
https://blog.youkuaiyun.com/qq_22655017/article/details/97124118
这里粗略的介绍一下:
dirent里面包含一个文件(目录)的inode号、名字字符串、文件在目录的偏移、文件名字的长度等) - 简单说dirent里包含了文件的文件名和文件名对应的inode
- 这些目录项加起来就可以理解成这个目录里所有的文件(或者子目录)了
重要:至此就可以理解目录的权限:
- 目录的读权限和写权限是对目录文件本身而言,目录文件内只有一堆dirent,即文件目录里只有一堆其目录里的文件名和文件名对应的inode
- 读取inode节点内的信息需要目录文件的执行权限
- 举例:当一个目录只有读权限时,也就是说其只能向它所指的那一块空间中读数据,也就能读出来它目录里的文件的名字,其他任何信息都没有,因为读inode节点的信息需要这一级目录的执行权限。
6.硬连接
如上所述,inode中有一个变量是存放链接数的,这个链接数指的就是硬链接数。
-
linux下,可以有多文件名指向同一个inode,这个文件名就叫硬连接
-
每多一个文件名指向inode,inode的链接数就会加1;每删除一个文件的文件名,inode的链接数会减1,直到减到0时会将该inode号释放,接下来其他文件就可以指向这个inode存放其他文件的信息了。
-
命令:
ln 源文件 目标文件
运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。 -
创建目录时,默认会生成两个目录项:".“和”…"。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)
7.软链接
文件A的内容是文件B的路径,文件A就是文件B的软链接,也叫符号连接,类似于windows下的快捷方式。
- 添加删除软链接时不会对inode里的链接数发生改变
- 如果删除文件B,打开文件A时就会报错,而不像硬连接,删除任意一个都不会影响文件的存在与否
- 创建软链接的命令:
ln -s 源文件或目录 目标文件或目录
8.inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象:
- 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
- 移动文件或重命名文件,只是改变文件名,不影响inode号码。
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
- 第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。