index.html (4997B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 <title>Demostración empírica de tipo de compresión usada en el kernel de Linux</title> 7 <link rel="icon" type="image/png" href="/favicon.png" /> 8 <link rel="stylesheet" type="text/css" href="../article.css" /> 9 </head> 10 <body> 11 <header> 12 <p class="title">Demostración empírica de tipo de compresión usada en el kernel de Linux</p> 13 <p class="date">19 de noviembre de 2019 • fjbalon</p> 14 </header> 15 <p>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 <emb>archlinux</emb>.</p> 16 <p>Ejecutando file sobre el fichero de kernel obtengo:</p> 17 <pre><code>$ file /boot/vmlinuz-linux 18 /boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 5.14.16-arch1-1 (linux@archlinux) #1 \ 19 SMP PREEMPT Tue, 02 Nov 2021 22:22:59 +0000, RO-rootFS, swap_dev 0X9, Normal VGA</code></pre> 20 <p>Y revisando la documentación teórica, observo que bzImage debería ir comprimido por <emb>gzip</emb> (<emb>z</emb>). Véase <a href="http://www.linfo.org/vmlinuz.html">vmlinuz.html</a>. De hecho, existe la idea errónea popular de que el prefijo <emb>bz</emb> significa que se utiliza la compresión <emb>bzip2</emb>, pero este no es el caso, por lo que el bz en bzImage no tiene relación con <emb>bzip2</emb>, y <emb>bzImage</emb> no tiene que ser comprimido con <emb>bzip2</emb>, como algunas veces se postula. De hecho, el modo de compresión predeterminado del kernel sigue siendo <emb>gzip</emb>, y hay pocas razones para usar bzip2 hoy en día: es más lento que <emb>LZMA</emb> y <emb>xz</emb>, pero no se comprime tan bien.</p> 21 <h2>Pero, ¿cómo puedo probarlo empíricamente?</h2> 22 <p>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 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/extract-vmlinux">extract-vmlinux</a> del kernel.</p> 23 <p>Buscando primero la firma del compresor en la imagen:</p> 24 <ul> 25 <li>gunzip: \037\213\010</li> 26 <li>xz: \3757zXZ\000</li> 27 <li>bzip2: BZh</li> 28 <li>lzma: \135\0\0\0</li> 29 <li>lzo: \211\114\132</li> 30 <li>lz4: \002!L\030</li> 31 <li>zstd: (\265/\375</li> 32 </ul> 33 <p>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 <a href="https://gist.github.com/skitt/288c0c52b51b5863947a5d6c1180c9f3">Stephen Kitt</a>-. para sólo reportar el tipo de compresión, obtenemos sencillamente el tipo:</p> 34 <pre><code>4c4 35 < # extract-vmlinux - Extract uncompressed vmlinux from a kernel image 36 --- 37 > # check-vmlinux - Identify compression used for a kernel image 38 8d7 39 < # 40 9a9 41 > # © 2019 Stephen Kitt <steve@sk2.org> 42 20,22c20,22 43 < cat $1 44 < exit 0 45 < } 46 --- 47 > echo The image was compressed using $2 48 > exit 0 49 > } 50 34c34 51 < check_vmlinux $tmp 52 --- 53 > check_vmlinux $tmp $4 54 52,58c52,58 55 < try_decompress '\037\213\010' xy gunzip 56 < try_decompress '\3757zXZ\000' abcde unxz 57 < try_decompress 'BZh' xy bunzip2 58 < try_decompress '\135\0\0\0' xxx unlzma 59 < try_decompress '\211\114\132' xy 'lzop -d' 60 < try_decompress '\002!L\030' xxx 'lz4 -d' 61 < try_decompress '(\265/\375' xxx unzstd 62 --- 63 > try_decompress '\037\213\010' xy gunzip gzip 64 > try_decompress '\3757zXZ\000' abcde unxz xz 65 > try_decompress 'BZh' xy bunzip2 bzip2 66 > try_decompress '\135\0\0\0' xxx unlzma lzma 67 > try_decompress '\211\114\132' xy 'lzop -d' lzop 68 > try_decompress '\002!L\030' xxx 'lz4 -d' lz4 69 > try_decompress '(\265/\375' xxx unzstd zstd 70 61c61 71 < check_vmlinux $img 72 --- 73 > check_vmlinux $img none 74 75 -------------------------------------------------------------------- 76 77 ./nuevo /boot/vmlinuz-linux 78 The image was compressed using zstd</code></pre> 79 <p>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:</p> 80 81 <pre><code>zgrep CONFIG_KERNEL_ /proc/config.gz 82 # CONFIG_KERNEL_GZIP is not set 83 # CONFIG_KERNEL_BZIP2 is not set 84 # CONFIG_KERNEL_LZMA is not set 85 # CONFIG_KERNEL_XZ is not set 86 # CONFIG_KERNEL_LZO is not set 87 # CONFIG_KERNEL_LZ4 is not set 88 CONFIG_KERNEL_ZSTD=y</code></pre> 89 <p>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.</p> 90 91 </body> 92 </html>