让树莓派 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)配置 ...

六月 13, 2025

搭建个人链式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 资源的代理访问。 ...

六月 2, 2025

自建图床服务并配置免费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. 然后图床还要能够自动压缩图片,然后产生带有MD5或者SHA256的URL链接,能够不暴露我的图片原始信息。然后还能够配置CDN加速,毕竟对于图床来说CDN非常重要,载入速度很大程度上影响用户的终端体验。还有最好能够用PHP写成,因为这样我能够上传到我的网站托管服务商进行托管,不需要另外去单独为这个买VPS来部署。 搭建EasyImages2.0自建图床 经过查找,我发现一款叫做EasyImages2.0的图床项目比较符合我的上述需要。这款图床用PHP写成,理论上能够在我的服务商托管的规则容许下正常运行。而且不需要数据库,免去了额外的数据库的配置,节约时间。 话不多说,先进入项目仓库下载最新发布版本。 先解压检查目录,不出意外的话应该是这样。项目根路径下有index.php,这种结构就可以直接FTP上传到托管服务商FTP上。不需要额外的配置,应该就可以使用了。然后,我就将压缩包上传到托管服务商的FTP上,解压到网站根目录public_html下(有些托管服务商是根目录www目录) 上述步骤完成后,FTP目录应该是下面这样。这个时候我们记得提前去app目录下,将upload.php权限改为0755。 修改权限的操作详情如下。可以按照我这样来。 还需要注意,根据该项目的兼容性描述,PHP环境需要满足一定的要求。 最低PHP 5.6,推荐PHP≥7.0及以上版本,需要PHP支持fileinfo,iconv,zip,mbstring,openssl扩展,如果缺失会导致无法上传/删除图片 文件上传视图提供文件列表管理和文件批量上传功能,允许拖拽(需要HTML5支持)来添加上传文件,支持上传大图片,优先使用HTML5旧得浏览器自动使用Flash和Silverlight的方式兼容 请确保fileinfo,iconv,zip,mbstring,openssl这几个扩展已经安装妥当。找到下面这种界面,然后用浏览器搜索检查是否都安装了。 ...

十一月 18, 2023

搭建一个免费开源好用的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。 % docker volume create portainer\_data % docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer\_data:/data portainer/portainer-ce:latest 将应用数据映射到宿主机的其他地方 你可以在/data下建立目录portainer,所以说,最终的路径是/data/portainer。我最终选择了这种方式,因为我单独购买了AWS的数据盘来存储我的服务器的应用数据。所以我倾向于将应用数据都存在数据盘中。 其他参数设置和上面的部分一致。 % docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer:/data portainer/portainer-ce:latest 确认部署状态 然后执行docker ps来确认Portainer是否正常启动。可以参考我的截图中的红框中的信息。 ...

十一月 23, 2022

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

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

十一月 20, 2022

有关下一阶段的计划

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

十一月 9, 2022

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固态硬盘上)。 % sudo mount /dev/nvme0n1p6 /mnt/ 挂载EFI分区,在这里你需要知道在你的硬盘中那一个分区是EFI系统分区(我这里是第五个分区)。 % sudo mount /dev/nvme0n1p5 /mnt/boot/efi 连接其他必要的目录 % sudo mount --bind /dev /mnt/dev % sudo mount --bind /dev/pts /mnt/dev/pts % sudo mount --bind /proc /mnt/proc % sudo mount --bind /sys /mnt/sys 转换根目录到/mnt下 % sudo chroot /mnt 修复Grub2引导 对于32位系统和64位系统,在这里你需要运行的命令是不同的。下面分别给出了它们对应的命令。 32位系统 % sudo grub-install --target=i386-efi /dev/nvme0n1 64位系统 % sudo grub-install --target=x86\_64-efi /dev/nvme0n1 执行完上面命令当中的一条后,再执行一下Recheck % grub-install --recheck /dev/nvme0n1 后续清理步骤(可要可不要) % exit % sudo umount /mnt/sys % sudo umount /mnt/proc % sudo umount /mnt/dev/pts % sudo umount /mnt/dev % sudo umount /mnt 然后重新启动,你会发现已经能够成功进入grub2界面,并且grub2已经识别到了Ubuntu系统和Windows Boot Manager。 ...

十一月 26, 2021

解决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 二进制包镜像 和上面的类似,运行命令后你可以很清楚地看到设置是否成功。 ...

十一月 22, 2021

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中填写。 % git clone git://github.com/zsh-users/zsh-autosuggestions ${ZSH\_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions zsh-syntax-highlighting 先执行以下命令,然后在plugins中填写。 % git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH\_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting sudo 无需额外安装,直接在plugins中填写即可。 extract 无需额外安装,直接在plugins中填写即可。 设置代理 我们可以通过在.zshrc中加入以下配置来启动可开关的代理功能: proxy() { export https\_proxy=http://127.0.0.1:1234 export http\_proxy=http://127.0.0.1:1234 export all\_proxy=socks5://127.0.0.1:1234 } unproxy() { unset https\_proxy unset http\_proxy export all\_proxy } 你可以将1234改为你任何想要的端口。 ...

十一月 22, 2021

使用 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中可以加入你自己的一些配置。

十一月 22, 2021