Linux 内核版本 6.x <https://linuxkernel.org.cn/>

这些是 Linux 版本 6 的发行说明。请仔细阅读它们,因为它们会告诉您这是关于什么的,解释如何安装内核,以及如果出现问题该怎么办。

什么是 Linux?

Linux 是 Unix 操作系统的克隆,由 Linus Torvalds 从头开始编写,并得到来自网络上一个松散的黑客团队的协助。它的目标是符合 POSIX 和 Single UNIX 规范。

它具有您期望在现代成熟的 Unix 中看到的所有功能,包括真正的多任务处理、虚拟内存、共享库、按需加载、共享写时复制可执行文件、适当的内存管理以及包括 IPv4 和 IPv6 的多栈网络。

它根据 GNU 通用公共许可证 v2 发布 - 有关更多详细信息,请参阅随附的 COPYING 文件。

它运行在什么硬件上?

尽管最初是为基于 32 位 x86 的 PC(386 或更高版本)开发的,但今天 Linux 也运行在(至少)Compaq Alpha AXP、Sun SPARC 和 UltraSPARC、Motorola 68000、PowerPC、PowerPC64、ARM、Hitachi SuperH、Cell、IBM S/390、MIPS、HP PA-RISC、Intel IA-64、DEC VAX、AMD x86-64 Xtensa 和 ARC 架构上。

只要它们具有分页内存管理单元 (PMMU) 和 GNU C 编译器 (gcc) 的端口(GNU 编译器集合,GCC 的一部分),Linux 就可以轻松移植到大多数通用 32 位或 64 位架构。Linux 也已被移植到许多没有 PMMU 的架构,尽管功能显然会受到一些限制。Linux 也已被移植到它自身。您现在可以将内核作为用户空间应用程序运行 - 这称为 UserMode Linux (UML)。

文档

  • 在互联网上和书籍中都有大量电子形式的文档,包括特定于 Linux 的文档和关于一般 UNIX 问题的文档。我建议您在任何 Linux FTP 站点上查找 LDP(Linux 文档项目)书籍的文档子目录。本自述文件并非旨在成为关于系统的文档:有更好的来源可用。

  • 在 Documentation/ 子目录中有各种自述文件:例如,这些文件通常包含某些驱动程序的内核特定安装说明。请阅读 Documentation/process/changes.rst 文件,因为它包含有关升级内核可能导致的问题的信息。

安装内核源码

  • 如果您安装完整的源代码,请将内核 tarball 放入您有权限的目录中(例如您的主目录)并解压缩它

    xz -cd linux-6.x.tar.xz | tar xvf -
    

    将 “X” 替换为最新内核的版本号。

    不要使用 /usr/src/linux 区域!该区域具有库头文件使用的(通常不完整的)内核头文件集。它们应该与库匹配,并且不会被当前内核所搞乱。

  • 您还可以通过打补丁在 6.x 版本之间升级。补丁以 xz 格式分发。要通过打补丁安装,请获取所有较新的补丁文件,进入内核源代码的顶层目录 (linux-6.x) 并执行

    xz -cd ../patch-6.x.xz | patch -p1
    

    对于所有大于当前源代码树的版本 “x” 的版本,**按顺序** 替换 “x”,您应该没问题。您可能需要删除备份文件(some-file-name~ 或 some-file-name.orig),并确保没有失败的补丁(some-file-name# 或 some-file-name.rej)。如果有,要么您要么我犯了错误。

    与 6.x 内核的补丁不同,6.x.y 内核的补丁(也称为 -stable 内核)不是增量的,而是直接应用于基本 6.x 内核。例如,如果您的基本内核是 6.0,并且您想应用 6.0.3 补丁,则不得首先应用 6.0.1 和 6.0.2 补丁。同样,如果您运行的是内核版本 6.0.2 并且想要跳到 6.0.3,则必须**在**应用 6.0.3 补丁**之前**先反转 6.0.2 补丁(即 patch -R)。您可以在 Documentation/process/applying-patches.rst 中阅读更多相关信息。

    或者,可以使用脚本 patch-kernel 来自动化此过程。它确定当前内核版本并应用找到的任何补丁

    linux/scripts/patch-kernel linux
    

    上面命令中的第一个参数是内核源代码的位置。补丁从当前目录应用,但可以指定备用目录作为第二个参数。

  • 确保您没有过时的 .o 文件和依赖项

    cd linux
    make mrproper
    

    您现在应该已正确安装了源代码。

软件需求

编译和运行 6.x 内核需要各种软件包的最新版本。请查阅 Documentation/process/changes.rst,了解所需的最低版本号以及如何获取这些软件包的更新。请注意,使用过旧的软件包版本可能会导致难以追踪的间接错误,因此不要假设您可以在构建或操作过程中出现明显问题时才更新软件包。

内核的构建目录

编译内核时,默认情况下,所有输出文件都将与内核源代码一起存储。使用选项 make O=output/dir 允许您为输出文件(包括 .config)指定备用位置。示例

kernel source code: /usr/src/linux-6.x
build directory:    /home/name/build/kernel

要配置和构建内核,请使用

cd /usr/src/linux-6.x
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install

请注意:如果使用 O=output/dir 选项,则必须将其用于所有 make 调用。

配置内核

即使您只升级一个小版本,也不要跳过此步骤。每个版本都会添加新的配置选项,如果配置文件未按预期设置,则会出现奇怪的问题。如果您想将现有配置移植到新版本,并且工作量最少,请使用 make oldconfig,它只会要求您回答新问题。

  • 替代的配置命令是

    "make config"      Plain text interface.
    
    "make menuconfig"  Text based color menus, radiolists & dialogs.
    
    "make nconfig"     Enhanced text based color menus.
    
    "make xconfig"     Qt based configuration tool.
    
    "make gconfig"     GTK+ based configuration tool.
    
    "make oldconfig"   Default all questions based on the contents of
                       your existing ./.config file and asking about
                       new config symbols.
    
    "make olddefconfig"
                       Like above, but sets new symbols to their default
                       values without prompting.
    
    "make defconfig"   Create a ./.config file by using the default
                       symbol values from either arch/$ARCH/defconfig
                       or arch/$ARCH/configs/${PLATFORM}_defconfig,
                       depending on the architecture.
    
    "make ${PLATFORM}_defconfig"
                       Create a ./.config file by using the default
                       symbol values from
                       arch/$ARCH/configs/${PLATFORM}_defconfig.
                       Use "make help" to get a list of all available
                       platforms of your architecture.
    
    "make allyesconfig"
                       Create a ./.config file by setting symbol
                       values to 'y' as much as possible.
    
    "make allmodconfig"
                       Create a ./.config file by setting symbol
                       values to 'm' as much as possible.
    
    "make allnoconfig" Create a ./.config file by setting symbol
                       values to 'n' as much as possible.
    
    "make randconfig"  Create a ./.config file by setting symbol
                       values to random values.
    
    "make localmodconfig" Create a config based on current config and
                          loaded modules (lsmod). Disables any module
                          option that is not needed for the loaded modules.
    
                          To create a localmodconfig for another machine,
                          store the lsmod of that machine into a file
                          and pass it in as a LSMOD parameter.
    
                          Also, you can preserve modules in certain folders
                          or kconfig files by specifying their paths in
                          parameter LMC_KEEP.
    
                  target$ lsmod > /tmp/mylsmod
                  target$ scp /tmp/mylsmod host:/tmp
    
                  host$ make LSMOD=/tmp/mylsmod \
                          LMC_KEEP="drivers/usb:drivers/gpu:fs" \
                          localmodconfig
    
                          The above also works when cross compiling.
    
    "make localyesconfig" Similar to localmodconfig, except it will convert
                          all module options to built in (=y) options. You can
                          also preserve modules by LMC_KEEP.
    
    "make kvm_guest.config"   Enable additional options for kvm guest kernel
                              support.
    
    "make xen.config"   Enable additional options for xen dom0 guest kernel
                        support.
    
    "make tinyconfig"  Configure the tiniest possible kernel.
    

    您可以在 配置目标和编辑器 中找到有关使用 Linux 内核配置工具的更多信息。

  • 关于 make config 的说明

    • 拥有不必要的驱动程序会使内核更大,并且在某些情况下会导致问题:探测不存在的控制器卡可能会混淆您的其他控制器。

    • 如果存在协处理器,则编译了数学仿真的内核仍将使用协处理器:在这种情况下,数学仿真将永远不会被使用。内核会稍微大一些,但无论它们是否有数学协处理器,都可以在不同的机器上工作。

    • “内核黑客” 配置细节通常会导致内核更大或更慢(或两者兼有),甚至可以通过配置一些例程来积极尝试破坏错误的代码以查找内核问题 (kmalloc()),从而使内核不稳定。因此,您应该对“开发”、“实验性”或“调试”功能的问题回答 ‘n’。

编译内核

  • 请确保您至少有 gcc 5.1 可用。更多信息,请参考 Documentation/process/changes.rst

  • 执行 make 来创建一个压缩的内核镜像。如果您安装了 lilo,或者您的发行版具有内核安装程序识别的安装脚本,也可以执行 make install。大多数流行的发行版都有一个可识别的安装脚本。您可能需要先检查您的发行版的设置。

    要进行实际安装,您必须是 root 用户,但正常的构建过程不应该需要 root 权限。不要滥用 root 权限。

  • 如果您将内核的任何部分配置为 modules,您还需要执行 make modules_install

  • 详细的内核编译/构建输出

    通常,内核构建系统以相当安静的模式运行(但不是完全静音)。但是,有时您或其他内核开发人员需要查看编译、链接或其他命令的实际执行情况。为此,请使用“verbose”构建模式。可以通过向 make 命令传递 V=1 来实现,例如:

    make V=1 all
    

    要让构建系统同时告知每个目标重建的原因,请使用 V=2。默认值为 V=0

  • 请保留一个备用内核,以防万一出现问题。对于开发版本尤其如此,因为每个新版本都包含未经调试的新代码。确保您也保留与该内核对应的模块的备份。如果您安装的新内核与您正在使用的内核的版本号相同,请在执行 make modules_install 之前备份您的模块目录。

    或者,在编译之前,使用内核配置选项“LOCALVERSION”在常规内核版本后附加一个唯一的后缀。可以在“General Setup”菜单中设置 LOCALVERSION。

  • 为了启动您的新内核,您需要将内核镜像(例如,编译后的 .../linux/arch/x86/boot/bzImage)复制到您的常规可启动内核所在的位置。

  • 在 BIOS(非 EFI 系统)中,不再支持直接从存储设备启动内核,而无需 LILO 或 GRUB 等引导加载程序的辅助。但是,在 UEFI/EFI 系统上,您可以使用 EFISTUB,它允许主板直接启动到内核。在现代工作站和台式机上,通常建议使用引导加载程序,因为多个内核和安全启动可能会出现困难。有关 EFISTUB 的更多详细信息,请参阅“The EFI Boot Stub”。

  • 需要注意的是,自 2016 年以来,LILO(LInux LOader)不再处于活跃开发状态,尽管它曾经非常流行,但经常出现在文档中。流行的替代方案包括 GRUB2、rEFInd、Syslinux、systemd-boot 或 EFISTUB。由于各种原因,不建议使用不再处于活跃开发状态的软件。

  • 您的发行版很可能包含一个安装脚本,运行 make install 即可完成所有操作。如果情况并非如此,您将需要确定您的引导加载程序并参考其文档或配置您的 EFI。

旧版 LILO 说明

  • 如果您使用 LILO,内核镜像在文件 /etc/lilo.conf 中指定。内核镜像文件通常为 /vmlinuz、/boot/vmlinuz、/bzImage 或 /boot/bzImage。要使用新的内核,请保存旧镜像的副本,并将新镜像复制到旧镜像上。然后,您必须重新运行 LILO 以更新加载映射!如果您不这样做,您将无法启动新的内核镜像。

  • 重新安装 LILO 通常是运行 /sbin/lilo 的事。您可能希望编辑 /etc/lilo.conf,为您的旧内核镜像(例如,/vmlinux.old)指定一个条目,以防新内核无法工作。有关更多信息,请参阅 LILO 文档。

  • 重新安装 LILO 后,您应该一切就绪。关闭系统,重新启动,尽情享用吧!

  • 如果您需要更改内核镜像中的默认根设备、视频模式等,请在适当的地方使用引导加载程序的引导选项。无需重新编译内核来更改这些参数。

  • 使用新内核重新启动,尽情享用吧。

如果出现问题

如果您的某个问题似乎是由于内核错误引起的,请按照“报告问题”中的说明进行操作。

有关理解内核错误报告的提示,请参阅“错误搜寻”。有关使用 gdb 调试内核的更多信息,请参阅“通过 gdb 调试内核和模块”和“使用 kgdb、kdb 和内核调试器内部”。