我一直在尝试让我自己配置和编译的 Linux 内核运行,但到目前为止还没有成功。该机器是一台 Apple Macbook(Intel Core 2 Duo,64 位),安装了免费的 Libreboot 固件,并以 GRUB2 作为有效负载。我正在尝试使用这个自定义内核来启动我构建的 Linux From Scratch 安装。我在机器上的另一个分区上安装了 Trisquel GNU/Linux(版本 7),它工作正常,所以我知道可以在此硬件/固件配置上启动 GNU/Linux。
内核版本是4.13.1(linux-libre),这是我第一次尝试编译自己的内核。当我尝试从 GRUB 命令提示符启动它时,屏幕变黑并且没有输出显示;但是,它确实会写入 /var/log/kern.log 文件。特别是,我对日志文件开头的以下消息感到困惑:
Oct 9 17:24:17 <lee_lfs> kernel: klogd 1.5.1, log source = /proc/kmsg started.
Oct 9 17:24:17 <lee_lfs> kernel: Inspecting /boot/System.map
Oct 9 17:24:17 <lee_lfs> kernel: Cannot find map file.
Oct 9 17:24:17 <lee_lfs> kernel: Loaded 100800 symbols from 32 modules.
Oct 9 17:24:17 <lee_lfs> kernel: [ 0.000000] random: get_random_bytes called from start_kernel+0x30/0x3bc with crng_init=0
Oct 9 17:24:17 <lee_lfs> kernel: [ 0.000000] Linux version 4.13.1-gnu (nobody@lee-LibreBook) (gcc version 7.2.0 (GCC)) #1 SMP PREEMPT Mon Oct 9 13:39:53 EDT 2017
下面的第二行似乎表明它已经找到了 /boot/System.map 文件;但是,以下行表明该文件被拒绝(我怀疑这可能至少部分原因导致内核无法完全启动)。
有谁知道可能是什么原因造成的?我之前在 Linux Questions 网站上问过这个问题(链接在这里);然而,没有人能够弄清楚这一点。 (该链接包含问题的更多背景信息以及之前建议的内容)。
编辑-回答评论中提出的建议:
一位用户建议,“Inspecting ...”行可能并不意味着 klogd 正在访问该文件,而可能只是意味着它已经开始查找该文件。但是,我最初忘记在 /etc/fstab 中为 /boot 分区添加一行(在这种情况下,显然无法找到该文件)并且“检查...”行没有被添加打印。直到我修复了 /etc/fstab 之后,该行才开始出现在日志中,并且具有映射文件的正确路径。这就是为什么我怀疑 klogd 正在找到映射文件,但由于某种原因似乎不接受它。
答案1
所以,我一直在挖掘 klogd 的源代码,我想我知道答案是什么:
首先,该Inspecting ...
行确实意味着 klogd 已在该位置找到映射文件并已成功打开它。
但是,它打印该行的原因Cannot find map file.
是因为它正在表单的映射文件中查找行:
[address] [type] _Version_XXXXX
其中“XXXXX”是内核版本,以基数 256 编码。
但是,此版本行不存在于我的内核构建期间生成的任何映射文件中(也不存在于我的预打包 Trisquel 安装提供的映射文件中)。因此,由于找不到此版本行,klogd 拒绝该映射文件。
显然,这会引发进一步的问题,但......
编辑:我创建了以下后续问题:
为什么我的 System.map 文件不包含“Version_XXXXX”行?
编辑:我在 System.map 文件的开头添加了一个“虚拟”版本行:
0FFFFFFFFFFFFFFF d Version_265223
该地址不应存在于虚拟内存映射中(因此希望不会与文件中的任何其他符号干扰或冲突)。 “265223”是我的内核版本(4.12.7),以 Base 256 编码。现在我在启动时在 kern.log 文件中得到以下内容:
Nov 3 19:12:02 <lee_lfs> kernel: klogd 1.5.1, log source = /proc/kmsg started.
Nov 3 19:12:02 <lee_lfs> kernel: Inspecting /boot/System.map-4.12.7
Nov 3 19:12:02 <lee_lfs> kernel: Loaded 86148 symbols from /boot/System.map-4.12.7.
Nov 3 19:12:02 <lee_lfs> kernel: Symbols match kernel version 4.12.7.
Nov 3 19:12:02 <lee_lfs> kernel: Loaded 11257 symbols from 31 modules.
所以它似乎起作用了 - klogd 终于识别了地图文件!内核仍然没有启动,尽管这可能是由于另一个问题,我接下来必须研究这个问题。目前这似乎是一个临时解决方案;不过,我会联系内核开发团队,看看这是怎么回事。