树莓派网路启动配置方法:
该文档适用于Pi 3 和 Pi 4,需要两台树莓派,一台作为server 另一台作为client只需要一张SD卡,因为client使用网络启动
如果无法成功网络启动,请 关闭网络中的 STP Frames,这样也许有帮助。
Client configuration(For Pi 4):
使用 raspi-config 可以启动Pi 4 的网络启动功能
首先:
sudo raspi-config
选择 Advanced Options 之后选择 Boot Order 再之后选择 Network Boot.
重启设备,设备会优先使用 bootloader EEPROM 启动。
重启后,请确认boot order 是 0xf21
使用命令:
vcgencmd bootloader_config
Ethernet Mac address
使用网络启动之前请记录 serial number 和 mac address 这样树莓派才可以被 TFTP/DHCP sever识别
获取Ethernet MAC addres
ethtool -P etho
获取 serial number
grep Serial /proc/cpuinfo | cut -d ' ' -f 2 | cut -c 8-16
Server configuration
将SD卡插入server 树莓派然后重启,client 需要一个根文件系统用于启动,本次我们使用 server的根文件系统的复制品,放置于/nfs/client1
sudo mkdir -p /nfs/client1
sudo apt install rsync
sudo rsync -xa --progresss --exclude /nfs / /nfs/client1
注: mkdir "-p"代表却表目录名称存在,不存在就创建一个
重新生成client 树莓派的SSH host keys,通过 chrooting 连接 client树莓派
cd /nfs/client1
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bing /proc proc
sudo chroot .
rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
exit
sudo umount dev sys proc
找到本地网络的配置参数,你需要照登你的路由器的地址或者(dateway),如下操作。
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
第一个地址是你的server树莓派在网络中的IP,"/24"代表网络大小, “brd (boardcast)” 地址也要记录下来。
最后记下你的DNS server的地址,改地址与你的gateway地址相同。通过一下命令获取
cat /etc/resolv.conf
将server树莓派设置为静态地址,通过 systemd networking,server树莓派将会作为network handler 和 DHCP server工作。
为此,你需要创建 10-eth0.netdev
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,因此你需要把你之前记录下来的server地址添加到 systemd/resolved.conf 。在本例子中,gateway address 是 10.42.0.1
sudo nano /etc/systemd/resolved.conf
解除DNS那一行的注释,添加 DNS IP Address在该处。
另外,如果你有一个fallback DNS server ,那么把它也添加在这里,该处内容类似:
[Resolve]
DNS = 10.42.0.1
# FallbackDNS =
接下来,Enable systemctl-networkd 然后重启设备使得我们之前的改变生效
sudo systemctl enable systemd-networkd
sudo reboot
现在启动 tcpdump 这样,你就可以从client树莓派搜索DHCP packets了。
sudo apt install tcpdump dnsmasq
sudo systemctl enable dnsmasq
sudo tcpdump -i eth0 port bootpc
将client树莓派连接到你的网络中,启动。在10s左右侯检查LED指示灯,这时你应该可以从client树莓派得到一个packet,类似”DHCP/BOOTP,Request from...“
IP 0.0.0.0.bootpc > 255.255.255.255.bootps : BOOTP/DHCP, Request from b8:27:eb...
现在你需要去设置dnsmasq configuration 用以enable DHCP来回应设备, 按下 CTRL + C 离开 tcpdump 程序,输入如下内容:
echo | sudo tee /etc/dnsmasq.conf
sudo nano /etc/dnsmasq.conf
然后,将dnsmsq.conf中的内容替换为
# Note: comment out port if you want DNS services for systems on teh network
port = 0
dhcp-range = 10.42.0.255,proxy
log-dhcp
enable-tftp
tftp-root = /tftpboot
pxe-service=0,"Raspberry Pi Boot"
其中 dhcp-range 那一行表示使用你之前记下的 boardcast address
现在,创建 /tftpboot 目录
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
sudo systemctl enable dnsmasq.service
sudo systemctl restart dnsmasq.service
现在,监视 dnsmsq日志(log)
tail -F /var/log/daemon.log
你会看到类似这样的内容:
raspberrypi dnsmasq-tftp[1903]: file /tftpboot/bootcode.bin not found
接下来你需要把boot folder中的内容拷贝到 /tftpboot 目录中去
首先 摁下 CTRL + C 离开监视状态 ,输入如下内容
cp -r /boot/* /tftpboot
目前tftp位置已经改变,重启dnsmasq
sudo systemctl restart dnsmasq
Set up NFS root
这样做将会允许你的client树莓派尝试启动,当它加载到了服务器端放置的根文件系统(root file system)之后。
现在,导出我们之前建立的文件系统 /nfs/client1 和TFTP boot 文件夹
sudo apt install nfs-kernel-server
echo "/nfs/client1 *(rw,sync,no_subtree_check,on_root_squash)" | sudo tee -a /etc/exports
echo "/tftpboot *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
重启 RPC-Bing 和 NFS server 使它们识别新文件
sudo systemctl enable rpcbing
sudo systemctl restart rpcbing
sudo systemctl enable nfs-kernel-server
sudo systemctl restart nfs-kernel-server
编辑 /tftpboot/cmdline.txt 然后 从 root= 向前(from root= onwards),将它替换为:
root = /dev/nfs nfsroot=10.42.0.211:/nfs/client1,vers=4.1,proto=tcp rw ip=dhcp rootwait elevator=deadline
你需要使用你之前记下的IP地址替换这里的IP地址,同时删除所有以“init=”开头的命令。
最后,编辑 /nfs/client1/ect/fstab 同时移除 /dev/mmcblk0p1 和 p2 (只留下 proc).
最后,Then, add the boot partition back in:
echo "10.42.0.211:/tftpboot /boot nfs defaults,vers=4.1" | sudo tee -a /nfs/client1/etc/fstab
结束了,祝你好运,如果第一次没有成功启动,多试几次,这可能需要花几分钟,耐心一点。