Compila y configura tu kernel en Archlinux

Bienbenido a este post.

"ADVERTENCIA: ESTO PODRIA DANAR TU SISTEMA SI ALGO SALE MAL PODRIA NO SUBIR JAMAS" [mad] [mad] [mad]

Na, solo podria no subir el entorno grafico, pero para que eso suceda, es si usan drivers privativos. Al final del post, recomiendo que hacer en ese caso. :cool: :cool:


Aqui, aprenderás como parchear el kernel vanilla o kernel salido del horno, "el oficial" para aprovechar las bondades del parches que elijas utilizar.

Este tutorial, va dirigido principalmente para la gente que usa Archlinux, aunque en teoría debería funcionar en cualquier distro, ya que el método de compilación, será el tradicional, el que funciona en todos lados, solo que dependiendo de la distro, el metodo para configurar el grub2 podria cambiar un poco.

En este post voy hacer uso del parche de Con Kolivas "-ck", porque sencillamente aporta algo que me gusta mucho y es el BFS "Brain Fuck Scheduler" que en español vendría siendo como (el mas duro xD), un chiste, jajajaj, pero hace bien su trabajo.

Nota: por cierto, voy a trabajar todo por la consola, así que no voy a usar para nada el mouse. Esto no es motivo de asustarse, ya que el proceso es bastante sencillo y te aportara grandes dotes de satisfacion el haber aprendido algo nuevo.


Iniciamos con ubicarnos en tu directorio personal cd ~ . Ese comando, nos lleva directamente al directorio personal o bien, donde tengas suficiente espacio para descargar y descomprimir el kernel.

Creamos una nueva carpeta, preferiblemente con el nombre de kernelbuild.

mkdir kernelbuild

Entramos en esa carpeta con "cd kernelbuild", en nuestro caso.

Ahora digiten esto en su terminal, o bien, usen el mouse para copiar y luego pegar en la terminal, ya que asi se ahorran algunos segundos digitando todo eso a mano xD. Al momento de realizar este tutorial la versión del kernel es la 4.8.0.

curl -O https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.8.tar.xz

Empezara a descargar el kernel

Imagen


Una vez finalizada la descarga, descomprimimos el kernel con el siguiente comando:
tar -xvJf linux-4.8.tar.xz


Iniciara el proceso de descomprensión del kernel.
Imagen

Nuestro kernel descomprimiendo los archivos de la fuentes.

Ahora descargamos el parche de Con Kolivas, para luego aplicarlo al kernel.

curl -O http://ck.kolivas.org/patches/4.0/4.8/4.8-ck1/patch-4.8-ck1.xz

Terminado la descarga, descomprimimos el archivo con:
xz -d patch-4.8-ck1.xz

Crearemos un directorio con el mismo nombre que tenga el parche y movemos el parche dentro de ese directorio, seria de la siguiente manera:

Pero antes, cambiamos el nombre del archivo, para poder copiar el parche al directorio:
mv -v patch-4.8-ck1 patch-4.8-ck1a

mkdir patch-4.8-ck1 --> mv -v patch-4.8-ck1/patch-4.8-ck1

Comprobamos que todo quedo bien con:
ls -l patch-4.8-ck1/


Debería mostrarnos el nombre del parche igual que el directorio.

Imagen


Nota: el nombre del parche, debería ser igual al nombre del directorio que contiene el parche, en esta ocasión se me paso no agregar "-" al nombre del parche antes del numero de versión.

Ahora nos situamos en el directorio de las fuentes del kernel, o sea, donde estan todas las carpetas y archivos del mismo y desde aquí aplicaremos el parche con el siguiente comando:
patch -p1 <../patch-4.8-ck1/patch-4.8-ck1

Luego de aplicar el parche, ha de quedar mas o menos como se ve en la imagen:

Imagen

Ahora para comprobar que es cierto, miramos el archivo Makefile, que esta en la raíz del kernel. Con nano, vi o vim pueden visualizarlo. Tal como se ve en el sombreado, eso indica que el parche fue aplicado con éxito.

Imagen

Bien haremos algunos cambios, antes de iniciar la compilación. Primero, en el directorio de las fuentes del kernel, nos vamos al directorio "arch/x86" y aquí editaremos el archivo Makefile.

En mi caso tengo un procesador Intel buscamos la flags que tiene por nombre march=core2 -mtune=generic.
Imagen

Esta dos variables la cambiaremos por native, o sea, debe quedar de la siguiente manera:

Imagen

Comprueben que todo quedo bien, y luego guarden los cambios hechos.
Con esto ganaremos una mejor optimización del kernel para nuestro sistema o mas bien, es donde le decimos, que use las capacidades de nuestro sistema y sera automaticamente elegido y que luego se vera en el menú del kernel seleccionado, de acuerdo a lo que la variable native le diga.

Ahora, entra en juego un programa que nos quitara muchos dolores de cabeza a la hora de estar manejando los módulos que tiene el sistema cargado, ganaremos tiempo y dinero xD, pues solo compilando los modulos para tu sistema, la compilación del kernel, se acelera mucho, ya que no tiene que compilar, los 3000 y tantos modulos que tiene.

Modprobed-db, este es el programa del que les hablo.

Descárguenlo de esta pagina:
https://github.com/graysky2/modprobed-db
Luego lo instalan en su sistema.

Si tienen Archlinux, con
yaourt -S modprobed-db
será mas que suficiente para que se instale.

Lo siento por la gente de Ubuntu y derivados, pero no puedo confirmar que funcione el programa, ya que ahora mismo no tengo medios para probar ese programa.

Aunque, afortunadamente hay una forma manual de hacer esto, y es haciendo uso de un programa que trae el mismo kernel.

Lo malo de esto, es que no se guarda una base de datos, tal como lo hace modprobed-db. Lo importante es que funciona, pero necesitaras tener todos tus dispositivos conectados y funcionando, o sea, que el modulo este cargado, para que el script lo detecte y no haya problemas con estar adivinando.

Haciendo uso de modprobed-db, en mi sistema tengo actualmente 113 módulos cargados, de 155 guardados en su base de datos.

En la siguiente imagen, hago una llamada con el programa para que cargues los módulos que tiene guardados en su base de datos, si antes tenia 113 cargados, ahora el sistema, ve 152, porque uno de una tarjeta de red usb, que tengo que instalar manualmente y el otro probablemente sea de los módulos de nvidia, que serán instalados, una vez el kernel este compilado eh instalado.

Imagen

Ahora tipeamos
make localmodconfig
Esto nos va generar el archivo .config necesario para compilar el kernel con los módulos de tu sistema. A todo lo que aparezcan luego de hacer el comando anterior, simplemente aprieten la tecla Enter, sin cambiar nada, a menos que sepas lo que vas a cambiar.

Después que termine todo eso, pueden comprobar que todo esta correcto con este comando.
cat .config | grep =m | wc -l

En mi caso, salieron 190 módulos.

Ahora, para saber los módulos que tienes el sistema actualmente sin hacer uso de modprobed-db, tipiamos en la consola:
scripts/kconfig/streamline_config.pl > nombre-cualquiera


Esto generara el archivo config con los módulos de tu sistema. En mi caso, como ya comente, algunos módulos no fueron posibles obtenerlos, por lo que tendré que instalar manualmente mas tarde y es de una wifi-usb-card.

Imagen

Para comprobar que los módulos están ahí, recontamos otra vez con
cat el nombre que le pusieron al archivo | grep =m | wc -l

En mi caso, aparecieron 148 módulos.

Nota: la diferencia de modulos, se debe a que con uno hace uso de una base de datos con modulos guardados y en el otro, solo aparecen los modulos reales que el sistema detecta que estan siendo usandos por el kernel. No es para alarmarse tanto.

Ahora si, ya estamos listo para iniciar a configurar algunas cosas dentro del menú de configuración del kernel.

Tipiamos en la consola
make nconfig
Es el configuador del kernel mas moderno para la consola.

Debería salir el menú, tal como se muestra en la imagen:

Imagen

Lo primero, es movernos a General Setup y comprobar que "BFS cpu sheduler", este presente y marcado.

Imagen

Presionamos la tecla del teclado atrás o izquierda y seleccionamos la opción Processor type and features --> y comprobamos que el de tu sistema este presente ahí. En mi caso, como tengo un procesador Intel de la gama core2duo, la opción seria así
Processor family (Core 2/newer Xeon)

Imagen

Si tu equipo no es un servidor dedicado, en esas mismas opciones, baja mas abajo para encontrarte con la opción Timer frequency (1000 Hz)

Comprobamos que este en
1000 Hz
, aunque el parche automáticamente lo configura a esa velocidad. Con esto obtendremos mejor respuestas de dispositivos de entrada, tal como un joystick o un teclado midi, si te dedicas a la música.

Imagen

Es tiempo de iniciar, hagan un
make -j`nproc`
y empezara el proceso.
Nota: Fijarse bien, en el comando de arriba make -j`nproc`, las comillas van pegadas de -j.
Nota2: Si quieren saber el tiempo que tomara compilando el kernel, agreguen al inicio del comando anterior, time.

Ahora que esta compilando, pueden hacer otra cosa en lo que termina o para los mas curiosos, quedarse mirando ahí todo el proceso de compilación.

Imagen

Y aquí termina el proceso de compilación

Imagen

Como usuario con privilegios o root, hacemos un
make modules_install


Imagen

Luego de instalado los módulos

Como usuario con privilegios o root, copiamos el archvo del kernel, que esta ubicado en el directorio de
arch/x86_64/boot/bzImage
/boot/vmlinuz-linux-cualquier-nombre, por ejemplo "vmlinuz-linux-speed31"

En mi caso quedo como, vmlinuz-linux-speed31

Imagen

Nota: en mi caso, el kernel es 64 bits, para los usuarios de 32bits, el archivo deberia de estar en /arch/x86/boot/bzImage

Ahora, nos movemos al directorio "/etc/mkinitcpio.d/"

Como siempre, ejecutamos estas acciones como usuario con privilegios o root.
Aquí, copiamos el archivo
linux.preset
y le ponemos de nombre como
linux-speed31.preset

cp -v linux.preset linux-speed31.preset


Ahora con vi, nano o vim, editamos el archivo creado como root o usuario con privilegios y cambiaremos algunas variables.

Las variables serán:
All_kver="/boot/vmlinuz-linux" la cambiamos por "/boot/vmlinuz-linux-speed31"

default_image="/boot/initramfs-linux.img" la cambiamos por "/boot/initramfs-linux-speed31.img"

fallback_image="/boot/initramfs-linux-fallback.img" la cambiamos por "/boot/initramfs-linux-speed31-fallback.img"


Nota: Las comillas dobles "" no van en las variables de arriba.

Todo, debería quedar mas o menos como la imagen:

Imagen

Guardamos los cambios y salimos del programa.

A continuación, construiremos la imágenes del kernel nuevo y de paso, será instalado en el sistema.

Otra vez, como usuario con privilegios o root, tipiar este comando:

mkinitcpio -p linux-spee31
presionamos enter y empezara el proceso.

"linux-speed31" es el nombre que le pusimos al archivo del kernel "vmlinuz-linux-speed31" y que será instalado en el sistema, por el esquema del archivo linux-speed31.preset que acabamos de editar.

Imagen del proceso de reconstrucción:

Imagen

Ahora, paso final, hacer que grub reconozca nuestro nuevo kernel.

Nota: antes de este proceso, recomiendo hacer un copia del archivo grub.cfg

Nuevamente como root, tipear
grub-mkconfig -o /boot/grub/grub.cfg
y el programa iniciara el reconocimiento de los kernels que tengas instalado en tu sistema y serán agregados a la línea del cargador.

Imagen del proceso

Imagen

Comprobamos que el kernel efectivamente se ha instalado y que grub lo ha agregado a su menú.

Imagen

Efectivamente ya esta agregado.

Como agregado, aqui una imagen de presentacion final de la entrada de nuestro nuevo kernel en los menu del grub2.

Imagen

Y aqui, nuestro kernel trabajando en el sistema.

Imagen

Nota final:
Como paso final, para los usuarios que tienen alguna grafica nVidia y hacen uso de los drivers privativos, tienen que instalar el programa dkms y a través de yaourt, instalar el programa nvidia-dkms que le reconstruirá el modulo necesario para que la tarjeta de video funcione con su custom kernel.
Muchas gracias por el tuto!
Muchísimas gracias amigo [oki]
Compilar el kernel manualmente proporciona alguna ventaja hoy en día? Lo digo porque las veces que lo hice no noté mejoras significativas.

Yo creo que hacer este tipo de cosas introduce una complicación innecesaria en el sistema (por ejemplo: te descoloca el gestor de paquetes) y te expones a agujeros de seguridad más fácilmente.

Y por lo que he visto, la ganancia de rendimiento usando el BFS no creo que justifique todo esto.
Moki_X escribió:Compilar el kernel manualmente proporciona alguna ventaja hoy en día? Lo digo porque las veces que lo hice no noté mejoras significativas.

Yo creo que hacer este tipo de cosas introduce una complicación innecesaria en el sistema (por ejemplo: te descoloca el gestor de paquetes) y te expones a agujeros de seguridad más fácilmente.

Y por lo que he visto, la ganancia de rendimiento usando el BFS no creo que justifique todo esto.


Ventajas, tu laptop estara con mejor funcionamiento, ya que el procesador se fuerza menos al procesar la informacion, ya que hara un mejor uso de sus registros internos.

El gestor de paquete no se descoloca, pues estara igualmente instalando el kernel del sistema por defecto, a menos que lo frizes y nunca mas volvera actualizarse, hasta que lo saques de ese estado.

Aguero, bien que lo dices, se disminuye casi a un 99%, ya que solo tendras los modulos de tu sistema y nada mas, al ser un kernel pequeño, hay menos modulos que piyar para los hackers [poraki]

Y en cuanto a compilar tu kernel manualmente, pues te ayuda aprender mas sobre linux y como funcionan algunas cosas. Aparte, aumentas la respuesta del kernel a eventos externos, tales como joysticks "en mi caso", lo cual es una mejora mas que aceptable a lo que viene por defecto.

El BFS, es un gestor mas como cualquier otro. Elegi este, porque esta mas asociado al usuario desktop, pero tambien hay otros que son para servidores u otro ambientes de trabajo.

Este tutorial, fue hecho, para personas que quieran y tengan curiosidad de compilar su kernel en Archlinux, si a ti no te agrada la idea, no te molestes XD
que clase de herejia es esa de compilar el kernel fuera de /usr/src/linux ?
Zokormazo escribió:que clase de herejia es esa de compilar el kernel fuera de /usr/src/linux ?


Cuando hay problemas de espacio en la particion del root, hay que improvisar [carcajad]
Buen trabajo compañero [beer]
Zokormazo escribió:que clase de herejia es esa de compilar el kernel fuera de /usr/src/linux ?

Si googleas verás que nadie (o no lo he visto) compila en /usr/src/linux, la verdad que son todos unos herejes o desconocen esto que comentas.

pd: gracias por el tuto al autor del hilo.
rafaelkiz escribió:
Zokormazo escribió:que clase de herejia es esa de compilar el kernel fuera de /usr/src/linux ?

Si googleas verás que nadie (o no lo he visto) compila en /usr/src/linux, la verdad que son todos unos herejes o desconocen esto que comentas.

pd: gracias por el tuto al autor del hilo.


Pues toda la puta vida, desde 2.0 al menos se ha compilado el kernel y sus moduloa dentro de /usr/src
Gracias al autor del hilo por el tuto. En algún momento supongo que me atreveré a hacerlo. Un par de preguntas:
- Cuanto tiempo se tarda en compilar el kernel completo aproximadamente? Aunque supongo que esto dependerá del procesador que cada uno tenga, obviamente.
- Cada vez que salga un kernel nuevo y se quiera actualizar, hay que volver a repetir el proceso completo o existe algo que lo haga automáticamente por ti una vez que ya tienes tu kernel compilado?
Zokormazo escribió:
rafaelkiz escribió:
Zokormazo escribió:que clase de herejia es esa de compilar el kernel fuera de /usr/src/linux ?

Si googleas verás que nadie (o no lo he visto) compila en /usr/src/linux, la verdad que son todos unos herejes o desconocen esto que comentas.

pd: gracias por el tuto al autor del hilo.


Pues toda la puta vida, desde 2.0 al menos se ha compilado el kernel y sus moduloa dentro de /usr/src

Si no te digo que no, solo que muchas veces hay tutoriales por google traducidos del Inglés y lo mismo el que lo creó, no usaba la carpeta /usr/src/.

Alguno que otro si que lo comenta.

@doblerone unos 40-45 minutos me tarda a mí con un i3-6100 3.7GHz.
Zokormazo escribió:
rafaelkiz escribió:
Zokormazo escribió:que clase de herejia es esa de compilar el kernel fuera de /usr/src/linux ?

Si googleas verás que nadie (o no lo he visto) compila en /usr/src/linux, la verdad que son todos unos herejes o desconocen esto que comentas.

pd: gracias por el tuto al autor del hilo.


Pues toda la puta vida, desde 2.0 al menos se ha compilado el kernel y sus moduloa dentro de /usr/src


Yo siempre compilo ahí nunca lo he visto afuera.

Una pregunta el parche que mejoras aporta?
@rafaelkiz @Zokormazo
Cuando empeze por primera vez a compilar kernel, solia usar ese metodo. Llego un momento que me canse de eso y dije, a la mierda, voy hacerlo a mi manera XD

@doblerone
Gracias al autor del hilo por el tuto. En algún momento supongo que me atreveré a hacerlo. Un par de preguntas:
- Cuanto tiempo se tarda en compilar el kernel completo aproximadamente? Aunque supongo que esto dependerá del procesador que cada uno tenga, obviamente.
- Cada vez que salga un kernel nuevo y se quiera actualizar, hay que volver a repetir el proceso completo o existe algo que lo haga automáticamente por ti una vez que ya tienes tu kernel compilado?


Para compilar por completo el kernel, no te puedo decir ahora mismo cuanto tiempo tomaria, pues eso depende de cada sistema y su configuracion. Pero la ultima vez, que yo recuerde compilar el kernel asi, fue con un viejo P4 y me duro mas de 3 horas compilando.

A nivel de software, hay programas que reducen el tiempo de compilacion, como el hacer uso de zram, y de un programa que cachea ese proceso para acelerarlo lo mas posible ccache. Esto ultimo, responderia una parte a tu segunda pregunta y agregando, no es necesario estar compilando a cada rato, salvo que salga alguna vulnerabilidad muy critica, entonces te bajas un parche del kernel y vuelves y compila. Pero si, cada vez que quieras disponer de una nueva version del kernel, tienes que volver a repetir estos procesos.

Compilando con el sistema ABS, el proceso de instalacion del kernel, seria automatico, pero hay que adaptar las sumas de verificacion.
Pues el objetivo de este tuto es mas enfocado, al aprendizaje que otra cosa.

@Brutico
El parche agrega mejoras desde el punto de vista de como el sistema administra las peticiones de entrada y salida, el cual es conocido como scheduler BFS, que luego el parche incorpora al kernel. El kernel trae por defecto CQF, que esta mas orientado a discos mecanicos. Luego trae otro que es el BFQ. Este, trabaja mucho mejor con discos SSD. Entonces, BFS, trabaja con ambos tipos de almacenamientos, ya sea mecanico o de memoria volatil, SSD para los amigos. En otra palabras, manejas todas las tareas de entradas y salida de tu sistema, dando asi un mejor desempeño en distintas areas de trabajo, ya sea ofirmatica, compilacion de videos y temas de esas categorias.

Seria algo parecido a como cuando salio cgroups, que apilaba tareas comunes y aceleraba el proceso drasticamente, dependiendo de las demandas que se necesitara para un proceso correspondiente.
13 respuestas