Canales populares

¿Como compilar un Kernel? en todas los distro

Como compilar un kernel y no morir en el intento ( Todas las distro )



Dado que en el post anterior no hacia referencia como compilar un kernel, es que decido hacer este post.

Según algunas wikis o FAQ, como la de Ubuntu, dirán, que si realmente necesitas compilar un kernel, porque si, porque no, y muchos etc que básicamente desalientan al usuario a hacerlo.

Ampliando ;

¿Porque no deberias compilar un kernel?

1.- El kernel que tienes funciona bien, cumple con las expectativas y cubre todo tu hardware, ademas, si usas distro como RHEL o Debian, el kernel que compiles, puede ser inferior, y... ademas deberás compilar uno cada vez que salga una versión nueva del mismo.

2.- Puede que tu sistema no inicie y si no sabes usar chroot desde un liveCD, bueno, la jodiste, a menos que busques la entrada de como recuperarlo en este mismo blog

3.- Si tienes un CPU poco potente, es una tarea que puede demorar horas y horas

4.- No te gusta leer ni aprender, ni entender lo que estás haciendo



¿Porque si deberias compilar un kernel?


1.- Quieres un kernel mas nuevo con funciones nuevas, que las puedes leer en LWN.net, kernelnewbies, h-online, donde dices "ey justo eso necesita mi pc nuevita, las instrucciones del nuevo AMD FX, o sus APU, etc.

2.- Padeces versionitis

3.- Mejorar cosas en cuanto a rendimiento comparado al kernel de stock, como aplicar parches, compilarlo con mas o menos HZ, con o sin real time, etc

4.- Quitar la una enormidad de modulos y cosas que no usas para asi hacerlo mas pequeño

5.- Elegir el modelo de tu CPU, mother, y otros componentes, y quitar TODO lo que no es de tu PC, dando asi, una mayor, eficiencia, poco notable, pero, notable al fin

6.- Aplicar parches como grsec, tux on ice, ck, etc

7.- Que soporte tu nueva placa wifi o tu sintonizador de TV digital por aire

8.- Aprender?, creo que es el mejor motivo

Nadie nace sabiendo y mucho menos en estas cuestiones, tampoco se pretende (ojo, el que quiera me parece excelente), que sea un experto en kernels, pero si, que puedan el día de mañana, compilar un kernel a medida para un sistema X dado, en funcion de lo que se necesita, como ser, Gentoo Hardened.

Primero que nada, para los mas nuevos, el kernel es el nucleo del sistema, que maneja el hardware, digamos, el que hace de cartero entre el firmware y los programas, gestiona memoria, etc.

¿Cuantas formas de compilar existen?


1.- La debian way, que consiste en usar el paquete make-kpkg creando asi un .deb redistribuible (no lo recomiendo, crea mil enlaces simbolicos y suele tener errores)
2.- La Fedora o RHEL way, creando un rpm redistribuible
3.- La vieja escuela, usando make a pelo

¿Que metodo aprenderé aquí? (La vieja escuela)

¿De donde saco el kernel?, y sus parches?


Primero que nada, vamos a establecer de donde, como y porque usar tal o cual kernel y cual usan las distro.
El kernel como se lo conoce, proviene de http://kernel.org , https://www.kernel.org/ luego cada distro, lo modifica a gusto en sus configuraciones (como Arch que lo hace real time, por eso dicen que es la distro mas rapida, pero el secreto es el kernel, NADA MAS), agrega parches para hacer funcional cosas propias, como AppArmor, SELinux, o simplemente bugfixes que consideran necesarios para no estar ofreciendo updates del mismo cada 2 meses, mas allá de eso, nada mas.
Cuando un kernel se compila, extrayendo sus fuentes de kernel.org, se le llama Vanilla, y cuando se le aplica parches o es de una distro, se le llama kernel de X distro. En Ubuntu, le agregan el sufijo -generic, dado que es un kernel de uso general, lo cual, es el mismo que en otras distro, solo que, ellos prefieren aclararlo.
OpenSUSE por ejemplo, posee kernel Xen, Desktop y Server, ya previamente modificada la configuracion del mismo.

¿Que necesito para compilarlo?

Depende la distro, al metapaquete le llamen build essentials, como es el caso de Debian y derivados, pero lo que realmente se necesita es:

make

gcc

ncurses-devel

ncurses

tar


Así que acorde a tu distro, instala esas cosas.
Además de ello, necesitas el codigo fuente, que no es mas ni menos que los .tar.xz (antes eran .tar.bz2) que puedes descargar de aqui

¿Cual elijo?

En kernel.org, verán una variedad de kernels, básicamente, se divide en algunas ramas. Los oldstable, que son los 2.6.32.68x, ( largo plazo ) usados en servidores o distros servidor, que son kernel casi sin fallas, pero, con ausencia de muchas características de kernel nuevos

La rama media, que son por ejemplo el 4.2.6x que es estables, de soporte extendido, pero algo mas nuevos que los 2.6.32.x, aunque, cada cambio que se aplica al kernel mas nuevo, se aplica a ellos tambien, siempre y cuando lo amerite, para eso, se recomienda, leer el changelog si están interesados en los cambios y asi compararlos con el mas nuevo.
Mas información sobre el tema: Kernel Releases

Desde *mi* punto de vista, nunca es lo mas aconsejable, compilar el ultimo, mas que nada porque se actualiza de forma muy constante, y esto conlleva a recompilar cada 2 meses o 3 (dado que siempre partimos de un .config anterior y de una rama a otra, este cambia en opciones), por lo tanto, recomiendo 4.2.6x que es muy nuevo pero no se actualizan tanto.
OJO, si necesitas algo que si o si está en el último kernel, bueno, no queda otra

.Empezando...


Primero que nada, luego de haber seleccionado uno de nuestro gusto, nos logueamos como root, y nos metemos en /usr/src/ (cd /usr/src), donde con wget, axel o aria2c, bajaremos el .tar.xz
Una vez finalizado esto, pasaremos a descomprimirlo, con este comando:

# tar Jxvf kernel-4.2.6.tar.xz
Noten la J mayuscula, eso es para .tar.xz, en los .tar.bz2 es: tar jxvf (J minuscula)


Luego de una extensa salida, se creará un directorio llamado linux-4.2.6 en este caso, asi que ingresamos en el, con el comando cd

.Una vez allí, necesitamos partir de una base, una configuracion que sabemos que funciona, asi que, copiamos la config de nuestro kernel de /boot (generalmente se ubica alli), a donde estamos parados con el nombre .config de esta manera:

# cp /boot/config-xx-xx-xx- . && mv config-xx-xx-xx .config (el punto no esta de más luego de xx-, un espacio y . al final de un cp es copiar donde estoy parado)

El archivo .config, es que el contiene todos los seteos del kernel, entonces, a partir de uno existente, vamos a modificar valores.

El paso siguiente, es:

# make menuconfig

Lo cual nos abrirá un bonito menu en ncurses, para poder ir configurando cosas, que se verá mas o menos asi:

No voy a adentrarme en cada configuracion, solo les diré, que, de por si, ese .config, va a funcionar.

La tarea ahora, es, setear el tipo de CPU, la marca del mismo, descartar cosas que no usen, tanto en hardware, devices, e incluir las que si usan, de preferencia como * y no como M (metidos y no como modulos, asi tendremos un initramfs mas chico).

Las cosas se marcan o desmarcan con el uso de la barra espaciadora, y hay que diferenciar algo, las cosas incluidas como *, son las que iran empotradas en el kernel, es decir, NO pueden sacarse y tampoco requieren estar en initramfs, y las que se colocan como M, serán colocadas como modulos, es decir, está la ruta creada, el modulo .ko bajo /lib/modules/versiondekernel/ pero se carga solo si el hardware esta presente, asi que, si tienen alguna duda sobre algo, lo dejan como M (modulo).

Ventajas?, bueno a ver, un kernel que solo funcionara en una PC, que no se le cambiara nada de hardware, cuanto mas cosas se le quiten que no se usen, mejor, y, las cosas de mayor uso, como ext4, los driver de sata, etc, si estan como *, el acceso sera mas rapido.

La frecuencia de Timer Frequency, siempre ponerla en 1000HZ, y el preemption model, dependiendo el uso, si es un server, como lo indica el menu... server, desktop o low-latency desktop, que es el usado por ArchLinux, lo que da un kernel que al hacer uname -a, devuelve esto: PREEMPT

Un valor interesante, es "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)", el cual, si leen el help (cada item tiene un help bien explicado), verán de que hablo.
Tambien recomiendo visitar la seccion Kernel Hacking del menú y leer los help, encontrarán cosas interesantes, asi como defininir su CPU, y la marca, es decir, exploren TODOS los item y sub-item, eso si, jamas quiten el soporte de archivos que usan, como ext2-3-4, o el que sea que usen.

Algunas opciones para recomendar, son la de "Optimize for size", o predefinir el modelo de cpufreq, para no tener que usar el demonio cpupower o similares, yo lo uso en ondemand por default, asi, el kernel eleva la frecuencia del CPU en base a lo que necesita, y no requiero del paquete cpufre-utils o cpupower.

Una vez que todo este a su gusto, salen, al salir les preguntará, si desean salvar la configuracion, le dicen que sí.

Ahora, sumando 1 al numero de cores reales que poseen, van a ejecutar make. Si poseen 2 cores, será 3 el valor total, asi:

# make -j3

Eso va a crear el bzImage y los modulos, una vez que termina el proceso, sin errores, el próximo paso es:

# make modules_install

Lo cual instalará los modulos con la version del kernel bajo /lib/modules/versiondekernel


Solo resta instalar le kernel. En el caso de Fedora y Red Hat o clones, por cumplir con la LSB (el formato RPM), solo deben hacer:

# make install

Lo cual, copiara en bzImage a /boot, y creará el initramfs usando dracut en el caso de Red Hat based.

Para Debian y derivados, el comando para crear el initramfs, es:

# mkinitramfs -k -o /boot/initramfs-4.2.6.img (en el caso de un 4.2.6)

En el caso de ArchLinux, el comando es mkinitcpio:

# mkinitcpio -g /boot/initramfs-4.26.img -k 4.26

(En ArchLinux, se crea el initrd a partir del kernel dado, mkinitcpio examina y encuentra el parametro que se le da)

Bueno, ahora ya tenemos todo, chequeamos con un ls -l /boot, debe estar, el kernel nuevo, su initramfs, su System.map y es todo.

En el caso de GRUB 0.97 o mejor conocido como GRUB 1, se edita el mismo, con nano o lo que elijan, en la ruta /boot/gru/menu.lst, donde el valor default, se cambia por 0, que es el primer kernel en la lista.

Siempre que compilemos, el kernel quedará como primero en la lista pero GRUB debe ser modificado, sino, iniciará con el kernel viejo.

En el caso de GRUB2, el procedimiento es:

Debian based:

# update-grub2

Red Hat based:

# grub2-mkconfig -o /boot/grub2/grub.cfg


Luego de todo esto, solo resta reiniciar, si todo salio bien, el sistema iniciará, debemos chequear que tome toda la RAM, luego mirar posibles errores en dmesg, asi:

# dmesg|more

Que, ahi esta la broma, cada error es informado, asi que podemos recompilar una y otra vez, hasta depurar y que queda, perfecto!, ese .config perfecto lo salvamos en /boot/config-4.26 con ese nombre por ejemplo, y cada vez que haya un update de kernel, en http://kernel.org, usamos ese config previo.

En el caso de Fedora y RHEL, existe un tip, en /etc/dracut.conf, en la linea donde dice: hostonly=, colocar hostonly="yes", y descomentar la linea si lo estaba, asi, el initramfs, sera mucho mas pequeño, pero, nuestro disco no será portable, es decir, si lo sacamos y colocamos en otra pc, quiza no inicie, pero, ganamos unos segundos en el booteo.

El tema de los parches, recomiendo si es que nunca han compilado un kernel, lo dejen para mas tarde, cuando esten "cancheros" en el tema, dado que a veces pueden romper algo. Para el que quiera experimentar, man patch

Espero que sea exitosa su compilación, y que aprecien el valor de poder hacer esto en un sistema libre, en OSX o Windows, esto, no es posible bajo ningún punto de vista.
0No hay comentarios