使用官方固件,往config.txt添加一行:
1 | program_usb_boot_mode=1 |
重启,查看OTP是否被修改:
1 2 | $ vcgencmd otp_dump | grep 17:17:3020000a |
使用1中的方法,设置OTP后,不需要SD卡,即可支持network boot。但是启动时间较慢,而且无法调试。参考资料3,下载带调试版本的bootcode.bin,将其放在sd卡的boot分区,同时boot分区添加一个空的UART文件。其它文件全部删除。bootcode.bin发现boot分区没有start.elf等文件,就尝试USB和网络启动,log如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | Raspberry Pi BootcodeFound SD card, config.txt = 0, start.elf = 0, recovery.elf = 0, timeout = 0Trying USBHub device found at addr 4, enumerating HUBInitialise hubFound 5 ports, multi_tt = 1Setting interface 0Enabling PORT POWER on port 1Enabling PORT POWER on port 2Enabling PORT POWER on port 3Enabling PORT POWER on port 4Enabling PORT POWER on port 5Waiting for devices to respond to resetFound device on port 1Found highspeed deviceDevice found: type = Ethernet adapter, addr = 5Trying booting from Ethernet device addr 5Initialise ethernet with MAC b8:27:eb:fd:0d:e8Wait for Link upLink upSending DHCP requestWaiting for dhcp_replyDone ARP for 20.3.168.192 got 74:d4:35:19:8f:9cRead File: config.txt, 1605 (bytes)Raspberry Pi BootcodeRead File: config.txt, 1605Read File: start.elf, 2823204 (bytes) |
PI会发出DHCP请求,DHCP请求中待PXE参数,通过官方的dnsmasq教程,抓包分析。我写了一个DHCP & TFTP二合一服务器。代码:https://github.com/yuanjianpeng/rpi_netbootd
使用方法:
1 | $ sudo /work/proj/pinetbootd/pinetbootd eno1 -c 192.168.3.21 -C /work/pi/tftpboot/ |
第一个参数eno1是PC接口的名称。-c选项是分配给树莓派的IP,如果你的环境中有DHCP服务器(如有开启DHCP服务器的路由器)则可省略此选项。-C选项是存放tftp文件的目录,有下面这些文件:
1 2 | $ ls /work/pi/tftpboot/bcm2710-rpi-3-b.dtb bootcode.bin cmdline.txt config.txt kernel8.img start.elf |
安装:
1 | $ sudo apt install nfs-kernel-server |
配置:
1 2 | $ cat /etc/exports /work/pi/pi3_dev/output/fs.root *(rw,sync,no_root_squash,no_subtree_check,insecure) |
修改cmdline.txt,添加相关选项:
1 2 3 4 5 | root=/dev/nfs nfsroot=192.168.3.20:/work/pi/pi3_dev/output/fs.root,nfsvers=3 nfsrootdebug rwip=192.168.3.21:::255.255.255.0::eth0 |
rw表示挂载为可读写。ip=dhcp,如果想使用dhcp分配IP。
参考资料
【1】INETWORK BOOT YOUR RASPBERRY PI.
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net_tutorial.md
【2】boot modes. https://github.com/raspberrypi/documentation/tree/master/hardware/raspberrypi/bootmodes
【3】debug bootcode.bin. https://github.com/raspberrypi/firmware/wiki/USB-MSD-and-network-boot-debugging