1. 项目概述:为什么Jetson Nano需要“借网”上网?
如果你手头有一块Jetson Nano开发板,并且像我一样,在第一次上电启动后,大概率会面临一个非常现实的问题:怎么让它连上互联网?Nano板载的网口是千兆的,直接插上网线当然是最理想的方式。但在很多开发场景下,比如在工位调试、出差携带,或者网络接口紧张时,身边可能并没有现成的网线或路由器。这时,一个更灵活、几乎零成本的方案就派上用场了——通过USB线,让Nano共享你主力电脑(我们称之为“主机”)的网络,从而访问外网。
这个需求听起来简单,但背后涉及了网络共享、USB设备角色切换(从“设备”到“网络适配器”)以及Linux网络配置等多个层面的知识。我最初也以为就是插上线、改个设置那么简单,结果在配置静态IP、处理DNS、解决共享服务冲突等问题上踩了不少坑。这篇文章,我就把从原理到实操,再到排错的全过程梳理一遍,目标是让你用一根普通的Micro-USB数据线(就是给手机充电那种),在10分钟内,稳定地让Jetson Nano畅游外网。这个方法不仅适用于没有有线网络的环境,对于需要频繁移动开发板的场景,也极大地提升了便利性。
2. 核心原理与方案选型:USB网络共享的几种姿势
在深入命令行之前,我们得先搞清楚几种不同的网络共享方式,以及为什么我们最终选择了“USB网络共享(USB Tethering)”这条路。理解这些,能帮助你在遇到问题时,快速定位到症结所在。
2.1 常见网络连接方式对比
Jetson Nano连接外网,无外乎以下几种方式:
- 有线以太网(最直接):插上网线,配置DHCP或静态IP即可。稳定、高速,是首选。但前提是你得有可用的网口和网线。
- Wi-Fi(最方便):通过USB Wi-Fi适配器连接无线网络。需要额外购买兼容的USB网卡,并在Linux下配置驱动和连接,有一定门槛。
- USB网络共享(最灵活):通过USB数据线,将主机的网络共享给Nano。无需额外硬件,一根线解决网络和供电(部分情况下),非常适合移动开发和快速原型验证。
我们的焦点是第三种。其核心原理是,当通过USB连接时,主机(如你的Windows/Mac/Linux电脑)可以将Nano识别为一个新的网络接口(通常叫RNDIS/Ethernet Gadget)。然后,主机通过操作系统内置的“Internet连接共享”或“网络地址转换(NAT)”功能,将自己已有的网络连接(可能是Wi-Fi,也可能是有线)共享给这个新的USB虚拟网卡。这样,Nano就相当于接入了一个由主机创建的小型局域网,并通过主机的网络出口访问互联网。
2.2 为什么选择USB共享?优势与局限
我选择这个方案,主要是基于以下几点考虑:
- 硬件零成本:只需要一根常见的Micro-USB数据线。几乎所有开发者手边都有。
- 配置一次,随处可用:只要带着你的笔记本和Nano,在任何有网络(甚至是通过手机热点上网)的地方,都能快速为Nano提供网络。
- 同时解决供电(部分型号):对于Jetson Nano Developer Kit(带桶形电源接口的版本),USB线可以同时传输数据和提供部分电力(虽然不足以全功率运行,但用于基础配置和轻量任务足够)。对于Nano 2GB版本(仅Micro-USB供电),这根线更是生命线。
- 稳定的连接:相比某些Wi-Fi环境下的波动,USB连接在物理层上极其稳定,几乎不会出现断连。
当然,它也有局限:
- 速度瓶颈:USB 2.0的理论带宽是480Mbps,实际传输速率会低于此,并且需要与主机共享上行带宽。但对于安装软件包、下载代码、远程登录等开发活动,完全够用。
- 主机必须开机在线:Nano的网络完全依赖于主机。
- 需要主机端配置:需要在你的电脑上进行一些共享设置。
2.3 方案核心:RNDIS与NAT
这里涉及两个关键技术:
- RNDIS:远程网络驱动接口规范。简单说,它让USB设备(这里是Nano)能“伪装”成一块普通的以太网卡,被主机操作系统识别。Jetson Nano的Linux系统内核默认就包含了作为RNDIS设备的功能模块。
- NAT:网络地址转换。这是主机共享网络的核心。主机会为USB虚拟网卡(和Nano)分配一个私有IP地址段(如
192.168.137.x),然后将自己作为网关。当Nano发起对外网请求时,主机会将这个请求的源IP地址“翻译”成自己的公网IP,再将返回的数据“翻译”回给Nano。这样,外网服务器只知道是主机在访问,实现了多设备共享一个公网IP。
理解了这些,后面的配置步骤就不再是机械地输入命令,而是知道每一步在做什么,为什么这么做。
3. 主机端配置详解(以Windows为例)
主机是网络共享的“服务器”,配置好它是第一步。这里以最常用的Windows 10/11为例,macOS和Linux主机的思路类似,但操作界面不同。
3.1 连接设备与驱动安装
首先,用Micro-USB数据线连接你的电脑和Jetson Nano。请确保连接的是Nano上的Micro-USB接口(用于设备模式),而不是USB-A口。
连接后,打开Nano电源。等待一会儿,Windows通常会自动识别并安装驱动。你可以在“设备管理器”中查看。如果一切顺利,你会在“网络适配器”部分看到一个新设备,名称可能包含“Remote NDIS based Internet Sharing Device”或“USB Ethernet/RNDIS Gadget”。
注意:如果设备管理器里该设备显示黄色叹号,提示驱动未安装,你需要手动安装驱动。这通常发生在较旧的Windows系统上。解决方法是:右键点击该设备 -> “更新驱动程序” -> “浏览我的电脑以查找驱动程序” -> “让我从计算机上的可用驱动程序列表中选取”。在列表中选择“网络适配器”,然后在厂商列表选择“Microsoft”,右侧型号选择“Remote NDIS based Internet Sharing Device”。点击下一步完成安装。绝对不要从不明来源下载所谓“RNDIS驱动”,使用系统自带的Microsoft驱动最安全可靠。
3.2 配置Internet连接共享(ICS)
驱动安装好后,这个USB网卡会获得一个由Windows自动分配的IP,比如192.168.137.1。我们需要开启共享:
- 打开“控制面板” -> “网络和 Internet” -> “网络和共享中心”。
- 点击左侧的“更改适配器设置”。
- 在这里你会看到所有网络连接。找到你当前正在连接互联网的那个连接(比如“WLAN”是你的Wi-Fi,“以太网”是你的有线网)。同时,你也能看到新出现的“以太网 2”或“本地连接 *”这样的设备,这就是Jetson Nano的USB网卡。
- 右键点击你正在上网的那个连接(例如WLAN),选择“属性”。
- 切换到“共享”选项卡。
- 勾选“允许其他网络用户通过此计算机的Internet连接来连接”。
- 在“家庭网络连接”下拉菜单中,选择代表Jetson Nano的那个USB网络连接(如“以太网 2”)。
- 点击“确定”。系统可能会提示你,该USB网卡的IP地址将被设置为
192.168.137.1,点击“是”。
至此,主机端配置完成。主机现在扮演了路由器的角色,IP是192.168.137.1,并将为Nano分配同网段的IP(通常是192.168.137.x)。
3.3 验证主机端配置
打开命令提示符(CMD),输入ipconfig并回车。在输出列表中,找到你刚刚共享的那个USB网络连接(比如“以太网 2”),确认其IPv4地址确实是192.168.137.1。这证明共享已生效。
4. Jetson Nano端网络配置
现在,切换到Jetson Nano这边。你需要通过串口终端或者如果之前已经配置好SSH的话进行连接。这里假设你通过串口登录(这是Nano开发最初期最可靠的方式)。
4.1 识别网络接口
登录Nano后,首先查看USB网络接口是否被识别以及它的名称。
ifconfig -a或者使用更新的命令:
ip addr show你会看到多个网络接口。除了本地回环lo,可能还有一个eth0(板载有线网卡)。我们要找的是一个新出现的接口,通常命名为usb0或enp0s20f0u2之类的名字。记下这个接口名,我们假设它为usb0。
如果ifconfig没有显示usb0,但ip addr show里有,可能是工具版本问题,以ip命令为准。如果两个命令都没有,请检查USB连接是否牢固,并回到主机端查看设备管理器是否识别正常。
4.2 配置静态IP地址
由于主机(192.168.137.1)已经固定,我们需要手动给Nano的usb0接口配置一个同一网段的静态IP。这里我们选择192.168.137.100。
在Nano终端中,编辑网络接口配置文件。Ubuntu 18.04/20.04(Jetson Nano默认系统)使用Netplan进行网络管理。
创建或编辑Netplan配置文件:
sudo nano /etc/netplan/01-usb-netcfg.yaml(如果已有类似
01-network-manager-all.yaml的文件,你也可以直接修改它,但为清晰起见,单独创建一个更好管理。)在编辑器中,输入以下内容。请务必将
usb0替换为你实际查看到的接口名。network: version: 2 renderer: networkd ethernets: usb0: # 你的USB网络接口名 addresses: - 192.168.137.100/24 gateway4: 192.168.137.1 nameservers: addresses: [8.8.8.8, 114.114.114.114] dhcp4: no optional: yes关键参数解释:
addresses: 为usb0设置静态IP和子网掩码(/24对应255.255.255.0)。gateway4: 网关必须设置为主机的IP192.168.137.1,这是Nano数据通往外部世界的出口。nameservers: DNS服务器。这里设置了谷歌的8.8.8.8和国内的114.114.114.114,确保域名解析正常。这是非常关键的一步,很多无法上网的问题就出在DNS没配好。dhcp4: no: 禁用DHCP,因为我们使用静态IP。optional: yes: 将此接口标记为可选,即使它不存在(比如拔掉USB线),系统启动也不会等待或报错。
保存并退出(在nano编辑器中,按
Ctrl+X,然后按Y,再按Enter)。应用新的网络配置:
sudo netplan apply
4.3 测试网络连通性
配置应用后,首先检查IP是否生效:
ip addr show usb0应该能看到usb0接口已经分配了192.168.137.100。
然后进行三步测试:
测试与主机的连接(网关):
ping 192.168.137.1 -c 4如果能看到成功的回复(
64 bytes from ...),说明Nano到主机的USB链路是通的。测试DNS解析:
nslookup baidu.com或
ping -c 4 baidu.com如果
ping域名能成功,并显示IP地址,说明DNS配置正确。如果提示“未知的名称或服务”,但ping网关IP通,那问题就出在DNS上,请回头检查Netplan配置文件中的nameservers部分。测试外网访问:
ping -c 4 8.8.8.8如果能通,恭喜你,Nano已经可以通过主机访问外网了!如果这一步不通,但前两步通,问题可能出在主机的防火墙或共享设置上。
5. 进阶配置与优化
基础连通性搞定后,我们可以做一些优化,让开发体验更好。
5.1 配置SSH over USB(可选但推荐)
有了网络,我们就不再需要依赖串口终端了。可以通过SSH远程登录Nano,操作更方便(比如复制粘贴命令、传输文件)。
在Nano上,确保SSH服务已安装并运行:
sudo systemctl enable ssh sudo systemctl start ssh在主机上,打开SSH客户端(如Windows的PowerShell、CMD或PuTTY)。
使用我们刚设置的静态IP连接:
ssh <你的Nano用户名>@192.168.137.100例如:
ssh nvidia@192.168.137.100首次连接会提示确认主机密钥,输入
yes,然后输入你的Nano用户密码即可登录。
现在,你可以拔掉串口线,仅通过USB数据线进行SSH远程开发了。
5.2 设置静态IP别名(避免冲突)
如果你有多块开发板,或者这个IP192.168.137.100与局域网内其他设备冲突,你可以在Netplan配置中修改addresses字段,换一个同网段未使用的IP,比如192.168.137.101。修改后记得sudo netplan apply。
5.3 开机自动连接(默认已实现)
由于我们使用了Netplan的静态配置,并且标记为optional: yes,系统启动时如果检测到usb0接口,就会自动应用这个配置。无需额外操作。
6. 故障排查与常见问题实录
在实际操作中,你可能会遇到各种问题。下面是我踩过坑后总结的排查清单。
6.1 问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 主机“设备管理器”中无RNDIS设备或带叹号 | 1. USB线仅支持充电,不支持数据。 2. 驱动未正确安装。 3. Nano未进入设备模式。 | 1.换一根确认能传数据的USB线(很多廉价充电线只有电源线)。 2. 按上文【3.1】手动安装Microsoft RNDIS驱动。 3. 确保Nano系统已正常启动。 |
ifconfig看不到usb0接口 | 1. 主机共享未开启或选错共享网卡。 2. Linux内核未加载 g_ether模块。 | 1. 检查主机【3.2】步骤,确保共享给了正确的USB网卡。 2. 在Nano终端执行`lsmod |
ping 192.168.137.1不通 | 1. IP配置错误,不在同一网段。 2. 主机防火墙阻止。 | 1. 用ip addr show usb0确认Nano的IP是192.168.137.x。2.临时关闭主机防火墙测试(控制面板->Windows Defender防火墙->关闭)。如果关闭后能通,则需在防火墙入站规则中放行“文件和打印机共享”相关规则。 |
ping 8.8.8.8不通,但ping 192.168.137.1通 | 1. 主机未成功连接到外网。 2. 主机ICS服务故障。 | 1. 确认主机本身能上网。 2. 尝试禁用再重新启用主机的上网连接和USB网络连接的共享设置。 3. 在主机CMD以管理员运行 netsh winsock reset并重启。 |
ping baidu.com提示“未知的名称或服务” | DNS配置错误或未配置。 | 检查Nano上/etc/netplan/*.yaml文件中的nameservers部分,确保格式正确且地址有效(如8.8.8.8)。修改后执行sudo netplan apply。 |
| SSH连接超时 | 1. Nano上SSH服务未运行。 2. IP地址错误。 3. 主机防火墙阻止SSH端口。 | 1. 在Nano上执行sudo systemctl status ssh确认服务为active (running)。2. 重新确认Nano的IP。 3. SSH默认端口22,确保主机防火墙未阻止。 |
| 连接时断时续 | 1. USB线或接口接触不良。 2. 主机电源管理导致USB休眠。 | 1. 更换USB线或接口尝试。 2. 在主机“设备管理器”中找到该USB网卡,右键“属性”->“电源管理”,取消勾选“允许计算机关闭此设备以节约电源”。 |
6.2 独家避坑心得
- “一根好线”原则:至少50%的USB连接问题源于数据线。务必使用一条已知可传输数据的优质Micro-USB线。手机原装线通常可靠。
- DNS是隐形杀手:网络能
ping通IP但打不开网页或apt update失败,十有八九是DNS问题。在Netplan里直接指定可靠的公共DNS(8.8.8.8, 114.114.114.114)是最省心的办法。 - 防火墙的“锅”:Windows防火墙有时会过于“尽责”。在排查网络问题时,将其暂时关闭是一个有效的隔离测试手段。如果问题解决,再回头仔细配置放行规则。
- Netplan语法必须严谨:YAML文件对缩进非常敏感,必须使用空格,不能用Tab。冒号
:后面必须跟一个空格。一个格式错误就会导致sudo netplan apply失败并给出提示,仔细阅读错误信息。 - 接口名不是固定的:虽然通常叫
usb0,但系统也可能分配其他名字(如enp0s20f0u2)。务必使用ip addr show或ifconfig -a来确认实际的接口名,并在配置文件中使用这个名字。 - 共享链路的正确顺序:一定要先确保主机能正常上网,然后再开启共享,并选择正确的、正在上网的源连接去共享给正确的USB目标连接。顺序错了或者选错了网卡,共享就无法工作。
通过以上步骤和排查指南,你应该能顺利地为你的Jetson Nano建立起一条通过USB连接主机的稳定网络通道。这个方法让我在咖啡馆、客户现场甚至高铁上,都能随时随地为Nano提供网络环境,进行软件安装、代码拉取和更新,极大地提升了开发效率。