写监控脚本读
/sys/class/net/eth0/speed——升级内核后还能用吗?答案取决于这个接口在
ABI 光谱上的位置。
一、先看图
flowchart LR
STABLE[稳定 ABI<br/>永不破坏] --> SYSCALL[系统调用<br/>最稳定]
STABLE --> SYSFS[sysfs<br/>Documentation/ABI/stable]
TESTING[测试 ABI<br/>可能变] --> SYSFS_T[sysfs<br/>Documentation/ABI/testing]
UNSTABLE[不稳定<br/>随时变] --> DEBUGFS[debugfs]
UNSTABLE --> TRACEFS[tracefs]
UNSTABLE --> PROCFS_D[/proc 部分接口]
classDef stable fill:#3fb95022,stroke:#3fb950,color:#adbac7;
classDef test fill:#f0883e22,stroke:#f0883e,color:#adbac7;
classDef unstable fill:#f8514922,stroke:#f85149,color:#adbac7;
class SYSCALL,SYSFS stable
class SYSFS_T test
class DEBUGFS,TRACEFS,PROCFS_D unstable
二、Linus 的规则
“We do not break userspace. Period.”
系统调用一旦发布 → 永远不删除、不改变语义。用户态程序依赖的行为 → 即使是 bug → 如果有足够多的用户 → 变成 feature。
2.1 例外
- 安全漏洞修复
- 明确标记为 unstable 的接口
- 从未被使用的接口
三、Documentation/ABI
Documentation/ABI/
├── stable/ # 承诺稳定
├── testing/ # 可能变化(需要通知)
├── obsolete/ # 计划移除
└── removed/ # 已移除
每个文件描述一个 ABI 接口:
What: /sys/class/net/<iface>/speed
Date: April 2005
KernelVersion: 2.6.12
Contact: netdev@vger.kernel.org
Description: Shows the interface speed in Mbps.
Users: NetworkManager, ethtool
四、sysfs 规则
4.1 one value per file
sysfs 的黄金规则:每个文件只包含一个值。
cat /sys/class/net/eth0/speed
# 1000不是像 /proc/meminfo 那样的多行表格。
4.2 可依赖性
Documentation/ABI/stable/中的 → 稳定Documentation/ABI/testing/中的 → 可能变- 未文档化的 → 不承诺
五、debugfs / tracefs
mount -t debugfs debugfs /sys/kernel/debug
mount -t tracefs tracefs /sys/kernel/debug/tracing明确非 ABI——格式、路径、内容随时可能变化。
不要在生产监控脚本中依赖 debugfs/tracefs 的具体格式。
六、/proc 的混乱历史
/proc 是最早的内核信息接口——不遵循 sysfs
规则:
/proc/meminfo:多行键值对(稳定)/proc/stat:格式文档化(基本稳定)/proc/<pid>/子目录:大部分稳定- 某些 /proc 文件:格式不保证
七、sysctl
sysctl -a | head
sysctl net.ipv4.tcp_max_syn_backlogsysctl 通过 /proc/sys/ 暴露 →
大部分稳定但有例外(被重命名或移除的 sysctl)。
八、syscall 的超级稳定性
系统调用号 → 永远不变
系统调用语义 → 永远不变
例:open(2) 从 1991 年到今天 →
同一个系统调用号 → 同一个语义。
新功能 → 新 syscall(openat2)→
不改旧的。
九、UAPI headers
include/uapi/linux/
用户空间可以包含的头文件 → 定义了 struct、常量、ioctl 号 → 一旦发布即稳定。
十、小结
- 系统调用是最稳定的 ABI → 永不破坏
- sysfs stable/ → 可依赖;testing/ → 谨慎
- debugfs/tracefs → 不是 ABI,随时变
- /proc 历史混乱但大部分稳定
- 遵循 Documentation/ABI 判断可依赖性
参考文献
Documentation/ABI/Documentation/admin-guide/sysfs-rules.rst- Greg Kroah-Hartman, “The Linux Kernel Driver Interface.” 2006
- Linus Torvalds, “never break userspace” discussions
工具
grep -r What Documentation/ABI/sysctl -a/sys/,/proc/
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】系统调用 ABI:x86_64 / arm64 / riscv / Windows NT 对照
系统调用是 OS 最稳定的接口。本文拆解 Linux syscall 的参数寄存器约定、返回值规范(负 errno 与 2-value ABI)、x86_64 SYSCALL、arm64 SVC、RISC-V ECALL、Windows NT 的 int 2e/syscall/SYSENTER 历史;说明为什么 Linux 承诺 \"don't break userspace\"、什么东西算 syscall ABI、vDSO 如何用共享内存加速、Go/musl/glibc 各自怎么实现 syscall stub。
【操作系统百科】/proc 与 /sys
为什么 /proc/self/status 的字段总让人困惑?本文讲 procfs vs sysfs 设计哲学、常用字段解读、pid namespace 下表现、per-cgroup 接口、稳定性分级。
【操作系统百科】内存回收
Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。
【操作系统百科】交换
swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。