如果你这几年一直在折腾单板电脑,对Khadas这个品牌应该不会陌生。VIM3是Khadas在2019年底推出的旗舰级SBC,核心用的是Amlogic A311D SoC,4颗Cortex-A73大核加2颗Cortex-A53小核,GPU是Mali-G52 MP4,还带了一颗5TOPS算力的NPU,同时板载M.2接口,可以扩展NVMe SSD。当时市面上能同时给你A73大核和NVMe支持的单板机几乎没有——树莓派4虽然也是高性能路线,但存储主要还是microSD和USB桥接,所以VIM3这套组合在那一代产品里确实算很敢做的。
这篇东西不写参数复读,而是从开箱、接线、装系统、跑分到踩坑的完整记录,重点围绕两件事:这颗Cortex-A73 SoC到底能干什么,以及怎么把NVMe SSD在VIM3上稳定地用起来。如果你刚入手VIM3,或者想在SBC上跑边缘AI、搭个小存储节点、做开发主力机,这篇可以直接照着操作。
1. 先看配置:VIM3为什么能靠A73 SoC撑起旗舰名头
1.1 A311D的架构细节与算力定位
Amlogic A311D不是一颗特别新的芯片,但它的纸面参数放到今天依然能打。A73大核主频最高2.2GHz,A53小核最高1.8GHz,这种大小核架构在单板机上并不多见,大多数SBC用的是全A53或者全A72。A73相比A72,同频性能提升不算夸张,但功耗控制更好,而且A311D本身是12nm工艺,发热情况比很多28nm老平台强太多。
我实测跑openssl speed和7z多线程解压,A73大核拉满的时候性能释放很稳定,六核全开时芯片温度也就70多度,只要配个像样的铝散热片就能压住。相比树莓派4那种动态降频比较激进的做法,VIM3的高频维持能力好不少。
这颗SoC还集成了5TOPS的NPU,型号是Coral Edge TPU同级的产品逻辑,但算力更大。在Linux下可以通过Khadas提供的NN Runtime跑TensorFlow Lite模型,实测一个MobileNet V2分类任务,单张图片推理大概几毫秒,跑YOLOv3 tiny这种轻量目标检测也能到十几帧。这个性能配合NVMe存储,最大的价值在于可以把模型文件、数据集直接放在高速盘上,加载速度比eMMC快好几倍,频繁读写中间结果也不心疼寿命。
还有个容易被忽略的点:A311D支持4K视频硬解,VP9、H.265都能解,配合Mali-G52可以做简单GPU加速。我在上面用FFmpeg软转码1080p视频,六核全开大约能跑到2倍速左右;如果只是做硬解播放,CPU占用率很低。这类多媒体能力加上NPU、高速存储,让VIM3的定位很清晰:它不是给纯极客刷着玩的玩具,而是适合做边缘AI推理设备、小型服务器、媒体中心的综合平台。
1.2 NVMe支持在SBC里的价值
先说结论:SBC上能接NVMe,体验提升比换CPU还明显。以前用树莓派或者老款开发板,系统装在eMMC或者SD卡上,apt update、编译、解压大文件都能明显感到卡顿,尤其是SD卡的随机读写经常只有几MB/s,一跑数据库就完蛋。NVMe SSD接入后,顺序读写随便上400MB/s,随机4K读写也比SD卡高一个数量级,整机的"响应感"会完全不一样。
VIM3板载的M.2接口走的是PCIe 2.0 x1链路,理论带宽5GT/s,折算后单向可用带宽大约500MB/s。这个数值虽然比不上PC上的PCIe 3.0/4.0 x4,但对嵌入式单板机来说已经是质变。它意味着你可以在板子上跑SQLite、跑轻量数据库、做日志采集,甚至把整个rootfs放到NVMe里,体验会非常接近低功耗台式机。
NVMe支持还解决了另一个问题:eMMC容量限制。VIM3板载eMMC一般16GB或32GB,装完系统就剩不多了。挂一块512GB甚至1TB的NVMe SSD,板子就从"开发板"变成了"真·小主机"。我自己的用法是系统放eMMC,所有开发环境、Docker镜像、数据集全部放NVMe,空间和性能都不耽误。
2. 硬件准备:VIM3接NVMe SSD之前要做的几件事
2.1 M.2接口与SSD选型
VIM3的M.2接口在主板背面,走的是PCIe通道,不是SATA。这一点很重要,因为很多刚接触的人会直接把笔记本拆下来的SATA M.2盘插上去,结果发现不识别。这个接口支持的是NVMe协议,选盘时认准"NVMe PCIe"字样,M.2 SATA盘的协议不一样,物理上可能能插进去,但信号完全不兼容。
尺寸方面,VIM3的M.2接口默认支持2242/2260/2280长度,具体要看转接板或支架的固定位。我建议优先选2260或者2280的主流型号,比如西数SN550、三星PM981a、铠侠RC10这类,发热和功耗都比较可控。有些高性能盘(比如PCIe 4.0的旗舰型号)在VIM3上也能用,但会被限制到PCIe 2.0 x1速率,性能和发热完全不成正比,不建议。
实际连接时需要一块转接板,因为VIM3板载的M.2连接器间距和标准M.2插槽不太一样,Khadas官方做过配套的M.2扩展模块,也可以买通用转接板自己飞线,但我不建议后者,信号完整性容易出问题。供电和PCIE信号线看起来就几个针脚,但高速信号对线序、地线屏蔽都有要求,飞线出来的板子经常出现掉盘、速度骤降的问题。直接买配套转接板或者VIM3外壳套件,省心很多。
安装顺序是这样:断电,把转接板固定到VIM3背面的M.2座子上,再把NVMe SSD插到转接板上,拧上铜柱和螺丝。注意SSD是悬空的,别贴在底板上,不然高速读写时热量散不出去。装好之后先别盖外壳,直接通电验证识别,再考虑走线和散热。
SSD固件建议提前在PC上更新到最新版本。有些旧固件的NVMe盘在非x86平台上会有兼容性问题,典型表现是nvme list能看到设备但一读写就报错。我在某块老三星盘上遇到过类似情况,拿到电脑上升级固件后一切正常,省了一堆排查时间。
2.2 电源和散热:跑高速存储前先解决的基础问题
VIM3的供电接口是USB-C,官方推荐5V 2A以上,但我强烈建议再接NVMe SSD后把电源换成5V 3A或支持PD协议的电源。NVMe盘瞬时功耗不低,虽然平均也就2到3瓦,但启动瞬间电流可能到1.5A以上,再加上板子本身的2A,电源余量不够就直接导致两种诡异现象:一种是SSD完全不被识别,另一种是正常用着突然掉盘。这两种我都遇到过,最后换了一个5V 4A的电源才稳。
另外一个注意点是线材。粗壮一点的USB-C线能降压小,杂牌线在2A以上电流时会掉压,可能导致板子不稳定。我试过用一根劣质C2C线,跑测速时频繁死机,换线之后问题消失,这就是典型的供电被线材瓶颈卡住。
散热方面,A311D满载发热不小,NVMe盘也会发热,如果只给SoC装散热不给SSD散热,SSD在长时间写入时会触发温控降速,顺序写直接从400MB/s掉到100多MB/s。我的做法是SoC用带风扇的铝散热器,SSD上面贴一块导热硅脂片再接到金属外壳上,平时外壳温度五十度上下,连续跑fio温度也不会超过75度。
如果你打算长时间开机做服务器,强烈建议别用被动散热外壳。VIM3 + NVMe + 负载跑满,被动散热外壳里面温度会飙到90度以上,对板子和SSD都是慢性损伤。至少要用带主动风扇的外壳,或者干脆裸板放在有风道的地方。
3. 从eMMC到NVMe:系统安装与设备识别实录
3.1 SoC启动流程是什么、为什么固件这么关键
在动手之前,有必要先理解SoC启动流程。A311D上电后,芯片内部固化在ROM里的引导代码会先执行,然后去读取外部存储介质里的引导程序,顺序一般是SD卡、eMMC、USB等。这就是为什么VIM3插着SD卡时会优先从SD卡启动,拔掉SD卡才会走eMMC。引导程序通常分两个阶段:第一段初始化DDR和基础时钟,第二段加载U-Boot,U-Boot再加载设备树和Linux内核,最后挂载rootfs。
这个流程直接关系到NVMe怎么用。VIM3的官方U-Boot默认是支持PCIe初始化的,但在某些老版本固件里,NVMe设备需要在U-Boot阶段就被枚举出来,才能作为启动介质。如果你只想把NVMe当做数据盘,那么U-Boot阶段不需要做任何特殊配置,内核起来之后能看到设备就行。如果想从NVMe启动,就得确认U-Boot版本和设备树里有没有nvme节点,这个放到后面第5部分展开。
我建议新手第一步先把系统装到eMMC里,NVMe作为数据盘用。这样做的好处是系统启动链路最简单,出问题也好排查,不会出现U-Boot找不到rootfs导致板子变砖的情况。等eMMC里的系统稳定了,再考虑要不要把rootfs迁到NVMe提升IO。
3.2 烧录系统并确认内核识别NVMe
具体操作:去Khadas官方Docs下载VIM3对应的Ubuntu固件,用提供的烧录工具通过USB烧录,或者用我习惯的方法——把镜像写入一张microSD卡,插卡上电后按住板上的功能键进入升级模式,用kflash或者balenaEtcher直接写卡。官方固件自带桌面环境,开机就是图形界面,适合新手。
系统起来后,先打开终端确认内核版本和NVMe设备是否被识别:
uname -a lsblk lspci -nnk | grep -i nvme dmesg | grep -i nvmelsblk里如果出现nvme0n1,说明内核已经识别到NVMe设备。lspci能看到类似Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller的信息。如果这两个结果都没有,先检查U-Boot里PCIe是否初始化成功,可以重启进U-Boot命令行执行pci enum,再输入nvme scan,能看到SSD说明硬件链路没问题,问题出在固件没有把PCIe资源传给内核。
很多人在这一步发现内核根本找不到NVMe,最直接的原因就是官方固件太老,内核没有启用CONFIG_BLK_DEV_NVME或者设备树里没有PCIe节点信息。解决方案是升级到最新版Ubuntu固件,或者直接用Armbian最新镜像,Armbian的维护者对这类SBC的NVMe支持做得比较积极,我实测VIM3跑Armbian时NVMe即插即用,不需要额外改设备树。
3.3 分区格式化与fstab自动挂载
确认设备识别后,剩下的就简单了。先分区,再格式化,最后设置开机自动挂载。顺序是:
sudo fdisk /dev/nvme0n1新建一个GPT分区表,创建主分区,默认全盘就行。然后格式化成ext4:
sudo mkfs.ext4 /dev/nvme0n1p1不建议用XFS,虽然XFS大文件性能好,但嵌入式板子上的内核模块支持有时不完整,ext4最稳。挂载测试:
sudo mkdir -p /data sudo mount /dev/nvme0n1p1 /data df -h /data能正常看到分区容量就说明读写通了。接着设置分区表让系统开机自动挂载。最稳妥的方式是用UUID,而不是设备名,因为设备名在板子上可能因为枚举顺序变化而改变:
sudo blkid /dev/nvme0n1p1拿到UUID后编辑/etc/fstab,加一行:
UUID=你的UUID /data ext4 defaults,noatime,nofail 0 2这里的nofail参数很关键,它表示即使NVMe盘没有插着,系统也能正常启动,不会因为挂载失败卡在Emergency Mode。我见过很多人在树莓派上挂移动硬盘没加这个参数,偶尔硬盘没插,开机就进错误提示,很烦。加了nofail后,盘在就挂,不在就跳过,安全性高很多。
重启一次系统,mount | grep nvme确认自动挂载成功。到这里,NVMe作为数据盘的工作流就跑通了。
4. 性能实测:PCIe 2.0 x1极限下的NVMe表现
4.1 fio与dd测试数据
装好之后当然要跑个分看看实际水平。我用fio分别测了顺序读、顺序写、随机4K读和随机4K写。测试命令大致是这样:
fio --name=seqread --rw=read --bs=1M --size=2G --ioengine=libaio --iodepth=16 --direct=1 --group_reporting fio --name=randwrite --rw=randwrite --bs=4k --size=1G --ioengine=libaio --iodepth=32 --direct=1 --group_reporting实测数据记录如下,盘是一块入门级NVMe,型号就不点名了:
| 项目 | 数值(MB/s) | 备注 |
|---|---|---|
| 顺序读 | 430 | 接近PCIe 2.0 x1上限 |
| 顺序写 | 368 | 盘本身写速不是顶级,正常 |
| 随机读 4K | 42 | QD32情况下的表现 |
| 随机写 4K | 118 | QD32,写入缓存生效 |
| 延迟 读 | 约90us | 比SD卡低两个数量级 |
顺带用dd测了个直观数据:
dd if=/dev/zero of=/data/testfile bs=1M count=1024 conv=fdatasync写入1GB文件耗时大约2.9秒。这个成绩放到PC上不亮眼,但对比VIM3板载eMMC的顺序写大概只有150MB/s左右,microSD更是只有20到50MB/s,NVMe的优势是一眼就看得出的。
随机4K读只有42MB/s,这个数据很多人会觉得偏低,但这其实是PCIe 2.0 x1的协议开销加上单线程QD深度不够导致的正常表现,并不是掉盘或者兼容问题。VIM3的M.2是单lane链路,没有NVMe多队列优势的完全发挥空间,实际体验中打开应用、读取小文件还是会感觉明显比eMMC流畅。
4.2 带宽瓶颈和SoC调度的影响
PCIe 2.0 x1的理论单向带宽是500MB/s,实测读430MB/s、写368MB/s,已经算把链路吃得很满了。顺序读接近上限,说明SoC侧的PCIe控制器和DMA路径没有太大问题。顺序写偏低主要是SSD本身的写入策略加上A311D的DMA调度,在写方向上会有一些额外开销。
有意思的是,在大文件拷贝时,如果同时让NPU跑推理或者让GPU做渲染,NVMe测速会轻微下降,幅度大概10%到15%。原因是A311D的内存带宽和总线资源是共享的,PCIe DMA和高负载的GPU/NPU争抢内存带宽,导致测速数据波动。使用中规划任务时可以错开峰值:比如白天跑AI推理、晚上做数据备份,可以充分利用硬件资源。
还有一个值得注意的点:direct=1和direct=0的测试结果差别很大。我建议日常挂载时在fstab里加noatime选项,减少文件访问时间更新带来的随机写操作,能明显降低SSD写放大,延长寿命。对于嵌入式场景,这个优化比跑分数字有意义得多。
5. 常见问题与排查技巧:真实踩坑记录
5.1 NVMe设备不识别怎么办
这是最多人遇到的问题。按我的排查顺序来:
- 先看硬件。确认SSD是NVMe协议不是SATA协议,确认转接板插稳了,金手指方向没有反。VIM3的M.2座子旁边有卡扣,推进去之后会咔哒一声,很多新手没推到位,导致接触不良。
- 看U-Boot日志。开机时按串口或者HDMI屏幕上的提示进入U-Boot,输入
pci enum再输入nvme scan,如果能看到设备,说明硬件链路通了,问题在系统固件。 - 看内核日志。
dmesg | grep -i pcie和dmesg | grep -i nvme,如果PCIe枚举正常但NVMe驱动没绑定,检查内核模块modprobe nvme和modprobe nvme_core。 - 换系统固件。这招能解决八成的兼容问题,直接刷最新官方固件或者Armbian最新版,不需要自己编译内核。
还有一个冷门原因:SSD上有数据分区损坏也会导致内核识别异常。我在一块旧盘上遇到nvme0n1: I/O error的报错,进Windows修复过一次分区后插回VIM3就正常了。如果手里的盘以前在别的机器上用过,先备份数据然后重新分区。
5.2 性能不达标、掉盘与休眠问题
性能不达标首先看链路协商速度。NVMe盘在PCIe 2.0 x1下,链路速度和PCIe 3.0盘之间存在兼容协商问题,某些盘可能会协商到PCIe 1.0,速率直接减半。查看方法:
sudo lspci -vvv -s $(lspci | grep "Non-Volatile" | awk '{print $1}')看LnkCap和LnkSta,如果显示Speed 5GT/s, Width x1就是正常的PCIe 2.0 x1。如果显示2.5GT/s,说明协商到了PCIe 1.0,可以尝试在SSD设置里关闭APST电源状态管理,或者换一块盘测试。
掉盘问题九成出在供电上。NVMe盘对电压很敏感,低于5V很多就直接掉。排查方法很简单:用带电压显示的USB电流表看读数,空载时5.1V,接上NVMe后如果掉到4.7V以下,就是电源或线材问题。我甚至试过把VIM3插在电脑前置USB口上测,USB口供5V 0.9A,带NVMe盘基本撑不住。换成独立电源后一切稳定。
休眠问题很隐蔽。默认Linux系统里挂载了NVMe盘,系统进入suspend状态再唤醒后,NVMe盘可能未正确恢复,表现为lsblk能看到设备但df挂载点无响应。解决方法是先避免系统休眠,或者配置休眠前卸载NVMe分区。不需要睡眠的服务器场景,直接禁用系统的suspend:
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target这样板子永不自动休眠,缺点是功耗会增加,但对7x24小时运行来说更省心。
5.3 扩展:把系统rootfs放到NVMe启动
如果你数据盘用得很稳定,可能想更进一步,把整个系统rootfs放到NVMe,彻底摆脱eMMC的IO瓶颈。实测是可以做到的,但有门槛。
大致思路是先把NVMe分好区,格式化成ext4,把现有系统完整复制过去,比如用rsync -aAXv / /data/(要排除/proc、/sys、/dev、/data),然后改U-Boot启动参数,让内核root指向NVMe分区。
VIM3的U-Boot支持nvme scan后直接找到rootfs,但设备树里需要保证PCIe节点在U-Boot阶段初始化正常。新版Armbian的内核和U-Boot对这个支持已经很成熟,直接修改/boot/extlinux/extlinux.conf的root路径为/dev/nvme0n1p1,重启就能从NVMe启动。不过要注意,如果NVMe盘在PCIe枚举时偶尔变慢或者出现链路不稳定,启动阶段可能会失败,所以我实际使用中还是保留eMMC里的备用系统,遇到问题能切换回去。
这样做之后的体感提升很直接:系统启动时间从eMMC的20秒左右降到10秒以内,apt upgrade、Docker容器启动速度都有明显改善,尤其是连续小文件读写的场景,体感差距非常明显。
6. 最后的一点个人体会
把VIM3和NVMe SSD组合起来,是我玩过的单板机里性价比最高的升级手段之一。A311D本身是一颗很有实力的SoC,Cortex-A73大核到现在依然能满足大部分轻量服务器任务,而NVMe的加入让整台板子从"能跑Linux"变成了"用起来舒服的Linux小主机"。如果你手里已经有VIM3,强烈建议配一块转接板和SSD跑起来试试,这个提升不是跑分好看那么虚,而是日常操作流畅度的实打实变化。
我踩过最大的坑就是供电。一开始贪方便用手机充电头,结果跑大活就掉盘,数据丢了两次之后才意识到问题根因,换了正规5V 3A电源后再没出过事。另外就是SSD选型别过分追求旗舰盘,PCIe 2.0 x1把上限卡死了,发热低、功耗小的盘才是嵌入式场景的正确选择。遇到任何看不懂的问题,先看U-Boot日志和内核日志,嵌入式开发里日志永远是第一排查工具。这套组合现在是我的本地开发主力机加轻量NAS,稳定跑了半年没重启过,感觉它还能再战很久。