static-httpd

Sitio web estático (HTML + CSS) que sostiene el blog del autor
Log | Files | Refs

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>