手册:片段/安装/配置Linux内核
Parts Handbook |
---|
安装 |
关于安装 |
选择安装媒介 |
配置网络 |
准备磁盘 |
安装stage3 |
安装基本系统 |
配置Linux内核 |
配置系统 |
安装系统工具 |
配置系统引导程序Bootloader |
收尾安装工作 |
使用Gentoo |
Portage介绍 |
USE标记 |
Portage功能特性 |
初始化脚本(Initscript)系统 |
环境变量 |
使用Portage |
文件和目录 |
变量 |
混合使用不同的软件分支 |
额外的工具 |
定制Portage树 |
高级特性 |
网络配置 |
入门 |
高级配置 |
模块化网络 |
无线 |
添加功能 |
动态管理 |
可选:安装固件和微代码
在开始配置内核部分之前,最好了解下,一些设备需要先在系统上安装附加的固件才能正常运行。我们经常网络接口上会使用附加的固件,特别是无线网络接口,常用于台式电脑和笔记本电脑。此外,来自 AMD,Nvidia 和 Intel 等供应商的现代视频芯片,要想使用完整的功能,通常也需要外部固件文件。现代硬件的大多数固件都在 sys-kernel/linux-firmware 软件包中。使用这些供应商显卡的系统上,最好 emerge 这个固件包,以便在配置和编译内核之前使用。
root #
emerge --ask sys-kernel/linux-firmware
除了独立显卡硬件和网络接口之外,CPU 可能也需要固件更新。通常这种固件被称为微码。有时需要更新版本的微码来修补 CPU 硬件中的不稳定性、安全问题或其他错误。
AMD CPU 的微码更新通常与前面提到的 linux-firmware 软件包一起分发。Intel CPU 的微码可以在 sys-firmware/intel-microcode 包中找到,需要单独安装。更多如何更新微码的细节,请查看微码文章。
内核配置和编译
现在是时候来配置和编译内核源代码了。有三种方法:
- 手动配置并生成内核。
- 一个叫作genkernel的工具用来自动化生成并安装Linux内核。
- Distribution Kernel 项目用于像其它软件包一样自动构建并且安装 Linux 内核。
默认选项是手动配置,它是最好的优化环境方式。
Linux内核是所有发行版的核心。它位于用户程序和系统硬件之间。Gentoo提供给用户一些可选的内核源码。完整的带描述的列表在内核概述页面。
安装源码
当为 amd64 系统手动安装和编译内核时,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-4.9.16-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-4.9.16-gentoo
手动配置
介绍
手动配置内核经常被 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 系统,但这超出了手册的范围。
确保引导系统的每一个至关重要的驱动(比如SCSI控制器,等等)是编译进内核而不是作为一个模块,否则系统将无法完全引导。
接下来选择最正确的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 disk support
现在进入File Systems并选择系统将使用的文件系统。不要作为模块来编译根文件系统所使用的文件系统,否则系统可能不挂载这个分区。同时选择Virtual memory和/proc file system根据系统的需要选择一个或多个以下选项(CONFIG_EXT2_FS, CONFIG_EXT3_FS, CONFIG_EXT4_FS, CONFIG_MSDOS_FS, CONFIG_VFAT_FS, CONFIG_PROC_FS, and CONFIG_TMPFS):
File systems ---> <*> Second extended fs support <*> The Extended 3 (ext3) filesystem <*> The Extended 4 (ext4) filesystem <*> Reiserfs support <*> JFS filesystem support <*> XFS filesystem support <*> Btrfs 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设备,不要忘记启用那些(CONFIG_HID_GENERIC and CONFIG_USB_HID, CONFIG_USB_SUPPORT, CONFIG_USB_XHCI_HCD, CONFIG_USB_EHCI_HCD, CONFIG_USB_OHCI_HCD)::
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
Architecture specific kernel configurations
Placeholder for architecture-specific kernel build information
Compiling and installing
Placeholder for instructions for building and installing the kernel sources
可选:生成一个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=4.9.16-gentoo
initramfs将存储在/boot/。结果文件可以简单的通过列出以initramfs开头的文件来找到:
root #
ls /boot/initramfs*
现在继续到内核模块。
备选:使用genkernel
如果手动配置看起来太恐怖,可以考虑使用 genkernel。它将自动配置并编译内核。
genkernel配置内核的工作原理几乎和安装CD配置的内核完全一致。也就是说当使用genkernel建立内核,系统通常将在引导时检测它所支持硬件,就像安装CD所做的。genkernel对于那些不能轻松的编译他们自动内核的用户来说是一个也许有用的解决方案。请注意,genkernel 不会在它运行的硬件上自动生成一个自定义的内核配置。
现在,我们来看看如何使用genkernel。首先emerge sys-kernel/genkernel这个ebuild:
root #
emerge --ask sys-kernel/genkernel
接下来,编辑/etc/fstab文件来使包含有第二个值为/boot/的那条的第一个值指向到正确的设备。如果是按照本手册的分区示例,则这个设备非常像使用 ext4 文件系统的。这将使文件中的这一条目看起来像是:
root #
nano -w /etc/fstab
/etc/fstab
配置 /boot 挂载点/boot ext4 defaults 0 2
在Gentoo将来的安装中,还要再配置一次/etc/fstab。现在只需要正确设置/boot来让genkernel应用程序读到相应的配置。
现在,运行genkernel all来编译内核源码。值得注意的是,使用genkernel编译一个内核将支持几乎全部的硬件,这将使编译过程需要一阵子来完成!
如果 root 分区/卷 不是使用 ext4 作为文件系统,它可能需要使用 genkernel --menuconfig all 来手动配置内核,并在内核中添加对这个具体文件系统的支持(比如:不是作为一个模块)。LVM2用户可能要作为参数来添加
--lvm
。root #
genkernel all
一旦genkernel完成,将创建一个内核、全部的模块和初始化内存文件(initramfs)。我们将在文档后面配置引导器的时候使用这个内核和initrd。记下内核和initrd名字作为编辑引导器配置文件的信息。initrd将在后执行硬件检测之后、“真实”系统启动之前立即启动。
root #
ls /boot/vmlinu* /boot/initramfs*
可选: 使用 distribution 内核
Distribution 内核是涵盖了解包、配置、编译和安装内核完整过程的 ebuild。这种方法的主要优点是,内核可以作为 @world 的一部分来升级到新版本,而无需手动操作。Distribution 内核默认支持大多数硬件,但是它们也可以通过 /etc/portage/savedconfig 自定义。
有一些其它的方法可以定制内核配置例如配置片段。
安装正确的 installkernel
在使用 distribution 内核前, 请验证系统已经安装的正确的 installkernel 软件包 。当使用 systemd-boot(以前是 gummiboot),请安装:
root #
emerge --ask sys-kernel/installkernel-systemd-boot
当使用传统的 /boot 布局(例如 GRUB、LILO 等。), 应该已经默认安装了 gentoo 变量。如果有疑问:
root #
emerge --ask sys-kernel/installkernel-gentoo
安装一个 distribution kernel
如果用 Gentoo 补丁从源码构建一个内核 ,输入:
root #
emerge --ask sys-kernel/gentoo-kernel
想要避免编译本地内核源代码的系统管理员可以使用预编译的内核镜像:
root #
emerge --ask sys-kernel/gentoo-kernel-bin
更新和清理
内核安装后,包管理器将自动更新到新版本。包管理器清理旧的软件包之前,将保留以前的版本。请记住定期运行:
root #
emerge --depclean
为了节省空间。可以选择清理旧的内核版本
root #
emerge --prune sys-kernel/gentoo-kernel sys-kernel/gentoo-kernel-bin
安装后/更新任务
Distribution kernels are now capable of rebuilding kernel modules installed by other packages. linux-mod.eclass
provides USE=dist-kernel
which controls a subslot dependency on virtual/dist-kernel.
启用像 sys-fs/zfs 和 sys-fs/zfs-kmod 这样的软件包,将允许它们在合适的情况下,自动根据新的内核进行重新编译,并相应地重新生成 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
内核模块
配置模块
硬件模块手动列出是可选的。在大多数情况下,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文件并在里面输入模块名字。实际的文件名对 loader 来说无关紧要。
root #
mkdir -p /etc/modules-load.d
root #
nano -w /etc/modules-load.d/network.conf
/etc/modules-load.d/network.conf
Force loading 3c59x module3c59x
继续到配置系统来安装。