news 2026/9/25 6:18:05

昇腾Atlas 300V推理卡实战:从零跑通YOLO部署全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
昇腾Atlas 300V推理卡实战:从零跑通YOLO部署全流程

Atlas 300V 24G 这张卡,最近在社区里被问得相当频繁,尤其是“它到底算不算运算加速卡”和“能不能拿来跑 YOLO”这两个问题,几乎每次开群都能看到。我上个月正好在一台双路服务器上把这张卡和 YOLOv5 完整跑了一遍,从驱动安装、模型转换到最终出检测框,中间翻了不少车,也把整条链路的逻辑彻底捋清楚了。这篇文章就把这两件事合并到一条线上讲透:先给 Atlas 300V 24G 一个准确的身份定位,再给出从零部署 YOLO 的完整实操路径,最后把那些文档里不写、部署时却一定会撞上的坑全部列出来。

1. Atlas 300V 24G 的身份问题:它到底是不是“运算加速卡”

1.1 先给结论:这是 AI 推理加速卡,不是通用 GPU

直接回答标题那个高频问题:是的,Atlas 300V 24G 就是一张运算加速卡,但准确的说法是“AI 推理加速卡”。它不是 NVIDIA 那种通用图形处理器,核心职责是把已经训练好的神经网络模型高效地跑起来做推断。也就是说,它擅长“计算”,但计算的形态是卷积、矩阵乘、池化这一类 AI 算子,而不是通用图形渲染或任意计算负载。

从硬件血统看,Atlas 300V 系列基于昇腾 310P 处理器。310P 是昇腾边缘与推理产品线里非常成熟的一颗芯片,内置多个 AI Core,支持 FP16、INT8 等精度的推理计算,图像类的 CNN 模型是它的绝对主场。24G 指的是板载内存容量,这也是这个版本最突出的差异点——在推理卡这个品类里,24GB 算是一个相当充裕的配置了。

很多人会把这个“24G”叫成显存,严格说起来它是板载内存,作用和显存类似:存放模型权重、中间特征图和输入输出数据。差异在于它的位宽、带宽和访问模型和 GPU 的 GDDR/HBM 体系不同,但使用方不需要关心这些,只要知道它决定了你能往卡里塞多大规模的数据。

1.2 一张不到几十瓦功耗的卡,能撑起什么场景

这张卡的第二个特点是功耗。整卡功耗基本控制在几十瓦级别,不需要外接辅助供电或者额外的水冷,插到普通 PCIe 插槽就能工作。对比数据中心里动辄 300 瓦往上的训练卡,这个功耗水平意味着两个直接好处:一是服务器原本的电源和散热不用大改,二是长时间跑推理的电力成本低很多。

适用场景上,它最典型的落点是这几类:

  • 安防摄像头视频流分析:海量路数视频的实时目标检测、人脸抓拍。
  • 工业质检:产线相机拍到的图片做缺陷检测,对延迟敏感但对功耗敏感。
  • 智能交通:卡口、电子警察场景下的车辆和车牌检测。
  • 边缘服务器:机房或者路口机柜里做集中式 AI 推理。

一个容易被忽略的点是,这张卡没有显示输出接口,逻辑上也不是给桌面用户用的。它必须搭配一台 x86 或 ARM 服务器,由主机的 CPU 负责加载图片、调度任务,卡本身专职做 AI 算子计算。

1.3 和训练卡、其他推理卡放一起看

昇腾产品线里,训练主要靠 Atlas 800T、300T 这类配备更强算力和更大内存带宽的卡,推理则主要是 300I、300V 系列。300I 主打极致低功耗,300V 在算力和显存上更均衡,而 300V 24G 又把内存上限拉高了一截,适合需要大分辨率输入、大 Batch 或者同时驻留多个模型的场景。

我在实际对比 300I 和 300V 时的经验是:如果只是跑一个 640×640 的 YOLOv5s,两者都不会有太大压力;但一旦换成 1280×1280 高分辨率检测小目标,或者想一次并行处理 8 路视频流,24GB 内存的价值就非常明显了。算力决定了单次计算要多久,内存决定了你一次能塞进去多少计算,后者往往才是吞吐量的真正瓶颈。

2. 为什么 YOLO 是 Atlas 300V 上最常见的部署对象

2.1 YOLO 家族的计算特征和 NPU 天然适配

YOLO 是单阶段目标检测算法的典型代表,从 YOLOv5 到 v8、v9、v11,结构不断在变,但核心骨架始终是主干网络加检测头,计算流非常规整:卷积、批归一化、激活、上采样、concat。这种规律性强的网络结构对 NPU 特别友好,因为芯片内部的 AI Core 流水线就是为这类规则算子设计的,算子形状越固定,执行效率越高。

相比之下,一些带复杂动态分支、循环结构或者不规则稀疏操作的模型,在 NPU 上转换时往往会因为个别算子不受支持而失败。YOLO 体系很少遇到这种问题,这也是社区里 YOLO 的 Atlas 部署范例最丰富、踩坑最少的原因。

从实际场景来说,目标检测是边缘和行业智能化里最刚需的能力,YOLO 又是这个领域覆盖面最广的开源算法。两件事叠加起来,就成了“Atlas 300V 部署 YOLO”这个需求量极大的技术话题。

2.2 一张 24G 推理卡和一块 GPU,怎么选

这是个绕不开的问题。我的看法是,决策取决于你手里已有的技术栈和最终要交付的产品形态。

如果你现在的代码库完全是 PyTorch + CUDA,团队对 CUDA 生态非常熟,产品迭代节奏快、算法经常变,那老老实实用 GPU 是最省心的。Atlas 的 CANN 工具链虽然这些年进步很大,但在调试便利性、第三方库丰富度上和 CUDA 生态仍有差距。

反过来,如果产品已经定型,推理模型基本冻结,你需要在一个固定功耗和成本预算内大规模铺开推理节点,Atlas 300V 就有很大吸引力。一张卡就能扛住一个复杂检测模型的线上推理负载,功耗低,服务器采购成本远低于配一块高性能 GPU。再加上 INT8 量化后算力翻倍,同样硬件条件下的吞吐量很有竞争力。

我遇到过不少团队是“GPU 做训练,Atlas 卡做线上推理”的架构,这是目前最务实的搭配。训练阶段用熟悉的环境快速迭代,推理阶段上昇腾卡压缩部署成本,两边各取所长。

2.3 24GB 内存为什么在这种场景里很关键

很多人一看到 24G 就以为是要跑特别大的模型,其实推理卡上大内存的意义更多体现在“分辨率”和“并发”上。

拿交通场景举例,一张 3840×2160 的卡口照片里要识别小目标车辆和车牌,直接缩到 640×640 会让小目标的特征几乎消失。常规做法是让模型接受更高分辨率输入,比如 1280×1280 甚至 1920×1080,这时候特征图尺寸会跟着暴涨,对内存的占用是平方级增长。24G 内存在这种场景下就能从容应对。

另一个用法是多模型驻留。工业场景经常需要在同一块卡上轮询多个模型,比如先做目标检测,再对检测到的区域做分类或者关键点定位。24G 可以同时把几个中小模型都加载到卡上,省去了频繁换模型的 IO 开销。

3. 从 PyTorch 权重到跑通推理:完整部署链路拆解

3.1 环境准备:驱动、固件和 CANN 的版本配合

拿到卡之后,第一步不是急着跑模型,而是把环境装对。这一环节的坑密度最高,我见过太多人卡在acl init failed或者Device 0 not found,最后发现是版本不配套。

大体流程是这么几步:

  1. 操作系统准备。一般用 Ubuntu 18.04/20.04/22.04 LTS,内核版本和架构(x86_64 或 aarch64)要提前确认,下载安装包时按架构选对应的版本。
  2. 安装固件和驱动。昇腾官网下载对应型号的Ascend HDK软件包,执行类似./Ascend-hdk-xxx.run --full --install的安装命令,按提示重启或者重新加载模块。
  3. 安装 CANN 工具包。这个是开发推理程序的软件栈核心,包含 ATC 模型转换工具、AscendCL 推理库、各种算子库。安装文件名类似Ascend-cann-toolkit_x.x.x_linux-aarch64.run。
  4. 设置环境变量。安装完成后执行source /usr/local/Ascend/ascend-toolkit/set_env.sh,把它写进.bashrc,否则后面命令全找不到。

装完先别急着下一步,用npu-smi info确认系统能识别到卡。这个命令会列出卡的槽位、芯片型号、内存占用和当前算力,还能看到昇腾 SoC 的版本号,后面模型转换时要用。

版本匹配是整个环境准备里最需要留意的。驱动、固件和 CANN 三者之间有严格的兼容矩阵,官网会给出对应关系表。我的建议是直接选官网列出的当前推荐组合,不要追求最新版,也不要混搭。上次我就因为驱动装了新版但 CANN 还在旧版,导致 ATC 转换出来的模型在推理时报算子不兼容,排查了大半天,最后核对兼容矩阵才发现是版本错位的问题。

3.2 模型导出:从 PyTorch 到 ONNX 的关键细节

环境就绪后,开始准备模型。我以 YOLOv5s 为例,它在 Atlas 部署的社区案例最多,其他 YOLO 变体的逻辑几乎相同。

YOLOv5 官方仓库自带导出脚本,一条命令就能得到 ONNX:

python export.py --weights yolov5s.pt --include onnx --opset 11

这里有两个细节必须注意。

第一是 opset 版本。ATC 在不同 CANN 版本下支持的 ONNX opset 上限不一样,我一般用 11,兼容性最好。有些新 YOLO 模型导出时默认用了更高的 opset,就会出现转换时算子不支持的问题。

第二是输入形状。导出时如果用了--dynamic,得到的 ONNX 输入是动态维度,这虽然对 PyTorch 生态友好,但在昇腾上意味着后面 ATC 要做动态 Shape 配置,复杂度明显提升。第一次跑通链路,我强烈建议固定输入尺寸,比如640×640,后续优化再考虑动态。

导出完成后,用onnx.checker或者直接可视化看一眼网络结构,确认输入节点的名称和形状。YOLOv5 默认的输入名通常是images,后面 ATC 命令里要用到。

3.3 ATC 转换:从 ONNX 到 OM 离线模型

拿到 ONNX 文件后,用 ATC 工具转换成昇腾的 OM 离线模型。命令大概长这样:

atc --model=yolov5s.onnx \ --framework=5 \ --output=yolov5s_om \ --input_shape="images:1,3,640,640" \ --soc_version=Ascend310P3 \ --output_type=FP16 \ --insert_op_conf=aipp.cfg \ --log=error

逐个解释一下参数:

  • --framework=5:表示输入是 ONNX 格式。这个数字必须准确,填错了工具都找不到模型。
  • --input_shape:固定输入维度,格式是“输入节点名:batch,通道,高,宽”。这里要和导出时完全一致。
  • --soc_version:指定目标芯片型号。用npu-smi info查到的实际型号填,比如 Atlas 300V 24G 一般是Ascend310P3。
  • --output_type:模型计算精度,FP16 能显著提升速度,代价是精度略有损失。目标检测任务一般无所谓,跑分类任务时要多验证。
  • --insert_op_conf:插入 AIPP 预处理配置,后面我会专门讲。
  • --log=error:只输出错误日志,正常转换时不会刷屏。

转换成功后会生成.om文件,这就是最终在卡上直接运行的模型格式,部署时只需要带上这个文件,不再依赖 PyTorch 环境。

常见失败场景我列一下:一是soc_version填错,工具直接报不支持;二是 ONNX 里有 ATC 不支持的算子,这种要么调低 opset,要么在导出时把网络做裁剪;三是输入 Shape 对不上,报维度不匹配。报错信息里一般都会给出具体算子和位置,顺着日志查就行。

3.4 pyACL 推理代码:几十行代码跑通一次预测

模型转换完成后,写推理程序。昇腾提供了 C++ 的 AscendCL 接口和 Python 的 pyACL,对快速验证来说 pyACL 足够了。

整个程序的核心流程是:初始化、加载模型、准备输入输出、执行推理、拿到结果。骨架如下:

import acl import numpy as np # 初始化设备 acl.init() acl.rt.set_device(0) context, ret = acl.rt.create_context(0) # 加载 OM 模型 model_id, ret = acl.mdl.load_from_file("./yolov5s_om.om") model_desc = acl.mdl.create_desc() acl.mdl.get_desc(model_desc, model_id) # 查询输入输出信息 num_inputs = acl.mdl.get_num_inputs(model_desc) num_outputs = acl.mdl.get_num_outputs(model_desc)

接着是把预处理好的图像数据拷进设备内存,然后调用执行接口:

input_data = preprocess_image(image_path) # 返回 np.float32 数组,形状 1,3,640,640 input_ptr = acl.util.np_to_ptr(input_data) # 将数据拷贝到设备内存 input_mem_size = input_data.nbytes input_dev_ptr, ret = acl.rt.malloc(input_mem_size, 2) acl.rt.memcpy(input_dev_ptr, input_mem_size, input_ptr, input_mem_size, 1) # 构造输入输出 dataset input_dataset = create_dataset(input_dev_ptr, input_mem_size, input_shape) output_dataset = create_output_dataset(model_desc) # 执行推理 ret = acl.mdl.execute(model_id, input_dataset, output_dataset)

执行完成后,把输出从设备内存拷回主机,就能拿到网络的原始输出张量。YOLOv5s 的输出形状通常是1×25200×85,25200 是三个尺度特征图上的预测框总数,85 是 4 个坐标、1 个目标置信度加上 80 类分类分数。后续的解码和 NMS 就在主机侧用 numpy 完成。

这个骨架看着简单,实际写的时候最容易出错的地方在输入输出内存的对齐和 Dataset 结构构造上。我建议第一次就参考官方样例里的工具函数,不要自己从零造轮子。

4. 帧率背后的三方博弈:预处理、NMS 和 Batch

4.1 AIPP:让硬件吃掉图像预处理

很多人部署 YOLO 到 Atlas 卡时,会忽略 AIPP,把缩放、归一化全部放在主机上用 Python 做。这样做能跑通,但白白浪费了卡上硬件的预处理能力。

AIPP 的作用是在模型推理之前,由芯片内部的图像处理单元完成像素格式转换、缩放、通道顺序调整、均值和缩放因子计算。主机只需要把原始图像数据传给卡,剩下的处理全部在卡上完成,省去了主机和设备之间来回搬运的额外开销。

配置方式是在 ATC 转换时传入一个配置文件,内容类似这样:

aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_h: 640 src_image_size_w: 640 csc_switch: true rbuv_swap_switch: false mean_chn_0: 0 mean_chn_1: 0 mean_chn_2: 0 min_chn_0: 0.003921569 min_chn_1: 0.003921569 min_chn_2: 0.003921569 }

这里mean_chn_*是均值,min_chn_*实际充当缩放因子。YOLOv5 需要把像素值从 0-255 归一化到 0-1,所以均值填 0,缩放置为1/255≈0.003921569。如果模型训练时用了 ImageNet 那套均值和标准差,就按对应数值填。AIPP 的具体字段在不同 CANN 版本下略有差异,我第一次配置时被min_chn的语义绕晕了,后来翻官方文档里 Caffe 模型适配样例才搞清楚,强烈建议以当前版本配套文档为准。

需要注意的是,AIPP 里的src_image_size_h/w要和输入图像的真实尺寸匹配。如果你的输入图片本身就是 640×640,这没问题;如果图片是 1920×1080,就需要先缩放到固定尺寸。AIPP 支持硬件缩放,但更稳妥的做法是在主机用 OpenCV 做 letterbox,保证送入卡里的尺寸和模型输入一致。

4.2 Decode 和 NMS 放在哪,决定了你的实时性上限

这是我在部署时体会最深的一个点。YOLO 的 OM 模型通常只输出三个特征层的原始预测张量,而把候选框解码和 NMS 留在主机侧用 numpy 完成。这种做法的优点是代码简单、模型转换不容易出错,缺点也很明显:25200 个候选框的数据要从设备内存拷回主机,这一步的 PCIe 传输和主机侧的大规模矩阵运算,在高帧率场景下会成为瓶颈。

更快的做法是让卡上完成解码和 NMS,昇腾有对应的算子,通过融合算子和自定义算子可以实现,但开发成本高,普通团队很难短时间搞定。我的折中方案是分两步走:先用主机侧 NMS 把整条链路跑通,确认模型精度和功能没问题;当需要提升吞吐量时,再针对解码和 NMS 做算子下沉优化。

还有一个实践技巧是减少返回数据量。在 ATC 转换时把不需要的分类分支裁剪掉,或者在主机侧先做置信度阈值过滤,只把高置信度的框进入 NMS,能把主机侧的计算量降一个数量级。YOLOv5 的 25200 个框里,绝大多数分数都低于阈值,没必要全部参与 NMS 排序。

4.3 Batch Size 的正确打开方式

最后说 Batch。YOLO 在 Atlas 卡上跑 batch=1 时,单帧延迟看起来不错,但卡上算力没有被充分利用。因为一次推理开始时,AI Core 有一段时间在等待数据填充,batch 越大,等待时间被分摊得越薄,整体吞吐量越高。

实际操作时,把 ATC 的--input_shape改成images:4,3,640,640,然后推理程序里把 4 张图拼成一个 numpy 数组一次性送入。我测试过同一个模型,batch=1 到 batch=4,总吞吐量通常能提升两倍以上,延迟略有增加但可以接受。

24G 内存足够支撑更大的 batch 或者更高分辨率。我的经验是,先用npu-smi info观察推理时内存占用和算力利用率,哪个接近瓶颈就调整哪个。一般目标是把算力利用率提到 80% 以上,这时候卡的性价比才真正发挥出来。

5. 实测参考与排坑记录

5.1 性能指标的合理预期

先做个声明:昇腾推理卡的实测性能受 CANN 版本、模型输入分辨率、batch 大小、是否开启 AIPP、是否量化等因素影响非常大,任何脱离环境的精确数字都不可靠。但根据我自己的测试和社区里多个部署案例的反馈,可以给出一个数量级参考。

在 640×640 输入、FP16 精度、batch=1 的条件下,YOLOv5s 在 Atlas 300V 24G 上的单帧推理耗时通常在十几毫秒到几十毫秒这个区间,换算成帧率大约每秒几十帧。如果开启 INT8 量化,帧率还能明显上浮,但需要做好精度验证。这个数字对绝大多数视频流分析场景都是够用的,因为一路摄像头实际只需要 10-25 帧每秒的检测频率。

要特别提醒的是,以上的“推理耗时”只是卡上计算的时间,不包括图像读取、主机侧解码和 NMS。测端到端延迟时,要把整条链路的时间都算进去,很多人在汇报性能时只说模型推理时间,结果部署到生产环境后发现根本不达标。

5.2 三个最容易翻车的细节

第一个坑是版本错位。驱动装 24.1、CANN 装 7.0、固件停留在老版本,这种组合几乎必然出问题,而且错误信息五花八门,很难定位。解决办法很笨但有效:全部装官方兼容矩阵里推荐的版本组合,装完先跑官方自带的示例程序验证环境。

第二个坑是 ONNX 算子兼容性。新出来的 YOLO 变体往往用了较新的算子,ATC 不一定全部支持。我在转 YOLOv8 时就遇到过ScatterND算子不支持的情况,最后是调整了导出配置、换用较老但兼容的算子实现才解决。遇到算子报错,先看报错信息里的算子名,再去 CANN 算子支持列表里查有没有替代方案,不要一上来就怀疑模型结构。

第三个坑是 letterbox 处理不当。YOLO 系列模型的输入通常是等比缩放后填充的,如果直接把图片拉成 640×640 而不做 letterbox,物体的宽高比会被破坏,检测精度明显下降。这个问题的根因在训练时就是这么处理的,推理时必须要保持一致。我见过太多部署代码里少了这一步,导致模型精度从 mAP 90% 掉到 70% 以下还在那调别的参数。

5.3 24G 内存的调度经验

部署过程中也要留意内存调度。虽然 24G 很大,但如果你同时驻留多个模型,或者用大 batch,内存占用还是会涨得很快。npu-smi info能看到每个进程的内存占用,排查内存泄漏或者规划模型驻留方案时很有用。

还有一个细节:ONNX 模型转换时可以通过--buffer_optimize和相关参数优化内存复用,特别是同时加载多个模型时,降低每个模型的内存峰值能让卡上塞下更多任务。这些参数在文档里有明确说明,但很多人用默认配置跑完就完了,没意识到还有优化空间。

6. 最后说点实际的建议

如果你自己有一块 Atlas 300V 24G,或者正在评估要不要采购,我的建议是这样的:

上手路径别绕弯,先从官方 Ascend ModelZoo 里现成的 YOLO 样例跑通,拿到一个可靠的性能基线,然后再换成自己的模型和数据集。样例工程里的 AIPP 配置、模型转换脚本和解码逻辑都是验证过的,直接在上面改比自己从零写要省非常多时间。

模型转换时固定分辨率、先用 FP16、batch 从 4 开始调,这三条是性价比最高的初始配置。等整体链路稳定了,再考虑 INT8 量化和算子下沉。

关于 24G 内存这个卖点,我的体会是:它不意味着你的模型需要多大,而是给了你很大的调度余量。高分辨率输入、大 batch、多模型驻留、多路视频流,这四个需求的资源都从这块内存里出,容量越大,方案设计时的空间就越大。如果你只是跑一个 640×640 的常规 YOLO,16G 甚至更小的版本就够;但如果你想在边缘服务器上做复杂场景,24G 这一档确实能让你少很多取舍。

最后说一句在踩了无数坑之后总结的话:昇腾这套工具链的成熟度和 CUDA 生态还有差距,但它已经足够支撑真实的生产推理项目,前提是你要把版本管理、转换步骤和性能测试当成正式工程来做,而不是随手跑跑命令。严格按照兼容矩阵搭环境,老老实实分步验证,你会发现 Atlas 300V 24G 在推理场景里是一张性价比相当不错的卡。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 6:16:38

024_温度补偿电路对静态电流的调控

024、温度补偿电路对静态电流的调控 一个让我半夜爬起来改板的静态电流异常 前年做一个电池供电的传感器节点,整机休眠电流要求控制在微安级。常温下测得好好的,整机休眠电流稳定在几微安,心里还挺得意。结果装到户外测试箱里,白天太阳一晒,箱内温度爬到六十多度,电池两…

作者头像 李华
网站建设 2026/9/25 6:14:48

win10下yolov7 tensorrt模型部署

TensorRT系列之 Win10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速部署…

作者头像 李华
网站建设 2026/9/25 6:14:38

OpenCore Legacy Patcher:老Mac macOS续命技术全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 6:14:30

RJ45线序原理与千兆网络物理层实战指南

1. 为什么RJ45线序不是“随便接通就行”的事?你拆过路由器背面那个蓝色塑料卡扣的网线接口吗?手指一按,咔哒一声弹出来——就是它,RJ45。但凡接触过网络设备、布过线、修过电脑、甚至自己装过监控摄像头的人,都见过它。…

作者头像 李华
网站建设 2026/9/25 6:13:55

CorelDRAW下载安装全攻略:版本选择、安装配置与兼容性指南

1. 为什么CorelDRAW至今仍是矢量设计的主力工具聊到矢量设计软件,绕不开的一个名字就是CorelDRAW。不管你是做广告喷绘、包装设计、LOGO绘制,还是排版画册、制作名片,CorelDRAW(圈内人习惯直接叫CDR)几乎是很多设计公司…

作者头像 李华
网站建设 2026/9/25 6:13:41

06 - 开发调试环境搭建(TFTP / NFS / Serial)

文章目录 一、概述 二、形象比喻:三件套工具箱 三、串口调试环境 3.1 硬件连接 3.2 串口终端工具 3.3 U-Boot 中的串口配置 四、TFTP 快速下载内核 4.1 TFTP 工作原理 4.2 Ubuntu 端 TFTP 服务器搭建 4.3 板端 U-Boot 命令 五、NFS 网络根文件系统 5.1 NFS 工作原理 5.2 Ubunt…

作者头像 李华