- What Does a Kernel Do?
- What Does a Developer See?
- Booting the System
- What's in a Standard?
- What Else Should We Consider?
- Removing One or the Other
Removing One or the Other
Perhaps the real test of importance of any given component in the system is how easy it is to remove that component. Some Linux platforms don't use much of the GNU userland; for example, using busybox for command-line tools and uclibc for the standard library. Some GNU platforms, such as Nexenta or Debian GNU/kFreeBSD, don't use the Linux kernel.
To see how important Linux is, let's take a look at the Linux compatibility environment on FreeBSD. When you run Linux code on FreeBSD, the FreeBSD kernel installs a modified system call handler that invokes FreeBSD kernel functions in response to Linux system calls. This design allows binaries compiled for Linux distributions to run unmodified.
In order for this setup to be usable, it's common to install a stripped-down version of a Linux distribution in a separate environment. Linux programs can then find all of the libraries and utilities that they expect, including the GNU coreutils, GNU libc, GNU grep, the GNU shell (Bash), and a host of other packages.
What does this mean? If you want to run GNU/Linux programs on another system, you can do it easily without Linux, but not at all easily without GNU.
Of course, most software will run quite happily outside the compatibility mode, if you recompile it. In this case, it won't be using GNU libc, the GNU utilities, or (usually) the GNU shell. Some programs will only compile with the GNU compiler or with GNU Make, but once they're built they'll run without any GNU software, unless:
- The program uses C++, in which case it likely will still be using GNU libstdc++.
- The program explicitly relies on any of the other (many) GNU libraries.
Removing the GNU from GNU/Linux is a lot harder than removing the Linux. A system such as PC-BSD or Nexenta makes a nice desktop operating system and contains no Linux code, but contains a lot of GNU code. The only Linux systems that don't depend heavily on GNU software are tiny embedded systems that wouldn't be recognizable to someone who is only familiar with desktop or server Linux.
So should you refer to the system as Linux, GNU, or GNU/Linux? I tend to use GNU because, as a developer and a user, the bits with which I directly interact are usually GNU. When I port code from FreeBSD, the differences I have to handle are differences in core utilities or in the C standard library. If I wanted to run the same code on HURD (due Real Soon Now since 1984™), or any other operating system with a GNU userland, I would be using exactly the same interfaces.
In general, I prefer to specify a distribution, such as Fedora or Ubuntu, and not mention either GNU or Linux. The total system comprises a huge amount of code from a variety of sources. The GNU Project and X.Org are among the largest, but calling it Ubuntu GNOME/X.Org/GNU/Linux would be unwieldy. Naming the system after a small and easily replaceable part, such as Linux, is both misleading and unfair to the myriad other developers who have contributed code.