缩短 Linux 内核编译时间

最近想裁减一下gentoo 上的Linux 内核,最主要是缩短内核编译时间,这样好为进一部尝试内核配置优化作准备,另外我猜内核东西少了,攻击面也会小,安全性会高?

https://zhuanlan.zhihu.com/p/164910411 (下面简称zhihu文,包含这个系列)影响,想尝试下 禁用“Initial RAM filesystem and RAM disk (initramfs/initrd) support”

我笔记本上的 Gentoo 是最初是根据 https://blog.csdn.net/pangpangchai/article/details/78110874?spm=1001.2014.3001.5506 (下面简称csdn文)装的,虽然后来发现此文也有些疏漏。 但优点是明显的:篇幅相对比较短,一页,我照着很快就把wifi 连上,硬盘分区搞好了,并且最终以此为主线,对照官方Handbook, 安装成功。而官方Handbook 比较长,好多个链接,而且当时打开也很慢(这会儿似乎好多了)。

zhihu文里提到建议不要用 genkernel , 我也不想用genkernel, 问题是如何摆脱呢?关键在与这个 initframfs, 我禁用了以后,就启动不起来了,出错消息如 https://blog.csdn.net/u011011827/article/details/111227545 (以下简称无法加载Root分区错)

genkernel 长时间带给我的最大困扰,在与它在我机器上默认运行 make mrproper , 虽然每次运行时都有提示,但我当时并不知道这个 mrproper 是干啥的(如果对kernel make 和熟悉,也许一开始就不会用 genkernel 了)。

后来偶然才读到原来mrproper 会把 /usr/src/linux/.config 文件给清除掉,怪不得我以前在 menuconfig 里做的配置改动,重新 genkernel 就全消失了。 genkernel 里加上 --no-mrproper ,就没问题了

首次运行genkernel 编译安装内核成功重启后, 在 /usr/src/linux 目录下面运行 make localmodconfig 对我非常又用,它会去掉.config 里当前设成 M 的模块中当前没有load 的部分。这样许多没用的模块就不用编译了。之前我 genkernel 一次要 10 个小时,现在不到 2小时就完成了。如果 genkernel 带上 --no-clean 参数,还会快得多。 一个问题是如果有用的Module当前没有加载怎么办?我开机后,进到图形界面,把wifi,音频都打开,然后运行 make localmodconfig , 我也不知道这样是否有效。

zhihu文给了一个脚本,用来查硬件,我没试。

我试过在我的机器上 genkernel 加 --no-ramdisk-modules 参数,就是不把 module 复制到到 initramfs 文件里,完了机器也无法启动,去掉这个参数机器就能启动。 估计是硬盘文件系统相关的啥模块设成了 M,没编进内核,比如我看了自己机器上 “AHCI SATA support” 就是 M。 但问题是我搜了下, .config 里 =m 的有近百项, 我需要把它们全部变成 =y 吗?

genkernel 还有一个参数 --no-strip , 如果不带,它会把 Module 里的debug symbol 在安装的时候去掉。

更新:我试着把 make localmodconfig 后 .config 里剩下的 =m都替换成了=y, 然后make menuconfig 把initramfs 支持取消掉, make, make install, grub-mkconfig -o /boot/grub/grub.cfg, 重启,启动不了,还是前面的无法加载Root分区错。并且发现生成的这个 grub.cfg 里面还是会尝试加载 initramfs。启动grub 菜单里面按 e 进去,把加载 initramfs 的行删掉,Ctrl+x, 也没用。

但如果用 genkernel 带 --no-ramdisk-modules 参数,是可以启动的。

进去后发现,wifi 不能用了,可惜之前能工作的时候忘了给lspci结果拍张照和现在对比下。

dmesg 命令查看,发觉有红字显示: iwlwifi : no suitable firmware found. 后面提示需要的版本和下载地址。

更新:https://wiki.gentoo.org/wiki/Iwlwifi 里有下面一段话:
In case the wireless configuration API (CONFIG_CFG80211) is built into the kernel (<*>) instead as a module (), the driver won’t be able to load regulatory.db from /lib/firmware resulting in broken regulatory domain support. Please set CONFIG_CFG80211=m or add regulatory.db and regulatory.db.p7s to CONFIG_EXTRA_FIRMWARE.

wifi 不能用时, dmesg -i firmware 里也能看到 regulatory.db 啥的相关错误。总之我的理解就是因为 GPL 原因,把一些 firmware build 进 kernel 有些麻烦,但我猜是有办法的,暂时不想研究了,只是为了消灭掉这个 initramfs , 我暂时还没体会到有多大好处。

所以,我在 make menuconfig 里把 “cfg80211 - wireless configuration API” 从 y 改成 m, 再重新 genkernel --install --no-mrproper --no-clean --no-ramdisk-modules all, 然后 grub-mkconfig -o /boot/grub/grub.cfg, 再 reboot , wifi 就好了。这里 genkernel --no-clean 是否恰当,我也不知道,但我这里就是一个折腾环境,图快,快了不止一点点。

更新:csdn文的安装记录我用得比较顺利,评论区有反对,我猜一个原因可能我第一台装gentoo 的机器恰巧是老的,非UEFI的BIOS。我第二台尝试的机器是 UEFI 的平板,某宝上淘来,预装的是Win10. 这期间遇到一个问题,好像是针对 UEFI 的,在handbook上找到的答案(我这脑子,隔了一段时间,忘了具体是啥)。

第一台机器是老老实实照 csdn 文,/boot 单独分区,还有单独 swap 分区;第二台机器就 root, boot 在一个分区,也没用 swap, 但emerge dev-lang/rust 的时候就死机了,试了n次都过不了,原来是机器内存不够(平板才4G). 照着 https://wiki.gentoo.org/wiki/Portage_TMPDIR_on_tmpfs 建立一个 swap 文件就解决了。

再有,装第二台机器的初衷是我需要一个带 systemd 的 gentoo 测试:https://github.com/neutrinolabs/pulseaudio-module-xrdp/issues/52
所以 eselect profile 就和第一个不同,选完 profile 后我记得要 emerge --update --deep @world 啥的,我直接就报依赖冲突了, 尝试先只update @system, 不带deep, 然后逐步扩大更新范围,参考 https://forums.gentoo.org/viewtopic-t-1127716-highlight-.html ,但还是绕不过冲突. 我eselect profile 选的是 /desktop/gnome/systemd, 我重新选一个/systemd, 不带desktop, 然后 emerge --update @system 就通过了,再重新选回原来的带 desktop 的profile, 重新 emerge --update.

更新: AppImage 还是挺常用的, 所以 localmodconfig 后最好还是把
File systems —>
<*> FUSE (Filesystem in Userspace) support
加上:
https://blog.csdn.net/weixin_42417818/article/details/114448464

更新2021/12/1: 我自己每次内核配置变动编译,总是要来抄
genkernel --install --no-mrproper --no-clean --no-strip all
这句,另外,因为我台式机没用grub, 而是直接用的efibootmgr,所以编译完要把/boot里生成的新文件手工复制到 efi 分区里,我下面链接包含操作截图:
https://gitee.com/guyuming76/personal/commit/c91b16e23309b6e238e85dfc9b4d455721a3abe0
先要把EFI分区mount 到一个随意的目录,然后再从/boot复制新文件到分区里 efibootmgr 指定的目录

更新2022/2/21: 前段时间EFI分区所在的硬盘坏了,在另外的硬盘上重建了一个EFI分区。这次在/etc/fstab 里直接把 EFI分区 mount 到了 /boot 上,genkernel 会直接把文件都install 到/boot ,也就是EFI 分区里,但我们还是要手工把 vmlinux 文件复制为 vmlinux.efi 文件。要是genkernel 能帮做这一步就好了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值