1. 项目概述:为什么Jetson Nano换源是开发第一步?
如果你刚拿到一块Jetson Nano开发板,兴冲冲地开机、联网,准备大展拳脚安装各种依赖库时,大概率会遭遇第一个“下马威”:apt-get update的速度慢如蜗牛,甚至频繁出现连接超时。这并非你的网络问题,而是因为NVIDIA为Jetson系列预置的软件源服务器位于海外,对于国内开发者而言,网络延迟和稳定性成了首要瓶颈。今天要聊的,就是给Jetson Nano“换源”这个看似基础,实则至关重要的操作。
所谓“换源”,就是将系统默认的软件下载地址,从海外的官方服务器,替换为位于国内的镜像服务器。这能带来立竿见影的效果:软件包下载速度从每秒几KB飙升到几MB甚至几十MB;系统更新、软件安装的成功率大幅提高;整个开发环境的搭建效率成倍提升。无论是安装Python包管理工具pip、深度学习框架PyTorch/TensorFlow,还是更新系统内核、安装桌面环境,都离不开一个稳定高速的软件源。
对于Jetson Nano这样的边缘计算设备,其基于ARM架构的Ubuntu系统(通常是Ubuntu 18.04),使得很多常规的x86平台软件源无法直接使用。因此,寻找并配置一个兼容ARM64架构的国内镜像源,就成了所有Jetson开发者必须掌握的核心技能。这个过程不仅仅是改几个配置文件那么简单,它涉及到对Linux软件源机制的理解、对系统文件权限的操作,以及更新失败后的排查能力。接下来,我将带你一步步完成从备份到验证的完整流程,并分享我在这几年折腾Jetson设备中积累的独家避坑技巧。
2. 核心思路与方案选型:为何选择清华源?
给Ubuntu系统换源,本质上就是修改/etc/apt/sources.list这个文件。但Jetson Nano的源配置有其特殊性,不能简单照搬树莓派或普通PC的Ubuntu源。
2.1 理解Jetson Nano的源构成
Jetson Nano的系统源主要包含两部分:
- Ubuntu官方源:提供基础的Linux系统软件包,如
vim,git,curl等。 - NVIDIA Jetson专属源:提供NVIDIA的GPU驱动、CUDA工具包、TensorRT、多媒体API等核心组件。这部分是Jetson设备发挥其AI算力的关键,绝对不能缺失或配置错误。
默认的sources.list文件里,Ubuntu官方源的地址是ports.ubuntu.com(针对ARM端口),而NVIDIA源地址是repo.download.nvidia.com/jetson。我们的目标是将ports.ubuntu.com替换为国内的镜像站,同时确保NVIDIA源保持原样或也能找到可用的国内镜像(如果有的话)。
2.2 国内镜像源选型分析
国内主流的Ubuntu镜像源有清华大学TUNA、阿里云、中科大等。对于Jetson Nano的ARM64架构,需要特别确认该镜像站是否同步了ubuntu-ports仓库(这是为ARM、PowerPC等非x86架构准备的仓库)。
根据我的长期使用经验,清华大学开源软件镜像站(TUNA)是最佳选择,原因如下:
- 架构支持完整:明确同步了
ubuntu-ports仓库,对ARM64支持良好。 - 同步及时性:与Ubuntu官方源的同步延迟通常在几小时之内,能及时获得安全更新和软件更新。
- 稳定性与速度:作为老牌镜像站,带宽充足,国内各地访问速度都很快,连接稳定。
- 文档清晰:其官方帮助页面提供了针对不同Ubuntu版本和架构的详细配置示例,不易出错。
相比之下,虽然阿里云镜像速度也很快,但其对ubuntu-ports仓库的同步状态和路径有时不如清华源清晰,对新手不够友好。中科大源也是不错的选择,但综合文档和社区反馈,清华源依然是首选。
注意:NVIDIA Jetson专属源目前没有官方的国内镜像。幸运的是,这部分源所需的软件包体积通常不大(主要是索引和增量更新),且NVIDIA的服务器对国内连接尚可,所以我们可以保留其原始地址。我们的优化重点在于占日常下载流量90%以上的Ubuntu官方源。
2.3 操作前的关键准备
在动手修改之前,必须做好两件事:
- 备份原始源文件:这是系统维护的黄金法则。执行
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup。万一新源配置错误导致系统无法更新,我们可以随时用备份文件恢复。 - 获取当前系统版本代号:执行
lsb_release -cs命令。对于最常见的Jetson Nano 4GB/2GB版本,出厂系统通常是Ubuntu 18.04,其版本代号为bionic。后续替换源地址时,必须使用正确的代号,否则会导致软件包版本混乱。
3. 详细操作步骤:手把手更换清华源
现在,我们进入实操环节。请通过SSH或直接接上显示器键盘,在Jetson Nano的终端中操作。
3.1 备份与编辑源文件
首先,创建备份,这是你的“后悔药”。
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup然后,使用nano或vim编辑器打开源文件。我习惯用nano,对新手更友好。
sudo nano /etc/apt/sources.list打开后,你会看到以deb http://ports.ubuntu.com/开头的多行内容。这些就是需要替换的部分。
3.2 替换为清华大学镜像源
接下来,我们需要将这些行中的http://ports.ubuntu.com/ubuntu-ports/替换为https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/。
这里有一个至关重要的技巧:不要手动一行行修改,容易出错。我们可以使用sed流编辑器进行全局替换。先关闭编辑器(按Ctrl+X,如果提示保存选No),然后在终端执行以下命令:
sudo sed -i 's|ports.ubuntu.com/ubuntu-ports/|mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/|g' /etc/apt/sources.list这条命令的-i参数表示直接修改原文件,s|A|B|g表示将文件中所有的A替换为B。
替换完成后,再次用sudo nano /etc/apt/sources.list打开文件检查。修改后的行应该类似这样(以bionic为例):
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse请务必确认:
- 协议从
http变成了https(清华源支持且推荐HTTPS)。 - 域名已正确替换。
- 版本代号
bionic与你系统查询的结果一致。 - NVIDIA相关的源行(通常包含
repo.download.nvidia.com)保持原样,没有被修改。
3.3 更新软件包列表缓存
源地址修改完成后,需要让系统重新获取新的软件包列表信息。
sudo apt-get update这个命令本身不会安装或更新任何软件,它只是从新的镜像源下载软件包的索引信息到本地。如果配置正确,你会看到大量的Hit(命中)和Get(获取)信息,速度相比之前会有质的飞跃。如果看到Ign(忽略)或Err(错误),则说明对应的源行配置有问题,需要回头检查。
4. 系统更新与升级:让环境保持最新
换源成功后,就可以畅快地进行系统更新了。在Linux中,update、upgrade、dist-upgrade这几个命令各有含义,不能乱用。
4.1 更新与升级的区别
sudo apt-get update:我们刚执行过。只更新本地软件包索引,不改变系统已安装的任何软件。sudo apt-get upgrade:根据本地已更新的索引,升级所有已安装的软件包到最新版本。这个操作是安全的,它不会安装新包,也不会删除已有的包。sudo apt-get dist-upgrade:一个更“激进”的升级。它不仅会升级软件包,还会智能地处理新版本软件带来的依赖关系变化,可能会安装新的依赖包或删除过时的包。在跨次版本号升级(如从18.04.1到18.04.6)时常用。
对于Jetson Nano,在完成换源后,我推荐的标准化更新流程是:
sudo apt-get update sudo apt-get upgrade -y-y参数表示自动对所有提示回答“是”,避免交互式操作。第一次升级时,由于需要下载的包很多,换源的优势将体现得淋漓尽致。
4.2 深度清理与自动维护
系统运行一段时间后,apt会积累很多已下载的旧版本软件包(.deb文件),它们存放在/var/cache/apt/archives/目录下,占用宝贵的存储空间。对于仅有16GB eMMC存储的Jetson Nano来说,定期清理至关重要。
sudo apt-get autoremove -y # 删除为了满足依赖而自动安装,但现在不再需要的软件包 sudo apt-get autoclean # 删除本地仓库中已过时(无法再下载)的软件包缓存 sudo apt-get clean # 删除所有已下载的软件包缓存(最彻底,下次安装需重新下载)我通常每月执行一次autoremove和autoclean。只有在存储空间告急时,才使用clean命令。
5. 扩展配置:pip与Docker的镜像加速
仅仅更换了系统源还不够。在AI开发中,我们频繁使用pip安装Python包,使用Docker拉取镜像。它们的默认源同样在海外,需要单独配置加速。
5.1 配置pip国内镜像源
Python的包索引PyPI在国内访问很慢。为当前用户配置清华的PyPI镜像:
mkdir -p ~/.pip nano ~/.pip/pip.conf在文件中写入以下内容:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn保存退出。这样,之后所有pip install命令都会从这个镜像站下载,速度极快。
5.2 配置Docker镜像加速器
Docker拉取ubuntu、python等基础镜像,以及nvidia/cuda等深度学习镜像时,速度是另一个痛点。我们需要修改Docker守护进程的配置。
首先,编辑Docker的配置文件(如果不存在则创建):
sudo nano /etc/docker/daemon.json输入以下内容。这里我推荐使用阿里云容器镜像服务提供的加速地址,需要免费注册后获取专属加速器地址。以下是一个示例格式:
{ "registry-mirrors": ["https://your_id.mirror.aliyuncs.com"] }保存后,重启Docker服务使配置生效:
sudo systemctl daemon-reload sudo systemctl restart docker之后,使用docker pull拉取镜像时,速度会有显著提升。
6. 常见问题与深度排查指南
即使按照步骤操作,你也可能会遇到一些问题。这里我整理了最常遇到的几个“坑”及其解决方案。
6.1 更新时出现“Hash校验和不符”或“404 Not Found”错误
问题现象:执行sudo apt-get update时,针对某一行源出现Hash Sum mismatch或404错误。原因分析:
- 镜像站同步延迟:你访问的镜像站可能尚未与官方源完全同步,导致本地索引文件与服务器上的软件包不匹配。
- 源地址或版本代号错误:
sources.list文件中的Ubuntu版本代号(如bionic)写错了,或者镜像站路径不完整。 - 网络瞬时问题:下载过程中网络波动导致文件损坏。
解决方案:
- 等待并重试:如果是同步延迟问题,等待几小时或半天后再运行
sudo apt-get update。 - 仔细核对源文件:再次用
cat /etc/apt/sources.list检查,确保每一行Ubuntu源的地址都是https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/,并且代号正确。一个常见的错误是把bionic写成了bionic-updates作为代号。 - 清除本地缓存:有时本地缓存索引损坏也会导致此问题。运行
sudo rm -rf /var/lib/apt/lists/*清除所有列表缓存,然后再次sudo apt-get update。这是一个比较彻底的方法。 - 尝试备用镜像:如果清华源持续有问题,可以暂时换用中科大源。将地址替换为
https://mirrors.ustc.edu.cn/ubuntu-ports/后重试。
6.2 更新后出现“无法定位软件包”错误
问题现象:执行sudo apt-get install <package-name>时,提示Unable to locate package。原因分析:
- 未更新缓存:修改源后,没有运行
sudo apt-get update,系统还在使用旧的、无效的软件包列表。 - 软件包名称错误:拼写错误,或者该软件包在你配置的源中确实不存在。
- 架构不匹配:你要安装的软件包可能没有ARM64(aarch64)版本。
解决方案:
- 确保已执行update:这是最基本的步骤。
- 使用apt search:如果不确定包名,可以用
apt search <keyword>进行模糊搜索。 - 检查多架构支持:对于Jetson Nano的ARM架构,一些闭源或小众软件可能只提供x86版本。在安装前,可以去Ubuntu官方软件包网站或软件官网查看是否支持ARM。
6.3 Jetson专属源更新缓慢或失败
问题现象:在update时,来自repo.download.nvidia.com的源更新很慢或超时。原因分析:这是网络跨境连接的问题,非配置错误。解决方案与取舍:
- 耐心等待:NVIDIA源本身不大,慢一点通常也能完成。
- 使用代理:如果你有稳定的网络代理环境,可以为
apt配置代理。但这属于网络优化范畴,且需注意合规性,此处不展开。 - 选择性禁用(不推荐):极端情况下,可以临时注释掉NVIDIA源(在行首加
#),先完成Ubuntu部分的更新。但完成系统主要更新后,必须取消注释,否则你将无法获得关键的JetPack组件更新和安全补丁,影响CUDA、TensorRT等核心功能。
6.4 系统升级(dist-upgrade)的风险与预防
重要警告:对于Jetson Nano,我不建议轻易执行sudo apt-get dist-upgrade,尤其是跨大版本(如从18.04到20.04)。风险:dist-upgrade可能会升级内核和核心驱动。NVIDIA的JetPack SDK(包含驱动、CUDA等)是与特定的内核版本深度绑定的。未经NVIDIA官方确认的自动内核升级,极有可能导致GPU驱动、CUDA无法正常工作,甚至系统无法启动。最佳实践:
- Jetson系统的重大更新,应遵循NVIDIA官方发布的JetPack SDK升级指南,通常是通过NVIDIA SDK Manager进行刷机或OTA升级,这能保证系统组件间的兼容性。
- 在日常维护中,使用
sudo apt-get upgrade更新用户空间软件即可,这通常是安全的。
7. 进阶技巧与维护心得
分享几个我长期使用Jetson Nano总结出来的经验,这些在官方文档里很少提到。
7.1 使用apt-fast工具加速下载
apt-fast是一个封装了axel或aria2多线程下载器的脚本,可以大幅提升apt-get install的下载速度。安装和配置如下:
sudo apt-get install axel -y sudo add-apt-repository ppa:apt-fast/stable sudo apt-get update sudo apt-get install apt-fast -y安装过程中会交互式地询问一些配置,通常一路回车选择默认值即可。之后,你就可以用sudo apt-fast install <package>代替sudo apt-get install,体验多线程满速下载的快感。
7.2 监控系统更新与存储空间
Jetson Nano存储空间小,需要精打细算。我习惯使用以下命令组合来监控:
df -h / # 查看根目录存储使用情况 apt-get -s upgrade | grep "^Inst" | wc -l # 模拟升级,查看有多少包可更新 du -sh /var/cache/apt/archives/ # 查看apt缓存占用了多少空间将这些命令写成一个简单的脚本,定期运行,可以有效防止存储空间在不知不觉中被占满。
7.3 创建系统配置快照
在系统配置得比较稳定、满意的时候(比如换源完成、基础开发环境装好),建议使用apt-clone工具创建一个软件包列表快照。
sudo apt-get install apt-clone -y sudo apt-clone clone current-system --with-dpkg这会在当前目录生成一个.tar.gz文件,里面记录了所有已安装软件包的确切版本。当需要在新卡或重置的系统上快速恢复环境时,这个快照非常有用。
给Jetson Nano更换国内镜像源,是打开高效开发大门的第一把钥匙。它解决的是“基础设施”问题,看似微小,却直接影响后续所有环节的体验。整个过程的核心在于细心:备份原文件、确认系统版本、使用正确的镜像地址。一旦配置成功,你会发现之前困扰你的网络问题烟消云散,安装软件、部署模型都变得顺畅无比。记住,一个稳定高效的软件源,是你和你的Jetson Nano成为得力伙伴的坚实基石。