Trying MINIX 3 is easy

April 2026 · Last updated 2026-04-26 · 899 words

MINIX 3 is an open-source operating system designed to be highly reliable, flexible, and secure. It is loosely based on previous versions of MINIX, but it is fundamentally different in many key ways. MINIX 1 and 2 were intended as teaching tools; MINIX 3 adds the new goal of being usable as a serious system on embedded computers and for applications requiring high reliability. (~via)

I should warn readers that this is a bit of a research/hobby endeavour: The latest commit in the Minix 3 main repository has been added around ten years ago. There doesn’t seem to be a lot of buzz nowadays. That does not mean it’s not a great teaching tool (or even: a great tool in general).

Running Minix 3.3.0 in QEMU/KVM on Linux Mint 22.3

“You can’t build a castle on sand.” my Latin teacher used to say.
A witty pupil (not me) replied “Unless it’s a sandcastle.” 😹

The more experience I gather with technology at large, the less patience I have for sloppy design, sloppy execution and just sloppiness in general. Creating software without solid foundations feels like throwing my time away.

One idea that I like a lot about the Unix Philosophy is its radical simplicity:

Make each program do one thing well.

For a long time I thought this was a universally accepted ground truth in the Unix world, and watched with surprise projects like the Linux kernel or Systemd grow into always-broken behemoths instead of becoming more focused and perfect incarnations of themselves.

In my view, an operating system kernel should do as little as it can get away with. It is the foundation of the whole system, and ideally is legible and understandable by a single person in a short amount of time.

Because of this, I’ve been for a while now wanting to try out Minix 3 - Andy Tanenbaum and his research group’s stab at a production-ready microkernel operating system.

Before I dive in, I’d like to recommend Andy Tanenbaum’s talk Lessons Learned from 30 Years of MINIX for a beautiful history lesson, starting with CTSS and MULTICS, including colorful anecdotes i.a. about how Ken Thompson’s pun on MULTICS, UNICS (later UNIX), came to be.

Minix 3 uses the NetBSD userland, which I still have deep affection for from running it as a daily driver a longer while ago (around NetBSD 1.6 IIRC). Also the NetBSD rump kernel provides drivers that can relatively easily be ported to a microkernel. Driver development is much nicer in a microkernel system: I enjoyed Thomas Cort’s MinixCon 2016 talk Device Driver Development Demystified. But ideally we just use paravirtualized hardware and leave the messy work of actually talking to hardware to people who enjoy that kind of stuff.

Enough of the introduction and motivation, here comes the micro how-to:

Installing and running Minix 3 in QEMU/KVM on Linux

I used my personal laptop running Linux Mint 22.3, but anything running KVM (or a different virtualisation software with paravirt drivers) should work.

Trying MINIX 3 is easy. (~via)

True! I can now say from experience. Here’s what I did:

From the Minix 3 Wiki’s usersguide:runningonqemu:

# Create an empty disk image
qemu-img create minix.img 8G

Get the latest ISO image:

# Download latest minix-3 stable ISO
curl -fLO http://download.minix3.org/iso/minix_R3.3.0-588a35b.iso.bz2

Again from the running-on-qemu wiki page:

# Install Minix 3
kvm -rtc base=localtime -net user -net nic -m 256 -cdrom minix.iso -hda minix.img -boot d

This brings up an installation program that nicely explains what it’s doing. Just follow along. I was fine with its defaults/pressing Enter a couple of times.

To install, start, and automatically start sshd, do these commands, referring to rc.d scripts of additional services for explanation: (~via)

pkgin update
pkgin install openssh
mkdir -p /etc/rc.d
cp /usr/pkg/etc/rc.d/sshd /etc/rc.d/
printf 'sshd=YES\n' >> /etc/rc.conf
/etc/rc.d/sshd start

A script is available to install about 700 commonly used packages, organized in three sets. To install them, type the following commands and answer Y each time you are asked about a set.

pkgin_sets

https://wiki.minix3.org/doku.php?id=usersguide:managinguseraccounts

passwd
user add -m -g users flo
passwd flo

This is how I’m running Minix 3, with paravirtualized storage and network hardware, more memory, a port forward to be able to SSH into the VM and a 32 bit switch to silence some warnings that otherwise pop up:

kvm -rtc base=localtime -net user,hostfwd=tcp::2022-:22 -net nic,model=virtio -m 512 -drive file=minix.img,if=virtio,format=raw -cpu kvm32

Then log-in via SSH:

ssh -p 2022 flo@localhost

After openssh the first software I installed was bash and zsh, but then I read usersguide:commandlineinterface:

The default command-line interface used by minix is Almquist shell (also known as A Shell, ash and sh) which was originally Kenneth Almquist’s clone of the SVR4-variant of the Bourne shell; it is a fast, small, POSIX-compatible Unix shell designed to replace the Bourne shell in later BSD distributions.

So I’ll try ash for a bit.

So far, Minix 3 has been really nice to me.

Should I come back to this, setting up a development environment is a good next step:

https://wiki.minix3.org/doku.php?id=developersguide:trackingcurrent

Special emphasis for the current state of affairs: if you want to track current, do not start from the 3.3.0 release. It will not work. Instead, start from one of the 3.4.0 release candidates on the snapshot page.


Notes to self:

Portrait

Greetings! You are reading the personal web page of Florian Sesser.

I always like to hear from people. Please have a look at the imprint for ways to get in touch.