Linux From Scratch XXX: Compilando el kernel

Ha llegado el momento. En los anteriores artículos ya lo hemos compilado casi todo y ya está todo listo para el último paso: compilar el kernel e instalar todo lo necesario para arrancar con Linux From Scratch. En este artículo vamos a compilar el kernel.

Configurando el kernel

Vamos a compilar el kernel usando los scripts para crear el paquete correspondiente. Empezamos, como siempre, descomprimiendo el código fuente.

[~/lfs]$ sudo lfs linux-3.5.2
root:/# cd sources/
root:/sources# tar xvf linux-3.5.2.tar.xz
root:/sources# cd linux-3.5.2
root:/sources/linux-3.5.2# make mrproper

El último comando es para limpiar los restos que hayan podido quedar de una compilación anterior. Aunque acabemos de descomprimir el kernel ahora mismo, se recomienda usar este comando en vez de confiar en que el kernel venga limpio.

Ahora hay que configurar el código fuente para poder compilarlo. Configurar el kernel es muy distinto de configurar cualquier otro paquete que hayamos instalado anteriormente. Hay que navegar por un montón de opciones en las que tendremos que elegir el hardware que queremos soportar así como las características que queremos incluir en el kernel.

Este proceso genera un fichero .config que guarda toda la configuración. Es posible usar el .config del kernel que tenemos en nuestra máquina real o migrar una configuración de un kernel anterior, pero esto no se recomienda, así que vamos a hacerlo seleccionando todas las opciones.

root:/sources/linux-3.5.2# make LANG=en_GB.UTF-8 LC_ALL= menuconfig

Las variables que se ponen detras de make son para evitar problemas con la terminal al dibujar lineas. Tenéis que poner el locale que estéis usando. Si no ponéis esas variables no tendría por qué pasar nada. En el peor de los casos, los menús quedarán feos.

Al lanzar este comando nos aparecerá un menú de texto en el que podremos navegar por las opciones del kernel y configurarlo. La primera regla de oro que hay que seguir es: En caso de duda, usar el valor por defecto. Si no sabemos lo que hace una opción, mejor no tocarla. Es útil recordar que podemos pedir ayuda sobre cualquier opción pulsando ‘?‘.

Es importante saber qué hardware tenemos para configurar el kernel adecuadamente. Para ello, es bueno usar lspci -v en otra terminal para averiguar cuál es nuestro hardware y compilar sólo los módulos que sean necesarios. Se puede añadir más hardware del que tenemos, lo que puede ser útil si queremos instalar en un USB y arrancar en varias máquinas, como estoy haciendo yo. Lo malo es que el kernel será mayor de lo necesario, tardará más en compilar y no estará tan bien afinado.

En el menú que nos sale para configurar el kernel, algunas opciones aparecen con un tick entre corchetes delante de ellas mientras que en otras está entre ángulos. Cuando está entre ángulos significa que esa opción la podemos marcar como módulo usando la tecla “M“. Marcar una opción como módulo reduce el tamaño del kernel, aunque puede aumentar ligeramente el tiempo de carga. Generalmente está bien marcar las opciones como módulo, pero es importante no hacer esto con las que sean necesarias para arrancar. En caso de duda, con “Y” las marcamos de forma que queden integradas en el kernel.

A continuación os voy a comentar algunas opciones importantes que tenemos que tener en cuenta para que todo vaya bien. Esto puede cambiar de una versión a otra del kernel. Es normal que se añadan o quiten cosas o incluso que se cambie el nombre de algunos símbolos, pero para la versión que trae el libro, estas indicaciones servirán.

Una cosa importante que hay que tener en cuenta es que como LFS no usa initrd, hay que asegurarse de integrar en el kernel los drivers del disco y el sistema de ficheros de la partición root. Los del disco suelen ser “Serial ATA and Parallel ATA drivers” o “ATA/ATAPI/MFM/RLL support” que están en “Device Drivers“. Esto depende de que nuestro disco duro sea SATA o IDE. En caso de duda ponemos poner los dos, pero hoy en día lo normal es que sea el primero. Los de la partición root suele ser “Ext3 journalling file system support” dentro de “File systems“, al menos si hemos creado la partición con el sistema de ficheros ext3 según las instrucciones. Estas opciones no pueden estar marcadas como módulo.

General Setup

Si queremos usar lm_sensors, debemos asegurarnos de seleccionar “Prompt for development and/or incomplete code/drivers“. Esta opción ya está marcada por defecto y, de todos modos, no hace daño. Sólo sirve para que nos aparezcan más opciones. Lo mejor es dejarla marcada.

Enable loadable module support

Soporte para cargar módulos. Es imprescindible dejar esta opción habilitada a menos que queramos compilar un kernel sin modulos con todo integrado. La ventaja que tiene hacer esto es que aumenta la velocidad, pero no podremos cargar módulos de terceros, como drivers privativos en caso de que los necesitemos. Además, consume más memoria.

Enable the block layer

Si queremos poder montar discos, hay que dejar esta opción habilitada. Parece una idea muy sana a no ser que estemos compilando un kernel para un sistema embebido que no necesite usar discos.

Para poder usar discos con GPT, en “Partition Types” debemos asegurarnos de que estén seleccionadas las opciones “Advanced partition selection” y “EFI GUID Partition support“.

La opción “PC BIOS (MSDOS partition tables) support” también debería estar marcada ya que sirve para soportar discos que usan una tabla de particiones MBR. Aunque nuestro disco use GPT, esto es necesario en la mayoría de los casos. Por ejemplo, para montar pendrives USB.

Processor type and features

Aquí se puede seleccionar el tipo de procesador en “Processor family“. Esto hará que el kernel quede mejor optimizado para nuestro procesador. Es importante seleccionar uno que sea igual o inferior al procesador que tenemos en nuestra máquina. Si seleccionamos uno superior probablemente no sea capaz de arrancar. Podemos obtener información sobre nuestro procesador con el comando lscpu.

Si tenemos más de un core o hyperthreading deberíamos dejar seleccionada la opción “Symmetric multi-processing support“. Para un sólo core sin hyperthreading podemos quitarla.

Otra cosa que podemos hacer es seleccionar el número máximo de cores que va a soportar el kernel. De esa manera ocupará menos memoria. Hay que tener en cuenta que si tenemos hyperthreading cada core cuenta por dos. Para esto hay que poner el valor en “Maximum number of CPUs“.

Si estamos compilando un kernel para un Dell Inspiron 8000 deberíamos marcar la opción “Dell laptop support“. Esto es para poder acceder a los sensores de temperatura y velocidad de los ventiladores.

Power management and ACPI options

Aquí están las opciones para ACPI y APM. Son principalmente para portátiles, aunque siempre es bueno dejarlas activadas en cualquier equipo. Reducen el consumo de energía. Los valores por defecto tal cual vienen están bien.

Bus options (PCI etc)

Aquí también suelen estar bien las opciones por defecto. Sólo suele ser necesario soporte para PCI, pero si queremos dar soporte a portátiles tenemos que asegurarnos de dejar marcadas las opciones “PCCard (PCMCIA/CardBus) support” y, dentro de esta, “CardBus yenta-compatible bridge support“. Si queremos soporte para tarjetas PCMCIA antiguas tenemos que dejar marcada la opción “16-bit PCMCIA support“.

Executable file formats / Emulations

Es imprescindible dejar activado el soporte para ELF. Las demás opciones también es recomendable dejarlas como están. Es importante marcar “Kernel support for MISC binaries” si queremos que nos funcionen los programas en Java, .NET, Python o para DOSEMU.

Networking support

Aquí se configura todo lo relaccionado con la red incluyendo wireless y Netfilter. Suelen estar bien las opciones por defecto, pero hay alguna cosa que merece la pena comentar.

Para que funcione Iptables debemos asegurarnos de dejar marcada la opción “Network Packet Filtering Framework” que está dentro de “Networking Options“. También dentro de esta opción hay una llamada “Packet socket” que tenemos que dejar marcada si queremos poder capturar paquetes de red, por ejemplo con un sniffer como tcpdump o si vamos a usar DHCP.

Otra opción importante que hay dentro de “Networking Options” es “802.1d Ethernet Bridging“. Tenemos que marcar esta opción si vamos a usar máquinas virtuales dentro de nuestro sistema y queremos poder comunicarlas por red.

Para bluetooth debemos marcar “Bluetooth subsystem support” y todas las opciones que hay dentro de esta.

Para poder conectarnos a una red wireless con WPA, debemos entrar en “Wireless” y alli asegurarnos de que estén marcadas las opciones “cfg80211 – wireless configuration API“, “cfg80211 wireless extensions compatibility” y “Generic IEEE 802.11 Networking Stack“.

Device Drivers

Este es el apartado más importante y más conflictivo. Aquí hay que seleccionar los drivers para todo el hardware que queramos usar. Si nos equivocamos habrá componentes que no nos funcionen… y si nos equivocamos mucho es posible que ni siquiera arranque, así que es importante apoyarse en el resultado del comando lspci -v. Hay que lanzar este comando fuera del chroot para que el resultado sea fiable.

En el caso de Linux From Scratch, debemos asegurarnos de seleccionar dentro de “Generic Driver Options” la opción “Maintain a devtmpfs filesystem to mount at /dev“.

Si nuestro disco duro es SATA, que hoy en día es lo normal, tenemos que marcar la opción “Serial ATA and Parallel ATA drivers“. Es muy importante seleccionar esta opción integrada en el kernel en vez de marcarla como módulo. De lo contrario no será capaz de arrancar. Para un disco duro IDE, la opción es “ATA/ATAPI/MFM/RLL support“, que también debería estar integrada en el kernel, si este es nuestro tipo de disco duro.

Para el sonido, debemos ir a “Sound card support” y asegurarnos de que esté selecionada la opción “Advanced Linux Sound Architecture“. Dentro de esta opción, debe estar marcada también “OSS Mixer API“. También debemos asegurarnos de que no esté seleccionada la opción “Open Sound System“. Se trata del sistema antiguo que ya no necesitamos para nada.

En el caso del soporte USB 1.1, si tenemos Intel o VIA deberíamos seleccionar “UHCI HCD” en “USB support“. En otros casos, la opción correcta es “OHCI HCD support“. Por defecto están marcadas las dos opciones. Tengo entendido que son incompatibles, así que no sé lo que pasa si se dejan puestas las dos. Mejor marcar la correspondiente a nuestro sistema. Para saber cuales necesitamos se puede usar el comando “lspci -v | grep HCI“. Esto es para USB 1.1. En el caso de 2.0 o 3.0 las opciones son “EHCI HCD” y “xHCI HCD“. Estas sí que se pueden marcar las dos. En mi caso, como estoy instalando LFS en un USB, es mejor no ponerlas como módulo, sino integradas en el kernel.

Para dispositivos USB que no sean discos, como impresoras, scanners, etc, tenemos que marcar “Support for Host-side USB” también en “USB support“.

Para impresoras paralelo, en “Parallel port support“, debemos seleccionar “PC-style hardware” y en “Character devices“, debe estar marcada la opción “Parallel printer support“.

Si queremos soportar lm_sensors, hay que dejar activada la opción “I2C support” y, dentro de ella, seleccionar “I2C device interface” y marcar como módulos todo lo que hay dentro de “I2C Hardware Bus support“. También hay que seleccionar “Hardware Monitoring support” y marcar como módulos todo lo de dentro.

Para dar soporte a LVM, la opción necesaria es “Multiple devices driver support (RAID and LVM)“. Dentro de esta opción debe estar seleccionado “Device mapper support“. Si vamos a encriptar la partición, debemos seleccionar también “Crypt target support“. Para poder hacer migraciones en vivo de volumenes LVM, hay que seleccionar “Mirror target“. Para poder hacer backups basados en snapshots, “Snapshot target“.

Para poder usar RAID, las opciones necesarias también están en “Multiple devices driver support (RAID and LVM)“. Habría que dejar marcado “RAID support” y seleccionar “Autodetect RAID arrays during kernel boot“, “Linear (append) mode“, “RAID-0 (striping) mode“, “RAID-1 (mirroring) mode“, “RAID-10 (mirrored striping) mode” y “RAID-4/RAID-5/RAID-6 mode“.

Para teclado y/o ratón USB tiene que estar seleccionado “HID bus support” que está dentro de “HID support” y, dentro de esta, “USB HID transport layer” que, a su vez, está dentro de “USB HID support“.

Para que funcione Xorg es importante que, dentro de “Input Device Support” esté seleccionado “Event interface“.

Los drivers gráficos están en  “Graphics support“. Dentro de esta opción debemos activar “Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)“. Si la opción correspondiente a nuestra gráfica tiene dentro otra opción que pone “Enable modesetting” deberíamos activarla también. Si el kernel que estamos compilando va a ser usado dentro de una máquina virtual VMware, tendríamos que marcar la opción “DRM driver for VMware Virtual GPU“. Si lo vamos a usar en QEMU la opción es “Cirrus driver for QEMU emulated device“.

Dentro de “Graphics support” es bueno dejar marcada la opción “Support for frame buffer devices” y, dentro de ella “VESA VGA graphics support“. Esto es algo así como un modo de emergencia que nos permite usar la gráfica si los drivers especificos para ella fallan. Eso sí: no tendremos ningún tipo de aceleración. Si estamos compilando para un portatil, también deberíamos tener marcada la opción “Backlight & LCD device support“.

Para modem, debe estar marcada “Network device support” y, dentro de ella, “PPP (point-to-point protocol) support“, “PPP support for async serial ports” y “PPP support for sync tty ports“.

En cuanto al resto de las opciones, tenéis que apoyaros en la salida del comando lspci -v e ir seleccionando las que correspondan al hardware que tengáis. Es complicado y si no seleccionáis los drivers correctos es probable que haya cosas que no os funcionen, pero aquí no puedo ayudaros porque depende totalmente del hardware que tenéis.

Un truco que me ha resultado útil a mí es usar el comando “lspci -v | grep driver | sort -u” para saber qué drivers están en uso y buscarlos en la configuración con la opción de búsqueda que sale al pulsar la tecla “/“. Recordad que este comando hay que lanzarlo desde fuera del chroot. Recomiendo hacerlo en otra terminal.

File systems

Aquí se selecciona el soporte para varios sistemas de ficheros. Es muy importante, en el caso de Linux From Scratch, que esté marcado el soporte para ext3. En otro caso, el equipo no arrancará. La opción es “Ext3 journalling file system support“. Esta opción debe estar integrada en el kernel. No vale con marcarla como módulo.

Si queremos usar FUSE o montar particiones NTFS hay que seleccionar “FUSE (Filesystem in Userspace) support“.

Para usar el automounter, debe estar seleccionada la opción “Kernel automounter version 4 support“. También es buena idea marcar, dentro de “Network File Systems” las opciones “NFS client support” y “CIFS support“. Sobre todo si queremos poder montar sistemas de ficheros de red, como carpetas compartidas. En el caso de NFS, si vamos a usar el sistema como servidor NFS, deberíamos marcar también la opción “NFS server support“.

Dnotify está obsoleto, pero algunos programas como rox-filer todavía lo usan. Si no vamos a usar rox-filer no es necesario marcar la opción “Dnotify support“, aunque en caso de duda siempre podemos dejarla.

Es importante entrar en “Pseudo filesystems” y asegurarse de que estén seleccionadas las opciones “/proc file system support” y “Tmpfs virtual memory file system support“. Casi todos los programas necesitan esto. Sobre todo el directorio /proc.

Virtualization

Aquí se activa el soporte para ejecutar máquinas virtuales a nivel del kernel (KVM + QEMU). Para ello, hay que marcar la opción “Kernel-based Virtual Machine (KVM) support“.

Kernel hacking

Estas opciones son más bien para programadores del kernel. Si no hay una buena razón, es mejor no tocar nada. Los valores por defecto están bien.

Otras secciones

Las demás secciones de configuración del código fuente son “Firmware Drivers“, “Security options“, “Cryptographic API” y “Library routines“. En estas secciones no es necesario tocar nada ya que los valores por defecto que tienen son suficientes.

Compilando

Una vez configurado el kernel podemos pasar a compilarlo e instalarlo. El proceso ya es más parecido al de otros paquetes, aunque tiene sus peculiaridades.

root:/sources/linux-3.5.2# make
root:/sources/linux-3.5.2# make modules_install
root:/sources/linux-3.5.2# cp -v arch/x86/boot/bzImage /boot/vmlinuz-3.5.2-lfs-7.2
root:/sources/linux-3.5.2# cp -v .config /boot/config-3.5.2
root:/sources/linux-3.5.2# install -d /usr/share/doc/linux-3.5.2
root:/sources/linux-3.5.2# cp -r Documentation/* /usr/share/doc/linux-3.5.2

La linea make modules_install no es necesaria si hemos compilado un kernel sin módulos. El segundo cp es para guardar la configuración que hemos usado para compilar el kernel. Esto no es imprescindible, pero es útil para poder partir de esa configuración si necesitamos compilar otro kernel o hacer algún ajuste. Para ello, sólo tendríamos que copiar el fichero /boot/config-3.5.2 encima del .config de nuestro kernel después de hacer make mrproper.

Las dos últimas lineas sirven para copiar la documentación. Esto no es estrictamente necesario y podríamos omitirlo, pero siempre está bien tener la documentación a mano.

Una vez hecho todo esto, salimos del chroot para generar el paquete y lo instalamos como siempre.

root:/sources/linux-3.5.2# exit
[~/lfs]$ sudo lfsinst linux-3.5.2.txz

Nuestro Linux From Scratch ya tiene kernel. Sólo falta el último paso para arrancar con él. Eso lo haremos en el próximo post.

EOF

Anuncios

Un pensamiento en “Linux From Scratch XXX: Compilando el kernel

  1. Raul

    Perfecto, salio todo de maravilla en mi caso, solo que tuve que compilar de nuevo el kernel porque no me reconocía la tarjeta de red. Lo deje por defecto y tuve que explícitamente marca todo lo relacionado con los drivers Intel. Gracias por los aportes.

Los comentarios están cerrados.