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

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

什么是 Linux?

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

它具有您期望在现代成熟的 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)。

文档

  • Internet 上和书籍中都有大量电子形式的文档,包括 Linux 特定的文档和关于通用 UNIX 问题的文档。 我建议查看任何 Linux FTP 站点上的文档子目录,以获取 LDP(Linux 文档项目)书籍。 此 README 并非旨在作为系统文档:有更好的来源可用。

  • Documentation/ 子目录中有各种 README 文件:这些文件通常包含某些驱动程序的内核特定安装说明。 请阅读 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.2 补丁(即,patch -R)**在**应用 6.0.3 补丁之前。 您可以在 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/configs/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 8.1 可用。 有关更多信息,请参阅 Documentation/process/changes.rst

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

    要执行实际安装,您必须是 root 用户,但通常的构建不应需要这样做。 不要随便使用 root 的名称。

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

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

    通常,内核构建系统以相当安静的模式运行(但并非完全静默)。 但是,有时您或其他内核开发人员需要完全按照执行的方式查看编译、链接或其他命令。 为此,请使用“verbose”构建模式。 这是通过将 V=1 传递给 make 命令来完成的,例如

    make V=1 all
    

    要使构建系统也告诉您每个目标的重建原因,请使用 V=2。 默认为 V=0

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

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

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

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

  • 重要的是要注意,截至 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 和内核调试器内部结构”。