比如我想编译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
进入目录并打开配置界面:
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
启动系统
进入目录并打开配置界面:
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.
您好 请教一个问题 我在build 4.19 kernel的时候 用的是这里https://elrepo.org/tiki/kernel-lt的 CONFIG 但是我安装他们kernel之后 driver目录只有30多m 但是我build出来的driver目录确是2G多 主要是GPU和net 目录 是哪里不对吗?
想问一下编译Intel-ucode有什么用啊?
对了还有,在twitter看到你的i3wm桌面,下面用的是polybar吗?能不能分享一下配置文件给我看看呀。
"处理器制造商发布对处理器微码的稳定性和安全性更新。虽然微码可以通过BIOS进行更新,但Linux内核也可以在引导期间应用这些更新。这些更新提供了对系统稳定性至关重要的错误修复。如果没有这些更新,您可能会遇到虚假崩溃或难以跟踪的意外系统暂停。"
不是polybar是i3blocks,我的i3配置在这里: https://github.com/Linux-Theme-Collection/Windows-Manager/tree/master/i3
谢谢
[滑稽]