使用默认配置编译内核

Aqu*_*irl 8 linux compiling kernel

假设:

  • 该平台:
    anisha@linux-dopx:~/> uname -a
    Linux linux-dopx 2.6.34-12-desktop #1 SMP PREEMPT 2010-06-29 02:39:08 +0200 x86_64 x86_64 x86_64 GNU/Linux

  • 下载的内核是来自 kernel.org 的最新稳定内核。

  • 我们让make menuconfig.
  • 只需输入makemake installgrub-update,并重新启动。

现在,根据这些假设,我们是否仍然需要对文件进行一些额外的更改或编译一些额外的驱动程序以确保无错误重启?

如果是,那么这些变化取决于什么?

编辑 1:

anisha@linux-dopx:/> sudo /sbin/lspci -n
00:00.0 0600: 8086:29c0 (rev 10)
00:02.0 0300: 8086:29c2 (rev 10)
00:1b.0 0403: 8086:27d8 (rev 01)
00:1c.0 0604: 8086:27d0 (rev 01)
00:1c.1 0604: 8086:27d2 (rev 01)
00:1d.0 0c03: 8086:27c8 (rev 01)
00:1d.1 0c03: 8086:27c9 (rev 01)
00:1d.2 0c03: 8086:27ca (rev 01)
00:1d.3 0c03: 8086:27cb (rev 01)
00:1d.7 0c03: 8086:27cc (rev 01)
00:1e.0 0604: 8086:244e (rev e1)
00:1f.0 0601: 8086:27b8 (rev 01)
00:1f.1 0101: 8086:27df (rev 01)
00:1f.2 0101: 8086:27c0 (rev 01)
00:1f.3 0c05: 8086:27da (rev 01)
01:00.0 0200: 10ec:8136 (rev 01)
Run Code Online (Sandbox Code Playgroud)

Lai*_*han 8

不推荐只是一个裸的make menuconfig。所需的配置取决于三件事:

  • 正在使用的硬件
  • 操作系统/发行版使用的功能
  • 您使用的功能(文件系统、raid 等)

所以我认为推荐的“默认”配置是:

cd your_kernel_src
cp /boot/your-distribution-config .config
make localmodconfig
make menuconfig
Run Code Online (Sandbox Code Playgroud)

另请参阅发行版的内核配置。第一段:

配置内核曾经是一个相当简单的过程,只需要知道需要支持哪些硬件。随着时间的推移,事情总体上变得更加复杂,但是发行版已经添加了对特定内核功能的自己的一组依赖项——这些依赖项对于普通用户来说可能很难弄清楚。这导致 Linus Torvalds 提出了一个 RFC 提案,以添加特定于发行版的内核配置选项。


Cir*_*郝海东 6

真正的硬件/发行版可能无法使用 defconfig 正常工作

正如在这个答案中提到的,发行版或硬件供应商没有提供的任何东西很可能会以微妙或不太微妙的方式失败,例如:

  • 您可能不会为某些基本硬件构建驱动程序支持
  • 发行版的软件包可能依赖于您未构建并失败的内核功能

此外,除了特定的配置之外,供应商在 vanilla 内核之上应用大型补丁集是正常的,例如,即使 Ubuntu 也会这样做。

特别是对于 Ubuntu / Debian,我已经描述了如何从源代码编译支持的内核:https : //askubuntu.com/questions/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171# 1081171在这种情况下,修改稳定的内核库是最明智的做法。

QEMU 与 defconfig 配合使用

defconfig不过,有一件事做得很好,它在 QEMU 上启动,在内核 v4.20、QEMU 2.12 上测试。

这是一个带有 Buildroot 的全自动示例

如该链接所述,您需要以下选项才能从磁盘启动:

CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BLK=y
Run Code Online (Sandbox Code Playgroud)

尽管 initrd 不需要它们。

为了交叉编译到不同的架构,例如 aarch64,你需要:

make ARCH=arm64 defconfig
Run Code Online (Sandbox Code Playgroud)

但是正如这里所解释的,虽然 arm64 确实在 QEMU 上启动,但它会生成一个超级臃肿的内核,并且您可能希望推出一些更小的东西,例如这里所描述的

究竟是make defconfig做什么的?

我们可以很容易地看到哪个配置文件与详细构建一起使用:

make V=1 defconfig
Run Code Online (Sandbox Code Playgroud)

在 v4.19 上输出:

make -f ./scripts/Makefile.build obj=scripts/basic
rm -f .tmp_quiet_recordmcount
make -f ./scripts/Makefile.build obj=scripts/kconfig defconfig
scripts/kconfig/conf  --defconfig=arch/x86/configs/x86_64_defconfig Kconfig
Run Code Online (Sandbox Code Playgroud)

从中我们得出结论,使用的文件必须是arch/x86/configs/x86_64_defconfig

另见:https : //stackoverflow.com/questions/41885015/what-exactly-does-linux-kernels-make-defconfig-do

make help还显示了其他有趣的默认相关目标,例如alldefconfigsavedefconfig可能有用。