whereis -s 查不到内核头文件是因为系统默认不安装内核头文件包,需手动安装对应开发包:Ubuntu/Debian执行sudo apt install linux-headers-$(uname -r),RHEL/CentOS执行sudo dnf install kernel-headers或sudo yum install kernel-headers,安装后whereis -s linux通常返回/usr/src/linux-headers-*/include/linux路径。

whereis -s 查不到内核头文件?先确认是否已安装
直接运行 whereis -s linux 或 whereis -s kernel 通常返回空或只有冒号(如 linux:),这不是命令用错了,而是系统默认不安装内核头文件包。内核头文件(/usr/include/linux/ 下的 types.h、socket.h 等)属于开发依赖,需手动安装对应包:
- Debian/Ubuntu:
sudo apt install linux-headers-$(uname -r) - RHEL/CentOS/Fedora:
sudo dnf install kernel-headers或sudo yum install kernel-headers - openEuler:
sudo dnf install kernel-headers
装完再试 whereis -s linux,大概率会输出类似 linux: /usr/src/linux-headers-6.6.37/include/linux —— 注意路径中是 include/linux,不是 /usr/include/linux;后者是用户空间头文件,由 glibc-devel 提供,whereis 不管它。
查不到 gcc、make、ld?别用 -s,改用 -b
内核编译依赖的二进制工具(gcc、make、ld、objdump)不是“内核源码的一部分”,它们是独立的开发工具链。用 -s 搜肯定没结果。正确做法是:
- 查可执行路径:
whereis -b gcc make ld objdump - 查配套手册页(验证是否带文档):
whereis -m gcc make - 若只关心 PATH 中第一个匹配项,用
which gcc更直接;whereis会列出所有已知安装位置(比如/usr/bin/gcc和/usr/lib/gcc)
whereis 的 -b 模式搜索的是预设二进制目录(/usr/bin、/bin、/usr/local/bin 等),不依赖 $PATH,所以即使你自定义了 $PATH,它仍能扫到系统级安装的版本。
为什么 whereis -S /lib/modules/$(uname -r)/build -f linux 不生效?
-S 是指定「源代码」搜索路径,但必须配合 -s 使用,且路径必须以 / 开头、-f 必须紧接在路径列表之后。写成这样才合法:
whereis -s -S /lib/modules/$(uname -r)/build -f linux
不过实际中几乎没人这么用,因为:
-
/lib/modules/$(uname -r)/build是内核模块构建符号链接,指向/usr/src/linux-headers-*,而whereis默认就搜/usr/src,加-S反而可能绕过默认路径 -
whereis匹配的是文件名前缀(如linux),不是子目录内容;它不会递归扫描/usr/src/linux-headers-6.6.37/include/下的types.h - 真正要定位头文件本身,用
find /usr/src -name 'socket.h' 2>/dev/null或ls /usr/src/linux-headers-*/include/uapi/asm/更靠谱
whereis -l 显示的路径,其实和你的发行版强相关
运行 whereis -l 会打印当前系统实际使用的搜索路径,例如:
/usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/local/sbin /usr/lib /usr/share/man /usr/src /lib/modules/$(uname -r)/build
但注意:这个列表是编译时硬编码的,不同发行版可能删减或增补。比如 Alpine Linux 默认不带 /usr/src,所以 whereis -s 必然失败;CentOS 8+ 把内核头文件放在 /usr/src/kernels/,但 whereis 默认不扫这个路径 —— 它只认 /usr/src。遇到这种情况,要么手动加 -S /usr/src/kernels/$(uname -r) -f linux,要么放弃 whereis,直接 ls /usr/src/kernels/。
最常被忽略的一点:whereis 对“内核头文件”的理解仅限于源码树顶层(include/ 目录),它不关心你 #include <linux/socket.h> 时实际包含的是哪个路径下的文件 —— 那是编译器和 cpp 的事。


















