磁盘中最小的存储单位是“扇区”,操作系统中文件最小的存储单位是“块”,一个“块”由连续的8个“扇区”组成,一个文件可以由多个“块”组成,而这些“块”并不一定是连续的。操作系统要读取一个文件时,是如何找到这些“块”的呢?这就需要一种映射关系,方便系统通过文件名找到对应的“块”,inode就用来维持这种映射关系的。
inode是index node,也就是“索引节点”,每一个文件都有对应的inode,inode保存的是文件的元信息,操作系统就是通过inode来管理文件的。
inode包含的元信息如下:
文件的字节数
文件拥有者的 User ID
文件的 Group ID
文件的读、写、执行权限
文件的时间戳,共有三个:ctime指inode最近变动的时间,mtime指文件内容最近变动的时间,atime指文件最近打开的时间
链接数,即有多少文件名指向这个inode
文件数据block的位置
注意:inode中不包含文件名。
linux中使用stat命令查看文件的inode信息:
使用 df -i 查看每个磁盘分区的inode总数和已经使用量:
对磁盘“格式化”后,操作系统将磁盘分成两个区域,一个是数据区,存放文件数据,一个是inode区(inode table),存储inode数据。
每个inode都有唯一的编号,操作系统就是根据编号来操作不同的文件。文件名可以说是inode编号的别名,实际上,系统通过文件名打开文件时,先找到文件名对应的inode编号,然后获取inode信息,根据inode信息获取文件对应的block,最后从block中读取数据。
使用 ls -i 获取文件名对应的inode编号:
目录(directory)也是一种文件。目录文件的内容是一系列的目录项列表,每个目录项由两部分组成:文件名,文件名对应的inode编号。
如果目录文件只有读权限(r),那就只能获取文件名,无法获取文件的元信息,元信息存储在inode中,要读取inode中的内容,文件目录需要拥有执行权限(x)。
在linux中,允许多个文件名指向同一个inode编号,对文件内容的修改会影响到所有的文件名,inode中的链接数,就是指向该文件的文件名的数量,当链接数为0时,系统会回收该文件的inode编号和对应的block区域。
如果删除一个文件名,不影响另一个文件名的访问,这种情况是“硬链接”。
创建“硬链接”命令:ln src_file target_file。
注意:创建目录文件时,默认生成两个目录项,“.”(当前目录文件的inode编号)和“..”(当前目录的父目录文件的inode编号),所以每个目录文件的硬链接数大于等于 2。
还有一种情况是,文件A和文件B的inode编号不一样,但是文件A的内容是文件B的路径,也就是文件A指向了文件B的文件名。读取文件A时,会自动导向文件B。文件A就称为文件B的“软链接”。
创建“软链接”命令:ls -s src_file target_file。
inode和文件名分离的设计,会出现以下情况:
1)如果文件名包含了特殊字符,导致无法删除,这时可以直接删除inode节点,就可以删除文件。
2)移动文件或重命名时,只是改变文件名,不影响inode编号。
3)系统操作文件时,只识别该文件的inode编号,所以,系统无法通过inode来获取文件名。这样的好处是,在不用重启的情况下就可以更新文件,文件名就指向了一个新的inode,旧的inode会被回收。