内存、伪文件系统与 Overlay/FUSE
1. ramfs/tmpfs
ramfs/ 提供简单内存文件系统;tmpfs 数据实际由 MM shmem 实现,可:
- 使用 page cache;
- 在启用 swap 时换出;
- 设置 size/nr_inodes;
- 支持 seals、huge page policy(按配置);
- 作为
/dev/shm、容器临时层。
ramfs 没有有效容量限制,特权用户写满可耗尽内存;生产更适合有限额 tmpfs。
2. procfs
proc/ 通过 seq_file 和 task/mm/net 等接口导出动态内核状态。/proc/<pid> 可受 pid namespace、hidepid、ptrace 权限限制。大量读取 proc 可能触发昂贵遍历,不是零成本。
3. kernfs/sysfs
kernfs 提供层次节点、active reference、open file 和 notify 基础;sysfs 把 kobject 属性映射为文件。
sysfs ABI 通常要求一个属性一个值,用户态不应依赖内部目录创建时序。store callback 必须严格解析长度和范围。
4. debugfs/tracefs/configfs
- debugfs:调试接口,无稳定 ABI;
- tracefs:tracing 专用;
- configfs:用户 mkdir/write 创建内核对象;
- pstore:持久化崩溃/固件日志。
生产镜像可不挂 debugfs;不能把安全敏感控制长期暴露给普通用户。
5. OverlayFS
OverlayFS 合并:
- lower layers:只读或基础;
- upper:可写;
- workdir:原子操作辅助;
- merged view。
写 lower 文件触发 copy-up;删除以 whiteout/opaque 表示;rename、xattr、hard link、metacopy/index 等影响语义和性能。
容器镜像小文件密集写会产生大量 copy-up 和 metadata I/O。
6. FUSE
FUSE 将 VFS 请求通过 /dev/fuse 发送给用户态 daemon:
1 | VFS op -> fuse request queue -> userspace daemon |
内核维护 inode/dentry/attribute 缓存、background request、interrupt 和 DAX(virtio-fs 等按配置)。daemon 卡住会让调用进程阻塞。
7. devpts/anon inode
- devpts 管理 pseudo terminal;
- anon_inodefs 为 epoll/eventfd/io_uring 等没有真实路径的 file 提供 inode/file;
- nsfs 把 namespace 对象暴露为 fd;
- configfs/sysfs 与普通持久文件系统语义不同。
8. RK3588
- 只读根常用 EROFS/SquashFS lower + tmpfs/ext4 upper;
- 容器 overlay upper 放在慢 eMMC 时 metadata latency明显;
- tmpfs size 应与 memcg 联合限制;
- FUSE 额外 context switch 对小 I/O 明显;
- debugfs/tracefs 仅排障时开放。
正在加载留言…