让树莓派 5 跑上“香草”主线内核:精简裁剪、交叉编译与部署全流程

摘要 本文系统记录了我如何将树莓派 5 打造成主线 Linux 内核(Vanilla Kernel)的极简开发与测试平台——包括仓库极简裁剪思路、定制化内核配置、交叉编译与自动部署脚本、overlay 移除技巧,以及长期与主线社区同步维护的实战心得。适合关注 Linux 主线、ARM64 适配、内核开发、Upstream 贡献或喜欢折腾内核的极客们参考和实践。 背景与动机 最近一段时间,我在深入研究 Linux Kernel 的理论和架构,准备正式切入操作系统内核领域。因此,特意购买了树莓派 5 作为开发板,用于学习和实践内核开发。然而刚上手就发现,目前树莓派 5 并不能直接跑主线 Linux 内核,只能依赖树莓派团队维护的内核仓库。当时最新的分支是 rpi-6.14.y(现在是 rpi-6.16.y),仓库的维护方式是“动态拉取上游主线代码+rebase+大量自定义补丁”,涉及上万行的修改和历史反复变动。 这些定制补丁对于官方内核在树莓派上稳定运行、兼容所有功能确实非常重要,但对我这种纯粹想研究主线内核特性、关注内核本身的开发者来说,这些补丁反而变成了负担: 主线同步困难,merge 经常出冲突, 版本历史频繁重写,难以回溯和比较, 验证主线新特性或做反馈变得不直观。 我对比了 x86 开发板,发现它们大多能直接运行主线内核,但价格昂贵,性价比远不如树莓派 5。因此,我开始思考,如何让树莓派 5 也能顺畅运行主线内核,真正实现随时体验和测试内核最新特性,并为 ARM64 平台反馈问题、贡献补丁提供便利。我的目标很明确:用最少的补丁、最贴近 upstream 的方式,让树莓派 5 成为个人主线内核实验和学习的理想 ARM64 平台。 仓库结构与修改范围 我的做法十分简单却又直奔核心——只保留最必要的驱动与补丁,其余全部紧跟主线。仅对 drivers/ 目录做补丁,聚焦核心硬件支持,主要包括: SD 卡驱动:保证树莓派能正常引导,内核能加载根文件系统。虽然启动固件自带部分初始化功能,但主线内核仍需驱动挂载根文件系统。 有线网卡(Ethernet):方便通过 SSH 实现远程登录、下载新内核镜像、远程开发和调试,是内核开发过程中最重要的 IO 通道之一。 UART 串口:作为内核调试和 early print 的输出窗口,可以直接观察内核日志,判断启动和运行状态。 USB 控制器:用于外部设备挂载或偶尔传输离线数据,兼容更多实验场景。 基本 GPIO、电源管理等与 RPi5 硬件紧密相关的部分。 剔除官方内核中与 Wi-Fi、蓝牙、GPU(VideoCore)、HDMI、音视频加速等非内核开发必需的子系统支持,这些对内核本身的研究和测试意义不大。 维护 arch/arm64/boot/dts/ 下的树莓派 5 DTS(Device Tree)配置 ...

2025年6月14日

搭建个人链式VPN网络:高效隐私保护、设备无限制管理与远程访问

在某些场景中,我们可能需要搭建一个链式 VPN 结构,即先让内网设备连接到自建的 WireGuard 服务器(如个人 VPS),再通过该服务器将所有流量转发到另一个 VPN(公司、学校或商业 VPN 服务)后才进入互联网。搭建这种「VPN 套 VPN」的网络架构,有以下明显优势: 强大的隐私保护:内网设备的数据流量首先通过自己搭建的 WireGuard 加密隧道传输至个人 VPS,再由 VPS 二次通过商业或公司 VPN 进行转发,最终从该 VPN 的 IP 出口访问互联网。这种方式彻底避免了使用 VPS 自身 IP 地址直接访问目标网络,大大降低了个人 IP 被跟踪或泄露的风险。 集中化便捷管理:所有客户端设备统一连接到单个 WireGuard 服务,免去逐一配置每台设备的麻烦。更重要的是,它还能巧妙绕过一些商业 VPN 服务商设定的账号设备数量限制,一次付费,所有设备共享。 灵活便捷,轻松切换:由于商业或公司 VPN 配置仅在自建 WireGuard 服务器端修改一次即可生效,下游客户端(手机、电脑等)无需单独调整。这使得更换或重新配置上游 VPN 时更加迅速和便捷,大大提高日常维护的效率。 打造专属虚拟局域网,实现跨设备互通:一旦所有设备连接到自建的 WireGuard VPN 服务器后,将自动获得统一的 VPN 虚拟局域网 IP 地址(例如:10.8.0.0/16)。处于该网络中的设备能够直接互相通信,无需额外设置。 这种便捷性意味着无论你身处何处,都能轻松实现: 远程 SSH 登录:随时访问家中或办公室的服务器。 私有 NAS 媒体访问:在外轻松访问家中 NAS 存储的媒体文件。 远程办公:随时随地安全访问公司内部网络资源。 方案 经过本人的探索和实践,我逐步摸索出了自己的一套链式 VPN 方案。总体来看,我的方案完全基于 Docker 部署,所用到的核心组件有: gluetun:一个 Docker 镜像,内置 OpenVPN/ WireGuard 客户端,可连接到各大 VPN 服务提供商。本例中我们通过配置在 Docker 网络中提供 VPN 网关功能。 wg-easy:一个简化的 WireGuard Docker 镜像,内置 Web 界面,便于创建/管理 WireGuard 配置文件。下游设备通过 WireGuard 客户端连接到该服务,所有流量将被转发到 gluetun 容器,由 gluetun 再发给上游 VPN。 该方案的优势在于完全容器化部署,避免污染服务器/VPS 的环境。然后就是比较稳定,个人日常使用未发现明显延迟、卡顿、断流问题,而且性能良好(在个人家用带宽下测试)。另外,该方案现在能够支持 IPv6,即使设备身处 IPv4 的网络环境,也能通过链路实现对 IPv6 资源的代理访问。 ...

2025年6月2日

自建图床服务并配置免费CDN全球加速 过程记录

个人有一些图片托管的需求,在很多场景下比如说在博客文章中插入图片,在社交网站上分享图片,抑或是个人开源项目中的图片等等,都需要在文档(特别是 MarkDown)中嵌入一个 URL 直链来指向图片。对于一些免费的图床服务商,个人感觉并不是很信任。数据安全是一方面,另一方面如果服务商跑路了,那么很多原先我创建的链接都会失效。据我所知,这样的例子比比皆是。 网上还有一些教程将 GitHub 当成免费图床来用。这样做弊端也很明显,GitHub 在国内的访问速度非常慢,图片加载很慢。另外,缺少很多图床该有的功能,比如说自动压缩,自动转换成 Webp,自动重命名等等。这样做也是不太可行的。下面就是一个我将 GitHub 用作图床的例子。每次我还需要将图片移动到代码仓库里,然后 commit,push,我个人感觉很麻烦。 还有一段时间我试过把 WordPress 的 Midea 库当作图床来使用,但是我发现图片链接中带有 wp-content/upload 这样的路径。然后链接中还会出现图片的名称。我感觉并不是很雅观,而且在隐私的保护中有一种说不好的感觉。就像是别人一看这个 URL 链接,就能获知一些图片以外的信息。下面就是用 WordPress 的 Media 库当图床例子。可以看到,产生的直链不是很美观,而且还能暴露一些信息。 所以,我这边产生了自建图床服务的想法。这种图床最好能自动转换 jpg、png 格式的图片为 webp。这样图片就能比较高质量、快速地在用户浏览器中加载出来。有关 WebP 的简要介绍如下: WebP is a raster graphics file format developed by Google intended as a replacement for JPEG, PNG, and GIF file formats. It supports both lossy and lossless compression,[8] as well as animation and alpha transparency. Google announced the WebP format in September 2010, and released the first stable version of its supporting library in April 2018. ...

2023年11月18日

搭建一个免费开源好用的Docker面板 Portainer

Portainer 是一个好用的 Docker 容器控制面板。它的代码仓库在这里。它支持单节点和集群部署。 在此之前,我已经将个人服务器完全容器化了。如果能够可视化操作、监控各种容器,对于日常的运维帮助很大,感觉一切尽在掌握。 可以看看搭建好后的效果,界面还是很美观的。 可以快速拉取镜像 可以可视化发布容器,并灵活设置环境变量、网络、重启策略等等参数。 可以在镜像更新的时候,快速用新镜像更新容器。 还可以快速进入接入容器命令行,查看容器日志。 可以说,我日常需要的功能都有,感觉很完善了。 搭建 那么对于单点服务器来说,该如何搭建呢,首先你要确认你的服务器目前有安装 Docker。 可以输入docker -v来看看当前环境中是否存在 docker。 如果不存在,需要安装 docker,你可以在 Google 找找教程。对于 AWS 的 EC2,可以输入sudo yum install docker -y来安装。 确认安装好 Docker 后。确认一下 Docker 是否启动。然后看看/var/run 路径下是否有 docker.sock 文件。 然后,确认 8000 端口和 9443 端口都没有被占用,因为 Portainer 后续要用到这两个端口。 将应用数据存储在 Docker Volume 如果你想将 Portainer 产生的应用数据存在 Docker Volume 中,你可以直接执行下面的命令。后续部署完成后,Portainer 所使用的 Docker Volume 也可以在 Portainer 看到并管理。如果 8000 端口被占用了,可以将-p 8000:8000改成其他端口,类似-p 12345:8000。9443 端口也是类似。 如果你想指定容器名为其他,可以修改–name 参数,比如说--name myportainer。 ...

2022年11月23日

AWS reserved instances limit exceeded 问题原因与解决方法

这个提示一般发生在你选择“无预付”的保留实例方案的时候。一般的原因是,你的信用额度不够,换句话说就是你每个月的支出太少了。 这种情况,最好选择部分预付或者全部预付的方案,这样就能通过了。而且,部分预付和全部预付方案会更划算。买的年数长的话可以省下不少的钱。

2022年11月20日

有关下一阶段的计划

实际撰写时间:2017-05-20 20:57:23 不得不承认,去年是一个低落的一年,不管是生活上,学习上,还是精神上。眼看着和目标渐行渐远,自己又无力改变。 但是,现在不同了。在度过了种种困难后,终于在艰难种找到了一种新的思考问题的方式,也第一次发现了自我。在解决了一系列问题后,内忧趋于瓦解,我觉得,终于可以集中自己的所有能力而不会受制于自己本身了。 该找到的答案,我已经找到了。这个时候,内心感到宁静。是时候开始奔跑了。学会奔跑的我,再也不会是被自己折磨苟且爬着和别人比赛的我。在我学会奔跑后,被我超越的,再也不可能赶超回来。

2022年11月9日

Ubuntu双系统重装Windows后修复grub2引导 UEFI

如果你在安装了 Ubuntu 和 Windows 双系统后,又重装了 Windows 系统。那么 Grub 引导项大概率会被 Windows Boot Manager 覆盖,这时候你就进不了 Ubuntu 了。但不要慌,按照下面的步骤可以修复 grub2 引导,而且不需要安装额外的软件。 制作 Ubuntu 的 U 盘启动盘 为了修复引导项,我们需要用到 Ubuntu 系统提供的软件工具。虽然我们暂时进不去原来的 Ubuntu 系统,但是我们可以使用写在 Ubuntu U 盘中的镜像来获得一个可用的基本 Ubuntu 环境。 在Ubuntu 官网下载镜像文件。 制作 U 盘启动盘可以使用免安装、小巧好用的rufus。你可以使用 rufus 快速创建一个 U 盘启动盘,注意选择 GPT 模式。 引导 U 盘启动盘 重启电脑,在 BIOS 引导设置中引导 U 盘,然后进入 Ubuntu 引导安装程序后,在安装界面选择 Try Ubuntu 进入 Ubuntu Live。 执行 Grub2 重建操作 使用 fdisk,找到 EFI 分区,/boot 挂载点所在的分区(如果你没有设置/boot 挂载点则为/挂载点)。 挂载/boot 挂载点所在的分区到/mnt 下(我的分区在 nvme 固态硬盘上)。 ...

2021年11月26日

解决yarn安装electron、chromedriver等软件包超时、缓慢的问题

在国内使用 yarn 安装 electron、chromedriver 是经常出现无法连接的问题,这个时候,相对于设置代理,我们可能更希望使用在国内的镜像仓库来加速这个过程。并且安装 electron 的时候,单单设置 yarn 的全局代理是没有用的。那如何根据不同的软件包设置代理呢?你可以按照以下列表中提供的命令样例来设置。 yarn 全局设置 设置 yarn 安装一般的软件包时使用的仓库地址。 yarn config set registry https://r.npm.taobao.org 注册模块镜像 yarn config set disturl https://npm.taobao.org/dist # node-gyp 编译依赖的 node 源码镜像 这是运行以上命令的结果,你可以很清楚地看到设置是否成功。 yarn 安装特定软件包设置 设置 yarn 安装 electron 、chromedriver 等软件包安装使用到的仓库地址。你可以按照需要选择一两个命令来设置,一股脑全部加上是被必要的。 yarn config set sass\_binary\_site https://npm.taobao.org/mirrors/node-sass # node-sass 二进制包镜像 yarn config set electron\_mirror https://npm.taobao.org/mirrors/electron/ # electron 二进制包镜像 yarn config set puppeteer\_download\_host https://npm.taobao.org/mirrors # puppeteer 二进制包镜像 yarn config set chromedriver\_cdnurl https://npm.taobao.org/mirrors/chromedriver # chromedriver 二进制包镜像 yarn config set operadriver\_cdnurl https://npm.taobao.org/mirrors/operadriver # operadriver 二进制包镜像 yarn config set phantomjs\_cdnurl https://npm.taobao.org/mirrors/phantomjs # phantomjs 二进制包镜像 yarn config set selenium\_cdnurl https://npm.taobao.org/mirrors/selenium # selenium 二进制包镜像 yarn config set node\_inspector\_cdnurl https://npm.taobao.org/mirrors/node-inspector # node-inspector 二进制包镜像 和上面的类似,运行命令后你可以很清楚地看到设置是否成功。 ...

2021年11月22日

oh my zsh 在Ubuntu下的配置教程

oh my zsh 是十分好用的基于 zsh 的配置框架,它能简化 Linux 终端用户的很多日常操作。而且,它的界面相对于原始的 bash 来说,非常好看。这篇文章就是用来介绍如何在 Ubuntu 下安装并配置 oh my zsh 及其常用插件的。 oh my zsh 安装与基本配置 在 oh my zsh 安装前需要先执行以下命令安装下列 git、curl、zsh。 % sudo apt install git curl zsh 安装完依赖项目后,直接执行下面的命令来一键安装: % sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 设置 zsh 为默认 shell: % chsh 按照提示一步一来,输入/bin/zsh 即可。 常用插件安装 单单配置 oh my zsh 本身是远远不够的,你可能需要以下常用插件来真正达到简化操作的目的。 z 历史目录管理 zsh-autosuggestions 命令提示 zsh-syntax-highlighting 高亮 sudo 忘记加 sudo 前缀之时 extract 一个命令解压几乎所有安装包 z 无需额外安装,直接在 plugins 中填写即可。 zsh-autosuggestions 先执行以下命令,然后在 plugins 中填写。 ...

2021年11月22日

使用 space-vim-dark 一键配置、美化vim编辑器

一直以来我都使用一些成熟的配置文件来帮助我配置、美化 vim 编辑器,然而我原来使用的 spf13-vim.sh 已经很久不更新了,它的插件列表中有些插件已经不能正常下载了。所以我想寻找它的替代品,最后发现 space-vim-dark 还不错。 space-vim-dark 基本介绍 经过我的寻找,找到了一个比较好用且美观的配置文件 space-vim-dark。这个 space-vim-dark 可能是国人编写的 vim 配置文件,它能很好使得 vim 适应暗色模式。 先贴出仓库地址:https://github.com/liuchengxu/space-vim-dark 这是它的效果图,整体看还是不错的。 用它配置、美化 vim 编辑器 设置 space-vim-dark 非常简单,你只需要在你的 vim 插件管理器中添加下面的设置。 Plug 'liuchengxu/space-vim-dark' 整体使用下来,我觉得该有的插件还是有的,并且用起来顺手不少。 加入额外配置 在~/.spacevim 中可以加入你自己的一些配置。

2021年11月22日