自定义内核

来自 Alpine Linux
此材料正在进行中...

在此通知移除之前,请勿遵循此处的说明。
(最后编辑由 Anthumchris 于 2024 年 12 月 11 日。)

构建自定义配置内核的这个过程假设你正在运行 Alpine Linux,并使用 abuild 和 aports。

但为什么?

你可能想要构建自定义内核以启用实验性硬件或功能或过时硬件,进一步减少臃肿,或根据硬件调整内核。

大多数 Alpine ARCH 的 lts 内核使用默认设置来平衡吞吐量,但牺牲了一些响应速度,以及对许多设备的支持。你可以为桌面使用、低延迟和响应速度调整内核。

你应该禁用模块以提高安全性。默认情况下,Alpine 会安装模块,但不会禁用大多数模块。禁用模块将减少 DMA 攻击,但不能完全消除它。如果你有更新的处理器并支持 VT-d,只要你

保留 CONFIG_INTEL_IOMMU_DEFAULT_ON=y 或传递 intel_iommu=on 作为内核参数,并禁用内核日志记录,以防止攻击者通过 dmesg 获取 DMAR 地址信息。[1] 同时删除对内核版本的引用,以防止计算 IOMMU 地址。[2]

为了提高启动过程的安全性,如果你有 TPM,你可以设置 CONFIG_INTEL_TXT=y (启用 Intel(R) 可信执行技术 (Intel(R) TXT)) (默认情况下,硬化内核中未启用),然后你需要 SINIT 模块 (仅由 Intel 提供)[3]、可能已编译的 TrustedGrub2[4]、trousers[5]、tboot[6]。这些软件包不在 aports 中,并且未知这些工具是否在 musl 上工作。不建议用于 Edge。此外,还需要触发器软件包来为内核和 mkinitfs 更新生成哈希值。

设置 Alpine 构建系统

首先,你需要按照 设置你的系统和账户以构建软件包 中的步骤进行操作。你还需要配置你的 /etc/apk/repositories,以便它们在本地搜索你的 apks。有关详细信息,请参阅 在本地测试软件包

设置账户和仓库后,将你的 shell 当前工作目录更改为你刚刚克隆的 aports

$ cd aports

使用 aports

我们将尝试使用现有的 lts 内核,仅调整 lts.ARCH.config 文件。

切换到正确的发布版本

你需要切换到与发布版本匹配的正确分支,以便内核能够正确地针对依赖项进行编译。

Alpine 版本 远程分支
Edge master
3.17.0 3.17-stable

以下是访问为该 Alpine 版本发布的 APKBUILD 所必需的,你将为此创建一个提交。

如果你在 3.17 上,执行

$ git checkout -b 3.17-stable origin/3.17-stable

如果你在 Edge 上,执行

$ git checkout master

创建你的配置

你可以使用 linux-lts,但你应该做的是通过执行以下操作创建一个本地分支

对于 Alpine Edge

$ git checkout -b my-custom-kernel

对于 Alpine 3.17

$ git checkout -b my-custom-kernel origin/3.17-stable

这样做,你在维护方面的工作量较少。你只需保持 master3.17-stable 同步[7][8],并合并任何冲突。

首先通过执行 git checkout my-custom-kernel 切换到分支。然后,你需要导航到 main/linux-lts 文件夹,你应该在那里看到一个 APKBUILD 和一些 config- 文件。完成编辑后,可以直接编辑 APKBUILD 并将 lts.ARCH.config 复制为 .configlinux-4.15 文件夹中。然后,你将把 .config 移回,覆盖由 make menuconfig 生成的 lts.ARCH.config (在下面的配置内核部分中讨论)。生成配置后,你需要执行 abuild checksum。然后,执行 git add APKBUILD lts.ARCH.config,其中 ARCH 是你使用的任何架构 (x86, x86_64, ...)。然后,你需要为你的系统架构执行 git commit APKBUILD config-NAME.ARCH -m "Enabled these options ...."。你这样做是为了让 git 将你的代码与 Alpine 的代码分开,以便你的更改在内核更新之间向前传递。

添加自定义补丁

自定义补丁应该添加到 sources=

添加 URL 后,你需要通过执行 abuild checksum 生成校验和。

由于自定义补丁可能以存档或不同的补丁级别分发,因此它们可能无法自动修补,你需要定义在 prepare() 中如何处理它们。

配置内核

首先尝试构建内核。为此,你执行 abuild -rK 以安装大多数依赖项。如果它抱怨缺少像 elfutils-dev 这样的依赖项,请使用 -rKd。然后,当它提示输入新发现的配置选项的值时,只需按 Enter 键,直到它开始编译内核。应该有两组,一组用于 -lts,另一组用于 -virt。在第二组之后,按 Ctrl+C 退出编译过程,以便你可以进一步自定义配置。然后你进入 src/linux-VER 并编辑配置文件。复制 .config 文件,覆盖 srcdir 中的 lts.ARCH.config

另一种方法是使用 build-NAME 文件夹中的内核配置菜单,但在执行此操作之前,你需要 sudo apk add ncurses-dev

完成在 build-NAME 文件夹中使用菜单 (通过执行 make menuconfig) 后,你想要删除 ncurses-dev。完成后,它将存储在 .config 中,你需要再次覆盖 lts.ARCH.config 文件。完成更新 config-NAME.ARCH 后,你需要执行 abuild checksum

内核配置中的选项通常是默认值。如果你的设备较旧,则默认情况下可能设置为 n。

原生目标和调优

架构 处理器类型 / CPU 选择 / 系统类型 代码生成 / 指令扩展 定时器频率 抢占模型 位宽
s390x IBM zEnterprise 114 和 196 IBM zBC12 和 zEC12 (-march=zEC12 -mtune=zEC12) 100 Hz 无强制抢占 (服务器) 64
ppc64le 服务器处理器 POWER8 (-mcpu=power8), AltiVec (-Wa,-maltivec to assembler or -maltivec -mabi=altivec), VSX 100 HZ 无强制抢占 (服务器) 64
ppc

512x/52xx/6xx/7xx/74xx/82xx/83xx/86xx

  • Apple PowerMac based machines
AltiVec (-Wa,-maltivec to assembler or -maltivec -mabi=altivec) on >=74xx 250 HZ 无强制抢占 (服务器) 32
x86_64 通用 x86-64 (-mtune=generic ; SIMD assembly modules enabled based on simple compile test and/or presence of CPU flag) 300 HZ 自愿内核抢占 (桌面) 64
x86 586/K5/5x86/6x86/6x86MX (-mtune=generic ; SIMD assembly modules enabled based on simple compile test and/or presence of CPU flag) 300 HZ 自愿内核抢占 (桌面) 32
armhf
  • 基于 ARMv7 的平台 (Cortex-A, PJ4, Scorpion, Krait)
  • Freescale i.MX family -- Cortex A (i.MX51, i.MX53, i.MX6 Quad/DualLite, i.MX6 SoloLite, i.MX6 SoloX, i.MX6 UltraLite, i.MX7 Dual)
  • Qualcomm -- (MSM8X60, MSM8960, MSM8974)
  • Allwinner SoCs -- (A10 (sun4i), A10s / A13 (sun5i), A31 (sun6i), A20 (sun7i), sun8i Family, (sun9i))
  • ARM Ldt Versatile Express family --
Either -march=armv7-a or -march=armv5t -Wa,-march=armv7-a based on a compile test. -mfpu=vfp 100 Hz 自愿内核抢占 (桌面) 32
aarch64
  • 全志 sunxi 64 位 SoC 系列
  • Broadcom BCM2835 family
  • Marvell Berlin SoC Family
  • 基于 ARMv8 的 Samsung Exynos SoC family
  • 基于 ARMv8 的 Freescale Layerscape SoC family
  • Hisilicon SoC Family
  • Mediatek MT65xx & MT81xx ARMv8 SoC
  • Marvell EBU SoC Family
  • Qualcomm Platforms
  • Rockchip Platforms
  • AMD Seattle SoC Family
  • Altera's Stratix 10 SoCFPGA Family
  • NVIDIA Tegra SoC Family
  • Spreadtrum SoC platform
  • Cavium Inc. Thunder SoC Family
  • ARMv8 software model (Versatile Express)
  • AppliedMicro X-Gene SOC Family
  • Xilinx ZynqMP Family
300 HZ 自愿内核抢占 (桌面) 64

如果你进行桌面多任务处理,你可能希望切换到 自愿内核抢占 (桌面) 或 可抢占内核 (低延迟桌面) 并提高 定时器频率。如果你运行专用渲染农场节点或专用比特币矿机,请使用 无强制抢占 (服务器) 并降低 定时器频率。

优化模块 (大多数已编译为模块)

  • raid6 -- altivec, avx512, ssse3, avx2, mmx, sse, sse2, neon
  • raid5 的一些操作 -- mmx (32 bit), sse (64 bit), avx

对于内核 API

  • 32-bit memcpy -- 3dnow
  • 32-bit 内存页清除和复制 -- sse (Athlon/K7 only), mmx

来自 x86/crypto, arm/crypto, powerpc/crypto

  • CAMELLIA -- avx2, avx, aes-ni
  • CHACHA20 -- avx2, neon
  • CAST5 -- avx
  • CAST6 -- avx
  • TWOFISH -- avx
  • SERPENT -- avx2, avx, sse2
  • SHA1 -- avx2, ssse3, neon, spe
  • SHA2 -- avx2
  • SHA256 -- ssse3, neon, spe
  • SHA512 -- avx2, ssse3, neon
  • POLY1305 -- avx2
  • GHASH -- pclmulqdq (part of aes-ni), vmx (power8)
  • AES -- aes-ni, neon, vmx (power8), spe
  • CRC32 -- pclmulqdq, sse, neon, vmx (power8)
  • CRCT10DIF -- pclmulqdq, sse, neon, vmx (power8)

使用 kexec 快速重启

如果你想快速重启内核,避免 POST 测试,你需要 doas apk add kexec-tools 并在内核中启用 kexec

 Processor type and features
   [*] kexec system call

休眠以防止数据丢失

 Power management and ACPI options
   [*] Hibernation (aka 'suspend to disk')

如果你有笔记本电脑,应该使用休眠。你不希望笔记本电脑突然关机导致数据丢失,你希望它根据电池寿命百分比保存你的工作 (这需要特殊脚本)。当休眠恢复时,应该锁定并要求输入凭据。根据你的需要,休眠映像可以加密/解密,这再次需要对脚本进行额外的自定义。

使用未经清理的交换文件的休眠通常是不安全的,因为数据和未锁定的内存页以明文形式交换出去。为了提高安全性,可以禁用交换或使用加密交换。交换文件/分区通常用作休眠恢复映像。

构建

在构建之前,你可能希望删除尽可能多的模块。这将大大减少编译时间。此外,你可能希望使用 ccache 以加快重新编译速度,特别是当你正在搜索要使用或包含的最小选项或模块集时。

然后你应该执行 abuild -r 来尝试构建它。

安装

要安装它,你执行 doas apk add linux-NAME,其中 NAME 是你的自定义内核名称。

测试

在测试之前,你也应该安装 lts 内核,使用 apk add linux-lts。你可能缺少一个模块而无法启动,因此你使用另一个内核作为后备启动内核。不要忘记更新你的引导加载程序配置。

要进行测试,首先你应该制作一个可启动的 Alpine USB 映像。然后,当你完成救援 USB 后,你 reboot 计算机。

要测试它,你基本上需要进行反复试验。有时,如果想要获得最小设置,你的配置会缺少某些东西。

如果你对正确性测试感到好奇,一些内核模块或组件会在启动过程开始时执行自检。这些工具可能具有你可以使用 make 命令运行的测试套件。

参见