我有一台通过 DHCP 连接到路由器并且处于完全工作状态的计算机,我在仅链接模式下添加树莓派零时遇到问题。首先,我可以通过将连接从 DHCP 编辑为仅链接来连接 pi,但随后我显然失去了互联网,因为我一次只能连接一个有线设备,而且它们不像我的主要以太网连接那样是 DHCP。然后,我虽然添加一个仅链接集的新连接是一项简单的工作,我可以用它来连接 pi,同时保持我的互联网完好无损,这就是问题开始的地方,我能够建立连接,但由于某种原因无法让它将自己分配给 pi,我收到两条不同的消息,一条是activation of network connection failed
,另一条是Unable to find a connection with UUID ('null')
。
我搜索了互联网,并没有找到我所运行的一篇帖子中所建议的内容,nmcli c show
该帖子返回了一个连接列表,而这里的新连接似乎都有一个 UUID。我被这个问题困扰,希望得到任何帮助。
答案1
如何通过网络管理器nmcli
为通过在 OTG 模式下运行的 USB 端口连接到主机 PC 的 Raspberry Pi 设置网络。
我通过命令行界面使用网络管理器成功设置了到 Raspberry Pi Zero 的桥接网络nmcli
。
树莓派设置
我遵循了这些指示上面的注释中列出了用于设置 Pi 以进行 OTG 以太网连接的信息。
修改Pi的MiniSD卡的文件系统
将以下内容添加到SD卡的/boot/config.txt
# Enable USB OTG like ethernet
dtoverlay=dwc2
ssh
在SD卡/boot
目录下创建一个名为的空文件
touch ssh
并通过将以下内容添加到 SD 卡的/boot/cmdline.txt
后面,将 OTG 以太网模块附加到引导加载程序上rootwait
` modules-load=dwc2,g_ether `
设置主机 PC 网桥
然后我在我的电脑的有线以太网端口上设置了一个桥接网络接口。
nmcli con add type bridge ifname br0
nmcli con modify bridge-br0 bridge.stp no
nmcli con add type bridge-slave ifname eth1 master bridge-br0
使用 Pi 上的 OTG 端口将 Raspberry Pi Zero 插入 PC。使用检查接口名称ifconfig.
,然后将 OTG 接口添加到网桥。
nmcli con add type bridge-slave ifname enp0s29f7u1u4u3 master bridge-br0
一切就绪后,我启用了连接:
nmcli con up bridge-br0
nmcli con up bridge-slave-eth1
nmcli con up bridge-slave-enp0s29f7u1u4u3
验证所有接口绿色nmcli connection
root@local:/etc/ssh# nmcli con
NAME UUID TYPE DEVICE
bridge-br0 ab1fab48-2c31-4ccc-90bf-db444751c080 bridge br0
bridge-slave-enp0s29f7u1u4u3 5efed614-89c7-48d4-996e-0a2e6e616846 802-3-ethernet enp0s29f7u1u4u3
bridge-slave-eth1 53c4d66a-3f9e-49f4-b954-92b13ecf96f8 802-3-ethernet eth1
监视 Raspberry Pi 地址的 DHCP 服务器
然后观察我的 DHCP 服务器的 Raspberry Pi 网络地址分配情况。根据您的配置,该信息将通过您的路由器提供。 SSH 到 Pi 成功:
通过 SSH 连接到 Pi
root@local:/etc/ssh# ssh [email protected]
[email protected]'s password:
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Nov 1 19:33:48 2017 from 192.168.xxx.xxx
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.38+ #938 Thu Dec 15 15:17:54 GMT 2016 armv6l GNU/Linux
pi@raspberrypi:~ $ ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:724 errors:0 dropped:0 overruns:0 frame:0
TX packets:724 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:58980 (57.5 KiB) TX bytes:58980 (57.5 KiB)
usb0 Link encap:Ethernet HWaddr 8e:31:5b:06:db:bb
inet addr:192.168.xxx.xxx Bcast:192.168.xxx.xxx Mask:255.255.255.0
inet6 addr: fe80::xxx:/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:756 errors:0 dropped:0 overruns:0 frame:0
TX packets:430 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:90941 (88.8 KiB) TX bytes:76278 (74.4 KiB)
pi@raspberrypi:~ $ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.xxx.xxx 0.0.0.0 UG 202 0 0 usb0
192.168.xxx.0 * 255.255.255.0 U 202 0 0 usb0
pi@raspberrypi:~ $ sudo -s
root@raspberrypi:/home/pi# ping unix.stackexchange.com
PING unix.stackexchange.com (151.101.65.69) 56(84) bytes of data.
64 bytes from 151.101.65.69: icmp_seq=1 ttl=55 time=27.2 ms
64 bytes from 151.101.65.69: icmp_seq=2 ttl=55 time=7.91 ms
64 bytes from 151.101.65.69: icmp_seq=3 ttl=55 time=6.40 ms
64 bytes from 151.101.65.69: icmp_seq=4 ttl=55 time=6.78 ms
64 bytes from 151.101.65.69: icmp_seq=5 ttl=55 time=7.87 ms
^C
--- unix.stackexchange.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 6.404/11.240/27.219/8.012 ms
root@raspberrypi:/home/pi#
附录
读完后第2部分在 Pi OTG 网络说明中,我将添加它们提供的组件来永久设置 Pi 的 MAC 地址。有了永久 MAC 地址,您的 DHCP 服务器和/或路由器将在 RPi 每次重新启动时停止提供连续的 IP 地址。
网络经济 说:
您可以通过将其附加(原文如此)到 pi 引导分区上的 cmdline.txt 来完成此操作:
g_ether.host_addr=8a:3e:d4:ce:89:53
建立连接后,只需从笔记本电脑的 ifconfig 命令中获取地址即可。
他们继续提到将 Pi 的配置从 DHCP 更改为静态 IP。但是,我不要建议这样做。我始终建议在网络的 DHCP 服务器上设置静态租约。这样,只需修改 DHCP 服务器即可重新设计您的网络。还有一些有用的方法可以划分子网,以限制其他主机对某些主机的访问。
大多数现代家庭路由器都允许设置静态租约。充分利用 DHCP 服务器的功能是一个很好的做法。
补充笔记
我发现设置 g_ether.host_addr 不足以为 Pi 提供恒定的 MAC 地址。第二个要求是设置 g_ether.dev_addr
这小工具文档建议还设置制造商和产品编号。
Linux-USB 小工具 API 框架说:
为了更好地支持 DHCP、ZCIP 和相关的网络自动配置,您需要管理以太网地址,以便每个外设在每次启动时重用相同的唯一地址。您应该使用注册的 IEEE 802 公司 ID 来分配这些地址;这也将使该设备在 Linux 主机上显示为“ethN”接口,而不是“usbN”。如果您使用 U-Boot 等引导固件,则无需单独的 ID PROM(或 initrd)即可轻松完成此操作:
*#* manufacturing assigns Ethernet addresses; company id is xx:xx:xx
setenv eth_a_host xx:xx:xx:01:23:45
setenv eth_a_gadget xx:xx:xx:67:89:ac
setenv eth_i_vendor "Great Stuff, LLC"
setenv eth_i_product "Our Cool Thing"
setenv eth_args g_ether.host_addr=\$(eth_a_host)
setenv eth_args $(eth_args) g_ether.dev_addr=\$(eth_a_gadget)
setenv eth_args $(eth_args) g_ether.iManufacturer=\$(eth_i_vendor)
setenv eth_args $(eth_args) g_ether.iProduct=\$(eth_i_product)
*#* you can assign USB vendor/product/version codes too...
setenv add_eth_args setenv bootargs $(eth_args) \$(bootargs)
...
setenv bootcmd run add_eth_args\;bootm
这些参数也可以附加到cmdline.txt
DHCP 服务器上,以便更好地使用。
答案2
这对我有用:
在 cmdline.txt 中设置 MAC 地址,以便能够在 PI 接口出现时自动识别该接口:
...rootwait modules-load=dwc2,g_ether g_ether.dev_addr=AA:BB:CC:DD:EE:GG g_ether.host_addr=AA:BB:CC:DD:EE:FF quiet...
然后在主机上(仅一次):
IF_NAME=$(ip --oneline link show | grep aa:bb:cc:dd:ee:ff | awk '{split($0,a,": "); print a[2];}')
nmcli connection add type ethernet ifname $IF_NAME ipv4.method shared con-name local_pi_shared
nmcli connection up local_pi_shared
现在,每次您将 Zero 连接到 USB 时,它都会被检测到并激活 local_pi_shared。
删除连接:
nmcli con del local_pi_shared
我用小脚本自动化了它:https://github.com/radzimir/Raspberry-Pi-OTG