1.inode是什么?
目录文件虽然是文件(Linux的核心理念就是Everything is file),但是存储内容的只是一张表而已,关于文件名和inode号的映射关系。
我们应该先简单了解一下inode:
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
2.文件的扩展名和文件类型之间没有关系。
在windows下通常可以通过双击某个图标运行可执行文件,例如一个.mp3文件,双击之后其实是根据扩展名找到相应的音乐编辑器,不过,想一下如果你把一个普通的纯文本文件保存为.mp3文件,那么打开之后肯定是乱码。
再来说一下linux下的文件系统,
举例来说,你用了这个命令:cat /home/a.txt
1.你只传递了一个绝对路径,/home/a.txt,系统首先要知道/home/a.txt文件的inode是多少才行,如何得知呢?
2.这里有一个规律,某文件的父目录会(记录)知道该文件的inode号!
3.那么我得到“/home/a.txt”这个文件名,我得先知道/home目录的情况,要知道/home目录的情况,我得先知道/目录的情况,我们可以从/目录开始(假设/目录的inode号是0,并且这是写死的),然后再去一张叫做inode-table的表中查找inode号0所指向的数据域,然后从数据域里面可以找到一些类似于下面的内容:(看起来像一张表,不是么?其实可以想象到,目录文件就是一张表,存储了它内部有哪些文件名,以及该文件名对应的inode号)
文件名 inode号
bin 18
home **
... ...
我们从“/”这个目录文件中找到了“/tmp”文件名对应的inode号,假设就是20。
4.然后我们通过inode号20,去inode-table里面找寻20对应的数据域,然后从数据域中,我们又会找到一张表:(为什么又是表呢?因为“/”是一个目录,“/home”也是一个目录,那当然数据域里面存的还是表啦)
文件名 inode号
a.txt 8899
bbb.mp3 10088
kkk.jpg 20000
... ...
好了,我们找到了/home/a.txt的inode号了,就是8899。根据上面的规律,我们是不是又得去 inode-table里面找8899号对应的数据域了?对,就是这样。一直找下去。。。
5.我们找到inode号8899对应的数据域,于是我们会发现如下一些内容:
“abcdefg”(假设文件内容就是这样)
...
为毛这次不是表了?
答案:/home/a.txt文件不是目录文件了,它是一个普通文件,他存储的一般都是一些字符串。
总结:
目录文件:存储的就是一张表,里面是所有文件名和inode的映射关系。
普通文件:存储普通数据(一般就是字符串)。
从父目录中获得本文件的inode号---->找到inode-table表中找到这个inode号对应的数据域中的起点以及其他信息---->去这个数据域中读取该文件的内容
访问任何一个文件,关键是否能搞到inode号,搞不到就没辙了。搞到inode就好说了,拿着inode号去inode表中查找即可,最后找到数据域,那么就可以找到文件的内容了
另外还有一个就是权限问题了
整个过程这不仅仅跟本文件权限有关,还跟它的父目录(还有父目录的父目录...)权限有关(是否能搞到本文件的inode),关于 chmod 权限就不详细叙述了。
3.文件的文件名和文件实际存储内容之间也没有关系。
目录文件实际存储的只是一张inode的表(文件名与inode 序号之间的映射关系),它指向下一个存储空间,可能是一个另一个目录文件,也可能是有实际内容的普通文件。
4.为什么同一个文件系统移动文件要比跨文件系统快?
答:因为只需要修改某个目录中路径和inode对应关系即可,不需要重新写一遍数据域。
5.什么是买来的500G的硬盘,格式化完后总是少了达不到500G?
答:从本文可知,inode-table也是需要占用存储空间的,所以缺少的一部分中inode-table占用了不少。
*.如何了解Linux文件系统和inode的相关知识,能否推荐个文章?
答:http://www.cyberciti.biz/tips/understanding-unixlinux-filesystem-inodes.html