概述
众所周知,文件储存在硬盘上,硬盘的最小存储单位叫扇区(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块是文件存取的最小单位,块的大小,最常见的是4KB,即连续八个sector组成一个block,文件数据都储存在块中,但是这仅仅是储存数据的内容,而文件的创建者、文件的创年日期、文件的大小等信息是另外单独存放的,叫做文件的元信息,储存元信息的区域就叫做inode,中文译名为”索引节点,inode (index node) 表中包含文件系统的所有文件列表。
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
inode内容
-
文件的字节数
-
文件拥有者的User ID
-
文件的Group ID
-
文件的读、写、执行权限
-
文件的时间戳,共有三个:
1、ctime指inode最近一次变动的时间
2、mtime指文件内容最近变动的时间
3、atime指文件最近一次访问的时间。 -
链接数,即有多少文件名指向这个inode
-
文件数据block的位置
查看inode
可以用stat命令,查看某个文件的inode的详细信息:
使用ls -i命令,也可以查看某一个文件的inode节点号:
使用ls -i命令,可列出整个目录下的文件名和文件的inode号码:
用ls -l可以查看文件或目录一共被调用了几次,就是有几个文件指向它,一般都是1,除了目录默认为2,还有硬链接,几个硬链接就是几
inode大小
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i命令
查看每个inode节点的大小:
ext4文件系统使用dumpe2fs -h /dev/mapper/vg01-lv02 | grep “Inode size”
xfs系统用xfs_info命令查看
读取数据过程
在linux操作系统中表面上是通过文件名打开文件的,实际上分为以下三步:
- 查找文件名对应的inode号
- 通过inode号获取inode信息
- 根据inode信息,找到文件数据所在的block,读出数据
注意事项
- 有时,文件名包含特殊字符,无法正常删除,这时,直接删除inode,就起到删除文件的作用
- 移动文件或重命名文件,只是改变文件名,不影响inode号码
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名
- 由于每个文件必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况,这时就无法再硬盘上创建新文件,所以对于公用的文件系统,建议为相关用户设置磁盘限额
硬链接与软链接
在linux下面的链接文件有两种,一种类似于Windows系统的快捷方式,可以快速连接到目标文件或目录,另一种则是通过文件系统的inode链接来产生的新文件名,而不产生新文件,这种就是硬链接
硬链接
一般情况下,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。但是linux系统允许,多个文件名指向同一个inode号码,这意味着,可以用不同的文件名访问同样的内容,可以使用ln 源文件 目标文件 来创建硬链接
硬链接不能对目录创建,也不能跨文件系统创建
软链接
软链接就是再创建一个新文件,inode不再相同,而这个文件会让数据的读取指向它链接的那个文件的文件名,并且软链接文件依赖源文件存在,如果删除源文件的话软链接就会失效
可以使用ln -s 源文件 目标文件 来创建硬链接
hard2指向的是hard的文件名而不是inode号码