Programando O Kernel Linux
()
Sobre este e-book
Leia mais títulos de Jideon F Marques
Kama Sutra: Guia Ilustrado De Posições Sexuais Para Iniciantes E Avançados Nota: 0 de 5 estrelas0 notasTécnicas De Sexo Tântrico Nota: 0 de 5 estrelas0 notasManual De Tdah Para Adultos Nota: 0 de 5 estrelas0 notasAprenda Fazer Licores Deliciosos E Lucre Muito Com Vendas Online Nota: 0 de 5 estrelas0 notasO Guia Completo Para Bonecos De Crochê E Animais Nota: 0 de 5 estrelas0 notasDay Trading - Estratégias De Negociação Nota: 0 de 5 estrelas0 notasPosições Sexuais Tântricas Nota: 0 de 5 estrelas0 notasFísica Quântica Para Iniciantes Nota: 5 de 5 estrelas5/5Marketing Do Instagram (guia Para Iniciantes 2023) Nota: 0 de 5 estrelas0 notasAumento Peniano Nota: 0 de 5 estrelas0 notasReceitas De Café Gelado Nota: 0 de 5 estrelas0 notasReceitas Da Dieta Baixa Em Carboidratos Nota: 0 de 5 estrelas0 notasAdobe Photoshop 2022 Para Iniciantes Nota: 0 de 5 estrelas0 notasA Bíblia Do Swing Trader Nota: 0 de 5 estrelas0 notasDecoração De Bolos Para Iniciantes: Um Guia Passo A Passo Para Decorar Como Um Profissional Nota: 0 de 5 estrelas0 notasPsicologia Negra E Manipulação Nota: 0 de 5 estrelas0 notasDicas De Sexo Tântrico; Todas As Dicas Que Você Precisa Saber Nota: 0 de 5 estrelas0 notasExcel 2023 Power Pivot & Power Query Nota: 0 de 5 estrelas0 notasO Guia Das Técnicas Do Reiki - Cura Reiki Para Iniciantes Curando Mais De 100 Doenças Nota: 0 de 5 estrelas0 notasFeitiços De Amor Nota: 0 de 5 estrelas0 notasReceitas De Iogurte Grego 40 Ótimas Receitas Nota: 0 de 5 estrelas0 notasReceitas Francesa Para Iniciantes Nota: 0 de 5 estrelas0 notasVida Sexual Dos Sonhos Nota: 0 de 5 estrelas0 notasNervo Vago Exercícios Para Estimular Nota: 0 de 5 estrelas0 notasLivro De Receitas De Pão Delicioso Nota: 0 de 5 estrelas0 notas
Relacionado a Programando O Kernel Linux
Ebooks relacionados
Desconstruindo a Web: As tecnologias por trás de uma requisição Nota: 0 de 5 estrelas0 notasCódigo Limpo Em Php Nota: 0 de 5 estrelas0 notasDo PHP ao Laminas: Domine as boas práticas Nota: 3 de 5 estrelas3/5O Guia Do Desenvolvedor De Software Para Linux Nota: 0 de 5 estrelas0 notasArquitetura de software distribuído: Boas práticas para um mundo de microsserviços Nota: 0 de 5 estrelas0 notasProgramação Funcional Com C# Nota: 0 de 5 estrelas0 notasProgramação Funcional: Uma introdução em Clojure Nota: 4 de 5 estrelas4/5Front-end com Vue.js: Da teoria à prática sem complicações Nota: 5 de 5 estrelas5/5Explorando APIs e bibliotecas Java: JDBC, IO, Threads, JavaFX e mais Nota: 0 de 5 estrelas0 notasCaixa de Ferramentas DevOps: Um guia para construção, administração e arquitetura de sistemas modernos Nota: 0 de 5 estrelas0 notasFlask de A a Z: Crie aplicações web mais completas e robustas em Python Nota: 4 de 5 estrelas4/5Programação Web avançada com PHP: Construindo software com componentes Nota: 0 de 5 estrelas0 notasDesbravando SOLID: Práticas avançadas para códigos de qualidade em Java moderno Nota: 0 de 5 estrelas0 notasElixir: Do zero à concorrência Nota: 0 de 5 estrelas0 notasAprendendo Java Nota: 0 de 5 estrelas0 notasZend Expressive e PHP 7: Uma união poderosa para a criação de APIs Nota: 0 de 5 estrelas0 notasPHP e Laravel: Crie aplicações web como um verdadeiro artesão Nota: 0 de 5 estrelas0 notasCriando Aplicativos E Extensões Para O Cakephp 3 Nota: 0 de 5 estrelas0 notasVire o jogo com Spring Framework Nota: 0 de 5 estrelas0 notasGuia Rápido Kubernetes Nota: 0 de 5 estrelas0 notasNoções Básicas Sobre O Microsoft Intune Implantando Aplicativos Usando O Powershell Owen Heaume Nota: 0 de 5 estrelas0 notasDesign Patterns com PHP 7: Desenvolva com as melhores soluções Nota: 5 de 5 estrelas5/5Programação Python Ilustrada Para Iniciantes E Intermediários: Abordagem “aprenda Fazendo” – Passo A Passo Nota: 0 de 5 estrelas0 notasApache Lucene: Sistemas de busca com técnicas de Recuperação de Informação Nota: 0 de 5 estrelas0 notasO retorno do cangaceiro JavaScript: De padrões a uma abordagem funcional Nota: 0 de 5 estrelas0 notasCertificação Linux: Guia prático para a prova LPIC-1 101 Nota: 0 de 5 estrelas0 notasPSRs: Boas práticas de programação com PHP Nota: 4 de 5 estrelas4/5Javascript Para Desenvolvedores Da Web Entendendo O Básico Nota: 0 de 5 estrelas0 notasFedora Linux Nota: 0 de 5 estrelas0 notasComeçando com o Linux: Comandos, serviços e administração Nota: 4 de 5 estrelas4/5
Inteligência Artificial (IA) e Semântica para você
ChatGPT para o dia a dia: Explore o poder da Inteligência Artificial agora mesmo Nota: 0 de 5 estrelas0 notasJava O Guia Completo Nota: 0 de 5 estrelas0 notasO Guia Definitivo para Geração de Renda com o ChatGPT para Empreendedores Nota: 0 de 5 estrelas0 notasChatgpt O Roteiro Do Milionário Nota: 0 de 5 estrelas0 notasGuia De Estilo E Cores Nota: 0 de 5 estrelas0 notasNavegando na Inteligência Artificial com Fé Nota: 0 de 5 estrelas0 notasMarketing Do Instagram (guia Para Iniciantes 2023) Nota: 0 de 5 estrelas0 notasInteligência Artificial: A Quarta Revolução Industrial Nota: 0 de 5 estrelas0 notasA Inteligência Artificial e o Futuro da Educação Nota: 0 de 5 estrelas0 notasPacote Microsoft Office Capacitação Nota: 0 de 5 estrelas0 notasEstratégias De Crescimento Com Software De Gestão – Erp Nota: 0 de 5 estrelas0 notasInteligência artificial & redes sociais Nota: 0 de 5 estrelas0 notasMicrosoft Office 365 Nota: 0 de 5 estrelas0 notasCurso Intensivo De Desenvolvimento Frontend Nota: 0 de 5 estrelas0 notasHistória e evolução da inteligência artificial Nota: 5 de 5 estrelas5/5Dominando Trafego Nas Redes Sociais Nota: 4 de 5 estrelas4/5Como Criar Um Ebook Eficiente Nota: 0 de 5 estrelas0 notasA tecnologia que muda o mundo Nota: 4 de 5 estrelas4/5Power Bi Black Belt Nota: 0 de 5 estrelas0 notasFunções Financeiras Com Microsoft Excel Nota: 0 de 5 estrelas0 notasEscritório Inteligente Com Microsoft Excel Nota: 0 de 5 estrelas0 notasDescomplicado Passo A Passo | Tutoial Anime Studio Nota: 0 de 5 estrelas0 notasChatgpt Ai - Contextos, Comandos, Dicas. Nota: 0 de 5 estrelas0 notasMega-sena: A Ciência De Dados Por Trás Dos Números Nota: 0 de 5 estrelas0 notasIntrodução À Indústria 4.0 Nota: 0 de 5 estrelas0 notasInteligência Artificial como serviço: Uma introdução aos Serviços Cognitivos da Microsoft Azure Nota: 3 de 5 estrelas3/5Html Para Iniciantes Nota: 0 de 5 estrelas0 notas
Avaliações de Programando O Kernel Linux
0 avaliação0 avaliação
Pré-visualização do livro
Programando O Kernel Linux - Jideon F Marques
Programando o Kernel Linux para Melhor
Observabilidade, Rede e Segurança
Programando o Kernel Linux para Melhor
Observabilidade, Rede e Segurança
Por Jideon Marques
© Copyright 2024 Jideon Marques – Todos os direitos reservados.
O conteúdo contido neste livro não pode ser reproduzido, duplicado ou transmitido sem permissão direta por escrito do autor ou do editor.
Sob nenhuma circunstância qualquer culpa ou responsabilidade legal será responsabilizada contra o editor, ou autor, por quaisquer danos, reparações ou perdas monetárias devido às informações contidas neste livro, seja direta ou indiretamente. Notícia legal:
Este livro é protegido por direitos autorais. É apenas para uso pessoal. Você não pode alterar, distribuir, vender, usar, citar ou parafrasear qualquer parte ou o conteúdo deste livro sem o consentimento do autor ou editor.
Aviso de isenção de responsabilidade:
Observe que as informações contidas neste documento são apenas para fins educacionais e de entretenimento. Todos os esforços foram realizados para apresentar informações precisas, atualizadas, confiáveis e completas. Nenhuma garantia de qualquer tipo é declarada ou implícita. Os leitores reconhecem que o autor não está envolvido na prestação de aconselhamento jurídico, financeiro, médico ou profissional. O conteúdo deste livro foi derivado de diversas fontes. Consulte um profissional licenciado antes de tentar qualquer técnica descrita neste livro.
Ao ler este documento, o leitor concorda que sob nenhuma circunstância o autor é responsável por quaisquer perdas, diretas ou indiretas, que sejam incorridas como resultado do uso das informações contidas neste documento, incluindo, mas não limitado a, erros, omissões ou imprecisões.
Prefácio
Na comunidade nativa da nuvem e além dela, o eBPF se tornou um dos tópicos técnicos mais quentes dos últimos anos. Uma nova geração deferramentas e projetos
poderososem redes, segurança, observabilidade e muito mais foram construídos (e mais continuam a ser criados) usando eBPF como plataforma, oferecendo melhor desempenho e precisão em comparação com seus antecessores. conferências relacionadas ao eBPF, como oCúpula eBPFeDia eBPF nativo da nuvematraíram milhares de participantes e espectadores e, no momento em que este livro foi escrito,
oFolga eBPFcomunidade tem mais de 14.000 membros.
Por que o eBPF está sendo selecionado como tecnologia subjacente para tantas ferramentas de infraestrutura? Como ele entrega as melhorias prometidas ao desempenho? Como o eBPF é útil em campos técnicos tão díspares, que vão desde rastreamento de desempenho até criptografia de tráfego de rede?
Este livro tem como objetivo responder a essas perguntas, dando ao leitor uma compreensão de como funciona o eBPF, bem como fornecendo uma introdução à escrita do código eBPF.
Para quem é este livro
Este livro é para desenvolvedores, administradores de sistemas, operadores e estudantes que têm curiosidade sobre o eBPF e desejam saber mais sobre como ele funciona. Ele fornecerá uma base para aqueles que desejam explorar a escrita de programas eBPF por conta própria. Como o eBPF fornece uma excelente plataforma para toda uma nova geração de instrumentação e ferramentas, provavelmente haverá empregos remunerados para os desenvolvedores do eBPF nos próximos anos.
Mas você não precisa necessariamente planejar escrever o código eBPF para que este livro seja útil para você. Se você trabalha em operações, segurança ou qualquer outra função que envolva infraestrutura de software, provavelmente encontrará ferramentas baseadas em eBPF, agora ou nos próximos anos. Se você entender algo sobre os aspectos internos dessas ferramentas, estará em melhor posição para usá-las de maneira eficaz. Por exemplo, se você souber como os eventos podem acionar programas eBPF, você terá um modelo mental melhor para saber exatamente o que uma ferramenta baseada em eBPF está realmente medindo quando mostra métricas de desempenho. Se você é um desenvolvedor de aplicativos, também pode entrar em contato com algumas dessas ferramentas baseadas em eBPF. Por exemplo, se estiver ajustando o desempenho de um aplicativo, você pode usar uma ferramenta comoparquepara gerar gráficos em degradê mostrando quais funções estão demorando mais. Se você estiver avaliando ferramentas de segurança, este livro o ajudará a entender onde o eBPF se destaca e como evitar usá-lo de forma ingênua e menos eficaz contra ataques.
Mesmo que você não esteja usando ferramentas eBPF hoje, espero que este livro lhe dê insights interessantes sobre áreas do Linux que você talvez não tenha considerado antes. A maioria dos desenvolvedores considera o kernel um dado adquirido, pois eles usam linguagens de programação com abstrações convenientes de nível superior que lhes permitem concentrar-se no trabalho de desenvolvimento de aplicativos - o que já é bastante difícil! Eles usam ferramentas como depuradores e analisadores de desempenho para ajudá-los a realizar seu trabalho com eficiência. Conhecer os detalhes de como funciona um depurador ou ferramenta de desempenho pode ser interessante, mas não é essencial. No entanto, para muitos de nós, é divertido e gratificante descer pela toca do coelho para descobrir mais.1Da mesma forma, a maioria das pessoas usará ferramentas eBPF sem se preocupar com a forma como são construídas.Arthur C. Clarke escreveuque qualquer tecnologia suficientemente avançada é indistinguível da magia
, mas, pessoalmente, gosto de me aprofundar e descobrir como funciona o truque de mágica. Você pode ser como eu e se sentir compelido a explorar a programação eBPF para ter uma ideia melhor do que é possível com esta tecnologia. Se sim, acho que você vai gostar deste livro.
O que este livro cobre
O eBPF continua a evoluir a um ritmo bastante rápido, o que torna bastante difícil escrever uma referência abrangente que não necessite de atualização constante. No entanto, existem alguns fundamentos e princípios básicos que provavelmente não mudarão significativamente, e é isso que este livro discute.
Capítulo 1define o cenário descrevendo por que o eBPF é uma tecnologia tão poderosa e explicando como a capacidade de executar programas personalizados no kernel do sistema operacional permite tantos recursos interessantes.
As coisas se tornam mais concretas emCapítulo 2, onde você verá alguns exemplos de
Hello World
que apresentam os conceitos de programas e mapas eBPF.
Capítulo 3mergulha em mais detalhes sobre os programas eBPF e como eles são executados no kernel, eCapítulo 4explora a interface entre aplicações de espaço de usuário e programas eBPF.
Um dos grandes desafios do eBPF nos últimos anos tem sido a questão da compatibilidade entre as versões do kernel.capítulo 5analisa a abordagem compilar uma vez, executar em qualquer lugar
(CO-RE) que resolve esse problema.
O processo de verificação é talvez a característica mais importante que distingue o eBPF dos módulos do kernel. Vou te apresentar o verificador eBPF emCapítulo 6.
EmCapítulo 7você terá uma introdução aos diversos tipos de programas eBPF e seus pontos de fixação. Muitos desses pontos de conexão estão dentro da pilha de rede
eCapítulo 8explora a aplicação do eBPF para recursos de rede com mais detalhes.Capítulo 9analisa como o eBPF está sendo usado para construir ferramentas de segurança.
Se você deseja escrever uma aplicação de espaço de usuário que interaja com programas eBPF, existem muitas bibliotecas e estruturas disponíveis para ajudar.Capítulo 10fornece uma visão geral das opções para várias linguagens de programação.
Finalmente, emCapítulo 11Vou olhar para minha bola de cristal e falar sobre alguns desenvolvimentos futuros que provavelmente ocorrerão no mundo do eBPF.
Conhecimento pré-requisito
Este livro pressupõe que você esteja familiarizado com os comandos básicos do shell no Linux e com a ideia de usar um compilador para transformar o código-fonte em um programa executável. Existem alguns exemplos simples de extratos de Makefiles, supondo que você tenha pelo menos um entendimento mínimo de como o make usa esses arquivos.
Existem muitos exemplos de código em Python, C e Go. Você não precisará de conhecimento profundo dessas linguagens para tirar proveito desses exemplos, mas aproveitará ao máximo o livro se estiver satisfeito em ler algum código. Também presumo que você esteja familiarizado com a ideia de ponteiros, que identificam um local de memória.
Código de exemplo e exercícios
Existem muitos exemplos de código neste livro. Se quiser experimentá-los por si mesmo, você encontrará um repositório GitHub e instruções para instalar e executar o código em https://github.com/lizrice/learning-ebpf.
Também incluí exercícios no final da maioria dos capítulos para ajudá-lo a explorar a programação eBPF ampliando os exemplos ou escrevendo seus próprios programas.
Como o eBPF está em constante evolução, os recursos disponíveis dependem da versão do kernel que você está executando. Muitas das restrições que se aplicam a versões anteriores foram suspensas ou flexibilizadas em versões posteriores. O
projeto Iovisor tem uma visão geral útil doversões do kernel nas quais diferentes
recursos do BPF foram adicionadose neste livro tentei observar quando os recursos específicos que estou descrevendo foram adicionados. Os exemplos foram testados usando a versão 5.15 do kernel e, no momento em que este artigo foi escrito, algumas das distribuições populares do Linux ainda não suportavam uma versão de kernel tão recente. Se você estiver lendo este livro logo após sua publicação, poderá descobrir que alguns dos recursos não funcionarão no kernel Linux que sua organização usa na produção.
O eBPF é apenas para Linux?
eBPF foi originalmente desenvolvido para Linux. Não há nenhuma razão específica para que a mesma abordagem não possa ser usada também em outros sistemas operacionais - na verdade, a Microsoft vem desenvolvendo umImplementação eBPF
para Windows. Discuto isso brevemente emCapítulo 11, mas ao longo do restante do livro me concentrarei na implementação do Linux, e todos os exemplos serão do Linux.
Convenções utilizadas neste livro
As seguintes convenções tipográficas são usadas neste livro:
itálico
Indica novos termos, URLs, endereços de e-mail, nomes de arquivos e extensões de arquivos.
Largura constante
Usado para listagens de programas, bem como dentro de parágrafos para se referir a elementos de programas, como nomes de variáveis ou funções, bancos de dados, tipos de dados, variáveis de ambiente, instruções e palavras-chave.
Largura constante em negrito
Mostra comandos ou outros textos que devem ser digitados literalmente pelo usuário.
Largura constante em itálico
Mostra o texto que deve ser substituído por valores fornecidos pelo usuário ou por valores determinados pelo contexto.
Dica
Este elemento significa uma dica ou sugestão.
Observação
Este elemento significa uma nota geral.
Aviso
Este elemento indica um aviso ou cuidado.
Usando exemplos de código
Material suplementar (exemplos de código, exercícios, etc.) está disponível para download em https://github.com/lizrice/learning-ebpf.
Capítulo 1. O que é eBPF e por que é importante?
eBPF é uma tecnologia revolucionária de kernel que permite aos desenvolvedores escrever código personalizado que pode ser carregado dinamicamente no kernel, mudando a maneira como o kernel se comporta. (Não se preocupe se você não tiver certeza sobre o que é o kernel – falaremos disso em breve neste capítulo.) Isso permite uma nova geração de ferramentas de rede, observabilidade e segurança de alto desempenho. E como você verá, se quiser instrumentar um aplicativo com essas ferramentas baseadas em eBPF, você não precisa modificar ou reconfigurar o aplicativo de forma alguma, graças ao ponto de vista do eBPF dentro do kernel.
Apenas algumas das coisas que você pode fazer com eBPF incluem:
•
Rastreamento de desempenho de praticamente qualquer aspecto de um
sistema
•
Rede de alto desempenho, com visibilidade integrada
•
Detectando e (opcionalmente) prevenindo atividades maliciosas
Vamos fazer uma breve viagem pela história do eBPF, começando pelo Berkeley Packet Filter.
Raízes do eBPF: O Filtro de Pacotes Berkeley
O que hoje chamamos de eBPF
tem suas raízes no BSD Packet Filter, descrito pela primeira vez em 1993 em um artigo1escrito por Steven McCanne e Van Jacobson do Laboratório Nacional Lawrence Berkeley. Este artigo discute uma pseudomáquina que pode executar filtros, que são programas escritos para determinar se um pacote de rede deve ser aceito ou rejeitado. Esses programas foram escritos no conjunto de instruções BPF, um conjunto de instruções de uso geral de 32 bits que se assemelha muito à linguagem assembly. Aqui está um exemplo retirado diretamente desse artigo:
ldh [12]
jeq #ETHERTYPE IP, L1, L2
L1: ret #VERDADEIRO
L2: ret#0
Este pequeno pedaço de código filtra pacotes que não são pacotes de protocolo da Internet (IP). A entrada para este filtro é um pacote Ethernet, e a primeira instrução (ldh) carrega um valor de 2 bytes começando no byte 12 deste pacote. Na próxima instrução (jeq) esse valor é comparado com o valor que representa um pacote IP. Se corresponder, a execução salta para a instrução rotulada como L1 e o pacote é aceito
retornando um valor diferente de zero (identificado aqui como #TRUE). Se não corresponder, o pacote não é um pacote IP e será rejeitado retornando 0.
Você pode imaginar (ou, na verdade, consultar o artigo para encontrar exemplos) programas de filtro mais complexos que tomam decisões com base em outros aspectos do pacote. É importante ressaltar que o autor do filtro pode escrever seus próprios programas personalizados para serem executados dentro do kernel, e este é o cerne do que o eBPF permite.
BPF passou a significar Berkeley Packet Filter
e foi introduzido pela primeira vez no Linux em 1997, na versão do kernel 2.1.75,2onde foi usado no utilitário tcpdump como uma forma eficiente de capturar os pacotes a serem rastreados.
Avançamos para 2012, quando o seccomp-bpf foi introduzido na versão 3.5 do kernel.
Isso permitiu o uso de programas BPF para tomar decisões sobre permitir ou negar que aplicativos de espaço do usuário fizessem chamadas de sistema. Exploraremos isso com mais detalhes emCapítulo 10. Este foi o primeiro passo na evolução do BPF
do escopo restrito de filtragem de pacotes para a plataforma de uso geral que é hoje. A partir daí, as palavras filtro de pacotes no nome começaram a fazer menos sentido!
Do BPF ao eBPF
O BPF evoluiu para o que chamamos de BPF estendido
ou eBPF
a partir da versão 3.18 do kernel em 2014. Isso envolveu várias mudanças significativas:
•
O conjunto de instruções BPF foi completamente reformulado para ser mais eficiente em máquinas de 64 bits, e o interpretador foi totalmente reescrito.
•
Foram introduzidos os mapas eBPF, que são estruturas de dados que podem ser acessadas por programas BPF e por aplicações de espaço de usuário, permitindo o compartilhamento de informações entre eles. Você aprenderá sobre mapas emCapítulo 2.
•
A chamada de sistema bpf() foi adicionada para que os programas de espaço do usuário possam interagir com programas eBPF no kernel. Você lerá sobre esta chamada de sistema emCapítulo 4.
•
Várias funções auxiliares do BPF foram adicionadas. Você verá alguns exemplos emCapítulo 2e mais alguns detalhes emCapítulo 6.
•
O verificador eBPF foi adicionado para garantir que os programas eBPF sejam seguros para execução. Isto é discutido emCapítulo 6.
Isto criou a base para o eBPF, mas o desenvolvimento não abrandou! Desde então, o eBPF evoluiu significativamente.
A evolução do eBPF para sistemas de produção
Um recurso chamado kprobes (sondas de kernel) existia no kernel Linux desde 2005, permitindo que armadilhas fossem definidas em quase qualquer instrução no código do kernel. Os desenvolvedores poderiam escrever módulos do kernel que anexavam funções aos kprobes para fins de depuração ou medição de desempenho.3
A capacidade de anexar programas eBPF a kprobes foi adicionada em 2015 e este foi o ponto de partida para uma revolução na forma como o rastreamento é feito em sistemas Linux. Ao mesmo tempo, ganchos começaram a ser adicionados à pilha de rede do kernel, permitindo que os programas eBPF cuidassem de mais aspectos da funcionalidade da rede. Veremos mais disso emCapítulo 8.
Em 2016, ferramentas baseadas em eBPF estavam sendo utilizadas em sistemas de produção.Brendan Greggo trabalho de rastreamento na Netflix tornou-se amplamente conhecido nos círculos de infraestrutura e operações, assim comosua declaraçãoque o eBPF traz superpoderes para o Linux
. No mesmo ano, foi anunciado o projeto Cilium, sendo o primeiro projeto de rede a utilizar eBPF para substituir todo o caminho de dados em ambientes containers.
No ano seguinte, o Facebook (agora Meta) fezKatranum projeto de código aberto.
Katran, um balanceador de carga de camada 4, atendeu à necessidade do Facebook de
umsolução altamente escalável e rápida. Cada pacote paraFacebook.comdesde 2017
passou pelo eBPF/XDP.4Para mim, pessoalmente, este foi o ano que despertou o meu entusiasmo sobre as possibilidades proporcionadas por esta tecnologia, depois de verPalestra de Thomas Grafsobre o eBPF e oProjeto Cíliona DockerCon em Austin, Texas.
Em 2018, o eBPF tornou-se um subsistema separado dentro do kernel Linux,
comDaniel Borkmannde Isovalente eAlexei Starovoitovdo Meta como seus mantenedores (mais tarde juntaram-se a elesAndrii Nakryiko, também de Meta). No mesmo ano foi introduzido o BPF Type Format (BTF), que torna os programas eBPF
muito mais portáveis. Exploraremos isso emcapítulo 5.
O ano de 2020 viu a introdução do LSM BPF, permitindo que programas eBPF fossem anexados à interface do kernel do Linux Security Module (LSM). Isto indicou que um terceiro caso de uso importante para o eBPF foi identificado: ficou claro que o eBPF é uma excelente plataforma para ferramentas de segurança, além de rede e observabilidade.
Ao longo dos anos, as capacidades do eBPF cresceram substancialmente, graças ao trabalho de mais de 300 desenvolvedores de kernel e muitos colaboradores das ferramentas de espaço do usuário associadas (como o bpftool, que conheceremos
emCapítulo 3), compiladores e bibliotecas de linguagens de programação. Os programas já foram limitados a 4.096 instruções, mas esse limite cresceu para 1
milhão de instruções verificadas5e foi efetivamente tornado irrelevante pelo suporte a chamadas finais e chamadas de função (que você verá nos capítulos2e3).
Observação
Para uma visão mais profunda da história do eBPF, quem melhor para consultar do que os mantenedores que têm trabalhado nele desde o início?
Alexei Starovoitov fez uma apresentação fascinante sobre ohistória do BPFdesde suas raízes em redes definidas por software (SDN). Nesta palestra, ele discute as estratégias usadas para que os primeiros patches do eBPF sejam aceitos no kernel e revela que o aniversário oficial do eBPF é 26 de setembro de 2014, que marcou a aceitação do primeiro conjunto de patches cobrindo o verificador, chamada de sistema BPF e mapas.
Daniel Borkmann também discutiu a história do BPF e sua evolução para oferecer suporte à funcionalidade de rede e rastreamento. Eu recomendo fortemente a palestra deleeBPF e Kubernetes: pequenos ajudantes para escalar microsserviços
, que está cheio de informações interessantes.
Nomear é difícil
As aplicações do eBPF vão tão além da filtragem de pacotes que o acrônimo é essencialmente sem sentido agora e se tornou um termo independente. E como todos os kernels Linux amplamente utilizados atualmente têm suporte para as partes
estendidas
, os termos eBPF e BPF são amplamente usados de forma intercambiável.
No código-fonte do kernel e na programação eBPF, a terminologia comum é BPF. Por exemplo, como veremos emCapítulo 4, a chamada do sistema para interagir com eBPF
é bpf(), as funções auxiliares começam com bpf_ e os diferentes tipos de programas (e)BPF são identificados com nomes que começam com BPF_PROG_TYPE. Fora da comunidade do kernel, o nome eBPF
parece ter ficado preso, por exemplo, no site da comunidadeebpf.ioe em nome doFundação eBPF.
O Kernel Linux
Para entender o eBPF, você precisará ter um conhecimento sólido da diferença entre o kernel e o espaço do usuário no Linux. Abordei isso em meu relatório O que é eBPF?
6e adaptei parte desse conteúdo para os próximos parágrafos.
O kernel do Linux é a camada de software entre seus aplicativos e o hardware em que eles estão sendo executados. Os aplicativos são executados em uma camada sem privilégios chamada espaço do usuário, que não pode acessar o hardware diretamente. Em vez disso, um aplicativo faz solicitações usando a interface de chamada do sistema (syscall) para solicitar que o kernel atue em seu nome. Esse acesso ao hardware pode envolver leitura e gravação em arquivos, envio ou recebimento de tráfego de rede ou até mesmo acesso à memória. O kernel também é responsável por coordenar processos simultâneos, permitindo que muitas aplicações sejam executadas ao mesmo tempo. Isto é ilustrado emFigura 1-1.
Como desenvolvedores de aplicativos, normalmente não usamos a interface de chamada do sistema diretamente, porque as linguagens de programação nos fornecem abstrações de alto nível e bibliotecas padrão que são interfaces mais fáceis de programar. Como resultado, muitas pessoas não sabem o quanto o kernel está fazendo enquanto nossos programas são executados. Se você quiser ter uma ideia de com que frequência o kernel é invocado, você pode usar o utilitário strace para mostrar todas as chamadas de sistema que um aplicativo faz.
Figura 1-1. Aplicativos no espaço do usuário usam a interface syscall para fazer solicitações ao kernel
Aqui está um exemplo, onde usar cat para ecoar a palavra hello na tela envolve mais de 100 chamadas de sistema:
$ strace -c echo olá
olá
% tempo segundos usecs/chamadas erros syscall
------ ----------- ----------- --------- --------- ---- ------------
24,62 0,001693 56 30 12 aberto
17,49 0,001203 60 20 mapa
15,92 0,001095 57 19 novostatat
15,66 0,001077 53 20 fechar
10,35 0,000712 712 1 executivo
3,04 0,000209 52 4 mproteger
2,52 0,000173 57 3 lido
2,33 0,000160 53 3 semanas
2,09 0,000144 48 3 mapa mun
1,11 0,000076 76 1 escrever
0,96 0,000066 66 1 1 acesso
0,76 0,000052 52 1 aleatório
0,68 0,000047 47 1 rseq
0,65 0,000045 45 1 set_robust_list
0,63 0,000043 43 1 prlimit64
0,61 0,000042 42 1 set_tid_address
0,58 0,000040 40 1 futex
------ ----------- ----------- --------- --------- ---- ------------
100,00 0,006877 61 111 13 total
Como os aplicativos dependem muito do kernel, isso significa que podemos aprender muito sobre como um aplicativo se comporta se pudermos observar suas interações com o kernel. Com o eBPF podemos adicionar