Linux-tkg
本仓库提供脚本,用于自动下载、打补丁并编译任意版本 ≥ 5.4 的 Linux 内核。
linux-tkg 还附带一组可提升桌面/游戏体验的补丁:大多数补丁可通过编辑 customization.cfg 文件进行切换,或简单地遵循交互式安装脚本。
重要信息
- 非 pacman 发行版的支持可视为实验性。欢迎报告您在使用中可能遇到的问题。
- 如果您的发行版未使用 systemd,请在 customization.cfg 中设置 _configfile="running-kernel",否则您可能会得到一个无法启动的内核
- 使用 GCC 构建较新的 Linux 内核需要约 20-25GB 的磁盘空间。使用 llvm/clang、LTO、ccache 和/或在 defconfig 中启用更多驱动程序会提高该需求,因此请确保您用于构建的卷上有足够的可用空间。
- Nvidia 驱动程序可能需要打补丁才能在最新内核上干净地构建/工作。 Frogging-Family nvidia-all 可以帮助您完成此操作 :frog:
自定义选项
大多数自定义项可以通过以下方式切换:
- 编辑 customization.cfg 中的变量,这些值可以被(按优先级递增)覆盖:
- 外部配置文件:由
_EXT_CONFIG_PATH变量指定:在上述文件或环境变量中,默认为~/.config/frogminer/linux-tkg.cfg。 - 在 shell 环境中设置变量。
- 外部配置文件:由
- 遵循交互式安装脚本(它 不会 提示所有选项)。
概述
以下是 customization.cfg 中一些切换项的概述:
_timer_freq- 计时器频率取决于调度器_cpusched- 选择不同的 CPU 调度器_processor_opt- 将编译的代码针对特定 CPU 进行调优,例如znver4。_compileroptlevel- 使用 GCC 或 Clang 编译,可选O2/O3_lto_mode: 仅限 Clang,启用LTO编译器优化。- 构建模块更少的内核:减少编译时间、所需的 TMPFS/RAM 空间,并生成更小的内核
_kernel_on_diet: 使用现成的精简模块列表进行构建- 高级用户:使用自己的模块列表 不推荐
- 使用
_modprobeddb和_modprobeddb_db_path选项 - Modprobed-db 可以帮助构建列表:务必先 仔细阅读相关内容,因为列表过短可能导致内核无法启动或由于缺少模块而出现运行时问题。
- 使用
NTsync和Fsync支持,包括未附带这些功能的旧内核版本- 可能需要打过补丁的 wine,参见 wine-tkg
CPU 任务调度器
CPU 任务调度器是决定何时运行哪个任务(应用程序、游戏、后台服务……等)、运行多长时间、在哪个核心上运行,以及让它与哪些其他任务轮流执行的算法。这些决策会影响吞吐量(单位时间内全局完成多少工作)和延迟(任务在再次运行前需要等待多久)。游戏通常对延迟更敏感,某些调度器可能更适合这种情况。
运行时调度器切换:sched-ext
从内核 ≥ 6.12 开始,可以在运行时切换 CPU 调度器,同时保留内核内置的默认调度器作为回退/备份,
使用 sched-ext。sched-ext 提供了各种调度器,LAVD 专为游戏工作负载设计,并被 Steam 的
Deck 手持游戏机使用。
注意:
- Arch 用户可以从
scx-scheds包或 AUR 获取 scx 调度器,感谢 @sirlucjan。 - 为了在重启后持久化所选的运行时调度器:
- 在
/etc/default/scx中设置调度器 - 启用
scx服务:systemctl enable scx。
- 在
构建时调度器切换
EEVDF 是上游“原版”内核源码 ≥ 6.6 中唯一可用的 CPU 调度器,而早期内核版本则使用 CFS。
linux-tkg 中可选地提供替代的构建时默认调度器:
- BORE (Burst-Oriented Response Enhancer) by Masahito Suzuki - 基于 CFS/EEVDF : 代码仓库
- Project C / PDS & BMQ by Alfred Chen: 博客, 代码仓库
- MuQSS by Con Kolivas : 博客, 代码仓库
- Undead PDS : TkG 移植的 Project C 之前的 Alfred Chen 编写的 "PDS-mq" 调度器。虽然 PDS-mq 在 5.1 内核中被其 BMQ 演进/重构版本取代,但它在游戏方面的表现并不如 PDS-mq。"U" PDS 在某些情况下比其他调度器表现更好,因此它被保留了一段时间。
这些替代调度器可能在某些场景下提供更好的性能/延迟比。每个调度器的可用性取决于所选的内核版本:脚本将按版本显示可用的调度器。
自带补丁
要使用 linux-tkg 应用你自己的补丁:
- 在克隆的根目录创建一个
linuxXY-tkg-userpatches文件夹- 其中
X和Y指定补丁适用的内核版本。- 示例:
linux65-tkg-userpatches,linux618-tkg-userpatches
- 示例:
- 其中
- 在你的自定义文件中设置
_user_patches=true。 - 将你的补丁放入该文件夹中,并带有
.mypatch扩展名。
安装脚本随后会找到它们,并询问你是否要应用每个补丁。
内核配置选项
linux-tkg 默认从 Arch 的完整 defconfig 开始,
对其中的某些 CONFIG 选项进行调整(始终调整或基于 customization.cfg 的输入),然后继续构建内核。
要修改内核配置选项:
- 基线内核 defconfig 可以被
_configfile自定义- 注意:交互式脚本会覆盖某些条目,如需还原,请参阅下一点。
- 配置选项可以在内核开始构建前进行修改
- GUI/TUI
- 交互式脚本会提示用户输入
make xconfig/menuconfig,然后提示将最终更改保存到 "frag" 文件中- 注意:确保在名称后添加
.myfrag扩展名,以便脚本可以自动重新使用它们。
- 注意:确保在名称后添加
- 交互式脚本会提示用户输入
- "frag" 文件:用于在编译开始前覆盖 defconfig 文件的 defconfig "片段"
- 这些文件必须位于
linux-tkg克隆的根目录,并具有.myfrag扩展名。 - 交互式脚本会提示逐个应用它们,每次一个 frag。
- 这些文件必须位于
- GUI/TUI
安装步骤
对于所有支持的 Linux 发行版,必须使用 git 克隆 linux-tkg。建议只克隆一次,并使用 git pull 进行更新。
因为它内部保留了一个相对较大的内核源代码克隆(在 linux-src-git 文件夹中,该文件夹在新鲜克隆后的首次构建期间创建)。
Arch 及其衍生版本
git clone https://github.com/Frogging-Family/linux-tkg.git
cd linux-tkg
# Optional: edit the "customization.cfg" file
makepkg -si
构建时选择的选项将被安装到 /usr/share/doc/$pkgbase/customization.cfg,其中 $pkgbase 是包名。
注意: 预期已安装 base-devel 包组,请参阅 此处 以获取更多信息。
基于 DEB 和 RPM 的发行版
交互式 install.sh 脚本将根据所选发行版创建 .deb 或 .rpm 包,将它们移动到子文件夹 DEBS 或 RPMS,然后提示使用发行版的包管理器进行安装。
.deb包:适用于 Debian、Ubuntu....rpm包:适用于 Fedora、RHEL、SUSE...
git clone https://github.com/Frogging-Family/linux-tkg.git
cd linux-tkg
# Optional: edit the "customization.cfg" file
./install.sh install
通过脚本安装的自定义内核的卸载必须手动完成。install.sh 可以提供一些有用的信息:
cd path/to/linux-tkg
./install.sh uninstall-help
通用安装
交互式 install.sh 脚本可用于通过在选择提示时选择 Generic 或在 _distro 自定义选项 中执行“通用”安装。
git clone https://github.com/Frogging-Family/linux-tkg.git
cd linux-tkg
# Optional: edit the "customization.cfg" file
./install.sh install
该脚本将编译内核,然后在执行以下操作之前提示:
sudo cp -R . /usr/src/linux-tkg-${kernel_flavor}
cd /usr/src/linux-tkg-${kernel_flavor}
sudo make modules_install
sudo make install
备注:
- 修补、配置、编译或安装内核所需的所有依赖项,预期用户已提前安装。
- 如果你只想让脚本修补
linux-src-git中的源代码,可以使用./install.sh config ${kernel_flavor}是默认命名方案,但可以通过_kernel_localversion自定义选项 进行自定义。_libunwind_replace自定义选项 可以用llvm-libunwind替换libunwind。- 该脚本使用 Arch 的
.config文件作为基础。可以通过_configfile自定义选项 提供自定义文件。 - 已安装的文件不会被你的包管理器跟踪,卸载需要手动干预。
如果你的安装流程遵循
Generic方法,./install.sh uninstall-help可以提供有用的信息。 - 使用
make install安装内核时会调用/sbin/installkernel(参见此处) 以将内核放置在正确位置并触发 initramfs(和 UKI)生成,请查阅你的发行版文档了解如何根据需求进行配置
Gentoo
交互式 install.sh 脚本通过遵循与 Generic 相同的步骤来支持 Gentoo,并包含少量补充
- Applies few Gentoo patches
https://dev.gentoo.org/~mpagano/genpatches/trunk/$kver/4567_distro-Gentoo-Kconfig.patchhttps://dev.gentoo.org/~mpagano/genpatches/trunk/$kver/3000_Support-printing-firmware-info.patch
- If using an init other than
systemd, set_gentoo_init='script'incustomization.cfg- Note: for a minimal defconfig, it is then advised to provide your own defconfig through
_configfile=incustomization.cfg: the default Arch defconfig is otherwise used withsystemdrelated config options enabled regardless.
- Note: for a minimal defconfig, it is then advised to provide your own defconfig through
- Symlinks the newly installed
/usr/src/linux-tkg-${kernel_flavor}src folder to/usr/src/linux - Offers to do a
emerge @module-rebuildfor convenience
git clone https://github.com/Frogging-Family/linux-tkg.git
cd linux-tkg
# Optional: edit the "customization.cfg" file
./install.sh install