Take your freedom back, with Linux-2.6.33-libre

Cyberspace, March 1st, 2010---Linux hasn't been Free Software since 1996, when Mr Torvalds accepted the first pieces of non-Free Software in the distributions of Linux he has published since 1991. Over these years, while this kernel grew by a factor of 14, the amount of non-Free firmware required by Linux drivers grew by an alarming factor of 83. We, Free Software users, need to join forces to reverse this trend, and part of the solution is Linux-libre, whose release 2.6.33-libre was recently published by FSFLA, bringing with it freedom, major improvements and plans for the future.


All firmware in Linux-1.3.0 was Free Software. Whatever little relevance the GNU/Linux operating system had back in 1995 was enough for a few hardware vendors to disclose the details of their hardware or even offer all the software needed to make it work under terms that respected users' essential freedoms. They knew Linux, already licensed under the GNU GPLv2, wouldn't have drivers for their components otherwise.

Over the year that followed, Mr Torvalds changed his stance, and started accepting binary-only firmware in Linux. Because of this decision, GNU/Linux ceased to be an incentive for hardware vendors to respect users' essential freedoms. Since the Linux developers forfeited the defenses provided by the GPL, nearly all of the vendors decided to keep only to themselves the control over the ever-growing computers that passed for peripherals.

Some 143KB of object code disguised as source code were present in the 4.7MB compressed tarball of Linux-2.0, released in June, 1996. Some 6 years later, there were 1.3MB of non-Free firmware hiding in the 26MB compressed tarball of Linux-2.4.19. In Linux-2.6.33, all of these pieces and them some, adding up to 2MB, lie in a subtree created some two years ago to hold firmware in Linux. Another 650KB still disguised as sources were recently added to the staging subtree, and another 9.2MB (duplicates removed) live in a separate archive, created to eventually replace the firmware subtree in Linux.


The largest single piece of non-Free firmware in the linux-firmware repository weights 1.25MB today. In the 1980s, half as many bytes were held as enough memory for any application in a personal computer. It was then that Richard Stallman started working on GNU, when entire operating systems were smaller than that. He realized that users should be entitled to the four essential freedoms over all the software that ran on computers, even when they were far less powerful than today's peripherals.

We have achieved that, a Free operating system for general-purpose personal computers, but it lasted for only a few years. The kernel that provided the piece that was missing in the GNU operating system hasn't been Free Software for more than a decade, and it requests users to install a growing number of non-Free programs that are not included in it.


We welcome, applaud and thank the various recent efforts that resulted in Free firmware for various devices: Atheros contributed Free firmware for its ar5k and ar9k wireless networking cards; experts in reverse engineering developed Free firmware for some of Broadcom's b43 wireless networking cards; others developed the Free nouveau driver for nVidia video cards, and, more recently, completed the task with Free firmware for them, unfortunately a bit too late for the final pieces to make Linux-2.6.33.

However, just like RMS, we realized that developing Free Software isn't enough to establish freedom for the users of GNU/Linux. We also need to educate them to value their freedom, and to recognize and reject non-Free Software. Otherwise, the products that require users to give up their freedom would continue to find willing customers.

A few years ago, the Free Software community realized that Linux was no longer Free Software, and started various efforts to fix this problem. One of them, born nameless within gNewSense, was named Linux-libre within BLAG. Once we took responsibility for it, in addition to removing the non-Free components from Linux, we replace the requests for non-Free firmware with messages that inform users that the hardware in question is a trap.

Our hope is that more users will use this Free version of Linux, present in various GNU/Linux-libre distributions, to find out about hardware components that do not respect their freedoms, then tell vendors how unhappy they are, and use their freedom and power of choice to support vendors that do respect their customers.

Large businesses, governments or lots of users working together, applying a little pressure at the right spot of vendors' pockets, can often get them to change their minds and voluntarily respect customers' freedom. Failing that, we can still help, participating in or funding reverse engineering efforts. The manufacturers that voluntarily respect our freedom deserve the most appreciation, but a product that works in freedom despite the efforts of the manufacturer is much better than nothing.

What's new in Linux-2.6.33-libre

We don't maintain the Linux-libre source files directly. Instead we maintain “deblobbing” scripts that clean Linux “sources”, thus producing Linux-libre sources. The main improvement in this generation of Linux-libre, the fourth since we got involved, consisted of making the deblobbing scripts more efficient.

As we accumulated thousands of patterns to recognize blobs, sequences that look like blobs but that aren't, requests for non-Free firmware external to Linux, and documentation that induces users to install it, running the GNU sed script generated to locate and remove blobs became too expensive for many users: in recent releases of Linux-libre, GNU sed took some 15 seconds and more than 2GB of RAM to compile all the patterns in the script.

The solution was to rewrite the main script in higher-level scripting languages. GNU awk reduced the start-up time to about 3 seconds, and memory requirements dropped by an order of magnitude, but 3 seconds multiplied by the 260 files that get cleaned up with this script to form Linux-2.6.33-libre is a lot of time to waste. Python and PERL compile our huge collection of patterns in tenths of a second, while reducing memory use by almost another order of magnitude. However, internal limits in PERL's pattern matching algorithm produce incorrect results in deblob-check, so using it with PERL is not recommended for now.

For deblob-main's cleaning-up of small files in Linux, Python was determined to be fastest, which is why it is the new default. For verifying that a large tarball is clean, Python and PERL's run-time jump to more than 90 minutes, up from 5 minutes with GNU awk and as little as 3 minutes with GNU sed. GNU awk comes ahead when listing all the blobs in a Linux tarball, now with a long-wished feature: printing before each blob the name of the file within the tarball that contains it.

Future releases may be smarter in choosing suitable backend depending on task and inputs. For now, users of deblob-check should be aware of the new flags: --use-python, --use-awk, --use-perl, and --use-sed, and the corresponding environment variables PYTHON, AWK, PERL, and SED.

The lower memory footprint and CPU requirements for checking and cleaning up individual files means it is again possible to clean up Linux trees on the fly, which a number of users used to find valuable.

Over the next few days, we'll also roll out Linux-libre, generation 4, for earlier Linux releases, fixing a few deblobbing errors in staging drivers and catching a few more occurrences of non-Free blob names in documentation and error messages.

Request for comments

A number of our users have expressed legitimate dissatisfaction with a consequence of the method we've used to stop the kernel from inducing users to install non-Free firmware. It is not our goal to prevent users from loading or running non-Free firmware, but the only way we thought of to avoid inducing users to run non-Free firmware had the side effect of making it impossible to use the non-Free firmware just by installing it.

In Linux, several drivers call request_firmware with a blob name. This request is logged, including the blob name, and passed on to a userland program, supposed to locate a firmware file with that name and upload it to the kernel. Given the logs, in addition to existing and potential behavior of the userland program, this amounted to Linux telling its user to install a specific non-Free program, which is unacceptable.

Linux-libre releases since generation 2 replace the blob name with a name that the firmware loader is unlikely to match, and that could be recognized in userland to inform users about the lack of Free firmware for some hardware component of the system. We also reject whatever response the firmware loader produces for such requests, to minimize the risk of accidental matches and hardware damage.

We reasoned that anyone determined to use the firmware could still build a module, or a complete kernel, that issues the request and uses the response. This possibility was considered too cumbersome by some.

Recently we came up with another way to achieve the goal of stopping the kernel from inviting users into the trap of non-Free Software: where Linux requests a firmware file that we know is non-Free, we could anonymize the blob name with a unidirectional hash of its name and a kernel build and/or session identifier, and issue a request for a file named after the computed hash.

Given a suitable implementation of the userland firmware loader, whatever pieces of firmware the user chose to install would still be readily located and made available to the kernel. However, because of the unidirectional nature of the hash, a request for firmware that's not installed won't steer users toward that firmware, because the hash code won't immediately identify it. Thus, if the user insists on installing this firmware, Linux-libre will work with it, but it is very unlikely anyone will install the firmware because of Linux-libre.

Join us at linux-libre@fsfla.org and let us know your suggestions, other ways to address this issue, or your opinion about this plan and whether it might be accepted upstream. Feedback and help are welcome!

In the mean time, Be Free! with Linux-2.6.33-libre, and help us reverse the growing dependency of Linux on non-Free firmware.

About Linux-libre

Linux-libre is a project maintained by FSFLA, that releases cleaned-up versions of Linux, suitable for use in distributions that comply with the Free Software Distribution Guidelines published by the GNU project, and by users who wish to run Free versions of Linux on their GNU systems. The project offers cleaning-up scripts and Free sources, binaries for some Free GNU/Linux-libre distributions, binaries to replace with minimal changes the kernels in non-Free GNU/Linux distributions: Freed-ebian and Freed-ora, and artwork with GNU and the Linux-libre mascot: Freedo, the clean, Free and user-friendly light-blue penguin. Visit our web site and Be Free!


Free Software Foundation Latin America joined in 2005 the international FSF network, previously formed by Free Software Foundations in the United States, in Europe and in India. These sister organizations work in their corresponding geographies towards promoting the same Free Software ideals and defending the same freedoms for software users and developers, working locally but cooperating globally.

Copyright 2010 FSFLA

Permission is granted to make and distribute verbatim copies of this entire document without royalty, provided the copyright notice, the document's official URL, and this permission notice are preserved.

Permission is also granted to make and distribute verbatim copies of individual sections of this document worldwide without royalty provided the copyright notice and the permission notice above are preserved, and the document's official URL is preserved or replaced by the individual section's official URL.