利用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的转发服务器。总之慢慢开发把。