Gentoo内核编译¶
备注
Gentoo文档非常详细,我无法完整翻译,只能选择部分自己的需要以及理解进行综合。此外会加上自己的实践经验(基于我现有硬件以及软件需求)
手动配置内核¶
Gentoo为用户提供了 两种 内核配置、安装和升级的方式:
自动(genkernel) ,也就是我在 在MacBook Pro上安装Gentoo Linux 快速采用的内核安装方法 Gentoo genkernel
手动(manual) ,大多数Gentoo用户会选择手动配置内核:
更大的灵活性
更小的(内核)尺寸
更短的编译时间
学习经历
闲着无聊
内核配置的绝对知识,和/或
对内核的完全控制
由于编译内核的选项实在太繁杂了,我主要是为自己的硬件裁剪内核,所以考虑分两个步骤(阶段):
先使用 Gentoo内核编译 对内核主要功能进行 粗略裁剪
再通过手工调整方法,对内核细节进行微调
配置概念¶
内核配置即简单又不简单:
通过
make menuconfig
可以从交互菜单选择,系统会自动做一些关联配置,所以还是比较傻瓜化的内核包含的默认值一半是通用且合理的,也就是大多数用户只需要对基本配置做少量改动
在配置内核时,应该循序渐进,每次少量修改默认配置,并进行充分编译和运行验证
内置(build-in) vs. 模块化(modular)¶
大多数配置选项都是三态的(tristate):
根本不构建 (N)
直接构建到内核中 (Y)
构建为模块 (M)。
一般规则:
建议将硬件支持(还需要在内核中包含固件支持)和内核功能直接构建到内核中。 然后内核可以确保功能和硬件支持在需要时可用。
部分功能,例如重要分区的文件系统支持,应该直接构建到内核中(使用模块化会需要 initramfs 支持)
硬件¶
使用
lspci
(sys-apps/pciutils
包) 和lsusb
(sys-apps/usbutils
包)来识别硬件通常以太网适配器必须识别以太网芯片并为特定网卡配置硬件支持
建议将非必须的驱动程序配置为模块(例如偶然使用的外接设备)
内核功能¶
对于磁盘文件系统支持(我选择主要支持
vfat
/xfs
/zfs
/ext
)高级网络功能(路由或防火墙)
内核源代码¶
备注
Gentoo也和其他发行版一样提供了直接可以运行的编译好的标准执行内核 gentoo-kernel-bin
,可以方便快速完成系统安装和启动。一旦系统安装和工作正常,就可以开始自定义编译内核,同时保留 sys-kernel/gentoo-kernel-bin
用于在自定义内核启动失败时应急修复。
Gentoo 提供了以下几种支持的内核软件包:
gentoo-sources
推荐大多数Gentoo用户使用(既然已经选择了Gentoo),能够最大化定制系统内核gentoo-kernel
适合大多数系统的内核,采用通用配置每次自动完成编译,适合对编译内核不感兴趣的用户git-sources
这是从上游内核开发源代码上每天自动生成的软件包
genkernel
工具默认激活了通用选项和驱动,完全自动化,适合不熟悉手工编译内核的用户
此外,还有一些不被(官方)支持的内核软件包
安装内核源代码:
emerge --ask sys-kernel/gentoo-sources
cd /usr/src/linux
make menuconfig
编译内核和安装内核(和模块):
make
make modules_install
# 确保 /boot 已经挂载
make install
分发内核(Distribution kernels)¶
distribution kernel project 提供了通过Portage安装和管理的内核。这些内核是已经编译过多(如果需要)并且就像其他软件包一样使用 Gentoo emerge 命令安装,可以减轻管理负担。内核更新可以在更新系统时候( emerge -avuDN @world
)完成,并且只有配置bootloader使用新内核时候才需要手动步骤。
不过, distribution kernels
使用了符合大多数系统的通用配置,所以可以视为 "仅能工作" 而已。那些对内核编译不感兴趣的用户可以使用 distribution kernels
,以避免自己配置编译内核的繁重工作。
备注
virtual/dist-kernel
并不是一个实际的源代码软件包,而是为 sys-kernel/gentoo-kernel
提供了一个通用配置的编译选项。这样每次更新 sys-kernel/gentoo-kernel
就会自动编译一个通用的分发内核。这个内核可以作为应急救援使用,假设自己的定制内核无法正常工作,就可以切换到这个分发内核进行修复。
unstable
切换 stable
后对 dist-kernel
切换¶
我在解决 Gentoo Linux Sway fcitx中文输入 和 Gentoo Linux KDE fcitx中文输入 时,为了安装 Gentoo Overlays 的第三方仓库软件,启用了 Gentoo make.conf 的 unstable
全局参数 ~amd64
。但是,系统去除了 ~amd64
之后,执行 升级Gentoo 之后,出现了同时安装 ``
sys-kernel/gentoo-kernel 6.7.1
sys-kernel/gentoo-kernel-bin 6.6.13
virtual/dist-kernel 6.7.1
我想将系统内核降级到 6.6.13,但是 virtual/dist-kernel
指向 gentoo-kernel-6.7.1
导致我无法 emerge -acv sys-kernel/gentoo-kernel
(卸载),始终报错: 提示 virtual/dist-kernel
依赖 sys-kernel/gentoo-kernel
参考 Dist Kernel 6.1.69 案例:
首先需要
emerge --deselect
:
emerge --deselect gentoo-kernel
此时输出显示:
>>> Removing sys-kernel/gentoo-kernel from "world" favorites file...
然后完成一次完整的 升级Gentoo :
emerge -avuDN @world
此时由于去除了 ~amd64
全局参数之后,整个系统软件包回归到 stable
状态,并修正了依赖关系。再次执行 emerge -acv sys-kernel/gentoo-kernel
就可以顺利完成。
更新boot loader¶
如果使用GRUB,则执行以下命令:
grub-mkconfig -o /boot/grub/grub.cfg
由于我在 在MacBook Pro上安装Gentoo Linux 采用了 MacBook Pro上运行Arch Linux 相同的 efibootmgr
管理UEFI启动顺序,所以执行以下命令配置EFI启动:
efibootmgr --disk /dev/nvme0n1 --part 1 --create --label "Gentoo XCloud" --loader /vmlinuz-6.1.12-gentoo-xcloud \
--unicode 'root=PARTUUID=fbf163f3-a42e-411a-be61-f2ae7b398e61 rw' --verbose
备注
这里没有使用 initramfs ( ramfs 内存文件系统 的特例 ) ,如果有需要在内核启动时预先加载的内核模块,例如 Linux LVM逻辑卷管理 或 ZFS 作为根卷,或者需要使用特定的文件系统,都需要采用 ramfs 内存文件系统 预先加载内核模块或者维护工具。
警告
建议将关键文件系统直接编译进内核:例如我使用XFS作为根文件系统,但是默认内核配置 xfs
是作为模块编译的,这导致要么使用 initramfs 要么就必须直接编译进内核,否则重启系统无法工作。
修复和挽救¶
实际上,内核裁剪和构建总是会遇到各种问题,导致系统无法启动。此时,我们需要采用 在MacBook Pro上安装Gentoo Linux 的挂载并 chroot
步骤,重新进入系统进行排障:
通过Gentoo 安装U盘再次启动启动,然后启动sshd服务并且设置好root密码:
# 启动ssh服务
ssh-keygen -A
/usr/sbin/sshd
# 设置root用户密码
passwd
挂载 root 分区文件系统:
mount /dev/nvme0n1p3 /mnt/gentoo
挂载文件系统:
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --bind /run /mnt/gentoo/run
mount --make-slave /mnt/gentoo/run
进入Gentoo新环境:
chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot) ${PS1}"
挂载boot分区(这个分区是MacBook的macos和gentoo公用的):
mount /dev/nvme0n1p1 /boot
现在所有环境恢复磁盘上Gentoo Linux的运行状态,除了内核采用了LiveCD提供内核,整个文件系统都是磁盘上文件系统。就可以从新开始内核配置和编译了,可以尝试重新开始内核构建。