Announcing BerryOS: a lightweight OS for your Raspberry Pi
After a couple of weeks working on it, I am proud to finally be releasing the first version of BerryOS to the public!
What is BerryOS?
BerryOS is a lightweight operating system for your Raspberry Pi based on the official Raspberry Pi OS Lite bootstrapped directly from its sources. It is available in two variant: BerryOS/armhf
and BerryOS/arm64
for 32 & 64-bit ARM compatible hardware.
When building it, my goal was to create a lightweight version of Raspberry Pi OS Lite than can be configured headlessly at first boot using cloud-init
. Other images including cloud-init
already exists such as the Ubuntu Server RPi release or the now defunct HypriotOS, though most of them includes extra software or are not based on Debian itself.
In order to keep the same level of compatibility with 3rd party software and hardware, I decided to bootstrap it directly from the Raspberry Pi OS sources (Raspbian GNU/Linux and Debian GNU/Linux for its armhf
and arm64
version respectively) with some tweaks to the list of pre-installed package and default configuration.
In the end, BerryOS turned out to be nearly 40% lighter than Raspberry Pi OS Lite, had fewer processes running by default while being completely configurable using cloud-init
.
Here is a comparison table between the first BerryOS release (BerryOS Bullseye 2022.05.30) and the latest Raspberry Pi OS Lite release (Raspberry Pi OS Bullseye 2022.04.04) running on a Raspberry Pi 3 B:
Stat | BerryOS/armhf | RaspiOS/armhf | BerryOS/arm64 | RaspiOS/arm64 |
---|---|---|---|---|
RAM usage | 37M | 57M | 52M | 72M |
Running processes | 12 | 18 | 12 | 20 |
Disk usage | 807.1M | 1.3G | 611.7M | 1.3G |
Pre-installed packages | 312 | 530 | 285 | 521 |
Download size | 201M | 297M | 153M | 271M |
Image size | 1312M | 1924M | 1112M | 1908M |
The methodology for these results can be found in the Benchmark section of the BerryOS README file.
Where to get it?
BerryOS is completely open-source and licensed under the ISC License. Its source code is hosted on GitHub at github.com/0rax/BerryOS.
From there, you can download all current and previous version of each variant or checkout its documentation (which is still a work in progress) where you will also find some example configuration files to get you started.
If you decide to give it a go and find any issues with it, do not hesitate to report them on GitHub, so they can be fixed as soon as possible.
How to use it?
Grab your closest Raspberry Pi and your SD card of choice, head to the latest release page and download the variant you need.
BerryOS/armhf
should be compatible with ALL Raspberry Pi models.BerryOS/arm64
should be compatible with the Raspberry Pi 3B, 3B+, 4 & 400, Compute Module 3, 3+ & 4 as well as the Raspberry Pi Zero 2 W.
Fire up you favorite tool and flash your newly acquired image to your SD card. Any flashing tools should work, such as the official Raspberry Pi Imager, balenaEtcher, Hypriot’s flash
tool or even dd
on any *NIX like system.
Note
Hypriot’s
flash
tool can be used pretty efficiently with BerryOS as it allows you to specify extra configuration file to copy to your SD card after flashing directly from the command line.For example to flash BerryOS with a custom
user-data
andconfig.txt
file you already have on disk, you can just run:flash --userdata user-data.yaml --bootconf config.txt ~/Downloads/berryos-arm64-bullseye-20220527.img.xz
Once successfully flashed, unplug and re-plug your SD card from your computer (to force remounting it) and open the drive named boot
. You should be able to open the user-data
file with your favorite text editor from there.
user-data
is the configuration file that will be used by cloud-init
to configure your system on its first boot. We have set it up to use the Cloud Config format as it makes configuring a system really simple, though other format are also available.
This is a really important file when setting up a BerryOS system, as this is where you will set up how to access your system.
Note
By default, BerryOS does not enable password based SSH access to the default user to follow the decision made by the Raspberry Pi Foundation in April 2022 to disable it on Raspberry Pi OS Bullseye going forward (source).
I would suggest going through the whole file (also available on GitHub) and read the comments to understand what you are able to configure using it. You can also have more extensive explanation of the configuration capabilities in the project documentation.
Here we will just update the default user (pi
) password and enable SSH password authentication and set the system hostname. To do so, append the following lines to the user-data
file:
hostname: berryos.userctl.xyz # Set system hostname
manage_etc_hosts: true # Update /etc/hosts with the new hostname
password: berryos # Set default user password
chpasswd: { expire: false } # Do not expire password after first login
ssh_pwauth: true # Enable SSH password authentication for default user
The password
field can either be a plaintext password or a hashed version of it. On *NIX system, a password can be hashed using the openssl passwd -6
command. The file would end up looking like:
password: $6$kEE0sV/2tz/jWBtQ$tRpM0XqKhl3xEroj837u6VCQadIoSL......nSY48unRmtsZv0
chpasswd: { expire: false } # Do not expire password after first login
ssh_pwauth: true # Enable SSH password authentication
If you wish to assign a static IP to your Raspberry Pi, you should also edit the network-config
file. For example, to assign the 192.168.1.128
IP to your Pi with a /24
netmask (equivalent to 255.255.255.0
) and 192.168.1.1
as gateway, you should update the file to look like this.
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.1.128/24
routes:
- to: 0.0.0.0/0
via: 192.168.1.1
Save your modifications, un-mount your SD card and insert it in your Raspberry Pi. Connect you Ethernet cable and power supply, and after some time you should be able to access it using ssh pi@$ip
.
As avahi-daemon
IS NOT installed by default, you will not be able to use the Pi hostname to connect to it. If you haven’t given it a static IP, you will need to find it another way. The easiest solution is to plug a screen to it as BerryOS prints the system IPs on each TTY by default (you might need to switch to TTY2 to get a clean reading by using Alt + Right
). Another solution is to check your router’s DHCP assignation table.
Note
If you require Wi-Fi connectivity, you should check out the Network Configuration guide in the BerryOS Wiki to set it up properly.
Congratulation, you can now enjoy BerryOS to its full extent!
The future of BerryOS
BerryOS is the operating system I with I had for quite some years now, thus I intend to support and keep it up to date with mainstream Raspberry Pi OS for the foreseeable future.
Having a lightweight alternative to the default operating system for your Raspberry Pi is the real goal here, something than can be used by anyone that just want to tinker a bit more with their hardware and have more control over its software. I do not want to create a complete new ecosystem but keep it as close and compatible with RaspiOS as possible without adding unnecessary software or removing capabilities.
The clear next step for the project now is to expand its documentation and add more example of how cloud-init
can be used. Those Cloud Config files are great to share setups with each other and having great resources built around this possibility should be what we aspire to.
If this is something that you find interesting, come check it out, or even get involved with the project on GitHub.