我有VMware的虚拟机,Lubuntu17-32位,它可以轻松在 500mb RAM 上运行(甚至300mb就够了)我编写了一个内核“linux-4.12.3.tar”并将其安装在虚拟机中,即 Lubuntu。当我使用新内核重新启动时,我得到了:
End kernel panic not syncing out of memory and no killable processes
我不得不增加虚拟机的内存,直到1500兆为了避免该错误,当系统启动并到达桌面时,我检查了内存使用情况,它与之前相同300兆。
注意:分配给该虚拟机的硬盘是SATA 40GB。
那么为什么需要这么多的 RAM?最重要的是,我怎样才能减少它?
更新:
请注意,伙计们:我是两者都不说我在编译、安装和使用新内核时都遇到了问题。唯一的问题是从新内核启动时,启动时仅需要 1500mb,而启动完成并到达登录屏幕和桌面时,操作系统 (Lubuntu) 总共需要不到 300mb。那么为什么要 1500mb 以及如何减少它?
回答:
问题出在 /boot/initrd.img 文件,它的大小太大。要减小它的大小,请执行以下操作:
cd /lib/modules/<version>
sudo find . -name *.ko -exec strip --strip-unneeded {} +
sudo update-initramfs -c -k <version>
重启
感谢指出这一点的人。
答案1
我猜测内核崩溃可能是由于以下某个原因导致的,或者可能还有其他原因
1. 编译内核基本上就是安装内核,因此它不是替换旧内核,而是陷入死锁,两个内核都无法使用内存,因此出现恐慌。
新内核进入了某种循环,可以认为它是“试图调用自身”或者简单地变成一种 fork 炸弹,从而出现内存不足错误和恐慌。
分配给新内核的分区不够。尝试创建不同的分区,挂载它,系统链接它,以便其他程序可以执行它。现在使用 gcc 和链(链接器)重新编译它
它非但没有替换内核,反而自我毁灭了。
如果您提取一个最初大小为 300 MB 的内核 tarball,在提取后(即“tar -xvf kernel.zip”),它会变成 900 MB 的巨无霸。在安装 gcc、g++、gnu-make 等软件包并对其进行编译后,编译后的内核可能会占用 2 GB 的空间。因此,如果分区没有那么多空间,可能会出现内存不足的情况。
您没有提供交换区。由于构建内核需要大量资源,因此它需要大量空间、交换区和 RAM。
在安装过程中,它会创建 /mount、/proc、/boot、/dev 等子文件夹。这样,每个部分都会获得各自的位置,但由于内存不足而失败。
通常内核是在类似 chroot 的环境中编译的,但如果 chroot 没有正确设置,它可能无法获取 proc、mnt、dev 等资源,从而导致恐慌。
如果你仍然需要帮助,请查看这两个地方#1Ubuntu 内核团队 ,#2 Ubuntu 内核调试团队
新更新:
正如您的更新似乎暗示编译内核已经完成。
这只能意味着你编译了整个内核。
通常,内核中包含的所有内容对一个人来说可能很重要,但对其他人来说却浪费空间和时间。
因此,您可以使用来自ubuntu 内核。在我的情况下是 v4.14-rc1。下载与您的 arch 匹配的内核。我有 x86_64,所以我会选择 64 位。我会下载这些
- Linux 头文件
- Linux 标头-4.14.0-041400rc1-generic_4.14.0-041400rc1.201709162031_amd64.deb
- Linux 映像-4.14.0-041400rc1-generic_4.14.0-041400rc1.201709162031_amd64.deb
然后发出“sudo dpkg -i *.deb”来编译所有内容。
现在看来,您编译的内核超过 1GB,因此它使用了更多的资源。
ubuntu 内核的许多部分被删除,因此它的 i 尺寸较小并且使用了高强度压缩。
您的内核可能包含所有内容,可供 IOT、服务器、桌面使用,并且可能与 arm 64、amd64 等兼容,因为它可能具有运行这些内容所需的所有模块。
因此,为了减少它,您需要删除所有对您无用的部件,例如您从未听说过的硬件的驱动程序。尽可能地剥离服务器部件。
顺便说一句,这是一项很棒的工作,因为内核编译是一项令人头痛的工作,因为它需要大量的资源、时间和耐心
更新 #2:
正如您所说,您的 initrd.img 文件非常大。您至少可以发布一张 /boot/ 的屏幕截图,或者在终端中使用“ls -l”列出所有内容的大小。
内核是任何 Linux 发行版的核心。它非常复杂,所以即使不了解任何内容,人们也只能猜测问题所在。
我仍然建议您从内核中删除不需要的模块,然后编译它。