【0527】Jetson Nano U-Boot 有线网卡与 VMware 直连网络调试笔记

Jetson Nano U-Boot 有线网卡与 VMware 直连网络调试笔记

记录目的:复现并整理 Jetson Nano 在 U-Boot 阶段通过板载有线网卡 eth_rtl8169 与 Ubuntu 虚拟机通信的完整过程。

最终结果:U-Boot 中 ping 192.168.50.1 成功,说明 PCIe 网卡、RTL8169 驱动、VMware 桥接和虚拟机网络配置全部打通。


1. 实验目标

本次实验的目标是在 Jetson Nano U-Boot 阶段 使用板载有线网卡连接电脑中的 Ubuntu 虚拟机,实现:

bash 复制代码
ping 192.168.50.1

成功输出类似:

bash 复制代码
Using eth_rtl8169 device
host 192.168.50.1 is alive

这说明:

text 复制代码
1. Jetson Nano 的 PCIe 总线能够正常枚举
2. 板载 Realtek 网卡能够被 U-Boot 识别
3. U-Boot 能够调用 eth_rtl8169 驱动
4. VMware 桥接网络配置正确
5. Ubuntu 虚拟机能够收到 Jetson 发出的 ARP / ICMP 包

2. 整体网络连接关系

最终正确连接方式如下:

text 复制代码
Jetson Nano 板载 RJ45 网口
        ↓ 网线
USB 转 RJ45 网卡:Realtek USB FE Family Controller
        ↓ USB
Windows 电脑
        ↓ VMware VMnet1 桥接
Ubuntu 虚拟机 ens38

IP 分配如下:

text 复制代码
Jetson U-Boot:
    ipaddr   = 192.168.50.2
    serverip = 192.168.50.1
    netmask  = 255.255.255.0
    ethaddr  = 02:00:00:12:34:56

Ubuntu 虚拟机:
    ens38    = 192.168.50.1/24

Windows:
    以太网 5 = Realtek USB FE Family Controller
    不手动设置 192.168.50.1

注意:192.168.50.1 是给 Ubuntu 虚拟机的 ens38 使用,不要同时设置到 Windows 的"以太网 5"上,否则可能产生 IP 冲突。


3. 关键问题回顾

最开始 U-Boot 中执行:

bash 复制代码
pci enum
pci

可以看到:

bash 复制代码
BusDevFun  VendorId   DeviceId   Device Class       Sub-Class
_____________________________________________________________
00.02.00   0x10de     0x0faf     Bridge device           0x04
01.00.00   0x10ec     0x8168     Network controller      0x00

说明:

text 复制代码
0x10ec = Realtek 厂商 ID
0x8168 = Realtek RTL8168/RTL8169 系列网卡设备

之后执行:

bash 复制代码
ping 192.168.50.1

出现:

bash 复制代码
Using eth_rtl8169 device

ARP Retry count exceeded; starting again
ping failed; host 192.168.50.1 is not alive

这说明:

text 复制代码
1. PCIe 总线枚举成功
2. RTL8169 驱动已经被调用
3. 问题不是 U-Boot 没识别网卡
4. 真正失败点是 ARP 阶段没有收到 192.168.50.1 的回应

也就是说,问题重点转移到:

text 复制代码
Jetson 网口 → USB 有线网卡 → Windows → VMware 桥接 → Ubuntu ens38

这条链路是否打通。


4. Windows 端配置

4.1 插入 USB 转 RJ45 网卡

【注意:USB网卡不要复用其他功能】

电脑原本只有 Wi-Fi,没有物理有线网口,因此 VMware 只能桥接到 Wi-Fi,导致虚拟机抓到的是 Wi-Fi 网络里的包,例如:

bash 复制代码
Request who-has 192.168.2.133 tell 192.168.2.1

这不是 Jetson 的包。

插入 USB 转 RJ45 网卡后,Windows 中出现:

text 复制代码
以太网 5
Realtek USB FE Family Controller
未识别的网络

这是正确现象。

"未识别的网络"并不代表错误,因为这条线直连 Jetson,不连接路由器,没有 DHCP 和 Internet。

4.2 Windows 的"以太网 5"不要设置静态 IP

Windows 端保持启用即可,不要把它设置成:

text 复制代码
192.168.50.1

因为这个 IP 要交给 Ubuntu 虚拟机的 ens38

如果 Windows 和 Ubuntu 同时使用 192.168.50.1,会造成冲突。


5. VMware 虚拟网络编辑器配置

打开:

text 复制代码
VMware
→ 编辑
→ 虚拟网络编辑器
→ 更改设置

配置如下:

text 复制代码
VMnet1:
    类型:桥接模式
    外部连接:Realtek USB FE Family Controller

VMnet8:
    类型:NAT 模式
    用于 Ubuntu 虚拟机上网

VMnet0:
    可保持桥接到 Wi-Fi,不参与本次 Jetson 直连测试

本次关键是:

text 复制代码
VMnet1 必须桥接到 Realtek USB FE Family Controller

不要桥接到:

text 复制代码
Intel Wireless-AC 9560
Wi-Fi Direct
Bluetooth
VMnet8
VMnet1 的 Host-only 默认模式

6. VMware 虚拟机设置

虚拟机设置中保留两个网卡:

text 复制代码
网络适配器 1:
    NAT
    用于虚拟机访问互联网

网络适配器 2:
    自定义:VMnet1
    用于连接 Jetson 板子

网络适配器 2 需要勾选:

text 复制代码
已连接
启动时连接

最终关系:

text 复制代码
网络适配器 1 → NAT → ens33 → 虚拟机上网
网络适配器 2 → VMnet1 → ens38 → Jetson 直连

7. Ubuntu 虚拟机配置

进入 Ubuntu 后查看网卡:

bash 复制代码
ip a

本次用于连接 Jetson 的网卡是:

text 复制代码
ens38

配置 ens38

bash 复制代码
sudo ip addr flush dev ens38
sudo ip addr add 192.168.50.1/24 dev ens38
sudo ip link set ens38 up

检查:

bash 复制代码
ip a show ens38

应看到:

bash 复制代码
inet 192.168.50.1/24 scope global ens38

如果担心 ens38 影响默认路由,可以执行:

bash 复制代码
sudo ip route del default dev ens38 2>/dev/null

8. Ubuntu 抓包验证

在 Ubuntu 中执行:

bash 复制代码
sudo tcpdump -ni ens38 -e 'arp or icmp'

最开始如果抓到:

bash 复制代码
Request who-has 169.254.169.254 tell 169.254.x.x

这是 Windows / 网卡自动私有地址相关的 ARP,可以暂时忽略。

真正需要看到的是 Jetson 发出的 ARP:

bash 复制代码
Request who-has 192.168.50.1 tell 192.168.50.2

如果抓不到 192.168.50.2,说明 Jetson 的包还没进入 Ubuntu,需要继续查 VMware 桥接、网线、USB 网卡和虚拟机网络适配器绑定。


9. Jetson U-Boot 配置

进入 U-Boot 命令行后设置网络参数:

bash 复制代码
setenv ipaddr 192.168.50.2
setenv serverip 192.168.50.1
setenv gatewayip 192.168.50.1
setenv netmask 255.255.255.0
setenv ethaddr 02:00:00:12:34:56
saveenv

检查环境变量:

bash 复制代码
printenv ipaddr
printenv serverip
printenv gatewayip
printenv netmask
printenv ethaddr

应看到:

bash 复制代码
ipaddr=192.168.50.2
serverip=192.168.50.1
gatewayip=192.168.50.1
netmask=255.255.255.0
ethaddr=02:00:00:12:34:56

注意:之前曾误输入:

bash 复制代码
setenv e:2:34:56

这是错误的,正确写法是:

bash 复制代码
setenv ethaddr 02:00:00:12:34:56

10. U-Boot PCI 枚举测试

执行:

bash 复制代码
pci enum
pci

正常输出应包含:

bash 复制代码
01.00.00   0x10ec     0x8168     Network controller      0x00

含义:

text 复制代码
PCIe 总线已经枚举到 Realtek 网卡
U-Boot 侧 PCIe 总线和 RTL8168/RTL8169 网卡硬件识别正常

11. U-Boot ping 测试

执行:

bash 复制代码
ping 192.168.50.1

成功时会看到:

bash 复制代码
Using eth_rtl8169 device
host 192.168.50.1 is alive

这说明:

text 复制代码
1. U-Boot 成功调用 eth_rtl8169 驱动
2. Jetson 能够通过板载有线网卡发送 ARP / ICMP
3. Ubuntu 虚拟机 ens38 能够回应
4. 整条链路已经打通

12. 成功后的 tcpdump 现象

成功时,Ubuntu 抓包窗口可以看到类似:

bash 复制代码
02:00:00:12:34:56 > ff:ff:ff:ff:ff:ff, ethertype ARP, Request who-has 192.168.50.1 tell 192.168.50.2
00:0c:29:xx:xx:xx > 02:00:00:12:34:56, ethertype ARP, Reply 192.168.50.1 is-at 00:0c:29:xx:xx:xx
ICMP echo request
ICMP echo reply

判断依据:

text 复制代码
看到 192.168.50.2 → 192.168.50.1 的 ARP / ICMP,说明 Jetson 包进入虚拟机。
看到 Reply,说明 Ubuntu 成功回应 Jetson。

13. 常见错误与排查

13.1 抓到 192.168.2.x 的包

现象:

bash 复制代码
Request who-has 192.168.2.133 tell 192.168.2.1

原因:

text 复制代码
VMware 桥接到了 Wi-Fi,而不是 USB 有线网卡。

解决:

text 复制代码
虚拟网络编辑器中将 VMnet1 桥接到 Realtek USB FE Family Controller。

13.2 tcpdump 一直没有任何输出

原因可能是:

text 复制代码
1. 虚拟机网络适配器 2 没有连接
2. 网络适配器 2 没有选择 VMnet1
3. VMnet1 没有桥接到 USB 有线网卡
4. 网线没插好
5. Jetson 网口灯或 USB 网卡灯不亮

排查:

bash 复制代码
ip a show ens38
sudo tcpdump -ni ens38 -e 'arp or icmp'

同时检查 VMware:

text 复制代码
网络适配器 2 = 自定义 VMnet1
VMnet1 = 桥接到 Realtek USB FE Family Controller

13.3 U-Boot 提示 ipaddr not set

现象:

bash 复制代码
*** ERROR: `ipaddr' not set

解决:

bash 复制代码
setenv ipaddr 192.168.50.2
saveenv

13.4 U-Boot 提示 ARP Retry count exceeded

现象:

bash 复制代码
ARP Retry count exceeded; starting again
ping failed; host 192.168.50.1 is not alive

含义:

text 复制代码
Jetson 已经尝试询问 192.168.50.1 的 MAC 地址,但没有收到 ARP Reply。

重点检查:

text 复制代码
1. Ubuntu ens38 是否是 192.168.50.1/24
2. tcpdump 是否能抓到 192.168.50.2 的 ARP
3. VMware 是否桥接到正确的 USB 有线网卡
4. ethaddr 是否设置正确
5. 网线和网口灯是否正常

14. 最终配置汇总

Windows

text 复制代码
以太网 5:
    Realtek USB FE Family Controller
    启用
    不配置 192.168.50.1
    显示"未识别的网络"是正常的

VMware 虚拟网络编辑器

text 复制代码
VMnet1:
    桥接模式
    外部连接:Realtek USB FE Family Controller

VMnet8:
    NAT 模式
    用于虚拟机上网

VMware 虚拟机设置

text 复制代码
网络适配器:
    NAT

网络适配器 2:
    自定义 VMnet1
    已连接
    启动时连接

Ubuntu

bash 复制代码
sudo ip addr flush dev ens38
sudo ip addr add 192.168.50.1/24 dev ens38
sudo ip link set ens38 up
sudo tcpdump -ni ens38 -e 'arp or icmp'

Jetson U-Boot

bash 复制代码
setenv ipaddr 192.168.50.2
setenv serverip 192.168.50.1
setenv gatewayip 192.168.50.1
setenv netmask 255.255.255.0
setenv ethaddr 02:00:00:12:34:56
saveenv

pci enum
pci
ping 192.168.50.1

15. 本次实验结论

本次实验最终确认:

text 复制代码
Jetson Nano 板载 Realtek 8168/8169 网卡能够在 U-Boot 阶段正常工作。
U-Boot 可以通过 PCIe 枚举到网卡,并使用 eth_rtl8169 驱动完成网络通信。
VMware 中需要将第二块虚拟网卡桥接到 USB 有线网卡,而不是 Wi-Fi 或 VMnet8。
Ubuntu 虚拟机的 ens38 设置为 192.168.50.1/24,Jetson U-Boot 设置为 192.168.50.2/24 后,可以 ping 通。

这套流程也为后续继续复现:

text 复制代码
1. U-Boot TFTP 下载
2. USB 网卡驱动移植
3. 网络启动调试
4. U-Boot 网络驱动源码分析

打下了基础。


text 复制代码
Jetson 板子 192.168.50.2
    ↓
板载 RTL8169 有线网卡
    ↓
USB 转网口
    ↓
VMware VMnet1 桥接
    ↓
Ubuntu 虚拟机 ens38 192.168.50.1

这条链路已经打通了。

所以 tftpboot 下载功能理论上可以实现 。接下来只需要在 Ubuntu 虚拟机里搭建 TFTP 服务器,然后 U-Boot 端用 tftpboot 下载文件即可。


一、Ubuntu 虚拟机端配置 TFTP 服务

1. 安装 TFTP 服务

在 Ubuntu 虚拟机里执行:

bash 复制代码
sudo apt update
sudo apt install tftpd-hpa tftp-hpa

2. 创建 TFTP 目录

bash 复制代码
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp

放一个测试文件进去:

bash 复制代码
echo "hello from ubuntu tftp server" > /srv/tftp/test.txt

查看确认:

bash 复制代码
ls -l /srv/tftp

应该能看到:

text 复制代码
test.txt

3. 修改 TFTP 配置

编辑配置文件:

bash 复制代码
sudo nano /etc/default/tftpd-hpa

建议内容改成这样:

bash 复制代码
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"

保存退出。


4. 重启 TFTP 服务

bash 复制代码
sudo systemctl restart tftpd-hpa
sudo systemctl status tftpd-hpa

如果看到 active (running),说明服务启动成功。


5. 防火墙处理

如果 Ubuntu 开了防火墙,临时允许 TFTP:

bash 复制代码
sudo ufw allow 69/udp

或者调试阶段直接关闭防火墙:

bash 复制代码
sudo ufw disable

二、Ubuntu 本机先测试 TFTP 是否可用

在 Ubuntu 虚拟机里执行:

bash 复制代码
cd /tmp
tftp 192.168.50.1 -c get test.txt

如果成功,/tmp 下会下载到:

bash 复制代码
test.txt

检查:

bash 复制代码
cat /tmp/test.txt

能看到:

text 复制代码
hello from ubuntu tftp server

说明 TFTP 服务本身没问题。


三、U-Boot 端配置网络参数

在 Jetson U-Boot 里执行:

bash 复制代码
setenv ipaddr 192.168.50.2
setenv serverip 192.168.50.1
setenv gatewayip 192.168.50.1
setenv netmask 255.255.255.0
setenv ethaddr 02:00:00:12:34:56
saveenv

确认:

bash 复制代码
printenv ipaddr
printenv serverip
printenv netmask
printenv ethaddr

四、U-Boot 先 ping 测试

bash 复制代码
pci enum
pci
ping 192.168.50.1

如果能看到:

text 复制代码
Using eth_rtl8169 device
host 192.168.50.1 is alive

说明可以进行 TFTP 下载测试。


五、U-Boot 使用 tftpboot 下载文件

先查看有没有默认加载地址:

bash 复制代码
printenv loadaddr

如果有,例如:

text 复制代码
loadaddr=0x80000000

就直接用:

bash 复制代码
tftpboot ${loadaddr} test.txt

如果没有 loadaddr,可以临时指定一个地址:

bash 复制代码
tftpboot 0x80000000 test.txt

成功时会看到类似:

text 复制代码
Using eth_rtl8169 device
TFTP from server 192.168.50.1; our IP address is 192.168.50.2
Filename 'test.txt'
Load address: 0x80000000
Loading: #
done
Bytes transferred = ...

这就说明 U-Boot 阶段 TFTP 下载成功


六、后续下载真正文件

比如你要下载 u-boot.bin,先放到 Ubuntu 的 TFTP 目录:

bash 复制代码
cp u-boot.bin /srv/tftp/

然后 U-Boot 里:

bash 复制代码
tftpboot ${loadaddr} u-boot.bin

或者:

bash 复制代码
tftpboot 0x80000000 u-boot.bin

七、如果 tftpboot 失败,按这个排查

1. ping 不通

说明网络链路还没通,先不要测 TFTP。

重点检查:

text 复制代码
VMnet1 是否桥接 Realtek USB FE
Ubuntu ens38 是否是 192.168.50.1
Jetson ipaddr 是否是 192.168.50.2

2. ping 通,但 tftpboot 超时

常见原因:

text 复制代码
TFTP 服务没启动
防火墙拦截 UDP 69
serverip 设置错
文件目录不是 /srv/tftp

检查:

bash 复制代码
sudo systemctl status tftpd-hpa
sudo ufw status
ls -l /srv/tftp

3. 提示文件不存在

比如:

text 复制代码
File not found

说明 U-Boot 要下载的文件名和 /srv/tftp 里的文件名不一致。

检查:

bash 复制代码
ls -l /srv/tftp

U-Boot 里文件名要完全一致,包括大小写。


最终结论

你现在板子已经和电脑里的 Ubuntu 虚拟机成功连通了。

只要在 Ubuntu 上启动 tftpd-hpa,并把文件放到 /srv/tftp,U-Boot 里就可以通过:

bash 复制代码
tftpboot ${loadaddr} test.txt

或:

bash 复制代码
tftpboot 0x80000000 test.txt

实现从电脑下载文件到板子内存。


自动执行 TFTP 下载流程

你截图里的流程可以拆成这样:

bash 复制代码
Hit any key to stop autoboot: 0

倒计时结束后,U-Boot 自动执行 bootcmd

然后自动做了这些事:

bash 复制代码
pci enum
pci
tftpboot 0x84000000 u-boot.bin

所以你看到:

bash 复制代码
Scanning PCI devices on bus 0
Using eth_rtl8169 device
TFTP from server 192.168.9.119; our IP address is 192.168.9.9
Filename 'u-boot.bin'
Load address: 0x84000000
Bytes transferred = 659264

说明它自动从电脑 TFTP 服务器下载了 u-boot.bin 到板子内存地址:

bash 复制代码
0x84000000

最后这一句:

bash 复制代码
# goraw 0x84000000

看起来是老师执行 的,意思是从 0x84000000 这个内存地址开始运行刚下载的 u-boot.bin


设置了这些环境变量

以你现在的网络环境为例,你可以这样配置:

bash 复制代码
setenv ipaddr 192.168.50.2
setenv serverip 192.168.50.1
setenv gatewayip 192.168.50.1
setenv netmask 255.255.255.0
setenv ethaddr 02:00:00:12:34:56
setenv loadaddr 0x84000000
setenv bootfile u-boot.bin

然后设置自动下载命令:

bash 复制代码
setenv bootcmd 'pci enum; pci; tftpboot ${loadaddr} ${bootfile}'
saveenv

这样以后板子上电后,如果你不按键打断,倒计时结束后它会自动执行:

bash 复制代码
pci enum
pci
tftpboot 0x84000000 u-boot.bin

也就是自动从电脑下载 u-boot.bin 到内存。


如果想自动下载后直接运行

可以把 goraw 也加进去:

bash 复制代码
setenv bootcmd 'pci enum; pci; tftpboot ${loadaddr} ${bootfile}; goraw ${loadaddr}'
saveenv

这样上电后会自动执行:

text 复制代码
1. 初始化 PCIe
2. 扫描 PCI 设备
3. 使用 eth_rtl8169 网卡
4. 从 TFTP 服务器下载 u-boot.bin
5. 下载到 0x84000000
6. 直接运行这个 u-boot.bin

但是我建议你先不要自动 goraw

你现在最好先用安全一点的方式:

bash 复制代码
setenv bootcmd 'pci enum; pci; tftpboot ${loadaddr} ${bootfile}'
saveenv

然后上电自动下载成功后,再手动执行:

bash 复制代码
goraw ${loadaddr}

原因是:如果 u-boot.bin 文件有问题,自动 goraw 后可能直接卡死。先只自动下载,确认文件能正常下载,再手动运行更稳。


重点理解

tftpboot 只是下载到 RAM:

text 复制代码
电脑 /srv/tftp/u-boot.bin
        ↓
tftpboot
        ↓
Jetson 内存 0x84000000

goraw 0x84000000 才是运行它:

text 复制代码
从 0x84000000 开始执行刚下载的 u-boot.bin

所以做的事情不是"刷入板子",而是:

text 复制代码
上电后自动通过网卡从电脑下载新的 u-boot.bin 到内存,
然后再用 goraw 临时运行这个新版本。

断电重启后,如果没有再次 TFTP 下载,它不会永久变成这个版本。

相关推荐
陈年老古董11 分钟前
MediaPipe 姿态检测与脸部关键点检测
笔记·python·opencv·学习·dlib
chshang199223 分钟前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
彧azz31 分钟前
操作系统时间管理与系统核心板块学习总结
c语言·笔记·学习·系统架构
萧瑟余晖43 分钟前
Netty 核心组件与 Reactor 模型详解
网络·架构
ITxiaobing20231 小时前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5551 小时前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
zhangrelay1 小时前
《机器人控制器设计与编程》课程习题资料-2026
linux·笔记·学习·ubuntu
z落落1 小时前
C#UDP+串口服务端+UDP 客户端(含 CRC16 校验)
网络·网络协议·udp
志尊宝1 小时前
Vue3 零基础每日笔记(055):组件里正确使用 store——storeToRefs 解构与 $patch 批量修改
笔记·vue·html·前端开发·软件开发
kkkkkkkkkk_Z1 小时前
新手自学嵌入式|学习日记:从C语言到51单片机基础(GPIO、中断、定时器与PWM篇)
linux·笔记·学习·51单片机