Minimal Linux
This project grew out of a question: what is the absolute minimum set of components you need for a Linux system? As a target, I chose to aim for a Linux server that would be capable of running a web server serving static pages, connected via ethernet.
The answer turned out to be a pretty short list:
- Linux kernel
- uClibc, which is a simpler (but still quite functional) replacement for GNU libc.
- BusyBox, which provides a shell, all of the basic command line tools, and also some more exotic command line tools
- Dropbear, a small SSH server (and client)
- Syslinux, a lightweight boot loader
- lighttpd, a fully capable web server that's much easier than Apache to set up
The goal here was the simplest possible system. Where there were multiple options, I tried to pick the simpler (e.g., favoring BusyBox over GNU fileutils).
None of these choices really limit the software you can run, at least for server-type applications. For example, it can run dynamic web apps; I've built lighttpd with fcgi support. (I haven't tried python yet.) I've also got Samba running on a similar server.
I'm building everything on a standard desktop Linux box, and because the target uses a different libc (and eventually I'd like to try this on ARM-based hardware, maybe RaspberryPi), I had to build a complete compiler toolchain. That required the following, all installed on the host, not the target:
- GCC
- GNU binutils, which includes the assembler and linker, plus some other related tools
I'm planning to add a bunch of stuff:
- scripts to build everything mentioned above
- all of the scripts used to boot the Linux server (and an explanation of how everything works)
- some sort of packaging system, maybe based on (or similar to) the ipkg system used by OpenWRT, etc.
- ARM CPU support