Herramientas de usuario

Herramientas del sitio


informatica:certificaciones:lpic:lpic-2:201_linux_kernel

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
informatica:certificaciones:lpic:lpic-2:201_linux_kernel [2021/04/14 12:58] tempwininformatica:certificaciones:lpic:lpic-2:201_linux_kernel [2021/04/14 13:02] (actual) tempwin
Línea 5: Línea 5:
 Se describen los componentes del kernel que son necesarios para el hardware específico,  los controladores de hardware, recursos del sistema y requisitos. Debes poder configurar correctamente un kernel para incluir o deshabilitar características específicas del kernel de Linux según sea necesario. Poder administrar y/o consultar un kernel 2.6.x, 3.x o 4.x e identificar y corregir problemas comunes de arranque y tiempo de ejecución. Se describen los componentes del kernel que son necesarios para el hardware específico,  los controladores de hardware, recursos del sistema y requisitos. Debes poder configurar correctamente un kernel para incluir o deshabilitar características específicas del kernel de Linux según sea necesario. Poder administrar y/o consultar un kernel 2.6.x, 3.x o 4.x e identificar y corregir problemas comunes de arranque y tiempo de ejecución.
  
-  * 201.1Kernel Components (2+  * [[informatica:certificaciones:lpic:lpic-2:201_linux_kernel:201.1_kernel_components|201.1: Kernel Components]] (2
-  * 201.2: Compiling a kernel (3) +  * [[informatica:certificaciones:lpic:lpic-2:201_linux_kernel:201.2_compiling_a_kernel|201.2Compiling a kernel]] (3) 
-  * 201.3: Kernel runtime management and troubleshooting (4) +  * [[informatica:certificaciones:lpic:lpic-2:201_linux_kernel:201.3_kernel_runtime_management_and_troubleshooting|201.3: Kernel runtime management and troubleshooting]] (4)
- +
- +
- +
-===== Compiling a kernel ===== +
- +
-Pasos: +
- +
-  - Obtener fuentes del kernel +
-  - Herramientas para compilación +
-  - Limpieza +
-  - Configuración +
-  - Compilación +
- +
-==== Obtención de fuentes ==== +
-El primer paso es obtener las fuentes del kernel: https://kernel.org, eligiendo el enlace de **tarball**. El fichero puede tener extensión ''tar.xz'' o ''tar.gz'', es decir, es un paquete comprimido. +
- +
-Para descomprimirlo, en caso de ''tar.xz'' tendremos que hacer dos pasos: +
- +
-Descomprimir +
- +
-<code bash> +
-unxz <FUENTES_KERNEL.tar.xz> +
-</code> +
- +
-Y desempaquetar: +
- +
-<code bash> +
-tar xvf <FUENTES_KERNEL.tar> -C /usr/src/ +
-</code> +
- +
-  * ''-C''permite indicar el directorio de destino antes de desempaquetar. +
- +
-En caso de ''tar.gz'': +
- +
-<code bash> +
-tar zxvf <FUENTES_KERNEL.tar.gz> -C /usr/src/ +
-</code> +
- +
-Una vez descomprimido, las fuentes del kernel deben quedar en ''/usr/src/linux-<VERSION_KERNEL>'' +
- +
-==== Herramientas para compilación ==== +
- +
-En **Debian** es necesario instalar: +
- +
-<code> +
-apt-get install build-essential bison flex libelf-dev libssl-dev bc libncurses5-dev +
-</code> +
- +
-En **CentOS**: +
- +
-<code bash> +
-yum group install "Development Tools" +
-</code> +
- +
-<WRAP center round info 60%> +
-Es posible que hagan falta más herramientas, pero eso lo sabremos cuando empecemos compilar y nos aparezcan errores. +
-</WRAP> +
- +
-==== Limpieza ==== +
- +
-Para asegurarnos de que comenzamos con un estado limpio del kernel, debemos realizar la limpieza del mismo: +
- +
-<code bash> +
-make mrproper +
-</code> +
- +
-<WRAP center round important 60%> +
-Debemos realizar la operación dentro del directorio con las fuentes del kernel que vamos a compilar +
-</WRAP> +
- +
-==== Generar archivo de configuración ==== +
- +
-La compilación se realiza en función de la información albergada en el archivo ''.conf'' que se encuentra en la raíz del directorio de las fuentes. Para generar este fichero: +
- +
-<code bash> +
-make menuconfig +
-</code> +
- +
-<WRAP center round important 60%> +
-Debemos realizar la operación dentro del directorio con las fuentes del kernel que vamos a compilar +
-</WRAP> +
- +
-Después de hacer los cambios, cuando guardamos y salimos, se generará un fichero ''.config'' (si hemos dejado el nombre por defecto) +
- +
-==== Compilación ==== +
- +
-La compilación se realiza ejecutando el comando ''make'': +
- +
-<code> +
-make +
-</code> +
- +
-<WRAP center round important 60%> +
-Debemos realizar la operación dentro del directorio con las fuentes del kernel que vamos a compilar +
-</WRAP> +
- +
-Este proceso dura un tiempo que dependerá de la potencia del equipo donde se haga la compilación. +
- +
-==== bzImage ==== +
- +
-Tras una compilación satisfactoria, debemos crear la imagen: +
- +
-<code bash> +
-make bzImage +
-</code> +
- +
-<WRAP center round important 60%> +
-Debemos realizar la operación dentro del directorio con las fuentes del kernel +
-</WRAP> +
- +
-Se creará en ''/usr/src/<VERSION_KERNEL>/arch/x86/boot/bzImage'' +
-==== Instalación de módulos ==== +
- +
-<code bash> +
-make modules +
-</code> +
- +
-Y tras ello: +
- +
-<code bash> +
-make modules_install +
-</code> +
- +
-Los módulos se instalarán en la carpeta ''/lib/modules/<VERSION_KERNEL>'' +
- +
-<WRAP center round info 60%> +
-En versiones antiguas (antes del kernel 3.0), se utiliza ''make dep'' +
-</WRAP> +
- +
-==== Instalación del kernel ==== +
- +
-Al finalizar los pasos anteriores, tendríamos: +
- +
-  * 32 bits''/usr/src/<VERSION_KERNEL>/arch/x86/boot/bzImage'' +
-  * 64 bits''/usr/src/<VERSION_KERNEL>/arch/x86_64/boot/bzImage'' +
- +
-La instalación se hace copiando simplemente dicho archivo a ''/boot'' y se renombra con el formato que tengan las otras imágenes en ese directorio: +
- +
-<code bash> +
-cp /usr/src/<VERSION_KERNEL>/arch/x86_64/boot/bzImage /boot/vmlinuz-<VERSION_KERNEL> +
-</code> +
- +
-Finalmente también tendríamos que añadir los ficheros ''System.map'' y ''.config'': +
- +
-<code bash> +
-cp /usr/src/<VERSION_KERNEL>/System.map /boot/System.map-<VERSION_KERNEL> +
-cp /usr/src/<VERSION_KERNEL>/.config /boot/config-<VERSION_KERNEL> +
-</code> +
- +
-==== Creación del Ramdisk ==== +
- +
-Tenemos que dejar a disposición del kernel un **ramdisk** que contenga el conjunto de módulos compilados para la nueva versión del nuevo kernel: +
- +
-<code bash> +
-mkinitramfs -o NOMBRE_IMAGEN_VERSION +
-</code> +
- +
-<WRAP center round info 60%> +
-Anteriormente se utilizaba el comando ''mkinitrd'' +
-</WRAP> +
- +
-Ejemplo: +
- +
-<code bash> +
-mkinitramfs -o initrd.img-4.16.7 +
-</code> +
- +
-==== Configurar el gestor de arranque ==== +
- +
-Tenemos que indicarle al gestor de arranque que hay un nuevo kernel para que nos permita elegirlo y arrancarlo. Aquí veremos el ejemplo del cargador de arranque GRUB. +
- +
-Entramos en ''/boot/grub.d'' y editamos, por ejemplo, el fichero llamado ''40_custom'': +
- +
-<code> +
-menuentry 'Debian GNU/Linux, with Linux 4.16.7'+
-    # Partición del disco donde está el sistema +
-    set root='hd0,msdos1' +
-     +
-    # Kernel a usar +
-    linux /boot/vmlinuz-4.16.7 root=/dev/sda1 ro single +
-     +
-    # Ramdisk donde se descomprimirá el kernel +
-    initrd /boot/initrd-4.16.7 +
-+
-</code> +
- +
-El primer disco es ''hd0''. Y las particiones empiezan a partir del 1. Si el sistema de particiones es MBR, será msdos. hd0,msdos1. Primer disco, MBR y primera partición. +
- +
-Generamos el nuevo fichero de configuración del GRUB (''/boot/grub/grub.cfg''): +
- +
-<code bash> +
-grub-mkconfig -o grub.cfg +
-</code> +
- +
-Aplicar los cambios: +
- +
-<code bash> +
-update-grub +
-</code> +
- +
-===== Kernel runtime management and troubleshooting ===== +
- +
-==== Gestión de módulos ==== +
- +
-=== lsmod === +
- +
-Lista módulos instalados en el kernel y qué procesos los están usando. Muestra la misma información que el contenido de ''/proc/modules'' +
- +
-<code> +
-Module                  Size  Used by +
-video                  49152  0 +
-x_tables               45056  1 ip_tables +
-mbcache                16384  1 ext4 +
-(...) +
-</code> +
- +
-=== insmod === +
- +
-Insertar (cargar) módulos en el kernel. +
- +
-<code bash> +
-insmod /lib/modules/4.16.7/kernel/drivers/net/sb1000.ko +
-</code> +
- +
-Luego podemos verificar que está instalado con ''lsmod'' +
- +
-=== rmmod === +
- +
-Eliminar módulos del kernel. +
- +
-<code bash> +
-rmmod <NOMBRE_MODULO> +
-</code> +
- +
-<WRAP center round important 60%> +
-Si el módulo está en ejecución o depende de otro módulo, no nos dejará. +
-</WRAP> +
- +
-=== modprobe === +
- +
-Realiza la gestión dinámica de módulos. Realiza las mismas operaciones que ''lsmod'', ''insmod'' y ''rmmod'', pero da más opciones: +
- +
-  * ''l'': lista todos los módulos disponibles +
-  * ''a'': inserta todos los módulos +
-  * ''r'': elimina un módulo y sus dependencias +
- +
-Ejemplo: +
- +
-<code bash> +
-modprobe sym53c8xx.ko +
-</code> +
- +
-Insertaría un módulo, resolviendo las dependencias. +
- +
-=== modinfo === +
- +
-Muestra información sobre módulos +
- +
-<code bash> +
-modinfo /lib/modules/4.16.7/kernel/drivers/net/sb1000.ko +
-</code> +
- +
-Ejemplo de salida: +
- +
-<code> +
-filename:       /usr/lib/modules/4.19.0-14-amd64/kernel/drivers/net/sb1000.ko +
-license:        GPL +
-description:    General Instruments SB1000 driver +
-author:         Franco Venturi <fventuri@mediaone.net> +
-alias:          acpi*:GIC1000:+
-alias:          pnp:dGIC1000* +
-depends:         +
-retpoline:      Y +
-intree:         Y +
-name:           sb1000 +
-(...) +
-</code> +
- +
-==== Configuración de módulos ==== +
- +
-La configuración de los módulos están en los siguientes ficheros: +
- +
-  * ''/etc/modules.conf'' +
-  * ''/etc/modprobe.conf'' +
-  * ''/etc/modprobe.d/*.conf'' +
- +
-El primero está obsoleto en muchas distribuciones y ''modprobe.conf'' no suele estar por defecto en el sistema. +
- +
-==== Dependencias de módulos ==== +
- +
-El archivo que define las dependencias de unos módulos con respecto a otros es ''modules.dep'' que se encuentra en ''/lib/modules/<VERSION_KERNEL>'' +
- +
-Aspecto del fichero ''modules.dep'': +
- +
-<code> +
-kernel/arch/x86/crypto/glue_helper.ko: +
-kernel/arch/x86/crypto/twofish-x86_64-3way.ko: kernel/arch/x86/crypto/twofish-x86_64.ko kernel/crypto/twofish_common.ko kernel/arch/x86/crypto/glue_helper.ko +
-(...) +
-</code> +
- +
-Primero aparece el nombre del módulo y a continuación los módulos de los que depende. +
- +
-==== Carga de módulos ==== +
- +
-''kmod'' y ''kerneld'' se encargan de la carga dinámica de módulos del kernel. El módulo se carga cuando el kernel lo necesita. +
- +
-  * ''kmod'': hilo propio del kernel y opera directamente con él. +
-  * ''kerneld'': es una daemon y se comunica con el kernel a través de SysV. +
- +
-Ambos usan ''modprobe'' para manejar dependencias y cargas dinámicas de módulos. +
- +
-<WRAP center round important 60%> +
-Kmod reemplaza Kerneld a partir del kernel 2.2 +
-</WRAP> +
- +
-Para habilitar el uso de kmod, el kernel debe ser compilado con la opción ''CONFIG_KMOD'' habilitada (es la opción por defecto). Esto es porque kmod se implementa como un módulo del kernel y dicho módulo debe ser habilitado también. +
- +
-==== Hardware e información del kernel ==== +
- +
-=== lsdev === +
- +
-Proporciona información del hardware instalado. Qué dispositivo está usando qué dirección I/O y canales IRQ/DMA. Para ello, utiliza la información de los siguientes ficheros: +
- +
-  * ''/proc/interrupts'' +
-  * ''/proc/ioports'' +
-  * ''/proc/dma'' +
- +
-<WRAP center round important 60%> +
-Para tener disponible este comando, hay que instalar el paquete ''procinfo'' (en Debian) +
-</WRAP> +
- +
-=== lscpi === +
- +
-Muestra información sobre todos los buses PCI del sistema y todos los dispositivos que están conectados a ellos. +
- +
-=== lsusb === +
- +
-Muestra información de los buses USB de sistema y  los dispositivos que están conectados a ellos. +
- +
-=== dmesg === +
- +
-Comando que permite ver los mensajes de la salida estándar del kernel (también llamado //kernel buffer ring//). +
- +
-Muy útil para tratar de solucionar problemas con el sistema o si necesitamos obtener información del hardware del sistema. +
- +
-La salida de ''dmesg'' normalmente se puede encontrar en ''/var/log/dmesg'' (o ''/var/log/messages''). +
- +
-Como la salida del comando es muy larga, lo normal es filtrar los resultados con ''grep'': +
- +
-<code> +
-dmesg | grep sda +
-</code> +
- +
-Ejemplo de salida: +
- +
-<code> +
-[    3.166003sd 1:0:0:0: [sda134217728 512-byte logical blocks: (68.7 GB/64.0 GiB) +
-[    3.166043] sd 1:0:0:0: [sda] Write Protect is off +
-[    3.166045] sd 1:0:0:0: [sda] Mode Sense: 00 3a 00 00 +
-[    3.166057] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA +
-[    3.195329]  sda: sda1 sda2 < sda5 > +
-[    3.196275] sd 1:0:0:0: [sda] Attached SCSI disk +
-[   14.208926] EXT4-fs (sda1): mounting ext2 file system using the ext4 subsystem +
-[   14.215321] EXT4-fs (sda1): mounted filesystem without journal. Opts: (null) +
-</code> +
- +
-=== sysctl === +
- +
-Modifica los parámetros del kernel en tiempo de ejecución: +
- +
-<code bash> +
-sysctl net.ipv4.ip_forward=1 +
-</code> +
- +
-Los parámetros disponibles se encuentra en ''/proc/sys/''. Para el ejemplo anterior, estarían en ''/proc/sys/net/ipv4/''. Si queremos ver si está activado o no, abrimos el fichero. Por ejemplo, si abrimos ''/proc/sys/net/ipv4/ip_forward'' veremos un 0 si no está activado y un 1 si lo tenemos activado. +
- +
-Los cambios son volátiles, desaparecerán al apagar/reiniciar el equipo. Si se quiere mantener los cambios, hay que añadir los parámetros en el fichero ''/etc/sysctl.conf'' +
- +
-Si queremos ver todos los parámetros disponibles y su estado: +
- +
-<code bash> +
-sysctl -a +
-</code> +
- +
-Ejemplo de salida: +
- +
-<code> +
-abi.vsyscall32 = 1 +
-crypto.fips_enabled = 0 +
-debug.exception-trace = 1 +
-debug.kprobes-optimization = 1 +
-dev.hpet.max-user-freq = 64 +
-dev.mac_hid.mouse_button2_keycode = 97 +
-dev.mac_hid.mouse_button3_keycode = 100 +
-dev.mac_hid.mouse_button_emulation = 0 +
-dev.scsi.logging_level = 0 +
-dev.tty.ldisc_autoload = 1 +
-fs.aio-max-nr = 65536 +
-(...) +
-</code> +
- +
-==== udev ==== +
- +
-Detecta los dispositivos del sistema y está diseñado para hacer más flexible y seguro el manejo de dispositivos. +
- +
-Consiste en un daemon ''udevd'' que recibe ''uevent'' desde el kernel. La comunicación se realiza mediante el sistema de ficheros virtual ''/sys''+
- +
-El fichero de configuración es ''/etc/udev/udev.conf''+
- +
-El directorio donde se almacenan las reglas definidas por el usuario se encuentra en ''/etc/udev/rules.d'' +
- +
-=== udevadm === +
- +
-Control de udev en tiempo de ejecución +
- +
-=== udevmonitor === +
- +
-Comando que muestra los eventos de udev y el kernel por la salida estándar. +
- +
-Se puede utilizar para analizar la frecuencia de eventos medidante la comparación del tiemstamp del uevent kernel y el evento udev. +
- +
-No existe en todas las distribuiciones linux. Cuando existe, suele ser un enlace simbólico a ''udevadm monitor'' +
- +
-===== Test ===== +
- +
-In what order would the following commands result in a compiled kernel, compiled kernel modules and installation of kernel modules in the appropriate kernel directory? +
- +
-  * make menuconfig, make bzImage, make modules, make modules-install +
- +
-What is the memory limit for low memory kernel installation in older Linux systems? +
- +
-  * 512k +
- +
-Which of the following "make" targets are valid for "cleaning" a system prior to compiling the kernel (Choose All That Apply)? +
- +
-  * clean +
-  * distclean +
-  * mrproper +
- +
-Running "make menuconfig" will create an ncurses based menu of choices containing the contents of the existing kernel configuration as a base for beginning the compilation process for the kernel. +
- +
-  * Verdadero +
- +
-The kernel source and documentation is always installed in the same package, regardless of distribution type or version. +
- +
-  * Falso+
informatica/certificaciones/lpic/lpic-2/201_linux_kernel.1618397886.txt.gz · Última modificación: por tempwin