我的情况是使用Windows中的Ubuntu虚拟机对Jatson Agx Xavier Developer Kit开发套件进行开发工作,同时要解决Jatson Agx Xavier Developer Kit的联网问题。
Windows主机与Jatson通过数据线相连,务必请使用官方提供的数据线(踩过深坑),自己的数据线大概率会导致前期刷机失败和后期无法连接(找不到Jatson连接)的问题。
背景
安装好Jatson设备J,它连接一台widows主机W中的虚拟机V,现在可以J和V实现相互ping通(J ping 192.168.55.100, V ping 192.168.55.1),目前V已经通过桥接W的网卡实现了上网功能,最终目标是要给J增加连接互联网实现上网功能。
虚拟机上网操作:
V通过桥接W的网卡实现上网功能:设置Vmware中虚拟机的网络适配器,“设备状态”为已连接+启动时连接
,“网络连接”为桥接模式
,进入虚拟机,“编辑”“虚拟网络适配器”,更改设置,将VMnet0设置为桥接模式,“已桥接至”选择W机的无线网卡即可(虚拟机内部网络默认DHCP无需改动)。
Jatson设备J
# device: Jatson Agx Xavier
######################################## ip addr ########################################
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 82:f6:0d:fb:4d:04 brd ff:ff:ff:ff:ff:ff
3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000link/ether 48:b0:2d:05:ab:ef brd ff:ff:ff:ff:ff:ff
4: l4tbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 02:8f:75:67:77:c5 brd ff:ff:ff:ff:ff:ffinet 192.168.55.1/24 brd 192.168.55.255 scope global l4tbr0valid_lft forever preferred_lft foreverinet6 fe80::1/128 scope link valid_lft forever preferred_lft foreverinet6 fe80::8f:75ff:fe67:77c5/64 scope link valid_lft forever preferred_lft forever
5: rndis0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master l4tbr0 state UP group default qlen 1000link/ether 02:8f:75:67:77:c5 brd ff:ff:ff:ff:ff:ffinet6 fe80::8f:75ff:fe67:77c5/64 scope link valid_lft forever preferred_lft forever
6: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master l4tbr0 state UP group default qlen 1000link/ether 02:8f:75:67:77:c7 brd ff:ff:ff:ff:ff:ffinet6 fe80::8f:75ff:fe67:77c7/64 scope link valid_lft forever preferred_lft forever
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:20:b1:75:f8 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever######################################## ip route ########################################
default via 192.168.55.100 dev l4tbr0 metric 32766
169.254.0.0/16 dev l4tbr0 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.55.0/24 dev l4tbr0 proto kernel scope link src 192.168.55.1
当前网络情况分析
从Jatson提供的ip addr
和ip route
输出,我们可以了解设备J的网络配置:
1. 网络接口(ip addr
输出)
- l4tbr0:这是J上一个活跃的桥接接口,分配的IP地址为
192.168.55.1/24
,子网掩码为/24(即网络范围为192.168.55.0到192.168.55.255)。这是J用来与V通信的接口,因为V可以ping通192.168.55.1
。 - rndis0 和 usb0:这两个接口状态为UP,但只有链接本地IPv6地址,没有IPv4地址。它们可能是USB网络接口(RNDIS常用于USB以太网),但目前未配置IPv4。
- eth0:以太网接口状态为DOWN,未分配IP地址,表明未使用。
- docker0 和 dummy0:均处于DOWN状态,未参与当前网络通信。
因此,J主要通过l4tbr0
接口(IP: 192.168.55.1)与V(IP: 192.168.55.100)通信,且它们在同一子网192.168.55.0/24
内。
2. 路由表(ip route
输出)
- 默认路由:
default via 192.168.55.1 dev l4tbr0
- 当前默认网关设置为
192.168.55.1
,这正是J自己的IP地址。这种配置是错误的,因为默认网关应该指向一个外部设备(如路由器、W或V),而不是设备自身。这导致J无法访问互联网。
- 当前默认网关设置为
- 本地路由:
192.168.55.0/24 dev l4tbr0 proto kernel scope link src 192.168.55.1
- 这条路由表明J知道如何在
192.168.55.0/24
子网内通信(如ping通V的192.168.55.100
)。
- 这条路由表明J知道如何在
3. 已知信息
- J和V在同一子网(
192.168.55.0/24
),可以相互ping通。 - V通过桥接W的网卡已有互联网访问权限。这意味着V可能有另一个网络接口连接到W的物理网络(例如
192.168.1.x
),或者192.168.55.0/24
网络本身通过W连接到互联网。
问题分析
J无法上网的核心原因是其默认网关配置错误(指向自身IP 192.168.55.1
)。要实现J的上网功能,需要:
- 将J的默认网关设置为一个能够访问互联网的设备。
- 确保该设备(网关)能够将J的流量转发到互联网。
可能的网关选项包括:
- 虚拟机V(192.168.55.100):V已有上网功能,且与J在同一子网。如果V配置为路由器(启用IP转发并可能设置NAT),J可以通过V访问互联网。
- Windows主机W:如果W在
192.168.55.0/24
子网内有一个IP(例如192.168.55.200
),并且该接口连接到互联网,J可以直接使用W的IP作为网关。
稍后需要提供V的网络情况,目前只能基于现有信息推测。以下是最可能的解决方案。
配置步骤
考虑到V已经可以通过桥接上网,且与J在同一子网,当前最简单的方案是将V设置为J的默认网关,并确保V能够转发流量。以下是在J上调整配置的步骤:
1. 删除当前的错误默认路由
当前的默认网关(192.168.55.1
)是J自己的IP,需要删除:
sudo ip route del default via 192.168.55.1 dev l4tbr0
2. 添加新的默认路由,指向V的IP
将默认网关设置为V的IP地址192.168.55.100
,因为V在同一子网且已有上网功能:
sudo ip route add default via 192.168.55.100 dev l4tbr0
3. 测试互联网连接
配置完成后,在J上测试是否能访问互联网。例如,ping一个外部地址:
ping 8.8.8.8
- 如果ping通,说明J可以通过V访问互联网,基本配置成功。
- 如果不通,可能需要进一步配置V(见下文)。
4. (可选)持久化配置
上述命令只在当前会话有效,重启后会丢失。要持久化路由配置,可以编辑J的网络配置文件(例如/etc/network/interfaces
或使用systemd-networkd
),添加:
gateway 192.168.55.100
具体方法取决于J的Linux发行版,你可能需要参考Jetson设备的文档。
关于虚拟机V的额外说明
为确保J通过V访问互联网,V需要具备路由能力:
- 启用IP转发:在V上运行:
为持久化,编辑sudo sysctl -w net.ipv4.ip_forward=1
/etc/sysctl.conf
,设置net.ipv4.ip_forward = 1
。 - (可能需要)配置NAT:如果V的互联网接口在另一子网(例如
192.168.1.x
),需要在V上设置NAT,将来自192.168.55.0/24
的流量伪装为V的IP:
其中sudo iptables -t nat -A POSTROUTING -s 192.168.55.0/24 -o <V的互联网接口> -j MASQUERADE
<V的互联网接口>
需替换为V连接互联网的接口名称(如eth0
)。
由于V的网络情况尚未提供,这些步骤只能作为建议。你提供V的配置后,可以进一步确认。
替代方案:使用W作为网关
如果W在192.168.55.0/24
子网内有IP(例如192.168.55.200
),且该接口连接互联网,可以直接将J的默认网关设置为W的IP:
sudo ip route add default via 192.168.55.200 dev l4tbr0
但当前没有W的具体IP信息,因此优先尝试V作为网关。
总结
基于现有信息,为J增加互联网访问功能,推荐以下步骤:
- 在J上删除错误默认路由:
sudo ip route del default via 192.168.55.1 dev l4tbr0
- 添加指向V的默认路由:
sudo ip route add default via 192.168.55.100 dev l4tbr0
- 测试连接:
ping 8.8.8.8
- 如果失败,请提供V的网络配置,可能需要在V上启用IP转发或设置NAT。
后续提供V的网络情况后,可以进一步优化方案。
虚拟机设备V
# device: Ubuntu2204p06
######################################## ip addr ########################################
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:fc:27:58 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet6 fe80::98e4:9781:a89d:bdb3/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: enx028f756777c6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 02:8f:75:67:77:c6 brd ff:ff:ff:ff:ff:ffinet6 fe80::652e:668:803b:b857/64 scope link noprefixroute valid_lft forever preferred_lft forever
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000link/ether e6:49:49:b5:1e:29 brd ff:ff:ff:ff:ff:ffinet 192.168.55.100/24 brd 192.168.55.255 scope global dynamic noprefixroute eth1valid_lft 12sec preferred_lft 12secinet6 fe80::1ba4:f3d:988a:8e45/64 scope link noprefixroute valid_lft forever preferred_lft forever
######################################## ip route ########################################
169.254.0.0/16 dev eth1 scope link metric 1000
192.168.55.0/24 dev eth1 proto kernel scope link src 192.168.55.100 metric 101
######################################## ifconfig ########################################
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500ether 00:0c:29:fc:27:58 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 376 bytes 63494 (63.4 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0enx028f756777c6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet6 fe80::652e:668:803b:b857 prefixlen 64 scopeid 0x20<link>ether 02:8f:75:67:77:c6 txqueuelen 1000 (Ethernet)RX packets 43 bytes 4365 (4.3 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 47 bytes 12033 (12.0 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.55.100 netmask 255.255.255.0 broadcast 192.168.55.255inet6 fe80::1ba4:f3d:988a:8e45 prefixlen 64 scopeid 0x20<link>ether e6:49:49:b5:1e:29 txqueuelen 1000 (Ethernet)RX packets 1425 bytes 171878 (171.8 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 703 bytes 155246 (155.2 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 4851 bytes 361009 (361.0 KB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 4851 bytes 361009 (361.0 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
最终目标是要让Jetson设备J能够访问互联网,根据Jetson设备J和虚拟机V的网络配置情况,制定实现目标的具体步骤。以下是详细的配置方案和操作指南,帮助你让Jetson设备J通过虚拟机V访问互联网。
当前网络情况分析
Jetson设备J的网络配置
- 接口
l4tbr0
:- IP地址:
192.168.55.1/24
- 状态:UP
- IP地址:
- 路由表:
- 默认网关:
default via 192.168.55.100 dev l4tbr0 metric 32766
- 本地路由:
192.168.55.0/24 dev l4tbr0 proto kernel scope link src 192.168.55.1
- 默认网关:
- 分析:
- J的IP地址为
192.168.55.1
,默认网关指向192.168.55.100
(虚拟机V的IP),这表明J已经尝试将V作为网关。 - 网络接口
l4tbr0
正常工作,J和V处于同一子网192.168.55.0/24
,理论上可以通信。
- J的IP地址为
虚拟机V的网络配置
- 接口
eth1
:- IP地址:
192.168.55.100/24
- 状态:UNKNOWN(但有IP地址,可能是配置显示问题)
- IP地址:
- 接口
ens33
:- IP地址:
192.168.1.100/24
- 状态:UP
- IP地址:
- 接口
enx28f756777c
:- IP地址:
192.168.1.101/24
- 状态:UP
- IP地址:
- 接口
eth0
:- 无IP地址
- 状态:UP
- 路由表(未直接提供,但根据上下文推测):
- 默认网关可能为
192.168.1.1
(通过ens33
连接互联网)。 - 本地路由包括
192.168.55.0/24 dev eth1
和192.168.1.0/24 dev ens33
。
- 默认网关可能为
- 分析:
- V的
eth1
接口(192.168.55.100
)与J在同一子网,负责与J通信。 - V的
ens33
接口(192.168.1.100
)连接到另一个子网192.168.1.0/24
,可能是互联网接入点。
- V的
网络拓扑
- J(
192.168.55.1
)通过l4tbr0
与V的eth1
(192.168.55.100
)通信,二者在同一子网192.168.55.0/24
。 - V的
ens33
(192.168.1.100
)连接到互联网,默认网关可能为192.168.1.1
。
问题
- J的默认网关已指向V(
192.168.55.100
),但可能无法访问互联网,因为V未启用IP转发或NAT。 - V需要正确转发J的流量到互联网。
配置步骤
要让Jetson设备J通过虚拟机V访问互联网,需要在J和V上进行以下配置:
1. 确认Jetson设备J的网关设置
J的默认网关已正确指向V的192.168.55.100
,无需修改。但为确保配置正确,请执行以下命令确认:
ip route show
输出应包含:
default via 192.168.55.100 dev l4tbr0
192.168.55.0/24 dev l4tbr0 proto kernel scope link src 192.168.55.1
如果默认网关不正确,删除旧网关并添加新网关:
sudo ip route del default
sudo ip route add default via 192.168.55.100 dev l4tbr0
2. 在虚拟机V上启用IP转发
V需要将J的流量转发到互联网接口(ens33
)。为此,启用IP转发:
- 临时启用:
sudo sysctl -w net.ipv4.ip_forward=1
- 持久化启用(可选,确保重启后生效):
编辑/etc/sysctl.conf
,找到或添加:
然后应用:net.ipv4.ip_forward = 1
sudo sysctl -p
3. 在虚拟机V上配置NAT
由于J(192.168.55.0/24
)和互联网(通过ens33
,192.168.1.0/24
)在不同子网,V需要通过NAT将J的流量伪装为自己的IP:
sudo iptables -t nat -A POSTROUTING -s 192.168.55.0/24 -o ens33 -j MASQUERADE
- 检查NAT规则:
sudo iptables -t nat -L -v
- 持久化NAT规则(可选):
安装iptables-persistent
:
保存规则:sudo apt-get install iptables-persistent
sudo iptables-save > /etc/iptables/rules.v4
4. 确保虚拟机V的接口状态
- 接口
eth1
:状态为UNKNOWN,但有IP地址。确保其正常工作:
输出应显示sudo ip link set eth1 up ip link show eth1
state UP
。 - 接口
ens33
:确认其连接互联网:
如果不通,检查V的默认网关(应为ping 8.8.8.8
192.168.1.1
):ip route show
5. 测试互联网连接
在Jetson设备J上测试:
ping 8.8.8.8
- 如果成功收到响应,说明J已通过V访问互联网。
- 如果失败,检查:
- V上IP转发是否启用(
cat /proc/sys/net/ipv4/ip_forward
应返回1
)。 - V上NAT规则是否生效。
- V是否能访问互联网(在V上
ping 8.8.8.8
)。
- V上IP转发是否启用(
注意事项
- 备份配置:在执行命令前,备份当前网络配置:
- 在J上:
ip addr > network_backup_A.txt
和ip route > route_backup_A.txt
- 在V上:
ip addr > network_backup_V.txt
和iptables-save > iptables_backup_V.txt
- 在J上:
- 执行权限:确保以root权限或使用
sudo
执行命令。 - 接口名称:如果你的接口名称与示例不同(如
ens33
可能是eth0
),请根据实际情况调整。
总结
通过以上步骤,你可以实现Jetson设备J通过虚拟机V访问互联网。核心是:
- 确保J的默认网关指向V(
192.168.55.100
)。 - 在V上启用IP转发并配置NAT,将J的流量转发到互联网。