Use PINN on a Raspberry Pi to Boot Multiple Systems

SD cards are getting larger and cheaper all the time – why not share a card between two operating systems for the Raspberry Pi? The PINN OS installer lets you automate the process.

When you run Linux on a PC or notebook you’re used to using a boot manager that lets you select the operating system (OS). Many Linux users like to set up their computer as a dual-boot or multiboot system with more than one OS. The default boot manager in the Linux world, GRUB, lets you select a default OS that starts when you don’t interfere with the boot process.

You may be used to installing Linux on a computer that came out of the factory with a pre-installed Windows version: The Linux distribution’s installer program will repartition the hard drive, organize disk space for Linux, install the Linux kernel and all the tools and applications, and then configure and install GRUB. The next time you boot the machine, you can choose between Windows and Linux.

There are alternatives to using a boot manager. You could have two internal disks, use each of them exclusively for one OS, and then select the boot device in the BIOS or UEFI settings or via a hotkey that brings up the computer’s built-in boot menu. Using GRUB is more user-friendly than those alternatives, which is why it is the more popular choice.

Many systems will let you briefly glimpse the GRUB screen if there’s only one system installed. That makes sense because you might want to change a boot option or provide the Linux kernel with a special parameter.

SD Card Jockey

On the Raspberry Pi machines, installing an OS works differently: You just download a filesystem image, unpack it, and write it to an SD card. You then boot the Pi with that SD card in the SD slot, and the OS on the card boots and (in most cases) extends the filesystem so that it uses the whole card – that’s all.

A side effect of this much simpler setup procedure is that there’s no default mechanism for setting up a dual-boot system. That’s not a big problem, because switching between two OSes is as simple as taking out the current SD card and inserting another one.

Still, there are situations where you might want to create a more PC-like experience on your Pi computer, for example, when you upgrade your machine with an NVMe SSD or some other fast (and bootable) storage: The larger the disk, the more likely you will be tempted to try a dual-boot installation on the Pi.

PINN Is Not NOOBS

A classic multiboot solution for the Pi was the NOOBS OS installer: Instead of writing an OS image to an SD card, Raspberry Pi owners could write a NOOBS image to the card, then boot from it, select a list of OSes, and have the setup program download and write them to the card.

The last released NOOBS version covered Pi models up to and including the Raspberry Pi 4 Model B, and the NOOBS download included the installation files for the then current versions of Raspberry Pi OS and LibreELEC, while supporting the download of some further OS installation files. The download directory for NOOBS has been purged from https://­downloads.­raspberrypi.­org/, but the Internet Archive has a copy of the file, so if you want to play with the old tool, you can still do so.

The current multiboot tool is called PINN [4] (a recursive acronym for PINN is not NOOBS). In testing PINN’s installation instructions (format an SD card or USB stick as a FAT volume, extract pinn-lite.zip in its root directory, and then boot from that card or stick), I kept getting errors, so I moved on to the Raspberry Pi Imager, which can automate the initial setup steps.

Using the Raspberry Pi Imager, select your Pi model. From the list of OSes, select the Misc utility images category followed by the PINN subcategory, where you will find the latest offered version – in my case, PINN 3.9.9 (Figure 1). Then, select your SD card or USB stick (and make sure it’s the correct device), and click Next. The Raspberry Pi Imager gives you a final warning and lets you proceed by clicking YES.

b01_pinn-setup-01.tif
Figure 1: The official Raspberry Pi Imager can download PINN and write it to an SD card.

It makes sense to wait until both the Writing and the Verify phases have completed: I’ve recently had some bad luck with defective SD cards, and the verification step will notice a failed write process. It should only take a few seconds anyway as PINN itself is rather small.

Booting PINN

Unmount and eject the card, put it in the Raspberry Pi, and boot from it while the Pi is connected to your local network via Ethernet. PINN also lets you connect to a WiFi network, but as you’re going to download large files, Ethernet is typically the better option when it’s available.

If PINN is not on the default boot drive, keep the space bar pressed during power-up until the boot menu appears; then press either 1 to boot from the SD card or 4 (USB-MSD) to boot from the USB stick. If you try the USB option and get a warning about an insufficient power supply, press the power button once to continue booting.

You’ll get a graphical desktop with a single application starting up: That’s the PINN installer. If you don’t have an Ethernet cable plugged in, PINN will now ask you to setup WiFi access (see the “WiFi Setup” box for that extra step). If you do plug in an Ethernet cable, PINN should automatically receive an IP address from your DHCP server.

WiFi Setup

If you need to connect to a WiFi network, PINN will automatically run the integrated WiFi setup wizard that works as expected: Wait for the networks to show up in the list, select the one you want to connect to, supply the password, and click OK (Figure 2). Occasionally, the WiFi setup did not find my router and just showed an empty list; clicking Cancel and then clicking the Wifi icon restarts the assistant.

It may require some patience to establish the WiFi connection: On my test setup, I had to wait several minutes for the WiFi dialog to disappear. You can see that it was successful when an IP address appears in the PINN window’s titlebar.
b02_wifi2.tif
Figure 2: Select your WiFi network and enter the password.

At the bottom of the screen you can change the language and keyboard settings which default to English (UK) and a UK keyboard (gb); the US variant is called us.

In the PINN window, you’ll get several tabs from which you can choose OSes (Figure 3). Select all the systems you want to install. You might also want to reserve some free space for later additions: In that case, go to the Utility tab and select one or more of the Project­Space entries. I’ll discuss how to use ProjectSpaces later.

b03_os-selection.tif
Figure 3: The list of supported OSes keeps growing. Select all the OSes that you want to install.

When you’ve made your choices, click the Install button. You may get a warning about detected incompatibilities – if this happens, go back to the selection and deselect the incompatible systems (unless you’re feeling lucky). If everything is fine, you will still get a warning, but that’s only about the loss of data on your USB stick or SD card.

Before starting, you get a chance to change partition sizes for the systems you’re about to install (Figure 4); by default PINN adds equally large chunks of free space to all systems. Click OK to get the process started: PINN will then partition the medium and download and unpack the OS images. This can take quite some time, as the installer may download several gigabytes of data. In my experiments, I had to wait about three hours for 30-40GB. If you're getting bored and want to take a screenshot, check the “Taking Screenshots” box.

b04_adjust-sizes.tif
Figure 4: The PINN installer lets you change the partition sizes for the operating systems.
Taking Screenshots

Many systems let you create a screenshot by pressing the PrtScn key, but PINN does not offer that feature. If you find the need to create screenshots from the installation process or from the boot menu, press Ctrl+Alt+F2 to access a text mode terminal. You can log in as root with the password raspberry. Then type

mount -o remount,rw /settings
cd /settings
sleep 5; cat /dev/fb0 > fb0.dump

The purpose of the sleep command is to give you time to switch back to the graphical display before capturing the framebuffer. Press Alt+F1 before the five-seconds timer runs out. Then wait a few seconds, go back to the text mode (again with Ctrl+Alt+F2), and copy the file to a Linux machine:

scp fb0.dump user@ipaddress:

Also, check the framebuffer format using the fbset command – the output should look like this:

mode "2560x1440"
geometry 2560 1440 2560 1440 16
timings 0 0 0 0 0 0 0
rgba 5/11,6/5,5/0,0/0
endmode

From this output, you can learn that the framebuffer is 2560 pixels wide, 1440 pixels high and uses a 16-bit color depth where each 16-bit pixel stores 5 bits red starting at bit 11 (5/11), 6 bits green starting at bit 5 (6/5), and 5 bits blue starting at bit 0 (5/0). You may get different values depending on the capabilities of the monitor that you’re using.

On the Linux machine, you can now use ImageMagick’s magick command-line tool to convert. You have to inform the tool of all the details you found in the fbset output; the correct image type is rgb565. This command creates a PNG image:

magick -size 2560x1440 -depth 16 rgb565:fb0.dump fb0.png

The dumped framebuffer contains no headers or metadata, which is why ImageMagick cannot detect the resolution and color depth without your help.

Eventually, the installer will complete its work and replace the progress window with a small info window that says OS(es) Installed Successfully. Click OK, and you’ll be dropped in the bootloader which already looks like it’s going to look during all future boot processes (Figure 5).

b05_bootmanager.tif
Figure 5: When you see this OS selector, PINN has successfully unpacked your operating systems.

When you select a system and boot it for the first time, it may run you through a setup procedure; for example, Ubuntu lets you configure the language and the time zone, setup WiFi networking, create a user account, and ask for a password. Other systems work with default settings. For example, Kali Linux lets you login as user kali with the password kali.

When you want to switch to a different system, just use the reboot menu entry or run

sudo reboot

and you’ll get back to the PINN menu. If you know which partition is the boot partition of a specific installed OS, you can also type 

sudo reboot NN

where NN is the number of the partition: This will skip the boot menu and directly boot into the desired OS.

Using a ProjectSpace

If you’ve added one or more Project­Spaces during the initial setup, you can replace them with an additional OS. Reboot your Pi. When PINN has switched to graphical mode, it shows a message in the left top corner that reads “For recovery mode, hold SHIFT.” Press the Shift key, which will launch PINN’s configuration tool that you know from the earlier steps. You will see the list of available OSes, but some entries are already marked: Those are the ones that you’ve previously installed.

Adding new systems in the Project­Spaces takes two steps. First go through the list of available OSes, and mark the ones you want to add. Do not click on Install, because doing so would wipe your medium and reinstall everything.

Instead, in the top right corner, click the More icon twice. (You can toggle between the Main Menu, the Archival menu and the Maintenance menu – it’s the last one you need here.) You will then see all installed OSes, as well as all reserved ProjectSpaces (you’ll see one of these at the bottom of Figure 6). Mark all ProjectSpaces where you want to install a new system and then click on Replace.

b06_projectspace01.tif
Figure 6: Select the ProjectSpaces that you want to overwrite with new operating systems.

In the new dialog, you will see a table. In each table row, you can change one ProjectSpace by opening the drop-down menu in the right column and selecting the OS you want to replace the ProjectSpace with (Figure 7). When you’ve filled the table, click OK. By the way, you can use the same mechanism to replace one of the existing OS installations with a different one (without touching the other systems), which is a good way to replace an outdated distro version with a newer one.

b07_projectspace02.tif
Figure 7: The drop-down menu lets you select the OS that will overwrite the ProjectSpace.

In the Confirm dialog click Yes, and PINN begins downloading and unpacking the new systems. Once this is all done, you’ll get back to the boot menu, but this time you will see the new entries as well.

Conclusions

If you don’t mind swapping SD cards or USB sticks, then writing just one OS to one of those media and using them as needed remains the simplest method for running multiple OSes on your Pi. However, in some cases, you may want a dual-boot or multiboot solution. One reason might be that you need to access files in your home directory from more than one installation. Some distributions will auto-mount every other partition they recognize, on others you can manually mount partitions.

Systems that you can install with PINN will typically use two partitions on the drive: a small FAT-formatted boot partition and a large root partition that is formatted with a Linux filesystem (e.g., ext4). In Figure 8, you can see how PINN has partitioned a 128GB stick, sdb1 and sdb5 are PINN’s own partitions, and then sdb6, sdb7, and so on are the boot and root partitions for Raspberry Pi OS, Kali Linux, a KDE distro, and Ubuntu 25.04.

b08_stick-contents.tif
Figure 8: GParted shows that this USB stick has 12 partitions, 2 for PINN, and 10 for the four installed systems and a ProjectSpace.

PINN offers many additional features that you can look up in the official documentation. It can help you back up OS installations to an additional USB drive (and later restore them). There is also an option to try to fix a corrupted system. However, PINN’s central feature is multiboot, and that has worked extremely well in my tests, both on a Raspberry Pi 400 and a Pi 500.