{"id":20690,"date":"2026-08-16T08:34:41","date_gmt":"2026-08-16T06:34:41","guid":{"rendered":"https:\/\/webhosting.de\/bpftool-einstieg-moderne-kernelanalyse-linux-ebpf-observability-tracing-core\/"},"modified":"2026-08-16T08:34:41","modified_gmt":"2026-08-16T06:34:41","slug":"bpftool-introducao-analise-moderna-do-kernel-linux-ebpf-observabilidade-rastreamento-nucleo","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pt\/bpftool-einstieg-moderne-kernelanalyse-linux-ebpf-observability-tracing-core\/","title":{"rendered":"bpftool \u2013 Introdu\u00e7\u00e3o \u00e0 an\u00e1lise moderna do kernel com eBPF"},"content":{"rendered":"<p>Vou mostrar-vos como trabalhar com <strong>bpftool<\/strong> 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\u00e7\u00e3o, pelos conceitos fundamentais, pelas aplica\u00e7\u00f5es t\u00edpicas e pelas rotinas \u00fateis, para que possas <strong>An\u00e1lise do kernel<\/strong> utiliza de forma segura na opera\u00e7\u00e3o e no desenvolvimento.<\/p>\n\n<h2>Pontos centrais<\/h2>\n\n<p>Para come\u00e7ar, vou resumir os aspetos mais importantes, para que possas contextualizar os cap\u00edtulos seguintes de forma espec\u00edfica e <strong>Prioridades<\/strong> podes definir.<\/p>\n<ul>\n  <li><strong>Proximidade do n\u00facleo<\/strong>: Acesso direto a programas eBPF, mapas e estat\u00edsticas<\/li>\n  <li><strong>Transpar\u00eancia<\/strong>: Registos do Verifier, bytecode e dumps JIT para a dete\u00e7\u00e3o de erros<\/li>\n  <li><strong>prontid\u00e3o para produ\u00e7\u00e3o<\/strong>: Sa\u00eddas em JSON, capacidade de programa\u00e7\u00e3o, processos reproduz\u00edveis<\/li>\n  <li><strong>Largura<\/strong>: Rede, chamadas de sistema, agendador, cgroups, perf_events<\/li>\n  <li><strong>Ecossistema<\/strong>: Complementa ferramentas de alto n\u00edvel como o BCC e o bpftrace<\/li>\n<\/ul>\n<p>Utilizo os pontos mencionados para apresentar passos pr\u00e1ticos e <strong>Decis\u00f5es<\/strong> para facilitar. Assim, poder\u00e1s perceber rapidamente em que situa\u00e7\u00f5es o bpftool traz benef\u00edcios diretos e em que outras situa\u00e7\u00f5es outras ferramentas s\u00e3o mais adequadas. A lista serve de orienta\u00e7\u00e3o para os exemplos apresentados nos cap\u00edtulos seguintes e mant\u00e9m o foco em <strong>Mensurabilidade<\/strong>. Ao ler, mant\u00e9m-te atento ao teu sistema de destino, pois a configura\u00e7\u00e3o e a vers\u00e3o do kernel determinam as op\u00e7\u00f5es. Quanto mais claramente definires o teu objetivo, mais rapidamente o eBPF e o bpftool fornecer\u00e3o os resultados <strong>Sinal<\/strong> em vez de ru\u00eddo.<\/p>\n\n<h2>O eBPF como ambiente de execu\u00e7\u00e3o seguro no kernel<\/h2>\n\n<p>O eBPF proporciona um ambiente de execu\u00e7\u00e3o seguro no <strong>Kernel<\/strong> pronto a associar os pequenos programas a eventos definidos e a submet\u00ea-los a uma verifica\u00e7\u00e3o rigorosa antes da execu\u00e7\u00e3o. O Verifier impede acessos \u00e0 mem\u00f3ria e loops n\u00e3o permitidos, o que permite que os sistemas permane\u00e7am control\u00e1veis e <strong>operacional<\/strong>. Associo programas a Kprobes, Tracepoints, XDP ou cgroups e obtenho dados de contexto precisos. Esta proximidade fornece valores de medi\u00e7\u00e3o sem transi\u00e7\u00f5es dispendiosas de chamadas de sistema e sem necessidade de compilar m\u00f3dulos. Desta forma, cria-se uma camada de telemetria flex\u00edvel, que eu utilizo com <strong>bpftool<\/strong> torne vis\u00edvel, test\u00e1vel e control\u00e1vel.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/kernelanalyse-arbeitsplatz-9283.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Instala\u00e7\u00e3o e requisitos<\/h2>\n\n<p>Primeiro, verifico a vers\u00e3o do kernel e as funcionalidades, pois muitas delas s\u00f3 se revelam a partir de <strong>5.x<\/strong> Completo. Nas distribui\u00e7\u00f5es, instalo o bpftool como pacote ou compilo-o a partir dos c\u00f3digos-fonte do kernel, na pasta tools\/bpf\/bpftool, dependendo do estado de manuten\u00e7\u00e3o do sistema. Para a compila\u00e7\u00e3o, preciso do Clang\/LLVM, da libelf, do make e dos cabe\u00e7alhos adequados, para que a cadeia de ferramentas seja compat\u00edvel com o kernel <strong>adapta-se<\/strong>. Ap\u00f3s a instala\u00e7\u00e3o, verifico a disponibilidade com o comando \u201cbpftool version\u201d 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\u00e7\u00e3o <strong>seguir<\/strong>.<\/p>\n\n<h2>bpffs e Pinning: uma vis\u00e3o geral do ciclo de vida dos objetos<\/h2>\n\n<p>Para garantir processos reproduz\u00edveis, come\u00e7o por montar o sistema de ficheiros BPF em \u201c\/sys\/fs\/bpf\u201d. Se n\u00e3o existir, configuro-o com \u201cmount -t bpf bpf \/sys\/fs\/bpf\u201d e verifico os namespaces, caso haja contentores envolvidos. Em seguida, fixo os objetos carregados em caminhos est\u00e1veis, por exemplo, \u201cbpftool prog pin id X \/sys\/fs\/bpf\/myapp\/xdp_ingress\u201d ou \u201cbpftool map pin id M \/sys\/fs\/bpf\/myapp\/counters\u201d. Desta forma, os programas, liga\u00e7\u00f5es e mapas sobrevivem ao rein\u00edcio do processo, permanecem localiz\u00e1veis e s\u00e3o un\u00edvocos <strong>endere\u00e7\u00e1vel<\/strong>.<\/p>\n<p>Estruturo a hierarquia de pinning por servi\u00e7o, hook e vers\u00e3o, por exemplo, \u201c\/sys\/fs\/bpf\/\u00bb<em>servi\u00e7o<\/em>\/<em>hook<\/em>\/<em>vers\u00e3o<\/em>\u201d. Isso facilita as revers\u00f5es e os testes lado a lado. No que diz respeito aos anexos, prefiro a abordagem dos links: \u201cbpftool link list\u201d mostra-me identificadores est\u00e1veis, \u201cbpftool link pin id L \/sys\/fs\/bpf\/myapp\/link_xdp\u201d fixa a liga\u00e7\u00e3o. Ao limpar, removo primeiro os pinos (rm), e s\u00f3 depois \u00e9 que os objetos s\u00e3o libertados. Assim, evito <strong>\u00d3rf\u00e3os<\/strong>-Programas que continuam a funcionar sem que nos apercebamos.<\/p>\n\n<h2>Subcomandos centrais e conceitos<\/h2>\n\n<p>O bpftool organiza os comandos por tipos de objeto, tais como <strong>prog<\/strong>, map, cgroup ou feature, o que permite organizar os fluxos de trabalho de forma l\u00f3gica. Utilizo \u201cprog list\u201d e \u201cprog show\u201d para obter uma vis\u00e3o geral, \u201cdump xlated\/jited\u201d para an\u00e1lises aprofundadas e \u201cmap dump\/lookup\u201d para an\u00e1lises do fluxo de dados. O subcomando \u201cfeature\u201d mostra os tipos de auxiliares e de mapas ativados, o que evita erros posteriores. As sa\u00eddas em JSON facilitam a automatiza\u00e7\u00e3o em CI\/CD e a gest\u00e3o de configura\u00e7\u00f5es. A tabela seguinte resume tarefas t\u00edpicas e exemplos <strong>compacto<\/strong> juntos.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Objeto<\/th>\n      <th>Tarefa<\/th>\n      <th>Exemplo<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>prog<\/td>\n      <td>Enumerar e descrever os programas<\/td>\n      <td>bpftool prog list | bpftool prog show id X<\/td>\n    <\/tr>\n    <tr>\n      <td>prog<\/td>\n      <td>Ver o bytecode\/JIT<\/td>\n      <td>bpftool prog dump xlated id X | dump jited id X<\/td>\n    <\/tr>\n    <tr>\n      <td>prog<\/td>\n      <td>Carregar e anexar<\/td>\n      <td>bpftool prog load file.o \/sys\/fs\/bpf\/p &amp;&amp; \u2026 attach<\/td>\n    <\/tr>\n    <tr>\n      <td>mapa<\/td>\n      <td>Verificar conte\u00fados e chaves<\/td>\n      <td>bpftool map dump id M | map lookup id M key HEX<\/td>\n    <\/tr>\n    <tr>\n      <td>caracter\u00edstica<\/td>\n      <td>Mostrar capacidades do kernel<\/td>\n      <td>bpftool feature probe<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>BTF, CO-RE e Skeletons no dia-a-dia<\/h2>\n\n<p>Certifico-me de que o BTF est\u00e1 dispon\u00edvel no kernel, pois permite o CO-RE (Compile Once \u2013 Run Everywhere) e sa\u00eddas de depura\u00e7\u00e3o f\u00e1ceis de utilizar. Com o comando \u201cbpftool feature probe\u201d, verifico se o BTF est\u00e1 ativo e, se necess\u00e1rio, inspeciono as informa\u00e7\u00f5es de tipos com o comando \u201cbpftool btf dump file \/sys\/kernel\/btf\/vmlinux\u201d. Para o desenvolvimento, gerio um ficheiro de cabe\u00e7alho adequado a partir dos tipos do kernel atrav\u00e9s do comando \u201cbpftool gen vmlinux\u201d, o que me permite referenciar estruturas de forma segura. Isto reduz consideravelmente os pontos de falha nas atualiza\u00e7\u00f5es do kernel.<\/p>\n<p>No que diz respeito \u00e0 programa\u00e7\u00e3o, aposto nos \u201cskeletons\u201d: \u00abbpftool gen skeleton obj.o\u00bb gera um wrapper em C que encapsula o carregamento, a anexa\u00e7\u00e3o, os acessos ao mapa e as limpezas. Desta forma, o meu c\u00f3digo de liga\u00e7\u00e3o fica mais reduzido e mantenho a intera\u00e7\u00e3o entre o espa\u00e7o do utilizador e o programa eBPF <strong>robusto<\/strong>. O CO-RE ajuda-me a utilizar os mesmos artefactos em diferentes kernels, desde que os helpers e os hooks estejam dispon\u00edveis \u2013 verifico isso logo no in\u00edcio com o \u201cfeature probe\u201d.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/Konferenz_eBPF_Kernelanalyse_8392.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>An\u00e1lise de desempenho com o bpftool<\/h2>\n\n<p>No que diz respeito a quest\u00f5es de desempenho, utilizo o bpftool para <strong>Visitas<\/strong> de programas individuais, medo os tempos de execu\u00e7\u00e3o e comparo-os com os picos de carga de trabalho. Assim, consigo identificar quais os tra\u00e7os que est\u00e3o a funcionar a todo o vapor ou se um filtro XDP est\u00e1 a consumir demasiada CPU em percursos intensos. Em seguida, avalio se faz mais sentido recorrer \u00e0 amostragem ou a filtros mais restritos. Em caso de anomalias, analiso os dumps JIT para compreender os percursos de c\u00f3digo e evitar instru\u00e7\u00f5es desnecess\u00e1rias. Por fim, os n\u00fameros s\u00e3o integrados em pain\u00e9is de controlo, para que os operadores possam monitorizar de forma cont\u00ednua <strong>Transpar\u00eancia<\/strong> manter.<\/p>\n\n<h2>Valores de contagem, mapas por CPU e estat\u00edsticas<\/h2>\n\n<p>Analiso o comando \u201cbpftool prog show id X\u201d para verificar os valores de \u201crun_time_ns\u201d e \u201crun_cnt\u201d. A rela\u00e7\u00e3o entre estes valores indica-me os tempos m\u00e9dios de execu\u00e7\u00e3o; interpreto os valores at\u00edpicos com base nas m\u00e9tricas de carga de trabalho. No caso dos contadores de mapas, presto aten\u00e7\u00e3o \u00e0s variantes por CPU: alguns dumps apresentam valores por CPU, outros s\u00e3o agregados. Para an\u00e1lises precisas, utilizo resultados leg\u00edveis por m\u00e1quina e calculo as agrega\u00e7\u00f5es de forma deliberada, para que os picos em CPUs individuais n\u00e3o <strong>afundar-se<\/strong>.<\/p>\n<p>Para obter uma vis\u00e3o r\u00e1pida das sa\u00eddas de rastreio, executo o comando \u201cbpftool prog tracelog\u201d. Desta forma, leio as sa\u00eddas de impress\u00e3o do buffer de rastreio sem precisar de recorrer a ferramentas separadas. Em ambientes de produ\u00e7\u00e3o, limito fortemente essas sa\u00eddas de impress\u00e3o e substituo-as por contadores em maps ou eventos de buffer circular, para evitar sobrecarga e ru\u00eddo.<\/p>\n\n<h2>Observabilidade da rede: pacotes, fluxos, erros<\/h2>\n\n<p>No ambiente de rede, verifico os programas XDP e TC, leio os mapas com os valores dos contadores e identifico <strong>Pontos de acesso<\/strong> ao longo dos percursos de dados. Utilizo o bpftool para identificar regras que est\u00e3o a falhar e caracterizar os fluxos. Se ocorrerem erros de decis\u00e3o nos filtros, os \u00abmap-dumps\u00bb mostram as chaves e os valores reais. Desta forma, consigo identificar rapidamente as diferen\u00e7as entre o processamento esperado e o efetivo. Esta vis\u00e3o geral ajuda-me na sele\u00e7\u00e3o mais aprofundada das ferramentas para <a href=\"https:\/\/webhosting.de\/pt\/ebpf-linux-ferramentas-de-analise-monitorizacao-de-servidores-insights\/\">Ferramentas de an\u00e1lise eBPF<\/a>, que permite a sua utiliza\u00e7\u00e3o no ambiente de alojamento <strong>concreto<\/strong> classifica.<\/p>\n\n<h2>Variantes XDP\/TC e visibilidade com o bpftool net<\/h2>\n\n<p>No que diz respeito ao caminho de rede, verifico com o \u201cbpftool net\u201d os programas associados \u00e0s interfaces. Assim, consigo determinar se o XDP est\u00e1 a funcionar no modo Gen\u00e9rico, Nativo ou Offload e quais os TC-Hooks (ingress\/egress) que est\u00e3o ocupados. Se os modos n\u00e3o estiverem corretos, corrijo as op\u00e7\u00f5es de liga\u00e7\u00e3o ou os par\u00e2metros do controlador. Documento regularmente os resultados como um artefacto, para que as altera\u00e7\u00f5es nos percursos de rede <strong>compreens\u00edvel<\/strong> permanecer.<\/p>\n<p>No que diz respeito aos hotpaths, procuro percursos curtos: os programas XDP devem tomar decis\u00f5es precoces (pass\/drop\/redirect), enquanto os programas TC consolidam regras e evitam consultas redundantes. Com as estat\u00edsticas do Map, avalio a qualidade dos resultados, e os dumps do JIT revelam se os padr\u00f5es de salto s\u00e3o desfavor\u00e1veis. Se surgirem custos de enfileiramento ou de soma de verifica\u00e7\u00e3o, ajusto os filtros e reavalo a disposi\u00e7\u00e3o entre o XDP e o TC.<\/p>\n\n<h2>Vigil\u00e2ncia de seguran\u00e7a e conformidade<\/h2>\n\n<p>Utilizo programas eBPF para <strong>Processo<\/strong>-Inicia\u00e7\u00f5es, acessos a ficheiros e eventos de rede, para identificar padr\u00f5es relevantes para a seguran\u00e7a. Com o bpftool, verifico quais os programas que est\u00e3o ativos, onde se ligam e se as regras est\u00e3o a ser aplicadas. Se os pontos de liga\u00e7\u00e3o estiverem corretos, verifico o conte\u00fado 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\u00f3gica. Esta vis\u00e3o acelera as auditorias e torna o comportamento dos agentes mais compreens\u00edvel para as equipas <strong>compreens\u00edvel<\/strong>.<\/p>\n\n<h2>Privil\u00e9gios, isolamento e modelos de seguran\u00e7a<\/h2>\n\n<p>Durante a opera\u00e7\u00e3o, presto aten\u00e7\u00e3o a que as autoriza\u00e7\u00f5es sejam claras. Em muitos sistemas, as fun\u00e7\u00f5es eBPF sem privil\u00e9gios est\u00e3o desativadas; por isso, planeio utilizar contas de servi\u00e7o dedicadas e capacidades espec\u00edficas. Dependendo da vers\u00e3o do kernel, utilizo CAP_BPF, CAP_PERFMON e CAP_NET_ADMIN, enquanto CAP_SYS_ADMIN s\u00f3 \u00e9 utilizado quando \u00e9 inevit\u00e1vel. Isolem os bpffs por namespaces quando os contentores necessitam de tra\u00e7os pr\u00f3prios e delimito os cgroups de forma a que as liga\u00e7\u00f5es <strong>direcionado<\/strong> ter um efeito.<\/p>\n<p>Por motivos de conformidade, congelo os Maps sens\u00edveis ap\u00f3s o preenchimento com o comando \u201cbpftool map freeze\u201d. Desta forma, as diretrizes ficam protegidas contra grava\u00e7\u00e3o, enquanto os programas continuam a poder ler. Nas auditorias, documento a data do programa e os pontos de liga\u00e7\u00e3o, para que as decis\u00f5es permane\u00e7am reprodut\u00edveis, mesmo que os artefactos sejam recompilados.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/kernel-analysis-modern-tools-4638.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Programas eBPF pr\u00f3prios: carregar, anexar, depurar<\/h2>\n\n<p>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 <strong>Ganchos<\/strong>. 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\u00edda do JIT para avaliar sequ\u00eancias de instru\u00e7\u00f5es. Se os resultados estiverem corretos, escrevo e leio dados de teste atrav\u00e9s de mapas e verifico casos extremos. Isto encurta os ciclos de feedback e mant\u00e9m a minha cadeia de ferramentas pronta tanto para experi\u00eancias como para produ\u00e7\u00e3o <strong>normalizado<\/strong>.<\/p>\n\n<h2>Estrat\u00e9gia CO-RE e artefactos est\u00e1veis<\/h2>\n\n<p>Para que as compila\u00e7\u00f5es durem mais tempo, recorro ao CO-RE. Incorporei informa\u00e7\u00f5es do BTF, utilizo o \u201cgen vmlinux\u201d e verifico as relocaliza\u00e7\u00f5es durante o carregamento. Se surgirem diverg\u00eancias nas estruturas do kernel, o registo do Verifier identifica os pontos em quest\u00e3o. Mantenho os programas o mais gen\u00e9ricos poss\u00edvel e armazeno as pol\u00edticas em mapas. A vantagem: em caso de altera\u00e7\u00f5es no esquema, atualizo apenas os dados, e n\u00e3o o <strong>C\u00f3digo<\/strong>. Com os Skeletons, automatizo a configura\u00e7\u00e3o, a atribui\u00e7\u00e3o de pinos e a limpeza, o que reduz significativamente as taxas de erro, especialmente em pipelines de CI\/CD.<\/p>\n\n<h2>Integra\u00e7\u00e3o com ferramentas de alto n\u00edvel<\/h2>\n\n<p>Para obter resultados r\u00e1pidos, aposto primeiro em <strong>BCC<\/strong>-Scripts e utilizo-os como ponto de partida para an\u00e1lises mais aprofundadas. Assim que um script fornece sinais \u00fateis, inspeciono os programas e mapas subjacentes com o bpftool. Esta abordagem permite-me ver o que est\u00e1 realmente carregado no kernel e quais as estruturas de dados que est\u00e3o em execu\u00e7\u00e3o. Desta forma, separo claramente a camada de conveni\u00eancia dos objetos reais. Para ter uma vis\u00e3o geral, vale a pena dar uma vista de olhos nestes compactos <a href=\"https:\/\/webhosting.de\/pt\/bcc-ferramentas-linux-desempenho-ebpf-observabilidade-foco\/\">Ferramentas BCC<\/a>, que responde a perguntas frequentes com poucos comandos <strong>cobertura<\/strong>.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/tech_office_kernelanalyse_7492.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Melhores pr\u00e1ticas de funcionamento<\/h2>\n\n<p>Separo rigorosamente os ambientes de teste e de produ\u00e7\u00e3o, recolho os registos do Verifier numa fase inicial e mantenho <strong>Revers\u00f5es<\/strong> Pronto. Antes de cada implementa\u00e7\u00e3o, verifico o \u201cbpftool feature\u201d para garantir que o tipo de programa, o helper e as variantes do mapa correspondem ao objetivo. Integro as estat\u00edsticas dos programas no sistema de monitoriza\u00e7\u00e3o existente, para manter a sobrecarga vis\u00edvel. Documento continuamente todos os pontos de liga\u00e7\u00e3o, pois s\u00f3 assim as equipas conseguem manter uma vis\u00e3o geral. Quem quiser aprofundar o assunto, encontrar\u00e1 nas <a href=\"https:\/\/webhosting.de\/pt\/ebpf-linux-ferramentas-de-analise-monitorizacao-de-servidores-insights\/\">Ferramentas de an\u00e1lise eBPF<\/a> novos impulsos para <strong>Fluxos de trabalho<\/strong>.<\/p>\n\n<h2>Gest\u00e3o de recursos, limpeza e revers\u00e3o<\/h2>\n\n<p>Utilizo pins para criar estados definidos e elimino-os ativamente. Para reverter altera\u00e7\u00f5es, mantenho a vers\u00e3o anterior dispon\u00edvel no mesmo namespace (por exemplo, \u201c\/sys\/fs\/bpf\/myapp\/v1\u201d e \u201c\/sys\/fs\/bpf\/myapp\/v2\u201d). A altern\u00e2ncia \u00e9 feita atrav\u00e9s de um novo \u00abattach\u00bb ou de uma mudan\u00e7a de liga\u00e7\u00e3o, com um tempo de inatividade m\u00ednimo. Posteriormente, removo as liga\u00e7\u00f5es e os mapas antigos, para que n\u00e3o haja recursos <strong>lamber<\/strong>. Antes de apagar, verifico se ainda existem refer\u00eancias (\u201cprog show\u201d, \u201clink list\u201d, \u201cmap show\u201d).<\/p>\n<p>Para evitar desvios na configura\u00e7\u00e3o, congelo os mapas que cont\u00eam pol\u00edticas e aplico as altera\u00e7\u00f5es exclusivamente atrav\u00e9s de implementa\u00e7\u00f5es definidas. Planeio as atualiza\u00e7\u00f5es em lote fora dos picos de carga, monitorizo o tempo de execu\u00e7\u00e3o e o contador de erros e confirmo o sucesso das atualiza\u00e7\u00f5es com um segundo \u201cmap dump\u201d.<\/p>\n\n<h2>Automatiza\u00e7\u00e3o e sa\u00eddas JSON<\/h2>\n\n<p>A op\u00e7\u00e3o JSON e os formatos leg\u00edveis por m\u00e1quina s\u00e3o os pontos fortes do bpftool <strong>program\u00e1vel<\/strong> para CI\/CD, CMDBs e auditorias. Selo as compila\u00e7\u00f5es de forma reproduz\u00edvel, documento os hashes dos ficheiros de objeto e guardo os caminhos dos bpffs. \u00c9 assim que associo as implementa\u00e7\u00f5es a programas e mapas espec\u00edficos. Scripts wrapper simples registam relat\u00f3rios de estado na consola e nos artefactos ap\u00f3s cada altera\u00e7\u00e3o. Desta forma, o ambiente eBPF permanece permanentemente <strong>test\u00e1vel<\/strong>.<\/p>\n\n<h2>Criar confian\u00e7a: etiquetas, hashtags e artefactos<\/h2>\n\n<p>Ap\u00f3s o carregamento, leio a etiqueta do programa (\u201cbpftool prog show id X\u201d), que \u00e9 derivada do bytecode. Associo essa etiqueta ao n\u00famero de compila\u00e7\u00e3o e ao hash do commit na minha CMDB. Em verifica\u00e7\u00f5es posteriores, comparo a etiqueta esperada com a atual \u2013 assim, deteto diverg\u00eancias sem ter de aceder aos bin\u00e1rios originais. No caso dos mapas, registo o tipo, os tamanhos das chaves\/valores e os sinalizadores, para que as altera\u00e7\u00f5es na estrutura sejam vis\u00edveis nas atualiza\u00e7\u00f5es <strong>atempadamente<\/strong> espet\u00e1culo.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/entwicklerdesk_kernel_1234.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>O bpftrace na pr\u00e1tica<\/h2>\n\n<p>Para os tra\u00e7os ad hoc, utilizo <strong>bpftrace<\/strong>, quando algumas linhas de sintaxe t\u00eam de fornecer respostas r\u00e1pidas. Em seguida, verifico o efeito obtido com o bpftool, para ver com exatid\u00e3o os programas, os pontos de liga\u00e7\u00e3o e os mapas. \u00c9 assim que combino a expressividade com a proximidade ao n\u00facleo e mantenho ambas as perspetivas sincronizadas. Como ponto de partida, esta breve vis\u00e3o geral sobre <a href=\"https:\/\/webhosting.de\/pt\/bpftrace-detetar-mais-rapidamente-problemas-no-servidor-de-alojamento-e-realizar-o-diagnostico\/\">bpftrace<\/a>, que lida bem com as consultas t\u00edpicas <strong>emoldura<\/strong>. Assim que um padr\u00e3o estiver definido, migro-o, se necess\u00e1rio, para programas compactos em C.<\/p>\n\n<h2>An\u00e1lise de erros com os registos do Verifier<\/h2>\n\n<p>Em caso de rejei\u00e7\u00f5es por parte do verificador, procuro primeiro potenciais <strong>Zero<\/strong>-desrefer\u00eancias, verifica\u00e7\u00f5es de limites em falta ou percursos demasiado longos. Simplifico a l\u00f3gica, isolo as chamadas a fun\u00e7\u00f5es auxiliares suspeitas e valido os deslocamentos. \u00c9 \u00fatil reduzir mapas de grandes dimens\u00f5es e dividir os \u00abhotpaths\u00bb em blocos claramente delimitados. Os \u00abJIT-dumps\u00bb mostram-me se os loops se expandem indesejadamente ou se os saltos se revelam ineficientes. A cada passo, as mensagens de erro diminuem, at\u00e9 que o programa funcione de forma fi\u00e1vel <strong>cargas<\/strong>.<\/p>\n\n<h2>Identificar rapidamente os erros mais comuns<\/h2>\n\n<p>Quando vejo mensagens como \u201cinvalid mem access\u201d ou \u201cR.. unbounded loop\u201d, verifico os limites dos arrays, a valida\u00e7\u00e3o 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 \u201c\/sys\/kernel\/btf\/vmlinux\u201d e ajusto as estruturas de destino. Se o carregamento falhar devido \u00e0 falta de auxiliares, o comando \u201cfeature probe\u201d mostra os auxiliares e tipos de mapa dispon\u00edveis. Se surgirem problemas com o JIT durante o dump, verifico se o JIT est\u00e1 ativado e se as op\u00e7\u00f5es de hardening est\u00e3o a afetar a sa\u00edda <strong>impedir<\/strong>.<\/p>\n<p>Quando os anexos ficam bloqueados, muitas vezes h\u00e1 um link ainda fixado. Fa\u00e7o uma lista dos links, desbloqueio-os de forma seletiva e, em seguida, removo os pinos. No caso de \u201cEBUSY\u201d, verifico se outra inst\u00e2ncia do servi\u00e7o mant\u00e9m objetos abertos e planeio uma transi\u00e7\u00e3o r\u00e1pida e coordenada.<\/p>\n\n<h2>Perspetivas: o bpftool e a an\u00e1lise moderna do kernel<\/h2>\n\n<p>Com as novas vers\u00f5es do kernel, aumentam os tipos de programas, os auxiliares e <strong>Estat\u00edsticas<\/strong>, e o bpftool reflete rapidamente esses avan\u00e7os. Por isso, prevejo tempo para atualiza\u00e7\u00f5es regulares, para que as ferramentas e a documenta\u00e7\u00e3o se mantenham atualizadas. As melhorias no JSON e os novos subcomandos abrem novas possibilidades de automatiza\u00e7\u00e3o. Ao mesmo tempo, a integra\u00e7\u00e3o com pilhas de alto n\u00edvel est\u00e1 a amadurecer, o que simplifica a integra\u00e7\u00e3o. Quem acompanhar ativamente este desenvolvimento ganha vantagens no diagn\u00f3stico, no ajuste e <strong>Seguran\u00e7a<\/strong> Velocidade.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/kernelanalyse-bpftool-8295.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Brevemente resumido<\/h2>\n\n<p>O bpftool d\u00e1-me acesso direto <strong>Acesso<\/strong> sobre programas eBPF e as suas estruturas de dados, tornando vis\u00edveis os processos no kernel. Identifico pontos de estrangulamento, verifico regras de seguran\u00e7a e desenvolvo os meus pr\u00f3prios tra\u00e7os, sem alterar o kernel. Com uma instala\u00e7\u00e3o organizada, testes claros e scripts, a utiliza\u00e7\u00e3o mant\u00e9m-se reproduz\u00edvel. As ferramentas de alto n\u00edvel aceleram a introdu\u00e7\u00e3o, enquanto o bpftool documenta de forma fi\u00e1vel os objetos reais. Assim, elevo a observabilidade e o diagn\u00f3stico a um n\u00edvel robusto, que nas opera\u00e7\u00f5es di\u00e1rias <strong>transporta<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Aprenda a utilizar o bpftool para a an\u00e1lise moderna do kernel com eBPF: no\u00e7\u00f5es b\u00e1sicas, comandos mais importantes e exemplos pr\u00e1ticos de observabilidade no kernel do Linux, com foco no bpftool.<\/p>","protected":false},"author":1,"featured_media":20683,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[922],"tags":[],"class_list":["post-20690","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technologie"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"110","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"bpftool","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20683","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/20690","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/comments?post=20690"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/20690\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media\/20683"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media?parent=20690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/categories?post=20690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/tags?post=20690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}