Cómo comprobar si está presente una bandera de contaminación (taint) del kernel en Linux

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo verificar el estado de contaminación (taint) del kernel de Linux. Exploraremos cómo determinar si el kernel está funcionando en un estado potencialmente no soportado o modificado examinando el archivo /proc/sys/kernel/tainted.

Después de la comprobación inicial, aprenderá cómo verificar las razones específicas de cualquier contaminación del kernel inspeccionando el buffer de mensajes del kernel utilizando el comando dmesg. Finalmente, explorará cómo inspeccionar los símbolos del kernel utilizando /proc/kallsyms, lo cual puede ser útil para entender el estado del kernel y los módulos cargados.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/cat -.-> lab-558725{{"Cómo comprobar si está presente una bandera de contaminación (taint) del kernel en Linux"}} linux/grep -.-> lab-558725{{"Cómo comprobar si está presente una bandera de contaminación (taint) del kernel en Linux"}} end

Verificar el estado de contaminación (taint) con cat /proc/sys/kernel/tainted

En este paso, aprenderemos cómo verificar el estado de "contaminación" (taint) del kernel de Linux. El kernel puede quedar "contaminado" si se cargan módulos que no son GPL (Licencia Pública General) o si ocurren ciertos eventos que pueden indicar un problema o una configuración no estándar. Verificar el estado de contaminación es una forma rápida de saber si tu kernel está funcionando en un estado potencialmente no soportado o modificado.

Podemos verificar el estado de contaminación del kernel leyendo el contenido de un archivo especial en el sistema de archivos /proc. El sistema de archivos /proc es un sistema de archivos virtual que proporciona información sobre procesos y otra información del sistema.

Abre tu terminal si no está abierta. Puedes hacer esto haciendo clic en el icono de Xfce Terminal en el lado izquierdo del escritorio.

Ahora, utiliza el comando cat para mostrar el contenido del archivo /proc/sys/kernel/tainted. El comando cat se utiliza para concatenar y mostrar el contenido de archivos.

Escribe el siguiente comando y presiona Enter:

cat /proc/sys/kernel/tainted

La salida será un solo número.

0
  • Un valor de 0 significa que el kernel no está contaminado.
  • Cualquier valor distinto de cero indica que el kernel está contaminado. El número específico es una máscara de bits donde cada bit representa una razón diferente para la contaminación.

Por ejemplo, si la salida fuera 1, indicaría que se cargó un módulo propietario. Si fuera 4, podría indicar que se produjo una advertencia del kernel.

En nuestro entorno LabEx, el kernel no debería estar contaminado inicialmente, por lo que deberías ver 0. Esto es una buena señal, que indica un estado limpio del kernel.

Comprender el estado de contaminación es importante para depurar problemas del kernel o para asegurarte de que estás ejecutando una configuración estándar del kernel.

Haz clic en Continuar para pasar al siguiente paso.

Verificar los detalles de la contaminación (taint) en dmesg

En el paso anterior, verificamos el estado de contaminación (taint) del kernel utilizando /proc/sys/kernel/tainted. Si bien ese archivo nos da un código numérico que indica si el kernel está contaminado, no nos dice por qué está contaminado. Para obtener información más detallada sobre los mensajes del kernel, incluyendo las razones de la contaminación, podemos utilizar el comando dmesg.

El comando dmesg se utiliza para examinar el buffer circular del kernel. Este buffer almacena mensajes del kernel, incluyendo información de controladores de dispositivos, errores y advertencias. Cuando el kernel se contamina, generalmente se registra un mensaje en el buffer circular explicando la razón.

Abre tu terminal si no está abierta.

Ahora, escribe el siguiente comando y presiona Enter:

dmesg

Este comando generará una cantidad potencialmente grande de texto, mostrando todos los mensajes del kernel desde que se inició el sistema.

Para encontrar información específica relacionada con la contaminación, podemos combinar dmesg con el comando grep. grep es una herramienta poderosa para buscar patrones de texto. Buscaremos líneas que contengan la palabra "taint".

Escribe el siguiente comando y presiona Enter:

dmesg | grep taint

El símbolo | se llama tubería (pipe). Toma la salida del comando de la izquierda (dmesg) y la envía como entrada al comando de la derecha (grep). Entonces, este comando primero obtiene todos los mensajes del kernel y luego los filtra para mostrar solo las líneas que contienen la palabra "taint".

Si tu kernel no está contaminado (como se espera en este entorno), este comando puede no producir ninguna salida. Esto es normal y indica que no se han registrado eventos de contaminación.

Si el kernel estuviera contaminado, verías líneas similares a esta (el mensaje exacto depende de la razón de la contaminación):

[  ... ] kernel: Linux version ... (tainted: G)
[  ... ] kernel: Disabling lock debugging due to kernel taint

La parte (tainted: G) indica que el kernel está contaminado, y la letra G específicamente significa que se cargó un módulo propietario. Otras letras indican diferentes razones de contaminación (por ejemplo, P para módulo propietario, F para carga forzada de módulo, R para módulo con licencia restringida, etc.).

Utilizar dmesg | grep taint es un paso crucial para diagnosticar problemas del kernel cuando /proc/sys/kernel/tainted muestra un valor distinto de cero.

Haz clic en Continuar para continuar.

Inspeccionar los símbolos del kernel con cat /proc/kallsyms

En este paso, exploraremos otro archivo importante en el sistema de archivos /proc: /proc/kallsyms. Este archivo contiene las direcciones y nombres de todos los símbolos del kernel (funciones y variables) que no están marcados explícitamente como static. Es una herramienta crucial para la depuración del kernel y la comprensión del funcionamiento interno del kernel.

El archivo /proc/kallsyms enumera cada símbolo del kernel con su dirección de memoria, tipo y nombre. El formato de cada línea es típicamente:

<address> <type> <symbol_name>
  • <address>: La dirección de memoria donde se encuentra el símbolo.
  • <type>: Un solo carácter que indica el tipo de símbolo (por ejemplo, t o T para texto/código, d o D para datos, b o B para BSS, r o R para datos de solo lectura, w o W para símbolo débil, U para símbolo no definido). Las minúsculas indican un símbolo local, las mayúsculas indican un símbolo global.
  • <symbol_name>: El nombre de la función o variable del kernel.

Abre tu terminal si no está abierta.

Ahora, veamos el contenido de /proc/kallsyms utilizando el comando cat. Ten en cuenta que este archivo es muy grande, por lo que la salida se desplazará rápidamente.

Escribe el siguiente comando y presiona Enter:

cat /proc/kallsyms

Verás una larga lista de líneas, cada una representando un símbolo del kernel.

...
ffffffff... T sys_read
ffffffff... T sys_write
ffffffff... D jiffies
...

Para hacer esta salida más manejable y encontrar símbolos específicos, podemos utilizar de nuevo grep. Por ejemplo, busquemos símbolos relacionados con "schedule", que es una función central del kernel para la gestión de procesos.

Escribe el siguiente comando y presiona Enter:

cat /proc/kallsyms | grep schedule

Esto filtrará la salida para mostrar solo las líneas que contengan la palabra "schedule".

ffffffff... T schedule
ffffffff... T schedule_timeout
ffffffff... T schedule_hrtimeout_range
...

Esta salida filtrada es mucho más fácil de leer y te permite encontrar las direcciones y tipos de funciones o variables específicas del kernel que puedan interesarte.

Explorar /proc/kallsyms proporciona una valiosa comprensión de la estructura del kernel y las funciones disponibles. Es un recurso fundamental para cualquier persona que realice desarrollo de kernel o depuración avanzada.

Ahora has aprendido cómo verificar el estado de contaminación (taint) del kernel e inspeccionar los símbolos del kernel utilizando el sistema de archivos /proc y comandos básicos de Linux.

Haz clic en Continuar para completar este laboratorio.

Resumen

En este laboratorio, aprendimos cómo verificar el estado de contaminación (taint) del kernel de Linux. Comenzamos utilizando el comando cat /proc/sys/kernel/tainted para determinar rápidamente si el kernel está contaminado, entendiendo que un valor de 0 indica un estado limpio y cualquier valor distinto de cero significa que el kernel está contaminado, donde el número específico representa una máscara de bits de las razones.

Luego procedimos a verificar los detalles de cualquier contaminación examinando el buffer de mensajes del kernel utilizando dmesg. Esto nos permite ver mensajes específicos relacionados con los eventos que causaron que el kernel se contaminara, proporcionando más contexto que el código numérico por sí solo. Finalmente, exploramos cómo inspeccionar los símbolos del kernel utilizando cat /proc/kallsyms, lo cual puede ser útil para la depuración avanzada y la comprensión del estado interno del kernel, aunque este paso no se detalló completamente en el contenido proporcionado.