前言
近日闲来无事研究树莓派4b,发现树莓派的内置管理工具raspi-config
中添加了Boot Order
选项栏,打开之后里面赫然写着USB Boot
和Network Boot
两个选项。
USB Boot
不必多言,选择之后拿一块U盘写入镜像插入USB接口后即可自动运行,不需要SD卡,但是Network Boot
勾起了博主的兴趣,经过三天的研究,终于成功实现网络启动。
材料
树莓派4b一块,网络启动服务器一台(这里博主使用了一块OrangePi Zero作为网络启动服务器),读卡器一个,网线一根。
客户端准备
配置系统
从镜像里安装新系统,并且将系统设置为开机自动进入CLI界面。
sudo raspi-config
找到3.Boot Options -> B1 Desktop / CLI
,选择B2 Console Autologin
设置BootLoader网络启动
sudo raspi-config
找到3.Boot Options -> B4 Boot Order
,选择B2 Network Boot
,应用后重启.这个时候,客户端已经准备完成,可以把TF卡拔出,将树莓派先放到一边。
服务器准备
由于博主用的是一块香橙派Zero作为服务器使用,所以安装命令不能照抄,请按照你自己的系统来进行操作。以下命令均在root用户下执行。
安装dhcp服务器,NFS服务器
apt update
apt install dnsmasq nfs-kernel-server
创建NFS目录
mkdir -p /nfs/raspberrypi
mkdir /raspiboot
chmod 777 /raspiboot
复制树莓派系统
将读卡器插入服务器中
mount /dev/sda1 /mnt
cp /mnt/* /raspiboot
umount /mnt
mount /dev/sda2 /mnt
cp /mnt/* /nfs/raspberrypi
umount /mnt
由于TF卡的I/O性能十分低下,复制需要很长时间。博主这里采用的方法是,将系统烧录进一块U盘,再直接将U盘挂载在系统内:
mount /dev/sda1 /raspiboot
mount /dev/sda2 /nfs/raspberrypi
能够节省很多时间。
关闭DHCP客户端等一系列服务
博主的服务器上采用的系统是Armbian,运行systemd-resolved
来进行域名解析服务,由于该服务会占用DNS端口,所以需要关闭该服务:
systemctl stop systemd-resolved
systemctl disable systemd-resolved
关闭NetworkManager以防止出现意外错误:
systemctl stop NetworkManager
systemctl disable NetworkManager
为服务器配置静态IP
vim /etc/systemd/network/10-eth0.netdev
写入以下内容
[Match]
Name=eth0
[Network]
DHCP=no
vim /etc/systemd/network/11-eth0.network
写入以下内容
[Match]
Name=eth0
[Network]
Address=192.168.2.100/24
DNS=192.168.2.1
Gateway=192.168.2.1
配置dnsmasq
vim /etc/dnsmasq.conf
interface=eth0
no-hosts
dhcp-range=192.168.2.101,192.168.2.200,12h
log-dhcp
enable-tftp
tftp-root=/raspiboot
pxe-service=0,"Raspberry Pi Boot"
配置NFS
vim /etc/exports
/nfs/raspberrypi *(rw,sync,no_subtree_check,no_root_squash)
/raspiboot *(rw,sync,no_subtree_check,no_root_squash)
修改树莓派内核启动命令行
vim /raspiboot/cmdline.txt
console=serial0,115200 console=tty1 root=/dev/nfs
nfsroot=192.168.2.100:/nfs/raspiberrypi,vers=3 rw ip=dhcp rootwait elevator=deadline
修改树莓派文件系统挂载
vim /nfs/raspberrypi/etc/fstab
将内容替换为:
proc /proc proc defaults 0 0
192.168.2.100:/raspiboot /boot nfs defaults,vers=3 0 0
启动服务
systemctl enable dnsmasq.service
systemctl restart dnsmasq.service
systemctl enable systemd-networkd
systemctl restart systemd-networkd
systemctl enable rpcbind
systemctl restart rpcbind
systemctl enable nfs-kernel-server
systemctl restart nfs-kernel-server
验证
将树莓派用网线连接到服务器上,打开电源,观察屏幕上是否启动成功。