Linux Kernel Info

Linux 内核把内部状态以“文件、目录或日志”的形式开放给用户空间。多数文件并不存储在磁盘上,而是访问时由内核动态生成。

接口 主要用途 常见示例
/proc 查看进程信息和系统运行状态,也包含部分内核参数 /proc/1234/status/proc/meminfo/proc/cpuinfo
/sys 展示和控制设备、驱动及内核对象 /sys/class/net/eth0//sys/block/sda/
debugfs 面向内核开发者的调试入口,接口通常不保证稳定 /sys/kernel/debug/
tracefs 收集内核事件、函数调用和性能跟踪数据 /sys/kernel/tracing/
dmesg 读取内核环形日志缓冲区,并非文件系统 启动日志、驱动报错、硬件异常

/proc:运行状态和进程视图

/procprocfs 虚拟文件系统。它最初主要用于暴露进程信息,后来也加入了大量系统级信息。

每个进程通常对应一个数字目录:

1
2
3
4
5
6
7
/proc/1234/
├── cmdline # 启动命令
├── cwd # 当前工作目录
├── fd/ # 已打开的文件描述符
├── maps # 虚拟内存映射
├── status # 进程状态
└── task/ # 线程

系统级文件包括:

1
2
3
4
cat /proc/meminfo
cat /proc/loadavg
cat /proc/interrupts
cat /proc/mounts

/proc/sys/ 比较特殊,它允许查看或修改部分内核参数:

1
2
cat /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.ip_forward=1

通常应优先使用 sysctl,而不是直接写 /proc/sys

/sys:内核对象和设备模型

/sys 挂载的是 sysfs,它把内核中的设备、驱动、总线、模块等对象组织成层次结构。

例如:

1
2
3
4
5
6
7
8
9
/sys/
├── block/ # 块设备
├── bus/ # PCI、USB 等总线
├── class/ # 网络、输入、电源等设备类别
├── devices/ # 实际设备拓扑
├── firmware/ # 固件相关信息
├── fs/ # 文件系统相关对象
├── kernel/ # 内核功能
└── module/ # 已加载模块

一些文件不仅能读取,还能控制设备:

1
2
3
cat /sys/class/net/eth0/operstate
cat /sys/class/power_supply/BAT0/capacity
echo 0 | sudo tee /sys/class/leds/example/brightness

粗略来说,/proc 偏向“系统现在运行得怎样”,/sys 偏向“系统里有哪些内核对象,它们如何组织”。

debugfs:灵活但不稳定的调试接口

debugfs 专门供内核和驱动开发者暴露调试信息,常见挂载位置是:

1
/sys/kernel/debug

检查和挂载:

1
2
mount | grep debugfs
sudo mount -t debugfs none /sys/kernel/debug

驱动可以在这里提供内部寄存器、统计计数器、状态快照或测试控制项。

需要注意:

  • 不属于稳定的用户空间 ABI;
  • 文件名、格式和行为可能随内核版本改变;
  • 部分节点读取也可能产生副作用;
  • 通常只允许 root 或具备相应权限的进程访问。

因此,生产程序不应长期依赖未经稳定性承诺的 debugfs 接口。

tracefs:专门用于内核跟踪

tracefs 是从 debugfs 中拆分出来的跟踪文件系统,主要承载 ftrace、tracepoints 和部分 eBPF 跟踪基础设施。

现代系统通常挂载在:

1
/sys/kernel/tracing

某些旧系统或兼容布局中也可能出现在:

1
/sys/kernel/debug/tracing

关键文件包括:

1
2
3
4
5
6
7
8
available_tracers       # 可用跟踪器
available_events # 可跟踪事件
current_tracer # 当前跟踪器
events/ # 事件分类
set_ftrace_filter # 函数过滤器
trace # 当前跟踪结果
trace_pipe # 实时消费跟踪结果
tracing_on # 跟踪开关

例如跟踪进程执行事件:

1
2
3
cd /sys/kernel/tracing
echo 1 | sudo tee events/sched/sched_process_exec/enable
sudo cat trace_pipe

trace 更像当前缓冲区的快照;trace_pipe 会持续输出并消费数据,更适合实时跟踪。

dmesg:读取内核日志

dmesg 不是一种文件系统,而是读取内核日志环形缓冲区的命令。内核和驱动通过 printk() 等机制向这个缓冲区写日志。

常见用法:

1
2
3
4
5
dmesg
dmesg --human
dmesg --level=err,warn
dmesg --follow
dmesg | grep -i usb

它常用于排查:

  • 驱动加载失败;
  • 磁盘 I/O 错误;
  • OOM Killer;
  • USB 或 PCI 设备识别问题;
  • 文件系统损坏;
  • 内核崩溃和硬件异常。

在使用 systemd 的系统上,也可以通过日志系统查看内核消息:

1
2
3
journalctl -k
journalctl -k -b # 当前启动
journalctl -k -b -1 # 上一次启动

因为环形缓冲区容量有限,旧消息会被新消息覆盖;journalctl 如果启用了持久化日志,则可能保留更长时间。

它们之间的关系

可以用一句话概括:

  • /proc:进程与系统运行视图;
  • /sys:设备和内核对象模型;
  • debugfs:自由形式的开发调试入口;
  • tracefs:结构化、实时的内核跟踪入口;
  • dmesg:内核主动输出的日志记录。

读取普通节点通常安全,但写入 /proc/sys/sysdebugfstracefs 可能立即改变内核及硬件行为,需要确认节点语义并使用适当权限。

本文作者:jujimeizuo
本文地址https://blog.jujimeizuo.cn/2026/09/21/Linux-Kernel-Info/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!