关于内核的一些配置

单独编译某个模块并加载使用

比如我想编译r8822be模块(网卡驱动),你需要先找到它的位置:

cd /usr/src/linux
grep -rin "r8822be*" | grep Makefile

进入目录并编译模块:

cd /usr/src/linux/drivers/staging/rtlwifi
make CONFIG_R8822BE=m -C /lib/modules/`uname -r`/build/ M=$PWD modules

在当前系统中加载模块:

mkdir /lib/modules/`uname -r`/kernel/net/r8822be -p
cp r8822be.{mod.o,ko} /lib/modules/`uname -r`/kernel/net/r8822be -v
depmod
modprobe r8822be

不使用initramfs启动系统

进入目录并打开配置界面:

cd /usr/src/linux
make menuconfig

进入 General Setup关掉Initial RAM filesystem and RAM disk (initramfs/initrd) support

如果你的fstab用的是UUID,则建议先改成/dev/sdX的格式

把你所有的modules编译进内核即built-in状态

然后开始编译吧

这里我就不说GRUB相关的配置了,因为我没有尝试过,具体请看这里

用的是接下来要说的efibootmgr启动系统

使用efibootmgr启动系统

进入目录并打开配置界面:

cd /usr/src/linux
make menuconfig

你要确保已启用所有必须的efi相关选项

进入 Processor type and features 搜索 Built-in kernel command line 并启用
然后会出现 Built-in kernel command string
填入 root=/dev/sda2或者root=PARTUUID=xxxx
sda2换成你实际的根目录所在分区或通过blkid查看根分区的PARTUUID

然后开始编译吧

首先确保efibootmgr已安装:

emerge -av efibootmgr

创建目录(可选):

mkdir -p /boot/efi/boot

将你的内核复制到对应目录(或者直接复制到boot):

cp /boot/vmlinuz-* /boot/efi/boot/bootx64.efi

查看是否已挂载efivars:

mount | grep efivars

重新挂载efivars为可读写:

mount -o remount,rw -t efivarfs efivarfs /sys/firmware/efi/efivars

这里说下efibootmgr的参数:

--create (-c) 创建新的启动项
--part (-p) efi分区的的序号,假设是/dev/sda2 则值为2
--disk (-d) efi分区所在的磁盘,例如/dev/sda
--label (-L) 启动项的名称
--loader (-l) 可启动的efi文件所在处(efibootmgr路径用的是\不是/)

示例添加启动项:

efibootmgr --create --disk /dev/sda --part 2 --label "Gentoo" --loader "\efi\boot\bootx64.efi"

这里也简单说下删除启动项的参数:

--bootnum (-b) 启动项的识别号(通过efibootmgr -v查看,例如Boot0001则值为1)
--delete-bootnum (-B) 进行删除

删除示例:

efibootmgr -b 2 -B

Intel-ucode编译进内核

进入目录并打开配置:

cd /usr/src/linux
make menuconfig

确保在Processor type and features里已选上CPU microcode loading support和你对应的CPU microcode loading support例如Intel CPU选中Intel microcode loading support

然后进入Device Drivers ---> Generic Driver Options启用Include in-kernel firmware blobs in kernel binary

Firmware blobs root directory填入: /lib/firmware/

另开终端安装源文件(注意查看这里的输出):

emerge -av sys-firmware/intel-microcode

查看你的microcode:

dmesg | grep microcode

查看sig值,例如sig=0x306c3

然后查看intel-ucode文件:

ls /lib/firmware/intel-ucode

你就会找到与sig值对应的06-3c-03(前面安装时会输出对应的microcode)

最后按/搜索EXTRA_FIRMWARE并在此选项中填入:

intel-ucode/06-3c-03

如果在编译时无报错就OK了

更新内核重启之后运行dmesg | grep microcode应该看到类似如下的输出:

[    0.000000] microcode: microcode updated early to revision 0x22, date = 2017-01-27
[    0.579838] microcode: sig=0x306c3, pf=0x20, revision=0x22
[    0.579948] microcode: Microcode Update Driver: v2.2.

等我想到,暂时就写这么多

5条评论
  1. kernel
    kernel2019-09-28

    您好 请教一个问题 我在build 4.19 kernel的时候 用的是这里https://elrepo.org/tiki/kernel-lt的 CONFIG 但是我安装他们kernel之后 driver目录只有30多m 但是我build出来的driver目录确是2G多 主要是GPU和net 目录 是哪里不对吗?

    回复
  2. Jerry
    Jerry2019-01-23

    想问一下编译Intel-ucode有什么用啊?
    对了还有,在twitter看到你的i3wm桌面,下面用的是polybar吗?能不能分享一下配置文件给我看看呀。

    1. YangMame
      YangMame2019-01-24

      "处理器制造商发布对处理器微码的稳定性和安全性更新。虽然微码可以通过BIOS进行更新,但Linux内核也可以在引导期间应用这些更新。这些更新提供了对系统稳定性至关重要的错误修复。如果没有这些更新,您可能会遇到虚假崩溃或难以跟踪的意外系统暂停。"

      不是polybar是i3blocks,我的i3配置在这里: https://github.com/Linux-Theme-Collection/Windows-Manager/tree/master/i3

      1. Jerry
        Jerry2019-01-24

        谢谢

        回复
      回复
    回复
  3. YangMame
    YangMame2018-04-04

    [滑稽]

    回复
添加新评论