RK3588 kernel-6.1 fs/ext4/sysfs.c sysfs / proc 调试与调参接口分析
1. 分析范围
rk3588/kernel-6.1/fs/ext4/sysfs.c- 挂载/卸载钩子:
ext4_register_sysfs/ext4_unregister_sysfs(由super.c等在合适生命周期调用;注释要求 卸载时先于 journal teardown) - 协作:
super.c(ext4_seq_options_show、错误计数 notify)、mballoc.c(ext4_mb_seq_*)、extents.c(ext4_seq_es_shrinker_info_show)、fast_commit.c(ext4_fc_info_show)
2. 代码作用(一句话)
sysfs.c 为每个已挂载的 ext4 卷在 /sys/fs/ext4/<设备名> 注册 s_kobj,用统一的 struct ext4_attr + calc_ptr 把 ext4_sb_info/ext4_super_block 字段 或 特例回调 暴露为 可读/可写 sysfs 属性;并在 /proc/fs/ext4/<设备名> 下挂 options、mb_groups、fast commit、extent shrinker 等 seq_file 接口;全局 /sys/fs/ext4/features 下列出 本内核编译进 ext4 的可选能力;ext4_notify_error_sysfs** 在错误计数变化时 sysfs_notify 便于用户态轮询。**
3. 解决了什么问题
| 问题 | sysfs.c 中的处理方式 |
|---|---|
| 运维需要看清「这一_mount」的写量、预分配、延迟分配 | delayed_allocation_blocks(s_dirtyclusters_counter 换块)、session_write_kbytes/lifetime_write_kbytes(part_stat 与挂载初值、s_kbytes_written) |
| 在线调 mballoc / inode 读预读 / extent zeroout 等行为 | mb_*、inode_goal、extent_max_zeroout_kb、mb_prefetch*、last_trim_minblks 等映射到 ext4_sb_info 字段(多数 0644 可写) |
| 预留簇(quota/管理用) | reserved_clusters:kstrtoull + 上限为卷簇数,写入 s_resv_clusters |
| 日志线程是谁、是否存活 | journal_task:输出 jbd2 j_task 的 pid,无 journal 为 <none> |
Correlating 内核报错与盘上 s_error_* |
只读:errors_count、first/last_error_{ino,block,line,func,errcode,time},时间用 superblock 中 32+8 位时间戳 拼 time64_t 输出 |
| 限流 spam | 可写:err/warning/msg_ratelimit_{interval_ms,burst} → sbi 内 ratelimit_state |
| 回归/故障注入 | trigger_fs_error(0200,CAP_SYS_ADMIN 调 ext4_error);CONFIG_EXT4_DEBUG 下 simulate_fail |
| 用户态要知道「当前内核 ext4 编进了哪些特性」 | /sys/fs/ext4/features/*:各属性 show 固定 supported,列表随 Kconfig 变化(encryption、casefold、verity、fast_commit 等) |
/proc/mounts 以外还要看实际 mount 选项 |
/proc/fs/ext4/xxx/options → ext4_seq_options_show |
| 大块分配器内部状态难查 | mb_groups、mb_stats、mb_structs_summary(seq ops 在 mballoc.c) |
| extent 状态树 shrinker / fast commit 状态 | es_shrinker_info、fc_info |
| 错误监控事件 | ext4_notify_error_sysfs:通知 errors_count,便于 inotify/udev 类工具 |
| 卸载顺序与 sysfs 并发 | ext4_unregister_sysfs:remove_proc_subtree + kobject_del;super.c 要求 先于 jbd2_journal_destroy,避免 sysfs 仍访问 j_task 等 |
4. 机制摘要
4.1 属性分发器
calc_ptr:按attr_ptr把属性绑定到sbi某偏移、s_es某偏移,或 显式全局指针(如max_writeback_mb_bump指向静态old_bump_val=128,只读兼容项)。ext4_attr_show/ext4_attr_store:根据attr_id/attr_id_t分支;对ext4_super_block的pointer_ui在 show/store 中使用 小端le32/le64转换。inode_readahead_blks:写入要求 2 的幂且不超过上界,否则-EINVAL。
4.2 每文件系统 kobject
ext4_sb_ktype:default_groups = ext4_groups(由ext4_attrs[]+ATTRIBUTE_GROUPS(ext4)生成)、release = ext4_sb_release→complete(s_kobj_unregister),与super.c里kobject_put+wait_for_completion配对。
4.3 全局 features kobject
ext4_feat_ktype:release里kfree(kobj)(该 kobject 为kzalloc的单独对象);子属性全部attr_feature→ showsupported\n。
4.4 proc 目录
ext4_proc_root:proc_mkdir("fs/ext4", NULL),与 sysfsfs/ext4命名并列,路径为/proc/fs/ext4/<sb->s_id>。- 各
proc_create_*将sb传入 single/seq,供 options 与 mballoc 导出。
5. 与用户可见路径对照(逻辑)
| 路径前缀 | 含义 |
|---|---|
/sys/fs/ext4/<s_id>/... |
该卷 sysfs 调参/只读统计 |
/sys/fs/ext4/features/... |
本内核支持的 ext4 编译期特性占位文件 |
/proc/fs/ext4/<s_id>/... |
options / mb_ / fc / es_shrinker* 等 proc seq |
<s_id> 一般为块设备标识字符串(如 sda1),与 super_block->s_id 一致。
6. 小结
sysfs.c 不参与数据路径 I/O,负责 可观测性与可调参数:把 内存/超级块中的计数与调参位 暴露给 sysfs,把 更长的调试报表 放在 proc seq;并通过 features 目录 区分 「文件系统特性位」 与 「内核是否支持某能力」。修改 ext4_sb_info 运行参数 时需注意 与 mount 选项、锁及与其他子系统的语义(例如 reserved_clusters 影响可用空闲统计),此类细节仍以 mballoc/super 实现为准。
若需对照 挂载选项序列化,见 super.c 中 ext4_seq_options_show;mballoc 导出字段含义见 mballoc.c。
正在加载留言…