理解文件系统中inode的概念
概念:inode就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名、使用者及群组等
inode 是 UNIX 操作系统中的一种数据结构,其本质是结构体
在 Linux 中,索引节点结构存在于系统内存及磁盘,其可区分成 VFS inode 与实际文件系统的 inode。
VFS inode 作为实际文件系统中 inode 的抽象,定义了结构体 inode 与其相关的操作 inode_operations
Linux 中 VFS inode include/linux/fs.h struct inode { ... const struct inode_operations *i_op; // 索引节点操作 unsigned long i_ino; // 索引节点号 atomic_t i_count; // 引用计数器 unsigned int i_nlink; // 硬链接数目 ... } struct inode_operations { ... int (*create) (struct inode *,struct dentry *,int, struct nameidata *); int (*link) (struct dentry *,struct inode *,struct dentry *); int (*unlink) (struct inode *,struct dentry *); int (*symlink) (struct inode *,struct dentry *,const char *); int (*mkdir) (struct inode *,struct dentry *,int); int (*rmdir) (struct inode *,struct dentry *); ... }
Linux 中 VFS inode
- 每个文件存在两个计数器:i_count 与 i_nlink,即引用计数与硬链接计数
- i_count 用于跟踪文件被访问的数量,而 i_nlink 则是上述使用 ls -l 等命令查看到的文件硬链接数
- 当文件被删除时,则 i_nlink 先被设置成 0
- 文件的这两个计数器使得 Linux 系统升级或程序更新变的容易
- 系统或程序可在不关闭的情况下(即文件 i_count 不为 0),将新文件以同样的文件名进行替换,新文件有自己的 inode 及 data block,旧文件会在相关进程关闭后被完整的删除
文件系统 ext4 中的 inode
ext4 中的 inode struct ext4_inode { ... __le32 i_atime; // 文件内容最后一次访问时间 __le32 i_ctime; // inode 修改时间 __le32 i_mtime; // 文件内容最后一次修改时间 __le16 i_links_count; // 硬链接计数 __le32 i_blocks_lo; // Block 计数 __le32 i_block[EXT4_N_BLOCKS]; // 指向具体的 block ... };
三个时间的定义可对应与命令 stat 中查看到三个时间
i_links_count 不仅用于文件的硬链接计数,也用于目录的子目录数跟踪(目录并不显示硬链接数,命令 ls -ld 查看到的是子目录数)
文件系统 ext3 对 i_links_count 有限制,其最大数为:32000(该限制在 ext4 中被取消)