type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
从很早之前就接触过 Linux ,一直都被 Linux 的稳定性和条理性深深地吸引者,最近也是萌生出了要不试一试 Linux 内核源码学习、尝试进行一下 Linux 内核开发。
与其它程序开发一样,开始的第一步就是对应的开发环境的配置,对应于 Linux 内核这个庞然大物,敢于直接对他出手的人也不多,原来想在 B 站上招一些相关的视频教学课程,可以没想到诺大一个 B 站,这方面相关的资料居然少得可怜。后面我自己经过搜索也是总结了一些资料,在这里也是分享一下。

0 资料分享

1 系统环境配置

okay!在经过对上面的一些资料的学习以及查看之后,我也是找到了一定的学习思路:即对于 Linux 这么一个庞大的系统来说,如果你想一口吃个大胖子基本上是不可能的,只能说就是先找一个子系统,然后通过对子系统的学习来进行入门。

1.1 参考资料

不过上面的都是后话了,我们当前最紧急的任务还是配置 Linux 内核开发环境。我的开发环境配置是参考下面的这些资料进行配置的。在这过程中也是遇到了挺多问题的。

1.2 基础 Linux 编译环境(Arch)

  • Arch Linux(使用这个发行版的原因是因为我尝试在 Ubuntu 22.04(官方推荐的是 18.04) 上进行内核编译,但是一直没有办法编译通过,不知道是不是因为发行版太信的缘故。
  • bootloader:grub
💡
注意!下面的所有配置都是基于 Arch Linux 的!Ubuntu 上没有测试过,不过应该也有一定的参考价值。

1.3 系统硬盘分区配置(重要!)

💡
因为指导文档上没有给出对应的要求与指示,所以一开始也是遇到了一些令人哭笑不得的事情。在这里给大家记录一下,给大家避个坑。
挂载点
大小
/boot
2G+
swap (分区、或者交换文件)
一定要有,大小可以控制在4G+
/
60G+(尽可能大吧,毕竟占用也是自动分配的)

1.3 安装所需的包

2 开发环境配置

2.1 设置您的 Linux 内核代码存储库

  • 创建代码存储文件夹
  • 克隆内核源码(此处耗时非常长,请做好心理准备,同时也可能需要自备过墙梯)
  • 进入源码目录、为内核编译做好准备

2.2 设置你的内核配置

许多内核驱动程序可以打开或关闭,或构建为模块。内核源目录中的 .config 文件决定构建哪些驱动程序。下载源代码树时,它不附带 .config 文件。关于生成 .config 文件,您有多种选择。最简单的是复制您当前的配置。

2.2.1 复制当前配置

如果你想看看一个错误是否被修复,你可能想在你运行的内核上复制配置。
  • For ArchLinux/Manjaro,
For Ubuntu
在 Ubuntu 上该配置文件存储在 /boot/ 中的某处。可能有多个以 config 开头的文件,因此您需要与正在运行的内核相关联的文件。您可以通过运行 uname -a 并找到以您的内核版本号结尾的配置文件来找到它。将该文件作为 .config 复制到源目录中。或者对于 Ubuntu,只需运行此命令:
 
💡
不要忘记在新的 .config 中重命名您的内核版本 “CONFIG_LOCALVERSION” 。如果你跳过这个,就会有错误地覆盖你现有内核之一的风险。

2.2.2 修改你的配置

因为可能最新的内核源码与你现在系统运行的内核版本不同,比如更新了什么功能,添加了什么配置。如果不需要对配置进行任何更改,下面的命令将以静默方式将任何新配置值更新为默认值:
  • 如果需要进行更改,可以运行:(这需要安装 ncurses 库。)
  • 如果你想编译得更快,你可以从配置中删除你系统中目前不使用的所有模块:
💡
警告:这可能不会在构建内核时将某些必需的模块编译到您的系统中。

3 编译内核

运行 make 或者 make -jX。开始内核编译操作。
💡
其中 X 是 2 或 4 之类的数字。如果您有双核,2 或 3 可能不错。四核,4 或 6。除非你想让你的机器非常慢,否则不要运行非常大的数字!
💡
注意:当您使用从与您构建的内核不同的内核复制的 .config 文件运行 make 时,系统可能会提示您选择启用哪些新内核功能。如有疑问,请选择默认选项。你可以通过点击回车来做到这一点。简单地选择所有默认值的一种更快的方法是运行 make menuconfig。这将为未设置的功能设置默认值。退出时不要忘记保存。

4 安装内核(Arch Linux)

对于 ArchLinux/Manjaro,你需要做一些这里提到的事情。确保在完成所有步骤后你拥有下面提到的所有文件。
  1. 内核:vmlinuz-你的内核名称
  1. initramfs:initramfs-你的内核名称.img
  1. 系统映射:System.map-你的内核名称
  1. 系统映射内核符号链接

4.1 安装模块

  • 一旦内核被编译,它的模块就必须随之而来。首先构建模块:
然后安装模块。作为 root 或具有 root 权限,运行以下命令来执行此操作:
💡
这会将已编译的模块复制到 /lib/modules/A.B.C/。这使单独使用的内核的模块保持分离。

4.2 拷贝内核到 /boot 目录

💡
注意:确保 bzImage 内核文件已从适合您的系统架构的目录中复制。见下文。
此文件必须复制到 /boot 目录并在此过程中重命名。名称将以 vmlinuz- 为前缀,您可以随意命名内核。在下面的示例中,已安装和编译的 A.B.C 内核已被复制并重命名为 vmlinuz-linuxAB

4.3 制作 initial RAM disk

4.3.1 自动预设方式

可以复制和修改现有的 mkinitcpio 预设,以便可以按照与官方内核相同的方式生成自定义内核 initramfs 映像。这在打算重新编译内核(例如更新的地方)时很有用。在下面的示例中,将为上面安装的内核 A.B.C 复制和修改现有 Arch 内核的预设文件。
  • 首先,复制现有的预设文件,重命名它以匹配在复制 bzImage 时指定为 /boot/vmlinuz- 后缀的自定义内核的名称:
  • 其次,编辑文件并针对自定义内核进行修改。 (再次)注意 ALL_kver= 参数也匹配复制 bzImage 时指定的自定义内核的名称:
  • 最后,按照与官方内核相同的方式为自定义内核生成 initramfs 映像:

4.3.2 手动方式

除了使用预设文件,还可以使用 mkinitcpio 手动生成 initramfs 文件。命令的语法是:
  • -k (--kernel kernel_version):指定生成 initramfs 映像时要使用的模块。 kernel_version 名称将与它的模块目录名称相同,位于 /usr/lib/modules/(或者,可以使用内核映像的路径)。
  • -g (--generate file_name):指定要在 /boot 目录中生成的 initramfs 文件的名称。同样,建议使用上述命名约定。
例如,上面安装的 A.B.C 自定义内核的命令是:

4.4 Copy System.map

引导 Linux 不需要 System.map 文件。它是特定内核构建中的一种“电话目录”功能列表。 System.map 包含内核符号列表(即函数名、变量名等)及其对应的地址。此“符号名称到地址映射”用于:
  • 一些进程,如 klogd、ksymoops 等。
  • 在内核崩溃期间必须将信息转储到屏幕上时由 OOPS 处理程序(即信息,例如它在哪个函数中崩溃了)。
💡
提示:EFI 系统分区使用 FAT32 格式化,不支持符号链接。
如果您的 /boot 位于支持符号链接(即非 FAT32)的文件系统上,请将 System.map 复制到 /boot,将您的内核名称附加到目标文件。然后从 /boot/System.map 创建一个指向 /boot/System.map-linuxAB 的符号链接:
完成上述所有步骤后,您的 /boot 目录中应该有以下 3 个文件和 1 个软符号链接以及任何其他先前存在的文件:
  • Kernel: vmlinuz-linuxAB
  • Initramfs: initramfs-linuxAB.img
  • System Map: System.map-linuxAB
  • System Map kernel symlink: System.map (which symlinks to System.map-linuxAB)
💡
提示:内核源代码包括一个脚本来自动执行 LILO 的过程:如果您使用其他引导加载程序,可以安全地忽略它。

4.5 更新 grub 配置文件

5 安装内核(Ubuntu)

4.1 编译安装模块

  • 一旦内核被编译,它的模块就必须随之而来。首先构建模块:
然后安装模块。作为 root 或具有 root 权限,运行以下命令来执行此操作:
💡
这会将已编译的模块复制到 /lib/modules/A.B.C/。这使单独使用的内核的模块保持分离。

5.2 编译安装内核映像

  • 编译
  • 安装内核,内核映像会自动构建

6 Optional tools

6.1 gitk

gitk 是一个图形化的 git 仓库浏览器。您可以使用它来查看存储库的状态以及您在上游之上所做的提交。在 ArchLinux 上,它与 git 包一起安装,因此您可以随时使用。 Ubuntu 用户可能需要安装它:

6.2 Make ctags

ctags 解析源代码并生成一种索引,将重要实体(例如函数、类、变量)的名称映射到定义该实体的位置。该索引被 vi 和 emacsen 等编辑器使用,以允许移动到用户指定实体的定义。 Exuberant Ctags 支持所有可能的 C 语言结构和多种其他语言。
您已经在第一步中将它与其他软件包一起安装了。
git/kernels/staging/ 目录中,运行
这将为源代码制作 ctags。当您从基本目录 (git/kernels/staging/) 开始在 vim 中编辑代码时,您可以使用 CTRL+] 来查找函数的定义。有关详细信息,请参阅 vim 提示 wiki 中的 ctags 条目

6 参考资料

[Email] mutt + msmtp + GmailLinux 内核编译错误(make: *** [Makefile:1161: vmlinux] Error 137)