Network Booting a Raspberry Pi 2

Introduction

While going forward it would be ideal to only use Rasberry Pi 3s for Network Booting (or generally) I have a number of Pi 2s left. Being able to re-use these in the same way means less waste.

I found it much easier to test this approach after having a working Network Boot Environment tested on a Pi 3.

Turns out this is very simple once the Server is working as expected!

This article is initially based on the following guides, but looks to includes a bit more detail and troubleshooting steps:

Essentially it just requires a boot partition with only the latest bootcode.bin from the next branch of rpi-firmware - https://raw.githubusercontent.com/Hexxeh/rpi-firmware/next/bootcode.bin.

Edit (2018-09-25): Warning, the next branch appears to be out of date now, downloading from master (the default) works best for all devices - https://raw.githubusercontent.com/Hexxeh/rpi-firmware/master/bootcode.bin.

The Long Version

This version starts from a fully working Rasbpian Install and strips it back to just include the required file.

It means an SD card large enough for the full OS image is required whereas bootcode.bin is some ~50Kb which by iteself would clearly fit on a much smaller card.

Step 1: Raspbian (Lite) SD Card

Download the Raspbian Lite from here.

Flash to a Micro SD card, the easiest way is to use Etcher (it will even take a zip and use that, and verify the content after).

Step 2: Clean Up (optional)

After the SD card is ready find the disk:

paul@box [10:35:08] [~] 
-> % lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 894.3G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0 861.9G  0 part /
└─sda3   8:3    0  31.9G  0 part [SWAP]
sdb      8:16   0 232.9G  0 disk 
└─sdb1   8:17   0 232.9G  0 part /media/paul/xx3
sdc      8:32   0 931.5G  0 disk 
└─sdc1   8:33   0 931.5G  0 part /data/xx2
sdd      8:48   0 931.5G  0 disk 
└─sdd1   8:49   0 931.5G  0 part /data/xx1
sde      8:64   1   7.4G  0 disk 
├─sde1   8:65   1  41.5M  0 part 
└─sde2   8:66   1   1.7G  0 part 

In my case it is sde.

Run sudo fdisk /dev/sde, delete partition 2 and write the changes:

paul@box [10:35:10] [~] 
-> % sudo fdisk /dev/sde
Welcome to fdisk (util-linux 2.30.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sde: 7.4 GiB, 7948206080 bytes, 15523840 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: 0x37665771

Device     Boot Start     End Sectors  Size Id Type
/dev/sde1        8192   93236   85045 41.5M  c W95 FAT32 (LBA)
/dev/sde2       94208 3629055 3534848  1.7G 83 Linux

Command (m for help): d
Partition number (1,2, default 2): 

Partition 2 has been deleted.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Synching disks.
Step 3: Configure boot

Mount /dev/sde1 either using mount or the file manager.

Clear the partition and then download bootcode.bin:

paul@box [10:49:14] [~] 
-> % cd /media/paul/boot 
paul@box [10:49:17] [/media/paul/boot] 
-> % rm -Rf *
zsh: sure you want to delete all the files in /media/paul/boot [yn]? y
paul@box [10:49:20] [/media/paul/boot] 
-> % wget https://github.com/Hexxeh/rpi-firmware/raw/next/bootcode.bin
--2018-03-05 10:49:21--  https://github.com/Hexxeh/rpi-firmware/raw/next/bootcode.bin
Resolving github.com (github.com)... 192.30.253.112, 192.30.253.113
Connecting to github.com (github.com)|192.30.253.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/Hexxeh/rpi-firmware/next/bootcode.bin [following]
--2018-03-05 10:49:22--  https://raw.githubusercontent.com/Hexxeh/rpi-firmware/next/bootcode.bin
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.192.133, 151.101.128.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 51996 (51K) [application/octet-stream]
Saving to: ‘bootcode.bin’

bootcode.bin                  100%[===============================================>]  50.78K  --.-KB/s    in 0.1s    

2018-03-05 10:49:22 (460 KB/s) - ‘bootcode.bin’ saved [51996/51996]

Eject and boot the Pi 2 off it and it should all work - tailing syslog for dhcp and tftp can confirm the early stages.

The Short Version

This version starts a blank SD card and sets it up for just what is needed.

It means a very small (and cheap) card can be used as bootcode.bin is some ~50Kb.

Step 1: Find your device

Mine is sde:

paul@box [10:44:43] [~] 
-> % lsblk              
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 894.3G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0 861.9G  0 part /
└─sda3   8:3    0  31.9G  0 part [SWAP]
sdb      8:16   0 232.9G  0 disk 
└─sdb1   8:17   0 232.9G  0 part /media/paul/xx3
sdc      8:32   0 931.5G  0 disk 
└─sdc1   8:33   0 931.5G  0 part /data/xx2
sdd      8:48   0 931.5G  0 disk 
└─sdd1   8:49   0 931.5G  0 part /data/xx1
sde      8:64   1   1.9G  0 disk 
└─sde1   8:65   1   1.9G  0 part 
paul@box [10:44:44] [~] 
-> % sudo fdisk /dev/sde
Step 2: Set up the partition
  • See what is there already with p.
  • Delete any existing partitions with d.
  • Create a new partition with n, it is primary, starting from the beginning and can be anywhere from around 10Mb (any less didn't work) to the size of the drive, in the example below I made it 50Mb.
  • If prompted to remove the vfat signature select Y.
  • Use t to set its type to b (W95 FAT32).
  • Finally write the changes with w.
Welcome to fdisk (util-linux 2.30.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sde: 1.9 GiB, 2002780160 bytes, 3911680 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: 0x00000000

Device     Boot Start     End Sectors  Size Id Type
/dev/sde1        2048 3911679 3909632  1.9G  b W95 FAT32

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-3911679, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-3911679, default 3911679): +50M

Created a new partition 1 of type 'Linux' and of size 50 MiB.
Partition #1 contains a vfat signature.

Do you want to remove the signature? [Y]es/[N]o: Y

The signature will be removed by a write command.

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): b 
Changed type of partition 'Linux' to 'W95 FAT32'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Synching disks.
Step 3: Format the new partition

The partition is FAT formatted.

Note: The label 'boot' is not required.

paul@box [10:44:59] [~] 
-> % sudo mkfs.fat -n boot /dev/sde1                                  
mkfs.fat 4.1 (2017-01-24)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows
Step 4: Add bootcode.bin

Mount /dev/sde1 either using mount or the file manager.

Download bootcode.bin:

paul@box [10:49:14] [~] 
-> % cd /media/paul/boot 
paul@box [10:49:17] [/media/paul/boot] 
-> % wget https://github.com/Hexxeh/rpi-firmware/raw/next/bootcode.bin
--2018-03-05 10:49:21--  https://github.com/Hexxeh/rpi-firmware/raw/next/bootcode.bin
Resolving github.com (github.com)... 192.30.253.112, 192.30.253.113
Connecting to github.com (github.com)|192.30.253.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/Hexxeh/rpi-firmware/next/bootcode.bin [following]
--2018-03-05 10:49:22--  https://raw.githubusercontent.com/Hexxeh/rpi-firmware/next/bootcode.bin
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.192.133, 151.101.128.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 51996 (51K) [application/octet-stream]
Saving to: ‘bootcode.bin’

bootcode.bin                  100%[===============================================>]  50.78K  --.-KB/s    in 0.1s    

2018-03-05 10:49:22 (460 KB/s) - ‘bootcode.bin’ saved [51996/51996]

Eject and boot the Pi 2 off it and it should all work - tailing syslog for dhcp and tftp can confirm the early stages.