我已通过 Wi-Fi 将运行 Ubuntu 20.04 的 Raspberry Pi 4 连接到我的本地 LAN。
我可以通过以下方式从我的笔记本电脑顺利地通过 SSH 连接到 Raspberry Pi:
$ ssh [email protected]
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-1022-raspi aarch64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
...
我希望能够使用主机名通过 SSH 连接到该 IP,而不必每次都输入该 IP:。rasp01
我找到了这个指南:
https://thepihut.com/blogs/raspberry-pi-tutorials/19668676-renaming-your-raspberry-pi-the-hostname
我已经遵循了。重启 Raspberry Pi 并登录后,我看到了以下内容:
ubuntu@rasp01:~$ hostname
rasp01
ubuntu@rasp01:~$ cat /etc/hosts
rasp01 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
ubuntu@rasp01:~$ cat /etc/hostname
rasp01
但是,当我尝试使用该主机名从同一 LAN 上的笔记本电脑(也运行 Ubuntu)通过 SSH 连接到 Raspberry Pi 时,我得到了:
$ ssh ubuntu@rasp01
ssh: Could not resolve hostname rasp01: Name or service not known
$ ssh [email protected]
ssh: Could not resolve hostname rasp01.local: Name or service not known
$ ssh [email protected].
ssh: Could not resolve hostname rasp01.local.: Name or service not known
我错过了什么?
如果我必须为其添加后缀,那就没问题了,*.local
但这似乎不起作用。相关主题在这里:
用户显然*.local
最终让它能够工作。
此外,Raspberry Pi 4 将成为 Raspberry Picluster 的一部分,我将在其中安装 docker/kubernetes(实验室乐趣)。我的经验是,当仅将 Docker 添加到组合中时,网络已经变得相当复杂,这篇文章也证实了这一点:
https://gnanesh.me/avahi-docker-non-root.html
从这个角度来看,安装我自己的内部 DNS 是否会“更简单”:
https://medium.com/nuculabs/setting-up-a-simple-dns-server-859de750f6fe
服务器而不是按照以下答案中的建议在节点上安装 Avahi?
答案1
只需安装avahi-daemon
在 Raspberry Pi 上。
这avahi-daemon
基本上在 Raspberry Pi 上设置一个多播主机名,应该通过 LAN 进行广播:
“Avahi mDNS/DNS-SD 守护进程实现了 Apple 的 Zeroconf 架构(也称为“Rendezvous”或“Bonjour”)。该守护进程使用 mDNS/DNS-SD 注册本地 IP 地址和静态服务,并为本地程序提供两个 IPC API,以利用 avahi-daemon 维护的 mDNS 记录缓存。”
安装非常简单:
sudo apt-get install avahi-daemon avahi-utils;
就是这样!然后,无论该设备的主机名是什么,都可以在网络上访问[hostname].local
。只需从网络上的另一台设备 ping 它,如下所示:
ping rasp01.local
您应该会看到它解析到该设备的 IP 地址。如果您没有看到它立即出现,请等待一分钟左右,然后再次 ping。也许可以像这样重新启动 Avahi 服务:
sudo service avahi-daemon restart
你应该表现得很好。
一般来说,编辑 Hosts 文件 ( /etc/hosts/
) 是一种非常笨拙的方法。它需要手动干预,如果 IP 地址发生变化,猜猜会发生什么?更多的手动干预。Avahi 才是最佳选择。
答案2
我错过了什么?
IP LAN 没有通用的本地主机名查找方法——是有几种协议,但它们更像是附加组件。通常需要手动启用它们,尤其是在 Linux 上。
通常您的家用路由器将提供内部 DNS。如果 Pi 使用 DHCP,它将在发送 DHCP 租约请求时通告其主机名 - 大多数家庭路由器随后会在本地 DNS 域(例如.home
或.lan
或类似的东西)中发布它。
企业网络和自定义 DHCP 服务器通常不会有这样的自动注册。
请注意,此方法不适用于静态 IP 地址(如果需要,请使用 DHCP 预留),并且不会自动检测主机名更改。因此,如果您现在重命名 Pi,你必须重新启动 DHCP 客户端并获得一份新的租约。
它还要求其他计算机知道路由器 DNS 使用的 DNS 搜索后缀。这也可以通过 DHCP 从路由器自动检索,但如果主机使用静态地址,则必须手动配置。
另一个选择是多播 DNS (mDNS)。这是使用 的那个.local
。要使其在 Linux 上运行,您需要安装avahi 守护进程和libnss-mdns在所有参与的设备上。
mDNS 也是 macOS 的标准部分,可通过注册表更改在 Windows 10 中使用。
顾名思义,mDNS 使用多播数据包 - 这些数据包在 WiFi 上并不总是可靠的,并且一些无线网络会直接阻止它们。确保您的路由器不会阻止它们。
LLMNR 与 mDNS 非常相似,但不使用任何域后缀。它主要由 Windows 使用,但也受 Linux 上的 systemd-resolved 支持。您可以根据需要同时运行两者。
(还有 NetBIOS,这是 Windows 过去曾经使用过的。曾经非常常见(尽管不可靠),但随着 SMBv1 的删除现在很少见。Samba 支持它,但不要介意。)
但是如果 IP 发生变化怎么办
大多数路由器都能够将 DHCP 租约永久分配给特定设备。(这可能被称为“静态租约”或“预留”,但它并不总是有特定的名称。)如果您希望 Pi 始终为 192.168.3.14 或其他任何地址,则可以这样做。