手册:X86/安装/配置Linux内核
可选:安装固件和微代码
固件
在开始配置内核部分之前,最好了解下,一些硬件设备需要先在系统上安装附加的固件,有时是非自由及开放源代码软件(FOSS)才能正常运行。我们经常网络接口上会使用附加的固件,特别是无线网络接口,常用于台式电脑和笔记本电脑。此外,来自 AMD,Nvidia 和 Intel 等供应商的现代视频芯片,要想使用完整的功能,通常也需要外部固件文件。现代硬件设备的大多数固件都可以在 sys-kernel/linux-firmware 软件包中找到。
为了在必要时提供固件,首次重启系统之前推荐安装 sys-kernel/linux-firmware 软件包:
root #
emerge --ask sys-kernel/linux-firmware
安装某些固件软件包时,经常需要接受固件关联的许可证。有需要的话,访问手册的许可证处理章节有助于你接受许可证。
注意,当内核以模块(M)加载内核符号时,将从文件系统中加载其相关的固件文件。对于以模块加载的符号,没有必要把设备固件文件加入内核二进制镜像中。
微码
除了独立显卡硬件和网络接口之外,CPU 可能也需要固件更新。通常这种固件被称为微码(microcode)。有时需要更新版本的微码来修补 CPU 硬件中的不稳定性、安全问题或其他复杂的错误。
AMD CPU 的微码更新在前面提到的 sys-kernel/linux-firmware 软件包内分发。Intel CPU 的微码可以在 sys-firmware/intel-microcode 包中找到,并且需要单独安装。更多有关如何更新微码的细节,请查看微码文章。
内核配置和编译
现在是时候来配置和编译内核源代码了。将介绍三种用内核管理安装的方法,但是安装后,任何时候都可以采用新的方法。
由操作最少到操作最多排序:
- 全自动方法:Distribution 内核
- Distribution 内核用来配置、自动构建安装 Linux 内核、相关模块和 initramfs 文件(可选,但是默认启用)。将来内核就像其他的系统软件包一样,通过使用包管理器全自动升级。如果需要定制内核,它可以提供自定义内核配置文件。这种过程操作最少,并且非常适合新 Gentoo 用户,因为它开箱即用,并且系统管理员最少参与。
- 混合方法:Genkernel
- 通过系统包管理器安装新内核源代码。系统管理员使用 Gentoo 的 genkernel 工具的通用配置文件,自动构建和安装 Linux 内核、相关模块和 initramfs 文件(可选,但默认不 启用)。如果要自定义内核,它可以提供自定义内核配置文件。将来每次更新内核配置、编译和安装都需要系统管理员运行 eselect kernel,genkernel和其他可能的命令。
- 全手动方法
- 通过系统包管理器安装新的内核源代码。使用 eselect kernel 和一大堆 make 命令手动配置、构建和安装内核。将来内核升级需要重复手动配置、构建和安装内核文件的过程。这是操作做多的过程,但是在内核更新过程提供最大程度控制。
Linux内核是所有发行版的核心。它位于用户程序和系统硬件之间。尽管手册提供给用户一些可选的内核源码,但是在内核概述页面有更全面的列表,上面有着更多的细节描述。
distribution 内核
Distribution 内核是涵盖了解包、配置、编译和安装内核完整过程的 ebuild。这种方法的主要优点是,内核可以作为 @world 的一部分通过包管理器升级到新版本。只需要运行 emerge 命令即可。Distribution 内核默认支持大多数硬件,但是有两种定制的机制:savedconfig 和 config snippets。查看项目页面获取更多配置细节。
安装正确的 installkernel 软件包
在使用 distribution 内核前, 请验证系统已经安装正确的 installkernel 软件包 。当使用 systemd-boot(以前是 gummiboot)作为 bootloader,请安装:
root #
emerge --ask sys-kernel/installkernel-systemd-boot
当使用传统的 /boot 布局(例如 GRUB、LILO 等。), 应该已经默认安装了 gentoo 变量。如果有疑问:
root #
emerge --ask sys-kernel/installkernel-gentoo
安装 distribution 内核
如果用 Gentoo 补丁从源码构建一个内核 ,输入:
root #
emerge --ask sys-kernel/gentoo-kernel
想要避免编译本地内核源代码的系统管理员可以使用预编译的内核镜像:
root #
emerge --ask sys-kernel/gentoo-kernel-bin
更新和清理
内核安装后,包管理器将自动更新到新版本。包管理器清理旧的软件包之前,将保留以前的版本。如果要回收磁盘空间,可以定期运行 emerge 加 --depclean
选项清理过时的软件包:
root #
emerge --depclean
或者,专门清理旧版本的内核:
root #
emerge --prune sys-kernel/gentoo-kernel sys-kernel/gentoo-kernel-bin
安装后/更新任务
Distribution 内核是一种能由其他软件包重新构建安装的内核模块。linux-mod.eclass 提供了 dist-kernel
USE 标记来控制 virtual/dist-kernel 子槽的依赖。
在像 sys-fs/zfs 和 sys-fs/zfs-kmod 这样的软件包上启用 USE 标记后,将允许它们自动根据最新更新的内核重新编译,如果合适的话,还会相应地重新生成 initramfs!
手动重建 initramfs
需要的话, 可以手动重建 initramfs,内核更新后,执行:
root #
emerge --ask @module-rebuild
如果任何内核模块(例如 ZFS)需要提前启动,需要之后通过下面命令重建 initramfs:
root #
emerge --config sys-kernel/gentoo-kernel
root #
emerge --config sys-kernel/gentoo-kernel-bin
安装内核源码
本小节只有关于使用 genkernel(混合)或手动内核管理方法
当为基于 x86 的系统安装和编译内核时,Gentoo 推荐使用 sys-kernel/gentoo-sources 软件包。
选择一个合适的内核并使用 emerge 来安装它。
root #
emerge --ask sys-kernel/gentoo-sources
这将在 /usr/src/ 中安装路径中特定版本的 Linux 内核源码。如果没有在所选内核源码包内启用 USE=symlink
,它将不会自行创建符号链接。
我们习惯性的维护 /usr/src/linux 符号链接。这样,它指向与当前运行的内核相对应的源代码。然而,默认情况下不会创建这个符号链接。有一个简单创建符号链接的方法是利用 eselect 的内核模块。
更多有关符号链接的信息以及如何管理符号链接,请参考升级内核。
首先,列出所有已安装的内核:
root #
eselect kernel list
Available kernel symlink targets: [1] linux-5.15.52-gentoo
要创建一个名为 linux 的符号链接,使用:
root #
eselect kernel set 1
root #
ls -l /usr/src/linux
lrwxrwxrwx 1 root root 12 Oct 13 11:04 /usr/src/linux -> linux-5.15.52-gentoo
备选:genkernel
如果全手动配置看起来太恐怖,系统管理员应该考虑使用 genkernel 混合方法来维护内核。
Genkernel 提供了通用的内核配置文件,可以自动生成内核(generates the kernel),initramfs,和相关模块,然后将生成的二进制文件安装到适当的位置。它提供了系统首次启动时最小的常规硬件支持,并允许将来自定义内核配置以及对内核额外升级。
请注意:虽然使用 genkernel 维护内核可以让系统管理员对系统内核,initramfs 和其他选项更新时有更多的操作,但当新的源代码发行时,却会投入更多的时间和精力去更新内核。所以那些希望不手动内核维护的人应该使用 distribution 内核。
更进一步说,认为 genkernel 可以为正在运行的硬件自动生成自定义的内核配置 是一种误解;genkernel 使用了支持大多数通用硬件的预定的内核配置文件,并且可以自动处理 make 命令来汇编和安装内核、相关模块以及 initramfs 文件。
二进制可再分发软件许可证组
如果已经预先安装了 linux-firmware 软件包,那么跳转到安装章节。
由于 sys-kernel/genkernel 软件包默认启用 firwmare
USE 标志,所以包管理器还会尝试拉取 sys-kernel/linux-firmware 软件包。安装 linux-firmware 之前,需要接受二进制可再分发软件许可证。
通过在 /etc/portage/make.conf 文件为 ACCEPT_LICENSE 变量添加 @BINARY-REDISTRIBUTABLE
值,可以接受系统范围任何软件包的许可证组。通过在 /etc/portage/package.license/linux-firmware 文件添加特定内容,可以单独接受 linux-firmware 软件包的许可证组。
如果有必要,查看手册安装基本系统里的接受软件许可证的方法章节,然后修改一些可接受的软件许可证。
如果分析不出来,可以这样做:
root #
mkdir /etc/portage/package.license
/etc/portage/package.license/linux-firmware
为 linux-firmware 软件包接受二进制可再分发许可证(binary redistributable)sys-kernel/linux-firmware @BINARY-REDISTRIBUTABLE
安装
说明完以及准备好之后,安装 sys-kernel/genkernel 软件包:
root #
emerge --ask sys-kernel/genkernel
常规
运行genkernel all来编译内核源码。值得注意的是,使用 genkernel 编译的内核适用于不同计算机体系结构的各种硬件,这可能使编译过程需要一阵子来完成。
如果 root 分区/卷 不是使用 ext4 作为文件系统,它可能需要使用 genkernel --menuconfig all 来手动配置内核,并在内核中添加对这个具体文件系统的支持(比如:不是作为一个模块)。LVM2用户可能要作为参数来添加
--lvm
。LVM2 用户应该在下面 genkernel命令添加
--lvm
参数 。root #
genkernel --mountboot --install all
genkernel 完成后,将在 /boot 目录生成并安装内核和初始化内存文件(initial ram filesystem,initramfs)。/lib/modules 目录将安装相关模块。initramfs 将在内核加载后立即启动,然后进行硬件自动检测(就像在 live 磁盘镜像环境中一样)。
root #
ls /boot/vmlinu* /boot/initramfs*
root #
ls /lib/modules
可选:手动配置
介绍
手动配置内核经常被 Linux 用户认为是最困难的步骤。但是事实并非如此──当您手动配置几次内核之后,你就不会再觉得它有多么难了!
无论如何,有一件事是真实的:当手动配置内核时,了解(硬件)系统是至关重要的。大多数信息可以通过安装包含lspci命令的sys-apps/pciutils来收集:
root #
emerge --ask sys-apps/pciutils
在chroot中,可以安全的忽略任何lspci可能抛出的关于pcilib的警告(比如pcilib: cannot open /sys/bus/pci/devices)。
另一个系统信息来源是运行lsmod来查看安装CD使用什么内核模块,它可能对启用什么提供了一个好的暗示。
现在进入内核源码目录并执行make menuconfig。这将启动一个菜单驱动的配置屏幕。
root #
cd /usr/src/linux
root #
make menuconfig
Linux 内核配置有很多很多的章节。我们先列出一些必须激活的选项(否则 Gentoo 将无法工作,或者离开附加的调整将无法正常工作)。我们同时在 Gentoo 维基上有一个 Gentoo 内核配置指南可能会在将来有帮助。
启用必要的选项
当使用 sys-kernel/gentoo-sources 时,强烈推荐启用 Gentoo 特有的配置选项。这些确保了系统可以正常运行所需的最少内核特性:
Gentoo Linux --->
Generic Driver Options --->
[*] Gentoo Linux support
[*] Linux dynamic and persistent device naming (userspace devfs) support
[*] Select options required by Portage features
Support for init systems, system and service managers --->
[*] OpenRC, runit and other script based systems and managers
[*] systemd
当然,最后两行的选择取决于所选择的 init 系统 (OpenRC 对比 systemd)。但是两种 init 系统都启用也并没有害处。
当使用 sys-kernel/vanilla-sources时,不能使用额外的 init 系统。可以使用已启用的 init 系统,但这超出了手册的范围。
启用典型的系统组件支持
确保引导系统的每一个至关重要的驱动(比如 SATA 控制器,NVMe 块设备支持,文件系统支持,等等)是编译进内核而不是作为一个模块,否则系统将无法完全引导。
接下来选择最正确的CPU类型。同时建议启用MCE功能(如果可用)能在硬件出现问题时通知用户。在一些架构(比如x86_64),这些错误不会打印到 dmesg,但是会到/dev/mcelog。这需要app-admin/mcelog包。
同时选择Maintain a devtmpfs file system to mount at /dev来让重要的设备文件在引导过程的早期就已就绪(CONFIG_DEVTMPFS and CONFIG_DEVTMPFS_MOUNT):
Device Drivers --->
Generic Driver Options --->
[*] Maintain a devtmpfs filesystem to mount at /dev
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
验证 SCSI 磁盘支持是否已激活(CONFIG_BLK_DEV_SD):
Device Drivers --->
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
Device Drivers --->
<*> Serial ATA and Parallel ATA drivers (libata) --->
[*] ATA ACPI Support
[*] SATA Port Multiplier support
<*> AHCI SATA support (ahci)
[*] ATA BMDMA support
[*] ATA SFF support (for legacy IDE and PATA)
<*> Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support (ata_piix)
验证已经启用基础 NVMe 支持:
Device Drivers --->
<*> NVM Express block device
Device Drivers --->
NVME Support --->
<*> NVM Express block device
也可以启用下列额外的 NVMe 支持:
[*] NVMe multipath support
[*] NVMe hardware monitoring
<M> NVM Express over Fabrics FC host driver
<M> NVM Express over Fabrics TCP host driver
<M> NVMe Target support
[*] NVMe Target Passthrough support
<M> NVMe loopback device support
<M> NVMe over Fabrics FC target driver
< > NVMe over Fabrics FC Transport Loopback Test driver (NEW)
<M> NVMe over Fabrics TCP target support
现在进入File Systems并选择系统将使用的文件系统。不要作为模块来编译根文件系统所使用的文件系统,否则系统可能不挂载这个分区。同时选择Virtual memory和/proc file system根据系统的需要选择一个或多个以下选项:
File systems --->
<*> Second extended fs support
<*> The Extended 3 (ext3) filesystem
<*> The Extended 4 (ext4) filesystem
<*> Btrfs filesystem support
<*> XFS filesystem support
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
<*> VFAT (Windows-95) fs support
Pseudo Filesystems --->
[*] /proc file system support
[*] Tmpfs virtual memory file system support (former shm fs)
如果使用PPPoE连接到互联网,或者是拨号调制解调器,则启用下面的选项(CONFIG_PPP, CONFIG_PPP_ASYNC, and CONFIG_PPP_SYNC_TTY):
Device Drivers --->
Network device support --->
<*> PPP (point-to-point protocol) support
<*> PPP support for async serial ports
<*> PPP support for sync tty ports
这两个压缩选项将是无害的,但是它们一定是不需要的,包括基于以太网的PPP选项也是一样,只有在配置内核模式PPPoE时才会需要。
不要忘记在内核中包括网(以太网或无线)卡。
大多数系统会有多核心处理,所以激活 Symmetric multi-processing support(对称多处理) 很重要 (CONFIG_SMP):
Processor type and features --->
[*] Symmetric multi-processing support
在多核系统中,每个核心视为一个处理器。
如果使用USB输入设备(比如键盘和鼠标)或其他USB设备,不要忘记启用那些:
HID support --->
-*- HID bus support
<*> Generic HID driver
[*] Battery level reporting for HID devices
USB HID support --->
<*> USB HID transport layer
[*] USB support --->
<*> xHCI HCD (USB 3.0) support
<*> EHCI HCD (USB 2.0) support
<*> OHCI HCD (USB 1.1) support
For x86 architectures, verify the 64-bit kernel option is unset/deactivated (CONFIG_64BIT=N), and then select the processor family as appropriate for the system's processor(s).
The processor family can be determined by reviewing output from the following two commands:
user $
cat /proc/cpuinfo | grep -i vendor | uniq
user $
cat /proc/cpuinfo | grep -i 'model name' | uniq
[ ] 64-bit kernel
Processor type and features --->
Processor family (Core 2/newer Xeon) --->
( ) 486
( ) 586/K5/5x86/6x86/6x86MX
( ) Pentium-Classic
( ) Pentium-MMX
( ) Pentium-Pro
( ) Pentium-II/Celeron(pre-Coppermine)
( ) Pentium-III/Celeron(Coppermine)/Pentium-III Xeon
( ) Pentium M
( ) Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon
( ) K6/K6-II/K6-III
( ) Athlon/Duron/K7
( ) Opteron/Athlon64/Hammer/K8
( ) Crusoe
( ) Efficeon
( ) Winchip-C6
( ) Winchip-2/Winchip-2A/Winchip-3
( ) AMD Elan
( ) GeodeGX1
( ) Geode GX/LX
( ) CyrixIII/VIA-C3
( ) VIA C3-2 (Nehemiah)
( ) VIA C7
(*) Core 2/newer Xeon
( ) Intel Atom
Compiling and installing
With the configuration now done, it is time to compile and install the kernel. Exit the configuration and start the compilation process:
root #
make && make modules_install
It is possible to enable parallel builds using make -jX with
X
being an integer number of parallel tasks that the build process is allowed to launch. This is similar to the instructions about /etc/portage/make.conf earlier, with the MAKEOPTS variable.When the kernel has finished compiling, copy the kernel image to /boot/. This is handled by the make install command:
root #
make install
This will copy the kernel image into /boot/ together with the System.map file and the kernel configuration file.
可选:生成 initramfs
在某些情况中需要建立一个 initramfs──基于内存的初始化文件系统(initial ram-based file system)。最常见的原因是当重要的文件系统位置(如 /usr/ 或 /var/ )在分离的分区时。通过initramfs,可以使用 initramfs 里面的工具来挂载这些分区。
如果没有 initramfs,会存在着系统将无法正常启动的风险,因为这是负责安装的文件系统工具需要驻留在未挂载文件系统的信息。initramfs 中的一个将在必要的文件拉进它的内核启动之后使用的档案,但控制被移交前转移到初始化工具。在 initramfs 的脚本,然后将确保分区正确地安装在系统继续启动之前。
如果要使用 genkernel,应该在编译内核和 initramfs 时都使用。当只在生成 initramfs 时使用 genkernel,关键要将
--kernel-config=/path/to/kernel.config
传递给 genkernel,否则生成的 initramfs 可能在手动构建的内核中无法工作 。请注意,手动构建内核超出了手册的支持范围。更多信息参考内核配置文章。要安装 initramfs,首先安装sys-kernel/dracut,然后用它生成 initramfs:
root #
emerge --ask sys-kernel/dracut
root #
dracut --kver=5.15.52-gentoo
initramfs将存储在/boot/。结果文件可以简单的通过列出以initramfs开头的文件来找到:
root #
ls /boot/initramfs*
现在继续到内核模块。
内核模块
列出可用的内核模块
硬件模块手动列出是可选的。在大多数情况下,udev 通常将加载所有被检测为已连接的硬件模块。然而,列出自动检测到的模块并没有什么不良影响的。有时,一些奇特硬件需要帮助来加载其驱动程序。
可以在 /etc/modules-load.d/*.conf 文件中添加需要在每次启动时加载的模块,格式为每行一个模块。如果模块需要附加选项,可以在 /etc/modprobe.d/*.conf 文件内设置。
对于特定的内核版本,如果要查看所有可用模块,使用下面的 find 命令。不要忘记在查找时替换 “<kernel version>” 为对应的内核版本:
root #
find /lib/modules/<kernel version>/ -type f -iname '*.o' -or -iname '*.ko' | less
强制加载特定内核模块
要强制加载内核 3c59x.ko 模块(3Com 网卡家族的特定驱动),编辑/etc/modules-load.d/network.conf 文件并在里面输入模块名字。
root #
mkdir -p /etc/modules-load.d
root #
nano -w /etc/modules-load.d/network.conf
注意,模块的 .ko 文件后缀对加载机制影响不大,所以配置文件中没有文件后缀:
/etc/modules-load.d/network.conf
强制加载 3c59x 模块3c59x
继续到配置系统来安装。