Compilando e instalando el kernel Linux

17 Dec
Published by antonio.hernandez in

No soy dado a compilar e instalar el kernel linux desde hace varios años y la única razón por la que he tenido que hacerlo es por tener una laptop de "hoy", una Thinkpad t430. Slackware64 Linux 14.0 viene con el kernel 3.2.28, el cual ante el primer inicio después de la instalación me dió un kernel panic :'(

Así que recordando los viejos tiempos, dejo a continuación los pasos para instalar un nuevo kernel linux.

  1. Descargamos el kernel linux más reciente de la rama stable desde http://kernel.org y lo descomprimimos en /usr/src.

    De acuerdo con Greg Kroah-Hartman la versión 3.10 del kernel linux se mantendrá por lo menos 2 años como longterm stable, lo que nos permitirá tener un kernel estable y con soporte ;)

    root@slackware:~# cd /usr/src/
    root@slackware:/usr/src# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.9.tar.xz
    --2013-08-23 00:30:53--  https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.9.tar.xz
    Resolving www.kernel.org (www.kernel.org)... 149.20.4.69, 198.145.20.140
    Connecting to www.kernel.org (www.kernel.org)|149.20.4.69|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 73210852 (70M) [application/x-xz]
    Saving to: ‘linux-3.10.9.tar.xz’
    100%[================================================>] 73,210,852   135KB/s   in 12m 8
    2013-08-23 00:43:03 (98.2 KB/s) - ‘linux-3.10.9.tar.xz’ saved [73210852/73210852]
    root@slackware:/usr/src# tar xf linux-3.10.9.tar.xz
    root@slackware:/usr/src# cd linux-3.10.9
    root@slackware:/usr/src/linux-3.10.9#
     
  2. Configuramos el kernel linux, pero antes un poco de teoría.

    La configuración del kernel linux, es decir la forma en como le indicamos las opciones-drivers-módulos que deseamos que tenga la hacemos mediante el archivo .config dentro de su código fuente, en este caso será /usr/src/linux-3.10.9/.config. El archivo .config lo generamos mediante targets de make, puedes obtener una lista completa de los targets de make con el comando make help. El target más usado (considero) para esto es make menuconfig.

    Importante: es muy recomendable buscar un archivo .config ya probado por otra persona para no comenzar desde cero. En el caso de Slackware64 Linux, Patrick Volkerding deja dichos archivos en el repositorio http://slackware.mirrors.tds.net/pub/slackware/slackware64-current/kernels/huge.s/config. En esté momento el archivo .config dado por Patrick Volkerding corresponde a la misma versión del kernel linux que compilaré e instalaré.

    root@slackware:/usr/src/linux-3.10.9# wget http://slackware.mirrors.tds.net/pub/slackware/slackware64-current/kernels/huge.s/config -O .config
    --2013-08-23 01:09:50--  http://slackware.mirrors.tds.net/pub/slackware/slackware64-current/kernels/huge.s/config
    Resolving slackware.mirrors.tds.net (slackware.mirrors.tds.net)... 204.246.0.134
    Connecting to slackware.mirrors.tds.net (slackware.mirrors.tds.net)|204.246.0.134|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 137515 (134K) [text/plain]
    Saving to: ‘.config’
    100%[================================================>] 137,515     28.6KB/s   in 4.7s
    2013-08-23 01:09:56 (28.6 KB/s) - ‘.config’ saved [137515/137515]
    root@slackware:/usr/src/linux-3.10.9#
     

    Ejecutamos make oldconfig para actualizar las opciones del archivo .config tomando en cuenta la actual versión que compilaremos. Podemos compilar el kernel linux 3.10.9 usando el archivo .config de la versión 3.2.28, make oldconfig se encargará de hacer las modificaciones al archivo .config para la versión 3.2.28 de tal forma que nos sirva para la versión 3.10.9. Se puede presentar la situación que haya un nuevo modulo en la versión 3.10.9 que el archivo .config de la versión 3.2.28 no tenga configurado, de ser así make oldconfig nos preguntará que deseamos hacer al respecto, solemos indicarle que compile el nuevo modulo como externo, está situación es muy rara en las ramas stable ;)

    root@slackware:/usr/src/linux-3.10.9# make oldconfig
    scripts/kconfig/conf --oldconfig Kconfig
    #
    # configuration written to .config
    #
    root@slackware:/usr/src/linux-3.10.9#
     

    Recomendación: integra los módulos del sistema de archivos (ext*, reiserfs, jfs, etc) que hagas uso en tus particiones para evitar tener que crear un archivo initrd (manpage mkinitrd).

  3. Compilamos el kernel y sus módulos con el comando make bzImage modules y nos podemos retirar a tomar una taza de café...

    root@slackware:/usr/src/linux-3.10.9# make -j 5 bzImage modules
      HOSTCC  scripts/basic/fixdep
      HOSTCC  scripts/kconfig/conf.o
      SHIPPED scripts/kconfig/zconf.tab.c
      SHIPPED scripts/kconfig/zconf.lex.c
      SHIPPED scripts/kconfig/zconf.hash.c
      HOSTCC  scripts/kconfig/zconf.tab.o
      HOSTLD  scripts/kconfig/conf
    scripts/kconfig/conf --silentoldconfig Kconfig
      SYSHDR  arch/x86/syscalls/../include/generated/uapi/asm/unistd_32.h
    ...
    ...
      IHEX    firmware/edgeport/down3.bin
      IHEX2FW firmware/whiteheat_loader.fw
      IHEX2FW firmware/whiteheat.fw
      IHEX2FW firmware/keyspan_pda/keyspan_pda.fw
      IHEX2FW firmware/keyspan_pda/xircom_pgs.fw
      IHEX    firmware/cpia2/stv0672_vp4.bin
      IHEX    firmware/yam/1200.bin
      IHEX    firmware/yam/9600.bin
      IHEX2FW firmware/atmsar11.fw
    root@slackware:/usr/src/linux-3.10.9#
     

    Nota: el uso de -j 5 le indica a make que la compilación la haga en paralelo haciendo uso de los núcleos disponibles en nuestro equipo. Para determinar el número a usar puedes ejecutar grep processor /proc/cpuinfo | wc -l y sumar 1 al resultado.

  4. Instalamos los módulos con el comando make modules_install, lo cual creará un directorio dentro de /lib/modules/, en este caso será /lib/modules/3.10.9/.

  5. Instalamos el "ejecutable" del kernel linux ;)

    root@slackware:/usr/src/linux-3.10.9# cp arch/x86_64/boot/bzImage /boot/vmlinuz-generic-3.10.9
    root@slackware:/usr/src/linux-3.10.9# cp System.map /boot/System.map-generic-3.10.9
    root@slackware:/usr/src/linux-3.10.9# cp .config /boot/config-generic-3.10.9
     
  6. Configuramos el linux loader que usemos, en mi caso es lilo:

    root@slackware:/usr/src/linux-3.10.9# cd /boot/
    root@slackware:/boot# rm config vmlinuz System.map
    root@slackware:/boot# ln -s config-generic-3.10.9 config
    root@slackware:/boot# ln -s vmlinuz-generic-3.10.9 vmlinuz
    root@slackware:/boot# ln -s System.map-generic-3.10.9 System.map
     

    En /etc/lilo.conf tengo la siguiente entrada para Slackware64 Linux:

    # Slackware64 Linux image = /boot/vmlinuz append = " vt.default_utf8=1 " root = /dev/sda6 label = Slackware64 read-only

    Ejecutamos lilo y reiniciamos nuestro equipo como último paso.