Bienvenido(a) a Alcance Libre 20/03/2023, 09:43
Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1
© 1999-2008 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.
Una de las grandes ventajas de que el núcleo (kernel) GNU/Linux sea equipamiento lógico libre (Software Libre) es el poder descargar el código fuente del núcleo, configurar éste para compilar específicamente con opciones adecuadas a necesidades particulares o con controladores específicos para un sustento físico (hardware) en particular, compilarlo y obtener como resultado mejoras en el desempeño.
La gran variedad de distribuciones de GNU/Linux instalan un núcleo (kernel) que fue configurado y compilado con opciones genéricas y que permiten utilizar éste en una gran variedad de dispositivos y computadoras. Esto facilita la vida a los desarrolladores y empaquetadores que trabajan para cada distribución pues de esta forma con cuatro o cinco versiones del paquete de núcleo abarcan la mayoría de los sustentos físicos en el mercado. Ésto elimina la necesidad de los usuarios por compilar el núcleo.
Por mencionar un ejemplo, el paquete del núcleo de CentOS 5 y Red Hat Enteprise Linux 5 que se distribuye para arquitecturas i686 incluye opciones y optimizaciones genéricas que permiten utilizar un mismo paquete RPM del núcleo para una amplia variedad de sistemas. Éste incluye el soporte para ser utilizado con microprocesadores como Pentium Pro, Pentium II, Pentium III, Pentium 4, Pentium M, Celeron, Athlon, Duron, Cyrix i686, etc. Evidentemente este soporte genérico impide poder explotar todo el potencial e instrucciones de un modelo de microprocesador en particular.
Si, por ejemplo, se dispone una computadora portátil (Laptop) Compaq Armada M300 con microprocesador Pentium III (Coppermine) de 500 MHz, con 320 MB RAM, circuitos integrados Intel PIIX4, tarjeta de audio ESS Technology ES1978, tarjeta de red Ethernet Pro 100 y otros ciertos dispositivos en particular, el núcleo genérico incluido en la instalación funcionará bien, pero se tendrá un desempeño inferior. Configurar y compilar el núcleo específicamente para las características de este modelo de computadora portátil, excluyendo de la configuración funciones que jamás se utilizarán en este sistema, mejorará su desempeño significativamente.
En sistemas caseros y computadoras portátiles con cierta antigüedad, pueden excluirse funciones como el soporte para más de 4 GB de RAM, soporte genérico para arquitectura ix86, soporte para otros modelos de computadoras portátiles, soporte para más de un microprocesador, soporte para IPv6 y otras opciones que solo serían útiles en otro tipo de sistemas como servidores.
Puede agregarse soporte para más periféricos, como por ejemplo más dispositivos USB y compilar algunos controladores (cómo el soporte para LVM) dentro del núcleo en lugar de hacerlo como módulos a fin de mejorar el desempeño durante el arranque del sistema.
En un servidor se puede mejorar mucho el desempeño configurando y compilando exclusivamente las opciones y módulos específicos para la configuración de sustento físico (hardware) y funciones requeridas para los servicios a brindar.
Este procedimiento es complicado e implica contar con un cierta experiencia y conocimientos generales acerca del sustento físico (hardware).
Utilizando el mandato lsmod es posible determinar que controladores se están utilizando en el sistema. Esta lista de controladores debe tomarse muy en cuenta a fin de evitar excluir alguno de éstos. Utilice el mandato de la siguiente forma:
/sbin/lsmod |
Lo anterior puede devolver una salida similar a la siguiente, que dependerá del sustento físico del sistema:
Module Size Used by nls_utf8 1888 1 vfat 12768 1 fat 50268 1 vfat sg 35536 0 sd_mod 28112 2 usb_storage 46848 1 scsi_mod 148044 3 sg,sd_mod,usb_storage i2c_dev 7492 0 dm_multipath 18856 0 backlight 5220 0 snd_es1968 28192 1 gameport 13608 1 snd_es1968 snd_ac97_codec 97760 1 snd_es1968 ac97_bus 1728 1 snd_ac97_codec snd_seq_dummy 3556 0 snd_seq_oss 30976 0 snd_seq_midi_event 7008 1 snd_seq_oss snd_seq 47856 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event snd_pcm_oss 41184 0 snd_mixer_oss 16192 1 snd_pcm_oss battery 12932 0 ac 5796 0 snd_pcm 72168 3 snd_es1968,snd_ac97_codec,snd_pcm_oss button 7984 0 parport_pc 27524 0 snd_timer 22148 2 snd_seq,snd_pcm snd_page_alloc 10216 2 snd_es1968,snd_pcm parport 35400 1 parport_pc snd_mpu401_uart 7872 1 snd_es1968 snd_rawmidi 23392 1 snd_mpu401_uart joydev 11232 0 snd_seq_device 8044 4 snd_seq_dummy,snd_seq_oss,snd_seq,snd_rawmidi snd 52068 13 snd_es1968,snd_ac97_codec,snd_seq_oss,snd_seq, snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer, snd_mpu401_uart,snd_rawmidi,snd_seq_device e100 34220 0 soundcore 7264 1 snd mii 5440 1 e100 i2c_piix4 8780 0 pcspkr 2624 0 i2c_core 24432 2 i2c_dev,i2c_piix4 serio_raw 6500 0 floppy 55652 0 dm_snapshot 17472 0 dm_zero 1920 0 dm_mirror 25568 0 ext3 132488 2 jbd 42100 1 ext3 uhci_hcd 23696 0 ohci_hcd 22916 0 ehci_hcd 33740 0 |
La información del microprocesador se puede consultar leyendo el contenido del archivo virtual /proc/cpuinfo utilizando el mandato less del siguiente modo:
less /proc/cpuinfo |
Lo anterior puede devolver una salida similar a la siguiente, que dependerá del tipo de microprocesador del que se disponga:
processor : 0 |
El mandato lspci permite determinar los dispositivos PCI (Peripheral Component Interconnect o Interconexión de Componentes Periféricos) presentes en el sistema.
/sbin/lspci |
Lo anterior puede devolver una salida similar a la siguiente, que dependerá de los dispositivos PCI de los que que se disponga:
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge |
De manera similar al mandato lspci, el mandato lsusb permite determinar los dispositivos USB (Universal Serial Bus o Transporte Universal en Serie) presentes en el sistema. Conecte a las ranuras USB del sistema los dispositivos USB más frecuentemente utilizados y utilice el mandato lsusb.
/sbin/lsusb |
Lo anterior puede devolver una salida similar a la siguiente, que dependerá del tipo de dispositivos USB de los que se disponga:
Bus 001 Device 005: ID 0457:0151 Silicon Integrated Systems Corp. Super Flash |
Para CentOS, a fin de disponer de los paquetes RPM de fuentes, se debe configurar primero los depósitos yum de los paquetes RPM fuentes (.src.rpm) como el nuevo archivo /etc/yum.repos.d/CentOS-Sources.repo, con el siguiente contenido:
#source packages |
Al terminar se continúa con la instalación de los paquetes RPM binarios de el compilador gcc, cabeceras de desarrollo para el lenguaje de programación C, paquete de desarrollo de ncurses, para construir la herramienta de configuración del núcleo y el paquete para creación de paquetería RPM:
yum -y install gcc glibc-devel ncurses-devel rpm-build |
Si se va a utilizar la herramienta de configuración gráficos, hay que instalar además los paquetes qt-devel y gcc-c++ del siguiente modo:
yum -y install qt-devel gcc-c++ |
Utilizar el paquete fuente de la distribución de GNU/Linux utilizada garantiza que se utilizará la misma versión oficial de núcleo para producción del distribuidor, la cual seguramente incluye parches específicos para funcionar con la instalación de esa distribución de GNU/Linux. Esto garantiza que se mantendrá la compatibilidad de los API (Application Programming Interface o Interfaz de Programación de Aplicaciones) requeridos por aplicaciones de terceros.
Primero se instala el paquete yum-utils de la siguiente forma:
yum -y install yum-utils |
El paquete yum-utils incluye la herramienta yumdownloader, misma que se utilizará para descargar el paquete fuente del paquete RPM del kernel, del siguiente modo:
yumdownloader --source kernel |
Suponiendo que se tiene instalado el paquete del núcleo denominado kernel-2.6.18-92.1.6.el5, lo anterior descargara desde los depósitos de equipamiento lógico en Internet el paquete kernel-2.6.18-92.1.6.el5.src.rpm dentro del directorio de trabajo actual.
Se procede a instalar el paquete fuente kernel-2.6.18-92.1.6.el5.src.rpm de la siguiente forma:
rpm -ivh kernel-*.src.rpm |
Esto instalará los fuentes y parches para el núcleo en el directorio /usr/src/redhat/SOURCES/ y el archivo de especificación para construir el paquete binario RPM como /usr/src/redhat/SPECS/kernel-2.6.spec.
Para poder utilizar el código fuente, hay que descomprimir y aplicar los parches incluidos por el distribuidor. Esto se consigue utilizando el mandato rpmbuild con las opciones -bp y --target=[arquitectura], donde [arquitectura]representa la arquitectura genérica del microprocesador. En el caso de CentOS 5, están disponibles las configuraciones genéricas para i586, i686, x86_64, ia64, ppc, ppc64, s390 y s390x y las variantes i686-PAE, para equipos , i686-xen, ia64-xen y x86_64-xen, para utilizar las funciones de Xen que permiten utilizar paravirtualización.
Las opciones -bp inician parcialmente el la construcción del paquete (build) pero solo hasta la sección %prep (preparativos) del archivo de especificación, lo que significa que se descomprimirá el fuente del núcleo y se aplicarán los parches.
Se debe acceder al directorio /usr/src/redhat/SPECS/.
cd /usr/src/redhat/SPECS/ |
Posteriormente se procede a descomprimir fuentes y aplicar parches. La opción --target=i686 se utilizará en ejemplo a continuación para que se instale un archivo previamente configurado con opciones genéricas para la arquitectura i686.
rpmbuild -bp --target=i686 kernel-2.6.spec |
Considerando en el ejemplo que se instaló el paquete fuente RPM kernel-2.6.18-92.1.6.el5.src.rpm, solo resta es acceder al directorio /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/ para configurar las opciones que se utilizarán.
cd ../BUILD/kernel-2.6.18/linux-2.6.18.i686/ |
Dentro del paquete RPM se incluyen varios archivos con configuraciones genéricas de acuerdo a la arquitectura, los cuales se instalan dentro del directorio /usr/src/redhat/SOURCES/. Uno de estos archivos se selecciona y copia automáticamente dentro del directorio /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/ cuando se define la arquitectura con la opción --target del mandato rpmbuild.
kernel-2.6.18-i586.config | Configuración genérica para arquitectura i586 (Pentium, Pentium MMX, AMD K5, AMD K6, AMD K6 II, AMD K6 III). |
kernel-2.6.18-i686.config | Configuración genérica para arquitectura i686 (Pentium Pro, Pentium II, Pentium III, Pentium 4, Pentium M, Xeon, Celeron, AMD K7, AMD Athlon XP, AMD Duron). |
kernel-2.6.18-i686-debug.config | Configuración genérica para arquitectura i686, con opciones de depuración. Solo recomendado para desarrolladores y escenarios donde se requiere diagnóstico. |
kernel-2.6.18-i686-PAE.config | Configuración genérica para arquitectura i686, con soporte PAE (Physical Address Extension) que añade capacidades para utilizar mayor espacio de intercambio (swapspace). Utilizado en sistemas con más de 4 GB de RAM. |
kernel-2.6.18-i686-xen.config | Configuración genérica para arquitectura ia64 (Intel Itanium), con soporte para Xen. Permite utilizar paravirtualización a través de Xen. |
kernel-2.6.18-ia64.config | Configuración genérica para arquitectura ia64. |
kernel-2.6.18-ia64-debug.config | Configuración genérica para arquitectura ia64, con opciones de depuración. Solo recomendado para desarrolladores y escenarios donde se requiere diagnóstico. |
kernel-2.6.18-ia64-xen.config | Configuración genérica para arquitectura ia64, con soporte para Xen. Permite utilizar paravirtualización a través de Xen. |
kernel-2.6.18-ppc64.config | Configuración genérica para arquitectura PPC de 64 bit (G5). |
kernel-2.6.18-ppc64-debug.config | Configuración genérica para arquitectura PPC de 64 bit, con opciones de depuración. Solo recomendado para desarrolladores y escenarios donde se requiere diagnóstico. |
kernel-2.6.18-ppc.config | Configuración genérica para arquitectura PPC de 32 bit (G3 y G4). |
kernel-2.6.18-ppc-smp.config | Configuración genérica para arquitectura PPC de 32 bit, con soporte de Multi-Procesamiento Simétrico (SMP). |
kernel-2.6.18-s390.config | Configuración genérica para arquitectura s390. |
kernel-2.6.18-s390x.config | Configuración genérica para arquitectura s390x. |
kernel-2.6.18-s390x-debug.config | Configuración genérica para arquitectura s390, con opciones de depuración. Solo recomendado para desarrolladores y escenarios donde se requiere diagnóstico. |
kernel-2.6.18-x86_64.config | Configuración genérica para arquitectura x86_64 (AMD K8, AMD Athlon 64, AMD Opteron). |
kernel-2.6.18-x86_64-debug.config | Configuración genérica para arquitectura x86_64, con opciones de depuración. Solo recomendado para desarrolladores y escenarios donde se requiere diagnóstico. |
kernel-2.6.18-x86_64-xen.config | Configuración genérica para arquitectura x86_64, con soporte para Xen. Permite utilizar paravirtualización a través de Xen. |
La principal ventaja de descargar el núcleo desde kernel.org es que se contará con la más reciente versión, mejoras y más dispositivos soportados. El inconveniente es que puede perderse la estandarización con la distribución utilizada o bien la compatibilidad con algunas aplicaciones de terceros que dependen directa o indirectamente de una versión en particular del núcleo o un API incluido en alguna versión en particular del núcleo.
Se accede hacia http://www.kernel.org/ y se descarga, desde la parte inferior de la portada del sitio, la versión más reciente del núcleo.
wget \ http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.10.tar.bz2 |
Lo anterior descargará el paquete linux-2.6.25.10.tar.bz2.
Se procede a descomprimir linux-2.6.25.10.tar.bz2 utilizando lo siguiente:
tar jxvf linux-2.6.25.10.tar.bz2 |
Lo anterior descomprimirá el contenido en un directorio denominado linux-2.6.25.10. Solo resta es acceder hacia este directorio para configurar las opciones que se utilizarán.
cd linux-2.6.25.10 |
Se puede utilizar el mandato make con la opción config de la siguiente forma:
make config |
El inconveniente de ésto es que se tendrá que responder una a una cada una de las opciones del núcleo. Solo se recomienda para usuario muy experimentados.
Se puede utilizar el mandato make con la opción menuconfig de la siguiente forma:
make menuconfig |
Lo anterior compilará y ejecutará una interfaz hecha en ncurses que permitirá examinar el árbol de opciones y habilitar y deshabilitar de una forma más amistosa, pues cada opción incluye una ayuda que explica para que sirve y si es seguro incluirla, compilarla como módulo o excluirla.
En general, se puede empezar excluyendo las optimizaciones genéricas y funciones que nunca se utilizarán en el sistema como el multiprocesamiento simétrico y soporte para más de 4 GB de RAM.
Y luego seleccionado el tipo exacto de microprocesador y excluir las funciones genéricas.
Pueden habilitarse o excluirse funciones y módulos, de acuerdo a las necesidades y el sustento físico determinado previamente con los mandatos lsmod, lspci y lsusb, en el resto de las opciones del árbol de configuración de menuconfig.
En general se puede compilar dentro del núcleo lo siguiente:
En general se debe evitar incluir dentro del kernel y solo compilar como módulo lo siguiente:
La regla general es mantener el núcleo lo más pequeño posible y evitar incluir dentro de éste demasiados controladores. Si se compila un controlador dentro del núcleo y el dispositivo es retirado del sistema o éste sufre algún tipo de daño que afecte su funcionamiento, el núcleo puede sufrir conflictos con el resto de los controladores o bien sufrir un fallo. Es preferible compilar como módulos los controladores de todo aquello que se pueda remover del sistema, incluyendo los dispositivos que utilicen ranuras PCI.
Al terminar de configurar lo anterior, simplemente se sale de menuconfig para guardar los cambios.
La compilación se inicia utilizando el mandato make.
make |
Después de varios minutos, dependiendo de la capacidad del sistema, se procede a instalar primero los módulos:
make modules_install |
Al concluir el procedimiento, se instala el núcleo.
make install |
Lo anterior instalará el núcleo en el directorio /boot, creará el archivo system.map correspondiente, creará la imagen del disco RAM correspondiente y añadirá una entrada en el archivo /boot/grub/grub.conf, respetando los núcleos previamente instalados al colocarse como opción de arranque secundaria.
Simplemente reinicie y pruebe el nuevo núcleo. Si todo parece funcionar correctamente, puede editar el archivo /boot/grub/grub.conf y colocar el nuevo núcleo como predeterminado.
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.25.10) root (hd0,0) kernel /vmlinuz-2.6.25.10 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.25.10.img title CentOS (2.6.18-92.1.6.el5) root (hd0,0) kernel /vmlinuz-2.6.18-92.1.6.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-92.1.6.el5.img |
NOTA: Es muy importante siempre conservar una copia del núcleo que viene con la distribución utilizada en caso de presentarse problemas.
Se puede crear un paquete RPM a partir de los binarios recién compilados. Acceda de nuevo hacia el directorio del núcleo recién compilado y utilice el mandato make con la opción binrpm-pkg de la siguiente forma:
make binrpm-pkg |
Si desea crear un paquete RPM compilando todo de nuevo, puede utilizar el mandato make con la opción rpm-pkg de la siguiente forma:
make rpm-pkg |
La instalación del paquete resultante se realiza utilizando el mandato rpm con las opciones -ivh (instalar, descriptivo y mostrar barra de progreso), a fin de que se mantengan instalados los paquetes del núcleo existentes en el sistema y estos coexistan, permitiendo elegir con cual iniciar el sistema desde el arranque con Grub.
rpm -ivh /usr/src/redhat/RPMS/i386/kernel-2.25.10-2.i386.rpm |
Lo anterior instalará el paquete RPM del núcleo recién creado, sin afectar a otras versiones de paquetes del núcleo que estén previamente instaladas. Al terminar, solo será necesario eligir desde Grub el núcelo con el cual se iniciará el sistema.
Grub version 0.97 (639K lower / 261056K upper memory) |
Última Edición: 14/07/2008, 21:31| Hits: 50,514