远程访问

远程访问简介

有时您需要在不将其连接到显示器、键盘和鼠标的情况下访问Raspberry Pi。也许Raspberry Pi嵌入在机器人中或安装在不方便的位置。或者您没有备用显示器。

远程控制本地网络

要从本地网络上的另一台设备远程控制您的Raspberry Pi,请使用以下服务之一:

SSH(Secure SHell)提供对Raspberry Pi上的终端会话的安全访问。VNC(Virtual Network Computing)提供对Raspberry Pi桌面屏幕共享的安全访问。您所需要的只是另一台计算机、本地网络和Raspberry Pi的本地 IP地址。Raspberry Pi Connect安全地共享Raspberry Pi的屏幕,无需确定您的本地IP地址。

通过本地网络在设备之间共享文件

诸如 NFS(网络文件系统)、SCP(安全复制协议)、Sambarsync 之类的服务使您能够在本地网络上的设备之间共享文件,而无需直接控制远程设备。当您需要从另一台设备访问存储在一台设备上的数据时,这些服务非常有用。

通过互联网进行远程控制

要从任何连接到Internet的设备远程控制您的Raspberry Pi,您可以:

  • 通过开放互联网、VPN 或使用外部服务(如 RealVNC 的云 VNC Viewer)在 Raspberry Pi 上公开 SSHVNC

  • 使用 Raspberry Pi Connect,这是 Raspberry Pi 提供的免费屏幕共享和远程 shell 服务。

找到您的Raspberry Pi的IP地址

从另一台机器连接到Raspberry Pi的大多数方法都需要您知道Raspberry Pi的本地IP地址。

连接到局域网的任何设备都被分配了一个IP地址。为了使用 SSHVNC 从另一台机器连接到您的Raspberry Pi,您需要知道Raspberry Pi的IP地址。如果您连接了显示器,这很容易,并且有许多方法可以从网络上的另一台机器远程找到它。

要查找Raspberry Pi的本地IP地址,请使用以下方法之一。

桌面

将鼠标悬停在系统托盘中的网络图标上,将出现一个工具提示。此工具提示显示您当前连接的网络名称和您的IP地址。

显示Wi-Fi网络名称和IP地址的网络管理器工具提示

命令行

运行以下命令将本地IP地址输出到命令行:

$ hostname -I

引导输出

如果您在Raspberry Pi中使用显示器并且引导到命令行而不是桌面,则引导顺序会将您的IP地址作为登录提示之前的最后几条输出消息之一。

网络管理器

您可以使用内置的Network Manager CLI( nmcli )访问有关您的网络的详细信息。运行以下命令:

$ nmcli device show

您应该会看到类似于以下内容的输出:

GENERAL.DEVICE:                         wlan0
GENERAL.TYPE:                           wifi
GENERAL.HWADDR:                         D0:3B:FF:41:AB:8A
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     exampleNetworkName
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/2
IP4.ADDRESS[1]:                         192.168.1.42/24
IP4.GATEWAY:                            192.168.1.1
IP4.ROUTE[1]:                           dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 600
IP4.ROUTE[2]:                           dst = 0.0.0.0/0, nh = 192.168.1.1, mt = 600
IP4.DNS[1]:                             192.168.1.3
IP6.ADDRESS[1]:                         ab80::11ab:b1fc:bb7e:a8a5/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = ab80::/64, nh = ::, mt = 1024

GENERAL.DEVICE:                         lo
GENERAL.TYPE:                           loopback
GENERAL.HWADDR:                         00:00:00:00:00:00
GENERAL.MTU:                            65536
GENERAL.STATE:                          100 (connected (externally))
GENERAL.CONNECTION:                     lo
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/1
IP4.ADDRESS[1]:                         127.0.0.1/8
IP4.GATEWAY:                            --
IP6.ADDRESS[1]:                         ::1/128
IP6.GATEWAY:                            --

GENERAL.DEVICE:                         p2p-dev-wlan0
GENERAL.TYPE:                           wifi-p2p
GENERAL.HWADDR:                         (unknown)
GENERAL.MTU:                            0
GENERAL.STATE:                          30 (disconnected)
GENERAL.CONNECTION:                     --
GENERAL.CON-PATH:                       --

GENERAL.DEVICE:                         eth0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         D0:3B:FF:41:AB:89
GENERAL.MTU:                            1500
GENERAL.STATE:                          20 (unavailable)
GENERAL.CONNECTION:                     --
GENERAL.CON-PATH:                       --
WIRED-PROPERTIES.CARRIER:               off
IP4.GATEWAY:                            --
IP6.GATEWAY:                            --

此命令输出有关Raspberry Pi上可访问的各种网络接口的信息。检查 GENERAL.TYPE 行以查看每个块描述的网络接口类型。例如,"ethernet"是您设备上的以太网端口,"wifi"是指某些设备内置的Wi-Fi芯片。您将根据设备访问互联网的方式查看不同的输出块以找到您的IP地址:

  • 如果您的设备使用Wi-Fi连接到互联网,请检查"wifi"部分

  • 如果您的设备使用以太网端口连接到互联网,请检查"ethernet"部分

在上面的示例中,Raspberry Pi使用Wi-Fi访问互联网。检查 GENERAL.TYPE 字段读取"wifi"的部分以查找IP地址。在这种情况下,您可以使用 IP4.ADDRESS[1] 字段中的IPv4地址访问此设备: 192.168.1.42

使用mDNS解析 raspberrypi.local

Raspberry Pi OS支持多播DNS作为Avahi服务的一部分。

如果您的设备支持mDNS,您可以使用其主机名和 .local 后缀访问您的Raspberry Pi。 新安装的Raspberry Pi OS上的默认主机名是 raspberrypi ,因此默认情况下,任何运行Raspberry Pi OS的Raspberry Pi都会响应:

$ ping raspberrypi.local

如果可以访问Raspberry Pi, ping 将显示其IP地址:

PING raspberrypi.local (192.168.1.131): 56 data bytes
64 bytes from 192.168.1.131: icmp_seq=0 ttl=255 time=2.618 ms
Tip
如果您使用Raspberry Pi Configuration、 raspi-config/etc/hostname 更改Raspberry Pi的系统主机名,Avahi会更新 .local 的mDNS地址。如果您不记得Raspberry Pi的主机名,您可以在其他设备上安装Avahi,然后使用 avahi-Browse 浏览本地网络上的所有主机和服务。

检查路由器的设备列表

在web浏览器中,导航到路由器的IP地址。然后,使用您的凭据登录。

Tip
您的路由器的IP地址通常是 http://192.168.1.1 ,但并非总是如此。您可以在路由器的标签上找到路由器的地址和凭据。

这将带您进入控制面板。浏览到连接设备或类似设备的列表(所有路由器都不同),您应该会看到一些您认识的设备。一些设备被检测为个人电脑、平板电脑、手机、打印机等。所以你应该识别一些并排除它们,以确定哪个是你的树莓派。

Tip
如果您使用电线将Raspberry Pi连接到网络,请尝试过滤列表中的有线设备。可供选择的设备应该更少。

使用 nmap 查找设备

Network Mapper命令( nmap )是用于网络发现的免费开源工具。它适用于Linux、macOS和Windows。

  • 要在 Linux 上安装,请安装 nmap 包,例如 sudo apt install nmap

  • 要在 macOSWindows 上安装,请参阅 nmap.org下载页面

要使用 nmap 扫描网络上的设备,您需要知道您连接的子网。首先,找到您正在使用的计算机的本地IP地址:

  • Linux 上,在终端窗口中输入 hostname -I

  • macOS 上,转到 系统设置 > 网络,选择您的活动网络连接,然后单击 详细信息… 按钮

  • Windows 上,转到控制面板,然后在 网络和共享中心 下,单击 查看网络连接,选择您的活动网络连接,然后单击 查看此连接的状态

接下来,扫描整个 子网 以查找其他设备。大多数本地网络使用IPv4,它使用四个数字,每个IP地址的值在1到255之间。您子网上的设备都使用相同的前三个数字。例如,如果您的IP地址是 192.168.1.5 ,其他设备将使用 192.168.1.2192.168.1.6192.168.1.200 等地址。要使用 nmap 扫描此子网,请传递字符串 192.168.1.0/24 ,该字符串涵盖子网范围 192.168.1.0192.168.1.255 。使用 -sn 标志对整个子网范围运行ping扫描

$ sudo nmap -sn 192.168.1.0/24
Tip
这可能需要一分钟,具体取决于您的本地网络速度。

ping扫描查询范围内的所有IP地址以获取响应。对于响应ping的每个设备,输出显示主机名和IP地址,如下所示:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-10 12:46 GMT
Nmap scan report for hpprinter (192.168.1.2)
Host is up (0.00044s latency).
Nmap scan report for Gordons-MBP (192.168.1.4)
Host is up (0.0010s latency).
Nmap scan report for ubuntu (192.168.1.5)
Host is up (0.0010s latency).
Nmap scan report for raspberrypi (192.168.1.8)
Host is up (0.0030s latency).
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.41 seconds

上面的输出显示主机名为raspberrypi的设备的IP地址为192.168.1.8。

使用智能手机应用程序查找设备

Fing 应用程序是一款免费的智能手机网络扫描仪。它适用于 AndroidiOS

  1. 将手机连接到与 Raspberry Pi 相同的网络。

  2. 打开 Fing 应用程序时,轻触屏幕右上角的刷新按钮。

  3. 几秒钟后,你会看到一个列表,其中列出了所有连接到网络的设备。

  4. 向下滚动到制造商为 "Raspberry Pi "的条目。IP 地址显示在条目的左下角,MAC 地址显示在右下角。

使用 SSH 访问远程终端

您可以使用 SSH 协议从同一网络上的另一台计算机远程访问 Raspberry Pi 的终端。

启用 SSH 服务器

默认情况下,Raspberry Pi OS 禁用 SSH 服务器。通过以下方式之一启用 SSH:

  • 通过桌面

  • 烧录新的 OS 镜像时

  • 从终端使能SSH

  • 手动使能SSH

  1. Preferences 菜单启动 Raspberry Pi 配置

  2. 导航至 Interfaces 选项卡。

  3. 选择 SSH 旁边的 Enabled

  4. 单击 OK

要在全新安装的 Raspberry Pi OS 上配置 SSH:

  1. 按照 Install with Imager 指南中的说明操作。

  2. 操作系统自定义步骤中,导航至服务选项卡。

  3. 勾选启用 SSH复选框。

  4. 选择密码验证,使用与实际使用 Raspberry Pi 时相同的用户名和密码登录。选择 Allow public-key authentication only配置 SSH 密钥 进行无密码登录。

  1. 在终端窗口输入 sudo raspi-config

  2. 选择 Interfacing Options

  3. 导航至并选择 SSH

  4. 选择 Yes

  5. 选择 Ok

  6. 选择 Finish`

  1. 在启动分区中创建一个名为 ssh 的空文件:

    $ sudo touch /boot/firmware/ssh
  2. 重启机器:

    $ sudo reboot

连接到 SSH 服务器

在您的计算机上打开一个终端窗口并输入以下命令,将 <ip address> 占位符替换为 您尝试连接的 Raspberry Pi 的 IP 地址,并将 <username> 替换为您的用户名:

$ ssh <username>@<ip address>

连接成功后,您将看到安全警告。输入 yes 继续。您只会在第一次连接时看到此警告。

出现提示时输入您的帐户密码。

您现在应该会看到 Raspberry Pi 命令提示符:

<username>@<hostname> ~ $

您现在已远程连接到 Raspberry Pi,并且可以执行命令。

Note
如果您收到 connection timed out 错误,则可能是您输入了错误的 Raspberry Pi IP 地址。请查看 Raspberry Pi 的 IP 地址

通过 SSH 转发 X11

Note
在 Raspberry Pi 4 和 5 上,Raspberry Pi OS Bookworm 默认使用 Wayland 窗口服务器。如果您使用 X 窗口服务器,则只能转发 X11。要通过 X11 启用窗口转发,请在 Raspberry Pi 配置中将桌面切换到 X 窗口服务器。
Note
许多桌面环境中不再默认安装 X11。安装第三方 X 服务器(例如 XQuartz)以使用 X11 转发。

X11 通过 SSH 启用图形应用程序。传递 -Y 标志以通过 SSH 转发 X 会话:

$ ssh -Y <username>@<ip address>

通过身份验证后,您将照常看到命令行。但是,您也可以打开 X 服务器可以为您呈现的图形窗口。例如,键入以下命令以启动 Geany 窗口:

$ geany &

配置无密码 SSH

要远程访问您的 Raspberry Pi 而无需每次连接时都提供密码,请使用 SSH 密钥对。

使用 Raspberry Pi Imager 预配置操作系统镜像

使用 Raspberry Pi Imager 配置启动映像时,您可以预配置 SSH 密钥。您可以生成新的 SSH 密钥对或现有的 SSH 密钥。

  1. 按照 使用 Imager 安装 指南配置您的启动映像。

  2. OS Customisation 步骤中,导航到 Services 选项卡并勾选 启用 SSH 复选框。

  3. 选择 仅允许公钥身份验证 单选按钮。如果您已经在 ~/.ssh/id_rsa.pub 中存储了 SSH 公钥,Imager 会自动使用该公钥预填充文本框。如果 Imager 找不到 SSH 公钥,您可以单击 RUN SSH-KEYGEN 按钮来生成新的密钥对。

手动配置 SSH 密钥

如果您已经安装了 Raspberry Pi OS,则可以更新现有配置以使用 SSH 密钥身份验证。

检查是否存在现有的 SSH 公钥

要检查用于远程连接到 Raspberry Pi 的计算机上是否存在现有的 SSH 公钥,请运行以下命令:

$ ls ~/.ssh

如果你看到名为 id_ed25519.pubid_rsa.pubid_dsa.pub 的文件,说明你已经有了 SSH 密钥。跳过 SSH 密钥对生成,继续 将 SSH 密钥添加到 SSH Identity 列表中

生成新的SSH密钥对

Tip
本指南提供了生成新RSA密钥的说明。为了提高安全性,您可以改为生成 Ed25519 密钥。当引用您的公钥和私钥文件名以使用Ed25519密钥时,将 -t ed25519 传递给 ssh-keygen 并将 rsa 替换为 ed25519

要生成新的SSH密钥对,请输入以下命令:

$ ssh-keygen

当询问在哪里保存密钥时,按 Enter 使用默认位置 ~/.ssh/id_rsa

当要求输入可选关键字时,按 Enter 以不使用关键字。

运行以下命令检查 .ssh 目录的内容:

$ ls ~/.ssh

您应该看到文件 id_rsaid_rsa.pub

authorized_keys  id_rsa  id_rsa.pub  known_hosts

id_rsa 文件包含您的私钥。在您用于远程连接到Raspberry Pi的计算机上确保其安全。

id_rsa.pub文件包含您的公钥。您将与您的Raspberry Pi共享此密钥。当您远程连接Raspberry Pi时,它将使用此密钥来验证您的身份。

将SSH密钥添加到SSH身份列表中

启动SSH代理:

$ eval "$(ssh-agent -s)"

接下来,使用以下命令将您的密钥身份添加到 ssh-agent

$ ssh-add ~/.ssh/id_rsa

将公钥复制到您的Raspberry Pi

在您用于远程连接到Raspberry Pi的计算机上,使用以下命令将您的公钥安全地复制到Raspberry Pi:

$ ssh-copy-id <username>@<ip address>

出现提示时,在Raspberry Pi上输入您的用户帐户的密码。 您现在无需输入密码即可连接到Raspberry Pi。

手动将公钥复制到您的Raspberry Pi

如果您的操作系统不支持 ssh-cop-id ,您可以使用 scp 复制您的公钥: 。

首先,on您的RaspberryPi,创建Linux期望查找密钥的目录:

$ mkdir .ssh

然后,为 .ssh 目录配置适当的权限:

$ chmod 700 .ssh

On您通常的computer,使用 scp 将您的公钥复制到Raspberry Pi上名为 .ssh/authorized_keys 的文件中:

$ scp .ssh/id_rsa.pub <username>@<ip address>:.ssh/authorized_keys
Tip
上面的命令假定您以前从未授权任何密钥访问您的Raspberry Pi。如果您之前至少添加了一个密钥,您应该在 authorized_keys 文件的末尾添加一个包含公钥的新行,以保留您现有的密钥。

出现提示时,在Raspberry Pi上输入您的用户帐户的密码。

然后,onRaspberryPi,配置 authorized_keys 文件的权限:

$ chmod 644 .ssh/authorized_keys

您现在无需输入密码即可连接到Raspberry Pi。

使用 VNC 共享屏幕

有时,使用设备进行物理操作并不方便。虚拟网络计算 (VNC) 允许您从另一台设备控制一台设备的桌面。

VNC 依赖于客户端和服务器。客户端运行在可以进行物理交互的设备上,例如个人笔记本电脑、台式机、平板电脑或手机。服务器运行在 Raspberry Pi 上。 使用 VNC 时,客户端向服务器发送键盘和鼠标事件。服务器在 Raspberry Pi 上执行这些事件,并向客户端返回屏幕更新。

当您使用 VNC 时,客户端会将键盘和鼠标事件传输到服务器。服务器在您的 Raspberry Pi 上执行这些事件,并将屏幕更新返回给客户端。

VNC 客户端在窗口中显示您的 Raspberry Pi 的桌面。您可以像在 Raspberry Pi 上工作一样与桌面交互。

Raspberry Pi OS 包括 wayvnc。这提供了一个 VNC 服务器,您可以在设备首选项中启用它。

在 Raspberry Pi 上使用 VNC 之前,您必须启用 VNC 服务器。

启用 VNC 服务器

Raspberry Pi OS 支持以图形方式和命令行方式启用 VNC 服务器。

Tip
启用后,您可以在 /etc/wayvnc/ 访问 WayVNC 配置。

以图形方式启用 VNC 服务器

  1. 启动 Raspberry Pi 上的图形桌面。

  2. 单击桌面系统托盘中的 Raspberry Pi 图标。

  3. 从菜单中选择 Preferences > Raspberry Pi 配置

    从系统托盘中的首选项菜单中选择 Raspberry Pi 配置
  4. 导航到 Interfaces 选项卡。

  5. 单击 VNC 旁边的单选按钮,使其处于活动位置。

    在接口选项卡中,单击 VNC 切换到活动位置以启用 VNC."
  6. 单击 OK 按钮保存配置更改。

在命令行上启用 VNC 服务器

使用 raspi-config 在命令行上启用 VNC 服务器。

  1. 使用以下命令打开’raspi-config':

    $ sudo raspi-config
  2. 导航至 Interface Options。按 Enter 键选择。

  3. 选择 VNC。按 Enter 键选择。

  4. Would you like the VNC Server to be enabled?(是否启用 VNC 服务器)下,选择 <Yes> ,然后按 Enter

  5. Enter 返回菜单。按 Esc 键退出 raspi-config

连接到 VNC 服务器

要连接到您的 Raspberry Pi,您需要以下设备:

  • 您的 Raspberry Pi 和运行 VNC 客户端的设备,连接到同一网络(例如家庭无线网络或 VPN)

  • 您的 Raspberry Pi 的主机名或 IP 地址

  • Raspberry Pi 上帐户的有效用户名和密码组合

如果您不知道设备的 IP 地址,请参阅 我们关于查找 IP 地址的说明

  1. 下载 TigerVNC。您可以从 其 GitHub 存储库的发布页面 安装最新版本。单击最新版本中的链接,找到适合您平台的二进制文件。Windows 用户应下载 exe ;macOS 用户应下载 dmg ;Linux 用户应安装 jar

  2. 在您的客户端设备上,启动 TigerVNC。在 macOS 和 Windows 上,您可以双击二进制文件。在 Linux 上,使用 sudo apt install default-jre 安装 java,然后运行 java -jar VncViewer-<version>.jar ,将 <version> 占位符替换为您下载的版本。

  3. 在 "VNC 服务器" 字段中,输入 Raspberry Pi 的 IP 地址。

    将 Raspberry Pi 的本地 IP 地址输入 TigerVNC
  4. 单击 "Options"按钮。导航至 "Input"选项卡。选中 "无光标时显示点 "旁边的复选框,确保在 TigerVNC 中始终能看到光标。

    TigerVNC 选项,用于始终将光标呈现为点,width=
  5. 单击’连接’按钮以启动与服务器的连接。

    • 如果 TigerVNC 警告您’主机名与服务器证书不匹配',请单击"Yes"按钮继续。

      TigerVNC 警告证书不匹配
    • 如果 TigerVNC 警告您"certificate has been signed by an unknown authority",请单击’是’按钮为您的 Raspberry Pi 授予例外。

      TigerVNC 警告证书已由未知机构签名,width=
      当提示输入用户名和密码时,请输入您的凭据。
      Entering a username and password to authenticate via TigerVNC,width=
  6. 点击 "OK"(确定)按钮验证 VNC 服务器。如果凭据正确无误,TigerVNC 将打开一个窗口,其中包含与你在 Raspberry Pi 上的账户相对应的桌面。你应该可以移动鼠标和键盘输入文本并与桌面互动

    The desktop of a Raspberry Pi after successfully authenticating with TigerVNC

使用 Raspberry Pi Connect 进行远程访问

您可以使用 Raspberry Pi Connect 从其他设备上的浏览器远程访问 Raspberry Pi。Connect 会自动处理配置,因此你不必查找 Raspberry Pi 的本地 IP 地址、网络的公共 IP 地址,也不必修改本地网络防火墙以启用外部访问。

Connect 包括在运行 Wayland 窗口服务器的 Raspberry Pi 型号上进行屏幕共享的功能,以及在所有 Raspberry Pi 型号上进行远程 shell(终端)访问的功能。

For more information, see the Connect documentation.

使用 SCP 共享文件

安全复制协议 ( scp ) 通过 SSH 发送文件。您可以使用 scp 在 Raspberry Pi 和另一台计算机之间复制文件。

要使用 scp ,请查找 Raspberry Pi 的 IP 地址。

将文件复制到您的 Raspberry Pi

要将名为 myfile.txt 的文件从您的个人计算机复制到 Raspberry Pi 上的用户主文件夹,请从包含 myfile.txt 的目录中运行以下命令,将 <username> 占位符替换为您用于登录 Raspberry Pi 的用户名,将 <pi_ip_address> 占位符替换为您 Raspberry Pi 的 IP 地址:

$ scp myfile.txt <username>@<pi_ip_address>:

要将文件复制到特定目录,请在 scp 命令中的 : 后附加目录路径。在运行 scp 之前创建文件夹,因为 scp 不会自动创建文件夹。例如,以下命令将名为 myfile.txt 的文件复制到用户主文件夹中的 project/ 目录中:

$ scp myfile.txt <username>@<pi_ip_address>:project/

从 Raspberry Pi 复制文件

要将名为 myfile.txt 的文件从 Raspberry Pi 上的用户主目录复制到另一台计算机上的当前目录,请运行以下命令:

$ scp <username>@<pi_ip_address>:myfile.txt .

使用一个命令复制多个文件

要复制多个文件,请在单个命令中列出文件名,并用空格分隔:

$ scp myfile.txt myfile2.txt <username>@<pi_ip_address>:

或者,使用通配符复制与特定过滤器匹配的所有文件。以下命令复制所有以 .txt 结尾的文件:

$ scp *.txt <username>@<pi_ip_address>:

以下命令复制所有以 m 开头的文件:

$ scp m* <username>@<pi_ip_address>:

以下命令复制所有以 m 开头并以 .txt 结尾的文件:

$ scp m*.txt <username>@<pi_ip_address>:
Note

要复制名称包含空格的文件,请将文件名括在引号中:

$ scp "my file.txt" <username>@<pi_ip_address>:

复制文件夹

要复制文件夹及其所有内容,请使用以下参数传递文件夹名称: -r (递归)标志:

$ scp -r project/ <username>@<pi_ip_address>:

使用 rsync 在计算机之间同步文件夹

您可以使用 rsync 在计算机之间同步文件夹。例如,您可以使用 rsync 将Raspberry Pi拍摄的新照片自动传输到您的个人计算机。

在配置 rsync 之前,请确定以下值:

  • <pi_ip_address> :您的Raspberry Pi的本地IP地址:请参阅 查找您的Raspberry Pi的IP地址 了解更多信息

  • <pi_username>:用于登录树莓派的用户名

  • <pi_folder_name> :您要从Raspberry Pi上复制文件的文件夹名称

  • <pc_folder_name> :您要在个人计算机上同步的文件夹的名称

要将 rsync 配置为同步文件,请在您的个人计算机上完成以下步骤,将命令中的占位符替换为您在上面确定的值:

  1. 创建您要同步到的文件夹:

    $ mkdir <pc_folder_name>
  2. 使用 rsync 将文件同步到文件夹:

    $ rsync -avz -e ssh <pi_username>@<pi_ip_address>:<pi_folder_name>/ <pc_folder_name>/

此命令将Raspberry Pi上选定文件夹中的所有文件复制到个人计算机上的选定文件夹中。如果您多次运行该命令, rsync 会跟踪您已经下载的文件并跳过它们。如果您删除或修改Raspberry Pi上已经同步的文件, rsync 会相应地更新您个人计算机上的文件。

网络文件系统 (NFS)

网络文件系统 (NFS) 允许您与同一网络上的其他计算机或设备共享位于一台联网计算机上的目录。目录所在的计算机称为 服务器,连接到该服务器的计算机或设备称为客户端。客户端通常 mount 共享目录,使其成为其自身目录结构的一部分。共享目录是共享资源或网络共享的一个示例。

NFS 是在 Linux/Unix 环境中创建简单 NAS(网络附加存储)的流行方法。

NFS 可能最适合更永久的网络挂载目录,例如 /home 目录或经常访问的共享资源。如果您想要一个来宾用户可以轻松连接的网络共享,Samba 更适合这项任务。临时挂载和分离 Samba 共享的工具在各个操作系统中都更容易获得。

在部署 NFS 之前,您应该熟悉:

  • Linux 文件和目录权限

  • 挂载和卸载文件系统

设置基本 NFS 服务器

使用以下命令安装所需的软件包:

$ sudo apt install nfs-kernel-server

为了便于维护,我们将所有 NFS 导出隔离在单个目录中,并使用 --bind 选项将实际目录挂载到该目录中。

假设我们要导出用户的主目录,这些目录位于 /home/users 中。首先,我们创建导出文件系统:

$ sudo mkdir -p /export/users
Tip
如果您计划配置 LDAP/NIS 身份验证,请跳过下面的 chmod 步骤。

授予 /export/export/users 读取、写入和执行权限 ( 777 ),以便您可以从客户端访问 NFS 共享,而无需 LDAP/NIS 身份验证:

$ chmod -R 777 /export

接下来,使用以下命令挂载真正的 users 目录:

$ sudo mount --bind /home/users /export/users

为了避免每次重启后都重新输入这些内容,我们将以下行添加到 /etc/fstab

/home/users    /export/users   none    bind  0  0

有三个配置文件与 NFS 服务器相关:

  1. /etc/default/nfs-kernel-server

  2. /etc/default/nfs-common

  3. /etc/exports

目前 /etc/default/nfs-kernel-server 中唯一重要的选项是 NEED_SVCGSSD 。默认情况下,它设置为 "no" ,这很好,因为我们这次不激活 NFSv4 安全性。

为了自动映射 ID 名称,文件 /etc/idmapd.conf 必须存在于客户端和服务器上,并且内容相同且域名正确。此外,此文件的 Mapping 部分应包含以下行:

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

但是,请注意,客户端对 Nobody-User 和 Nobody-Group 可能有不同的要求。例如,在 RedHat 变体上,两者都是 nfsnobody 。如果您不确定,请通过以下命令检查是否存在 nobodynogroup

$ cat /etc/passwd
$ cat /etc/group

这样,服务器和客户端就不需要用户共享相同的 UID/GUID。对于使用基于 LDAP 的身份验证的用户,请在客户端的 idmapd.conf 中添加以下几行:

[Translation]

Method = nsswitch

这将让 idmapd 知道查看 nsswitch.conf 以确定应在何处查找凭据信息。如果您的 LDAP 身份验证已在运行,则 nsswitch 不需要进一步解释。

要将我们的目录导出到本地网络 192.168.1.0/24 ,请将以下两行添加到 /etc/exports

/export       192.168.1.0/24(rw,fsid=0,insecure,no_subtree_check,async)
/export/users 192.168.1.0/24(rw,nohide,insecure,no_subtree_check,async)

Portmap 锁定(可选)

NFS 上的文件对网络上的任何人都开放。作为一项安全措施,您可以限制对指定客户端的访问。

将以下行添加到 /etc/hosts.deny

rpcbind mountd nfsd statd lockd rquotad : ALL

通过首先阻止所有客户端,只有 /etc/hosts.allow (下面添加)中的客户端才被允许访问服务器。

现在将以下行添加到 /etc/hosts.allow

rpcbind mountd nfsd statd lockd rquotad : <list of IPv4s>

其中 <list of IPv4s> 是服务器和所有客户端的 IP 地址列表。(这些必须是 IP 地址,因为 rpcbind 有限制,它支持主机名)。请注意,如果已经设置了 NIS,可以直接将这些地址添加到同一行。

请确保授权 IP 地址列表包含 localhost 地址( 127.0.0.1 ),因为 Ubuntu 最新版本的启动脚本使用 rpcinfo 命令来发现 NFSv3 支持,如果 localhost 无法连接,该命令将被禁用。

最后,要使更改生效,请重新启动服务:

$ sudo systemctl restart nfs-kernel-server

配置 NFS 客户端

现在您的服务器正在运行,您需要设置任何客户端以便能够访问它。首先,安装所需的软件包:

$ sudo apt install nfs-common

在客户端,我们可以使用一个命令挂载:

$ mount -t nfs -o proto=tcp,port=2049 <nfs-server-IP>:/ /mnt

您还可以指定 NFS 服务器主机名而不是其 IP 地址,但在这种情况下,您需要确保主机名可以在客户端解析为 IP。确保始终解析此 IP 的可靠方法是使用 /etc/hosts 文件。

请注意,在 NFSv4 中不需要 <nfs-server-IP>:/export ,而在 NFSv3 中则不需要。根导出 :/ 默认为使用 fsid=0 导出。

我们还可以使用以下命令挂载导出的子树:

$ mount -t nfs -o proto=tcp,port=2049 <nfs-server-IP>:/users /home/users

为确保每次重新启动时都挂载该子树,请在 /etc/fstab 中添加以下行:

<nfs-server-IP>:/ /mnt nfs auto 0 0

如果挂载后, /proc/mounts 中的条目显示为 <nfs-server-IP>:// (带有两个斜杠),则您可能需要在 /etc/fstab 中指定两个斜杠,否则 umount 可能会抱怨找不到挂载。

端口映射锁定(可选)

将以下行添加到 /etc/hosts.deny

rpcbind : ALL

通过首先阻止所有客户端,只有 /etc/hosts.allow (下面添加)中的客户端才被允许访问服务器。

现在将以下行添加到 /etc/hosts.allow

rpcbind : <NFS server IP address>

其中 <NFS server IP address> 是服务器的 IP 地址。

配置复杂的 NFS 服务器

NFS 用户权限基于用户 ID (UID)。客户端上任何用户的 UID 都必须与服务器上的 UID 匹配,用户才能访问。执行此操作的典型方法是:

  • 手动密码文件同步

  • 使用 LDAP

  • 使用 DNS

  • 使用 NIS

请注意,在主用户具有 root 访问权限的系统上,您必须小心:该用户可以更改系统上的 UID,以允许自己访问任何人的文件。本页假设管理团队是唯一具有 root 访问权限的组,并且他们都受到信任。其他任何内容都代表更高级的配置,这里不再赘述。

组权限

用户的文件访问权限由他们在客户端上的组成员身份决定,而不是服务器上的组成员身份。但是,有一个重要的限制:从客户端传递到服务器的组最多为 16 个,如果用户在客户端上是 16 个以上组的成员,则某些文件或目录可能会意外无法访问。

DNS(可选,仅在使用 DNS 时)

将任何客户端名称和 IP 地址添加到 /etc/hosts 。 (服务器的 IP 地址应该已经存在。)这样可以确保即使 DNS 发生故障,NFS 仍能正常工作。或者,如果您愿意,也可以依赖 DNS - 这取决于您。

NIS(可选,仅在使用 NIS 时)

这适用于使用 NIS 的客户端。否则,您无法使用网络组,并且应该在 /etc/exports 中指定单独的 IP 或主机名。请阅读 man netgroup 中的 BUGS 部分以获取更多信息。

首先,编辑 /etc/netgroup 并添加一行来对您的客户端进行分类(此步骤不是必需的,但是为了方便):

myclients (client1,,) (client2,,) ...

其中 myclients 是网络组名称。

接下来运行此命令重建 NIS 数据库:

$ sudo make -C /var/yp

文件名 yp 指的是黄页,即 NIS 的前身。

端口映射锁定(可选)

将以下行添加到 /etc/hosts.deny

rpcbind mountd nfsd statd lockd rquotad : ALL

通过首先阻止所有客户端,只有 /etc/hosts.allow (下面添加)中的客户端才被允许访问服务器。

考虑将以下行添加到 /etc/hosts.allow

rpcbind mountd nfsd statd lockd rquotad : <list of IPs>

其中 <list of IPs> 是服务器和所有客户端的 IP 地址列表。由于 rpcbind 中的限制,这些必须是 IP 地址。请注意,如果已经设置了 NIS,则只需将这些地址添加到同一行即可。

软件包安装和配置

安装必要的软件包:

$ sudo apt install rpcbind nfs-kernel-server

编辑 /etc/exports 并添加共享:

/home @myclients(rw,sync,no_subtree_check)
/usr/local @myclients(rw,sync,no_subtree_check)

上述示例将 /home/usr/local 共享给 myclients 网络组中的所有客户端。

/home 192.168.0.10(rw,sync,no_subtree_check) 192.168.0.11(rw,sync,no_subtree_check)
/usr/local 192.168.0.10(rw,sync,no_subtree_check) 192.168.0.11(rw,sync,no_subtree_check)

上述示例将 /home/usr/local 共享给两个具有静态 IP 地址的客户端。如果您希望允许私有网络中指定 IP 地址范围内的所有客户端访问,请考虑以下操作:

/home 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)
/usr/local 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)

此处, rw 使共享可读/写, sync 要求服务器仅在任何更改刷新到磁盘后才回复请求。这是最安全的选项; async 速度更快,但很危险。如果您正在考虑其他选项,强烈建议您阅读 man exports

设置 /etc/exports 后,导出共享:

$ sudo exportfs -ra

每当修改 /etc/exports 时,您都需要运行此命令。

重新启动服务

重新启动 rpcbind 和 NFS 以使更改生效:

$ sudo systemctl restart rpcbind
$ sudo systemctl restart nfs-kernel-server

需要考虑的安全事项

除了上面讨论的 UID 问题之外,还应注意,攻击者可能会伪装成允许映射共享的机器,这允许他们创建任意 UID 来访问您的文件。一个潜在的解决方案是 IPSec。您可以将所有域成员设置为仅通过 IPSec 相互通信,这将有效地验证您的客户端是否是它所说的那个客户端。

IPSec 的工作原理是使用服务器的公钥加密发往服务器的流量,然后服务器发回使用客户端的公钥加密的所有回复。流量使用相应的私钥解密。如果客户端没有它应该拥有的密钥,它就无法发送或接收数据。

IPSec 的替代方案是物理上独立的网络。这需要单独的网络交换机和单独的以太网卡,以及该网络的物理安全性。

故障排除

只有在您成功登录并且您的主目录已解密后,才能在加密的主目录中安装 NFS 共享。这意味着使用 /etc/fstab 在启动时安装 NFS 共享将不起作用,因为您的主目录在安装时尚未解密。有一个简单的方法可以使用符号链接来解决这个问题:

  1. 创建一个备用目录来安装 NFS 共享:

$ sudo mkdir /nfs
$ sudo mkdir /nfs/music
  1. 编辑 /etc/fstab 以将 NFS 共享挂载到该目录中:

nfsServer:music    /nfs/music    nfs    auto    0 0
  1. 在您的 home 中创建一个符号链接,指向实际的挂载位置。例如,在这种情况下,首先删除已经存在的 Music 目录:

$ rmdir /home/user/Music
$ ln -s /nfs/music/ /home/user/Music

Samba (SMB/CIFS)

Samba 是 服务器消息 (SMB) 网络协议的免费软件重新实现。使用 Samba,您可以在 Windows、macOS 和 Linux 计算机之间共享文件夹。

在您的 Raspberry Pi 上安装 Samba

默认情况下,Raspberry Pi OS 不包含 Samba。要在 Raspberry Pi 上安装 Samba,请运行以下命令,该命令将安装运行 Samba 服务器或客户端所需的所有依赖项:

$ sudo apt update
$ sudo apt install samba samba-common-bin smbclient cifs-utils

安装从 Windows 共享的文件夹

首先,您需要在 Windows 设备上共享文件夹。

打开共享

  1. 右键单击系统托盘,从菜单中选择 网络和共享中心

  2. 选择 更改高级共享设置

  3. 选择 打开网络发现

  4. 选择 打开文件和打印机共享

  5. 单击 保存 按钮保存更改。

共享文件夹

按照以下步骤从 Windows 共享文件夹:

  1. 右键单击要共享的文件夹,然后选择 属性

  2. 选择 共享 选项卡。

  3. 单击 高级共享 按钮。

  4. 选择 共享此文件夹;默认情况下,Windows 使用文件夹名称作为共享名称。

  5. 单击 权限 按钮。

  6. 配置 EveryoneFull Control 权限。

  7. 单击 OK 按钮离开 Permissions 页面。

  8. 再次单击 OK 按钮离开 Advanced Sharing (高级共享)页面。

  9. 选择 安全性 选项卡。

  10. 配置 EveryoneFull Control 权限。

  11. 单击 OK 按钮。

现在应该可以共享文件夹了。您可以通过在 权限安全 页面上更改权限来修改共享文件夹权限。

Windows 10 共享向导

Windows 10 上有一个共享向导,可帮助您完成其中一些步骤。

  1. 从 "开始 "栏运行 "计算机管理 "* 应用程序。

  2. 选择 共享文件夹 > 共享

  3. 右键单击并选择 New Share 开始共享向导。

  4. 单击 下一步 按钮。

  5. 选择要共享的文件夹,然后单击 下一步 按钮。

  6. 单击 下一步 使用共享默认值,或选择 自定义 并设置所需的权限。

  7. 单击 OK 按钮。

  8. 单击 Finish 按钮共享文件夹。

在 Raspberry Pi 上安装文件夹

Linux 中的 安装 是将文件夹附加到某个位置的过程,因此首先我们需要该位置。

$ mkdir windowshare

现在,我们需要将远程文件夹安装到该位置。远程文件夹是 Windows PC 的主机名或 IP 地址,以及共享时使用的共享名。我们还需要提供用于访问远程计算机的 Windows 用户名。不要忘记用您的 Raspberry Pi OS 用户名替换 <username> 占位符。

$ sudo mount.cifs //<hostname or IP address>/<shared windows folder> /home/<username>/windowshare -o user=<name>

您现在应该能够在 Raspberry Pi 上查看 Windows 共享的内容。

$ ls windowshare/

"主机已关闭"错误

当 SMB 协议版本不匹配且 Linux Samba 客户端返回误导性错误消息时,会发生此错误。默认情况下,Raspberry Pi OS 使用 2.1 及以上版本,与 Windows 7 及更高版本兼容。较旧的设备(包括某些 NAS)可能需要 1.0 版本。要修复此错误,请在挂载命令后附加一个版本条目(例如 ,vers=1.0 ):

$ sudo mount.cifs //IP/share /mnt/point -o user=<uname>,vers=1.0

您可能需要尝试不同的版本以与服务器版本匹配。可能的值包括:

版本 说明

1.0

经典 CIFS/SMBv1 协议

2.0

SMBv2.002 协议。Windows Vista Service Pack 1 和 Windows Server 2008

2.1

SMBv2.1 协议。Microsoft Windows 7 和 Windows Server 2008R2

3.0

SMBv3.0 协议。 Microsoft Windows 8 和 Windows Server 2012

3.02

SMBv3.0.2 协议。Microsoft Windows 8.1 和 Windows Server 2012R2

3.11

SMBv3.1.1 协议。Microsoft Windows 10 和 Windows Server 2016

3

SMBv3.0 协议版本及以上

从 Raspberry Pi 共享文件夹

首先,创建一个要共享的文件夹。此示例在当前用户的 home 文件夹中创建一个名为 shared 的文件夹:

$ cd ~
$ mkdir shared
$ chmod 0740 shared

现在,我们需要告诉 Samba 在访问该文件夹时你的默认用户账户。出现提示时,请输入您的密码,并用您的主用户账户的用户名替换"<username>"占位符:

$ sudo smbpasswd -a <username>

现在我们需要使用Samba配置文件告诉Samba共享这个文件夹。

sudo nano /etc/samba/smb.conf

在文件末尾,添加以下内容以共享文件夹,授予远程用户读/写权限。将 <username> 占位符替换为Raspberry Pi上主要用户帐户的用户名:

[share]
    path = /home/<username>/shared
    read only = no
    public = yes
    writable = yes

在同一文件中,找到 workgroup 行,如有必要,将其更改为本地Windows网络的工作组名称。

workgroup = <your workgroup name here>

共享文件夹现在应该出现在网络上的Windows或macOS设备上。输入您的Raspberry Pi用户名和密码以挂载文件夹。

设置 Apache web 服务器

Apache 是一款流行的 web 服务器应用程序,您可以将其安装在 Raspberry Pi 上,以允许它提供网页。

Apache 本身可以通过 HTTP 提供 HTML 文件,使用附加模块可以使用脚本语言(如 PHP)提供动态网页。

安装 Apache

首先,通过在终端中输入以下命令来更新可用的软件包:

sudo apt update

然后,使用以下命令安装 apache2 软件包:

sudo apt install apache2 -y

测试 web 服务器

默认情况下,Apache 会将测试 HTML 文件放在 web 文件夹中。当您在 Raspberry Pi 本身上浏览 + http://localhost/` 或从网络上的另一台计算机浏览 `+http://192.168.1.10 (无论 Raspberry Pi 的 IP 地址是什么)时,将提供此默认网页。要查找 Raspberry Pi 的 IP 地址,请在命令行中输入 hostname -I (或阅读有关查找 IP 地址 的更多信息)。

在 Raspberry Pi 或网络上的另一台计算机上浏览默认网页,您应该会看到以下内容:

Apache 成功消息

这意味着 Apache 正在运行!

更改默认网页

此默认网页只是文件系统上的 HTML 文件。它位于 /var/www/html/index.html

在终端窗口中导航到此目录并查看其中的内容:

cd /var/www/html
ls -al

这会显示以下内容:

total 12
drwxr-xr-x  2 root root 4096 Jan  8 01:29 .
drwxr-xr-x 12 root root 4096 Jan  8 01:28 ..
-rw-r--r--  1 root root  177 Jan  8 01:29 index.html

这表明默认情况下 /var/www/html/ 中有一个名为 index.html 的文件,并且它由 root 用户拥有(封闭文件夹也是如此)。为了编辑该文件,您需要将其所有权更改为您自己的用户名。使用以下命令更改文件的所有者,将 <username> 占位符替换为您的主用户帐户的用户名:

$ sudo chown <username>: index.html

您现在可以尝试编辑此文件,然后刷新浏览器以查看网页变化。如果您了解 HTML,您可以将自己的 HTML 文件和其他资产放在此目录中,并将它们作为本地网络上的网站提供服务。

为 Apache 安装 PHP

要允许您的 Apache 服务器处理 PHP 文件,您需要安装最新版本的 PHP 和适用于 Apache 的 PHP 模块。输入以下命令来安装这些内容:

sudo apt install php libapache2-mod-php -y

现在删除 index.html 文件:

sudo rm index.html

并创建文件 index.php

sudo nano index.php

在其中放入一些 PHP 内容:

<?php echo "hello world"; ?>

现在保存并刷新浏览器。您应该看到"hello world"。这不是动态的,但仍由 PHP 提供。尝试一些动态内容:

<?php echo date('Y-m-d H:i:s'); ?>

或者显示您的 PHP 信息:

<?php phpinfo(); ?>

网络启动您的 Raspberry Pi

您可以设置一个 DHCP/TFTP 服务器,以便从网络启动 Raspberry Pi 3 或 4。

说明假设您有一个现有的家庭网络,并且您想使用 Raspberry Pi 作为 服务器。您还需要一个额外的 Raspberry Pi 3 或 4 作为要启动的 客户端。只需要一个 SD 卡,因为客户端将在初始客户端配置后从服务器启动。

Note
由于可用的网络设备和路由器种类繁多,我们无法保证网络启动适用于任何设备。我们收到报告称,如果您无法使网络启动正常工作,禁用网络上的 STP 帧可能会有所帮助。

配置网络启动客户端

Raspberry Pi 3 Model B

Note
本节仅适用于 Raspberry Pi 3 Model B,因为 Raspberry Pi 3 Model B+ 在出厂时已启用网络启动。

在 Raspberry Pi 3 Model B 进行网络启动之前,需要从 SD 卡启动,并使用配置选项启用 USB 启动模式。这将在 Raspberry Pi SoC 中的 OTP(一次性可编程)内存中设置一个位,以启用网络启动。完成此操作后,如果无法从 SD 卡启动,Raspberry Pi 3B 将尝试从 USB 启动,并从网络启动。

以通常的方式在 SD 卡上安装 Raspberry Pi OS Lite 或带桌面的 Raspberry Pi OS。接下来,使用以下命令启用 USB 启动模式:

$ echo program_usb_boot_mode=1 | sudo tee -a /boot/firmware/config.txt

这会将 program_usb_boot_mode=1 添加到 /boot/firmware/config.txt 的末尾。使用 sudo reboot 重新启动 Raspberry Pi。客户端 Raspberry Pi 重新启动后,使用以下命令检查 OTP 是否已编程:

$ vcgencmd otp_dump | grep 17:
17:3020000a

确保输出 0x3020000a 正确。

客户端配置几乎完成。最后一步,禁用 USB 启动。运行以下命令:

$ sudo nano /boot/firmware/config.txt

删除包含文本 program_usb_boot_mode=1 的行。最后,使用 sudo poweroff 关闭客户端 Raspberry Pi。

Raspberry Pi 4 Model B

可以使用 raspi-config 工具在 Raspberry Pi 4 上启用网络启动。首先,按如下方式运行 raspi-config

$ sudo raspi-config

raspi-config 中,选择 Advanced Options ,然后选择 Boot Order ,再选择 Network Boot 。然后,您必须重新启动设备,以便将启动顺序的更改编程到引导加载程序 EEPROM 中。Raspberry Pi 重新启动后,请检查启动顺序现在是否为 0xf21

$ vcgencmd bootloader_config

有关配置 Raspberry Pi 4 引导加载程序的更多详细信息,请参阅 Raspberry Pi 引导加载程序配置

以太网 MAC 地址

在配置网络启动之前,请记下序列号和 MAC 地址,以便 TFTP/DHCP 服务器可以识别该板。

在 Raspberry Pi 4 和以后的旗舰产品上,MAC 地址是在制造时编程的,MAC 地址和序列号之间没有任何联系。MAC 地址和序列号都显示在引导加载程序 HDMI 诊断 屏幕上。

要查找以太网 MAC 地址,运行下面命令:

$ ethtool -P eth0

要查找序列号,运行下面命令:

$ grep Serial /proc/cpuinfo | cut -d ' ' -f 2 | cut -c 9-16

配置网络启动服务器

将 SD 卡插入服务器 Raspberry Pi,然后启动服务器。客户端 Raspberry Pi 需要一个根文件系统来启动:我们将使用服务器根文件系统的副本并将其放在 /nfs/client1 中:

$ sudo mkdir -p /nfs/client1
$ sudo apt install rsync
$ sudo rsync -xa --progress --exclude /nfs / /nfs/client1

通过 chrooting 到客户端文件系统中重新生成 SSH 主机密钥:

$ cd /nfs/client1
$ sudo mount --bind /dev dev
$ sudo mount --bind /sys sys
$ sudo mount --bind /proc proc
$ sudo chroot .
$ rm /etc/ssh/ssh_host_*
$ dpkg-reconfigure openssh-server
$ exit
$ sudo umount dev sys proc

查找本地网络的设置。您需要找到路由器(或网关)的地址,可以使用以下命令完成:

$ ip route | awk '/default/ {print $3}'

然后运行:

$ ip -4 addr show dev eth0 | grep inet

您应该看到类似下面的输出:

inet 10.42.0.211/24 brd 10.42.0.255 scope global eth0

第一个地址是您的服务器 Raspberry Pi 在网络上的 IP 地址,斜线后的部分是网络大小。您的 IP 地址很可能是 /24 。还请注意网络的 brd (广播)地址。记下上一个命令的输出,其中将包含 Raspberry Pi 的 IP 地址和网络的广播地址。

最后,记下您的 DNS 服务器的地址,该地址与您的网关相同。您可以使用以下命令找到它:

$ cat /etc/resolv.conf

通过 systemd 网络在您的服务器 Raspberry Pi 上配置静态网络地址,它充当网络处理程序和 DHCP 服务器。

为此,您需要创建一个 10-eth0.netdev 和一个 11-eth0.network ,如下所示:

$ sudo nano /etc/systemd/network/10-eth0.netdev

添加以下行:

[Match]
Name=eth0

[Network]
DHCP=no

然后创建一个网络文件:

$ sudo nano /etc/systemd/network/11-eth0.network

添加以下内容:

[Match]
Name=eth0

[Network]
Address=10.42.0.211/24
DNS=10.42.0.1

[Route]
Gateway=10.42.0.1

此时,您还没有可用的 DNS,因此您需要将之前记下的服务器添加到 systemd/resolved.conf 。在此示例中,网关地址为 10.42.0.1。

$ sudo nano /etc/systemd/resolved.conf

取消注释 DNS 行并在那里添加 DNS IP 地址。此外,如果您有后备 DNS 服务器,也请在那里添加。

[Resolve]
DNS=10.42.0.1
#FallbackDNS=

启用 systemd-networkd ,然后重新启动以使更改生效:

$ sudo systemctl enable systemd-networkd
$ sudo reboot

现在启动 tcpdump ,以便您可以从客户端 Raspberry Pi 搜索 DHCP 数据包:

$ sudo apt install tcpdump dnsmasq
$ sudo systemctl enable dnsmasq
$ sudo tcpdump -i eth0 port bootpc

将客户端 Raspberry Pi 连接到您的网络并打开电源。检查客户端上的 LED 是否在大约 10 秒后亮起,然后您应该从客户端获得一个数据包’DHCP/BOOTP,请求来自…​'

IP 0.0.0.0.bootpc > 255.255.255.255.bootps:BOOTP/DHCP,请求来自 b8:27:eb...

现在您需要修改 dnsmasq 配置以启用 DHCP 回复设备。按 CTRL + C 退出 tcpdump 程序,然后输入以下内容:

$ echo | sudo tee /etc/dnsmasq.conf
$ sudo nano /etc/dnsmasq.conf

然后将 dnsmasq.conf 的内容替换为:

# NOTE: 如果您希望网络上的系统使用 DNS 服务,请注释掉端口。
port=0
dhcp-range=10.42.0.255,proxy
log-dhcp
enable-tftp
tftp-root=/tftpboot
pxe-service=0,"Raspberry Pi Boot"

dhcp-range 行的第一个地址,使用您之前记下的广播地址。

现在创建一个 /tftpboot 目录:

$ sudo mkdir /tftpboot
$ sudo chmod 777 /tftpboot
$ sudo systemctl enable dnsmasq.service
$ sudo systemctl restart dnsmasq.service

现在监控 dnsmasq 日志:

$ journalctl -f

您应该看到类似以下内容:

raspberrypi dnsmasq-tftp[1903]: file /tftpboot/bootcode.bin not found

接下来,您需要将 boot 文件夹的内容复制到 /tftpboot 目录中。

首先,按 CTRL + C 退出监控状态。然后输入以下内容:

$ cp -r /boot/firmware/* /tftpboot

由于 tftp 位置已更改,请重新启动 dnsmasq

$ sudo systemctl restart dnsmasq

设置 NFS 根目录

这现在应该允许您的 Raspberry Pi 客户端尝试启动,直到它尝试加载根文件系统(它没有)。

此时,导出先前创建的 /nfs/client1 文件系统和 TFTP 启动文件夹。

$ sudo apt install nfs-kernel-server
$ echo "/nfs/client1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
$ echo "/tftpboot *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports

重新启动 RPC-Bind 和 NFS 服务器,以便让它们检测新文件。

$ sudo systemctl enable rpcbind
$ sudo systemctl restart rpcbind
$ sudo systemctl enable nfs-kernel-server
$ sudo systemctl restart nfs-kernel-server

编辑 /tftpboot/cmdline.txt ,从 root= 开始,并将其替换为:

root=/dev/nfs nfsroot=10.42.0.211:/nfs/client1,vers=3 rw ip=dhcp rootwait

您应该将此处的IP地址替换为您记下的IP地址。还要删除以 init= 开头的命令行的任何部分。

最后,编辑 /nfs/client1/etc/fstab 并删除 /dev/mmcblk0p1p2 行(应该只留下 proc )。然后,将引导分区添加回:

$ echo "10.42.0.211:/tftpboot /boot/firmware/ nfs defaults,vers=3 0 0" | sudo tee -a /nfs/client1/etc/fstab

如果第一次尝试时没有启动,请继续尝试。树莓派可能需要一分钟左右的时间才能启动,所以要有耐心。

使用IPv6进行网络引导

通过网络引导Raspberry Pi计算机有4个阶段:

  1. 引导加载程序协商使用DHCP获取IP地址和TFTP服务器的详细信息。

  2. 引导加载程序通过TFTP加载固件并将引导过程移交给固件,将网络的详细信息传递给固件。

  3. 固件通过TFTP加载内核和命令行。

  4. 内核引导系统的其余部分,通过NFS或其他机制加载根文件系统(rootfs)。

引导加载程序和固件(阶段1到3)已得到增强,以支持通过IPv6引导。

Important
IPv6 netboot是一项 实验性alpha功能,根据反馈,我们将来可能需要改变它的工作方式。这仅适用于Raspberry Pi 4和计算模块4。

它是如何工作的

要通过IPv6启动,您需要更新版本的固件(例如 start4.elf )和引导加载程序。使用最新版本的Raspberry Pi OS和最新的稳定引导加载程序应该就足够了。

Note
常用的 dnsmasq DHCP服务器当前不支持IPv6网络引导所需的网络引导参数,因此目前您必须使用不同的DHCP服务器,例如 ISC DHCP

要在网络上挂载rootfs, IPv4 netboot教程 建议使用nfsroot。这不支持IPv6,因此需要另一种方法在网络上挂载rootfs。

如果您的ISP和路由器不支持IPv6,您的功能将受到限制。

网络地址

引导加载程序所做的第一件事是向路由器发送请求以获取网络的详细信息。路由器响应一个标识其以太网地址的广告包,如果TFTP服务器在不同的网络上,引导加载程序可能需要这个地址。

路由器通告包括一个标志,告诉它是对其IP地址使用有状态(托管)还是无状态(非托管)配置。无状态配置意味着设备配置自己的IP地址。目前,引导加载程序生成一个源自其以太网MAC地址的地址和路由器提供的网络前缀。

如果路由器指示启用了状态配置,则使用DHCP来获取设备的IP地址。这包括设备向DHCP服务器发送请求,DHCP服务器以广告响应。然后客户端在从服务器获得回复确认之前请求地址。

DHCP服务器和客户端使用可变长度DUID(设备唯一ID)标识自己。在Raspberry Pi上,这来自MAC地址(DUID_LL)。

TFTP地址

无论是使用无状态配置还是有状态配置,DHCP服务器都用于获取TFTP服务器地址。这被编码在 BOOTFILE-URL 参数中。我们发送客户端架构类型值 0x29 来识别设备。

启动过程

该设备现在应该有一个IP地址和TFTP详细信息。它从TFTP服务器下载固件二进制文件 start 4.elf 并继续运行。固件被传递IP地址和TFTP服务器详细信息,以便它可以下载内核并启动系统的其余部分。

内核引导

对于IPv4 netboot, nfsroot 用于通过网络挂载 rootfs 。这不支持IPv6,因此需要另一种解决方案。它可能涉及一个小型RAM文件系统,可以在切换到正确的 rootfs 内容之前挂载适当的网络位置。

Note
通过IPv6使用NFS引导Linux内核的机制仍有待演示。

测试设置

如果您想尝试一下,您将需要另一个Raspberry Pi来充当TFTP和DHCP服务器。

理论上,TFTP服务器可以在任何可路由的网络上,但DHCP服务器必须与其服务的设备位于同一网络上。

TFTP服务器

如果您有一个有效的IPv4网络启动设置,您可以重用dnsmasq中的TFTP服务器来提供文件(它可以与IPv4和 IPv6)。

或者,您可以使用独立的TFTP服务器,例如 tftpd-hpa

$ sudo apt install tftpd-hpa
$ sudo systemctl start tftpd-hpa

DHCP服务器

IPv6中的DHCP发生了很大变化。我们需要DHCP至少告诉我们TFTP服务器的地址,在这种情况下是同一台机器。

$ sudo apt install isc-dhcp-server

修改 /etc/default/isc-dhcp-server 中的配置

DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf
INTERFACESv6="eth0"

/etc/dhcp/dhcpd6.conf 中,您需要指定 TFTP 服务器地址并设置子网。此处,DHCP 服务器配置为提供一些虚构的唯一本地地址 (ULA)。 host test-rpi4 行告诉 DHCP 为测试设备提供固定地址。

not authoritative;

# 检查客户端看起来是否为 Raspberry Pi
if option dhcp6.client-arch-type = 00:29 {
option dhcp6.bootfile-url "tftp://[fd49:869:6f93::1]/";
}

subnet6 fd49:869:6f93::/64 {
host test-rpi4 {
host-identifier option dhcp6.client-id 00:03:00:01:e4:5f:01:20:24:0b;
fixed-address6 fd49:869:6f93::1000;
}
}

必须在 /etc/dhcpcd.conf 中为您的服务器分配 IPv6 地址

interface eth0
static ip6_address=fd49:869:6f93::1/64

现在启动 DHCP 服务器。

$ sudo systemctl restart isc-dhcp-server.service

Bootloader

修改配置以告诉它尝试通过 IPv6 而不是 IPv4 进行网络启动。

BOOT_ORDER=0xf21 # 2=网络启动
USE_IPV6=1 # 启用 IPv6 网络启动
BOOT_UART=1 # 调试

要恢复到 IPv4 网络启动,只需从 boot.conf 中删除 USE_IPV6 行。

路由器

要使用 IPv6,您确实需要支持 IPv6 的路由器和 ISP。互联网上有一些网站可以为您检查这一点,或者您也可以运行以下命令。

sudo apt install ndisc6
rdisc6 -1 eth0

这会向您的路由器发送路由器请求,询问您的网络详细信息,例如网络前缀、路由器以太网地址以及是否使用 DHCP 进行寻址。如果此命令没有响应,则可能是您的网络和 ISP 仅支持 IPv4。如果支持 IPv6,则很可能将其配置为使用无状态配置,客户端会生成自己的地址。

Soliciting ff02::2 (ff02::2) on eth0...
Hop limit                 :           64 (      0x40)
Stateful address conf.    :           No
Stateful other conf.      :          Yes
Mobile home agent         :           No
Router preference         :       medium
Neighbor discovery proxy  :           No
Router lifetime           :          180 (0x000000b4) seconds
Reachable time            :  unspecified (0x00000000)
Retransmit time           :  unspecified (0x00000000)

您可能能够将路由器配置为全状态配置,这意味着它将使用 DHCP 获取 IP 地址。

Hop limit                 :           64 (      0x40)
Stateful address conf.    :          Yes
Stateful other conf.      :          Yes
Mobile home agent         :           No
Router preference         :       medium
Neighbor discovery proxy  :           No
Router lifetime           :          180 (0x000000b4) seconds
Reachable time            :  unspecified (0x00000000)
Retransmit time           :  unspecified (0x00000000)

调试

日志和跟踪

如果启用了启动 UART,您应该会从串行端口看到类似这样的内容。以 RX6 开头的行表示正在使用 IPv6。

此处 dc:a6:32:6f:73:f4 是 TFTP 服务器的 MAC 地址,其 IPv6 地址为 fd49:869:6f93::1 。设备本身具有 MAC 地址 e4:5f:01:20:24:0b 和 IPv6 地址 fd49:869:6f93::1000

Boot mode: NETWORK (02) order f
GENET: RESET_PHY
PHY ID 600d 84a2
NET_BOOT: e4:5f:01:20:24:0b wait for link TFTP6: (null)
LINK STATUS: speed: 100 full duplex
Link ready
GENET START: 64 16 32
GENET: UMAC_START 0xe45f0120 0x240b0000
RX6: 12 IP: 1 MAC: 1 ICMP: 1/1 UDP: 0/0 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
NET fd49:869:6f93::1000 tftp fd49:869:6f93::1
RX6: 17 IP: 4 MAC: 4 ICMP: 2/2 UDP: 2/2 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
TFTP_GET: dc:a6:32:6f:73:f4 fd49:869:6f93::1 ab5a4158/start4.elf

RX6: 17 IP: 4 MAC: 4 ICMP: 2/2 UDP: 2/2 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
RX6: 18 IP: 5 MAC: 5 ICMP: 2/2 UDP: 3/3 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
TFTP_GET: dc:a6:32:6f:73:f4 fd49:869:6f93::1 ab5a4158/config.txt

最后,引导加载程序将移交给应加载内核的固件。

状态配置

您可以使用 tcpdump 检查网络活动。

$ sudo tcpdump -i eth0 -e ip6 -XX -l -v -vv

以下是 TCP 转储的摘录,其中路由器配置为使用状态(DHCP)网络配置。

设备发送路由器请求。

12:23:35.387046 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:00:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 70: (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::e65f:1ff:fe20:240b > ip6-allrouters: [icmp6 sum ok] ICMP6, router solicitation, length 16
          source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
            0x0000:  e45f 0120 240b

路由器发送一个响应,告诉设备使用有状态配置。

12:23:35.498902 60:8d:26:a7:c1:88 (oui Unknown) > 33:33:00:00:00:01 (oui Unknown), ethertype IPv6 (0x86dd), length 110: (hlim 255, next-header ICMPv6 (58) payload length: 56) bthub.home > ip6-allnodes: [icmp6 sum ok] ICMP6, router advertisement, length 56
        hop limit 64, Flags [managed, other stateful], pref medium, router lifetime 180s, reachable time 0ms, retrans timer 0ms
          rdnss option (25), length 24 (3):  lifetime 60s, addr: bthub.home
            0x0000:  0000 0000 003c fe80 0000 0000 0000 628d
            0x0010:  26ff fea7 c188
          mtu option (5), length 8 (1):  1492
            0x0000:  0000 0000 05d4
          source link-address option (1), length 8 (1): 60:8d:26:a7:c1:88
            0x0000:  608d 26a7 c188

设备发送DHCP请求。

12:23:35.502517 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:01:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 114: (hlim 255, next-header UDP (17) payload length: 60) fe80::e65f:1ff:fe20:240b.dhcpv6-client > ff02::1:2.dhcpv6-server: [udp sum ok] dhcp6 solicit (xid=8cdd56 (client-ID hwaddr type 1 e45f0120240b) (IA_NA IAID:0 T1:0 T2:0) (option-request opt_59) (opt_61) (elapsed-time 0))

DHCP服务器回复。

12:23:35.510478 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 172: (flowlabel 0xad54d, hlim 64, next-header UDP (17) payload length: 118) fe80::537a:52c:c647:b184.dhcpv6-server > fe80::e65f:1ff:fe20:240b.dhcpv6-client: [bad udp cksum 0xd886 -> 0x6d26!] dhcp6 advertise (xid=8cdd56 (IA_NA IAID:0 T1:3600 T2:7200 (IA_ADDR fd49:869:6f93::1000 pltime:604800 vltime:2592000)) (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (opt_59))

设备向DHCP服务器发送地址和TFTP详细信息请求。

12:23:35.510763 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:01:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 132: (hlim 255, next-header UDP (17) payload length: 78) fe80::e65f:1ff:fe20:240b.dhcpv6-client > ff02::1:2.dhcpv6-server: [udp sum ok] dhcp6 request (xid=8cdd56 (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (IA_NA IAID:0 T1:0 T2:0) (option-request opt_59) (opt_61) (elapsed-time 1))

DHCP服务器回答, opt_59 用于传递TFTP服务器的地址。

12:23:35.512122 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 172: (flowlabel 0xad54d, hlim 64, next-header UDP (17) payload length: 118) fe80::537a:52c:c647:b184.dhcpv6-server > fe80::e65f:1ff:fe20:240b.dhcpv6-client: [bad udp cksum 0xd886 -> 0x6826!] dhcp6 reply (xid=8cdd56 (IA_NA IAID:0 T1:3600 T2:7200 (IA_ADDR fd49:869:6f93::1000 pltime:604800 vltime:2592000)) (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (opt_59))

设备向FTP服务器发送邻居请求,因为它需要其MAC地址。

12:23:36.510768 e4:5f:01:20:24:0b (oui Unknown) > 33:33:ff:00:00:01 (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::e65f:1ff:fe20:240b > ff02::1:ff00:1: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has fd49:869:6f93::1
          source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
            0x0000:  e45f 0120 240b

FTP服务器使用其MAC地址进行回复。

12:23:36.510854 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fd49:869:6f93::1 > fe80::e65f:1ff:fe20:240b: [icmp6 sum ok] ICMP6, neighbor advertisement, length 32, tgt is fd49:869:6f93::1, Flags [solicited, override]
          destination link-address option (2), length 8 (1): dc:a6:32:6f:73:f4
            0x0000:  dca6 326f 73f4

TFTP请求由现在应该通过网络启动的设备发出。

12:23:36.530820 e4:5f:01:20:24:0b (oui Unknown) > dc:a6:32:6f:73:f4 (oui Unknown), ethertype IPv6 (0x86dd), length 111: (hlim 255, next-header UDP (17) payload length: 57) fd49:869:6f93::1000.61785 > fd49:869:6f93::1.tftp: [udp sum ok]  49 RRQ "ab5a4158/start4.elf" octet tsize 0 blksize 1024

无状态配置

下面是无状态(非 DHCP)网络配置的 tcp dump 摘要。

设备发送路由器请求。

12:55:27.541909 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:00:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 70: (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::e65f:1ff:fe20:240b > ip6-allrouters: [icmp6 sum ok] ICMP6, router solicitation, length 16
          source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
            0x0000:  e45f 0120 240b

路由器回复网络详细信息。

12:55:27.834684 60:8d:26:a7:c1:88 (oui Unknown) > 33:33:00:00:00:01 (oui Unknown), ethertype IPv6 (0x86dd), length 174: (hlim 255, next-header ICMPv6 (58) payload length: 120) bthub.home > ip6-allnodes: [icmp6 sum ok] ICMP6, router advertisement, length 120
        hop limit 64, Flags [other stateful], pref medium, router lifetime 180s, reachable time 0ms, retrans timer 0ms
          prefix info option (3), length 32 (4): 2a00:23c5:ee00:5001::/64, Flags [onlink, auto, router], valid time 300s, pref. time 120s
            0x0000:  40e0 0000 012c 0000 0078 0000 0000 2a00
            0x0010:  23c5 ee00 5001 0000 0000 0000 0000
          prefix info option (3), length 32 (4): fd4d:869:6f93::/64, Flags [onlink, auto, router], valid time 10080s, pref. time 2880s
            0x0000:  40e0 0000 2760 0000 0b40 0000 0000 fd4d
            0x0010:  0869 6f93 0000 0000 0000 0000 0000
          rdnss option (25), length 24 (3):  lifetime 60s, addr: bthub.home
            0x0000:  0000 0000 003c fe80 0000 0000 0000 628d
            0x0010:  26ff fea7 c188
          mtu option (5), length 8 (1):  1492
            0x0000:  0000 0000 05d4
          source link-address option (1), length 8 (1): 60:8d:26:a7:c1:88
            0x0000:  608d 26a7 c188

设备向 DHCP 多播地址发送信息请求,询问 TFTP 详细信息。

12:55:27.838300 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:01:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 98: (hlim 255, next-header UDP (17) payload length: 44) fe80::e65f:1ff:fe20:240b.dhcpv6-client > ff02::1:2.dhcpv6-server: [udp sum ok] dhcp6 inf-req (xid=e5e0a4 (client-ID hwaddr type 1 e45f0120240b) (option-request opt_59) (opt_61) (elapsed-time 0))

DHCP 服务器回复 TFTP 服务器详细信息( opt_59 )。

12:55:27.838898 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 150: (flowlabel 0xd1248, hlim 64, next-header UDP (17) payload length: 96) fe80::537a:52c:c647:b184.dhcpv6-server > fe80::e65f:1ff:fe20:240b.dhcpv6-client: [bad udp cksum 0xd870 -> 0x78bb!] dhcp6 reply (xid=e5e0a4 (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (opt_59))

设备询问 TFTP 服务器 MAC 地址,因为它可以判断它位于同一网络上。

12:55:28.834796 e4:5f:01:20:24:0b (oui Unknown) > 33:33:ff:1d:fe:2a (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::e65f:1ff:fe20:240b > ff02::1:ff1d:fe2a: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a
          source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
            0x0000:  e45f 0120 240b

FTP 服务器以其 MAC 地址回复。

12:55:28.834875 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a > fe80::e65f:1ff:fe20:240b: [icmp6 sum ok] ICMP6, neighbor advertisement, length 32, tgt is 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a, Flags [solicited, override]
          destination link-address option (2), length 8 (1): dc:a6:32:6f:73:f4
            0x0000:  dca6 326f 73f4

设备开始发出 TFTP 请求。

12:55:28.861097 e4:5f:01:20:24:0b (oui Unknown) > dc:a6:32:6f:73:f4 (oui Unknown), ethertype IPv6 (0x86dd), length 111: (hlim 255, next-header UDP (17) payload length: 57) 2a00:23c5:ee00:5001:e65f:1ff:fe20:240b.46930 > 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a.tftp: [udp sum ok]  49 RRQ "ab5a4158/start4.elf" octet tsize 0 blksize 1024
本页内容