...

bpftool – Introdução à análise moderna do kernel com eBPF

Vou mostrar-vos como trabalhar com bpftool analisar de forma direcionada sistemas Linux em funcionamento, controlar programas eBPF e, ao mesmo tempo, obter telemetria relevante sem necessidade de recompilar o kernel. Este artigo orienta-te passo a passo pela instalação, pelos conceitos fundamentais, pelas aplicações típicas e pelas rotinas úteis, para que possas Análise do kernel utiliza de forma segura na operação e no desenvolvimento.

Pontos centrais

Para começar, vou resumir os aspetos mais importantes, para que possas contextualizar os capítulos seguintes de forma específica e Prioridades podes definir.

  • Proximidade do núcleo: Acesso direto a programas eBPF, mapas e estatísticas
  • Transparência: Registos do Verifier, bytecode e dumps JIT para a deteção de erros
  • prontidão para produção: Saídas em JSON, capacidade de programação, processos reproduzíveis
  • Largura: Rede, chamadas de sistema, agendador, cgroups, perf_events
  • Ecossistema: Complementa ferramentas de alto nível como o BCC e o bpftrace

Utilizo os pontos mencionados para apresentar passos práticos e Decisões para facilitar. Assim, poderás perceber rapidamente em que situações o bpftool traz benefícios diretos e em que outras situações outras ferramentas são mais adequadas. A lista serve de orientação para os exemplos apresentados nos capítulos seguintes e mantém o foco em Mensurabilidade. Ao ler, mantém-te atento ao teu sistema de destino, pois a configuração e a versão do kernel determinam as opções. Quanto mais claramente definires o teu objetivo, mais rapidamente o eBPF e o bpftool fornecerão os resultados Sinal em vez de ruído.

O eBPF como ambiente de execução seguro no kernel

O eBPF proporciona um ambiente de execução seguro no Kernel pronto a associar os pequenos programas a eventos definidos e a submetê-los a uma verificação rigorosa antes da execução. O Verifier impede acessos à memória e loops não permitidos, o que permite que os sistemas permaneçam controláveis e operacional. Associo programas a Kprobes, Tracepoints, XDP ou cgroups e obtenho dados de contexto precisos. Esta proximidade fornece valores de medição sem transições dispendiosas de chamadas de sistema e sem necessidade de compilar módulos. Desta forma, cria-se uma camada de telemetria flexível, que eu utilizo com bpftool torne visível, testável e controlável.

Instalação e requisitos

Primeiro, verifico a versão do kernel e as funcionalidades, pois muitas delas só se revelam a partir de 5.x Completo. Nas distribuições, instalo o bpftool como pacote ou compilo-o a partir dos códigos-fonte do kernel, na pasta tools/bpf/bpftool, dependendo do estado de manutenção do sistema. Para a compilação, preciso do Clang/LLVM, da libelf, do make e dos cabeçalhos adequados, para que a cadeia de ferramentas seja compatível com o kernel adapta-se. Após a instalação, verifico a disponibilidade com o comando “bpftool version” e comparo-a com os meus requisitos. Se as capacidades do kernel estiverem corretas, inicio os testes num sistema separado, antes de passar para os hosts de produção seguir.

bpffs e Pinning: uma visão geral do ciclo de vida dos objetos

Para garantir processos reproduzíveis, começo por montar o sistema de ficheiros BPF em “/sys/fs/bpf”. Se não existir, configuro-o com “mount -t bpf bpf /sys/fs/bpf” e verifico os namespaces, caso haja contentores envolvidos. Em seguida, fixo os objetos carregados em caminhos estáveis, por exemplo, “bpftool prog pin id X /sys/fs/bpf/myapp/xdp_ingress” ou “bpftool map pin id M /sys/fs/bpf/myapp/counters”. Desta forma, os programas, ligações e mapas sobrevivem ao reinício do processo, permanecem localizáveis e são unívocos endereçável.

Estruturo a hierarquia de pinning por serviço, hook e versão, por exemplo, “/sys/fs/bpf/»serviço/hook/versão”. Isso facilita as reversões e os testes lado a lado. No que diz respeito aos anexos, prefiro a abordagem dos links: “bpftool link list” mostra-me identificadores estáveis, “bpftool link pin id L /sys/fs/bpf/myapp/link_xdp” fixa a ligação. Ao limpar, removo primeiro os pinos (rm), e só depois é que os objetos são libertados. Assim, evito Órfãos-Programas que continuam a funcionar sem que nos apercebamos.

Subcomandos centrais e conceitos

O bpftool organiza os comandos por tipos de objeto, tais como prog, map, cgroup ou feature, o que permite organizar os fluxos de trabalho de forma lógica. Utilizo “prog list” e “prog show” para obter uma visão geral, “dump xlated/jited” para análises aprofundadas e “map dump/lookup” para análises do fluxo de dados. O subcomando “feature” mostra os tipos de auxiliares e de mapas ativados, o que evita erros posteriores. As saídas em JSON facilitam a automatização em CI/CD e a gestão de configurações. A tabela seguinte resume tarefas típicas e exemplos compacto juntos.

Objeto Tarefa Exemplo
prog Enumerar e descrever os programas bpftool prog list | bpftool prog show id X
prog Ver o bytecode/JIT bpftool prog dump xlated id X | dump jited id X
prog Carregar e anexar bpftool prog load file.o /sys/fs/bpf/p && … attach
mapa Verificar conteúdos e chaves bpftool map dump id M | map lookup id M key HEX
característica Mostrar capacidades do kernel bpftool feature probe

BTF, CO-RE e Skeletons no dia-a-dia

Certifico-me de que o BTF está disponível no kernel, pois permite o CO-RE (Compile Once – Run Everywhere) e saídas de depuração fáceis de utilizar. Com o comando “bpftool feature probe”, verifico se o BTF está ativo e, se necessário, inspeciono as informações de tipos com o comando “bpftool btf dump file /sys/kernel/btf/vmlinux”. Para o desenvolvimento, gerio um ficheiro de cabeçalho adequado a partir dos tipos do kernel através do comando “bpftool gen vmlinux”, o que me permite referenciar estruturas de forma segura. Isto reduz consideravelmente os pontos de falha nas atualizações do kernel.

No que diz respeito à programação, aposto nos “skeletons”: «bpftool gen skeleton obj.o» gera um wrapper em C que encapsula o carregamento, a anexação, os acessos ao mapa e as limpezas. Desta forma, o meu código de ligação fica mais reduzido e mantenho a interação entre o espaço do utilizador e o programa eBPF robusto. O CO-RE ajuda-me a utilizar os mesmos artefactos em diferentes kernels, desde que os helpers e os hooks estejam disponíveis – verifico isso logo no início com o “feature probe”.

Análise de desempenho com o bpftool

No que diz respeito a questões de desempenho, utilizo o bpftool para Visitas de programas individuais, medo os tempos de execução e comparo-os com os picos de carga de trabalho. Assim, consigo identificar quais os traços que estão a funcionar a todo o vapor ou se um filtro XDP está a consumir demasiada CPU em percursos intensos. Em seguida, avalio se faz mais sentido recorrer à amostragem ou a filtros mais restritos. Em caso de anomalias, analiso os dumps JIT para compreender os percursos de código e evitar instruções desnecessárias. Por fim, os números são integrados em painéis de controlo, para que os operadores possam monitorizar de forma contínua Transparência manter.

Valores de contagem, mapas por CPU e estatísticas

Analiso o comando “bpftool prog show id X” para verificar os valores de “run_time_ns” e “run_cnt”. A relação entre estes valores indica-me os tempos médios de execução; interpreto os valores atípicos com base nas métricas de carga de trabalho. No caso dos contadores de mapas, presto atenção às variantes por CPU: alguns dumps apresentam valores por CPU, outros são agregados. Para análises precisas, utilizo resultados legíveis por máquina e calculo as agregações de forma deliberada, para que os picos em CPUs individuais não afundar-se.

Para obter uma visão rápida das saídas de rastreio, executo o comando “bpftool prog tracelog”. Desta forma, leio as saídas de impressão do buffer de rastreio sem precisar de recorrer a ferramentas separadas. Em ambientes de produção, limito fortemente essas saídas de impressão e substituo-as por contadores em maps ou eventos de buffer circular, para evitar sobrecarga e ruído.

Observabilidade da rede: pacotes, fluxos, erros

No ambiente de rede, verifico os programas XDP e TC, leio os mapas com os valores dos contadores e identifico Pontos de acesso ao longo dos percursos de dados. Utilizo o bpftool para identificar regras que estão a falhar e caracterizar os fluxos. Se ocorrerem erros de decisão nos filtros, os «map-dumps» mostram as chaves e os valores reais. Desta forma, consigo identificar rapidamente as diferenças entre o processamento esperado e o efetivo. Esta visão geral ajuda-me na seleção mais aprofundada das ferramentas para Ferramentas de análise eBPF, que permite a sua utilização no ambiente de alojamento concreto classifica.

Variantes XDP/TC e visibilidade com o bpftool net

No que diz respeito ao caminho de rede, verifico com o “bpftool net” os programas associados às interfaces. Assim, consigo determinar se o XDP está a funcionar no modo Genérico, Nativo ou Offload e quais os TC-Hooks (ingress/egress) que estão ocupados. Se os modos não estiverem corretos, corrijo as opções de ligação ou os parâmetros do controlador. Documento regularmente os resultados como um artefacto, para que as alterações nos percursos de rede compreensível permanecer.

No que diz respeito aos hotpaths, procuro percursos curtos: os programas XDP devem tomar decisões precoces (pass/drop/redirect), enquanto os programas TC consolidam regras e evitam consultas redundantes. Com as estatísticas do Map, avalio a qualidade dos resultados, e os dumps do JIT revelam se os padrões de salto são desfavoráveis. Se surgirem custos de enfileiramento ou de soma de verificação, ajusto os filtros e reavalo a disposição entre o XDP e o TC.

Vigilância de segurança e conformidade

Utilizo programas eBPF para Processo-Iniciações, acessos a ficheiros e eventos de rede, para identificar padrões relevantes para a segurança. Com o bpftool, verifico quais os programas que estão ativos, onde se ligam e se as regras estão a ser aplicadas. Se os pontos de ligação estiverem corretos, verifico o conteúdo dos mapas para documentar de forma detalhada as diretrizes aplicadas. Em casos suspeitos, recorro aos registos do Verifier e ao bytecode para verificar a lógica. Esta visão acelera as auditorias e torna o comportamento dos agentes mais compreensível para as equipas compreensível.

Privilégios, isolamento e modelos de segurança

Durante a operação, presto atenção a que as autorizações sejam claras. Em muitos sistemas, as funções eBPF sem privilégios estão desativadas; por isso, planeio utilizar contas de serviço dedicadas e capacidades específicas. Dependendo da versão do kernel, utilizo CAP_BPF, CAP_PERFMON e CAP_NET_ADMIN, enquanto CAP_SYS_ADMIN só é utilizado quando é inevitável. Isolem os bpffs por namespaces quando os contentores necessitam de traços próprios e delimito os cgroups de forma a que as ligações direcionado ter um efeito.

Por motivos de conformidade, congelo os Maps sensíveis após o preenchimento com o comando “bpftool map freeze”. Desta forma, as diretrizes ficam protegidas contra gravação, enquanto os programas continuam a poder ler. Nas auditorias, documento a data do programa e os pontos de ligação, para que as decisões permaneçam reprodutíveis, mesmo que os artefactos sejam recompilados.

Programas eBPF próprios: carregar, anexar, depurar

Durante o desenvolvimento, compilo os ficheiros fonte em C com o Clang para obter objetos eBPF, carrego-os com o bpftool e ligo-os a Ganchos. Se o verificador detetar algum problema, guardo o registo e vou reduzindo, passo a passo, os caminhos de risco. Verifico o bytecode traduzido e a saída do JIT para avaliar sequências de instruções. Se os resultados estiverem corretos, escrevo e leio dados de teste através de mapas e verifico casos extremos. Isto encurta os ciclos de feedback e mantém a minha cadeia de ferramentas pronta tanto para experiências como para produção normalizado.

Estratégia CO-RE e artefactos estáveis

Para que as compilações durem mais tempo, recorro ao CO-RE. Incorporei informações do BTF, utilizo o “gen vmlinux” e verifico as relocalizações durante o carregamento. Se surgirem divergências nas estruturas do kernel, o registo do Verifier identifica os pontos em questão. Mantenho os programas o mais genéricos possível e armazeno as políticas em mapas. A vantagem: em caso de alterações no esquema, atualizo apenas os dados, e não o Código. Com os Skeletons, automatizo a configuração, a atribuição de pinos e a limpeza, o que reduz significativamente as taxas de erro, especialmente em pipelines de CI/CD.

Integração com ferramentas de alto nível

Para obter resultados rápidos, aposto primeiro em BCC-Scripts e utilizo-os como ponto de partida para análises mais aprofundadas. Assim que um script fornece sinais úteis, inspeciono os programas e mapas subjacentes com o bpftool. Esta abordagem permite-me ver o que está realmente carregado no kernel e quais as estruturas de dados que estão em execução. Desta forma, separo claramente a camada de conveniência dos objetos reais. Para ter uma visão geral, vale a pena dar uma vista de olhos nestes compactos Ferramentas BCC, que responde a perguntas frequentes com poucos comandos cobertura.

Melhores práticas de funcionamento

Separo rigorosamente os ambientes de teste e de produção, recolho os registos do Verifier numa fase inicial e mantenho Reversões Pronto. Antes de cada implementação, verifico o “bpftool feature” para garantir que o tipo de programa, o helper e as variantes do mapa correspondem ao objetivo. Integro as estatísticas dos programas no sistema de monitorização existente, para manter a sobrecarga visível. Documento continuamente todos os pontos de ligação, pois só assim as equipas conseguem manter uma visão geral. Quem quiser aprofundar o assunto, encontrará nas Ferramentas de análise eBPF novos impulsos para Fluxos de trabalho.

Gestão de recursos, limpeza e reversão

Utilizo pins para criar estados definidos e elimino-os ativamente. Para reverter alterações, mantenho a versão anterior disponível no mesmo namespace (por exemplo, “/sys/fs/bpf/myapp/v1” e “/sys/fs/bpf/myapp/v2”). A alternância é feita através de um novo «attach» ou de uma mudança de ligação, com um tempo de inatividade mínimo. Posteriormente, removo as ligações e os mapas antigos, para que não haja recursos lamber. Antes de apagar, verifico se ainda existem referências (“prog show”, “link list”, “map show”).

Para evitar desvios na configuração, congelo os mapas que contêm políticas e aplico as alterações exclusivamente através de implementações definidas. Planeio as atualizações em lote fora dos picos de carga, monitorizo o tempo de execução e o contador de erros e confirmo o sucesso das atualizações com um segundo “map dump”.

Automatização e saídas JSON

A opção JSON e os formatos legíveis por máquina são os pontos fortes do bpftool programável para CI/CD, CMDBs e auditorias. Selo as compilações de forma reproduzível, documento os hashes dos ficheiros de objeto e guardo os caminhos dos bpffs. É assim que associo as implementações a programas e mapas específicos. Scripts wrapper simples registam relatórios de estado na consola e nos artefactos após cada alteração. Desta forma, o ambiente eBPF permanece permanentemente testável.

Criar confiança: etiquetas, hashtags e artefactos

Após o carregamento, leio a etiqueta do programa (“bpftool prog show id X”), que é derivada do bytecode. Associo essa etiqueta ao número de compilação e ao hash do commit na minha CMDB. Em verificações posteriores, comparo a etiqueta esperada com a atual – assim, deteto divergências sem ter de aceder aos binários originais. No caso dos mapas, registo o tipo, os tamanhos das chaves/valores e os sinalizadores, para que as alterações na estrutura sejam visíveis nas atualizações atempadamente espetáculo.

O bpftrace na prática

Para os traços ad hoc, utilizo bpftrace, quando algumas linhas de sintaxe têm de fornecer respostas rápidas. Em seguida, verifico o efeito obtido com o bpftool, para ver com exatidão os programas, os pontos de ligação e os mapas. É assim que combino a expressividade com a proximidade ao núcleo e mantenho ambas as perspetivas sincronizadas. Como ponto de partida, esta breve visão geral sobre bpftrace, que lida bem com as consultas típicas emoldura. Assim que um padrão estiver definido, migro-o, se necessário, para programas compactos em C.

Análise de erros com os registos do Verifier

Em caso de rejeições por parte do verificador, procuro primeiro potenciais Zero-desreferências, verificações de limites em falta ou percursos demasiado longos. Simplifico a lógica, isolo as chamadas a funções auxiliares suspeitas e valido os deslocamentos. É útil reduzir mapas de grandes dimensões e dividir os «hotpaths» em blocos claramente delimitados. Os «JIT-dumps» mostram-me se os loops se expandem indesejadamente ou se os saltos se revelam ineficientes. A cada passo, as mensagens de erro diminuem, até que o programa funcione de forma fiável cargas.

Identificar rapidamente os erros mais comuns

Quando vejo mensagens como “invalid mem access” ou “R.. unbounded loop”, verifico os limites dos arrays, a validação dos ponteiros e os limites dos loops. Em caso de problemas com o CO-RE, as mensagens indicam dados BTF em falta ou inadequados; verifico “/sys/kernel/btf/vmlinux” e ajusto as estruturas de destino. Se o carregamento falhar devido à falta de auxiliares, o comando “feature probe” mostra os auxiliares e tipos de mapa disponíveis. Se surgirem problemas com o JIT durante o dump, verifico se o JIT está ativado e se as opções de hardening estão a afetar a saída impedir.

Quando os anexos ficam bloqueados, muitas vezes há um link ainda fixado. Faço uma lista dos links, desbloqueio-os de forma seletiva e, em seguida, removo os pinos. No caso de “EBUSY”, verifico se outra instância do serviço mantém objetos abertos e planeio uma transição rápida e coordenada.

Perspetivas: o bpftool e a análise moderna do kernel

Com as novas versões do kernel, aumentam os tipos de programas, os auxiliares e Estatísticas, e o bpftool reflete rapidamente esses avanços. Por isso, prevejo tempo para atualizações regulares, para que as ferramentas e a documentação se mantenham atualizadas. As melhorias no JSON e os novos subcomandos abrem novas possibilidades de automatização. Ao mesmo tempo, a integração com pilhas de alto nível está a amadurecer, o que simplifica a integração. Quem acompanhar ativamente este desenvolvimento ganha vantagens no diagnóstico, no ajuste e Segurança Velocidade.

Brevemente resumido

O bpftool dá-me acesso direto Acesso sobre programas eBPF e as suas estruturas de dados, tornando visíveis os processos no kernel. Identifico pontos de estrangulamento, verifico regras de segurança e desenvolvo os meus próprios traços, sem alterar o kernel. Com uma instalação organizada, testes claros e scripts, a utilização mantém-se reproduzível. As ferramentas de alto nível aceleram a introdução, enquanto o bpftool documenta de forma fiável os objetos reais. Assim, elevo a observabilidade e o diagnóstico a um nível robusto, que nas operações diárias transporta.

Artigos actuais