对于刚开始学习Linux的人来说inode总是那么的懵懵懂懂。本文主要来分享一下我对inode的理解,以及在实践当中遇到的一个关于inode号的小问题。
一、什么是inode
inode是指在许多“类Unix文件系统”中的一种数据结构。每个inode保存了文件系统中的一个文件系统对象(包括文件、目录、设备文件、socket、管道, 等等)的元信息数据,但不包括数据内容或者文件名——维基百科。
在Linux中有一个重要的哲学思想就是“一切皆文件”,而一个文件是要保存在磁盘上的,更直观的来说,比如一个文本文件,在GUI下我们要双击打开它,在CLI下我们需要用cat等命令查看它,但是我们看到的都是它的内容,那它自身的属性信息存放在哪呢?没错,就是放在inode里。
这要从磁盘的区域划分说起,拿到一块新硬盘的时候我们通常都要先格式化才能使用,那什么是“格式化”呢?通俗一点来讲就是将一块磁盘打上一个个的小格子,类似于格子状的信纸。其中有两个主要的“大格子”:一个叫元数据区,另一个叫数据存储区。数据存储区就是存数据的了,那什么是元数据呢?其实就是一个文件的inode号、权限、属主属组、大小、时间戳、文件所占的磁盘块、扩展属性等等,但要记住inode中是没有文件名的。我们使用stat FILENAME可以查看一个文件的元数据。
二、为什么要有inode
对于计算机来说,它记忆一个文件的时候使用数字要比使用文字轻松多了,所以计算机就是靠inode号来标识每一个文件的,同一个文件系统中inode号是唯一确定的,这样也就可以唯一确定一个文件了。
三、文件名的存放
我们刚才说了inode中什么都有就是没有文件名,那文件名到底在哪呢?是在目录中。Linux中一切皆文件,目录也是文件(其实Windows中文件夹也是个文件)。目录文件的结构是一系列目录项的列表。每个目录项,由两部分组成:所包含文件或目录的名字,以及该文件或目录名对应的inode号码。创建一个目录需要执行三个步骤:
1、在其“父目录文件”中增加一个条目;
2、分配一个inode;
3、分配一个存储块,用来保存当前被创建目录包含的文件与子目录。
被创建的“目录文件”中自动生成两个子目录的条目,名称分别是:“.”和“..”。前者与该目录具有相同的inode号码,因此是该目录的一个“硬链接”。后者的inode号码就是该目录的父目录的inode号码。所以,任何一个目录的"硬链接"总数,总是等于它的子目录总数(含隐藏目录)加2。即每个“子目录文件”中的“..”条目,加上它自身的“目录文件”中的“.”条目,再加上“父目录文件”中的对应该目录的条目。
此/下所有文件都为目录,可见/的硬链接数为24,/下一共有22个目录,至于wc -l为23是因为显示时有一行total。
四、分享发现的一个小问题
我们发现有几个目录的inode号是相同的,比如usr、var、boot,我们不是说inode号是计算机识别文件的唯一标识吗,inode号相同是否意味着这几个目录都是同一个文件呢?答案是否定的,它们不是同一个文件。因为inode唯一对应一个文件或者目录的条件是:建立在“同一个FILE SYSTEM”上,不同分区之间就是不同的FILE SYSTEM(据说LVM可以做到同一个分区划分不同FILE SYSTEM,但这是后话了),所以不同FILE SYSTEM里面可以存在同号码的INODE,所以它们就是不同的几个文件了。上图中inode号相同的目录是划分在了单独的文件系统中。
好了希望这篇文章能够给您带来帮助,敬请各位看官提出此文章的不当之处,拜谢!
PS:今天看了一篇关于亚投行的文章,感觉AIIB的建立只证明了一点:天下熙熙,皆为利来;天下攘攘,皆为利往。
本文出自 “Linuxlove” 博客,请务必保留此出处http://linuxlover.blog.51cto.com/2470728/1626208
原文地址:http://linuxlover.blog.51cto.com/2470728/1626208