Build my own patched Ubuntu mainline kernel

记录下用 ubuntu-mainline-kernel.sh 编译打补丁内核的过程

背景

Ubuntu 官方内核太保守,想用 mainline 最新内核,但又需要打自己的补丁(比如硬件驱动、性能优化之类的)

找到个不错的工具:ubuntu-mainline-kernel.sh

工具介绍

这个脚本可以:

  • 从 Ubuntu Kernel PPA 直接下载安装 mainline 内核
  • 本地编译内核(实验性功能)
  • 支持 SecureBoot 签名
  • 自动检查新版本

⚠️ 警告:mainline 内核不受官方支持,生产环境慎用,记得保留默认内核做备份

安装脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安装依赖
sudo apt install wget

# 下载脚本
wget https://raw.githubusercontent.com/pimlie/ubuntu-mainline-kernel.sh/master/ubuntu-mainline-kernel.sh

# 赋予执行权限
chmod +x ubuntu-mainline-kernel.sh

# 移动到系统路径
sudo mv ubuntu-mainline-kernel.sh /usr/local/bin/

常用命令

查看可用版本

1
2
3
4
5
6
7
8
# 列出所有远程版本
ubuntu-mainline-kernel.sh -r

# 包括 RC 版本
ubuntu-mainline-kernel.sh -r --rc

# 搜索特定版本
ubuntu-mainline-kernel.sh -r 6.8

安装预编译内核

1
2
3
4
5
6
7
8
# 安装指定版本
sudo ubuntu-mainline-kernel.sh -i 6.8.0

# 包括 RC 版本
sudo ubuntu-mainline-kernel.sh -i 6.8-rc5 --rc

# 安装 low-latency 版本(低延迟优化)
sudo ubuntu-mainline-kernel.sh -i 6.8.0 --low-latency

卸载内核

1
2
3
4
5
# 列出已安装的内核
ubuntu-mainline-kernel.sh -l

# 卸载指定版本
sudo ubuntu-mainline-kernel.sh -u 6.8.0

本地编译(打补丁用这个)

1
2
# 本地编译并安装
sudo ubuntu-mainline-kernel.sh -b 6.8.0

本地编译打补丁流程

这是重点,可以在编译前打自己的补丁

准备工作

1
2
3
4
5
6
7
8
9
# 安装依赖
sudo apt install git docker.io

# 把自己加到 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER
# 需要重新登录生效

# 预留空间:源码约 3GB,编译过程可能 10GB+
df -h /var/lib/docker

获取内核源码

脚本使用 Docker 编译,基于 TuxInvader 的 focal-mainline-builder 镜像

1
2
3
4
5
6
# 克隆源码(脚本会自动做,这里是手动方式)
git clone --depth=1 --branch v6.8 \
  git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git \
  linux-6.8

cd linux-6.8

打补丁

把自定义补丁放到源码目录:

1
2
3
4
5
6
# 示例:打个驱动补丁
cd linux-6.8
patch -p1 < ~/my-driver.patch

# 或者直接修改源码文件
vim drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

修改配置(可选)

1
2
3
4
5
6
7
8
# 复制当前系统内核配置
cp /boot/config-$(uname -r) .config

# 更新配置(使用默认值)
make olddefconfig

# 或者手动配置
make menuconfig

开始编译

使用脚本编译:

1
2
3
4
# -b 参数会自动拉取 Docker 镜像并编译
sudo ubuntu-mainline-kernel.sh -b 6.8.0

# 编译完成后会自动安装

编译参数调整(修改脚本或手动 Docker 编译):

1
2
3
4
5
6
7
8
9
# 手动 Docker 编译方式
docker run --rm -it \
  -v $(pwd):/build \
  tuxinvader/focal-mainline-builder:latest \
  /bin/bash

# 在容器内
cd /build
make -j$(nproc) bindeb-pkg LOCALVERSION=-custom

安装编译好的内核

1
2
3
4
5
6
7
8
9
# 如果是手动编译,会在上层目录生成 .deb 文件
cd ..
ls -lh *.deb

# 安装
sudo dpkg -i linux-*.deb

# 更新 GRUB
sudo update-grub

SecureBoot 签名(需要的话)

如果启用了 SecureBoot,需要签名内核

生成签名密钥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 创建密钥目录
mkdir -p ~/sb-keys
cd ~/sb-keys

# 生成 MOK 密钥对
openssl req -new -x509 -newkey rsa:2048 \
  -keyout MOK.priv \
  -outform DER \
  -out MOK.der \
  -days 36500 \
  -subj "/CN=My Kernel Signing Key/" \
  -nodes

# 注册 MOK 密钥(重启后会提示输入密码)
sudo mokutil --import MOK.der
# 设置一个临时密码,重启时输入

签名内核

1
2
3
4
5
6
7
# 签名内核和模块
sudo sbsign --key MOK.priv --cert MOK.der \
  /boot/vmlinuz-6.8.0-custom

# 签名模块(如果需要)
sudo find /lib/modules/6.8.0-custom -name "*.ko" -exec \
  sbsign --key MOK.priv --cert MOK.der {} \;

重启选择签名后的内核启动

常见问题

编译失败

Docker 镜像可能过期,尝试:

1
2
3
4
5
6
7
# 拉取最新镜像
docker pull tuxinvader/focal-mainline-builder:latest

# 或者手动编译不用 Docker
sudo apt install build-essential libncurses-dev \
  bison flex libssl-dev libelf-dev
make -j$(nproc) bindeb-pkg

缺少固件

某些驱动需要额外固件:

1
sudo apt install linux-firmware

GRUB 不显示新内核

1
2
3
4
5
# 更新 GRUB
sudo update-grub

# 检查是否生成
grep menuentry /boot/grub/grub.cfg

参考资料

文档已完成


1
2
3
4
NOTE: I am not responsible for any expired content.
Created at: 2025-01-12T16:16:49+08:00
Updated at: 2025-11-02T07:01:28+08:00
Origin issue: https://github.com/ferstar/blog/issues/82