前言
基本上就是照搬的 PXE Booting to a Raspberry Pi 4 .
需要准备的素材
- 有树莓派标准系统的SD卡一张,需要用来修改树莓派的启动设置
- NFS服务器
- 树莓派系统 OS Lite 的镜像文件
树莓派准备工作
设置启动顺序
sudo raspi-config
依次选择 Advanced Options > Boot Order > Network Boot
获取系统信息
获取 serial :
cat /proc/cpuinfo | grep Serial | awk -F ': ' '{print $2}' | tail -c 9
获取 mac :
ip addr show eth0 | grep ether | awk '{print $2}'
完了之后可以关机拔掉 SD 卡。
服务器配置
数据目录
首先安装必备的软件:
sudo apt install nfs-kernel-server kpartx unzip xz-utils -y
准备存放数据的目录:
mkdir /srv/
mkdir /srv/tftpboot
mkdir /srv/nfs
DHCP之类的稍后再配置,先把树莓派系统的镜像解压到刚才创建的目录中:
unxz raspios_lite_arm64_latest.img.xz
解压后得到的 img 文件,实际上有两个分区,需要用 kpartx 将它们提取出来:
kpartx -a -v *.img
mkdir -p /mnt/boot /mnt/rootfs
mount /dev/mapper/loop0p1 /mnt/boot
mount /dev/mapper/loop0p2 /mnt/rootfs
将已挂载分区上的文件复制到之前创建的文件夹中:
# <serial> 是先前在树莓派系统中获取的 8 位序列号
cp -a /mnt/boot/* /srv/tftpboot/<serial>/
cp -a /mnt/rootfs/* /srv/nfs/
如果使用的无特权容器,可能无法使用 kpartx,可以使用 fdisk 和 dd 来提取数据。
首先使用 fdisk 查看扇区结构:
fdisk -l <oslite>.img得到类似下面的输出:
Device Start End Sectors Size Type oslite.img1 8192 532479 524288 256M W95 FAT32 oslite.img2 532480 15728639 15196160 7.3G Linux 记住其中的数据: boot 分区, Start 8192, Sectors 524288; rootfs 分区, Start 532480。
提取 boot 分区:
sudo apt install mtools -y dd if=<oslite>.img of=boot_part.img bs=512 skip=8192 count=524388 mcopy -i boot_part.img -s ::* /srv/tftpboot/<serial>/提取 rootfs 分区:
dd if=<oslite>.img of=rootfs_part.img bs=512 skip=532480 cd /srv/nfs sudo debugfs -R "rdump / ." /path/to/rootfs_part.img
NFS/TFTP/DHCP配置
NFS
在 NFS 服务器上的 /etc/exports 末尾加上一行:
/srv/nfs *(rw,sync,no_subtree_check,no_root_squash)
重启 NFS 服务:
sudo exports -a
sudo systemctl restart nfs-kernel-server
TFTP
修改 tftpd-hpa 配置文件 /etc/default/tftpd-hpa :
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
重启 TFTP 服务:
sudo systemctl enable tftpd-hpa
sudo systemctl start tftpd-hpa
DHCP
我用的是 OPNsense,与传统配置不太一样。
配置 Option66
在 OPNsense 中依次点击 Services > Dnsmasq DNS & DHCP > DHCP options
添加一项配置:
- Type:
Set - Option:
tftp-server [66] - Interface:
LAN - Value:
<NFS服务器的ip>
配置 Option43
在上述页面中再添加一项配置:
- Type:
Set - Option:
vendor specific [43] - Interface:
LAN - Value:
52:61:73:70:62:65:72:72:79:20:50:69:20:42:6f:6f:74:20:20:20
树莓派系统文件配置
修改 cmdline.txt
修改 /srv/tftpboot/<serial>/cmdline.txt:
console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=<NFS_SERVER_IP>:/srv/nfs,v3,tcp rw ip=dhcp rootwait elevator=deadline
修改 fstab
修改 /srv/nfs/etc/fstab,将原有的 PARTUUID 行全部注释掉。