Network boot a bunch of Raspberry Pi 3 ====================================== Assumptions ----------- * Installed OS on server: Debian * Installed OS on clients: Raspbian * bootcode.bin installed on each SD-Card Prerequisites ------------- * Install packages on server:: dnsmasq nfs-kernel-server tcpdump * Modify the common cmdline.txt:: dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs \ nfsroot=:/,udp,nfsvers=3,rsize=32768,wsize=32768, \ hard,intr rw ip=dhcp rootwait elevator=deadline With the following parameters: * server-ip: The IP address of your NFS server * nfs-root: The root directory of the exported NFS filesystem .. note:: Use the nfsvers/rsize/wsize parameters for higher speed. * Put a copy of the complete /boot directory of a raspbian install into a directory with the name /tftpboot/rpi. * Add to /etc/dnsmasq.conf:: port=0 dhcp-range=,proxy log-dhcp enable-tftp tftp-root=/tftpboot pxe-service=0,"Raspberry Pi Boot " dhcp-ignore=tag:!known dhcp-host=, dhcp-host=b8:27:eb:82:8f:f4,140.181.65.134 #landpi003 With the following parameters: * ip-range: Range of IP addresses to listen to (e.g. 192.168.1.255) * mac-address: MAC address of client * ip-address: IP address of client .. note:: Make sure to include the three spaces in the pxe-service name. Add one 'dhcp-host' line per managed client. * Modify /etc/exports:: # Example export for network-booted raspberry pis /nfs/rpi *(rw,sync,no_subtree_check,no_root_squash) This location contains the complete / tree of a raspbian install. Prepare raspberry pi -------------------- * Program usb boot mode using the original SD-Card image:: sudo su apt-get update apt-get install rpi-update BRANCH=next rpi-update echo program_usb_boot_mode=1 >> /boot/config.txt reboot * Check that this was successful:: vcgencmd otp_dump | grep 17 Should yield: 17:3020000a Remove the program_usb_boot_mode=1 line from /boot/config.txt Prepare SD-card --------------- * Copy bootcode.bin from 'next' branch of rpi-update (hexxeh) to an otherwise empty SD-card:: cfdisk /dev/mmcblk0 # Delete all partitions, and create a new one. sudo mkfs.vfat /dev/mmcblk0p1 mount /dev/mmcblk0p1 /mnt wget https://github.com/Hexxeh/rpi-firmware/raw/next/bootcode.bin cp bootcode.bin /mnt Assuming that your SD-card is mounted as mmcblk0. Prepare server -------------- * Start watching for bootpc requests from raspberrypi:: tcpdump -i eth0 port bootpc | grep b8:27 * Add a line to /etc/dnsmasq.conf:: dhcp-host=, # Example: dhcp-host=b8:27:eb:12:3b:4c,192.168.1.3 #raspberrypi003 * On the server start a watcher on tftp-requests:: sudo tail -f /var/log/syslog | grep tftp Watch for lines like:: dnsmasq-tftp[5790]: file /tftpboot//start.elf not found Write down * Create a symbolic link for this serial number:: cd /tftpboot ln -s rpi /tftpboot/rpi contains all /boot files (see above) * Modify /nfs/rpi/etc/rc.local:: Add a line after # Set hostname based on serial number test ${_SN} == "" && hname= * Copy the var directory:: cd /nfs/rpi cp -r rpi * Reboot the raspberrypi It should come up now and boot from the server. You should be able to log in via ssh