Del tipo de compresión del kernel de Linux
April 8, 2026•569 words
Este es un fragmento de una publicación que lancé allá por noviembre de 2019 en mi viejo blog.
Para la realización de una práctica de preparación de LPIC-1/2, debía averiguar el tipo de compresión del kernel de Linux empleado en mi sistema. En ese momento, usando la distribución archlinux.
Ejecutando file sobre el fichero de kernel obtengo:
$ file /boot/vmlinuz-linux
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 5.14.16-arch1-1 (linux@archlinux) #1 \
SMP PREEMPT Tue, 02 Nov 2021 22:22:59 +0000, RO-rootFS, swap_dev 0X9, Normal VGA
Y revisando la documentación teórica, observo que bzImage debería ir comprimido por gzip (z). Véase vmlinuz.html. De hecho, existe la idea errónea popular de que el prefijo bz significa que se utiliza la compresión bzip2, pero este no es el caso, por lo que el bz en bzImage no tiene relación con bzip2, y bzImage no tiene que ser comprimido con bzip2, como algunas veces se postula. De hecho, el modo de compresión predeterminado del kernel sigue siendo gzip, y hay pocas razones para usar bzip2 hoy en día: es más lento que LZMA y xz, pero no se comprime tan bien.
Pero, ¿cómo puedo probarlo empíricamente?
Para determinar de manera concluyente qué compresión se utilizó para una imagen dada del kernel, sin necesidad de ejecutarla o encontrar su configuración, podemos seguir el enfoque utilizado por el propio script extract-vmlinux del kernel.
Buscando primero la firma del compresor en la imagen:
- gunzip: \037\213\010
- xz: \3757zXZ\000
- bzip2: BZh
- lzma: \135\0\0\0
- lzo: \211\114\132
- lz4: \002!L\030
- zstd: (\265/\375
Pretendiendo extraer los datos de la imagen, comenzando por el desplazamiento de cualquier firma que haya encontrado y comprobando que el resultado (si lo hubiera) sea una imagen de ELF. Con una breve adaptación del script -por Stephen Kitt-. para sólo reportar el tipo de compresión, obtenemos sencillamente el tipo:
4c4
< # extract-vmlinux - Extract uncompressed vmlinux from a kernel image
---
> # check-vmlinux - Identify compression used for a kernel image
8d7
< #
9a9
> # © 2019 Stephen Kitt
20,22c20,22
< cat $1
< exit 0
< }
---
> echo The image was compressed using $2
> exit 0
> }
34c34
< check_vmlinux $tmp
---
> check_vmlinux $tmp $4
52,58c52,58
< try_decompress '\037\213\010' xy gunzip
< try_decompress '\3757zXZ\000' abcde unxz
< try_decompress 'BZh' xy bunzip2
< try_decompress '\135\0\0\0' xxx unlzma
< try_decompress '\211\114\132' xy 'lzop -d'
< try_decompress '\002!L\030' xxx 'lz4 -d'
< try_decompress '(\265/\375' xxx unzstd
---
> try_decompress '\037\213\010' xy gunzip gzip
> try_decompress '\3757zXZ\000' abcde unxz xz
> try_decompress 'BZh' xy bunzip2 bzip2
> try_decompress '\135\0\0\0' xxx unlzma lzma
> try_decompress '\211\114\132' xy 'lzop -d' lzop
> try_decompress '\002!L\030' xxx 'lz4 -d' lz4
> try_decompress '(\265/\375' xxx unzstd zstd
61c61
< check_vmlinux $img
---
> check_vmlinux $img none
--------------------------------------------------------------------
$ ./nuevo /boot/vmlinuz-linux
The image was compressed using zstd
Otra forma de validarlo es comprobar qué métodos de compresión soporta el núcleo. Sólo puede haber uno seleccionado, el cual determinará el algoritmo empleado:
$ zgrep CONFIG_KERNEL_ /proc/config.gz
# CONFIG_KERNEL_GZIP is not set
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not set
CONFIG_KERNEL_ZSTD=y
Como conclusión, a pesar de que en la teoría, por defecto es usado el algoritmo de gzip, en ocasiones como la que ocupa al caso actual no se corresponde con ésta, requiriendo una demostración concluyente antes de tomar conclusiones erróneas fundamentadas únicamente en la teoría.