如何从 linux 内核代码中获取发行版名称和版本?

How to get distro name and version from linux kernel code?

我正在寻找是否有任何 API 我们可以通过它从 Linux 内核模块中获取 OS 分发名称和版本?

例如,我正在使用 SLES 12 服务包 4。此信息存在于 /etc/os-release 文件中。我想知道是否有任何方法可以从内核代码中获取这些信息。

linux:/ # cat /etc/os-release
NAME="SLES"
VERSION="12-SP4"
VERSION_ID="12.4"
PRETTY_NAME="SUSE Linux Enterprise Server 12 SP4"
ID="sles"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:suse:sles:12:sp4"
linux:/ #

没有用于检测当前 OS 分布的内核 API,只是因为它不是真正需要的。 Linux 内核本身与发行版无关,它根本不在乎哪个发行版 运行 在它之上(让内核取决于什么是 运行 在它之上没有多大意义)。

如果您真的想要,您可以自己从内核space打开、读取和解析文件。查看更多 in this other post for an example, and in particular this answer 了解现代内核。无论如何,请记住通常不鼓励与内核 space 进行文件系统交互,如果操作不当,很容易导致错误并危及内核的安全性,所以要小心。

如果您正在开发内核模块,我建议您在 compiling/installing 模块时从用户 space 解析 /etc/os-release 文件并使用一组 #defines,甚至 module parameters。在任何情况下,您都应该问问自己 为什么 您首先需要内核代码中的这些信息,因为您确实不应该。