自定义内核
![]() 在此通知移除之前,请勿遵循此处的说明。 |
构建自定义配置内核的这个过程假设你正在运行 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
这样做,你在维护方面的工作量较少。你只需保持 master 或 3.17-stable 同步[7][8],并合并任何冲突。
首先通过执行 git checkout my-custom-kernel
切换到分支。然后,你需要导航到 main/linux-lts 文件夹,你应该在那里看到一个 APKBUILD 和一些 config- 文件。完成编辑后,可以直接编辑 APKBUILD 并将 lts.ARCH.config 复制为 .config 在 linux-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
|
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 |
|
Either -march=armv7-a or -march=armv5t -Wa,-march=armv7-a based on a compile test. -mfpu=vfp |
100 Hz | 自愿内核抢占 (桌面) | 32 |
aarch64 |
|
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 命令运行的测试套件。