# Linux-libre

Linux-libre es un proyecto que publica y mantiene versiones modificadas del núcleo Linux a las que se les ha quitado todo el software que no incluye código fuente, así como el código fuente ofuscado o el que esté publicado mediante licencias privativas. Las partes que no tienen código fuente son llamadas blobs binarios y corresponden a firmware privativo.
Estos fragmentos privativos o firmwares incluidos en Linux sirven para inicializar los dispositivos, o aplicarles parches que solventan fallas del hardware que no pudieron ser corregidas antes de ser puestos a disposición de los usuarios. El firmware es cargado en el dispositivo por el controlador, formando parte de este y por consiguiente del núcleo. Es conocido que dichos firmwares contienen vulnerabilidades que pueden afectar a Linux pese a usar controladores libres, como es el caso del Intel Management Engine. En algunos casos sin el firmware no es posible hacer funcionar el dispositivo, quedando este inutilizado. Esto lleva a que hay menor cantidad de hardware compatible con Linux-libre que con Linux. Al hablar de dispositivos se incluye también la CPU de la computadora. Esto significa que las computadoras pueden quedar totalmente inservibles si su microprocesador también requiere de un firmware corrector para funcionar adecuadamente.
Linux-libre es el núcleo recomendado por la Free Software Foundation y una pieza principal de las distribuciones GNU totalmente libres. Linux-libre es mantenido y publicado por la Fundación Software Libre América Latina (FSFLA).
Existen proyectos para realizar implementaciones libres de dichos firmwares como libreboot, encargado de implementar BIOS y UEFI para las placas base de los computadores siempre que sea posible.

## Eliminación de firmware privativo

El proceso de limpieza se logra mediante el uso de un script llamado deblob-main. Este script está inspirado en el que se utiliza para gNewSense. Jeff Moe le realizó modificaciones posteriores para cubrir ciertos requisitos para su utilización con la distribución BLAG Linux and GNU. Existe también otro script llamado deblob-check, que se utiliza para verificar si un archivo fuente del núcleo, un parche o un archivo de fuentes comprimido aún contiene software sospechoso de ser privativo.

### Desventajas

La eliminación de controladores y firmwares privativos del núcleo imposibilita el uso de Linux-libre con el hardware que los necesite. En los casos en los que sea posible, se incluye controladores libres o genéricos como sustitutos. Entre otros, las tarjetas de sonido, de vídeo, de red y de red inalámbrica son usadas con controladores genéricos, pudiendo que no funcionen todas las características, pero por lo general sí las básicas.
Desgraciadamente, aun teniendo controladores libres, éstos a menudo requieren que los fabricantes de dispositivos hardware publiquen el código fuente necesarios para poder compilar un controlador libre para sus dispositivos. Sin estos firmwares no pueden funcionar. También existe la posibilidad de que requieran ser firmados digitalmente, por lo que no es posible realizar un firmware propio mediante ingeniería inversa y cargarlo en el chip, ya que este repudiará cualquier binario sin firmar. Adicionalmente las compañías pueden poner restricciones de distribución del firmware por lo que tampoco puede ser incluido en Linux ni en ningún paquete adicional hecho por la distribución, al poder ser considerado parte integrante de un controlador privativo por parte del fabricante del dispositivo. Este tipo de restricciones entorpecen el desarrollo de controladores libres además de dejar el dispositivo inhabilitado. Estos dispositivos nunca serán compatibles con Linux-libre, salvo que el código fuente de dichos firmwares sea publicado y se permita a los desarrolladores de Linux-libre y a sus usuarios firmar los binarios generados a partir de dicho código fuente.

## Ejemplo de inclusión de firmware privativo en Linux

Los microprocesadores de AMD e Intel pueden cargar firmware para activar, desactivar o corregir funcionalidad del chip. Linux incluye soporte para ello así como el código privativo en archivos binarios. A la izquierda se puede ver un fragmento de código fuente del controlador de Linux que permite cargar el firmware de un microprocesador AMD durante el inicio del sistema. Esta rutina toma el archivo indicado por la rutina get_builtin_microcode o por la ruta indicada por la variable ucode_path mediante la rutina find_microcode_in_initrd. Este fragmento de código se usa cuando Linux detecta la CPU de la computadora y llama al controlador para que provea el firmware del microprocesador. El controlador se encarga de todas las gestiones necesarias: búsqueda del firmware e instalación en la CPU. Esta instalación de firmware ocurre también cuando la CPU sale de un estado durmiente (hibernación o suspensión). El firmware queda cacheado en memoria para cargarlo cuantas veces sea necesario.
Cambios en el firmware pueden requerir cambios en Linux. Por ejemplo, en los microprocesadores AMD Ryzen el tamaño máximo del firmware cambió con respecto a procesadores anteriores. Linux 4.12rc5 fue modificado para soportarlo. Los firmwares de los dispositivos suelen estar en el directorio /lib/firmware del sistema operativo. Las distribuciones GNU/Linux que no usan Linux-libre suelen incluir paquetes de software con blobs (firmwares) adicionales para, según sus términos, proveer la mejor experiencia de usuario posible, a expensas de usar código privativo.

### Fragmento de «AMD CPU Microcode Update Driver for Linux»
## Distribuciones de GNU/Linux-libre

Las siguientes distribuciones de GNU utilizan o tienen disponible Linux-libre como su núcleo:
* Arch Linux
* Canaima GNU/Linux
* Dragora
* Gentoo Linux
* Dyne:bolic
* GNU Guix System
* GNUinOS
* Hyperbola GNU/Linux-libre
* Parabola GNU/Linux-libre
* PureOS
* Trisquel GNU/Linux
* Uruk GNU
* Ututo
* Flora Linux-libre
* ProteanOS
* LibreCMC