理解linux inode
linux中文件存储在磁盘上,文件内容划分为2部分进行存储:文件元数据
、文件内容数据
。
文件元数据
储存在 inode table
中,文件内容数据
储存在磁盘的另一部分连续区域中。
文件系统
文件系统创建(格式化)时,就把存储区域分为2个连续的储存区域。一个是 inode table
, 一个是 blocks(暂且这么命名吧)
。
-
inode table
是由inode
组成的表,每一个inode
对应一个文件系统中的文件或目录。- 每个
inode
默认大小是128字节(1KB)或256字节(2KB)。 -
inode
的个数在磁盘格式化时便已给定。在文件系统的典型实现中,所有inode占文件系统储存的1%左右。
- 每个
-
blocks
:是磁盘的另一端连续的空间,用于存储文件的内容。- 操作系统在读取磁盘时,通常是一次性读取一个"块"(
block
)。 - 一个"块"通常是4k大小,由8个扇区组成,每个扇区大小为512字节。
image.png
- 操作系统在读取磁盘时,通常是一次性读取一个"块"(
inode分配完了怎么办?
由于文件系统中每个
文件数据对象
都必须要有一个inode
,因此当inode table
用光后,即使磁盘未满也无法在磁盘上创建文件了。
"目录文件" 概念
实际上在文件系统中,file和dir都属于一种“目录文件”。
- “目录文件”的结构是一个“目录项”列表。
- 每个“目录项”由2部分组成:
file/dir的名称
+file/dir的inode
。- 所以创建一个“目录文件”时,实际做了3件事:在其“父目录文件”中增加一个条目;分配一个inode;再分配一个存储块,用来保存当前被创建目录包含的文件与子目录。
文件系统创建一个 file 时做了哪些动作?
文件系统创建一个file时:
- 在其“父目录文件”的列表中增加一个“目录项”
- “目录项”的inode类别为“文件”
文件系统创建一个 dir 时做了哪些动作?
文件系统创建一个dir时:
- 在其“父目录文件”的列表中增加一个“目录项”
- “目录项”的inode类别为“目录”
文件系统 通过文件名打开文件 时做了哪些动作?
- 首先,操作系统找到这个文件名对应的inode号码
- 其次,通过inode号码,获取inode信息
- 最后,根据inode信息,找到文件数据所在的block,读出数据
inode细节
inode
储存了 文件数据对象
的元数据,包括:所有者、访问权限(读、写、执行)、类型(是文件还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文件系统存储块的地址,等等。
当已知 文件数据对象
的 inode
,操作系统便能通过 inode
里面的元数据查出 文件内容数据
的存储地址。
操作系统实际上并不关心 文件数据对象
的文件名与目录名,一个 文件数据对象
可以有多个别名,操作系统允许通过 硬链接 和 软链接 的方式为 文件数据对象
创建别名。
# 硬链接
ln <source_file> <target_file>
# 指向的是 目标文件的inode
# 软链接
ln -s <src_file/src_dir> <target_file/target_dir>
# 指向的是 目标文件的文件名