树莓派超全系列教程文档--(58)通过网络启动树莓派
通过网络启动树莓派
- 网络启动您的 Raspberry Pi
- 配置网络启动客户端
- Raspberry Pi 3 Model B
- Raspberry Pi 4 Model B
- 以太网 MAC 地址
- 配置网络启动服务器
- 设置 NFS 根目录
文章来源: http://raspberry.dns8844.cn/documentation
原文网址
网络启动您的 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/mmcblk0p1
和 p2
行(应该只留下 proc
)。然后,将引导分区添加回:
$ echo "10.42.0.211:/tftpboot /boot/firmware/ nfs defaults,vers=3 0 0" | sudo tee -a /nfs/client1/etc/fstab
如果第一次尝试时没有启动,请继续尝试。树莓派可能需要一分钟左右的时间才能启动,所以要有耐心。