iNode
1、inode是什么?
理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存
512字节(相当于0.5KB),操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续
读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大
小,最常见的是4KB,即连续八个 sector组成一个 block。 文件数据都储存在"块"中,那么很显然,我们还必须找
到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域
就叫做inode,中文译名为"索引节点"。
iNode是 UNIX 操作系统中的一种数据结构,其本质是 结构体,它包含了与文件系统中各个文件相关的一些重要
信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分
配给了 inode 表。inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个
文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该
inode ,并对其进行适当的更改。使用 inode 可以节约大量的时间,并提高工作效率。
例如,使用 vim 来编辑一个文件。当您键入 vim <filename> 时,在 inode 表中找到 inode 编号之后,才允许您
打开该 inode 。在 vim 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入 :wq 时,将关闭并释
放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给
了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。
2、inode的内容
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件
上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
可以用stat命令,查看某个文件的inode信息
3、inode的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件
数据;另一个是inode区(inode table),存放inode所包含的信息。 每个inode节点的大小,一般是128字节或
256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘
中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块
硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。 df -i
查看每个inode节点的大小,可以用如下命令:
sudo dumpe2fs -h /dev/hda | grep "Inode size"
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是
inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:
首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找
到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码: ls -i example.txt
ls -i命令列出整个目录文件,即文件名和inode号码:ls -i /etc
如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。
在Linux系统中,内核为每一个新创建的文件分配一个iNode(索引节点),每个文件都有一个唯一的iNode号。
文件属性保存在索引节点里,在访问文件时,索引节点被复制到内存里。从而实现文件的快速访问。
链接是一种共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard
Link)和软链接(SOft Link),软连接又称符号链接(Symbolic Link)。符号链接相当于Windows下的快捷方式。
1、硬链接
硬链接(hard link)可以被理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode与文件,所以
实际上来讲硬链接文件与原始文件其实是同一个文件,只是名字不同。于是每添加一个硬链接,该文件的inode连接
数就会增加1,直到该文件的inode连接数归0才是彻底删除。也就是说因为硬链接实际就是指向原文件inode的指
针,即便原始文件被删除依然可以通过链接文件访问,但是由于技术的局限性而不能跨文件系统也不能链接目录文
件。简单的说就是一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多
个别名硬连接就是安全备份的意思,他不占用磁盘空间,只是一个替身。
ln命令可以创建硬链接:
ln 源文件 目标文件 运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信
息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得
inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及
其所对应block区域。
这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前
目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目
录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目
录对其的“硬链接”和当前目录下的".硬链接“。
-f 建立时,将同档案名删除;
-i 删除前进行询问;
ln abc cde 建立abc的硬链接。
删除一个硬链接文件并不影响其他有相同 inode 号的文件,即删除test.c时,不会删除硬盘上数据,因为引用计数>0 ;
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功
能。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。
尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:
(1)不可以在不同文件系统的文件间建立链接
(2)只有超级用户才可以创建硬链接
(3)不能给目录创建硬链接。
软链接也称为符号链接(symbolic link)即“仅仅包含它所要链接文件的路径名”因此能做目录链接也可以跨越
文件系统,但原始文件被删除后链接文件也将失效,性质上和Windows™系统中的“快捷方式”是一样的。软链接克
服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建符号链接并且可以为目录创建符号链接。
ln -s命令可以创建软链接。 ln -s 源文文件或目录 目标文件或目录
ln -s abc cde 建立一个软连接
但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件
将成为一个死链接(如下所示的软链接 a 使用了相对路径,因此不宜被移动),因为链接数据块中记录的亦是相对路
径指向。
不足:
因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找
不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保
存原文件的路径。
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling
link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
总结(软硬链接对比)
(1)软链接可以跨文件系统 ,硬链接不可以。
(2)关于 inode的问题 。硬链接不管有多少个,都指向的是同一个inode,会把inode链接数增加 ,只要inode的链
接数不是 0,文件就一直存在,不管你删除的是源文件还是链接的文件。只要有一个存在,文件就存在(其实也不分
什么 源文件链接文件的,因为他们指向都是同一个 inode)。 当你修改源文件或者链接文件任何一个的时候 ,其他
的文件都会做同步的修改。软链接不直接使用inode号作为文件指针,而是使用文件路径名作为指针(软链接跟源文件
的inode不一样)。所以删除链接文件对源文件无影响,但是删除源文件,链接文件就会找不到要指向的文件 。软链
接有自己的inode,并在磁盘上有一小片空间存放路径名.。
(3)软链接可以对一个不存在的文件名进行链接 。
(4)软链接可以对目录进行链接。
关于硬连接不能跨越文件系统的原因:
不同的文件系统可能具有相同的inode号,假设可以在A系统中创建B系统的硬连接,例如B系统的文件Bb的硬连接
Ab,则它们理论上应该具有相同的inode号(如111111),但是此时A系统本来就可能存在inode号为111111的文
件,那此时想访问inode号为111111的文件的时候,内核就不能判断是访问A系统还是B系统的文件
关于硬连接不能链接到目录的原因:
系统在遍历文件夹的时候,假设可以创建目录的硬链接,则因为系统不能识别出该硬连接是链接还是文件本身,
因此会无穷递归下去。而软链接可以被系统识别出,因为不会产生无穷递归。
总之,建立链接就是建立了一个新文件。当访问链接文件时,系统就会发现它是个链接文件,它读取链接文件找
到真正要访问的文件。