Title: Operating systems battle: OpenBSD vs NixOS
Author: Solène
Date: 18 April 2022
Tags: openbsd nixos life opensource
Description: My feelings about OpenBSD and NixOS, trying to figure out
where each is the best

# Introduction

While I'm an OpenBSD contributor, I also enjoy using Linux especially
the NixOS distribution which I consider a system apart from the other
Linux distributions because of how different it is.  Because I use
both, I have two SSDs in my laptop with each system installed and I can
jump from one to another depending on the task I'm doing or which I
want to use.

My main system, the one with all my data, is OpenBSD, unfortunately the
lack of an interoperable and good file system between NixOS and OpenBSD
make it difficult to share data between them without using a network
storage offering a protocol they have in common.

# OpenBSD and NixOS

Let me quickly introduce the two operating systems if you don't know
them.

OpenBSD is a 25+ years old fork of NetBSD, it's full of history and a
solid system, it's also the place where OpenSSH or tmux are developed. 
It's a BSD system with its own kernel and own drivers, it's not related
to Linux but will share most of well known open source programs you can
have on Linux, they are provided as packages (programs such as GIMP,
Libreoffice, Firefox, Chromium etc...).  The whole OpenBSD system
(kernel, drivers, userland and packages) is managed by a team of
approximately 150 persons (without counting people sending updates and
who don't have a commit access).
The OpenBSD project website
NixOS will be soon a 20 years old Linux distribution based on the nix
package manager.  It's offering a new approach to system management,
based on reproducible builds and declarative configurations, basically
you define how your computer should be configured (packages, services,
name, users etc..) in a configuration file and "build" the system to
configure itself, if you share this configuration file on another
computer, you should be able to reproduce the exact same system. 
Packages are not installed in a standard file hierarchy but each
package files are stored into a dedicated directory and the users
profiles are made of symbolic links and many environment variables to
permit programs to find libraries or dependencies, for example the path
to Firefox may look like something like
/nix/store/b6gvzjyb2pg0kjfwrjmg1vfhh54ad73z-firefox-33.1/bin/firefox.
The NixOS project website
NixOS wiki: How Nix works
## Performance

OpenBSD is lacking hardware acceleration for encoding/decoding video,
this make it a lot slower when working with videos.

Interactive desktop usage and I/O also feel slower on OpenBSD, on the
other hand the Linux kernel used in NixOS benefits from many people
working full time at improving its performance, we have to admit the
efforts pay off.

Although OpenBSD is slower than Linux, it's actually usable for most
tasks one may need to achieve.

## Hardware support

OpenBSD doesn't support as many devices as NixOS and its Linux kernel. 
On NixOS I can use an external NVIDIA card using a thunderbolt case,
OpenBSD doesn't have support for this case nor has it a driver for
NVIDIA cards (which is mostly NVIDIA's fault for not providing
documentation).

However, OpenBSD barely requires any configuration to work, if the
hardware is supported, it will work.

Finally, OpenBSD can be used on old computers from various
architectures, like i386, old Apple powerpc, risc, arm, while NixOS is
only focusing on modern hardware such as Amd64 and Arm64.

## Software choice

Both systems provide a huge packages set, but the one from Nix has more
choice.  It's not that bad on the OpenBSD side though, most common
packages are available and often with a recent version, I also found
many times a package available in OpenBSD but not in Nix.

Most notably, I feel the quality of OpenBSD packages is slightly higher
than on Nix, they have less issues (Nix packages sometimes have issues
that may be related to nix unusual file hierarchy) and are sometimes
patched to have better defaults (for instance I'm thinking of disabling
network accesses opened by default in some GUI applications).

Both of them make a new release every six months, but while OpenBSD
only backport packages security fixes for its latest release, NixOS
provides a lot more updates to its packages for the release users.

Updating packages is painless on OpenBSD and NixOS, but it's easier to
find which version you are currently using on OpenBSD.  This may be
because I don't know enough the nix shell but I find it very hard to
know if I'm actually using a program that has been updated (after a CVE
I often check that) or if it's not.
OpenBSD packages list
NixOS packages list
## Network

Network is certainly the area where OpenBSD is the most well-known, its
firewall Packet Filter is easy to use/configure and efficient.  OpenBSD
provides mechanisms such as routing tables/domains to assign a network
interface to an entire separated network, allowing to expose a
program/user to a specific interface reliably, I didn't find how to
achieve this on Linux yet.  OpenBSD comes with all the required daemons
to manage a network (dhcp, slaacd, rpki, email, http, NAT, ftp, tftp
etc...) within its base system.

The performance when dealing with network throughput may be sub-par on
OpenBSD compared to Linux but for the average user or server it's fine,
it will mostly depend on the network card used and its driver support.

I don't really enjoy playing with network on Linux as I find it very
complicated, I never found how to aggregate wifi and Ethernet
interfaces to transparently switch from one to the other when I
(un)plug the rj45 cable on my laptop, doing this is easy to achieve on
OpenBSD (I don't enjoy losing all my TCP connections when moving the
laptop around).

## Maintenance

The maintenance topic will be very personal, for a personal
workstation/server case and not a farm of hundreds of servers.

OpenBSD doesn't change much, it has a new release every six months but
the upgrades are always easy to handle, most corner cases are
documented in the upgrade guide and I'm ALWAYS confident when I have to
update an OpenBSD system.

NixOS is also easy to update and keep clean, I never had any issue when
upgrading yet and it would still be possible to rollback to the
previous version in case something is going wrong.

I can say they have both a different approach but they both work well.

## Documentation

I have to say the NixOS documentation is rather huge but yet not always
useful.  There is a nice man page named "configuration.nix" giving all
the options to parameter a system, but it's generated from the Nix code
and is often lacking explanations in addition to describe an API. 
There are also a few guides and manual available on NixOS website but
they are either redundant or not really describing how to solve real
world problems.
NixOS documentation
On the OpenBSD side, the website provides a simple "Frequently Asked
Questions" section for some use case, and then all the system and its
internal are detailed in very well written man pages, it may feel
unfriendly or complicated at first but once you taste the OpenBSD man
pages you easily get sad when looking at another documentation.  If you
had to setup an OpenBSD system for some task relying on components from
the base system (= not packages), I'm confident to say you could do it
offline with only the man pages.  OpenBSD is not a system that you find
its documentation on various forums or github gists, while I often feel
this with NixOS :(
OpenBSD FAQ
OpenBSD man pages
## Contributing

I would say NixOS have a modern contribution system, it relies on
github and a bot automatically do many checks to the contributions,
helping contributors to check their work quickly without "wasting" the
time of someone who would have to read every submitted code.

OpenBSD is doing exactly that, changes to the code are done on a
mailing list, only between humans.  It doesn't scale very well but the
human contact will give better explanations than a bot, but this is
when your work is interesting someone who want to spend time on it,
sometimes you will never get any feedback and it's a bit sad we are
losing updates and contributors because of this.

# Conclusion

I can't say one is better to the other nor that one is doing absolutely
better at one task.

My love for OpenBSD may come from its small community, made of humans
that like working on something different.  I know how OpenBSD works,
when something is wrong it's easy to debug because the system has been
kept relatively simple.  It's painless, when your hardware is
supported, it just works fine.  The default configuration is good and I
don't have to worry about it.

But I also love NixOS, it's adventurous, it offers a new experience
(transactional updates, reproducibility) that I feel are the future of
computing, but it also make the whole very complicated to understand
and debug.  It's a huge piece of software that could be bend to many
forms given you are a good Nix arcanist.

I'd be happy to hear about your experiences with regards to OpenBSD and
NixOS, feel free to write me (mastodon or email) about this!