Skip to content

网络启动您的树莓派

本教程旨在解释如何设置简单的 DHCP /TFTP服务器,该服务器将允许您从网络启动树莓派 3。本教程假定您已经有家庭网络,并且您想使用树莓派作为"服务器"。您将需要第二个树莓派 3作为 client 来启动。只需一个 SD 卡,因为在初始客户端配置后,客户端将从服务器启动。

由于可用的网络设备种类繁多,因此我们不能保证网络启动可与任何设备一起使用。我们有报告说,如果无法启动网络启动,则禁用网络上的 STP 帧可能会有所帮助。

客户端配置

本部分仅适用于"原始" 树莓派 3B。如果您使用的是 3B +,则忽略此部分,然后跳到下面的服务器部分。

在树莓派进行网络引导之前,需要使用配置选项从 SD 卡引导它以启用 USB 引导模式。这将在树莓派 SoC的 OTP (一次性可编程)存储器中设置一些位,以启用网络引导。完成此操作后,将不再需要 SD 卡。

通常方式在 SD 卡上安装树莓派 OS Lite(或带有树莓派 Desktop的树莓派 OS)。

然后,通过为/boot目录准备最新的引导文件来设置 USB 引导模式:

`` sudo apt update&& sudo apt full-upgrade


现在,使用以下命令启用 USB 启动模式:

``
回声 program _usb_boot_mode = 1 | sudo  tee  -a /boot/config.txt

这会将program_usb_boot_mode = 1添加到/boot/config.txt的末尾。用 sudo reboot重新启动树莓派。客户端树莓派重新启动后,请检查是否已使用以下方法对 OTP 进行了编程:

$ vcgencmd otp_dump | grep 17:
17:3020000a

确保输出" 0x3020000a"正确。

客户端配置即将完成。最后要做的是从" config.txt"中删除" program_usb_boot_mode"行(确保最后没有空行)。例如,您可以使用sudo nano/boot/config.txt执行此操作。最后,使用" sudo poweroff"关闭客户端树莓派。

服务器配置

将 SD 卡插入服务器树莓派中,然后启动服务器。在执行其他任何操作之前,请确保已运行sudo raspi-config并扩展了根文件系统以占用整个 SD 卡。

客户端树莓派将需要一个根文件系统来启动,因此在服务器上执行任何其他操作之前,请对其文件系统进行完整复制并将其放置在名为/nfs/client1的目录中:

`` sudo mkdir -p/nfs/client1 sudo apt安装 rsync sudo rsync -xa --progress-排除/nfs//nfs/client1


chroot生成客户端文件系统上的 SSH 主机密钥:

``
cd/nfs/client1
sudo mount --bind/dev开发
 sudo 挂载--bind/sys sys
sudo安装--bind/proc proc
 sudo  chroot 。
rm/etc/ssh/ssh_host_ *
dpkg-reconfigure openssh-server
出口
 sudo  umount  dev sys proc

查找您的本地网络的设置。您需要找到路由器(或网关)的地址,可以通过以下方法完成:

`` ip路由| awk'/default/{print $ 3}'


然后运行:

``
ip -4 addr show dev eth0 | grep inet

应该给出如下输出:

inet 10.42.0.211/24 brd 10.42.0.255作用域全局 eth0 

第一个地址是服务器树莓派在网络上的 IP 地址,斜杠后的部分是网络大小。您极有可能是/24。还要注意网络的" brd"(广播)地址。记下上一个命令的输出,该命令将包含树莓派的 IP 地址和网络的广播地址。

最后,记下 DNS 服务器的地址,该地址与网关相同。您可以通过以下方式找到它:

`` 猫/etc/resolv.conf


通过" systemd"网络在服务器树莓派上配置静态网络地址,该网络可用作网络处理程序和 DHCP 服务器。

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

sudo 纳米/etc/systemd/network/10-eth0.netdev


添加以下行:

[比赛] 名称= eth0

[网络] DHCP =否


然后创建一个网络文件:

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


添加以下内容:

[比赛] 名称= eth0

[网络] 地址= 10.42.0.211/24 DNS = 10.42.0.1

[路线] 网关= 10.42.0.1


此时,您将无法使用 DNS ,因此您需要将之前记下的服务器添加到`systemd/resolved.conf`中。在此示例中,网关地址为 10 .42.0.1。

``
 sudo  nano  /etc/systemd/resolved.conf

取消注释 DNS 行,然后在其中添加 DNS IP地址。此外,如果您有备用 DNS 服务器,也请在其中添加它。

`` [解决] DNS = 10.42.0.1

FallbackDNS =

`启用" systemd-networkd",然后重新启动以使更改生效: sudo systemctl启用系统联网 sudo 重启


现在启动`tcpdump`,以便您可以从客户端树莓派搜索 DHCP 数据包:

``
 sudo  apt 安装 tcpdump  dnsmasq
sudo systemctl启用 dnsmasq 
sudo tcpdump -i eth0端口启动计算机

将客户端树莓派连接到您的网络并打开电源。检查大约 10 秒钟后客户端上的 LED 点亮,然后您应该从客户端收到" DHCP/BOOTP,来自...的请求"数据包。

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

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

`` 回声 sudo tee /etc/dnsmasq.conf sudo nano /etc/dnsmasq.conf


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

端口= 0 dhcp-range = 10.42.0.255,代理 对数 DHCP 启用-tftp tftp-root =/tftp启动 pxe-service = 0," 树莓派 Boot"


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

现在创建一个`/tftpboot`目录:

``
 sudo  mkdir /tftpboot
 sudo  chmod  777/tftpboot
sudo systemctl启用 dnsmasq .service
sudo systemctl重新启动 dnsmasq .service

现在监视" dnsmasq"日志:

`` 尾-F /var/log/daemon.log


您应该会看到以下内容:

raspberrypi dnsmasq-tftp [1903]:找不到文件/tftpboot/bootcode.bin


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

首先,按<kbd> CTRL + C </kbd>退出监视状态。然后输入以下内容:

``
cp -r/boot/*/tftpboot

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

`` sudo systemctl重新启动 dnsmasq


### 设置 NFS 根目录

现在,这应该允许您的树莓派客户端尝试引导通过,直到它尝试加载根文件系统为止(它没有)。

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

``
sudo apt安装 nfs -kernel-server
回声"/nfs/client1 *(rw,同步,no_subtree_check,no_root_squash)" | sudo tee -a/etc/exports
回声"/tftpboot *(rw,同步,no_subtree_check,no_root_squash)" | sudo tee -a/etc/exports

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

`` sudo systemctl启用 rpcbind sudo systemctl重新启动 rpcbind sudo systemctl启用 nfs -kernel-server sudo systemctl重新启动 nfs -kernel-server


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

root =/dev/nfs nfsroot = 10.42.0.211:/nfs/client1,vers=4.1,proto=tcp rw ip = dhcp rootwait电梯=最后期限


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

最后,编辑`/nfs/client1/etc/fstab`并删除`/dev/mmcblk0p1'和`p2'行(仅应保留`proc`)。然后,将启动分区添加回:

echo" 10.42.0.211:/tftpboot/boot nfs默认值,vers = 4.1,proto = tcp 0 0" | sudo tee -a/nfs/client1/etc/fstab ```

祝好运!如果第一次尝试后仍无法启动,请继续尝试。 树莓派启动可能需要一分钟左右的时间,因此请耐心等待。