【Openwrt从入门到放弃】四、抛弃SD卡,让树莓派从nfs启动。

By | 2024-12-02

利用Openwrt让树莓派做到无卡启动

前面第二篇提到了利用dnsmasq建立的tftpboot的PXE服务器,让计算机可以从网络启动。
这个功能扩展一下,加上nfs的服务器就可以让树莓派直接从网络启动。而不再依赖与S D卡。

每个有树莓派的玩家都会因为tf卡的读写问题让人恼火,买到了读写速度抵的卡启动系统的时候慢吞吞不说,由于建立了swap,频繁读写,还会导致系统挂掉。与其这样还不如抛弃卡片启动树莓派。其实PXE这个功能在树莓派3B之后就是树莓派的bios官方支持的了。可以在3b,4,5中通过修改”bios”来改变引导顺序,没错,树莓派是有”bios”的!具体方法请参阅树莓派的官方文档。

https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#network-boot-flow

原理就是之前第二篇提到的,并且用到了dhcp option 43选项。达到真正抛弃sd卡直接网络启动树莓派的办法。

https://blog.eastwoodnet.cloudns.ch/article/000003/.html

而是我手里面老旧的1代树莓派。由于性能太差,多数人已经淘汰掉了。但是把它作为一个Airplay播放器,或者Homeassistan来用其实依然性能足够。启动后不再需要SD卡读写。只要保证网线畅通,基本上就有了无限的存储空间。原理是利用openwrt建立N F S服务器,然后修改树莓派卡上的boot分区的参数,实现linux启动内核后挂载nfs文件系统存储的方式,实现网络启动linux。

好的,为了能发挥树莓派最大的性能,我选择了精简的系统dietpi,这是一个基于debian的精简树莓派系统。不只是树莓派,很多单板机硬件都可使用这个系统发挥最大的性能,感兴趣的可以去官网看看,除了树莓派之外的一系列硬件设备。树莓派1的系统下载地址在这里。
Bookworm版本:

https://dietpi.com/downloads/images/DietPi_RPi-ARMv6-Bookworm.img.xz

Bullseye版本:

https://dietpi.com/downloads/images/DietPi_RPi-ARMv6-Bullseye.img.xz

以debian11版本为例,解包后得到img文件,
以下操作都在openwrt中运行,前提是你的Openwrt系统挂载了U S B
或者是其他存储设备。系统存储空间比较大。
计算一下分区的起始块区后面要用。

首先给openwrt 安装 nfs-kernel-server kmod-loop fdisk这几个软件包。
然后在openwrt中计算一下系统镜像的空间参数,提取出来boot分区和文件系统分区。

root@east-home:/mnt/share# fdisk -l DietPi_RPi-ARMv6-Bullseye.img 
Disk DietPi_RPi-ARMv6-Bullseye.img: 1 GiB, 1073872896 bytes, 2097408 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xaad71f1f

Device                         Boot  Start     End Sectors  Size Id Type
DietPi_RPi-ARMv6-Bullseye.img1 *      8192  270335  262144  128M  c W95 FAT32 (LBA)
DietPi_RPi-ARMv6-Bullseye.img2      270336 2097151 1826816  892M 83 Linux

第二分区(512*270336) =138,412,032

#mkdir /mnt/tmp
#mount -o loop,offset=138,412,032 /mnt/DietPi_RPi-ARMv6-Bullseye.img /mnt/tmp
#mkdir /mnt/share/raspi
#cp -rav /mnt/tmp/* /mnt/raspi/

编辑/etc/exports文件,这是nfs服务的配置文件。注意IP地址可以用dnsmasq的mac地址固定功能分配固定的IP地址

/mnt/share/raspi    192.168.1.4(rw,no_root_squash,sync)
#exportfs -rv

准备一张大于128M的sd卡

dd if=DietPi_RPi-ARMv6-Bullseye.img of=/dev/sdx bs=512 count=270335

写入后编辑卡根本目录的cmdline.txt文件,删掉原来的写入如下

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.1.1:/mnt/share/raspi,vers=3,proto=tcp rw ip=dhcp rootwait elevator=deadline
console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.1.1:/mnt/cluster/system/000000008a4232c8/rootfs,vers=3,proto=tcp rw ip=dhcp rootwait elevator=deadline

有条件的可以用dnsmasq把设备启动后的网关和DNS指向其他内网网关或者编辑dietpi.txt文件固定好设备的ip地址和网关以及DNS
静态

ip AUTO_SETUP_NET_USESTATIC=1
AUTO_SETUP_NET_STATIC_IP=192.168.1.99
AUTO_SETUP_NET_STATIC_MASK=255.255.255.0
AUTO_SETUP_NET_STATIC_GATEWAY=192.168.1.1
AUTO_SETUP_NET_STATIC_DNS=114.114.114.114

软件源

CONFIG_APT_RASPBIAN_MIRROR=http://mirrors.ustc.edu.cn/raspbian/raspbian/
CONFIG_APT_DEBIAN_MIRROR=http://mirrors.ustc.edu.cn/archive.raspberrypi.org/

插入SD卡启动系统。注意观察主路由的系统日志是否看到设备获取到ip地址并这却加载跟文件系统。稍后即可ssh登入。默认登录S S H用户名是root密码是dietpi
等待一些第一次登入的设定后即可使用。虽然对于1-2带树莓派没办法做到完全的无卡启动,但是好歹系统启动后,使用了nfs挂载了路由器上的磁盘空间作为系统的空间。不会再频繁读写sd卡。只要你的路由器磁盘空间足够大,树莓派就能够利用。系统的读写只受限于100M的网卡速度。虽然可能比S D卡慢一些,但是这可以保证系统的稳定运行。这就非常适合一些不需要快速读写的服务比如Homeassistant或者音乐播放器。或者是lcdproc这个项目的显示屏幕。又或者是zigbee2mqtt的转发服务器。总之慢慢开发把。