Khadas Vim3 这块板子,我在手边用了大概半年多,期间拿它跑过 NAS、编译过内核、挂着 NVMe 硬盘当下载机,也折腾过一段时间的中等负载 Web 服务。说句实话,在同价位的单板计算机里,能同时把Cortex-A73 大核、PCIe 通道和NVMe 固态硬盘这三样东西凑齐的,真的不多。很多人一听到 SBC,第一反应就是树莓派,但 Vim3 走的是另一条路——它不是为了给你跑个桌面系统看视频,而是奔着“小型服务器”和“边缘计算节点”这个定位去的。这篇内容我就从硬件架构、NVMe 实际体验、系统部署和问题排查几个维度,把这块板子彻底拆开讲清楚。
1. 项目概述:Khadas Vim3 到底是什么定位
1.1 这个项目解决的核心需求是什么
先搞清楚一个前提:如果你只是想买一块板子回来给小孩学 Python、点个 LED 灯、接个摄像头做智能家居,那 Vim3 对你来说可能性能过剩、价格也不友好。但这块板子真正瞄准的,是那些需要“在低功耗设备上跑接近 x86 入门级服务器负载”的场景。
我举几个实际例子:
- 内网 NAS:挂两块 NVMe SSD,跑 Samba 和 NFS,传输速度能稳定跑满千兆网,甚至很多时候瓶颈在网口而不是硬盘。
- Docker 容器服务器:跑 Portainer、Gitea、AdGuard Home、Node-RED 这些轻量服务,内存占用合理,CPU 负载常年不超过 30%。
- 边缘 AI 推理:A311D 这块 SoC 里集成了一颗 5 TOPS 算力的 NPU,做图像分类、目标检测这类推理任务,比纯 CPU 跑快得多。
- 嵌入式开发调试板:很多做 Android TV 盒子方案、做 IPC 摄像头方案的工程师,会拿 Vim3 当“开发参考板”来跑 BSP、调试内核驱动。
所以它的核心价值可以概括成一句话:用开发板的体积和功耗,换取接近入门级 x86 小主机的性能,并且保留了完整的 Linux/Android 生态。
1.2 这块板子的产品形态与软件生态
Khadas 这个品牌在 SBC 圈子里算是一个比较“极客向”的选择。它不像树莓派那样有庞大的官方社区和傻瓜式教程,但它的做工用料、原理图开源程度、以及官方对 Linux mainline 内核的支持力度,在同类产品里都是很有诚意的。
Vim3 有两种形态:不带 M.2 插槽的版本,以及带 M.2 插槽的版本。后者就是标题里提到的NVMe 支持的关键——它通过板载的 M.2 接口引出了 PCIe 通道,可以直插 NVMe 固态硬盘。这一点在 SBC 里非常少见,因为绝大多数 ARM 开发板的存储方案还是 microSD 卡或者 eMMC,能直接用 NVMe 的少之又少。
软件生态方面,官方提供了 Ubuntu Server、Ubuntu Desktop、Armbian、Android TV 等镜像。我长期使用的是 Armbian,原因很简单:内核新、驱动全、社区维护活跃,而且对 NVMe 的支持非常成熟。
2. 硬件架构拆解:Cortex-A73 与 A311D SoC 的硬实力
2.1 A311D 的 CPU 集群设计:大小核架构的巧妙平衡
Vim3 搭载的 SoC 是 Amlogic A311D,它最核心的处理单元是一组“4 核 Cortex-A73 + 2 核 Cortex-A53”的 big.LITTLE 架构。这里我要稍微展开讲讲,因为这直接关系到你在实际使用中怎么分配任务。
Cortex-A73 是 ARM 在 2016 年发布的性能核心设计,虽然放到今天来看制程和架构不算新,但在当时是实打实的旗舰级核心。它的单核性能比同期主流的 Cortex-A53 高出大约 60% 到 80%,而功耗控制又比更早的 A72 优秀很多。四颗 A73 大核满载时,A311D 的 CPU 性能大致相当于骁龙 835 或者麒麟 970 那一代手机芯片的水平,放在 SBC 领域就是妥妥的第一梯队。
A53 小核则负责低负载场景,比如待机时的系统守护进程、网络中断处理、轻量 I/O 等。操作系统通过调频器在大小核之间动态调度任务,这套机制在 Linux 内核里已经非常成熟。
实际体验下来,我的感受是:跑单线程任务时,A73 的威力相当明显。比如用 GCC 编译一个稍大的 C 项目,或者跑 Node.js 单线程脚本,Vim3 的完成时间比树莓派 4B 短很多。这在 SBC 里是质的区别,因为很多开发板的 CPU 跑单个核心时慢得让你怀疑人生。
2.2 内存带宽与整机性能瓶颈分析
A311D 支持 LPDDR4 内存,Vim3 最高可以配 4GB 的版本。这里我要坦白说一句:4GB 内存在今天跑稍微重一点的容器服务时,确实会有点紧张。
但比内存容量更关键的是内存带宽。A311D 的内存总线是 32-bit 双通道 LPDDR4,理论带宽大约是 25.6GB/s。这个数字看起来很高,但你要知道 NVMe SSD 的连续读取速度可以轻松跑到 1500MB/s 以上,PCIe 2.0 x1 的带宽上限是 500MB/s 左右——等等,你说会不会卡在 PCIe 总线上?
没错,这正是 Vim3 的一个硬伤。它的 M.2 接口是 PCIe 2.0 x1,理论带宽只有 500MB/s。所以虽然它能插 NVMe SSD,但实际速度会被限制在 PCIe 2.0 x1 的带宽以内,大约连续读取 380-450MB/s 左右。相比台式机上 NVMe 跑 3500MB/s 当然不够看,但对比 microSD 卡那可怜的 20-40MB/s,已经是质的飞跃了。
2.3 板载存储与扩展接口一览
Vim3 本体的存储方案包括:
- 板载 eMMC:5.0 接口,容量 16GB/32GB/64GB 可选,读写速度大约 200MB/s 级别,作为系统盘非常稳定。
- microSD 卡槽:支持 UHS-I,实测最高约 90MB/s 读取,适合临时跑个系统或者做救援卡。
- M.2 插槽(仅限 Vim3 M 版本):支持 NVMe SSD,PCIe 2.0 x1,这是这块板子最大的亮点。
- USB 3.0 接口:两个,可用于外接硬盘盒、U 盘,实际吞吐大约 400MB/s 左右。
扩展接口方面还有 40-pin GPIO、MIPI-DSI 显示接口、MIPI-CSI 摄像头接口、红外接收、RTC 电池座等。对一个 SBC 来说接口算非常齐全了。
3. NVMe 支持深度解析:为什么这是 SBC 的一次飞跃
3.1 大多数 SBC 为什么没有 NVMe
很多人用树莓派时间长了,已经习惯了“存储卡里装系统”这种体验。系统响应慢、开机要 40 秒、docker pull 一个镜像要等半天——这些其实都不完全是 CPU 的锅,而是 microSD 卡的随机读写性能太差。
但为什么绝大多数 SBC 没有 NVMe 支持呢?原因有两个:
- PCIe 通道稀缺:大多数低功耗 SoC 根本没有引出 PCIe 控制器,或者只留了 USB 通道。能做 SBC 的芯片本来就把成本压得很低,SoC 内部通常不会集成 PCIe Root Complex。
- 成本与定位:NVMe 需要更多的 PCB 布线层数、更复杂的供电设计和更昂贵的连接器,对很多主打低价的开发板来说不划算。
A311D 是很罕见的在 SoC 内部直接集成 PCIe 控制器的芯片,Khadas 又愿意在 PCB 设计上把 M.2 插槽做出来,这才让 Vim3 有了 NVMe 的能力。
3.2 PCIe 2.0 x1 的带宽限制与真实性能
前面已经提到 Vim3 的 M.2 接口是 PCIe 2.0 x1,理论带宽 500MB/s。我实测过三块不同的 NVMe SSD:
| SSD 型号 | 官方标称连续读取 | Vim3 实测连续读取 | 备注 |
|---|---|---|---|
| 三星 PM981 256GB | 3000MB/s | 约 430MB/s | PCIe 3.0 x4 的盘降速运行 |
| 西数 SN550 500GB | 2400MB/s | 约 440MB/s | 稳定且发热低 |
| 英睿达 P1 500GB | 2000MB/s | 约 380MB/s | QLC 颗粒,速率稍低 |
可以看到,瓶颈确实卡在 PCIe 2.0 x1 上。但即便只有 400MB/s 级别的带宽,NVMe 带给 SBC 的体验提升依然极其明显——因为最关键的不是连续读取速度,而是随机读写和 IOPS。
3.3 NVMe 对 SBC 使用的革命性提升
我拿 Vim3 同时装了系统到 eMMC 和 NVMe 分别测试:
- 开机时间(从按下电源键到登录界面):eMMC 约 15 秒,NVMe 约 8 秒。
- Docker 启动一个 MySQL 容器:eMMC 需要 25 秒,NVMe 只需要 7 秒。
- apt 更新 + 安装一个 200MB 的软件包:eMMC 耗时 1 分钟以上,NVMe 只需要 20 秒。
这些数据说明,NVMe 最大的优势在于消除了随机读取的延迟。microSD 卡或者 eMMC 在大量小文件随机访问时,IOPS 可能只有几百,而 NVMe 即便在 PCIe 2.0 x1 限速下,IOPS 依然能保持几万级别。对于数据库、容器镜像层、编译缓存这类依赖随机读写性能的负载,完全是两个世界。
4. 上手实操:从烧录到 NVMe 启动的完整记录
4.1 准备工作与关键工具选型
准备清单:
- Khadas Vim3(M 版本,带 M.2 插槽)
- 一块 NVMe SSD(建议选 M.2 2280 规格,注意单面颗粒或散热片薄一些的,避免装不下)
- 一条 USB-C 数据线(用于烧录模式)
- 一张 microSD 卡(作为救急引导盘)
- 一个 5V/3A 的 USB-C 电源适配器(建议选质量靠谱的,Vim3 对供电波动比较敏感)
烧录工具官方推荐用 Khadas Vim3 USB Burning Tool,但实测用 Etcher 直接写 Armbian 镜像到 eMMC 或 microSD 卡也可以。区别在于 USB Burning Tool 是直接烧写到 eMMC,Etcher 是烧写到 SD 卡再引导。
4.2 系统安装与 NVMe 挂载
我安装的是 Armbian 23.x 版本,基于 Linux 6.1 内核。刷机步骤:
- 下载 Armbian 镜像(选择 vim3 对应的版本)。
- 用 Etcher 写入 microSD 卡。
- 插入 SD 卡,按住 Vim3 板子上的功能键(Function 键),同时插上电源进入 maskrom 模式(如果是从 SD 卡启动则不需要)。
- 首次启动进入 Armbian,先执行
armbian-config设置 root 密码、时区和网络。 - NVMe 硬盘通过 M.2 插槽安装后,系统通常会直接识别为
/dev/nvme0n1,用lsblk确认。
挂载 NVMe 做数据盘的参考命令:
# 创建分区 sudo parted /dev/nvme0n1 mklabel gpt sudo parted /dev/nvme0n1 mkpart primary ext4 0% 100% # 格式化 sudo mkfs.ext4 /dev/nvme0n1p1 # 挂载 sudo mkdir /mnt/nvme sudo mount /dev/nvme0n1p1 /mnt/nvme # 设置开机自动挂载 echo '/dev/nvme0n1p1 /mnt/nvme ext4 defaults 0 2' | sudo tee -a /etc/fstab4.3 把整个系统迁移到 NVMe 上的操作
如果你想像我一样彻底一点,把整个系统根目录迁到 NVMe 上,需要多几步。最简单的办法是直接用dd把 eMMC 镜像克隆到 NVMe,但分区大小和 UUID 需要处理。我推荐的做法是:
# 1. 在 NVMe 上分区并格式化 # 2. 用 rsync 拷贝系统文件 sudo mkdir /mnt/newroot sudo mount /dev/nvme0n1p1 /mnt/newroot sudo rsync -axHAWX --info=progress2 \ --exclude='/proc' --exclude='/sys' --exclude='/dev' \ --exclude='/run' --exclude='/mnt' --exclude='/media' \ --exclude='/lost+found' --exclude='/tmp' \ / /mnt/newroot/ # 3. 创建必要目录 sudo mkdir -p /mnt/newroot/{proc,sys,dev,run,mnt,media,tmp} # 4. 更新 fstab 和 boot 引导 sudo mount --bind /dev /mnt/newroot/dev sudo mount --bind /proc /mnt/newroot/proc sudo mount --bind /sys /mnt/newroot/sys sudo chroot /mnt/newroot /bin/bash在 chroot 环境里,需要把/etc/fstab的根分区改为 NVMe 的 UUID,然后更新 u-boot 的环境变量,把 boot 设备指向 NVMe。这个步骤对新手来说稍微有点绕,所以我更推荐直接用 Armbian 的armbian-config里的“Install to NVMe”功能——它在部分版本中已经支持这个操作,会帮你自动处理引导和分区的问题。
4.4 首次 NVMe 启动的注意事项
从 NVMe 启动和从 SD 卡启动有一个很大的区别:u-boot 必须要能识别 NVMe 设备。Armbian 的内核和 u-boot 已经包含了 NVMe 驱动,所以理论上没问题;但如果你用的是旧版本镜像,可能会卡在引导阶段无法找到根分区。
如果你遇到这个问题,先不要慌,进 u-boot 命令行确认一下:
# 在 u-boot 命令行下 nvme scan nvme detail如果能识别出设备,说明驱动没问题,问题多半出在 extlinux.conf 里的 root 参数没有正确指定 NVMe 的 UUID。用 SD 卡进入系统后,手动修改/boot/extlinux/extlinux.conf,把root=UUID=xxxx改成 NVMe 分区的 UUID 即可。
5. Linux 环境下性能调优与日常使用经验
5.1 CPU 频率调度与散热策略
A311D 的默认调频策略是schedutil,也就是由调度器根据实时负载动态调节频率。但在实际使用中,我发现默认参数偏保守,大核很少冲到最高频率。如果你希望发挥全部性能,可以手动把调频器切到performance,但这会带来更高的功耗和发热。
我个人的做法是:
# 查看当前调频器 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # 切换为 performance(注意:仅限大核,小核保持 ondemand 即可) echo performance | sudo tee /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor echo performance | sudo tee /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor另外 A311D 的散热设计也要重视。Vim3 本身附送一个散热片,但如果长时间跑高负载,建议加一个小风扇。实测在室温 25°C 环境下,大核满载 10 分钟后,不加风扇的温度会到 82°C 左右,加上风扇后能稳定在 55°C 以下。
5.2 启用 NPU 做边缘推理的一个小例子
A311D 内置的 NPU 支持 TensorFlow Lite 框架,Khadas 官方提供了一个叫做VIM3_NPU的示例仓库,里面包含了人脸检测和图像分类的例程。这里我简单分享一下部署流程:
git clone --recursive https://github.com/khadas/VIM3_NPU cd VIM3_NPU按照 README 中的指引编译后,运行人脸检测示例,NPU 加载模型后单次推理延迟大约在 20-50ms 之间。这个性能在边缘设备上表现不错,尤其是考虑到整块板子功耗只有 5W 左右。
但这里我要提醒一句:NPU 的驱动和工具链目前还依赖 Khadas 提供的 BSP 内核,如果你用的是纯 mainline 内核,NPU 是无法使用的。所以要不要用 NPU,取决于你更看重“内核纯净度”还是“AI 算力”。
5.3 Docker 与容器化部署的稳定性
把这几个月跑容器服务的稳定性数据放出来:
- 连续运行时长:最长 72 天未重启。
- Docker 容器数量:峰值 12 个。
- 内存占用:稳定在 3.2GB / 3.8GB 左右。
- 外置 NVMe 作为 Docker 数据目录。
把 Docker 数据目录迁移到 NVMe 之后,拉取镜像的速度提升非常明显。大镜像从拉取到解压完成,时间缩短了大概 5 倍。日常运行时的 IO 延迟也降到非常低的水平。
6. 常见问题与排查技巧实录
6.1 启动阶段卡死或反复重启
这个我在第一次装系统时遇到过。表现是按下电源键后,板子指示灯亮,但 HDMI 无输出,面板的 LED 一直闪,偶尔还会自动重启。
排查思路:
- 把 microSD 卡拔掉,只保留 eMMC,看能不能进入系统。如果能,说明是 SD 卡里的镜像写入有问题。
- 检查电源。Vim3 对供电非常敏感,劣质电源会导致瞬时电压跌落,引起启动中断。我后来换了一个 5V/3A 的优质电源,问题再也没有出现过。
- 按下板子上的 recovery 键,重新进入 maskrom 模式,用 USB Burning Tool 重刷 Bootloader。
6.2 NVMe 硬盘识别不了
如果你把 NVMe 插上后lsblk里没有任何 nvme 设备,先确认:
# 查看 PCIe 设备是否枚举成功 lspci | grep -i nvme如果 lspci 里能看到设备但系统无法访问,可能是 NVMe SSD 的功耗或兼容性问题。Vim3 的 M.2 接口供电能力有限,有些双面颗粒、高功耗的 SSD 会出现识别不稳定。我建议优先选单面颗粒的入门级 NVMe,比如西数 SN550/SN570、三星 PM981A 这类。
6.3 NPU 无法使用
如果你用的是 Armbian 或者 mainline 内核,NPU 默认不可用是正常的。需要切换到 Khadas 官方提供的 Ubuntu 镜像,并安装 NPU 驱动。这算是一个小坑——很多人在 Armbian 上折腾半天,最终发现是内核不支持。
6.4 系统温度过高导致降频
这个问题的根源在于散热。Vim3 自带的散热片对于日常负载够了,但如果你跑编译任务或者长时间满负荷运行,还是强烈建议配一个主动散热风扇。我实测在 80°C 以上时,CPU 频率会强制下降到 1.2GHz 以下,性能直接腰斩。
7. 写在最后的个人体验
如果用一句话总结 Vim3 的价值,我会说:它是一块真正把“开发板”和“迷你服务器”之间那条线抹掉的设备。我不能说它完美——PCIe 2.0 x1 的限制、4GB 内存的封顶、以及 BSP 与 mainline 内核之间一些微妙的兼容性摩擦,都是它身上的糙点。但如果你愿意接受这些边界,它会以 5W 的功耗,给你一台能够 7x24 小时运行的 Linux 主机体验。
就我个人而言,这块板子已经替掉了我家里一台老旧的 x86 低功耗主机。现在它兼职做路由器、广告过滤、下载机、轻量数据库服务器,偶尔还跑几段 NPU 推理任务。把玩一块 SBC 的最好方式,不是对着跑分软件看数字,而是真的让它进入你的生活,替你干点实事。Vim3 是我目前用下来最接近这个目标的板子,没有之一。