当前位置:首页>Linux>DeepSeek V4试用:基于linux的内核裁剪和路由系统构建的小尝试

DeepSeek V4试用:基于linux的内核裁剪和路由系统构建的小尝试

  • 2026-09-10 23:10:50
DeepSeek V4试用:基于linux的内核裁剪和路由系统构建的小尝试

关于DeepSeek

4月份,DeepSeek发布了V4版本, 可以说是一次很大的进化。特别是从各种评测结果来看,coding能力能够接近claude 4.6 non-thinking版本,另外在agent方面也有非常大的进步。

当然,其实最重要的部分就是API价格实在是很优惠,相比较其他模型特别是GPT和Claude简直就像是不要钱一样。所以这次我也就拿着一个小项目测试下,看看DeepSeek的能力以及到底能够多便宜的情况下完成一个小项目。

项目介绍

还是说到,去年购买了一个友善R3S的边缘计算设备用来做家庭路由器,之前是根据友善官方的alpine-build-action以及自己写了一个install脚本,完全自动化的构建nftbales+sing-box+tailscale+cloudflare的整个网络管理服务。但有个问题就是,友善官方提供的kernel版本有点低,还是6.1.y版本。而目前内核的LTS已经到了6.18.y版本。因为内核版本低会带来安全性和扩展性等问题。

所以,本次我想的就是通过armbian的build机制,构建裁剪后的内核版本,然后再通过alpine的rootfs构建用户空间。这样方便利用apk的软件管理便利性来做后续软件安装和升级。这样整个工作就拆解成了如下步骤:

  • 裁剪linux的内核
  • 使用armbian来构建kernel、DTB、uboot等所需要的文件
  • 基于alpine构建rootfs
  • 基于kernel、DTB、uboot、rootfs等构建安装镜像文件

整个项目还是基于了Claude Code + DeepSeek V4 pro, 使用了DeepSeek官方方式配置Claude Code。

项目过程

裁剪linux内核

因为armbian支持自定义内核配置,而其官方的config-6.18.35-current-rockchip64(适配于R3S)内核配置包括了很多组件,例如其它驱动、多媒体支持、加密算法、文件系统等。最终编译的内核大概是40MB大小,其实很多组件对于我并不需要,所以我这里利用DeepSeek对内核进行裁剪,主要是编写裁剪脚本然后关闭那些不需要的功能,这样也能提高安全性。

整个裁剪过程经过了很多轮的对话,当然如果对Linux内核更了解裁剪起来更容易也更少出错误。我差不多把3个周末的时间都来搞这东西,最终将5000多项的配置裁剪到近900项,直接将内核的大小缩减到了9MB大小,当然裁剪也出了毛病导致一度路由器没能启动起来,后来还必须上了串口调试才将内核启动起来。

裁剪效果大概如下:

指标
上游 Armbian
v2.12 minimal
改善
vmlinuz
28.5 MiB
9.0 MiB
-68.4%
模块大小
15.7 MiB
2.0 MiB
-87.3%
模块数量
412
68
-83.5%
deb 包
78 MB
42 MB
-46.2%
可烧录镜像
159 MB
94 MB
-40.9%

这里的armbian是之前精简的一个版本对比,没有和官方minimal的版本对比。裁剪脚本执行效果如下:

[allenmagic@allenmagic r3s-kernel-trim]$ bash trim-r3s-kernel.sh[INFO]  裁剪模式:minimal  (Docker=0, eBPF=0)[INFO]  输入:/home/allenmagic/Projects/r3s-kernel-trim/samples/linux-rockchip64-current.config.baseline[INFO]  输出:/home/allenmagic/Projects/r3s-kernel-trim/linux-rockchip64-current.config[INFO]  已写入裁剪模式标记:/home/allenmagic/Projects/r3s-kernel-trim/.trim-mode = minimal[INFO]  [A] 关闭 NETFILTER_XTABLES + xt_* (共 ~40 个模块)[INFO]  [A.2] 关闭 BRIDGE_NETFILTER + ebtables (root cause, ~30 项)[INFO]  [B] 关闭 NET_SCHED / NET_CLS / NET_ACT (共 ~20 个模块)[INFO]  [C] 容器专用网络/存储裁剪(namespaces/cgroup 框架保留)[INFO]  [D] SQUASHFS 全关(节省 ~150KB)[INFO]  [E] EFI / SMMU / COMPAT 关闭[INFO]  [F] 关闭 Rockchip 硬件加密引擎[INFO]  [G] 关闭不常用网络隧道[INFO]  [H] NF_CONNTRACK helper 精简[INFO]  [H.2] 冷门 netfilter 模块清除 (~16 项)[INFO]  [H.3] 孤儿网络/非RK3566/可选精简 (~8 项)[INFO]  [H.3-G] Alpine/OpenRC 场景精简 (~11 项)[INFO]  [H.3-H] sing-box纯路由精简 (~13 项)[INFO]  [H.3-I] 显微镜级残余 (~6 项)[INFO]  [H.3-J] 孤儿crypto算法 (~6 项)[INFO]  [H.3-M] TCP/调试精简 (~3 项)[INFO]  [H.3-N] 非R3S硬件驱动精简 (~5 项)[INFO]  [H.3-R] DIAG/文件系统/模块精简 (~10 项)[INFO]  [H.3-S] crypto引擎/HWRNG/IPv6RA精简 (~5 项)[INFO]  [H.3-P] 非必要模块精简 (~4 项)[INFO]  [H.3-L] 非核心网络/CPU精简 (~6 项)[INFO]  [I] nftables 全套确认[INFO]  [J] 用户态工具红线确认[INFO]  [K] BPF 终结者 (BPF=y 由 NET=y 强制select,无法禁用)[INFO]  [L] USB 子系统全栈砍除(节省 ~1.3MB)[INFO]  [M.0] 关闭 SECURITY_APPARMOR + AUDIT 链 (root cause, ~6 项)[INFO]  [M] systemd 专属 cgroup/特性砍除[INFO]  [N] 内核统计接口砍除[INFO]  [O] KEXEC / Crash dump 砍除(节省 ~150KB)[INFO]  [P] INPUT 子系统极简(仅保留 GPIO 按键)[INFO]  [Q] 加密接口精简[INFO]  [R] 内存压缩/CMA 精简[INFO]  [S] 块设备调优 / 其他平台 MMC 驱动砍除[INFO]  [T] 文件系统冗余砍除[INFO]  [U] PHY 驱动精简[INFO]  [V] MD/DM 全栈砍除(节省 ~300KB)[INFO]  [W] 声卡/多媒体/图形兜底砍除[INFO]  [X] 无线/蓝牙/NFC/红外砍除[INFO]  [Y] 调试/Tracing 兜底[INFO]  [Y.2] nftables 冗余模块/conntrack 瘦身[INFO]  [Y.3] 内核框架瘦身[INFO]  [Y.4] 安全可砍残余[INFO]  [Y.5] 冷门内核特性/残留框架精简[INFO]  [Y.7] 编译实测后孤儿/冗余项清扫[INFO]  [Z] 总线/传感器/RTC 等冗余驱动清扫[OK]    最终 config 已写入:/home/allenmagic/Projects/r3s-kernel-trim/linux-rockchip64-current.config[INFO]  Baseline (y/m): 888[INFO]  Final (y/m):    860  (=y: 796, =m: 64)[INFO]  净减少:          28 项[OK]    生成的 config 文件统计:/home/allenmagic/Projects/r3s-kernel-trim/linux-rockchip64-current.config  裁剪模式:minimal  (Docker=0, eBPF=0)  =y 项:796  =m 项:64  合计 :860

armbian的编译

正如armbian官方文档,提供了userpatches的方式加入自定义内核配置,再编写了编译配置文件:

# NanoPi R3S 路由器专用构建配置BOARD="nanopi-r3s"BRANCH="current"KERNEL_GIT="shallow"# R3S 是无 WiFi 的纯有线路由器,跳过全部树外无线驱动# (避免 Linux 6.18+ ieee80211_ptr API 变更导致的编译错误)EXTRAWIFI="no"# 关闭 BTF 调试信息(精简内核 ~3MiB)# 裁剪模式选择(与 trim-r3s-kernel.sh --mode 对齐)#   minimal - 纯路由器(默认),最大裁剪#   docker  - 保留容器栈(Docker/Podman)#   ebpf    - 保留 eBPF 工具链(cilium/bpftrace/bcc)#   full    - docker + ebpf 全开# 优先级:环境变量 R3S_TRIM_MODE > userpatches/.trim-mode 标记文件 > minimal# export R3S_TRIM_MODE="minimal"# 启用 R3S 内核裁剪钩子ENABLE_EXTENSIONS="nanopir3s-kconfig"# custom_kernel_config 钩子会进一步撤销 Armbian 注入的 eBPF/Ftrace/Kprobes 等# 注:钩子内部的裁剪模式由 .trim-mode 文件或 R3S_TRIM_MODE 环境变量控制KERNEL_BTF="no"# 使用裁剪后的内核配置# KERNEL_CONFIGURE="no"# 只构建内核# BUILD_DESKTOP="no"# BUILD_MINIMAL="yes"

然后再执行编译命令:

./complish kernel nanopir3s./complish uboot nanopir3s

即可完成内核和uboot的编译

alpine构建rootfs

在之前我已经构建过了alpine的一些安装脚本,此次用了Deepseek进行重构,主要是优化nftables/sing-box/tailscale/cloudflare等工具的安装,以及配置同步。这个过程DeepSeek完成的非常顺畅,差不多2-3轮对话就完成了。所以在这个过程中发现,只要想法思路清晰,那么deepseek在这个想法和思路上进行扩展和优化是非常顺利,。执行起来也很快(中间执行脚本优化和测试发现还是调用了deepseek flash,从而显著节省了token的成本)。

当然,本身rootfs是用户空间的内容,没有内核裁剪那么困难,从难度上来说deepseek是完全能够处理的。

编写img构建脚本

这个过程其实对于deepseek来说并不复杂,而且完成的很快。但中间出了一个bug,就是启动文件的配置。我选择了extlinux的启动方式,初始的配置文件如下:

TIMEOUT 0DEFAULT alpineMENU TITLE Alpine Linux on NanoPi R3SLABEL alpine    MENU LABEL Alpine Linux (default)    LINUX /boot/vmlinuz-6.18.36-current-rockchip64    FDT /boot/dtb/rockchip/rk3566-nanopi-r3s.dtb    APPEND root=$PARTUUID rootwait rw rootfstype=ext4 console=ttyS2,1500000 net.ifnames=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memoryLABEL alpine-debug    MENU LABEL Alpine Linux (verbose debug)    LINUX /boot/vmlinuz-6.18.36-current-rockchip64    FDT /boot/dtb/rockchip/rk3566-nanopi-r3s.dtb    APPEND root=$PARTUUID  rootwait rw rootfstype=ext4 console=ttyS2,1500000 net.ifnames=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory loglevel=8 earlycon

就是因为这个配置文件,导致了路由器始终服务启动未能成功。然后我相继使用了Claude/GPT等国外顶模也没能发现问题,最终还是在购买了串口调试线通过串口调试才发现:

  • TIMEOUT 不应该设置为0, 这样就没法实现自动启动内核,需要手动输入选项后启动
  • root不能设置成PARTUUID, 后来参考armbian的实现,写成/dev/mmclbkl1p1绝对的分区路径

结语

整个过程可以说难度不算太大,DeepSeek完成的也很好。而没能完成的部分换成了Claude/GPT也没能解决。所以对于我这种可以做一些小工具开发的人来说性价比拉满了,毕竟真的很便宜,总共可能就花了20多人民币吧,帮助我完成了这个自建路由器项目。

最新文章

随机文章