...

bpftool: introducción al análisis moderno del núcleo con eBPF

Le mostraré cómo trabajar con bpftool puedes examinar de forma específica los sistemas Linux en funcionamiento, controlar programas eBPF y, al mismo tiempo, obtener datos de telemetría significativos sin necesidad de recompilar el núcleo. Este artículo te guía paso a paso por la instalación, los conceptos básicos, los usos típicos y las rutinas más útiles, para que puedas Análisis del núcleo que utiliza de forma segura en sus operaciones y en el desarrollo.

Puntos centrales

Para empezar, voy a resumir los aspectos más importantes para que puedas situar los siguientes capítulos de forma específica y Prioridades puedes poner.

  • Proximidad al núcleo: Acceso directo a programas eBPF, mapas y estadísticas
  • Transparencia: Registros del verificador, código de bytes y volcados JIT para la resolución de errores
  • listo para la producción: Salidas en formato JSON, capacidad de scripting, procesos reproducibles
  • Anchura: Red, llamadas al sistema, programador, cgroups, perf_events
  • Ecosistema: Complementa herramientas de alto nivel como BCC y bpftrace

Utilizo los puntos mencionados para mostrar pasos prácticos y Decisiones para facilitarte la tarea. Así podrás identificar rápidamente en qué casos bpftool resulta especialmente útil y en cuáles son más adecuadas otras herramientas. La lista sirve de guía para los ejemplos que se presentan en los siguientes capítulos y se centra en Mensurabilidad. Mientras lees, ten siempre presente tu sistema de destino, ya que la configuración y la versión del kernel determinan las opciones. Cuanto más claro definas tu objetivo, más rápido te darán resultados eBPF y bpftool Señal en lugar de ruido.

eBPF como entorno de ejecución seguro en el núcleo

eBPF garantiza un entorno de ejecución seguro en el Núcleo que vincula los pequeños programas a eventos definidos y los comprueba minuciosamente antes de su ejecución. El verificador impide los accesos a la memoria no permitidos y los bucles, lo que permite que los sistemas sigan siendo controlables y operativo. Conecto programas a Kprobes, Tracepoints, XDP o cgroups y obtengo datos de contexto precisos. Esta proximidad proporciona valores de medición sin costosas transiciones de llamadas al sistema y sin necesidad de compilar módulos. De este modo se crea una capa de telemetría flexible que puedo utilizar con bpftool lo haga visible, comprobable y controlable.

Instalación y requisitos

Lo primero que compruebo es la versión del kernel y sus características, ya que muchas funciones se activan a partir de 5.x completo. En las distribuciones, instalo bpftool como paquete o lo compilo a partir del código fuente del núcleo, en la carpeta tools/bpf/bpftool, dependiendo del estado de mantenimiento del sistema. Para la compilación necesito Clang/LLVM, libelf, make y los encabezados adecuados, para que la cadena de herramientas sea compatible con el núcleo se adapta a. Tras la instalación, compruebo la disponibilidad con el comando “bpftool version” y la comparo con mis requisitos. Si las capacidades del kernel son las adecuadas, inicio las pruebas en un sistema independiente antes de pasar a los servidores en producción seguir.

bpffs y Pinning: una visión general del ciclo de vida de los objetos

Para garantizar la reproducibilidad de los procesos, primero monto el sistema de archivos BPF en “/sys/fs/bpf”. Si no está presente, lo configuro con “mount -t bpf bpf /sys/fs/bpf” y compruebo los espacios de nombres cuando hay contenedores involucrados. A continuación, fijo los objetos cargados a rutas estables, por ejemplo, “bpftool prog pin id X /sys/fs/bpf/myapp/xdp_ingress” o “bpftool map pin id M /sys/fs/bpf/myapp/counters”. De este modo, los programas, los enlaces y los mapas sobreviven a los reinicios de los procesos, siguen siendo localizables y son únicos. dirigible.

Estructuro la jerarquía de pinning por servicio, hook y versión, por ejemplo, “/sys/fs/bpf/»servicio/hook/versión”. Esto facilita las reversiones y las pruebas en paralelo. En el caso de los archivos adjuntos, prefiero el enfoque de enlaces: “bpftool link list” me muestra identificadores estables, “bpftool link pin id L /sys/fs/bpf/myapp/link_xdp” fija el enlace. A la hora de limpiar, primero elimino los pines (rm) y, a continuación, los objetos quedan liberados. De este modo evito Huérfanos-Programas que siguen ejecutándose sin que nos demos cuenta.

Subcomandos centrales y conceptos

bpftool clasifica los comandos por tipos de objeto, como prog, map, cgroup o feature, lo que permite estructurar los flujos de trabajo de forma lógica. Yo utilizo “prog list” y “prog show” para obtener una visión general, “dump xlated/jited” para obtener información detallada y “map dump/lookup” para analizar los flujos de datos. El subcomando “feature” muestra los tipos de ayudantes y mapas activados, lo que evita errores posteriores. Las salidas en formato JSON facilitan la automatización en CI/CD y la gestión de la configuración. La siguiente tabla resume tareas típicas y ejemplos compacto juntos.

Objeto Tarea Ejemplo
prog Enumerar y describir los programas bpftool prog list | bpftool prog show id X
prog Ver el código byte/JIT bpftool prog dump xlated id X | dump jited id X
prog Descargar y adjuntar bpftool prog load file.o /sys/fs/bpf/p && … attach
mapa Comprobar contenidos y claves bpftool map dump id M | map lookup id M key HEX
característica Mostrar capacidades del núcleo bpftool: sondeo de características

BTF, CO-RE y Skeletons en el día a día

Me aseguro de que BTF esté disponible en el núcleo, ya que permite el CO-RE (Compile Once – Run Everywhere) y ofrece salidas de depuración muy prácticas. Con “bpftool feature probe” compruebo si BTF está activo y, si es necesario, inspecciono la información de tipos con “bpftool btf dump file /sys/kernel/btf/vmlinux”. Para el desarrollo, genero un archivo de cabecera adecuado a partir de los tipos del núcleo mediante “bpftool gen vmlinux”, lo que me permite hacer referencia a las estructuras de forma segura. Esto reduce considerablemente los puntos de ruptura en las actualizaciones del núcleo.

Para el empaquetado, apuesto por los “skeletons”: «bpftool gen skeleton obj.o» genera un envoltorio en C que encapsula las operaciones de carga, anexión, acceso a mapas y limpieza. De este modo, se reduce mi código de enlace y mantengo la interacción entre el espacio de usuario y el programa eBPF. robusto. CO-RE me ayuda a utilizar los mismos artefactos en distintos núcleos, siempre que los ayudantes y los hooks estén disponibles; esto lo compruebo desde el principio con “feature probe”.

Análisis del rendimiento con bpftool

Para cuestiones relacionadas con el rendimiento, utilizo bpftool para contar el visitas de programas concretos, mido los tiempos de ejecución y los comparo con los picos de carga de trabajo. Así puedo detectar qué trazas se aceleran mucho o si un filtro XDP consume demasiada CPU en las rutas más cargadas. A continuación, evalúo si es más lógico utilizar muestreo o filtros más restrictivos. En caso de anomalías, examino los volcados JIT para comprender las rutas de código y evitar instrucciones innecesarias. Al final, las cifras se incorporan a los paneles de control para que los operadores puedan Transparencia conservar.

Valores de recuento, mapas por CPU y estadísticas

Analizo “bpftool prog show id X” para comprobar “run_time_ns” y “run_cnt”. Su relación me indica los tiempos de ejecución medios; los valores atípicos los interpreto con métricas de carga de trabajo. En el caso de los contadores de mapas, presto atención a las variantes por CPU: algunos volcados muestran valores por CPU, mientras que otros los agregan. Para realizar análisis precisos, utilizo resultados legibles por máquina y calculo las agregaciones de forma deliberada, para que los picos en CPU individuales no hundirse.

Para obtener una visión rápida de los resultados de rastreo, ejecuto “bpftool prog tracelog”. De este modo, leo los mensajes de salida del búfer de rastreo sin necesidad de recurrir a herramientas independientes. En entornos de producción, limito considerablemente este tipo de salidas y las sustituyo por contadores en mapas o eventos de búfer circular, para evitar sobrecargas y ruido.

Observabilidad de la red: paquetes, flujos, errores

En el entorno de red, compruebo los programas XDP y TC, leo los mapas con las lecturas de los contadores e identifico Puntos de acceso a lo largo de las rutas de datos. Utilizo bpftool para visualizar las reglas que se omiten y caracterizar los flujos. Si se producen errores en los filtros, los volcados de mapas muestran las claves y los valores reales. De este modo, detecto rápidamente las diferencias entre el procesamiento esperado y el real. Esta visión general me ayuda a seleccionar las herramientas más adecuadas para un análisis en profundidad. Herramientas de análisis de eBPF, que se utiliza en el ámbito del alojamiento web hormigón clasifica.

Variantes XDP/TC y visibilidad con bpftool net

En la ruta de red, compruebo con “bpftool net” los programas asociados a las interfaces. Así puedo detectar si XDP se ejecuta en modo genérico, nativo u offload, y qué ganchos TC (ingreso/salida) están ocupados. Si los modos no coinciden, corrijo las opciones de conexión o los parámetros del controlador. Documento periódicamente los resultados como artefacto, para que los cambios en las rutas de red comprensible permanecer.

En cuanto a los hotpaths, mi objetivo son las rutas cortas: los programas XDP deben tomar decisiones tempranas (pass/drop/redirect), mientras que los programas TC consolidan las reglas y evitan búsquedas redundantes. Utilizo las estadísticas de Map para evaluar la calidad de las coincidencias, y los volcados JIT me indican si los patrones de salto son desfavorables. Si se detectan costes de cola o de suma de comprobación, ajusto los filtros y reviso la ubicación entre XDP y TC.

Control de seguridad y cumplimiento normativo

Utilizo programas eBPF para Proceso-Inicios, accesos a archivos y eventos de red, para detectar patrones relevantes para la seguridad. Con bpftool compruebo qué programas están activos, dónde se acoplan y si se aplican las reglas. Si los puntos de acoplamiento son correctos, compruebo el contenido de los mapas para documentar de forma detallada las políticas aplicadas. En casos sospechosos, recurro a los registros de Verifier y al código de bytes para comprobar la lógica. Esta información agiliza las auditorías y permite a los equipos comprender el comportamiento de los agentes comprensible.

Permisos, aislamiento y modelos de seguridad

Durante el funcionamiento, me aseguro de que los permisos estén bien definidos. En muchos sistemas, las funciones eBPF sin privilegios están desactivadas; por ello, planifico el uso de cuentas de servicio dedicadas y capacidades específicas. Dependiendo de la versión del núcleo, se utilizan CAP_BPF, CAP_PERFMON y CAP_NET_ADMIN, mientras que CAP_SYS_ADMIN solo se emplea cuando es imprescindible. Aíslo los bpffs por espacios de nombres cuando los contenedores necesitan sus propios rastros, y delimito los cgroups de tal forma que las conexiones objetivo tener un efecto.

Por motivos de cumplimiento normativo, congelo los mapas sensibles tras rellenarlos con “bpftool map freeze”. De este modo, las políticas quedan protegidas contra escritura, mientras que los programas pueden seguir leyendo. En las auditorías, documento la etiqueta del programa y los puntos de conexión, de modo que las decisiones sigan siendo reproducibles, incluso si se vuelven a compilar los artefactos.

Programas eBPF propios: cargar, adjuntar y depurar

Durante el desarrollo, compilo los archivos fuente en C con Clang para obtener objetos eBPF, los cargo con bpftool y los conecto con Ganchos. Si el verificador detecta un error, guardo el registro y reduzco paso a paso las rutas de riesgo. Compruebo el código de bytes compilado y la salida del JIT para evaluar las secuencias de instrucciones. Si los resultados son correctos, escribo y leo datos de prueba a través de mapas y compruebo los casos extremos. Esto acorta los ciclos de retroalimentación y mantiene mi cadena de herramientas tanto para experimentos como para la producción. estandarizado.

Estrategia CO-RE y artefactos estables

Para que las compilaciones duren más, apuesto por CO-RE. Incorporo información BTF, utilizo “gen vmlinux” y compruebo las reubicaciones durante la carga. Si se producen desviaciones en las estructuras del kernel, el registro del verificador revela los puntos afectados. Mantengo los programas lo más genéricos posible y almaceno las políticas en mapas. La ventaja: cuando se producen cambios en el esquema, solo actualizo los datos, no el Código. Con Skeletons automatizo la configuración, la asignación de pines y la limpieza, lo que reduce considerablemente las tasas de error, sobre todo en los procesos de CI/CD.

Integración con herramientas de alto nivel

Para obtener resultados rápidos, lo primero en lo que confío es en BCC-Scripts y los utilizo como punto de partida para análisis más detallados. En cuanto un script proporciona señales útiles, inspecciono con bpftool los programas y mapas subyacentes. Este cambio me permite ver qué es lo que realmente está cargado en el núcleo y qué estructuras de datos se están ejecutando. De este modo, separo claramente la capa de conveniencia de los objetos reales. Para tener una visión general, merece la pena echar un vistazo a estos compactos Herramientas BCC, que responde a las preguntas más frecuentes con unos pocos comandos portada.

Buenas prácticas de funcionamiento

Separo estrictamente los entornos de prueba y de producción, recopilo los registros de Verifier desde el principio y mantengo Retrocesos Listo. Antes de cada implementación, compruebo “bpftool feature” para asegurarme de que el tipo de programa, el helper y las variantes de mapa se ajusten al objetivo. Integro las estadísticas de los programas en el sistema de monitorización existente para que la sobrecarga sea visible. Documento continuamente todos los puntos de conexión, ya que solo así los equipos pueden mantener una visión general. Quien quiera profundizar más, encontrará en los Herramientas de análisis de eBPF nuevos impulsos para Flujos de trabajo.

Gestión de recursos, limpieza y reversión

Utilizo “pins” para crear estados definidos y los elimino de forma activa. Para las reversiones, mantengo la versión anterior en el mismo espacio de nombres (por ejemplo, “/sys/fs/bpf/myapp/v1” y «/sys/fs/bpf/myapp/v2»). El cambio se realiza mediante un nuevo «attach» o un cambio de enlace con un tiempo de inactividad mínimo. A continuación, elimino los enlaces y mapas antiguos para que no se consuman recursos lamer. Antes de borrarlo, compruebo si aún existen referencias (“prog show”, “link list”, “map show”).

Para evitar desviaciones en la configuración, congelo los mapas que contienen políticas y aplico los cambios exclusivamente a través de implementaciones definidas. Programo las actualizaciones por lotes fuera de las horas punta, superviso el tiempo de ejecución y el contador de errores, y confirmo que las actualizaciones se han realizado correctamente con un segundo “map dump”.

Automatización y resultados en formato JSON

La opción JSON y los formatos legibles por máquina hacen que bpftool sea una buena herramienta programable para CI/CD, CMDB y auditorías. Sello las compilaciones de forma reproducible, documento los hash de los archivos objeto y guardo las rutas de los bpffs. De este modo, vinculo las implementaciones con programas y mapas concretos. Unos sencillos scripts envolventes escriben informes de estado en la consola y en los artefactos tras cada cambio. De este modo, el entorno eBPF se mantiene siempre comprobable.

Generar confianza: etiquetas, hashtags y artefactos

Tras la carga, leo la etiqueta del programa (“bpftool prog show id X”), que se deriva del código de bytes. Vinculo esa etiqueta con el número de compilación y el hash de la confirmación en mi CMDB. En comprobaciones posteriores, comparo la etiqueta esperada con la actual; así detecto discrepancias sin necesidad de acceder a los binarios originales. En el caso de los mapas, registro el tipo, los tamaños de clave y valor y los indicadores, para que los cambios de estructura en las actualizaciones a tiempo espectáculo.

bpftrace en la práctica

Para los trazas ad hoc utilizo bpftrace, cuando se necesita obtener respuestas rápidas con unas pocas líneas de sintaxis. A continuación, compruebo el efecto obtenido con bpftool para ver con exactitud los programas, los puntos de conexión y los mapas. De este modo, combino la expresividad con la proximidad al núcleo y mantengo ambas perspectivas sincronizadas. Como punto de partida, resulta útil este breve resumen sobre bpftrace, que gestiona bien las consultas típicas enmarca. En cuanto tengo un patrón bien definido, lo migro, si es necesario, a programas compactos en C.

Análisis de errores con los registros de Verifier

En caso de que el verificador rechace la solicitud, lo primero que hago es buscar posibles Cero-Desreferencias, comprobaciones de límites ausentes o rutas demasiado largas. Simplifico la lógica, aíslo las llamadas a funciones auxiliares dudosas y valido los desplazamientos. Resulta útil reducir el tamaño de los mapas grandes y dividir las rutas más transitadas en bloques claramente delimitados. Los volcados JIT me muestran si los bucles se expanden de forma no deseada o si los saltos resultan ineficientes. Con cada paso, los mensajes de error se reducen hasta que el programa funciona de forma fiable cargas.

Identificar rápidamente los fallos típicos

Si veo mensajes como “invalid mem access” o “R.. unbounded loop”, compruebo los límites de los arrays, la validación de los punteros y los límites de los bucles. En caso de problemas con CO-RE, las indicaciones apuntan a datos BTF que faltan o son incorrectos; compruebo “/sys/kernel/btf/vmlinux” y ajusto las estructuras de destino. Si la carga falla debido a la falta de ayudantes, “feature probe” muestra los ayudantes y los tipos de mapa disponibles. Si surgen problemas con el JIT al generar el volcado, compruebo si el JIT está activado y si las opciones de refuerzo afectan a la salida impedir.

Si los archivos adjuntos se atascan, suele ser porque hay algún enlace aún fijado. Hago una lista de los enlaces, los desvinculo de forma selectiva y, a continuación, elimino los marcadores. En el caso de “EBUSY”, compruebo si hay alguna otra instancia del servicio que mantenga objetos abiertos y planifico una conmutación breve y coordinada.

Perspectivas: bpftool y el análisis moderno del núcleo

Con cada nueva versión del núcleo aumentan los tipos de programa, las funciones auxiliares y Estadísticas, y bpftool refleja rápidamente estos avances. Por eso, tengo previsto dedicar tiempo a realizar actualizaciones periódicas, para que las herramientas y la documentación se mantengan al día. Las mejoras en JSON y los nuevos subcomandos abren nuevas vías de automatización. Al mismo tiempo, la integración con las pilas de alto nivel va madurando, lo que simplifica la incorporación. Quien siga activamente esta evolución obtendrá ventajas en el diagnóstico, el ajuste y Seguridad Ritmo.

Brevemente resumido

bpftool me muestra directamente Acceda a sobre los programas eBPF y sus estructuras de datos, y hace visibles los procesos del núcleo. Detecto cuellos de botella, compruebo las reglas de seguridad y desarrollo mis propios rastros sin necesidad de modificar el núcleo. Gracias a una instalación limpia, pruebas claras y scripts, el uso sigue siendo reproducible. Las herramientas de alto nivel aceleran la puesta en marcha, mientras que bpftool documenta de forma fiable los objetos reales. De este modo, llevo la observabilidad y el diagnóstico a un nivel sólido que, en el funcionamiento diario, lleva.

Artículos de actualidad