关于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的软件管理便利性来做后续软件安装和升级。这样整个工作就拆解成了如下步骤:
- 使用armbian来构建kernel、DTB、uboot等所需要的文件
- 基于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是之前精简的一个版本对比,没有和官方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多人民币吧,帮助我完成了这个自建路由器项目。