El kernel Linux no es libre

gato_encerrado

Linux es el proyecto del kernel (núcleo) del sistema operativo que generalmente se llama igual, muchos lo llaman GNU/Linux, y empresas le ponen distintas marcas comerciales.

Resulta que el kenel hace muchos años que incorpora piezas de software oscurecido y de los cuales no se cuenta con documentación. ¿por qué? por una complicidad entre los productores de hardware que entregan estos códigos y los desarrolladores del kernel que lo incorporan y distribuyen a los usuarios.

Estas piezas no libres (porque no pueden ser ni modificadas ni estudiadas) empezaron siendo unas pocas, pero han ido creciendo en número con el correr del tiempo, llegando más de cien, en su mayoría drivers y archivos de firmware y se conocen como blob binarios

Entré al sitio oficial del proyecto Linux y descargué la última versión estable (4.3) y me puse a analizar de qué está compuesto.

Es un proyecto de software enorme:

  • Un archivo compactado de 83M
  • Descompactados ocupan 688M
  • Un total de 3439 carpetas
  • Un total de 51544 archivos
  • Más de 20 millones de líneas de código (según Wikipedia)

que tiene más de 11 años de desarrollo desde su primer versión estable.

Revisando sus archivos con file veo que está compuesto de:

$ find linux-4.3 -type f -exec file {} \; | cut -d: -f 2- | sort | uniq -c | sort -nr
38900  ASCII c program text
6226  ASCII English text
2955  ASCII text
1324  ASCII Pascal program text
 948  UTF-8 Unicode c program text
 199  UTF-8 Unicode English text
 180  HTML document text
 113  POSIX shell script text executable
  93  Bourne-Again shell script text executable
  93  ASCII C++ program text
  73  UTF-8 Unicode Pascal program text
  60  ASCII make commands text
  44  ASCII assembler program text
  43  OS/2 REXX batch file text
  39  XML  document text
  19  a /usr/bin/perl -w script text executable
  14  troff or preprocessor input text
  14  Netpbm PPM image text
  14  ASCII c program text, with very long lines
  13  a /usr/bin/perl script text executable
  12  ASCII FORTRAN program text
  10  a /usr/bin/python script text executable
   9  exported SGML document text
   9  empty
   9  data
   8  awk script text executable
   6  very short file (no magic)
   6  a perl script text executable
   6  SVG Scalable Vector Graphics image
   6  ISO-8859 English text
   6  Arhangel archive data
   6  ASCII Pascal program text, with very long lines
   5  lex description text
   5  ISO-8859 c program text
   4  UTF-8 Unicode (with BOM) English text
   4  ASCII mail text
   4  ASCII English text, with very long lines
   3  Perl5 module source text
   3  PDF document, version 1.4
   3  PDF document, version 1.3
   3  ISO-8859 Pascal program text
   3  ERROR: line 22: regexec error 17, (illegal byte sequence)
   3  Bio-Rad .PIC Image File 10799 x 8202, 8234 images in file
   2  diff output text
   2  a python script text executable
   2  a /usr/bin/python2 script text executable
   2  UTF-8 Unicode text
   2  TI-XX Graphing Calculator (FLASH)
   2  PDF document, version 1.2
   2  Non-ISO extended-ASCII c program text
   2  Netpbm PBM image text
   2  FIG image text, version 3.2
   2  DBase 3 index file
   2  Bio-Rad .PIC Image File 26915 x 28262, 25956 images in file
   2  ASCII text, with very long lines
   1  news or mail text
   1  core file (Xenix)
   1  a python2 script text executable
   1  a /usr/bin/perl -s script text executable
   1  XPack archive data
   1  UTF-8 Unicode c program text, with very long lines
   1  UTF-8 Unicode C++ program text
   1  SemOne archive data
   1  SAS 7+
   1  SAS
   1  Par archive data
   1  PPMN archive data
   1  Minix filesystem, V3, 20302 zones
   1  Minix filesystem, V3, 15648 zones
   1  LaTeX 2e document text
   1  ICE authority data
   1  GIF image data, version 89a, 257 x 303
   1  Bio-Rad .PIC Image File 10799 x 29216, 25460 images in file
   1  ASCII news text
   1  ASCII c program text, with escape sequences
   1  ASCII M4 macro language pre-processor text
   1  ASCII Java program text
   1  ASCII English text, with overstriking

y descargo el script deblob del sitio de la FSFLA y veo que esos archivos están contaminados con códigos que no puedo modificar, ni estudiar:

$ cd linux-4.3/
$ ../deblob-4.3 
Makefile: added -gnu to EXTRAVERSION
README: added blurb about GNU Linux-libre
include/linux/firmware.h: added non-Free firmware notification support
include/linux/ihex.h: added non-Free ihex firmware notification support
drivers/base/firmware_class.c: shorten non-Free firmware fail-to-load timeout

MICROCODE_AMD - AMD microcode patch loading support
arch/x86/kernel/cpu/microcode/amd.c: disabled non-Free firmware-loading machinery
arch/x86/kernel/cpu/microcode/amd.c: removed blobs

MICROCODE_AMD_EARLY - Early load AMD microcode
arch/x86/kernel/cpu/microcode/amd_early.c: removed blobs

MICROCODE_INTEL - Intel microcode patch loading support
arch/x86/kernel/cpu/microcode/intel.c: disabled non-Free firmware-loading machinery
arch/x86/kernel/cpu/microcode/intel.c: removed blobs

MICROCODE_INTEL_EARLY - Early load Intel microcode
arch/x86/kernel/cpu/microcode/intel_early.c: removed blobs

MICROCODE_EARLY - Early load microcode
Documentation/x86/early-microcode.txt: removed blobs

...

DRM_NOUVEAU - Nouveau (nVidia) cards
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c: disabled non-Free firmware-loading machinery
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c: removed blobs
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c: disabled non-Free firmware-loading machinery
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c: removed blobs
drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c: disabled non-Free firmware-loading machinery
drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c: removed blobs

...

Entonces, la próxima vez que diga que Linux es libre, sepa que no es así. El linux (kernel) que recibe con las distribuciones más conocidas no permitirá que haga ciertas cosas…. claro que usarlo podrá usarlo, de última es la llamada Libertad 0 (cero)

Más información sobre blob binarios:
* Conferencia: Binary Blobs Attack 2012
* Linux Foundation Driver Statement 2009

Crear archivos grandes

create large files

Varias veces he tenido la necesidad de crear archivos grandes, ya sea para luego darles formato de sistema de archivos y usarlos como imágenes o para llenar espacio en disco. Hasta ahora utilizaba el comando dd, pero hace poco encontré que existen formas múcho más rápidas para hacerlo y que terminan siendo más adecuadas.

dd

Como dije utilizaba el comando dd que está pensado para copiar archivos y, cuando se leen datos desde el dispositivo /dev/zero, se puede crear un archivo lleno de ceros.

dd if=/dev/zero of=archivo.img bs=1024 count=1000000

Página man dd

fallocate

fallocate se utiliza para pre-asignar bloques a un nombre de archivo. Esta tarea se realiza muy rápidamente porque solo se asignan bloques sin datos, por lo que no se realizan operaciones de entrada/salida y termina siendo mucho más rápido que crear un archivo lleno de ceros.

fallocate está disponible desde el kernel Linux v2.6.31 y está soportado por los sistemas de archivos btrfs, ext4, ocfs2 y xfs.

fallocate -l 10M archivo.img

Página man fallocate

truncate

truncate permite ampliar o reducir un archivo a un tamaño especificado. Si el archivo no existe, se crea con el tamaño específico, que es lo que generalmente necesito hacer.

Si un archivo es más grande que el tamaño especificado, se pierden los datos extra. Si un archivo es más corto, se extiende y la parte ampliada está llena de byte cero.

truncate -s 10M archivo.img

Página man truncate

xfs_mkfile

xfs_mkfile permite crear uno o más archivos en sistemas de archivo xfs exclusivamente (lo estandar en RedHat a partir de la versión 7).

El archivo por defecto se rellena con ceros por defecto. El tamaño que se indica por defecto es en bytes, pero se pueden indicar en kilobytes, bloques, megabytes o gigabytes con los parámetros k, b, m, o g, respectivamente.

xfs_mkfile 1240m archivo.img

Pagina man xfs_mkfile

Reiniciar servidor Linux

reboot175x175En un servidor o computadora que corra Linux la mayoría de los cambios quedan activos sin necesidad de reinicio; pero hay algunas oportunidades donde es obligatorio volver a iniciar el equipo.  En este artículo trato de listar cuáles son esos momentos de reinicio obligatorio.

Cambio de hardware – Dependiendo de la arquitectura y el tipo de dispositivos un cambio de hardware requiere apagar el equipo y por lo tanto reiniciar. Linux está preparado para autodetectar los cambios de harware, por lo que el hardware hot-swap funciona transparentemente. A su vez, en ambientes donde el hardware puede ser configurado a demanda (como virtualización) Linux va a detectar las alteraciones de CPU, Memoria y dispositivos en forma normal.

Actualización del kernel – A diferencia de otros sistemas operativos, en Linux es posible actualizar la mayoría del sistema sin reiniciar, pero los administradores sabemos que actualizar el kernel requiere reiniciar el equipo.  No obstante, a partir de Abril de 2015 con la versión 4.0 el kernel incluye la funcionalidad de «no reboot patching» y para esto existen algunas opciones como Ksplice (GPL), kpatch de RedHat o kGraft de SuSE; así que próximamente nuestros kernel se actualizarán sin reiniciar.

Desactivar o activar SELinux – Pasar el sistema de seguridad SELinux del kernel de Enforced a Disabled o viceversa, requiere reiniciar el sistema como puede verse en los manuales de administración RedHat

Modificar filesystem del sistema – Para cambiar tamaño de una partición que aloja un filesystem del sistema es necesario desmontarla y esto se hace reiniciado con otro sistema (por ejemplo live-CD de PartMagic). Si bien algunos filesystems pueden ser agrandados mientras están montados, podemos entender que esta es otra razón de reinicio – Gracias Arlequín y @alfrenovsky por los comentarios.

Actualización de librerías (glibc) – Cuando se actualizan las librerías dinamicas, los ejecutables que están corriendo quedan vinculados (linked) a las librerías antiguas, por lo que es recomendable reiniciar los daemons que quedan afectados. Pero cuando se instala una nueva versión de la librería glibc se afectan la mayoría de los procesos (por no decir, todos); en esos casos la opción más fácil es reiniciar todo el sistema para que los ejecutables queden corriendo vinculados a las nuevas librerías glibc. – Gracias El G@llego por aporte.

¿conoces algun otro motivo por el que es requerido reiniciar Linux?  Por favor, dejame tu comentario e ire actualizando este artículo.

Estadísticas del kernel Linux

Linux Foundation ha publicado un estudio relativo al desarrollo del kernel Linux, que arroja luz sobre el desarrollo y los programadores que hacen posible el kernel de nuestro sistema operativo preferido.
Ciclo de Desarrollo Linux

Algunos datos interesantes:

Quiénes desarrollan Linux?

  • Cada kernel linux es desarrollado por cerca de 1.000 programadores que trabajan en más de 100 diferentes empresas. Siendo entonces el proyecto de software distribuído más grande del mundo.
  • Entre el 70 al 95% de estos programadores reciben pago por su trabajo, lo que descarta el mito del «hobby» del desarrollador de software libre

Quiénes esponsorizan Linux?

Cuán rápido se desarrolla?

  • Un promedio de 3.621 líneas de código se agregan al árbol del kernel cada día, y una nueva versión del kernel es lanzada cada 2.7 meses.
  • Desde el año 2005, el kernel ha estado creciendo en forma sostenida un 10% anual.

La publicación de la noticia del estudio, por parte de Linux Foundation, trae un comentario que traduzco:

«Nunca antes en la historia de la computación han estado tantas empresas, usuarios y programadores unidos detrás de un proyecto, en particular uno que tiene tanto éxito comercial»
Jim Zemlin, director ejecutivo de The Linux Foundation.