1. 项目背景与需求分析
最近在ARM架构下进行Docker镜像打包编译时,遇到了一个棘手的问题。我手头正好有一块Jetson Xavier NX开发板,这本该是个完美的解决方案,但实际操作中却遭遇了一系列意外状况。这块开发板原本的系统安装在eMMC存储中,仅有16GB的空间,在编译稍大些的镜像时就捉襟见肘了。
于是我开始尝试将系统迁移到板载的120GB NVMe固态硬盘上。这个想法很合理,毕竟NVMe不仅容量大,速度也快得多。但迁移过程中出现了意外,导致系统完全无法启动,变成了所谓的"砖机"。这迫使我不得不走上刷机之路,而使用虚拟机环境进行刷机又带来了新的挑战。
2. 硬件准备与注意事项
2.1 必备线材选择
刷机过程中,线材的选择往往被忽视,但却是成功的关键。我准备了两种线材:
-
杜邦线:用于连接开发板的恢复模式引脚
- 建议准备至少3-4根母口杜邦线
- 使用前务必测试每根线的导通性
- 推荐使用硅胶包裹的高质量线材,避免接触不良
-
MicroUSB数据线(老安卓线)
- 这是连接开发板与主机进行刷机的关键通道
- 市面上很多MicroUSB线只能充电,无法传输数据
- 建议使用原厂配线或经过验证的数据线
提示:可以先用线材连接手机测试,确认能进行文件传输后再用于刷机
2.2 开发板准备
进入刷机模式需要特定的操作:
- 断开开发板电源
- 用杜邦线短接RECOVERY和GND引脚
- 保持短接状态连接MicroUSB线
- 最后接通电源
这个顺序很重要,如果操作不当,开发板会进入正常启动模式而非刷机模式。
3. 虚拟机环境配置
3.1 虚拟机软件选择
我使用的是VMware Workstation 17.5,这个版本对USB设备的支持已经相当完善。但需要注意:
- 确保安装了最新版的VMware Tools
- 在虚拟机设置中启用USB 3.0控制器
- 将USB兼容性设置为USB 3.1
3.2 Linux系统版本选择
这是最关键的环节之一。我最初尝试了Ubuntu 24.04 LTS,虽然NVIDIA的SDK Manager能够安装,但却无法识别我的Jetson Xavier NX开发板型号,导致无法选择对应的JetPack版本进行刷机。
经过多次尝试,最终确认:
- Ubuntu 18.04 LTS:部分功能已不再支持
- Ubuntu 20.04 LTS:完美兼容
- Ubuntu 22.04 LTS:部分功能不稳定
建议从清华大学开源镜像站下载Ubuntu 20.04.6 LTS版本,这个版本经过验证完全兼容Jetson Xavier NX的刷机需求。
4. 虚拟机USB设备识别问题解决
4.1 常见识别失败原因
当所有硬件和系统都准备妥当后,最令人沮丧的问题就是虚拟机无法识别开发板。经过排查,主要有以下几个原因:
-
USB设备未正确传递给虚拟机
- 在VMware中,需要手动将检测到的USB设备连接到虚拟机
- 设备通常显示为"NVIDIA Corp. APX"或类似名称
-
USB控制器模式不匹配
- 开发板可能需要USB 2.0模式
- 在虚拟机设置中尝试切换USB兼容性版本
-
Linux系统缺少驱动
- 确保安装了
lsusb工具包 - 使用命令
sudo apt install usbutils
- 确保安装了
4.2 详细排查步骤
-
在物理主机上确认设备已被识别:
bash复制
lsusb | grep NVIDIA -
在VMware界面右下角点击USB图标,选择"连接(断开与主机的连接)"
-
在虚拟机中再次运行
lsusb命令确认 -
如果仍不显示,尝试以下命令重新加载USB驱动:
bash复制sudo modprobe -r usbhid sudo modprobe usbhid -
检查USB设备权限:
bash复制ls -l /dev/bus/usb/*
5. SDK Manager配置与刷机流程
5.1 安装SDK Manager
在Ubuntu 20.04上安装SDK Manager的推荐方法:
-
下载.deb安装包:
bash复制
wget https://developer.nvidia.com/downloads/sdk-manager-debian-10-x86_64-1.9.2.10984 -
安装依赖项:
bash复制sudo apt-get install libgconf-2-4 libcanberra-gtk-module -
安装SDK Manager:
bash复制sudo dpkg -i sdkmanager_[version].deb sudo apt-get -f install
5.2 刷机参数配置
启动SDK Manager后,需要特别注意以下配置项:
- 目标硬件选择:Jetson Xavier NX (16GB/8GB)
- JetPack版本:建议选择最新的LTS版本
- 安装选项:
- 勾选"OS"和"SDK Components"
- 开发环境选择"Host Machine"
- 存储设备:选择NVMe而非eMMC
5.3 刷机过程监控
刷机过程通常需要30-60分钟,期间需要注意:
- 保持稳定的网络连接
- 不要断开USB连接
- 观察日志输出中的关键信息:
- "Entering recovery mode"
- "Flashing bootloader"
- "Writing partition"
6. 常见问题与解决方案
6.1 刷机失败处理
当刷机过程中断或失败时,可以尝试:
- 完全断电重启开发板
- 重新进入强制恢复模式
- 清理SDK Manager缓存:
bash复制
sdkmanager --cli --clean
6.2 系统启动问题
刷机成功后若无法启动:
- 检查启动顺序设置
- 确认NVMe硬盘已被正确识别
- 尝试通过串口控制台查看启动日志
6.3 性能优化建议
系统正常运行后,建议进行以下优化:
-
扩展文件系统以使用全部NVMe空间:
bash复制sudo apt install jetson-disk-image-utils sudo jetson-disk-image-utils -u /dev/nvme0n1p1 -
启用ZRAM交换空间:
bash复制sudo systemctl enable zram-config sudo systemctl start zram-config -
安装常用工具:
bash复制sudo apt install tmux htop nvtop
7. 后续开发环境配置
7.1 Docker环境搭建
针对ARM架构的Docker环境配置:
-
安装Docker CE:
bash复制curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER -
配置Docker存储驱动:
json复制{ "storage-driver": "overlay2", "data-root": "/mnt/nvme/docker" } -
安装Docker Compose:
bash复制sudo apt install docker-compose-plugin
7.2 编译环境优化
针对ARM架构的编译优化:
-
设置合适的make参数:
bash复制export MAKEFLAGS="-j$(nproc)" -
使用ccache加速编译:
bash复制sudo apt install ccache export CCACHE_DIR="/mnt/nvme/ccache" export PATH="/usr/lib/ccache:$PATH" -
针对特定CPU优化:
bash复制export CFLAGS="-march=armv8.2-a+crypto+fp16+dotprod -mtune=cortex-a57" export CXXFLAGS=$CFLAGS
经过这一系列折腾,我的Jetson Xavier NX终于重获新生,不仅系统运行在高速的NVMe上,还配置好了完整的Docker编译环境。这次经历让我深刻体会到,即使是看似简单的刷机操作,也需要对硬件特性、系统兼容性和工具链有充分了解。特别是在虚拟机环境下操作嵌入式设备,更需要关注USB设备的传递和识别问题。
