前言

基本上就是照搬的 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 行全部注释掉。