理解文件系统中inode的概念

理解文件系统中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 *); 
    ... 
    }
    1. Linux 中 VFS inode

      • 每个文件存在两个计数器:i_count 与 i_nlink,即引用计数与硬链接计数
      • i_count 用于跟踪文件被访问的数量,而 i_nlink 则是上述使用 ls -l 等命令查看到的文件硬链接数
      • 当文件被删除时,则 i_nlink 先被设置成 0
      • 文件的这两个计数器使得 Linux 系统升级或程序更新变的容易
      • 系统或程序可在不关闭的情况下(即文件 i_count 不为 0),将新文件以同样的文件名进行替换,新文件有自己的 inode 及 data block,旧文件会在相关进程关闭后被完整的删除
    2. 文件系统 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 中被取消)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
f2fs文件系统的inode结构包含以下字段: - i_mode:表示文件类型和权限信息的位掩码。 - i_uid:表示文件所属用户的用户ID。 - i_gid:表示文件所属组的组ID。 - i_links:表示链接数,即有多少个目录项引用这个inode。 - i_atime:表示最后一次访问该文件的时间。 - i_mtime:表示最后一次修改该文件内容的时间。 - i_ctime:表示最后一次修改该文件元数据的时间。 - i_size:表示文件的大小。 - i_blocks:表示文件占用的物理块数。 - i_advise:表示为该文件进行的优化建议。 - i_inline:表示是否使用内联扩展属性。 - i_xattr:表示扩展属性的头部信息,包括扩展属性数量等信息。 - i_projid:表示项目ID,用于POSIX ACL(Access Control List)的访问控制。 其,i_mode、i_uid、i_gid、i_size等字段与其他文件系统的inode结构类似,不再赘述。其余字段的含义如下: - i_links:在f2fs,当一个文件被删除时,其目录项并不会立即从目录移除,而是等到该文件的链接数减为0时才会被彻底删除。 - i_atime、i_mtime、i_ctime:与传统UNIX文件系统的意义相同。 - i_blocks:在f2fs文件的大小不需要按照块的倍数对齐,因此i_size和i_blocks可能会不一致。 - i_advise:f2fs使用一些特有的优化策略,例如区域性文件访问预测(FSRB,File System Redundant Block)和节点合并(Node Merge),因此i_advise字段记录了针对该文件的建议。例如,一个频繁被访问的文件,i_advise可能会设置为FSRB。 - i_inline、i_xattr:f2fs支持将一些较小的文件内容和扩展属性直接存储在inode,从而避免了寻找对应的物理块的开销。 - i_projid:用于实现命名空间隔离和ACL的访问控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_长风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值